Merge from Chromium at DEPS revision r190564

This commit was generated by merge_to_master.py.

Change-Id: Ie7b06f551ab581fd65e508d8ab5e40eda59c14b2
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/committer_auth.py b/Tools/BuildSlaveSupport/build.webkit.org-config/committer_auth.py
index 6f4d360..cf123a2 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/committer_auth.py
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/committer_auth.py
@@ -27,7 +27,7 @@
 import json
 import zope.interface
 
-from webkitpy.common.net.htdigestparser import HTDigestParser
+from htdigestparser import HTDigestParser
 
 
 class Error(Exception):
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/config.json b/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
index 012813a..98bf4b2 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
@@ -29,9 +29,6 @@
                     { "name": "apple-windows-4", "platform": "win"},
                     { "name": "apple-windows-5", "platform": "win"},
                     { "name": "apple-windows-6", "platform": "win"},
-                    { "name": "apple-windows-13", "platform": "win"},
-                    { "name": "apple-windows-14", "platform": "win"},
-                    { "name": "apple-windows-15", "platform": "win"},
 
                     { "name": "gtk-linux-slave-1", "platform": "gtk"},
                     { "name": "gtk-linux-slave-2", "platform": "gtk"},
@@ -51,6 +48,8 @@
 
                     { "name": "google-windows-1", "platform": "chromium-win" },
                     { "name": "google-windows-2", "platform": "chromium-win" },
+                    { "name": "google-windows-3", "platform": "chromium-win" },
+                    { "name": "google-windows-4", "platform": "chromium-win" },
                     { "name": "google-windows-perf", "platform": "chromium-win" },
                     { "name": "google-mac-1", "platform": "chromium-mac" },
                     { "name": "google-mac-2", "platform": "chromium-mac" },
@@ -62,6 +61,7 @@
                     { "name": "google-linux-perf", "platform": "chromium-linux" },
                     { "name": "google-linux-android", "platform": "chromium-android" },
                     { "name": "google-android-tests", "platform": "chromium-android" },
+                    { "name": "google-android-perf", "platform": "chromium-android" },
 
                     { "name": "wincairo-1", "platform": "wincairo" },
 
@@ -71,17 +71,20 @@
                     { "name": "efl-linux-slave-2", "platform": "efl" },
                     { "name": "efl-linux-slave-3", "platform": "efl" },
                     { "name": "efl-linux-slave-4", "platform": "efl" },
+                    { "name": "efl-linux-perf-1", "platform": "efl" },
 
-                    { "name": "mips-1", "platform": "qt-mipsel"}
+                    { "name": "mips-1", "platform": "qt-mipsel"},
+
+                    { "name": "sh4-linux-1", "platform": "qt-sh4"}
                   ],
 
-    "builders":   [ { "name": "Apple Lion (Leaks)", "type": "BuildAndTestLeaks", "builddir": "lion-leaks",
+    "builders":   [ { "name": "Apple Lion (Leaks)", "type": "TestLeaks", "builddir": "lion-leaks",
                       "platform": "mac-lion", "configuration": "debug", "architectures": ["x86_64"],
                       "slavenames": ["apple-macpro-3"]
                     },
                     { "name": "Apple Lion Debug (Build)", "type": "Build", "builddir": "lion-debug",
                       "platform": "mac-lion", "configuration": "debug", "architectures": ["x86_64"],
-                      "triggers": ["lion-debug-tests-wk1", "lion-debug-tests-wk2"],
+                      "triggers": ["lion-debug-tests-wk1", "lion-debug-tests-wk2", "lion-leaks"],
                       "slavenames": ["apple-xserve-2", "apple-xserve-10"]
                     },
                     { "name": "Apple Lion Release (Build)", "type": "Build", "builddir": "lion-release",
@@ -110,13 +113,13 @@
                       "platform": "mac-lion", "configuration": "release", "architectures": ["x86_64"],
                       "slavenames": ["apple-xserve-11"]
                     },
-                    { "name": "Apple MountainLion (Leaks)", "type": "BuildAndTestLeaks", "builddir": "mountainlion-leaks",
+                    { "name": "Apple MountainLion (Leaks)", "type": "TestLeaks", "builddir": "mountainlion-leaks",
                       "platform": "mac-mountainlion", "configuration": "debug", "architectures": ["x86_64"],
                       "slavenames": ["apple-mini-201"]
                     },
                     { "name": "Apple MountainLion Debug (Build)", "type": "Build", "builddir": "mountainlion-debug",
                       "platform": "mac-mountainlion", "configuration": "debug", "architectures": ["x86_64"],
-                      "triggers": ["mountainlion-debug-tests-wk1", "mountainlion-debug-tests-wk2"],
+                      "triggers": ["mountainlion-debug-tests-wk1", "mountainlion-debug-tests-wk2", "mountainlion-leaks"],
                       "slavenames": ["apple-mini-202", "apple-mini-203"]
                     },
                     { "name": "Apple MountainLion Release (Build)", "type": "Build", "builddir": "mountainlion-release",
@@ -163,9 +166,9 @@
                       "slavenames": ["apple-windows-1"]
                     },
                     {
-                      "name": "Apple Win XP Debug (Tests)", "type": "Test", "builddir": "win-debug-tests",
+                      "name": "Apple Win 7 Debug (Tests)", "type": "Test", "builddir": "win-debug-tests",
                       "platform": "win", "configuration": "debug", "architectures": ["i386"],
-                      "slavenames": ["apple-windows-3", "apple-windows-4", "apple-windows-13", "apple-windows-14", "apple-windows-15"]
+                      "slavenames": ["apple-windows-3", "apple-windows-4"]
                     },
                     {
                       "name": "GTK Linux 32-bit Release", "type": "BuildAndTest", "builddir": "gtk-linux-32-release",
@@ -179,7 +182,7 @@
                       "slavenames": ["gtk-linux-slave-2"]
                     },
                     {
-                      "name": "GTK Linux 64-bit Debug", "type": "BuildAndTest", "builddir": "gtk-linux-64-debug",
+                      "name": "GTK Linux 64-bit Debug WK1", "type": "BuildAndTestWebKit1Only", "builddir": "gtk-linux-64-debug-wk1",
                       "platform": "gtk", "configuration": "debug", "architectures": ["x86_64"],
                       "slavenames": ["gtk-linux-slave-3"]
                     },
@@ -224,6 +227,11 @@
                       "slavenames": ["mips-1"]
                     },
                     {
+                      "name": "Qt Linux SH4 Release", "type": "Build", "builddir": "qt-linux-sh4-release",
+                      "platform": "qt-sh4", "configuration": "release", "architectures": ["sh4"],
+                      "slavenames": ["sh4-linux-1"]
+                    },
+                    {
                       "name": "Qt Windows 32-bit Release", "type": "Build", "builddir": "qt-windows-32bit-release",
                       "SVNMirror": "svn://webkit.inf.u-szeged.hu/webkit/",
                       "platform": "qt-win", "configuration": "release", "architectures": ["i386"],
@@ -244,12 +252,12 @@
                       "name": "Chromium Win Release", "type": "Build", "builddir": "chromium-win-release",
                       "platform": "chromium-win", "configuration": "release", "architectures": ["i386"],
                       "triggers": ["chromium-win-release-tests", "chromium-win-perf-tests"],
-                      "slavenames": ["google-windows-1"]
+                      "slavenames": ["google-windows-1", "google-windows-3"]
                     },
                     {
                       "name": "Chromium Win Release (Tests)", "type": "Test", "builddir": "chromium-win-release-tests",
                       "platform": "chromium-win", "configuration": "release", "architectures": ["i386"],
-                      "slavenames": ["google-windows-2"]
+                      "slavenames": ["google-windows-2", "google-windows-4"]
                     },
                     {
                       "name": "Chromium Win Release (Perf)", "type": "DownloadAndPerfTest", "builddir": "chromium-win-perf-tests",
@@ -291,7 +299,8 @@
                     {
                       "name": "Chromium Android Release", "type": "Build", "builddir": "chromium-linux-android",
                       "platform": "chromium-android", "configuration": "release", "architectures": ["i386"],
-                      "triggers": ["chromium-android-release-tests"], "slavenames": ["google-linux-android"]
+                      "triggers": ["chromium-android-release-tests", "chromium-android-release-perf"],
+                      "slavenames": ["google-linux-android"]
                     },
                     {
                       "name": "Chromium Android Release (Tests)", "type": "Test", "builddir": "chromium-android-release-tests",
@@ -299,6 +308,11 @@
                       "slavenames": ["google-android-tests"]
                     },
                     {
+                      "name": "Chromium Android Release (Perf)", "type": "DownloadAndPerfTest", "builddir": "chromium-android-release-perf",
+                      "platform": "chromium-android", "configuration": "release", "architectures": ["i386"],
+                      "slavenames": ["google-android-perf"]
+                    },
+                    {
                       "name": "WinCairo Release", "type": "BuildAndTest", "builddir": "win-cairo-release",
                       "platform": "wincairo", "configuration": "release", "architectures": ["i386"],
                       "slavenames": ["wincairo-1"]
@@ -314,12 +328,12 @@
                       "slavenames": ["efl-linux-slave-1"]
                     },
                     {
-                      "name": "EFL Linux 64-bit Release WK2", "type": "BuildAndTestWebKit2", "builddir": "efl-linux-64-release-wk2",
+                      "name": "EFL Linux 64-bit Release WK2", "type": "BuildAndTestWebKit2Only", "builddir": "efl-linux-64-release-wk2",
                       "platform": "efl", "configuration": "release", "architectures": ["x86_64"],
                       "slavenames": ["efl-linux-slave-2"]
                     },
                     {
-                      "name": "EFL Linux 64-bit Debug WK2", "type": "BuildAndTestWebKit2", "builddir": "efl-linux-64-debug-wk2",
+                      "name": "EFL Linux 64-bit Debug WK2", "type": "BuildAndTestWebKit2Only", "builddir": "efl-linux-64-debug-wk2",
                       "platform": "efl", "configuration": "debug", "architectures": ["x86_64"],
                       "slavenames": ["efl-linux-slave-4"]
                     },
@@ -327,17 +341,24 @@
                       "name": "EFL Linux 32-bit Release (Build)", "type": "Build", "builddir": "efl-linux-32-release",
                       "platform": "efl", "configuration": "release", "architectures": ["i386"],
                       "slavenames": ["efl-linux-slave-3"]
+                    },
+                    {
+                      "name": "EFL Linux 64-bit Release WK2 (Perf)", "type": "BuildAndPerfTestWebKit2", "builddir": "efl-linux-64-release-wk2-perf",
+                      "platform": "efl", "configuration": "release", "architectures": ["x86_64"],
+                      "slavenames": ["efl-linux-perf-1"]
                     }
                   ],
 
     "schedulers": [ { "type": "AnyBranchScheduler", "name": "trunk", "change_filter": "trunk_filter", "treeStableTimer": 45.0,
-                      "builderNames": ["GTK Linux 32-bit Release", "GTK Linux 64-bit Release", "GTK Linux 64-bit Debug",
+                      "builderNames": ["GTK Linux 32-bit Release", "GTK Linux 64-bit Release", "GTK Linux 64-bit Debug WK1",
                                        "Qt Linux Release", "Qt Linux Release minimal", "Qt Linux 64-bit Release (Perf)",
                                        "Qt Linux 64-bit Release (WebKit2 Perf)", "Qt Linux ARMv7 Release", "Qt Linux MIPS32R2 LE Release",
+                                       "Qt Linux SH4 Release",
                                        "Qt Windows 32-bit Release", "Qt Windows 32-bit Debug", "Qt Mountain Lion Release",
                                        "Chromium Win Release", "Chromium Mac Release", "Chromium Linux Release",
                                        "Chromium Android Release",
                                        "EFL Linux 64-bit Release", "EFL Linux 64-bit Release WK2", "EFL Linux 32-bit Release (Build)", "EFL Linux 64-bit Debug WK2",
+                                       "EFL Linux 64-bit Release WK2 (Perf)",
                                        "WinCairo Release", "WinCE Release (Build)"]
                     },
                     { "type": "PlatformSpecificScheduler", "platform": "mac-lion", "branch": "trunk", "treeStableTimer": 45.0,
@@ -364,6 +385,9 @@
                     { "type": "Triggerable", "name": "lion-debug-tests-wk2",
                       "builderNames": ["Apple Lion Debug WK2 (Tests)"]
                     },
+                    { "type": "Triggerable", "name": "lion-leaks",
+                      "builderNames": ["Apple Lion (Leaks)"]
+                    },
                     { "type": "Triggerable", "name": "mountainlion-release-tests-wk1",
                       "builderNames": ["Apple MountainLion Release WK1 (Tests)"]
                     },
@@ -379,11 +403,14 @@
                     { "type": "Triggerable", "name": "mountainlion-debug-tests-wk2",
                       "builderNames": ["Apple MountainLion Debug WK2 (Tests)"]
                     },
+                    { "type": "Triggerable", "name": "mountainlion-leaks",
+                      "builderNames": ["Apple MountainLion (Leaks)"]
+                    },
                     { "type": "Triggerable", "name": "win-release-tests",
                       "builderNames": ["Apple Win 7 Release (Tests)"]
                     },
                     { "type": "Triggerable", "name": "win-debug-tests",
-                      "builderNames": ["Apple Win XP Debug (Tests)"]
+                      "builderNames": ["Apple Win 7 Debug (Tests)"]
                     },
                     { "type": "Triggerable", "name": "chromium-win-release-tests",
                       "builderNames": ["Chromium Win Release (Tests)"]
@@ -406,6 +433,9 @@
                     { "type": "Triggerable", "name": "chromium-android-release-tests",
                       "builderNames": ["Chromium Android Release (Tests)"]
                     },
+                    { "type": "Triggerable", "name": "chromium-android-release-perf",
+                      "builderNames": ["Chromium Android Release (Perf)"]
+                    },
                     { "type": "Triggerable", "name": "gtk-linux-64-release-tests-wk2",
                       "builderNames": ["GTK Linux 64-bit Release WK2 (Tests)"]
                     }
diff --git a/Tools/Scripts/webkitpy/common/net/htdigestparser.py b/Tools/BuildSlaveSupport/build.webkit.org-config/htdigestparser.py
similarity index 100%
rename from Tools/Scripts/webkitpy/common/net/htdigestparser.py
rename to Tools/BuildSlaveSupport/build.webkit.org-config/htdigestparser.py
diff --git a/Tools/Scripts/webkitpy/common/net/htdigestparser_unittest.py b/Tools/BuildSlaveSupport/build.webkit.org-config/htdigestparser_unittest.py
similarity index 90%
rename from Tools/Scripts/webkitpy/common/net/htdigestparser_unittest.py
rename to Tools/BuildSlaveSupport/build.webkit.org-config/htdigestparser_unittest.py
index a2a4ac9..c689273 100644
--- a/Tools/Scripts/webkitpy/common/net/htdigestparser_unittest.py
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/htdigestparser_unittest.py
@@ -22,9 +22,9 @@
 
 import StringIO
 import os
-import unittest
+import unittest2 as unittest
 
-from webkitpy.common.net.htdigestparser import HTDigestParser
+from htdigestparser import HTDigestParser
 
 
 class HTDigestParserTest(unittest.TestCase):
@@ -80,3 +80,12 @@
 user3:realm 1:1817fc8a24119cc57fbafc8a630ea5a5
 user3:realm 3:a05f5a2335e9d87bbe75bbe5e53248f0
 """)
+
+
+# FIXME: We should run this file as part of test-rm .
+# Unfortunately test-rm  currently requires that unittests
+# be located in a directory with a valid module name.
+# 'build.webkit.org-config' is not a valid module name (due to '.' and '-')
+# so for now this is a stand-alone test harness.
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg b/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
index ae4df92..9d07b8c 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
@@ -21,7 +21,7 @@
 import urllib
 
 from committer_auth import CommitterAuth
-from webkitpy.common.config import build as wkbuild
+import wkbuild
 
 
 c = BuildmasterConfig = {}
@@ -141,6 +141,12 @@
     descriptionDone = ["killed old processes"]
     command = ["python", "./Tools/BuildSlaveSupport/kill-old-processes"]
 
+class DeleteStaleBuildFiles(shell.Compile):
+    name = "delete stale build files"
+    description = ["deleting stale build files"]
+    descriptionDone = ["delete stale build files"]
+    command = ["python", "./Tools/BuildSlaveSupport/delete-stale-build-files", WithProperties("--platform=%(fullPlatform)s"), WithProperties("--%(configuration)s")]
+
 class InstallEflDependencies(shell.ShellCommand):
     name = "jhbuild"
     description = ["updating efl dependencies"]
@@ -207,6 +213,14 @@
         return shell.Compile.start(self)
 
 
+class CompileWebKit1Only(CompileWebKit):
+    command = ["perl", "./Tools/Scripts/build-webkit", "--no-webkit2", WithProperties("--%(configuration)s")]
+
+
+class CompileWebKit2Only(CompileWebKit):
+    command = ["perl", "./Tools/Scripts/build-webkit", "--no-webkit1", WithProperties("--%(configuration)s")]
+
+
 class ArchiveBuiltProduct(shell.ShellCommand):
     command = ["python", "./Tools/BuildSlaveSupport/built-product-archive",
                WithProperties("--platform=%(fullPlatform)s"), WithProperties("--%(configuration)s"), "archive"]
@@ -303,11 +317,10 @@
     description = ["layout-tests running"]
     descriptionDone = ["layout-tests"]
     command = ["perl", "./Tools/Scripts/run-webkit-tests",
-               "--no-launch-safari",
+               "--no-show-results",
                "--no-new-test-results",
                "--no-sample-on-timeout",
                "--results-directory", "layout-test-results",
-               "--use-remote-links-to-tests",
                "--builder-name", WithProperties("%(buildername)s"),
                "--build-number", WithProperties("%(buildnumber)s"),
                "--master-name", "webkit.org",
@@ -330,7 +343,7 @@
             
         if platform == "win":
             rootArgument = ['--root=' + os.path.join("WebKitBuild", self.getProperty('configuration'), "bin")]
-            self.setCommand(self.command + ['--no-build'])
+            self.setCommand(self.command + ['--no-build', '--use-remote-links-to-tests'])
         else:
             rootArgument = ['--root=WebKitBuild/bin']
         if not self.buildJSCTool:
@@ -354,7 +367,7 @@
         self.incorrectLayoutLines = incorrectLayoutLines
 
     # FIXME: This will break if new-run-webkit-tests changes its default log formatter.
-    nrwt_log_message_regexp = re.compile(r'(?P<log_prefix>.*) (?P<log_level>DEBUG|INFO) (?P<message>.*)')
+    nrwt_log_message_regexp = re.compile(r'\d{2}:\d{2}:\d{2}(\.\d+)?\s+\d+\s+(?P<message>.*)')
 
     def _strip_python_logging_prefix(self, line):
         match_object = self.nrwt_log_message_regexp.match(line)
@@ -365,10 +378,10 @@
     def _parseNewRunWebKitTestsOutput(self, logText):
         incorrectLayoutLines = []
         expressions = [
-            ('flakes', re.compile(r'[Uu]nexpected flakiness.+:?\s*\((\d+)\)')),
+            ('flakes', re.compile(r'Unexpected flakiness.+\((\d+)\)')),
             ('new passes', re.compile(r'Expected to .+, but passed:\s+\((\d+)\)')),
-            ('missing results', re.compile(r'(?:no expected results found|missing results)\s*:\s+\((\d+)\)')),
-            ('failures', re.compile(r'Regressions: [Uu]nexpected.+:?\s*\((\d+)\)')),
+            ('missing results', re.compile(r'Regressions: Unexpected missing results\s+\((\d+)\)')),
+            ('failures', re.compile(r'Regressions: Unexpected.+\((\d+)\)')),
         ]
         testFailures = {}
 
@@ -537,15 +550,34 @@
         shell.Test.commandComplete(self, cmd)
 
         logText = cmd.logs['stdio'].getText()
-        incorrectLines = []
-        for line in logText.splitlines():
-            if line.startswith('ERROR'):
-                incorrectLines.append(line)
 
-        self.incorrectLines = incorrectLines
+        self.incorrectTests = 0
+        self.timedOutTests = 0
+        self.skippedTests = 0
+        self.statusLine = []
+
+        foundItems = re.findall("Tests failed \((\d+)\):", logText)
+        if (foundItems):
+            self.incorrectTests = int(foundItems[0])
+
+        foundItems = re.findall("Tests that timed out \((\d+)\):", logText)
+        if (foundItems):
+            self.timedOutTests = int(foundItems[0])
+
+        foundItems = re.findall("Tests skipped \((\d+)\):", logText)
+        if (foundItems):
+            self.skippedTests = int(foundItems[0])
+
+        self.totalFailedTests = self.incorrectTests + self.timedOutTests
+
+        if self.totalFailedTests > 0:
+            self.statusLine = [
+                "%d API tests failed, %d timed out, %d skipped" %
+                (self.incorrectTests, self.timedOutTests, self.skippedTests)
+            ]
 
     def evaluateCommand(self, cmd):
-        if self.incorrectLines:
+        if self.totalFailedTests > 0:
             return FAILURE
 
         if cmd.rc != 0:
@@ -557,8 +589,8 @@
         return self.getText2(cmd, results)
 
     def getText2(self, cmd, results):
-        if results != SUCCESS and self.incorrectLines:
-            return ["%d API tests failed" % len(self.incorrectLines)]
+        if results != SUCCESS and self.totalFailedTests > 0:
+            return self.statusLine
 
         return [self.name]
 
@@ -646,7 +678,7 @@
               "--slave-config-json-path", "../../perf-test-config.json",
               "--no-show-results",
               "--reset-results",
-              "--test-results-server", "webkit-perf.appspot.com",
+              "--test-results-server", "perf.webkit.org",
               "--builder-name", WithProperties("%(buildername)s"),
               "--build-number", WithProperties("%(buildnumber)s"),
               "--platform", WithProperties("%(fullPlatform)s"),
@@ -725,6 +757,7 @@
         # There are multiple Qt slaves running on same machines, so buildslaves shouldn't kill the processes of other slaves.
         if not platform.startswith("qt"):
             self.addStep(KillOldProcesses())
+        self.addStep(DeleteStaleBuildFiles())
         if platform == "win":
             self.addStep(InstallWin32Dependencies())
         if platform.startswith("chromium"):
@@ -788,13 +821,14 @@
             self.addStep(RunQtAPITests)
 
 class BuildAndTestFactory(Factory):
+    CompileClass = CompileWebKit
     TestClass = RunWebKitTests
     ExtractTestResultsClass = ExtractTestResults
     def __init__(self, platform, configuration, architectures, triggers=None, SVNMirror=None, **kwargs):
         Factory.__init__(self, platform, configuration, architectures, False, SVNMirror, **kwargs)
         if platform.startswith("chromium"):
             self.addStep(CleanupChromiumCrashLogs)
-        self.addStep(CompileWebKit())
+        self.addStep(self.CompileClass())
         if not platform.startswith("chromium"):
             self.addStep(RunJavaScriptCoreTests())
         if platform.startswith("chromium"):
@@ -812,7 +846,7 @@
         self.addStep(UploadTestResults())
         self.addStep(self.ExtractTestResultsClass())
         if platform == "efl":
-            self.addStep(RunEflAPITests)
+            self.addStep(RunEflAPITests())
         if platform == "gtk":
             self.addStep(RunGtkAPITests())
         if platform.startswith("qt"):
@@ -822,10 +856,14 @@
             self.addStep(UploadBuiltProduct())
             self.addStep(trigger.Trigger(schedulerNames=triggers))
 
-class BuildAndTestWebKit2Factory(BuildAndTestFactory):
+class BuildAndTestWebKit1OnlyFactory(BuildAndTestFactory):
+    CompileClass = CompileWebKit1Only
+
+class BuildAndTestWebKit2OnlyFactory(BuildAndTestFactory):
+    CompileClass = CompileWebKit2Only
     TestClass = RunWebKit2Tests
 
-class BuildAndTestLeaksFactory(BuildAndTestFactory):
+class TestLeaksFactory(TestFactory):
     TestClass = RunWebKitLeakTests
     ExtractTestResultsClass = ExtractTestResultsAndLeaks
 
@@ -854,14 +892,16 @@
         Factory.__init__(self, platform, configuration, architectures, False, SVNMirror, **kwargs)
         self.addStep(DownloadBuiltProduct())
         self.addStep(ExtractBuiltProduct())
+        if platform == "chromium-android":
+            self.addStep(OutputAndroidDeviceStatus())
         self.addStep(RunAndUploadPerfTests())
 
 class DownloadAndPerfTestWebKit2Factory(Factory):
     def __init__(self, platform, configuration, architectures, SVNMirror=None, **kwargs):
         Factory.__init__(self, platform, configuration, architectures, False, SVNMirror, **kwargs)
-        self.addStep(DownloadBuiltProduct)
-        self.addStep(ExtractBuiltProduct)
-        self.addStep(RunAndUploadPerfTestsWebKit2)
+        self.addStep(DownloadBuiltProduct())
+        self.addStep(ExtractBuiltProduct())
+        self.addStep(RunAndUploadPerfTestsWebKit2())
 
 class PlatformSpecificScheduler(AnyBranchScheduler):
     def __init__(self, platform, branch, **kwargs):
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/mastercfg_unittest.py b/Tools/BuildSlaveSupport/build.webkit.org-config/mastercfg_unittest.py
index d1614c0..3f86e75 100755
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/mastercfg_unittest.py
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/mastercfg_unittest.py
@@ -51,18 +51,41 @@
 
 class MasterCfgTest(unittest.TestCase):
     def test_nrwt_leaks_parsing(self):
-        run_webkit_tests = RunWebKitTests()
+        run_webkit_tests = RunWebKitTests()  # pylint is confused by the way we import the module ... pylint: disable-msg=E0602
         log_text = """
-2011-08-09 10:05:18,580 29486 mac.py:275 INFO leaks found for a total of 197,936 bytes!
-2011-08-09 10:05:18,580 29486 mac.py:276 INFO 1 unique leaks found!
+12:44:24.295 77706 13981 total leaks found for a total of 197,936 bytes!
+12:44:24.295 77706 1 unique leaks found!
 """
         expected_incorrect_lines = [
-            'leaks found for a total of 197,936 bytes!',
+            '13981 total leaks found for a total of 197,936 bytes!',
             '1 unique leaks found!',
         ]
         run_webkit_tests._parseNewRunWebKitTestsOutput(log_text)
-        self.assertEquals(run_webkit_tests.incorrectLayoutLines, expected_incorrect_lines)
+        self.assertEqual(run_webkit_tests.incorrectLayoutLines, expected_incorrect_lines)
 
+    def test_nrwt_missing_results(self):
+        run_webkit_tests = RunWebKitTests()  # pylint is confused by the way we import the module ... pylint: disable-msg=E0602
+        log_text = """
+Expected to fail, but passed: (2)
+  animations/additive-transform-animations.html
+  animations/cross-fade-webkit-mask-box-image.html
+
+Unexpected flakiness: text-only failures (2)
+  fast/events/touch/touch-inside-iframe.html [ Failure Pass ]
+  http/tests/inspector-enabled/console-clear-arguments-on-frame-navigation.html [ Failure Pass ]
+
+Unexpected flakiness: timeouts (1)
+  svg/text/foreignObject-repaint.xml [ Timeout Pass ]
+
+Regressions: Unexpected missing results (1)
+  svg/custom/zero-path-square-cap-rendering2.svg [ Missing ]
+
+Regressions: Unexpected text-only failures (1)
+  svg/custom/zero-path-square-cap-rendering2.svg [ Failure ]
+"""
+        run_webkit_tests._parseNewRunWebKitTestsOutput(log_text)
+        self.assertEqual(set(run_webkit_tests.incorrectLayoutLines),
+            set(['2 new passes', '3 flakes', '1 missing results', '1 failures']))
 
 class StubStdio(object):
     def __init__(self, stdio):
@@ -354,7 +377,7 @@
             for buildStepFactory, kwargs in builder['factory'].steps:
                 if str(buildStepFactory).split('.')[-1] == 'CheckOutSource':
                         CheckOutSourceInstance = buildStepFactory(**kwargs)
-                        self.assertEquals(CheckOutSourceInstance.baseURL, self.get_SVNMirrorFromConfig(builder['name']))
+                        self.assertEqual(CheckOutSourceInstance.baseURL, self.get_SVNMirrorFromConfig(builder['name']))
 
 
 class BuildStepsConstructorTest(unittest.TestCase):
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/favicon.ico b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/favicon.ico
new file mode 100644
index 0000000..d988dfc
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/favicon.ico
Binary files differ
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html
index 19e156b..24b0607 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html
@@ -32,10 +32,10 @@
                                          script-src 'self' file: https://ajax.googleapis.com;
                                          style-src 'self' 'unsafe-inline' file: https://ajax.googleapis.com http://fonts.googleapis.com;
                                          font-src http://themes.googleusercontent.com;
-                                         img-src 'self' https://ajax.googleapis.com http://build.chromium.org http://build.webkit.org file: http://127.0.0.1:8127;
-                                         media-src http://build.chromium.org http://build.webkit.org http://127.0.0.1:8127;
-                                         frame-src http://build.chromium.org http://build.webkit.org http://test-results.appspot.com http://127.0.0.1:8127;
-                                         connect-src http://trac.webkit.org http://build.chromium.org http://build.webkit.org http://127.0.0.1:8127">
+                                         img-src 'self' https://ajax.googleapis.com http://build.chromium.org http://build.webkit.org;
+                                         media-src 'self' http://build.chromium.org http://build.webkit.org;
+                                         frame-src 'self' http://build.chromium.org http://build.webkit.org http://test-results.appspot.com;
+                                         connect-src 'self' http://trac.webkit.org http://build.chromium.org http://build.webkit.org">
 <title>Garden-O-Matic</title>
 <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Open+Sans:400,700">
 <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/themes/base/jquery-ui.css">
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/Utilities.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/Utilities.js
index 36dc7b9..f800b39 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/Utilities.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/Utilities.js
@@ -23,7 +23,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-function createDefinitionList(items) {
+function createDescriptionList(items) {
     var list = document.createElement('dl');
     items.forEach(function(pair) {
         var dt = document.createElement('dt');
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js
index bc8013c..c7740fb 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js
@@ -176,7 +176,7 @@
         ];
         if (passingBuildName)
             dlItems.push([document.createTextNode('Passed'), this._domForBuildName(builder, passingBuildName)]);
-        result.appendChild(createDefinitionList(dlItems));
+        result.appendChild(createDescriptionList(dlItems));
 
         if (!passingBuildName)
             return result;
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js
index a83f7d3..d77e899 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js
@@ -178,6 +178,8 @@
 {
     var startIndex = jsonp.indexOf('(') + 1;
     var endIndex = jsonp.lastIndexOf(')');
+    if (startIndex == 0 || endIndex == -1)
+        return {};
     return JSON.parse(jsonp.substr(startIndex, endIndex - startIndex));
 };
 
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js
index 4639e82..2106e68 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js
@@ -466,4 +466,9 @@
     ok(!base.getURLParameter('non-existant'));
 });
 
+test("parseJSONP", 2, function() {
+    deepEqual(base.parseJSONP(""), {});
+    deepEqual(base.parseJSONP('p({"key": "value"})'), {"key": "value"});
+});
+
 })();
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout.js
index 862ce65..10ea1ec 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout.js
@@ -56,7 +56,7 @@
 checkout.isAvailable = function(callback)
 {
     net.ajax({
-        url: config.kLocalServerURL + '/ping',
+        url: '/ping',
         success: function() {
             callback(true);
         },
@@ -69,7 +69,7 @@
 checkout.rollout = function(revision, reason, callback, checkoutUnavailable)
 {
     callIfCheckoutAvailable(function() {
-        net.post(config.kLocalServerURL + '/rollout?' + $.param({
+        net.post('/rollout?' + $.param({
             'revision': revision,
             'reason': reason
         }), function() {
@@ -88,7 +88,7 @@
             tests[failureInfo.testName][failureInfo.builderName] = 
                 base.uniquifyArray(base.flattenArray(failureInfo.failureTypeList.map(results.failureTypeToExtensionList)));
         }
-        net.post(config.kLocalServerURL + '/rebaselineall', JSON.stringify(tests), function() { callback() });
+        net.post('/rebaselineall', JSON.stringify(tests), function() { callback() });
     }, checkoutUnavailable);
 };
 
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout_unittests.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout_unittests.js
index 32a5674..6d65ba2 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout_unittests.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout_unittests.js
@@ -76,7 +76,7 @@
     });
 
     deepEqual(requests, [
-        ["http://127.0.0.1:8127/rebaselineall",
+        ["/rebaselineall",
          JSON.stringify({
              "another/test.svg": {
                  "WebKit Linux": ["png"], 
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/config.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/config.js
index 9600021..8087056 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/config.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/config.js
@@ -40,6 +40,10 @@
             'Apple Lion Debug WK1 (Tests)' : {version: 'lion', debug: true},
             'Apple Lion Release WK2 (Tests)' : {version: 'lion' },
             'Apple Lion Debug WK2 (Tests)' : {version: 'lion', debug: true},
+            'Apple MountainLion Release WK1 (Tests)' : {version: 'mountainlion' },
+            'Apple MountainLion Debug WK1 (Tests)' : {version: 'mountainlion', debug: true},
+            'Apple MountainLion Release WK2 (Tests)' : {version: 'mountainlion' },
+            'Apple MountainLion Debug WK2 (Tests)' : {version: 'mountainlion', debug: true},
             // 'Apple Win XP Debug (Tests)' : {version: 'xp',debug: true},
             // 'Apple Win 7 Release (Tests)' : {version: 'win7'},
         },
@@ -93,7 +97,7 @@
             return builderName.indexOf('GPU') == -1 &&
                    builderName.indexOf('deps') == -1 &&
                    builderName.indexOf('ASAN') == -1 &&
-                   builderName.indexOf('Content Shell') == -1 &&
+                   builderName.indexOf('WebKit (Content Shell) Android') == -1 &&
                    builderName.indexOf('Mac10.8 Tests') == -1 &&
                    builderName.indexOf('WebKit Android') == -1;
         },
@@ -169,7 +173,6 @@
 
 config.kTracURL = 'http://trac.webkit.org';
 config.kBugzillaURL = 'https://bugs.webkit.org';
-config.kLocalServerURL = 'http://127.0.0.1:8127';
 
 config.kRevisionAttr = 'data-revision';
 config.kTestNameAttr = 'data-test-name';
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js
index 3dacd28..94e16d7 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js
@@ -30,23 +30,48 @@
 var kCheckoutUnavailableMessage = 'Failed! Garden-o-matic needs a local server to modify your working copy. Please run "webkit-patch garden-o-matic" start the local server.';
 
 // FIXME: Where should this function go?
-function rebaselineWithStatusUpdates(failureInfoList)
+function rebaselineWithStatusUpdates(failureInfoList, resultsByTest)
 {
-    // FIXME: If a test is a reftest, webkit-patch rebaseline-test should error out
-    // and we should alert (modal dialog?) the user.
     var statusView = new ui.StatusArea('Rebaseline');
     var id = statusView.newId();
 
-    var testNames = base.uniquifyArray(failureInfoList.map(function(failureInfo) { return failureInfo.testName; }));
-    var testName = testNames.length == 1 ? testNames[0] : testNames.length + ' tests';
-    statusView.addMessage(id, 'Performing rebaseline of ' + testName + '...');
+    var failuresToRebaseline = [];
+    var testNamesLogged = [];
+    failureInfoList.forEach(function(failureInfo) {
+        if (isAnyReftest(failureInfo.testName, resultsByTest)) {
+            if (testNamesLogged.indexOf(failureInfo.testName) == -1) {
+                statusView.addMessage(id, failureInfo.testName + ' is a ref test, skipping');
+                testNamesLogged.push(failureInfo.testName);
+            }
+        } else {
+            failuresToRebaseline.push(failureInfo);
+            if (testNamesLogged.indexOf(failureInfo.testName) == -1) {
+                statusView.addMessage(id, 'Rebaselining ' + failureInfo.testName + '...');
+                testNamesLogged.push(failureInfo.testName);
+            }
+        }
+    });
+    
+    if (failuresToRebaseline.length) {
+        checkout.rebaseline(failuresToRebaseline, function() {
+            statusView.addFinalMessage(id, 'Rebaseline done! Please land with "webkit-patch land-cowhand".');
+        }, function(failureInfo) {
+            statusView.addMessage(id, failureInfo.testName + ' on ' + ui.displayNameForBuilder(failureInfo.builderName));
+        }, function() {
+            statusView.addFinalMessage(id, kCheckoutUnavailableMessage);
+        });
+    } else {
+        statusView.addFinalMessage(id, 'No non-reftests left to rebaseline!')
+    }
+}
 
-    checkout.rebaseline(failureInfoList, function() {
-        statusView.addFinalMessage(id, 'Rebaseline done! Please land with "webkit-patch land-cowboy".');
-    }, function(failureInfo) {
-        statusView.addMessage(id, failureInfo.testName + ' on ' + ui.displayNameForBuilder(failureInfo.builderName));
-    }, function() {
-        statusView.addFinalMessage(id, kCheckoutUnavailableMessage);
+// FIXME: This is duplicated from ui/results.js :(.
+function isAnyReftest(testName, resultsByTest)
+{
+    return Object.keys(resultsByTest[testName]).map(function(builder) {
+        return resultsByTest[testName][builder];
+    }).some(function(resultNode) {
+        return resultNode.reftest_type && resultNode.reftest_type.length;
     });
 }
 
@@ -61,7 +86,7 @@
     statusView.addMessage(id, 'Updating expectations of ' + testName + '...');
 
     checkout.updateExpectations(failureInfoList, function() {
-        statusView.addFinalMessage(id, 'Expectations update done! Please land with "webkit-patch land-cowboy".');
+        statusView.addFinalMessage(id, 'Expectations update done! Please land with "webkit-patch land-cowhand".');
     }, function() {
         statusView.addFinalMessage(id, kCheckoutUnavailableMessage);
     });
@@ -98,7 +123,7 @@
     },
     onRebaseline: function()
     {
-        rebaselineWithStatusUpdates(this._failureInfoList());
+        rebaselineWithStatusUpdates(this._failureInfoList(), this._resultsByTest);
         this._view.nextTest();
     },
     onUpdateExpectations: function()
@@ -206,7 +231,14 @@
     },
     onRebaseline: function(failures)
     {
-        rebaselineWithStatusUpdates(this._toFailureInfoList(failures));
+        var testNameList = failures.testNameList();
+        var failuresByTest = base.filterDictionary(
+            this._resultsFilter(this._model.resultsByBuilder),
+            function(key) {
+                return testNameList.indexOf(key) != -1;
+            });
+
+        rebaselineWithStatusUpdates(this._toFailureInfoList(failures), failuresByTest);
     },
     onUpdateExpectations: function(failures)
     {
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js
index 012df03..2dd55a8 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js
@@ -188,7 +188,7 @@
 function resultsDirectoryURL(platform, builderName)
 {
     if (config.useLocalResults)
-        return config.kLocalServerURL + '/localresult?path=';
+        return '/localresult?path=';
     return resultsDirectoryListingURL(platform, builderName) + 'results/layout-test-results/';
 }
 
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js
index 5d3b8f3..9c3d47e 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js
@@ -245,7 +245,7 @@
         this.appendChild(new ui.actions.List([new ui.actions.Close()]));
         $(this).bind('close', this.close.bind(this));
 
-        var processing = document.createElement('div');
+        var processing = document.createElement('progress');
         processing.className = 'process-text';
         processing.textContent = 'Processing...';
         this.appendChild(processing);
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js
index d624a21..05e597e 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js
@@ -187,7 +187,7 @@
     return Object.keys(resultsByTest[testName]).map(function(builder) {
         return resultsByTest[testName][builder];
     }).some(function(resultNode) {
-        return resultNode.is_reftest || resultNode.is_mismatch_reftest
+        return resultNode.reftest_type && resultNode.reftest_type.length;
     });
 }
 
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js
index 1a4d550..2457ac4 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js
@@ -68,14 +68,14 @@
         "Mock Builder": {
             "expected": "PASS",
             "actual": "IMAGE",
-            "is_reftest": true
+            "reftest_type": ["=="]
         }
     },
     "mismatch-reftest.html": {
         "Mock Builder": {
             "expected": "PASS",
             "actual": "IMAGE",
-            "is_mismatch_reftest": true
+            "reftest_type": ["!="]
         }
     }
 };
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui_unittests.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui_unittests.js
index 74de3e4..66f7ac9 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui_unittests.js
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui_unittests.js
@@ -155,7 +155,7 @@
     equal(statusArea.outerHTML,
         '<div class="status processing" style="visibility: visible; ">' +
             '<ul class="actions"><li><button class="action">Close</button></li></ul>' +
-            '<div class="process-text">Processing...</div>' +
+            '<progress class="process-text">Processing...</progress>' +
             '<div id="status-content-1" class="status-content">' +
                 '<div class="message">First Message</div>' +
                 '<div class="message">Second Message</div>' +
@@ -169,7 +169,7 @@
     equal(statusArea.outerHTML,
         '<div class="status processing" style="visibility: visible; ">' +
             '<ul class="actions"><li><button class="action">Close</button></li></ul>' +
-            '<div class="process-text">Processing...</div>' +
+            '<progress class="process-text">Processing...</progress>' +
             '<div id="status-content-1" class="status-content">' +
                 '<div class="message">First Message</div>' +
                 '<div class="message">Second Message</div>' +
@@ -185,7 +185,7 @@
     equal(statusArea.outerHTML,
         '<div class="status" style="visibility: visible; ">' +
             '<ul class="actions"><li><button class="action">Close</button></li></ul>' +
-            '<div class="process-text">Processing...</div>' +
+            '<progress class="process-text">Processing...</progress>' +
             '<div id="status-content-1" class="status-content">' +
                 '<div class="message">First Message</div>' +
                 '<div class="message">Second Message</div>' +
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css
index 419807e..f493a8e 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css
@@ -11,6 +11,10 @@
     color: #333;
 }
 
+small {
+  font-size: 9px;
+}
+
 .auth {
     position: absolute;
     top: 5px;
@@ -18,7 +22,11 @@
 }
 
 a:link,a:visited,a:active {
-    color: #444;
+    color: #333;
+}
+
+a:visited {
+    color: #557;
 }
 
 table {
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html b/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
index e783b93..eafdaa6 100755
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
@@ -1,7 +1,7 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE html>
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <title>Welcome to the Buildbot</title>
 </head>
 
@@ -24,7 +24,7 @@
   <li><a href="results">Test Results</a></li>
   <li><a href="LeaksViewer">Leaks Viewer</a></li>
   <li><a href="TestFailures">Test Failures</a></li>
-  <li><a href="http://webkit-perf.appspot.com/">Perf-o-matic</a> (external website) results submitted by <a href="http://build.webkit.org/waterfall?show=Apple%20Lion%20Release%20%28Perf%29&show=Apple%20MountainLion%20Release%20%28Perf%29&show=Chromium%20Linux%20Release%20%28Perf%29&show=Chromium%20Mac%20Release%20%28Perf%29&show=Chromium%20Win%20Release%20%28Perf%29&show=Qt%20Linux%2064-bit%20Release%20%28Perf%29&show=Qt%20Linux%2064-bit%20Release%20%28WebKit2%20Perf%29">performance bots</a></li>
+  <li><a href="http://perf.webkit.org/">WebKit Perf Monitor</a> results submitted by <a href="http://build.webkit.org/waterfall?show=Apple%20Lion%20Release%20%28Perf%29&show=Apple%20MountainLion%20Release%20%28Perf%29&show=Chromium%20Android%20Release%20%28Perf%29&show=Chromium%20Linux%20Release%20%28Perf%29&show=Chromium%20Mac%20Release%20%28Perf%29&show=Chromium%20Win%20Release%20%28Perf%29&show=Qt%20Linux%2064-bit%20Release%20%28Perf%29&show=Qt%20Linux%2064-bit%20Release%20%28WebKit2%20Perf%29&show=EFL%20Linux%2064-bit%20Release%20WK2%20%28Perf%29">performance bots</a></li>
 </ul>
-</body> </html>
-
+</body>
+</html>
diff --git a/Tools/Scripts/webkitpy/common/config/build.py b/Tools/BuildSlaveSupport/build.webkit.org-config/wkbuild.py
similarity index 97%
rename from Tools/Scripts/webkitpy/common/config/build.py
rename to Tools/BuildSlaveSupport/build.webkit.org-config/wkbuild.py
index 2ecacc7..52bc467 100644
--- a/Tools/Scripts/webkitpy/common/config/build.py
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/wkbuild.py
@@ -94,12 +94,12 @@
         (r"(?:^|/)GNUmakefile\.am$", ["gtk"]),
         (r"/\w+Chromium\w*\.(?:cpp|h|mm)$", ["chromium"]),
         (r"Mac\.(?:cpp|h|mm)$", ["mac"]),
-        (r"\.(?:vcproj|vsprops|sln)$", ["win"]),
+        (r"\.(?:vcproj|vsprops|sln|vcxproj|props|filters)$", ["win"]),
         (r"\.exp(?:\.in)?$", ["mac"]),
         (r"\.gypi?", ["chromium"]),
         (r"\.order$", ["mac"]),
         (r"\.pr[io]$", ["qt"]),
-        (r"\.vcproj/", ["win"]),
+        (r"\.(?:vcproj|vcxproj)/", ["win"]),
         (r"\.xcconfig$", ["mac"]),
         (r"\.xcodeproj/", ["mac"]),
     ]
diff --git a/Tools/Scripts/webkitpy/common/config/build_unittest.py b/Tools/BuildSlaveSupport/build.webkit.org-config/wkbuild_unittest.py
similarity index 85%
rename from Tools/Scripts/webkitpy/common/config/build_unittest.py
rename to Tools/BuildSlaveSupport/build.webkit.org-config/wkbuild_unittest.py
index c496179..5b4556a 100644
--- a/Tools/Scripts/webkitpy/common/config/build_unittest.py
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/wkbuild_unittest.py
@@ -20,9 +20,9 @@
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
-from webkitpy.common.config import build
+import wkbuild
 
 
 class ShouldBuildTest(unittest.TestCase):
@@ -52,7 +52,7 @@
         (["Source/WebCore/platform/graphics/gpu/foo"], ["mac-leopard", "mac-lion",  "mac-mountainlion", "mac-snowleopard"]),
         (["Source/WebCore/platform/wx/wxcode/win/foo"], []),
         (["Source/WebCore/rendering/RenderThemeMac.mm", "Source/WebCore/rendering/RenderThemeMac.h"], ["mac-leopard", "mac-lion",  "mac-mountainlion", "mac-snowleopard"]),
-        (["Source/WebCore/rendering/RenderThemeChromiumLinux.h"], ["chromium-linux"]),
+        (["Source/WebCore/rendering/RenderThemeChromiumDefault.h"], ["chromium-linux"]),
         (["Source/WebCore/rendering/RenderThemeWinCE.h"], []),
         (["Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.js"], []),
     ]
@@ -60,11 +60,15 @@
     def test_should_build(self):
         for files, platforms in self._should_build_tests:
             # FIXME: We should test more platforms here once
-            # build._should_file_trigger_build is implemented for them.
+            # wkbuild._should_file_trigger_build is implemented for them.
             for platform in ["mac-leopard", "mac-lion",  "mac-mountainlion", "mac-snowleopard", "win"]:
                 should_build = platform in platforms or "*" in platforms
-                self.assertEqual(build.should_build(platform, files), should_build, "%s should%s have built but did%s (files: %s)" % (platform, "" if should_build else "n't", "n't" if should_build else "", str(files)))
+                self.assertEqual(wkbuild.should_build(platform, files), should_build, "%s should%s have built but did%s (files: %s)" % (platform, "" if should_build else "n't", "n't" if should_build else "", str(files)))
 
-
-if __name__ == "__main__":
+# FIXME: We should run this file as part of test-rm .
+# Unfortunately test-rm  currently requires that unittests
+# be located in a directory with a valid module name.
+# 'build.webkit.org-config' is not a valid module name (due to '.' and '-')
+# so for now this is a stand-alone test harness.
+if __name__ == '__main__':
     unittest.main()
diff --git a/Tools/BuildSlaveSupport/built-product-archive b/Tools/BuildSlaveSupport/built-product-archive
index 7ef88f7..ba74fd7 100644
--- a/Tools/BuildSlaveSupport/built-product-archive
+++ b/Tools/BuildSlaveSupport/built-product-archive
@@ -163,10 +163,15 @@
             return 1
 
     elif platform == 'chromium':
+        print "Archiving", configurationBuildDirectory
         thinDirectory = os.path.join(configurationBuildDirectory, "thin")
 
+        # The scripts use the existence of out/Release/build.ninja to decide
+        # if this is a ninja build, so don't exclude build.ninja from the
+        # archive.
         ignorePatterns = ['.svn', '*.a', '*.d', '*.dSYM', '*.o', '*.ilk', '*.lib', '*.idb',
-                          'BuildLog.htm', '*.obj', '*.pdb', '*.pch', '*.tlog', '*.lastbuildstate']
+                          'BuildLog.htm', '*.obj', '*.pdb', '*.pch', '*.tlog', '*.lastbuildstate',
+                          '*.h', '*.c', '*.cc', '*.cpp', '*.stamp']
 
         if fullPlatform and fullPlatform == 'chromium-android':
             ignorePatterns.extend(['*.so', '*-unaligned.apk', '*-unsigned.apk'])
@@ -219,6 +224,7 @@
 
         return unzipArchive(configurationBuildDirectory, configuration)
     elif platform == 'qt' or platform == 'gtk' or platform == 'efl' or platform == 'chromium':
+        print "Extracting", configurationBuildDirectory
         return unzipArchive(configurationBuildDirectory, configuration)
 
 
diff --git a/Tools/BuildSlaveSupport/delete-stale-build-files b/Tools/BuildSlaveSupport/delete-stale-build-files
new file mode 100755
index 0000000..8933d3b
--- /dev/null
+++ b/Tools/BuildSlaveSupport/delete-stale-build-files
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+# Copyright (C) 2013 Apple Inc.  All rights reserved.
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import optparse
+import os
+import subprocess
+import sys
+
+
+def main():
+    parser = optparse.OptionParser("usage: %prog [options]")
+    parser.add_option("--platform")
+    parser.add_option("--build-directory")
+    parser.add_option("--debug", action="store_const", const="debug", dest="configuration")
+    parser.add_option("--release", action="store_const", const="release", dest="configuration")
+
+    options, parameters = parser.parse_args()
+    if not options.platform:
+        parser.error("Platform is required")
+        return -1
+    if not options.configuration:
+        parser.error("Configuration is required")
+        return -2
+
+    genericPlatform = options.platform.split('-', 1)[0]
+    if genericPlatform != 'mac':
+        print 'Exited without removing any files.'
+        return 0
+
+    if options.build_directory:
+        buildDirectory = options.build_directory
+    else:
+        buildDirectory = webkitBuildDirectory(genericPlatform, options.configuration)
+
+    exit_code = 0
+
+    for root, _, files in os.walk(buildDirectory):
+        for name in files:
+            full_path = os.path.join(root, name)
+            ext = os.path.splitext(full_path)[1]
+
+            try:
+                if ext not in ('.o',) or os.path.getsize(full_path):
+                    continue
+            except OSError as exception:
+                print exception
+                continue
+
+            try:
+                os.remove(full_path)
+                print 'Removed', full_path
+            except OSError as exception:
+                print exception
+                exit_code += 1
+
+    return exit_code
+
+
+def webkitBuildDirectory(platform, configuration):
+    return subprocess.Popen(['perl', os.path.join(os.path.dirname(__file__), "..", "Scripts", "webkit-build-directory"),
+        "--" + platform, "--" + configuration, '--top-level'], stdout=subprocess.PIPE).communicate()[0].strip()
+
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/Tools/BuildSlaveSupport/kill-old-processes b/Tools/BuildSlaveSupport/kill-old-processes
index 682a5e5..359967f 100755
--- a/Tools/BuildSlaveSupport/kill-old-processes
+++ b/Tools/BuildSlaveSupport/kill-old-processes
@@ -1,119 +1,119 @@
-#!/usr/bin/python

-# Copyright (C) 2010 Apple Inc.  All rights reserved.

-# Copyright (C) 2011 Google Inc.  All rights reserved.

-#

-# Redistribution and use in source and binary forms, with or without

-# modification, are permitted provided that the following conditions

-# are met:

-#

-# 1.  Redistributions of source code must retain the above copyright

-#     notice, this list of conditions and the following disclaimer.

-# 2.  Redistributions in binary form must reproduce the above copyright

-#     notice, this list of conditions and the following disclaimer in the

-#     documentation and/or other materials provided with the distribution.

-#

-# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY

-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED

-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

-# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY

-# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

-# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND

-# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-

-import os, sys

-

-

-def main():

-    tasksToKillWin = [

-        "cl.exe",

-        "devenv.com",

-        "devenv.exe",

-        "DumpRenderTree.exe",

-        "DumpRenderTree_debug.exe",

-        "httpd.exe",

-        "imagediff.exe",

-        "imagediff_debug.exe",

-        "jsc.exe",

-        "jsc_debug.exe",

-        "LightTPD.exe",

-        "link.exe",

-        "midl.exe",

-        "perl.exe",

-        "Safari.exe",

-        "svn.exe",

-        "testapi.exe",

-        "testapi_debug.exe",

-        "VcBuildHelper.exe",

-        "wdiff.exe",

-        "WebKit2WebProcess.exe",

-        "WebKit2WebProcess_debug.exe",

-        "WebKitTestRunner.exe",

-        "WebKitTestRunner_debug.exe",

-    ]

-

-    tasksToKillMac = [

-        "apache2",

-        "cc1plus",

-        "cc1objplus",

-        "clang",

-        "clang\+\+",

-        "gcc-4.2",

-        "httpd",

-        "i686-apple-darwin10-gcc-4.2.1",

-        "jsc",

-        "make",

-        "pboard", # FIXME: https://bugs.webkit.org/show_bug.cgi?id=81012

-        "per5.12",

-        "perl",

-        "Problem Reporter",

-        "ruby",

-        "Safari Web Content",

-        "Safari",

-        "svn",

-        "DumpRenderTree",

-        "TestWebKitAPI Web Content",

-        "TestWebKitAPI",

-        "WebKitPluginAgen", # FIXME: Why no 't'?

-        "WebKitTestRunner Web Content",

-        "WebKitTestRunner",

-        "WebProcess",

-        "xcodebuild",

-    ]

-

-    taskToKillUnix = [

-        "apache2",

-        "cc1plus",

-        "DumpRenderTree",

-        "gold",

-        "httpd",

-        "ld",

-        "make",

-        "ruby",

-        "svn",

-        "webkit_unit_tests",

-        "WebKitTestRunner",

-        "Xvfb",

-    ]

-

-    if sys.platform == 'darwin':

-        for task in tasksToKillMac:

-            os.system("killall -9 -v -m " + task)

-        # Kill all instances of python executing run-webkit-tests

-        os.system("ps aux | grep -P '.+/Python .+(run_webkit_tests|run-webkit-tests)' | grep -v grep | awk '{print $2}' | xargs kill")

-    elif sys.platform == 'cygwin' or sys.platform == 'win32':

-        for task in tasksToKillWin:

-            os.system("taskkill /t /f /im " + task)

-    elif sys.platform.startswith('linux'):

-        for task in taskToKillUnix:

-            os.system("killall -9 -v " + task)

-        os.system("ps aux | grep -P '.+/python .+(run_webkit_tests|run-webkit-tests)' | grep -v grep | awk '{print $2}' | xargs kill")

-    else:

-        sys.exit()

-        # FIXME: Should we return an exit code based on how the kills went?

-

-

-if __name__ == '__main__':

-    sys.exit(main())

+#!/usr/bin/python
+# Copyright (C) 2010 Apple Inc.  All rights reserved.
+# Copyright (C) 2011 Google Inc.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os, sys
+
+
+def main():
+    tasksToKillWin = [
+        "cl.exe",
+        "devenv.com",
+        "devenv.exe",
+        "DumpRenderTree.exe",
+        "DumpRenderTree_debug.exe",
+        "httpd.exe",
+        "imagediff.exe",
+        "imagediff_debug.exe",
+        "jsc.exe",
+        "jsc_debug.exe",
+        "LightTPD.exe",
+        "link.exe",
+        "midl.exe",
+        "perl.exe",
+        "Safari.exe",
+        "svn.exe",
+        "testapi.exe",
+        "testapi_debug.exe",
+        "VcBuildHelper.exe",
+        "wdiff.exe",
+        "WebKit2WebProcess.exe",
+        "WebKit2WebProcess_debug.exe",
+        "WebKitTestRunner.exe",
+        "WebKitTestRunner_debug.exe",
+    ]
+
+    tasksToKillMac = [
+        "apache2",
+        "cc1plus",
+        "cc1objplus",
+        "clang",
+        r"clang\\+\\+",
+        "gcc-4.2",
+        "httpd",
+        "i686-apple-darwin10-gcc-4.2.1",
+        "jsc",
+        "make",
+        "pboard", # FIXME: https://bugs.webkit.org/show_bug.cgi?id=81012
+        "per5.12",
+        "perl",
+        "Problem Reporter",
+        "ruby",
+        "Safari Web Content",
+        "Safari",
+        "svn",
+        "DumpRenderTree",
+        "TestWebKitAPI Web Content",
+        "TestWebKitAPI",
+        "WebKitPluginAgen", # FIXME: Why no 't'?
+        "WebKitTestRunner Web Content",
+        "WebKitTestRunner",
+        "WebProcess",
+        "xcodebuild",
+    ]
+
+    taskToKillUnix = [
+        "apache2",
+        "cc1plus",
+        "DumpRenderTree",
+        "gold",
+        "httpd",
+        "ld",
+        "make",
+        "ruby",
+        "svn",
+        "webkit_unit_tests",
+        "WebKitTestRunner",
+        "Xvfb",
+    ]
+
+    if sys.platform == 'darwin':
+        for task in tasksToKillMac:
+            os.system("killall -9 -v -m " + task)
+        # Kill all instances of python executing run-webkit-tests
+        os.system("ps aux | grep -E '.+/Python .+(run_webkit_tests|run-webkit-tests)' | grep -v grep | awk '{print $2}' | xargs kill")
+    elif sys.platform == 'cygwin' or sys.platform == 'win32':
+        for task in tasksToKillWin:
+            os.system("taskkill /t /f /im " + task)
+    elif sys.platform.startswith('linux'):
+        for task in taskToKillUnix:
+            os.system("killall -9 -v " + task)
+        os.system("ps aux | grep -P '.+/python .+(run_webkit_tests|run-webkit-tests)' | grep -v grep | awk '{print $2}' | xargs kill")
+    else:
+        sys.exit()
+        # FIXME: Should we return an exit code based on how the kills went?
+
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/Tools/CMakeLists.txt b/Tools/CMakeLists.txt
index 1aa39bf..d0527d4 100644
--- a/Tools/CMakeLists.txt
+++ b/Tools/CMakeLists.txt
@@ -1,23 +1,24 @@
-IF (ENABLE_WEBKIT2)
-    ADD_SUBDIRECTORY(WebKitTestRunner)
-ENDIF ()
+if (ENABLE_WEBKIT2)
+    add_subdirectory(WebKitTestRunner)
+endif ()
 
-IF ("${PORT}" STREQUAL "Efl")
-    ADD_SUBDIRECTORY(EWebLauncher/ControlTheme)
+if ("${PORT}" STREQUAL "Efl")
+    add_subdirectory(ImageDiff)
+    add_subdirectory(EWebLauncher/ControlTheme)
 
-    IF (ENABLE_WEBKIT)
-        ADD_SUBDIRECTORY(DumpRenderTree/efl)
-        ADD_SUBDIRECTORY(EWebLauncher)
-    ENDIF ()
+    if (ENABLE_WEBKIT)
+        add_subdirectory(DumpRenderTree/efl)
+        add_subdirectory(EWebLauncher)
+    endif ()
 
-    IF (ENABLE_WEBKIT2 AND ELEMENTARY_FOUND)
-        ADD_SUBDIRECTORY(MiniBrowser/efl)
-    ENDIF ()
-    ADD_SUBDIRECTORY(DumpRenderTree/TestNetscapePlugIn)
-ELSEIF ("${PORT}" STREQUAL "WinCE")
-    ADD_SUBDIRECTORY(WinCELauncher)
-ENDIF()
+    if (ENABLE_WEBKIT2)
+        add_subdirectory(MiniBrowser/efl)
+    endif ()
+    add_subdirectory(DumpRenderTree/TestNetscapePlugIn)
+elseif ("${PORT}" STREQUAL "WinCE")
+    add_subdirectory(WinCELauncher)
+endif ()
 
-IF (ENABLE_WEBKIT2 AND ENABLE_API_TESTS)
-    ADD_SUBDIRECTORY(TestWebKitAPI)
-ENDIF()
+if (ENABLE_WEBKIT2 AND ENABLE_API_TESTS)
+    add_subdirectory(TestWebKitAPI)
+endif ()
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index 094abe5..675c97d 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,26842 @@
+2013-03-25  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Remove one more line that was intended to be removed in r146657.
+
+        * Scripts/webkitpy/layout_tests/models/test_run_results.py:
+        (summarize_results):
+
+2013-03-25  Roger Fong  <roger_fong@apple.com>
+
+        No longer run bindings tests on WinEWS bots which are causing hangs on the bots.
+        Re-enable WinEWS tests.
+
+        * Scripts/webkitpy/common/config/ports.py:
+        (WinPort.run_bindings_tests_command):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-25  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r146793.
+        http://trac.webkit.org/changeset/146793
+        https://bugs.webkit.org/show_bug.cgi?id=113248
+
+        Fix did not work (Requested by rfong on #webkit).
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-25  Ryosuke Niwa  <rniwa@webkit.org>
+
+        REGRESSION(r146657): Test failures reported incorrectly
+        https://bugs.webkit.org/show_bug.cgi?id=113223
+
+        Reviewed by Dirk Pranke.
+
+        The bug was caused by BuildBotPrinter not taking the new behavior into account.
+
+        Fixed the bug by exposing enabled_pixel_tests_in_retry flag via ResultDetails object and have BuildBotPrinter
+        treat ['TEXT', 'IMAGE+TEXT'] as a regular failure when the flag is set true.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.run):
+
+        * Scripts/webkitpy/layout_tests/models/test_run_results.py:
+        (RunDetails.__init__):
+        (summarize_results): Remove the line I intended to remove in r146657.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (logging_run): Return details instead of the exit code.
+        (run_and_capture): Ditto.
+
+        (RunTest.test_full_results_html):
+        (RunTest.test_hung_thread):
+        (RunTest.test_no_tests_found):
+        (RunTest.test_no_tests_found_2):
+        (RunTest.test_repeat_each_iterations_num_tests):
+        (RunTest.test_run_singly_actually_runs_tests):
+        (RunTest.test_test_list):
+        (RunTest.test_missing_and_unexpected_results):
+        (RunTest.test_pixel_test_directories):
+        (RunTest.test_missing_and_unexpected_results_with_custom_exit_code):
+        (RunTest.test_crash_with_stderr):
+        (RunTest.test_no_image_failure_with_image_diff):
+        (RunTest.test_crash_log):
+        (RunTest.test_exit_after_n_failures_upload):
+        (RunTest.test_results_directory_absolute):
+        (RunTest.test_results_directory_relative):
+        (RunTest.test_retrying_and_flaky_tests):
+        (RunTest.test_retrying_force_pixel_tests): Added a test case to ensure enabled_pixel_tests_in_retry is set.
+        (RunTest.test_retrying_uses_retries_directory):
+        (RunTest.test_reftest_should_not_use_naming_convention_if_not_listed_in_reftestlist):
+        (RunTest.test_output_diffs):
+        (EndToEndTest.test_reftest_with_two_notrefs):
+        (RebaselineTest.test_reset_results):
+        (RebaselineTest.test_missing_results):
+        (RebaselineTest.test_new_baseline):
+
+        * Scripts/webkitpy/layout_tests/views/buildbot_results.py:
+        (BuildBotPrinter.print_results):
+        (BuildBotPrinter.print_unexpected_results):
+        (BuildBotPrinter.print_unexpected_results.add_result): Don't treat ['TEXT', 'IMAGE+TEXT'] as flaky
+        when we forced pixel tests in retry (i.e. pixel test was initially disabled).
+
+2013-03-25  Julie Parent  <jparent@chromium.org>
+
+        Dashboard refactor: Move cross dashboard history related code into history.js.
+        https://bugs.webkit.org/show_bug.cgi?id=113104
+
+        Reviewed by Ojan Vafai.
+
+        All functions relating to cross dashboard behavior move from being
+        globals to methods on the history.History object. Names stay the same,
+        except many are made private, ones that should have been constants now
+        are, and the long standing TODO to change "currentState" to 
+        dashboardSpecificState is done.
+        
+        We now create a global history object in dashboard_base, as an 
+        intermediate measure.  Once the dashboard specific code is
+        added to history, each DB will need to create its own, and this
+        global will be eliminated.
+        
+        * TestResultServer/static-dashboards/aggregate_results.js:
+        (handleValidHashParameter):
+        (htmlForBuilder):
+        (rawValuesHTML):
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseDashboardSpecificParameters):
+        (defaultValue):
+        (currentBuilderGroupCategory):
+        (currentBuilderGroupName):
+        (handleLocationChange):
+        (expectationsMap):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (generatePage):
+        (.switch.return):
+        (platformAndBuildType):
+        (individualTests):
+        (substringList):
+        (processMissingAndExtraExpectations):
+        (pathToFailureLog):
+        (showPopupForBuild):
+        (htmlForTestsWithExpectationsButNoFailures):
+        (shouldHideTest):
+        (isCrossBuilderView):
+        (tableHeaders):
+        (htmlForSingleTestRow):
+        (htmlForTableColumnHeader):
+        (generatePageForExpectationsUpdate):
+        (handleUpdate):
+        (nextUpdate):
+        (setUpdateIndex):
+        (htmlForIndividualTestOnAllBuildersWithResultsLinks):
+        (.appendExpectationsItem):
+        (loadExpectations):
+        (.dummyNode.onload):
+        (loadExpectationsLayoutTests):
+        (appendExpectations):
+        (htmlForNavBar):
+        (checkBoxToToggleState):
+        (linkHTMLToToggleState):
+        (generatePageForBuilder):
+        (isInvalidKeyForCrossBuilderView):
+        (handleQueryParameterChange):
+        (showLegend):
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        (resetGlobals):
+        (test):
+        * TestResultServer/static-dashboards/history.js:
+        (.):
+        * TestResultServer/static-dashboards/history_unittests.js:
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+        * TestResultServer/static-dashboards/timeline_explorer.js:
+        (generatePage):
+        (initCurrentBuilderTestResults):
+        (selectBuild):
+        (showResultsDelta):
+        * TestResultServer/static-dashboards/treemap.js:
+        (generatePage):
+        (.switch.return):
+        (handleFocus):
+        * TestResultServer/static-dashboards/ui.js:
+
+2013-03-25  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Enable WinEWS tests again.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-25  Dominik Röttsches  <dominik.rottsches@intel.com>
+
+        [HarfBuzz] ICU detection fix in HarfBuzz obsoletes our workaround
+        https://bugs.webkit.org/show_bug.cgi?id=112166
+
+        HarfBuzz 0.9.14 merged my patch for icu detection without
+        pkg-config files, as needed by for example Ubuntu 12.04.
+        This obsoletes our local workaround. Removed it for GTK and EFL.
+
+        Reviewed by Martin Robinson.
+
+        * efl/jhbuild.modules: Patch reference removed, version bumped to 0.9.14.
+        * efl/patches/harfbuzz-icu-detection-fix.patch: Removed.
+        * gtk/jhbuild.modules: Patch reference removed, version bumped to 0.9.14.
+        * gtk/patches/harfbuzz-icu-detection-fix.patch: Removed.
+
+2013-03-22  Kiran Muppala  <cmuppala@apple.com>
+
+        Unreviewed.  Move self from contributor to committer list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-22  Ryosuke Niwa  <rniwa@webkit.org>
+
+        EWS should use a human readable port name when uploading layout test archives
+        https://bugs.webkit.org/show_bug.cgi?id=113099
+
+        Reviewed by Dirk Pranke.
+
+        Use new port's object's name() method to report human readable port names.
+        This will also help us resolving the bug to apply layout test results posted by EWS.
+
+        * Scripts/webkitpy/tool/bot/botinfo.py:
+        (BotInfo.__init__): Take port's name.
+        (BotInfo.summary_text):
+
+        * Scripts/webkitpy/tool/bot/botinfo_unittest.py:
+        (BotInfoTest.test_summary_text):
+
+        * Scripts/webkitpy/tool/bot/flakytestreporter.py:
+        (FlakyTestReporter.__init__): Preserve the old behavior since we don't have a real port object here.
+
+        * Scripts/webkitpy/tool/commands/queues.py:
+        (PatchProcessingQueue.__init__): Initialize self._port.
+        (PatchProcessingQueue._upload_results_archive_for_patch): Intansitate a real port object if needed,
+        and use that for the attachment filename and the comment posted.
+
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+        (PatchProcessingQueueTest.test_upload_results_archive_for_patch): Port name is updated to be
+        "mac-snowleopard" as expected for TestPort.
+
+2013-03-22  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Turn off EWS test on Win again.
+        The battle continues.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-22  Ryosuke Niwa  <rniwa@webkit.org>
+
+        NRWT: Enable pixel tests when retrying tests
+        https://bugs.webkit.org/show_bug.cgi?id=112898
+
+        Reviewed by Dirk Pranke.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.run): Call _force_pixel_tests_if_needed before retrying tests and set pixel_tests False
+        if we've forced pixel tests in the retry.
+        (Manager._run_tests):
+        (Manager._clean_up_run): Fixed the capitalizations.
+        (Manager._force_pixel_tests_if_needed): Added.
+
+        * Scripts/webkitpy/layout_tests/models/test_run_results.py:
+        (_interpret_test_failures): Now that this function maybe called multiple times, only set
+        'image_diff_percent' if it doesn't already exist.
+
+        (summarize_results): When the first attempt resulted in a text failure and the second attempt
+        resulted in image and text failures and we've forced to run pixel tests in the retry run,
+        treat this as a regular regression instead of a flakiness.
+
+        Also update test_dict with retry_result so that image_diff_percent maybe filled in if retry
+        run had image diffs.
+
+        * Scripts/webkitpy/layout_tests/models/test_run_results_unittest.py:
+        (summarized_results):
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (parse_full_results): Moved out of EndToEndTest to be used in test_retrying_force_pixel_tests.
+        Also removed some dead code.
+
+        (RunTest.test_retrying_force_pixel_tests): Added. Assert that we generate and only generate
+        pixel results in retries when pixel tests is turned off. Also assert that image_diff_percent
+        is set and pixel_tests_enabled is set to false.
+        (EndToEndTest.test_reftest_with_two_notrefs):
+
+2013-03-22  Tim Horton  <timothy_horton@apple.com>
+
+        Make it possible to run layout tests on Retina MBP
+        https://bugs.webkit.org/show_bug.cgi?id=93673
+
+        Reviewed by Ryosuke Niwa.
+
+        Use NSWindow SPI and override -backingScaleFactor so that WKTR and DRT
+        windows on 2x machines still run at 1x.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (createWebViewAndOffscreenWindow):
+        Reset the window resolution to 1x on creation.
+        * DumpRenderTree/mac/DumpRenderTreeWindow.h: Add NSWindow details.
+        * DumpRenderTree/mac/DumpRenderTreeWindow.mm:
+        (-[DumpRenderTreeWindow backingScaleFactor]): Override, always return 1.
+        * WebKitTestRunner/mac/PlatformWebViewMac.mm:
+        (-[WebKitTestRunnerWindow backingScaleFactor]): Override, always return 1.
+        (WTR::PlatformWebView::PlatformWebView):
+        Add NSWindow details, reset the window resolution to 1x on creation.
+
+2013-03-19  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Leak bots shouldn't build
+        https://bugs.webkit.org/show_bug.cgi?id=112774
+
+        Reviewed by Simon Fraser.
+
+        Since leak bots use regular debug builds, there is no need to build on these bots.
+        Simply downloading builds will dramatically improve the cycle time of these bots.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (TestLeaksFactory): Renamed from BuildAndTestLeaksFactory and changed to inherit from
+        TestFactory instead of BuildAndTestFactory.
+
+2013-03-22  Jocelyn Turcotte  <jocelyn.turcotte@digia.com>
+
+        [Qt] Fix the TestWebKitAPI build
+        https://bugs.webkit.org/show_bug.cgi?id=113044
+
+        Reviewed by Tor Arne Vestbø.
+
+        The generate-forwarding-headers script would only be run
+        after the targets in InjectedBundle.pri since the second
+        addStrictSubdirOrderBetween call in
+        Tools/TestWebKitAPI/TestWebKitAPI.pro would overwrite
+        the derived_sources -> injected_bundle order in SUBDIRS.
+
+        Fix it by only moving the dependent target at the end of
+        SUBDIRS, don't touch its dependency.
+
+        * qmake/mkspecs/features/functions.prf:
+
+2013-03-22  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] View is not focused when fullscreen mode toggled
+        https://bugs.webkit.org/show_bug.cgi?id=113009
+
+        Reviewed by Laszlo Gombos.
+
+        Set focus on view when fullscreen mode enabled/disabled
+        by FullScreen API.
+
+        * MiniBrowser/efl/main.c:
+        (on_fullscreen_accept):
+        (on_fullscreen_deny):
+
+2013-03-21  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt is no longer saving retry results in the retries/ subdirectory
+        https://bugs.webkit.org/show_bug.cgi?id=112995
+
+        Reviewed by Ojan Vafai.
+
+        I think this has been broken a long time, unfortunately. This
+        patch should fix that.
+
+        In order to do so, I had to pass the directory to use from
+        the Worker object through the SingleTestWriter to the
+        TestResultWriter. While I was plumbing that through, I rationalized
+        the order of the parameter arguments a bit ...
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (Worker._run_single_test):
+        * Scripts/webkitpy/layout_tests/controllers/single_test_runner.py:
+        (run_single_test):
+        (SingleTestRunner.__init__):
+        (SingleTestRunner._run_compare_test):
+        (SingleTestRunner._run_rebaseline):
+        (SingleTestRunner._run_reftest):
+        * Scripts/webkitpy/layout_tests/controllers/test_result_writer.py:
+        (write_test_result):
+        * Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py:
+        (TestResultWriterTest.test_reftest_diff_image):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (RunTest.test_retrying_uses_retries_directory):
+
+2013-03-21  Filip Pizlo  <fpizlo@apple.com>
+
+        JSC profiler should have an at-a-glance report of the success of DFG optimization
+        https://bugs.webkit.org/show_bug.cgi?id=112988
+
+        Reviewed by Geoffrey Garen.
+
+        * Scripts/display-profiler-output:
+
+2013-03-21  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] Linux ASAN WebKit canary is running out of memory
+        https://bugs.webkit.org/show_bug.cgi?id=112978
+
+        Reviewed by Tony Chang.
+
+        Running the AddressSanitizer on a crash takes a lot of
+        memory, so we should serialize access to it to avoid running
+        out of memory on a machine.
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort._get_crash_log):
+        * Scripts/webkitpy/layout_tests/port/http_lock.py:
+        (HttpLock.__init__):
+        (HttpLock.wait_for_httpd_lock):
+
+2013-03-21  Min Qin  <qinmin@chromium.org>
+
+        Cleanup android media layout test code
+        https://bugs.webkit.org/show_bug.cgi?id=112944
+
+        Reviewed by Adam Barth.
+
+        Chromium change: https://codereview.chromium.org/12892010/
+        The current android layout tests are using WebmediaPlayerInProcessAndroid class.
+        The code path has been largely diverged from that of the WebMediaPlayerImplAndroid.
+        It is not worth the effort to keep the code path, and the layout tests will not reflect the actual behavior on the browser.
+        Instead, we should switch to use content shell for layout tests.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::resetTestController):
+
+2013-03-21  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] add missing project dependencies to DRT to fix Mac Valgrind
+        https://bugs.webkit.org/show_bug.cgi?id=112953
+
+        Reviewed by Tony Chang.
+
+        When I created the DumpRenderTree_resources target in r144863 I
+        forgot to declare the needed dependencies on the other resource
+        targets. Due to a quirk of ordering, this appears to have been fine
+        w/ ninja but not w/ Xcode (which is still being used on the chromium
+        mac valgrind bots). Declaring the dependencies fixes the build
+        failures.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-21  Brent Fulgham  <bfulgham@webkit.org>
+
+        [WinCairo] Correct assert in Empty BitmapImage Test.
+        https://bugs.webkit.org/show_bug.cgi?id=112934
+
+        Reviewed by Tim Horton.
+
+        * TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp:
+        (TestWebKitAPI::TEST): Use proper RefPtr and adoptRef
+        to avoid ref counting assertion when leaving test scope.
+
+2013-03-21  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] generate-feature-defines-files is incompatible with Python3
+        https://bugs.webkit.org/show_bug.cgi?id=112956
+
+        Reviewed by Martin Robinson.
+
+        Make the generate-feature-defines-files compatible with Python3 by calling the items()
+        method on the dictionary objects when iterating through said dictionaries.
+
+        * gtk/generate-feature-defines-files:
+        (write_feature_defines_header):
+        (write_flattened_feature_defines_file):
+
+2013-03-20  Ryosuke Niwa  <rniwa@webkit.org>
+
+        kill-old-processes spits out error messages on Mac
+        https://bugs.webkit.org/show_bug.cgi?id=112878
+
+        Reviewed by Jessie Berlin.
+
+        Use grep -E instead of grep -P since grep on Mac doesn't seem to support the latter even though it's
+        included in the list of options grep --help shows.
+
+        Also use double-slash in escaping ++ in clang++ since the slashes needs to escape + inside the shell.
+
+        * BuildSlaveSupport/kill-old-processes:
+        (main):
+
+2013-03-21  Alberto Garcia  <agarcia@igalia.com>
+
+        [BlackBerry] AccessibilityUIElement: add dummy implementations of scroll methods
+        https://bugs.webkit.org/show_bug.cgi?id=112597
+
+        Reviewed by Xan Lopez.
+
+        These were introduced for the Chromium port in r105295. We need
+        dummy implementations in order to compile the BlackBerry port.
+
+        * DumpRenderTree/blackberry/AccessibilityUIElementBlackBerry.cpp:
+        (AccessibilityUIElement::scrollToMakeVisible):
+        (AccessibilityUIElement::scrollToMakeVisibleWithSubFocus):
+        (AccessibilityUIElement::scrollToGlobalPoint):
+
+2013-03-21  Roger Fong  <roger_fong@apple.com>
+
+        Re-enable WinEWS tests following r146376.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-21  Zoltan Horvath  <zoltan@webkit.org>
+
+        Unreviewed. Add Bem Jones-Bey to the list of contributors.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-21  Claudio Saavedra  <csaavedra@igalia.com>
+
+        [GTK] Missing atk in install-dependencies script
+        https://bugs.webkit.org/show_bug.cgi?id=112272
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * gtk/install-dependencies: Add missing atk dependency.
+
+2013-03-21  Claudio Saavedra  <csaavedra@igalia.com>
+
+        [GTK] Missing backslash in install-dependencies script
+        https://bugs.webkit.org/show_bug.cgi?id=112907
+
+        Reviewed by Philippe Normand.
+
+        * gtk/install-dependencies: Add missing backslash to dependencies
+        list.
+
+2013-03-20  Ryosuke Niwa  <rniwa@webkit.org>
+
+        EWS bots have stopped uploading results to bugzilla
+        https://bugs.webkit.org/show_bug.cgi?id=101091
+
+        Reviewed by Adam Barth.
+
+        The bug was caused by LayoutTestResultsReader passing a relative file path to the archive zip
+        to workspace.archive_zip. Because archive_zip uses the results directory as the working directory,
+        this relative file path resoled to a file inside a non-existent directory for "zip".
+
+        Fixed the bug by resolving both test results directory and zip archive paths in
+        LayoutTestResultsReader.archive.
+
+        Also made workspace.create_zip print the source_path so that we may debug these issues more easily
+        in the future.
+
+        * Scripts/webkitpy/common/system/filesystem_mock.py:
+        (MockFileSystem.splitext): Don't assume the entire file path is a file extension when there is no ".".
+
+        * Scripts/webkitpy/common/system/workspace.py:
+        (Workspace.create_zip): Log the source path when "zip" failed.
+
+        * Scripts/webkitpy/common/system/workspace_mock.py:
+        (MockWorkspace.create_zip): Record zip_path and source_path for testing.
+
+        * Scripts/webkitpy/common/system/workspace_unittest.py:
+        (WorkspaceTest.test_create_zip_exception): Test that.
+
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader.py:
+        (LayoutTestResultsReader.archive): Resolve paths before passing them to workspace.create_zip.
+        This is the actual bug fix.
+
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py:
+        (test_archive_last_layout_test_results_with_relative_path): Added a test case.
+
+2013-03-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move WebThemeEngine implementations to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=112751
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::themeEngine):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (WebKit):
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::themeEngine):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp: Renamed from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.cpp.
+        (WebTestRunner::WebTestThemeControlWin::WebTestThemeControlWin):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeControlWin::~WebTestThemeControlWin):
+        (WebTestRunner::WebTestThemeControlWin::box):
+        (WebTestRunner::WebTestThemeControlWin::line):
+        (WebTestRunner::WebTestThemeControlWin::triangle):
+        (WebTestRunner::WebTestThemeControlWin::roundRect):
+        (WebTestRunner::WebTestThemeControlWin::oval):
+        (WebTestRunner::WebTestThemeControlWin::circle):
+        (WebTestRunner::WebTestThemeControlWin::nestedBoxes):
+        (WebTestRunner::WebTestThemeControlWin::markState):
+        (WebTestRunner::WebTestThemeControlWin::draw):
+        (WebTestRunner::WebTestThemeControlWin::drawTextField):
+        (WebTestRunner::WebTestThemeControlWin::drawProgressBar):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.h.
+        (WebTestRunner):
+        (WebTestThemeControlWin):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.h.
+        (WebTestRunner):
+        (WebTestThemeEngineMac):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.mm.
+        (+[FakeActiveWindow alwaysActiveWindow]):
+        (+[FakeActiveWindow alwaysInactiveWindow]):
+        (-[FakeActiveWindow initWithActiveControls:]):
+        (-[FakeActiveWindow _hasActiveControls]):
+        (WebTestRunner::WebTestThemeEngineMac::paintScrollbarThumb):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeEngineMac::paintHIThemeScrollbarThumb):
+        (WebTestRunner::WebTestThemeEngineMac::paintNSScrollerScrollbarThumb):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp: Added.
+        (WebTestRunner::WebTestThemeEngineWin::paintButton):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeEngineWin::paintMenuList):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarArrow):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarThumb):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarTrack):
+        (WebTestRunner::WebTestThemeEngineWin::paintSpinButton):
+        (WebTestRunner::WebTestThemeEngineWin::paintTextField):
+        (WebTestRunner::WebTestThemeEngineWin::paintTrackbar):
+        (WebTestRunner::WebTestThemeEngineWin::paintProgressBar):
+        (WebTestRunner::WebTestThemeEngineWin::getSize):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.h.
+        (WebTestRunner):
+        (WebTestThemeEngineWin):
+        (WebTestRunner::WebTestThemeEngineWin::WebTestThemeEngineWin):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestShellMac.mm:
+        (platformInit):
+        * DumpRenderTree/chromium/TestShellWin.cpp:
+        (platformInit):
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp: Removed.
+
+2013-03-20  Brent Fulgham  <bfulgham@webkit.org>
+
+        [WinCairo] Unreviewed build fix for TestWebKitAPI under VS2010
+
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPICommonWinCairo.props: Added.
+        New property sheet that does not link against CoreFoundation and
+        CFNetwork.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebugWinCairo.props:
+        Use new TestWebKitAPICommonWinCairo property sheet.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIReleaseWinCairo.props:
+        Ditto.
+
+2013-03-20  Brent Fulgham  <bfulgham@webkit.org>
+
+        [WinCairo] Unreviewed build fix for VS2010.
+
+        Had to add WinCairo-specific property sheets to deal with some
+        library and path differences with the main Apple port.
+
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj:
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebugWinCairo.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeReleaseWinCairo.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommonWinCairo.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebugWinCairo.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffReleaseWinCairo.props: Added.
+
+2013-03-20  Benjamin Poulain  <bpoulain@apple.com>
+
+        [WK2] Remove VIEW_MODE_CSS_MEDIA from WebKit2
+        https://bugs.webkit.org/show_bug.cgi?id=112849
+
+        Reviewed by Sam Weinig.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+
+2013-03-20  Brent Fulgham  <bfulgham@webkit.org>
+
+        [WinCairo] Build WebKit Tools under VS2010
+        https://bugs.webkit.org/show_bug.cgi?id=112821
+
+        Reviewed by Tim Horton.
+
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj:
+        Add WinCairo-specific build target.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebugWinCairo.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncher.vcxproj: Add WinCairo-specific build target.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeReleaseWinCairo.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeWinCairo.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiff.vcxproj:
+        Add WinCairo-specific build target.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncher.vcxproj:
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj:
+        Add WinCairo-specific build target.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj: Add
+        WinCairo-specific build target.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebugWinCairo.props: Added.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIReleaseWinCairo.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj: Add WinCairo-
+        specific build target.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj: Add
+        WinCairo-specific build target.
+        * win/record-memory/record-memory.vcxproj: Add WinCairo target.
+        * win/record-memory/record-memoryDebugWinCairo.props: Added.
+        * win/record-memory/record-memoryReleaseWinCairo.props: Added.
+
+2013-03-20  Roger Fong  <roger_fong@apple.com>
+
+        API test gardening AppleWin port.
+
+        The BitmapImageEmptyFrameTest should only be tested on Cairo not on AppleWin port.
+
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj:
+        * TestWebKitAPI/win/TestWebKitAPI.vcproj:
+
+2013-03-20  Roger Fong  <roger_fong@apple.com>
+
+        Test fix for Win EWS bots, catch various errors and restart script if necessary.
+
+        * EWSTools/start-queue-win.sh:
+
+2013-03-20  Sami Kyostila  <skyostil@chromium.org>
+
+        Unreviewed, add myself to committers.py.
+
+2013-03-20  Caio Marcelo de Oliveira Filho  <caio.oliveira@openbossa.org>
+
+        Unreviewed. Adding another email for me.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-20  Justin Novosad  <junov@google.com>
+
+        [Chromium] Code cleanup: removing support for non-deferred 2d canvas rendering
+        https://bugs.webkit.org/show_bug.cgi?id=112605
+
+        Reviewed by James Robinson.
+
+        Deleting all the code that was used for propagating and supporting
+        the Chromium setting for disabling deferred 2d canvas rendering.
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (main):
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner::WebPreferences::applyTo):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        (TestShell::resetWebSettings):
+        (TestShell::runFileTest):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+
+2013-03-20  Ádám Kallai  <kadam@inf.u-szeged.hu>
+
+        [Qt] Qt 4.8 tool related stuff removal from webkitpy.
+        https://bugs.webkit.org/show_bug.cgi?id=112699.
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/layout_tests/port/qt.py:
+        (QtPort._search_paths):
+        (QtPort._port_specific_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/qt_unittest.py:
+        (QtPortTest):
+        (QtPortTest._assert_search_path):
+        (QtPortTest._assert_expectations_files):
+
+2013-03-19  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Enable kerning by default
+        https://bugs.webkit.org/show_bug.cgi?id=112704
+
+        Reviewed by Jocelyn Turcotte.
+
+        Disable kerning by default, since some reference test expectations
+        expect kerning to be default off.
+
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunnerQt::reset):
+        * WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp:
+        (WTR::activateFonts):
+
+2013-03-20  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt] Remove empty function stubs from TestRunnerQt.
+        https://bugs.webkit.org/show_bug.cgi?id=112799
+
+        We are reducing the code in TestRunnerQt step by step,
+        in order to finally replace all of it with the generic
+        TestRunner implementation.
+        This patch removes several simple function stubs that
+        currently do not implement any actual functionality.
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+
+2013-03-20  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Don't show the SearchBar by default when MiniBrowser opened
+        https://bugs.webkit.org/show_bug.cgi?id=112687
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Hide the SearchBar by default on window creation.
+
+        * MiniBrowser/efl/main.c:
+        (window_create):
+
+2013-03-20  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r146304.
+        http://trac.webkit.org/changeset/146304
+        https://bugs.webkit.org/show_bug.cgi?id=112788
+
+        to many expectations to update (Requested by antonm on
+        #webkit).
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp: Removed.
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestShellMac.mm:
+        (platformInit):
+        * DumpRenderTree/chromium/TestShellWin.cpp:
+        (platformInit):
+        * DumpRenderTree/chromium/WebThemeControlDRTWin.cpp: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp.
+        (WebThemeControlDRTWin::WebThemeControlDRTWin):
+        (WebThemeControlDRTWin::~WebThemeControlDRTWin):
+        (WebThemeControlDRTWin::box):
+        (WebThemeControlDRTWin::line):
+        (WebThemeControlDRTWin::triangle):
+        (WebThemeControlDRTWin::roundRect):
+        (WebThemeControlDRTWin::oval):
+        (WebThemeControlDRTWin::circle):
+        (WebThemeControlDRTWin::nestedBoxes):
+        (WebThemeControlDRTWin::markState):
+        (WebThemeControlDRTWin::draw):
+        (WebThemeControlDRTWin::drawTextField):
+        (WebThemeControlDRTWin::drawProgressBar):
+        * DumpRenderTree/chromium/WebThemeControlDRTWin.h: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h.
+        (WebThemeControlDRTWin):
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.h: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h.
+        (WebThemeEngineDRTMac):
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.mm: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm.
+        (+[FakeActiveWindow alwaysActiveWindow]):
+        (+[FakeActiveWindow alwaysInactiveWindow]):
+        (-[FakeActiveWindow initWithActiveControls:]):
+        (-[FakeActiveWindow _hasActiveControls]):
+        (WebThemeEngineDRTMac::paintScrollbarThumb):
+        (stateToHIEnableState):
+        (WebThemeEngineDRTMac::paintHIThemeScrollbarThumb):
+        (WebThemeEngineDRTMac::paintNSScrollerScrollbarThumb):
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp: Added.
+        (webRectToSkIRect):
+        (drawControl):
+        (drawTextField):
+        (drawProgressBar):
+        (WebThemeEngineDRTWin::paintButton):
+        (WebThemeEngineDRTWin::paintMenuList):
+        (WebThemeEngineDRTWin::paintScrollbarArrow):
+        (WebThemeEngineDRTWin::paintScrollbarThumb):
+        (WebThemeEngineDRTWin::paintScrollbarTrack):
+        (WebThemeEngineDRTWin::paintSpinButton):
+        (WebThemeEngineDRTWin::paintTextField):
+        (WebThemeEngineDRTWin::paintTrackbar):
+        (WebThemeEngineDRTWin::paintProgressBar):
+        (WebThemeEngineDRTWin::getSize):
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.h: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h.
+        (WebThemeEngineDRTWin):
+        (WebThemeEngineDRTWin::WebThemeEngineDRTWin):
+
+2013-03-19  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Support -webkit-font-smoothing
+        https://bugs.webkit.org/show_bug.cgi?id=106009
+
+        Reviewed by Jocelyn Turcotte.
+
+        Set shouldUseFontSmoothing to false to match WebKitTestRunner.
+
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunnerQt::reset):
+
+2013-03-20  Krzysztof Czech  <k.czech@samsung.com>
+
+        [GTK] accessibility/aria-scrollbar-role.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=98358
+
+        Reviewed by Martin Robinson.
+
+        Adds support for checking accessibility object's orientation.
+        Orientation is checked by retrieving proper state of accessibility object.
+
+        * DumpRenderTree/atk/AccessibilityUIElementAtk.cpp:
+        (checkElementState):
+        (AccessibilityUIElement::orientation):
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::AccessibilityUIElement::orientation):
+
+2013-03-19  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move WebThemeEngine implementations to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=112751
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::themeEngine):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (WebKit):
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::themeEngine):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp: Renamed from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.cpp.
+        (WebTestRunner::WebTestThemeControlWin::WebTestThemeControlWin):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeControlWin::~WebTestThemeControlWin):
+        (WebTestRunner::WebTestThemeControlWin::box):
+        (WebTestRunner::WebTestThemeControlWin::line):
+        (WebTestRunner::WebTestThemeControlWin::triangle):
+        (WebTestRunner::WebTestThemeControlWin::roundRect):
+        (WebTestRunner::WebTestThemeControlWin::oval):
+        (WebTestRunner::WebTestThemeControlWin::circle):
+        (WebTestRunner::WebTestThemeControlWin::nestedBoxes):
+        (WebTestRunner::WebTestThemeControlWin::markState):
+        (WebTestRunner::WebTestThemeControlWin::draw):
+        (WebTestRunner::WebTestThemeControlWin::drawTextField):
+        (WebTestRunner::WebTestThemeControlWin::drawProgressBar):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.h.
+        (WebTestRunner):
+        (WebTestThemeControlWin):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.h.
+        (WebTestRunner):
+        (WebTestThemeEngineMac):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.mm.
+        (+[FakeActiveWindow alwaysActiveWindow]):
+        (+[FakeActiveWindow alwaysInactiveWindow]):
+        (-[FakeActiveWindow initWithActiveControls:]):
+        (-[FakeActiveWindow _hasActiveControls]):
+        (WebTestRunner::WebTestThemeEngineMac::paintScrollbarThumb):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeEngineMac::paintHIThemeScrollbarThumb):
+        (WebTestRunner::WebTestThemeEngineMac::paintNSScrollerScrollbarThumb):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp: Added.
+        (WebTestRunner::WebTestThemeEngineWin::paintButton):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeEngineWin::paintMenuList):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarArrow):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarThumb):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarTrack):
+        (WebTestRunner::WebTestThemeEngineWin::paintSpinButton):
+        (WebTestRunner::WebTestThemeEngineWin::paintTextField):
+        (WebTestRunner::WebTestThemeEngineWin::paintTrackbar):
+        (WebTestRunner::WebTestThemeEngineWin::paintProgressBar):
+        (WebTestRunner::WebTestThemeEngineWin::getSize):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.h.
+        (WebTestRunner):
+        (WebTestThemeEngineWin):
+        (WebTestRunner::WebTestThemeEngineWin::WebTestThemeEngineWin):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestShellMac.mm:
+        (platformInit):
+        * DumpRenderTree/chromium/TestShellWin.cpp:
+        (platformInit):
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp: Removed.
+
+2013-03-19  Tony Chang  <tony@chromium.org>
+
+        Move testRunner.setTouchDragDropEnabled to internals.settings
+        https://bugs.webkit.org/show_bug.cgi?id=112739
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner): Remove unnecessary code.
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner): Remove unnecessary code.
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner::WebPreferences::applyTo): Always set to false.
+
+2013-03-19  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] Migrate to WEBKIT_USE_NEW_WEBFILESYSTEMTYPE
+        https://bugs.webkit.org/show_bug.cgi?id=112754
+
+        Reviewed by Darin Fisher.
+
+        Remove old code behind ifndef WEBKIT_USE_NEW_WEBFILESYSTEMTYPE
+        now that it's always defined.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-03-19  Kenneth Russell  <kbr@google.com>
+
+        Unreviewed, rolling out r146290.
+        http://trac.webkit.org/changeset/146290
+        https://bugs.webkit.org/show_bug.cgi?id=112751
+
+        Broke Chromium Mac build.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp: Removed.
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestShellMac.mm:
+        (platformInit):
+        * DumpRenderTree/chromium/TestShellWin.cpp:
+        (platformInit):
+        * DumpRenderTree/chromium/WebThemeControlDRTWin.cpp: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp.
+        (WebThemeControlDRTWin::WebThemeControlDRTWin):
+        (WebThemeControlDRTWin::~WebThemeControlDRTWin):
+        (WebThemeControlDRTWin::box):
+        (WebThemeControlDRTWin::line):
+        (WebThemeControlDRTWin::triangle):
+        (WebThemeControlDRTWin::roundRect):
+        (WebThemeControlDRTWin::oval):
+        (WebThemeControlDRTWin::circle):
+        (WebThemeControlDRTWin::nestedBoxes):
+        (WebThemeControlDRTWin::markState):
+        (WebThemeControlDRTWin::draw):
+        (WebThemeControlDRTWin::drawTextField):
+        (WebThemeControlDRTWin::drawProgressBar):
+        * DumpRenderTree/chromium/WebThemeControlDRTWin.h: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h.
+        (WebThemeControlDRTWin):
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.h: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h.
+        (WebThemeEngineDRTMac):
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.mm: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm.
+        (+[FakeActiveWindow alwaysActiveWindow]):
+        (+[FakeActiveWindow alwaysInactiveWindow]):
+        (-[FakeActiveWindow initWithActiveControls:]):
+        (-[FakeActiveWindow _hasActiveControls]):
+        (WebThemeEngineDRTMac::paintScrollbarThumb):
+        (stateToHIEnableState):
+        (WebThemeEngineDRTMac::paintHIThemeScrollbarThumb):
+        (WebThemeEngineDRTMac::paintNSScrollerScrollbarThumb):
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp: Added.
+        (webRectToSkIRect):
+        (drawControl):
+        (drawTextField):
+        (drawProgressBar):
+        (WebThemeEngineDRTWin::paintButton):
+        (WebThemeEngineDRTWin::paintMenuList):
+        (WebThemeEngineDRTWin::paintScrollbarArrow):
+        (WebThemeEngineDRTWin::paintScrollbarThumb):
+        (WebThemeEngineDRTWin::paintScrollbarTrack):
+        (WebThemeEngineDRTWin::paintSpinButton):
+        (WebThemeEngineDRTWin::paintTextField):
+        (WebThemeEngineDRTWin::paintTrackbar):
+        (WebThemeEngineDRTWin::paintProgressBar):
+        (WebThemeEngineDRTWin::getSize):
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.h: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h.
+        (WebThemeEngineDRTWin):
+        (WebThemeEngineDRTWin::WebThemeEngineDRTWin):
+
+2013-03-19  Krzysztof Czech  <k.czech@samsung.com>
+
+        [EFL] canvas-fallback-content.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=111998
+
+        Reviewed by Chris Fleizach.
+
+        Adds support for getting platform name.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticValues):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        (TestRunner::platformName):
+
+2013-03-19  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move WebThemeEngine implementations to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=112751
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::themeEngine):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (WebKit):
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::themeEngine):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp: Renamed from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.cpp.
+        (WebTestRunner::WebTestThemeControlWin::WebTestThemeControlWin):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeControlWin::~WebTestThemeControlWin):
+        (WebTestRunner::WebTestThemeControlWin::box):
+        (WebTestRunner::WebTestThemeControlWin::line):
+        (WebTestRunner::WebTestThemeControlWin::triangle):
+        (WebTestRunner::WebTestThemeControlWin::roundRect):
+        (WebTestRunner::WebTestThemeControlWin::oval):
+        (WebTestRunner::WebTestThemeControlWin::circle):
+        (WebTestRunner::WebTestThemeControlWin::nestedBoxes):
+        (WebTestRunner::WebTestThemeControlWin::markState):
+        (WebTestRunner::WebTestThemeControlWin::draw):
+        (WebTestRunner::WebTestThemeControlWin::drawTextField):
+        (WebTestRunner::WebTestThemeControlWin::drawProgressBar):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.h.
+        (WebTestRunner):
+        (WebTestThemeControlWin):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.h.
+        (WebTestRunner):
+        (WebTestThemeEngineMac):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.mm.
+        (+[FakeActiveWindow alwaysActiveWindow]):
+        (+[FakeActiveWindow alwaysInactiveWindow]):
+        (-[FakeActiveWindow initWithActiveControls:]):
+        (-[FakeActiveWindow _hasActiveControls]):
+        (WebTestRunner::WebTestThemeEngineMac::paintScrollbarThumb):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeEngineMac::paintHIThemeScrollbarThumb):
+        (WebTestRunner::WebTestThemeEngineMac::paintNSScrollerScrollbarThumb):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp: Added.
+        (WebTestRunner::WebTestThemeEngineWin::paintButton):
+        (WebTestRunner):
+        (WebTestRunner::WebTestThemeEngineWin::paintMenuList):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarArrow):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarThumb):
+        (WebTestRunner::WebTestThemeEngineWin::paintScrollbarTrack):
+        (WebTestRunner::WebTestThemeEngineWin::paintSpinButton):
+        (WebTestRunner::WebTestThemeEngineWin::paintTextField):
+        (WebTestRunner::WebTestThemeEngineWin::paintTrackbar):
+        (WebTestRunner::WebTestThemeEngineWin::paintProgressBar):
+        (WebTestRunner::WebTestThemeEngineWin::getSize):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h: Renamed from Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.h.
+        (WebTestRunner):
+        (WebTestThemeEngineWin):
+        (WebTestRunner::WebTestThemeEngineWin::WebTestThemeEngineWin):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestShellMac.mm:
+        (platformInit):
+        * DumpRenderTree/chromium/TestShellWin.cpp:
+        (platformInit):
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp: Removed.
+
+2013-03-19  Kenneth Rohde Christiansen  <kenneth@webkit.org> and Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [EFL][WK2] Separate WebView further from EwkView
+        https://bugs.webkit.org/show_bug.cgi?id=111591
+
+        Reviewed by Caio Marcelo de Oliveira Filho.
+
+        Updated EFL PlatformWebView to meet the new WKView API and ewk view private API.
+        PlatformWKView is pointer to Evas_Object for EFL, as this is more natural and
+        since we can afford it having EWKViewGetWKView() private API to access WKView.
+
+        * TestWebKitAPI/PlatformWebView.h:
+        * TestWebKitAPI/Tests/WebKit2/efl/WKViewClientWebProcessCallbacks.cpp:
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/efl/PlatformWebView.cpp:
+        (TestWebKitAPI::PlatformWebView::PlatformWebView):
+        (TestWebKitAPI::PlatformWebView::~PlatformWebView):
+        (TestWebKitAPI::PlatformWebView::resizeTo):
+        (TestWebKitAPI::PlatformWebView::page):
+        (TestWebKitAPI::PlatformWebView::simulateSpacebarKeyPress):
+        (TestWebKitAPI::PlatformWebView::simulateMouseMove):
+        (TestWebKitAPI::PlatformWebView::simulateRightClick):
+        * WebKitTestRunner/PlatformWebView.h:
+        * WebKitTestRunner/efl/EventSenderProxyEfl.cpp:
+        (WTR::EventSenderProxy::dispatchEvent):
+        (WTR::EventSenderProxy::keyDown):
+        (WTR::EventSenderProxy::sendTouchEvent):
+        (WTR::EventSenderProxy::setTouchModifier):
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+        (WTR::PlatformWebView::~PlatformWebView):
+        (WTR::PlatformWebView::resizeTo):
+        (WTR::PlatformWebView::page):
+        (WTR::PlatformWebView::focus):
+        (WTR::PlatformWebView::windowSnapshotImage):
+
+2013-03-19  Roger Fong  <roger_fong@apple.com>
+
+        Changes to VS2010 project files should only trigger builds on Windows bots.
+        https://bugs.webkit.org/show_bug.cgi?id=112731
+
+        Reviewed by Timothy Horton.
+
+        * BuildSlaveSupport/build.webkit.org-config/wkbuild.py:
+        (_should_file_trigger_build):
+
+2013-03-19  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. webkitpy tests fix for Windows, runtests.py run-webkit-tests arguments changed.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+        (RunTestsTest.test_webkit_run_unit_tests):
+
+2013-03-19  Julie Parent  <jparent@chromium.org>
+
+        Dashboards: Introduce history namespace and unit tests.
+        https://bugs.webkit.org/show_bug.cgi?id=112645
+
+        Reviewed by Ojan Vafai.
+        
+        Laying the framework for introducing the new history object and
+        namespace.  This moves only static functions into the history
+        namespace, and moves corresponding unit tests into seperate
+        unit test file.
+
+        * TestResultServer/static-dashboards/aggregate_results.html:
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseCrossDashboardParameters):
+        (parseDashboardSpecificParameters):
+        (parseParameters):
+        * TestResultServer/static-dashboards/flakiness_dashboard.html:
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (.switch.return):
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        * TestResultServer/static-dashboards/history.js: Added.
+        * TestResultServer/static-dashboards/history_unittests.js: Added.
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/run-embedded-unittests.html:
+        * TestResultServer/static-dashboards/run-unittests.html:
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+        * TestResultServer/static-dashboards/timeline_explorer.js:
+        * TestResultServer/static-dashboards/treemap.html:
+        * TestResultServer/static-dashboards/treemap.js:
+        (.switch.return):
+        * TestResultServer/static-dashboards/ui.js:
+
+2013-03-19  Daniel Bates  <dbates@webkit.org>
+
+        svn-apply has trouble applying a patch that adds a Windows newline to EOF
+        https://bugs.webkit.org/show_bug.cgi?id=112732
+
+        Reviewed by Eric Seidel.
+
+        Fixes an issues where a diff that adds a Windows line ending (CRLF) to the end
+        of an existing file cannot be applied.
+
+        In particular, svn-{apply, unapply} compensate for differences in line endings
+        by converting the line endings in a diff to match the line endings in the target
+        file. The diff(1) command precedes the last line of a diff that adds a newline
+        character to the end of a file with the special character sequence "\n \\ No newline at end of file\n"
+        Svn-{apply, unapply} converts the newline characters (\n) in this character sequence
+        to \r\n (CRLF) when the target file has Windows line endings and patch(1) complains
+        when applying this modified diff. Instead, svn-{apply, unapply} should not modify
+        the newline characters in this special character sequence to match the line endings
+        in the target file.
+
+        * Scripts/VCSUtils.pm:
+        (parseDiff):
+        * Scripts/webkitperl/VCSUtils_unittest/parseDiffWithMockFiles.pl:
+        Added tests:
+            - "SVN: Patch adds Windows newline to EOF and IndexPath has Windows line endings"
+            - "SVN: Patch adds Mac newline to EOF and IndexPath has Mac line endings"
+            - "Git: Patch adds Windows newline to EOF and IndexPath has Windows line endings"
+            - "Git: Patch adds Mac newline to EOF and IndexPath has Mac line endings"
+        (escapeNewLineCharacters): Added.
+        (toMacLineEndings): Added.
+
+2013-03-19  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Remove compositor settings that don't go through WebKit
+        https://bugs.webkit.org/show_bug.cgi?id=112718
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (main):
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner::WebPreferences::applyTo):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        (TestShell::resetWebSettings):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+
+2013-03-19  Dirk Pranke  <dpranke@chromium.org>
+
+        Unreviewed, rolling out r146101.
+        https://bugs.webkit.org/show_bug.cgi?id=111884
+
+        re-enable custom freetype on asan; this needs to be on
+        now that the bot is running lucid.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-19  Alberto Garcia  <agarcia@igalia.com>
+
+        [BlackBerry] Enable USE_SYSTEM_MALLOC by default
+        https://bugs.webkit.org/show_bug.cgi?id=112365
+
+        Reviewed by Benjamin Poulain.
+
+        Enable USE_SYSTEM_MALLOC by default via FeatureList.pm instead of
+        harcoding it in wtf/Platform.h
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-03-19  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Make ImageDiff similar to Chromium's ImageDiff
+        https://bugs.webkit.org/show_bug.cgi?id=94782
+
+        Based on patch by Csaba Osztrogonác.
+        Reviewed by Jocelyn Turcotte.
+
+        The diff image is generated with bright red indicating errors, but letting the base image
+        shine through so the context of the error-pixel can be identified.
+
+        * DumpRenderTree/qt/ImageDiff.cpp:
+        (main):
+
+2013-03-18  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt] Fix the build of QtTestBrowser if the print preview dialog is disabled in Qt
+
+        Rubber-stamped by Csaba Osztrogonác.
+
+        Check for QT_NO_PRINTPREVIEWDIALOG instead of QT_NO_PRINTER
+        since the latter might not cover the former.
+
+        * QtTestBrowser/launcherwindow.cpp:
+        (LauncherWindow::print):
+
+2013-03-18  Simon Fraser  <simon.fraser@apple.com>
+
+        Style tweeks to default.css.
+        
+        Rubber-stamped by David Kilzer.
+        
+        Give visited links a different color to other links, so you can
+        see which builds you've viewed.
+        
+        Make the <small> text less tiny.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/default.css:
+        (small):
+        (a:link,a:visited,a:active):
+        (a:visited):
+
+2013-03-18  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Remove the temporary hack for webkit-perf.appspot.com and cleanup the code
+        https://bugs.webkit.org/show_bug.cgi?id=112494
+
+        Reviewed by Dirk Pranke.
+
+        Removed the code to override webkit-perf.appspot.com by perf.webkit.org.
+        Also merged two pairs of methods to cleanup the code.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner.run): Merged _upload_and_show_results.
+        (PerfTestsRunner._generate_results): Merged _generate_output_files.
+
+2013-03-18  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] build xdisplaycheck when building DRT
+        https://bugs.webkit.org/show_bug.cgi?id=112636
+
+        Reviewed by Tony Chang.
+
+        It appears that we need xdisplaycheck to be built in order for
+        Xvfb to be started correctly on the bots, and DRT was missing
+        a dependency on it. This may be the cause of the ASAN bot not
+        starting up properly (it only builds DRT).
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-18  David Levin  <levin@chromium.org>
+
+        Implement icon change notification dump for Chromium's test shell.
+        https://bugs.webkit.org/show_bug.cgi?id=112614
+
+        This was previously implemented for some other platforms in r58111
+        and r116547.
+
+        In r122806, fast/dom/icon-url-property.html stopped using it, but
+        it is useful for tests, so I plan to re-add it to that test again.
+
+        Reviewed by Jochen Eisinger.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestRunner::WebTestProxy::didChangeIcon): Add handler so that
+         icon change notifications from WebKit may be logged in test output.
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner): Expose dumpIconChanges.
+        (WebTestRunner::TestRunner::reset): Clear the new dump variable.
+        (WebTestRunner::TestRunner::shouldDumpIconChanges): Expose the dump vairable.
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::dumpIconChanges): Implement the test method.
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::didChangeIcon):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didChangeIcon): Add the output about changing the icon.
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-03-18  Julie Parent  <jparent@chromium.org>
+
+        Cleanup: Move js for treemap and aggregate_results into own js files.
+        https://bugs.webkit.org/show_bug.cgi?id=112618
+
+        Reviewed by Dirk Pranke.
+        
+        No functional changes, just moving the code into separate js file
+        rather than inlined in the html, so we can test it, make it more
+        modular, etc.  Other dashboard types are already done this way.
+
+        * TestResultServer/static-dashboards/aggregate_results.html:
+        * TestResultServer/static-dashboards/aggregate_results.js: Copied from Tools/TestResultServer/static-dashboards/aggregate_results.html.
+        (generatePage):
+        (handleValidHashParameter):
+        (htmlForBuilder):
+        (rawValuesHTML):
+        (chartHTML):
+        (filteredValues):
+        (chart):
+        (htmlForRevisionRows):
+        (wrapHTMLInTable):
+        (htmlForSummaryTable):
+        (valuesPerExpectation):
+        (htmlForTestType):
+        (htmlForTableRow):
+        (extendedEncode):
+        * TestResultServer/static-dashboards/treemap.html:
+        * TestResultServer/static-dashboards/treemap.js: Copied from Tools/TestResultServer/static-dashboards/treemap.html.
+        (humanReadableTime):
+        (convertToWebTreemapFormat):
+        (reverseSortByAverage):
+        (generatePage):
+        (focusPath):
+        (.switch.return):
+        (handleQueryParameterChange):
+        (extractName):
+        (fullName):
+        (handleFocus.):
+        (handleFocus):
+
+2013-03-18  Zan Dobersek  <zdobersek@igalia.com>
+
+        [webkitpy] '/usr/bin/interdiff' output while running test-webkitpy
+        https://bugs.webkit.org/show_bug.cgi?id=112622
+
+        Reviewed by Dirk Pranke.
+
+        * Scripts/webkitpy/tool/steps/haslanded_unittest.py:
+        (HasLandedTest): Pipe the stdout and stderr output of the subprocess call to subprocess.PIPE, eliminating unnecessary output.
+
+2013-03-18  Zan Dobersek  <zdobersek@igalia.com>
+
+        [NRWT][GTK] Add gtk-wk1 directory to the list of baseline search paths when using DumpRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=112619
+
+        Reviewed by Dirk Pranke.
+
+        When using DumpRenderTree on the Gtk port, NRWT should look for baselines first in the LayoutTests/platform/gtk-wk1
+        directory and then fall back to the generic LayoutTests/platform/gtk directory.
+
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort.default_baseline_search_path): Implement the method on the GtkPort class, mapping every search path to the
+        Port._webkit_baseline_path method.
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest.test_default_baseline_search_path): Add a test for the changes that are being introduced.
+        (GtkPortTest.test_port_specific_expectations_files): Wrap a couple of long lines.
+        * Scripts/webkitpy/tool/commands/rebaseline_unittest.py:
+        (TestRebaselineTest.test_baseline_directory): Enhance one and add an additional test case for baseline directories
+        that are expected based on the builder name.
+
+2013-03-18  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] Create WebFileSystemType enum to allow easier filesystem refactoring
+        https://bugs.webkit.org/show_bug.cgi?id=112571
+
+        Reviewed by Adam Barth.
+
+        Update function declarations for new WebFileSystemType enum. (All
+        changes are behind an #ifdef so we can sync required changes in embedders.)
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::openFileSystem):
+        (WebViewHost::deleteFileSystem):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-03-18  Julie Parent  <jparent@chromium.org>
+
+        Cleanup: Move timeline_exporer js out of html file into js.
+        https://bugs.webkit.org/show_bug.cgi?id=112188
+
+        Reviewed by Dirk Pranke.
+        
+        Moves the javascript out of the html file and into a new js file.
+        This follows the format of flakiness_dashboard.{html|js}.
+        
+        Also moves code from dashboard_base that is used only by this one
+        dashboard, and makes it private to the dashboard.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+        * TestResultServer/static-dashboards/timeline_explorer.js: Copied from Tools/TestResultServer/static-dashboards/timeline_explorer.html.
+        (generatePage):
+        (initCurrentBuilderTestResults):
+        (shouldShowWebKitRevisionsOnly):
+        (updateTimelineForBuilder.):
+        (updateTimelineForBuilder):
+        (selectBuild):
+        (updateBuildIndicator):
+        (.addRow):
+        (.addNumberRow):
+        (.inspectorNode.getElementsByTagName.0.onclick):
+        (.inspectorNode.getElementsByTagName.1.onclick):
+        (.inspectorNode.getElementsByTagName.2.onclick):
+        (updateBuildInspector):
+        (showResultsDelta):
+        (decompressResults.addFlakyDelta):
+        (decompressResults):
+
+2013-03-18  Dirk Pranke  <dpranke@chromium.org>
+
+        Unreviewed, rolling out r145272.
+        http://trac.webkit.org/changeset/145272
+        https://bugs.webkit.org/show_bug.cgi?id=111884
+
+        Turns out the ASAN build is still broken; possibly there's
+        something still setting LD_LIBRARY_PATH, or possibly there's
+        something else wrong. In the meantime, we need it to work again.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-18  Ryosuke Niwa  <rniwa@webkit.org>
+
+        delete-stale-build-files is too aggressive
+        https://bugs.webkit.org/show_bug.cgi?id=112595
+
+        Reviewed by Tim Horton.
+
+        It appears that whitelisting file extensions to keep is not a good idea.
+        Blacklist files to delete instead, and only delete .o files for now.
+        We can add more file extensions as needed.
+
+        * BuildSlaveSupport/delete-stale-build-files:
+
+2013-03-18  Simon Fraser  <simon.fraser@apple.com>
+
+        Disable accessibility notifications after each test
+        https://bugs.webkit.org/show_bug.cgi?id=112579
+
+        Reviewed by Tim Horton.
+        
+        In WebKitTestRunner, if any tests triggered accessibility notifications,
+        the global notification handler would thereafter be active, and fire
+        notifications for all subsequent tests.
+        
+        Fix by implementing AccessibilityController::resetToConsistentState() for
+        Mac, and using it to clear the global notification handler.
+
+        * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm:
+        (WTR::AccessibilityController::addNotificationListener): Remove stupid comment.
+        (WTR::AccessibilityController::removeNotificationListener): Explicitly call
+        -stopObserving so that unregistering the observer doesn't rely on object lifetimes
+        (e.g. because of -autorelease).
+        (WTR::AccessibilityController::logAccessibilityEvents): Stub.
+        (WTR::AccessibilityController::resetToConsistentState): Remove the notification listener
+        if there is one.
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.h:
+        Add -stopObserving
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm:
+        (-[AccessibilityNotificationHandler dealloc]): Call -stopObserving
+        (-[AccessibilityNotificationHandler stopObserving]): Unregister from the notification
+        center.
+
+2013-03-18  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Remove WebGraphicsContext3DInProcessImpl support from DRT.
+        https://bugs.webkit.org/show_bug.cgi?id=112392
+
+        Reviewed by James Robinson.
+
+        Removes the command line flag option from DRT.
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (main):
+
+2013-03-18  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] plugins/plugin-clip-subframe.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=112570
+
+        Reviewed by Martin Robinson.
+
+        * GNUmakefile.am: Add the LogNPPSetWindow.cpp file to the build.
+
+2013-03-17  Morten Stenshorne  <mstensho@opera.com>
+
+        Add reload button (and F5 accelerator) to the GtkLauncher toolbar
+        https://bugs.webkit.org/show_bug.cgi?id=112442
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * GtkLauncher/main.c:
+        (reloadCb):
+        (createToolbar):
+        (createWindow):
+
+2013-03-15  Simon Fraser  <simon.fraser@apple.com>
+
+        REGRESSION (r144884?): WebKit2.DOMWindowExtensionBasic API test is asserting
+        https://bugs.webkit.org/show_bug.cgi?id=112205
+
+        Disable this API test until Geoff can fix it.
+
+        * TestWebKitAPI/Tests/WebKit2/DOMWindowExtensionBasic.cpp:
+        (TestWebKitAPI::TEST):
+
+2013-03-15  Jochen Eisinger  <jochen@chromium.org>
+
+        plugins/netscape-plugin-setwindow-size*.html and plugins/pass-different-npp-struct.html should be async
+        https://bugs.webkit.org/show_bug.cgi?id=112478
+
+        Reviewed by Tony Chang.
+
+        There is nothing that ensures that the log messages from the plugin
+        come in before the layout test finished loading.
+
+        * DumpRenderTree/TestNetscapePlugIn/Tests/PassDifferentNPPStruct.cpp:
+        (PassDifferentNPPStruct::NPP_SetWindow):
+        * DumpRenderTree/TestNetscapePlugIn/main.cpp:
+        (NPP_SetWindow):
+
+2013-03-15  Simon Fraser  <simon.fraser@apple.com>
+
+        Have the mac port support per_test_timeout in webkitpy
+        https://bugs.webkit.org/show_bug.cgi?id=112466
+
+        Reviewed by Dirk Pranke.
+        
+        Both WTR and DRT handle --timeout arguments, so we can
+        have the scripts pass the timeout values down to the tools.
+
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort.supports_per_test_timeout):
+
+2013-03-15  Rouslan Solomakhin  <rouslan@chromium.org>
+
+        Remove setAsynchronousSpellCheckingEnabled from test runners
+        https://bugs.webkit.org/show_bug.cgi?id=112362
+
+        Reviewed by Tony Chang.
+
+        Remove setAsynchronousSpellCheckingEnabled from test runners. The setting is now
+        in internals.settings, so all ports can share it.
+
+        * DumpRenderTree/TestRunner.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/TestRunner.h: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/efl/TestRunnerEfl.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/mac/TestRunnerMac.mm: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/qt/TestRunnerQt.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/qt/TestRunnerQt.h: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/win/TestRunnerWin.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+        * DumpRenderTree/wx/TestRunnerWx.cpp: Remove setAsynchronousSpellCheckingEnabled() method.
+
+2013-03-15  Simon Fraser  <simon.fraser@apple.com>
+
+        Fix the stupid unit tests.
+
+        * Scripts/webkitpy/layout_tests/port/mac_unittest.py:
+        (test_sample_process):
+
+2013-03-14  Simon Fraser  <simon.fraser@apple.com>
+
+        Collect samples for unresponsive web processes
+        https://bugs.webkit.org/show_bug.cgi?id=112409
+
+        Reviewed by Tim Horton.
+        
+        When we detect that a subprocess was unresponsive, run the 'sample'
+        tool on that process, for the Mac port.
+        
+        The sample will be linked to from the results.html page, next
+        to the crash log link.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._look_for_new_crash_logs): Before looking for crash logs,
+        look for samples on disk.
+        * Scripts/webkitpy/layout_tests/controllers/test_result_writer.py:
+        (TestResultWriter):
+        (TestResultWriter.copy_sample_file): Teach TestResultWriter about
+        -sample.txt files, and have it copy their contents to a new file
+        next to the test that spawned them (as we do for crash logs).
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.look_for_new_samples): Base class does nothing for sampling.
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver._check_for_driver_crash): Kick off a sample if we detected
+        that the subprocess was unresponsive.
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort.sample_file_path): Utility to generate the file path
+        to the generated sample files at the top level of layout-test-results.
+        (MacPort.look_for_new_crash_logs): Fix typo
+        (MacPort.look_for_new_samples): New function to find sample files.
+        (MacPort.sample_process): Use the utility function to get the file path.
+
+2013-03-15  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt] Remove simple getters and setters from TestRunnerQt
+        https://bugs.webkit.org/show_bug.cgi?id=112343
+
+        Reviewed by Benjamin Poulain.
+
+        The removed functions and boolean members
+        are being replaced by the implementations in the
+        generic TestRunner.h.
+
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (DumpRenderTree::dumpFrameScrollPosition):
+        (DumpRenderTree::dumpFramesAsText):
+        (DumpRenderTree::dump):
+        (DumpRenderTree::titleChanged):
+        (DumpRenderTree::dumpDatabaseQuota):
+        (DumpRenderTree::dumpApplicationCacheQuota):
+        (DumpRenderTree::statusBarMessage):
+        (DumpRenderTree::createWindow):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunnerQt::reset):
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+
+2013-03-15  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Update the link on build.webkit.org to refer to perf.webkit.org
+        https://bugs.webkit.org/show_bug.cgi?id=112416
+
+        Reviewed by Philip Rogers.
+
+        Updated the link. Also updated the template to use HTML5 DOCTYPE.
+
+        * BuildSlaveSupport/build.webkit.org-config/templates/root.html:
+
+2013-03-15  Tobias Mueller  <tobiasmue@gnome.org>
+
+        Build fix for Tools/GtkLauncher/Programs_GtkLauncher-main.o if gstreamer is not installed
+        https://bugs.webkit.org/show_bug.cgi?id=112394
+
+        Reviewed by Philippe Normand.
+
+        * GtkLauncher/main.c:
+        (main): Guard using the gstreamer function with #ifdef WTF_USE_GSTREAMER
+
+2013-03-14  Andreas Kling  <akling@apple.com>
+
+        REGRESSION(r145169): [Mac][WK2] http/tests/security/cross-frame-access-put.html fails.
+        <http://webkit.org/b/111815>
+        <rdar://problem/13380145>
+
+        Reviewed by Anders Carlsson.
+
+        Add PlatformWebView::didInitializeClients() and call it after setting up all the clients
+        after creating a PlatformWebView. Otherwise, the initial WindowAndViewFramesChanged message
+        will be sent before there's a UI client set up to adjust the frame with WTR's fake origin.
+
+        * WebKitTestRunner/PlatformWebView.h:
+        (PlatformWebView):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createOtherPage):
+        (WTR::TestController::createWebViewWithOptions):
+        * WebKitTestRunner/mac/PlatformWebViewMac.mm:
+        (WTR::PlatformWebView::didInitializeClients):
+
+2013-03-14  Jinwoo Song  <jinwoo7.song@samsung.com>
+
+        [EFL][MiniBrowser] Add a search field to the MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=112122
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Implement a search field to test API ewk_view_text_find() and add a shortcut 'ctrl' + f.
+
+        * MiniBrowser/efl/main.c:
+        (_Browser_Window):
+        (search_box_show):
+        (search_box_hide):
+        (on_key_down):
+        (on_url_changed):
+        (on_search_field_aborted):
+        (on_search_field_activated):
+        (on_search_field_clicked):
+        (on_search_backward_button_clicked):
+        (on_search_forward_button_clicked):
+        (window_create):
+
+2013-03-14  Julie Parent  <jparent@chromium.org>
+
+        Cleanup: Remove g_resourceLoader.
+        https://bugs.webkit.org/show_bug.cgi?id=112305
+
+        Reviewed by Dirk Pranke.
+        
+        Removing another global.
+        
+        Now, each dashboard creates its own loader, rather than having
+        a general global one.
+        
+        Remove usage of g_resourceLoader.isLoadingComplete from 
+        handleLocationChange by ensuring that handleLocationChange is
+        never called before the loader is done.  It was called in two
+        places before: 1 was from the callback when the loader is done,
+        so that was obviously true, and the other was from onhashchange,
+        where it would just return rather than running.  Instead, lets
+        only register the onhashchange handler once the loader is
+        setup, so the check is no longer necessary.
+        
+        Remove isLoadingComplete since it is now unused.
+        
+        Callback for loader is now initializeHistory, rather than just
+        handleLocationChange which will set up the hashchange handler now.
+        This will all eventually be moving to a new History object.
+
+        * TestResultServer/static-dashboards/aggregate_results.html:
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (handleLocationChange):
+        (intializeHistory):
+        (decompressResults):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (generatePage):
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+        * TestResultServer/static-dashboards/treemap.html:
+
+2013-03-14  Manuel Rego Casasnovas  <rego@igalia.com>
+
+        Add selectTrailingWhitespaceEnabled setting to WebCore::Page
+        https://bugs.webkit.org/show_bug.cgi?id=109404
+
+        Reviewed by Tony Chang.
+
+        Removes all the code related to smartInsertDeleteEnabled and
+        selectTrailingWhitespaceEnabled settings as they will be managed from
+        internals from now on.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/DumpRenderTree.cpp:
+        (WebKit):
+        (BlackBerry::WebKit::DumpRenderTree::resetToConsistentStateBeforeTesting):
+        * DumpRenderTree/blackberry/DumpRenderTreeBlackBerry.h:
+        (DumpRenderTree):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestRunner::WebTestProxy::didStopLoading):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::applyTo): Set default values for
+        smartInsertDeleteEnabled and selectTrailingWhitespaceEnabled settings as
+        Chromium DRT default values are different from Chromium browser.
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+        * DumpRenderTree/efl/DumpRenderTreeChrome.cpp:
+        (DumpRenderTreeChrome::resetDefaultsToConsistentValues):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues):
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (resetWebViewToConsistentStateBeforeTesting):
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::WebPage::resetSettings):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (resetWebViewToConsistentStateBeforeTesting):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+
+2013-03-14  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Disable DRT on Windows
+
+        Reviewed by Jocelyn Turcotte.
+
+        We don't run and maintain DRT on Windows, so let's not try to maintain the build of it.
+
+        * qmake/mkspecs/features/configure.prf:
+
+2013-03-14  Jinwoo Song  <jinwoo7.song@samsung.com>
+
+        [EFL][WK2] Add an API for adding and removing user style sheets from a page group
+        https://bugs.webkit.org/show_bug.cgi?id=110728
+
+        Reviewed by Gyuyoung Kim.
+
+        Use the page group to create the view object.
+
+        * MiniBrowser/efl/main.c:
+        (window_create):
+
+2013-03-14  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Improve the handling of mock geolocation, device orientation and motion clients
+
+        Reviewed by Tor Arne Vestbø.
+
+        The mock versions of these web facing features should be instantiated when
+        running in DumpRenderTree only. In order for them to work, no extra Qt modules
+        such as QtLocation are actually needed.
+
+        This patch decouples enabling device orientation/motion and geolocation from
+        the underlying Qt modules and makes them available in developer builds
+        (!production_build) and backed by mock backends when running in drt.
+
+        So if the Qt 5 modules are available, they'll be used (unless drtRun). For
+        developers the web facing features are always enabled (although requests will
+        time out) and the mock backends are enabled inside DRT, allowing for the layout
+        tests to run with less dependencies.
+
+        In addition this also enables the mock device motion client, which was
+        previously never instantiated.
+
+        * qmake/mkspecs/features/features.prf:
+
+2013-03-14  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt] Removing no-ops and simple setters/getters from TestRunnerQt
+        https://bugs.webkit.org/show_bug.cgi?id=112340
+
+        Reviewed by Simon Hausmann.
+
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (DumpRenderTree::dump):
+            Replace shouldDumpBackForwardList() with TestController:dumpBackForwardList().
+        (DumpRenderTree::dumpApplicationCacheQuota):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunnerQt::reset):
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+
+2013-03-14  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt] Port DRT to use TestRunner::dumpAsText()
+        https://bugs.webkit.org/show_bug.cgi?id=112260
+
+        Reviewed by Benjamin Poulain.
+
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::DumpRenderTree::open):
+        (WebCore::methodNameStringForFailedTest):
+            Change parameter from type TestRunnerQt* to TestRunner*.
+        (WebCore::DumpRenderTree::dump):
+            TestRunnerQt::shouldDumpPixels() always returned true in our case.
+            Instead we should rely on TestRunner::generatePixelResults().
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunnerQt::reset):
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+
+2013-03-13  Kunihiko Sakamoto  <ksakamoto@chromium.org>
+
+        Implement FontLoader interface
+        https://bugs.webkit.org/show_bug.cgi?id=98395
+
+        Reviewed by Eric Seidel.
+
+        Enable FontLoadEvents runtime flag for TestShell.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+
+2013-03-13  Julie Parent  <jparent@chromium.org>
+
+        CLeanup: remove unnecessary call to parseParameters.
+        https://bugs.webkit.org/show_bug.cgi?id=112309
+
+        Reviewed by Ojan Vafai.
+        
+        We call parseCrossDashboardParameters when the dashboard initially
+        loads to set the state required for loadBuildersList, and then we
+        call it again once we are fully done with loading, so there is no
+        reason to call it in the middle of the loading process here.
+
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+
+2013-03-13  Elliott Sprehn  <esprehn@chromium.org>
+
+        Unreviewed. Now I'm a reviewer :)
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-13  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Threaded HTML Parser is missing feature define flags in all but Chromium port's build files
+        https://bugs.webkit.org/show_bug.cgi?id=112277
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2013-03-13  Adam Barth  <abarth@webkit.org>
+
+        run-perf-tests should support content_shell
+        https://bugs.webkit.org/show_bug.cgi?id=112291
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+
+2013-03-13  Oliver Hunt  <oliver@apple.com>
+
+        Simplify Checked<> multiplication
+        https://bugs.webkit.org/show_bug.cgi?id=112286
+
+        Reviewed by James Robinson.
+
+        Add tests for multiplication by zero and max to ensure we don't
+        mess them up should we ever make changes to Checked<> in future.
+
+        * TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp:
+        (TestWebKitAPI):
+
+2013-03-13  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Unreviewed prospective Windows build fix
+
+        Do the usual thing, include the moc generated code in the .cpp file instead
+        of compiling it standalone, to ensure that config.h is included, too, and
+        NOMINMAX is defined to avoid the min/max conflict when also including qdatetime.h.
+
+        * DumpRenderTree/qt/EventSenderQt.cpp:
+
+2013-03-13  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Port TestRunner::findString to shared interface
+        https://bugs.webkit.org/show_bug.cgi?id=112147
+
+        Reviewed by Jocelyn Turcotte.
+
+        This patch also removes DumpRenderTree and some other helper classes from
+        the WebCore namespace, to which they do not really belong.
+
+        * DumpRenderTree/qt/DumpRenderTreeMain.cpp:
+        (main):
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (DumpRenderTree::DumpRenderTree):
+        (DumpRenderTree::~DumpRenderTree):
+        (DumpRenderTree::instance):
+        (DumpRenderTree::setShouldTimeout):
+        * DumpRenderTree/qt/DumpRenderTreeQt.h:
+        (DumpRenderTree):
+        * DumpRenderTree/qt/EventSenderQt.cpp:
+        (EventSender::contextClick):
+        (EventSender::sendEvent):
+        (EventSender::postEvent):
+        * DumpRenderTree/qt/EventSenderQt.h:
+        (EventSender::isGraphicsBased):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunnerQt::TestRunnerQt):
+        (TestRunner::findString):
+        (TestRunnerQt::setMockDeviceOrientation):
+        (TestRunnerQt::setGeolocationPermission):
+        (TestRunnerQt::numberOfPendingGeolocationPermissionRequests):
+        (TestRunnerQt::setMockGeolocationPositionUnavailableError):
+        (TestRunnerQt::setMockGeolocationPosition):
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+
+2013-03-13  Mikhail Naganov  <mnaganov@chromium.org>
+
+        [Chromium] Rename android_build_type to android_webview_build in .gyp files.
+        https://bugs.webkit.org/show_bug.cgi?id=112129
+
+        Reviewed by Adam Barth.
+
+        Following Chromium
+        http://src.chromium.org/viewvc/chrome?view=rev&revision=187556
+        this is being renamed to better explain what it does.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-13  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Unreviewed trivial typo fix
+
+        * DumpRenderTree/qt/DumpRenderTree.pro: It's TestRunner.h, not
+        TextRunner.h. Thanks Zeno :)
+
+2013-03-12  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Prepare DRT for transition to shared TestRunner interface
+        https://bugs.webkit.org/show_bug.cgi?id=112144
+
+        Reviewed by Benjamin Poulain.
+
+        Prepare Qt's DRT for a transition from the QObject based TestRunner to
+        the JSC C API based one.
+
+        This is impplemented by instantiating the QObject based testRunner in
+        the global object, then instantiating the JSC C based TestRunner
+        separately and placing it "behind" the QObject based testRunner through
+        injection of the individual functions through proxies. (prototype
+        chaining doesn't work due to the this object and Function.prototype.bind
+        doesn't work due to the native function)
+
+        This allows for porting over method by method by removing the method
+        from the QObject TestRunnerQt and implementing it in the JSC C based
+        TestRunner.
+
+        In order for this to link and run dummy implementations of all the
+        necessary TestRunner functions are provided.
+
+        * DumpRenderTree/qt/DumpRenderTree.pro:
+        * DumpRenderTree/qt/DumpRenderTreeMain.cpp:
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::DumpRenderTree::resetToConsistentStateBeforeTesting):
+        (WebCore::DumpRenderTree::initJSObjects):
+        * DumpRenderTree/qt/DumpRenderTreeQt.h:
+        (DumpRenderTree):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunner::~TestRunner):
+        (TestRunner::addDisallowedURL):
+        (TestRunner::queueLoad):
+        (TestRunner::removeAllVisitedLinks):
+        (TestRunner::setAcceptsEditing):
+        (TestRunner::simulateLegacyWebNotificationClick):
+        (TestRunner::setWindowIsKey):
+        (TestRunner::setAlwaysAcceptCookies):
+        (TestRunner::addOriginAccessWhitelistEntry):
+        (TestRunner::setWebViewEditable):
+        (TestRunner::clearAllApplicationCaches):
+        (TestRunner::setTextDirection):
+        (TestRunner::notifyDone):
+        (TestRunner::numberOfPendingGeolocationPermissionRequests):
+        (TestRunner::overridePreference):
+        (TestRunner::pathToLocalResource):
+        (TestRunner::removeAllWebNotificationPermissions):
+        (TestRunner::simulateWebNotificationClick):
+        (TestRunner::closeIdleLocalStorageDatabases):
+        (TestRunner::focusWebView):
+        (TestRunner::setBackingScaleFactor):
+        (TestRunner::removeChromeInputField):
+        (TestRunner::addChromeInputField):
+        (TestRunner::originsWithLocalStorage):
+        (TestRunner::deleteAllLocalStorage):
+        (TestRunner::deleteLocalStorageForOrigin):
+        (TestRunner::observeStorageTrackerNotifications):
+        (TestRunner::syncLocalStorage):
+        (TestRunner::windowCount):
+        (TestRunner::setWaitToDump):
+        (TestRunner::waitForPolicyDelegate):
+        (TestRunner::webHistoryItemCount):
+        (TestRunner::showWebInspector):
+        (TestRunner::closeWebInspector):
+        (TestRunner::evaluateInWebInspector):
+        (TestRunner::setSerializeHTTPLoads):
+        (TestRunner::apiTestNewWindowDataLoadBaseURL):
+        (TestRunner::setCustomPolicyDelegate):
+        (TestRunner::setDatabaseQuota):
+        (TestRunner::setDomainRelaxationForbiddenForURLScheme):
+        (TestRunner::resetPageVisibility):
+        (TestRunner::keepWebHistory):
+        (TestRunner::goBack):
+        (TestRunner::originsWithApplicationCache):
+        (TestRunner::applicationCacheDiskUsageForOrigin):
+        (TestRunner::display):
+        (TestRunner::dispatchPendingLoadRequests):
+        (TestRunner::clearPersistentUserStyleSheet):
+        (TestRunner::callShouldCloseOnWebView):
+        (TestRunner::copyDecodedHostName):
+        (TestRunner::clearBackForwardList):
+        (TestRunner::clearAllDatabases):
+        (TestRunner::clearApplicationCacheForOrigin):
+        (TestRunner::apiTestGoToCurrentBackForwardItem):
+        (TestRunner::authenticateSession):
+        (TestRunner::abortModal):
+        (TestRunner::setStorageDatabaseIdleInterval):
+        (TestRunner::setAsynchronousSpellCheckingEnabled):
+        (TestRunner::setXSSAuditorEnabled):
+        (TestRunner::setSpatialNavigationEnabled):
+        (TestRunner::setScrollbarPolicy):
+        (TestRunner::setJavaScriptCanAccessClipboard):
+        (TestRunner::setAutomaticLinkDetectionEnabled):
+        (TestRunner::setUserStyleSheetEnabled):
+        (TestRunner::setUserStyleSheetLocation):
+        (TestRunner::setUseDashboardCompatibilityMode):
+        (TestRunner::setTabKeyCyclesThroughElements):
+        (TestRunner::setSmartInsertDeleteEnabled):
+        (TestRunner::setSelectTrailingWhitespaceEnabled):
+        (TestRunner::setPrivateBrowsingEnabled):
+        (TestRunner::setPluginsEnabled):
+        (TestRunner::setPopupBlockingEnabled):
+        (TestRunner::setMockSpeechInputDumpRect):
+        (TestRunner::setPersistentUserStyleSheetLocation):
+        (TestRunner::setMockGeolocationPosition):
+        (TestRunner::setMockGeolocationPositionUnavailableError):
+        (TestRunner::setMockDeviceOrientation):
+        (TestRunner::setMainFrameIsFirstResponder):
+        (TestRunner::setIconDatabaseEnabled):
+        (TestRunner::setGeolocationPermission):
+        (TestRunner::setDefersLoading):
+        (TestRunner::setCacheModel):
+        (TestRunner::setAuthorAndUserStylesEnabled):
+        (TestRunner::setAllowFileAccessFromFileURLs):
+        (TestRunner::setAppCacheMaximumSize):
+        (TestRunner::setAllowUniversalAccessFromFileURLs):
+        (TestRunner::setApplicationCacheOriginQuota):
+        (TestRunner::denyWebNotificationPermission):
+        (TestRunner::grantWebNotificationPermission):
+        (TestRunner::setValueForUser):
+        (TestRunner::setViewModeMediaFeature):
+        (TestRunner::setPageVisibility):
+        (TestRunner::addMockSpeechInputResult):
+        (TestRunner::removeOriginAccessWhitelistEntry):
+        (TestRunner::addUserScript):
+        (TestRunner::isCommandEnabled):
+        (TestRunner::evaluateScriptInIsolatedWorld):
+        (TestRunner::evaluateScriptInIsolatedWorldAndReturnValue):
+        (TestRunner::copyEncodedHostName):
+        (TestRunner::addUserStyleSheet):
+        (TestRunner::findString):
+        (TestRunner::execCommand):
+        (TestRunner::localStorageDiskUsageForOrigin):
+
+2013-03-12  Julie Parent  <jparent@chromium.org>
+
+        Cleanup: Move flatten-trie to loader.
+        https://bugs.webkit.org/show_bug.cgi?id=112196
+
+        Reviewed by Dirk Pranke.
+
+        flatten-trie is used only by the loader, so move it there and make it
+        private, rather than global in dashbaord_base. Moved the corresponding
+        unit test from flakiness_dashboard_unittests to loader_unittests.
+        
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2013-03-12  Oliver Hunt  <oliver@apple.com>
+
+        Unbreak api tests
+
+        * TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp:
+        (TestWebKitAPI):
+
+2013-03-12  Tim Horton  <timothy_horton@apple.com>
+
+        Unreviewed, disabling tests for Win EWS.
+
+        win-ews obviously cannot keep up with running tests, it's >300 behind.
+        Probably doesn't help that its (likely) running tests serially.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-12  Tim Horton  <timothy_horton@apple.com>
+
+        Add a --build-directory argument to delete-stale-build-files
+        https://bugs.webkit.org/show_bug.cgi?id=112198
+
+        Reviewed by Ryosuke Niwa.
+
+        * BuildSlaveSupport/delete-stale-build-files:
+        (main): Add --build-directory argument.
+
+2013-03-12  Oliver Hunt  <oliver@apple.com>
+
+        Appease MSVC
+
+        * TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp:
+        (TestWebKitAPI):
+
+2013-03-12  Oliver Hunt  <oliver@apple.com>
+
+        Add more Checked<> tests
+        https://bugs.webkit.org/show_bug.cgi?id=112190
+
+        Reviewed by Geoffrey Garen.
+
+        Tests!
+
+        * TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp:
+        (TestWebKitAPI):
+
+2013-03-12  Julie Parent  <jparent@chromium.org>
+
+        Cleanup: Move loading complete function into callback, rather than global.
+        https://bugs.webkit.org/show_bug.cgi?id=112167
+
+        Reviewed by Dirk Pranke.
+        
+        Stop calling global functions, pass in proper handler to Loader
+        constructor. Note that the callback is optional, as tests, and
+        some potential dashboards, do not need one.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2013-03-12  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL][WK2] Add popup menu support to MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=108934
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Implement popup menu support in MiniBrowser by handling popup_menu_show
+        and popup_menu_hide smart functions on the view and using the Ewk popup
+        menu API.
+
+        * MiniBrowser/efl/main.c:
+        (_Browser_Window):
+        (on_popup_menu_discarded):
+        (on_popup_menu_item_clicked):
+        (popup_menu_populate):
+        (on_popup_menu_show):
+        (on_popup_menu_hide):
+        (window_create): Use calloc() instead of malloc() to allocate memory for
+        Browser_Window. This makes sure all the structs members are initialized
+        to 0 (such as the new elm_popup_menu pointer).
+
+2013-03-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Set up the libPlatformGtk.la library
+        https://bugs.webkit.org/show_bug.cgi?id=111738
+
+        Reviewed by Martin Robinson.
+
+        * GNUmakefile.am: Reference platformgtk_cppflags variable along with webcoregtk_cppflags variable.
+        Adjust the path to GtkVersioning.c, the file has moved under Source/Platform.
+        * TestWebKitAPI/GNUmakefile.am: Reference platformgtk_cppflags variable along with webcoregtk_cppflags variable.
+
+2013-03-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Enable Web Audio in development builds
+        https://bugs.webkit.org/show_bug.cgi?id=111831
+
+        Reviewed by Philippe Normand.
+
+        Web Audio is already quite well supported on the GTK port but still has a few issues
+        that must be addressed before it is enabled by default. Despite that it should be enabled
+        in development builds just so we are up-to-date with future feature infrastructure changes.
+        The Web Audio-related layout tests are not run yet due to missing support in DRT/WKTR, but
+        that's an obvious goal before enabling the feature in release builds.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-03-11  Andreas Kling  <akling@apple.com>
+
+        [Mac][WK1] Add support for alert() in MiniBrowser.
+        <http://webkit.org/b/112090>
+
+        Reviewed by Anders Carlsson.
+
+        * MiniBrowser/mac/WK1BrowserWindowController.m:
+        (-[WK1BrowserWindowController webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]):
+
+2013-03-11  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: Create ui.Errors
+        https://bugs.webkit.org/show_bug.cgi?id=111785
+
+        Reviewed by Ojan Vafai.
+        
+        Create ui.Errors for handling errors the dashboards
+        encounter. Loader now has a Error object that it can add to,
+        and individual dashboards can show errors when desired.
+        Currently, only flakiness_db shows errors, but this is 
+        generic and there is no reason why other dbs wouldn't want to
+        show errors.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (resourceLoadingComplete):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (generatePage):
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/ui.js:
+        (.):
+
+2013-03-08  Geoffrey Garen  <ggaren@apple.com>
+
+        Some StringHasher tests are broken because of missing null termination
+        https://bugs.webkit.org/show_bug.cgi?id=111284
+
+        Reviewed by Darin Adler.
+
+        * TestWebKitAPI/Tests/WTF/StringHasher.cpp:
+        (TestWebKitAPI): Added null termination since C strings are null-terminated.
+        (TestWebKitAPI::TEST): Removed #ifdef's that disabled this testing since
+        the bug caught by it is now fixed.
+
+2013-03-11  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r145200.
+        http://trac.webkit.org/changeset/145200
+        https://bugs.webkit.org/show_bug.cgi?id=112063
+
+        Broke a couple of unit tests (Requested by zdobersek on
+        #webkit).
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-03-11  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] WebKit2-only build fails
+        https://bugs.webkit.org/show_bug.cgi?id=112033
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * GNUmakefile.am: Split the list of files the docs-build.stamp target depends on into the
+        generic part, WebKit1-specific part and WebKit2-specific part.
+        * TestWebKitAPI/GNUmakefile.am: The TestGtk executable should not link agains libwebkitgtk
+        as it is not WebKit1-specific, but should rather link to libWebCore.la and libWebCoreGtk.la
+        directly.
+
+2013-03-11  Dima Gorbik  <dgorbik@apple.com>
+
+        Adding myself to the committers list.
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-11  Jeff Rogers  <jrogers@rim.com>
+
+        [BlackBerry] Disable MathML support
+        https://bugs.webkit.org/show_bug.cgi?id=111929
+
+        Reviewed by Rob Buis.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-03-11  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL][GTK][WKTR] Regression(r145231): Undefined symbol in libTestRunnerInjectedBundle.so
+        https://bugs.webkit.org/show_bug.cgi?id=111970
+
+        Reviewed by Chris Fleizach.
+
+        Provide dummy implementation for AccessibilityUIElement::supportedActions() in ATK
+        or libTestRunnerInjectedBundle.so cannot be loaded in EFL / GTK otherwise, due to
+        undefined symbol.
+
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::AccessibilityUIElement::supportedActions):
+        (WTR):
+
+2013-03-11  Chris Hopman  <cjhopman@chromium.org>
+
+        [chromium] Android apk targets should depend directly on Java library targets
+        https://bugs.webkit.org/show_bug.cgi?id=111746
+
+        Reviewed by Eric Seidel.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        Make DumpRenderTree_apk depend directly on base_java and net_java.
+        * TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp:
+        Make TestWebKitAPI_apk depend directly on base_java.
+
+2013-03-11  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] remove obsolete user gesture methods from WebFrame
+        https://bugs.webkit.org/show_bug.cgi?id=111696
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::handleInputEvent):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+
+2013-03-10  Silvia Pfeiffer  <silviapf@chromium.org>
+
+        Unreviewed, add myself to commiters.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-08  Julie Parent  <jparent@chromium.org>
+
+        Cleanup: Remove dead code.
+        https://bugs.webkit.org/show_bug.cgi?id=111900
+
+        Reviewed by Dirk Pranke.
+        
+        Treemap overrides a global function that used to be in 
+        dashboard_base, but was removed months ago in
+        https://bugs.webkit.org/show_bug.cgi?id=99246, so this code has
+        no caller. 
+
+        * TestResultServer/static-dashboards/treemap.html:
+
+2013-03-08  Harald Alvestrand  <hta@chromium.org>
+
+        Implemented new API for RTCStatsReport object.
+        https://bugs.webkit.org/show_bug.cgi?id=110333
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp:
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::getStats):
+
+2013-03-08  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] use custom freetype on linux asan builds again
+        https://bugs.webkit.org/show_bug.cgi?id=111884
+
+        Reviewed by Tony Chang.
+
+        We no longer need the workaround after chromium r186540.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-08  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Warning about the user not having edit rights on Bugzilla is confusing new contributors
+        https://bugs.webkit.org/show_bug.cgi?id=111798
+
+        Reviewed by Dirk Pranke.
+
+        Don't scare people by the warning. Instead, tell them to ignore it if they don't have EditBugs privileges.
+
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla.py:
+
+2013-03-08  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Remove WebLayerTreeViewClient and WebLayerTreeView::Settings
+        https://bugs.webkit.org/show_bug.cgi?id=111632
+
+        Reviewed by Adrienne Walker.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::initializeLayerTreeView):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-03-08  Benjamin Poulain  <benjamin@webkit.org>
+
+        [Mac] Add a feature flag for 'view-mode' Media Feature, disable it on Mac
+        https://bugs.webkit.org/show_bug.cgi?id=111297
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setViewModeMediaFeature):
+
+2013-03-08  Chris Fleizach  <cfleizach@apple.com>
+
+        [Mac] [WK2] platform/mac/accessibility/press-action-is-first.html fails
+        https://bugs.webkit.org/show_bug.cgi?id=111814
+
+        Reviewed by Ryosuke Niwa.
+
+        Add the needed supportedActions() attribute to WKTestRunner.
+
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
+        (WTR::AccessibilityUIElement::supportedActions):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
+        (WTR::AccessibilityUIElement::supportedActions):
+
+2013-03-08  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [EFL] Memory leak at WKViewClientWebProcessCallbacks API test
+        https://bugs.webkit.org/show_bug.cgi?id=111851
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * TestWebKitAPI/Tests/WebKit2/efl/WKViewClientWebProcessCallbacks.cpp:
+        (TestWebKitAPI::TEST):
+
+            Fixed WKURLRef instance leaking.
+
+2013-03-08  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL] [WK2] Some authentication tests fail in WebKit2
+        https://bugs.webkit.org/show_bug.cgi?id=106407
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add patch from upstream for libsoup 2.40 to fix several authentication
+        test cases.
+
+        * efl/jhbuild.modules:
+        * efl/patches/libsoup-2.40-auth-fix.patch: Added.
+
+2013-03-08  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Enable Web Audio in development builds
+        https://bugs.webkit.org/show_bug.cgi?id=111831
+
+        Reviewed by Philippe Normand.
+
+        Web Audio is already quite well supported on the GTK port but still has a few issues
+        that must be addressed before it is enabled by default. Despite that it should be enabled
+        in development builds just so we are up-to-date with future feature infrastructure changes.
+        The Web Audio-related layout tests are not run yet due to missing support in DRT/WKTR, but
+        that's an obvious goal before enabling the feature in release builds.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-03-07  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] delay clearing the TestRunners until the main view was deleted
+        https://bugs.webkit.org/show_bug.cgi?id=111823
+
+        Reviewed by Eric Seidel.
+
+        During WebViewHost::shutdown, we navigate the WebView to about:blank.
+        This may call into the test runners which assume that the delegate is
+        always non-NULL.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::~TestShell):
+
+2013-03-07  Alan Cutter  <alancutter@chromium.org>
+
+        Sheriffbot whois command can't search by full name
+        https://bugs.webkit.org/show_bug.cgi?id=111825
+
+        Reviewed by Eric Seidel.
+
+        Allowed multiple arguments to Sheriffbot's whois command.
+        Updated test expectations.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+        (Whois.execute):
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py:
+        (IRCCommandTest.test_whois):
+
+2013-03-07  Nils Barth  <nbarth@chromium.org>
+
+        Add Nils Barth and Koji Hara to committers.py
+        https://bugs.webkit.org/show_bug.cgi?id=111806
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-07  Glenn Adams  <glenn@skynav.com>
+
+        run-pert-tests should have a --test-runner-count option
+        https://bugs.webkit.org/show_bug.cgi?id=111726
+
+        Reviewed by Ryosuke Niwa.
+
+        Add --test-runner-count option to run-perf-tests, with default value of 4.
+        This option allows command line configuration of the number of times to invoke
+        the test runner (serially, not in parallel) when running a specific test in
+        a test set.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest): Add DEFAULT_TEST_RUNNER_COUNT constant.
+        (PerfTest.__init__): Rename process_run_count to test_runner_count (throughout).
+        (PerfTest.run): Rename process_run_count to test_runner_count.
+        (SingleProcessPerfTest.__init__): Add test_runner_count optional argument.
+        (ChromiumStylePerfTest.__init__): Add test_runner_count optional argument.
+        (ReplayPerfTest.__init__): Add test_runner_count optional argument.
+        (PerfTestFactory.create_perf_test): Add test_runner_count optional argument.
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args): Add '--test-runner-count' option.
+        (PerfTestsRunner._collect_tests): Use test_runner_count when creating PerfTest.
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (MainTest._test_run_with_json_output): Add optional compare_logs argument.
+        (MainTest.test_run_with_repeat):
+        (MainTest.test_run_with_test_runner_count): Add new test for test-runner-count option semantics.
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (MainTest.test_default_args): Add test for default option argument values.
+        (MainTest.test_parse_args): Add test for test-runner-count option parsing.
+
+2013-03-07  Christian Biesinger  <cbiesinger@chromium.org>
+
+        Add myself to reviewers.py
+        https://bugs.webkit.org/show_bug.cgi?id=111757
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-03-07  Glenn Adams  <glenn@skynav.com>
+
+        run-perf-tests should have a --repeat option
+        https://bugs.webkit.org/show_bug.cgi?id=100030
+
+        Reviewed by Ryosuke Niwa.
+
+        Add --repeat option to run-perf-tests, with default value of 1. When greater
+        than 1, runs test set specified number of times. Note that multiple runs are
+        not aggregated for statistical purposes.
+
+        Incidentally fixed typo: s/suceeds/succeeds/.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args): Add repeat option.
+        (PerfTestsRunner.run): Add outer repeat loop.
+        (PerfTestsRunner._generate_results): Split from original _generate_and_show_results.
+        (PerfTestsRunner._upload_and_show_results): Split from original _generate_and_show_results.
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (MainTest._test_run_with_json_output): Add repeat optional argument for generating expected logs. Fix typo.
+        (MainTest._test_run_with_json_output.mock_upload_json): Fix typo.
+        (MainTest.test_run_with_json_output): Fix typo.
+        (MainTest.test_run_with_description): Fix typo.
+        (MainTest.test_run_respects_no_results): Fix typo.
+        (MainTest.test_run_with_slave_config_json): Fix typo.
+        (MainTest.test_run_with_multiple_repositories): Fix typo.
+        (MainTest.test_run_with_upload_json): Fix typo.
+        (MainTest.test_run_with_upload_json_should_generate_perf_webkit_json): Fix typo.
+        (MainTest.test_run_with_repeat): Added new test for repeat count semantics.
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (MainTest.test_parse_args): Add test for repeat option parsing.
+
+2013-03-07  Julie Parent  <jparent@chromium.org>
+
+        showAllRuns checkbox no longer works on the stats dashboard
+        https://bugs.webkit.org/show_bug.cgi?id=111673
+
+        Reviewed by Ojan Vafai.
+
+        Stats dashboard does not have any DB_SPECIFIC_INVALIDATING_PARAMETERS,
+        so we were trying to index into an undefined object.
+        
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (invalidateQueryParameters):
+
+2013-03-07  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] Update #include for WebStorageNamespace.h
+        https://bugs.webkit.org/show_bug.cgi?id=111748
+
+        Reviewed by Adam Barth.
+
+        In anticipation of removing
+        WK/chromium/public/WebStorageNamespace.h (once downstream
+        references have been updated)
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+
+2013-03-07  Dirk Pranke  <dpranke@chromium.org>
+
+        run-perf-tests fails due to svn_revision not working on a pure git clone
+        https://bugs.webkit.org/show_bug.cgi?id=110839
+
+        Reviewed by Ryosuke Niwa.
+
+        Previously we would call git svn find-rev to look up the commit for
+        a given revision, and that'll hang in a pure git checkout.
+
+        This patch changes the way we look up svn revisions in a git
+        repository to use git log --grep 'git-svn-id', which is much faster
+        than grepping ourselves. It also renames timestamp_of_latest_commit()
+        to timestamp_of_revision() in order to accurately reflect what
+        the method is doing. Note that this patch only changes the logic
+        inside latest_revision() and svn_revision(). I'll file a separate
+        bug to change git_commit_from_svn_revision().
+
+        This patch also contains some fixes to unit tests that had bit-rotted
+        or were otherwise fragile, so that test-webkitpy --all would pass
+        cleanly, and a fix to outputcapture so that
+        test-webkitpy -p would work correctly again.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.svn_revision):
+        (Git.timestamp_of_revision):
+        * Scripts/webkitpy/common/checkout/scm/scm.py:
+        (SCM.svn_revision):
+        (SCM.timestamp_of_revision):
+        * Scripts/webkitpy/common/checkout/scm/scm_mock.py:
+        (MockSCM.timestamp_of_revision):
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        (_shared_test_commit_with_message):
+        (test_commit_without_authorization):
+        (test_timestamp_of_revision):
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVN.timestamp_of_revision):
+        * Scripts/webkitpy/common/system/outputcapture.py:
+          Importing unittest2 directly may not be safe if this module is
+          imported before the autoinstaller gets a chance to set things up
+          properly. We don't actually need unittest2 here.
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._generate_results_dict):
+
+2013-03-07  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL] Bump libsoup dependency to 2.40.3 to fix regressions
+        https://bugs.webkit.org/show_bug.cgi?id=111756
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Bump libsoup to v2.40.3 to fix the regressions introduced by
+        previous v2.40.0 bump.
+
+        * efl/jhbuild.modules:
+
+2013-03-07  Roger Fong  <roger_fong@apple.com>
+
+        Re-enable Win EWS tests.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-07  Dirk Pranke  <dpranke@chromium.org>
+
+        [nrwt] handle corrupt http server pid files cleanly
+        https://bugs.webkit.org/show_bug.cgi?id=111628
+
+        Reviewed by Eric Seidel.
+
+        If the pid file from a previous http server is corrupt for some
+        reason, NRWT will just raise errors and not clean it up or recover.
+        This patch fixes that to at least delete the pid file and
+        not throw; not that we may still have stale http servers left on
+        the system, since there's no way to know which pid to kill if
+        the file was corrupted.
+
+        * Scripts/webkitpy/layout_tests/servers/http_server_base.py:
+        (HttpServerBase.start):
+        (HttpServerBase.stop):
+        (HttpServerBase._remove_pid_file):
+        * Scripts/webkitpy/layout_tests/servers/http_server_base_unittest.py: Added.
+        (TestHttpServerBase):
+        (TestHttpServerBase.test_corrupt_pid_file):
+
+2013-03-07  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Can't activate links with VoiceOver in Safari
+        https://bugs.webkit.org/show_bug.cgi?id=111755
+
+        Reviewed by Tim Horton.
+
+        * DumpRenderTree/AccessibilityUIElement.cpp:
+        (supportedActionsCallback):
+        (AccessibilityUIElement::getJSClass):
+        * DumpRenderTree/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * DumpRenderTree/mac/AccessibilityUIElementMac.mm:
+        (AccessibilityUIElement::supportedActions):
+
+2013-03-07  Roger Fong  <roger_fong@apple.com>
+
+        Windows debug layout tests are crashing like crazy again.
+        Disable tests on Win EWS bots temporarily.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-07  Roger Fong  <roger_fong@apple.com>
+
+        Make EWS bots build and test in release.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+
+2013-03-07  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] don't track the top loading frame if no layout test is currently running
+        https://bugs.webkit.org/show_bug.cgi?id=111716
+
+        Reviewed by Kentaro Hara.
+
+        In DRT, we synchronously stop the test and start loading the next test
+        URL. However, in content_shell, this happens asynchronously. It's
+        important that the top loading frame is not changed due to stray
+        navigation events before the next test starts.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::setTopLoadingFrame):
+
+2013-03-06  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: Move all dashboard ui related code into ui.js.
+        https://bugs.webkit.org/show_bug.cgi?id=111621
+
+        Reviewed by Ojan Vafai.
+        
+        Creates ui.js, a package for the common UI code the various
+        dashboards use. HTML generation is now in the ui.html namespace
+        and popup handling is in ui.popup.
+        Also moves the event listening for popups to ui.popup.show and
+        removes it on ui.popup.hid rather than having listener always
+        around.
+
+        * TestResultServer/static-dashboards/aggregate_results.html:
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        * TestResultServer/static-dashboards/flakiness_dashboard.html:
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (showPopupForBuild):
+        (htmlForNavBar):
+        (generatePageForIndividualTests.if):
+        (generatePageForIndividualTests):
+        * TestResultServer/static-dashboards/flakiness_dashboard_embedded_unittests.js:
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        * TestResultServer/static-dashboards/run-embedded-unittests.html:
+        * TestResultServer/static-dashboards/run-unittests.html:
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+        * TestResultServer/static-dashboards/treemap.html:
+        * TestResultServer/static-dashboards/ui.js: Added.
+        (.):
+
+2013-03-06  Krzysztof Czech  <k.czech@samsung.com>
+
+        [EFL] Missing implementation of AccessibilityControllerEfl and AccessibilityUIElementEfl files
+        https://bugs.webkit.org/show_bug.cgi?id=110584
+
+        Reviewed by Gyuyoung Kim.
+
+        Adds missing implementation of AccessibilityControllerEfl
+        and AccessibilityUIElementEfl files. Modify DumpRenderTreeChrome
+        so that it can make accessibilityController as a js object.
+
+        * DumpRenderTree/AccessibilityController.h:
+        (AccessibilityController):
+        * DumpRenderTree/AccessibilityUIElement.h:
+        * DumpRenderTree/atk/AccessibilityControllerAtk.cpp:
+        (AccessibilityController::childElementById): Moved declaration to base class.
+        Implementation can be shared among other ports.
+        * DumpRenderTree/efl/AccessibilityControllerEfl.cpp: Copied from Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp.
+        (AccessibilityController::focusedElement):
+        (AccessibilityController::rootElement):
+        (AccessibilityController::accessibleElementById):
+        * DumpRenderTree/efl/AccessibilityUIElementEfl.cpp: Copied from Tools/DumpRenderTree/atk/AccessibilityControllerAtk.cpp.
+        (AccessibilityUIElement::helpText):
+        * DumpRenderTree/efl/CMakeLists.txt:
+        * DumpRenderTree/efl/DumpRenderTreeChrome.cpp:
+        (DumpRenderTreeChrome::DumpRenderTreeChrome):
+        (DumpRenderTreeChrome::resetDefaultsToConsistentValues):
+        (DumpRenderTreeChrome::onWindowObjectCleared):
+        (DumpRenderTreeChrome::accessibilityController):
+        * DumpRenderTree/efl/DumpRenderTreeChrome.h:
+        (DumpRenderTreeChrome):
+        * DumpRenderTree/gtk/AccessibilityControllerGtk.cpp:
+
+2013-03-06  Benjamin Poulain  <benjamin@webkit.org>
+
+        WebKitTestRunner needs layoutTestController.elementDoesAutoCompleteForElementWithId
+        https://bugs.webkit.org/show_bug.cgi?id=42696
+
+        Reviewed by Andreas Kling.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+
+2013-03-06  Roger Fong  <roger_fong@apple.com>
+
+        Re-enable WinEWS test and decrease iterations before clean build back to 10.
+
+        * EWSTools/start-queue-win.sh:
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-06  Manuel Rego Casasnovas  <rego@igalia.com>
+
+        [WK2][GTK] Fix unit test WebKit2APITests/WebKitWebView/mouse-target
+        https://bugs.webkit.org/show_bug.cgi?id=82866
+
+        Reviewed by Martin Robinson.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner): Unflag WebKit2APITests/WebKitWebView/mouse-target test as
+        it is passing now.
+
+2013-03-06  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: remove dashboard time logging.
+        https://bugs.webkit.org/show_bug.cgi?id=111608
+
+        Reviewed by Dirk Pranke.
+
+        Remove logTime.  It was never accurate, and the dev tools
+        have better ways to measure this if anyone cares to look
+        into dashboard perf.
+        
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (processTestRunsForBuilder):
+        (appendHTML):
+
+2013-03-06  Tony Chang  <tony@chromium.org>
+
+        [chromium] making DumpRenderTree_resources a separate bundle breaks xcode
+        https://bugs.webkit.org/show_bug.cgi?id=111509
+
+        Reviewed by Dirk Pranke.
+
+        Add DumpRenderTree.pak to DumpRenderTree.app again.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-06  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] introduce WebUserGestureIndicator
+        https://bugs.webkit.org/show_bug.cgi?id=111531
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createView):
+
+2013-03-06  Alan Cutter  <alancutter@chromium.org>
+
+        sheriffbot roll-chromium-deps shouldn't create a bug with None as the new revision.
+        https://bugs.webkit.org/show_bug.cgi?id=73482
+
+        Reviewed by Ryosuke Niwa.
+
+        Added input checking to the UpdateChromiumDEPS step.
+        Removed the default use of LKGR when the revision input is invalid. "LKGR" must be explicitly given instead.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py: Updated input validation and error message handling.
+        (RollChromiumDEPS):
+        (RollChromiumDEPS._parse_args):
+        (RollChromiumDEPS.execute):
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py: Updated unit tests.
+        (IRCCommandTest.test_roll_chromium_deps):
+        * Scripts/webkitpy/tool/bot/ircbot_unittest.py: Updated unit tests.
+        (IRCBotTest.test_roll_chromium_deps_to_lkgr):
+        * Scripts/webkitpy/tool/commands/roll_unittest.py: Updated unit tests.
+        * Scripts/webkitpy/tool/steps/updatechromiumdeps.py: Added input validation and added new error handling cases. Changed the logic of deciding to use LKGR to be only when the input is "LKGR".
+        (UpdateChromiumDEPS._fetch_last_known_good_revision):
+        (UpdateChromiumDEPS):
+        (UpdateChromiumDEPS._parse_revision_number):
+        (UpdateChromiumDEPS._validate_revisions):
+        (UpdateChromiumDEPS.run):
+        * Scripts/webkitpy/tool/steps/updatechromiumdeps_unittest.py: Added unit tests.
+        (UpdateChromiumDEPSTest):
+        (UpdateChromiumDEPSTest.test_parse_revision_number):
+        * Scripts/webkitpy/tool/commands/roll.py: Updated help text.
+        (RollChromiumDEPS):
+        (PostChromiumDEPSRoll):
+
+2013-03-06  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt][MiniBrowser] Touch mocking broken for chained getures
+        https://bugs.webkit.org/show_bug.cgi?id=111430
+
+        Reviewed by Jocelyn Turcotte.
+
+        Make it possible again to use touch mocking to test gesture chains
+        like pan->pinch->pan->pinch without lifting the primary "finger".
+        For this to work we need to track the pressed mouse buttons and
+        only synthesize touch release events when the ctrl key is released
+        if no mouse button is pressed. Else the pressed mouse button(s)
+        should result in a stationary touch point in a touch update event.
+        Since it has been fixed in Qt 5.0.1 use QGuiApplication::keyboardModifiers()
+        to check for the state of the ctrl key modifier instead of getting
+        it from the mouse events.
+
+        * MiniBrowser/qt/MiniBrowserApplication.cpp:
+        (MiniBrowserApplication::MiniBrowserApplication):
+        (MiniBrowserApplication::notify):
+
+2013-03-05  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] don't use custom freetype on linux asan for now
+        https://bugs.webkit.org/show_bug.cgi?id=111516
+
+        Unreviewed, build fix.
+
+        Turns out the custom lib is getting picked up by other binaries
+        on our bot, which is bad.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-05  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] making DumpRenderTree_resources a separate bundle breaks xcode
+        https://bugs.webkit.org/show_bug.cgi?id=111509
+
+        Unreviewed, build fix.
+
+        Actually comment out the flag :(.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-05  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] making DumpRenderTree_resources a separate bundle breaks xcode
+        https://bugs.webkit.org/show_bug.cgi?id=111509
+
+        Unreviewed, build fix.
+
+        r144863 appears to have broken the xcode build; I'm temporarily
+        trying this instead, and if this doesn't work, I'll revert the
+        other changes.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-05  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] build a DumpRenderTree.pak even on windows
+        https://bugs.webkit.org/show_bug.cgi?id=111504
+
+        Reviewed by Tony Chang.
+
+        The Chromium Aura build uses the default theme to draw
+        controls, and that theme requires the ui ResourceBundle
+        to be initialized. On every other platform, we build
+        a DumpRenderTree.pak that works for this, but on Windows we
+        still compile the resources directly into DRT. As a first step,
+        let's build the pak file. I will then need to land a patch
+        in Chromium to actually load it. Then I can go back and move
+        the resources over to just use the .pak file and no longer need
+        the .rc's.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-03-05  Julie Parent  <jparent@chromium.org>
+        Dashboard cleanup: move string utilities into their own namespace.
+        
+        https://bugs.webkit.org/show_bug.cgi?id=111485
+
+        Reviewed by Ojan Vafai.
+        
+        One of many pieces to clean up dashboard_base.
+        
+        Moves string utility functions into separate file (string.js) and into their own namespace rather than cluttering up the global scope.
+
+        * TestResultServer/static-dashboards/aggregate_results.html:
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (isTreeMap):
+        (isFlakinessDashboard):
+        * TestResultServer/static-dashboards/flakiness_dashboard.html:
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (determineWKPlatform):
+        (chromiumPlatform):
+        (platformAndBuildType):
+        (substringList):
+        (individualTestsForSubstringList):
+        (filterBugs):
+        (populateExpectationsData):
+        (processMissingTestsWithExpectations):
+        (processMissingAndExtraExpectations):
+        (htmlForSingleTestRow):
+        (.dummyNode.onload):
+        (expectationsTitle):
+        * TestResultServer/static-dashboards/run-embedded-unittests.html:
+        * TestResultServer/static-dashboards/run-unittests.html:
+        * TestResultServer/static-dashboards/string.js: Added.
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+        * TestResultServer/static-dashboards/treemap.html:
+
+2013-03-05  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL] Build break with latest EFL libraries
+        https://bugs.webkit.org/show_bug.cgi?id=111028
+
+        Reviewed by Dirk Pranke.
+
+        * MiniBrowser/efl/CMakeLists.txt: Added ECORE_XXX_INCLUDE_DIRS.
+        * TestWebKitAPI/PlatformEfl.cmake: Ditto.
+        * WebKitTestRunner/PlatformEfl.cmake: Ditto.
+
+2013-03-05  Roger Fong  <roger_fong@apple.com>
+
+        Increase number of WinEWS iterations to 20.
+        Don't reboot after each iteration set.
+        Make EWS bots just build temporarily so that the queue catches up again.
+
+        * EWSTools/start-queue-win.sh:
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-03-04  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Move check for threaded compositing from WebCompositorSupport to Platform
+        https://bugs.webkit.org/show_bug.cgi?id=111386
+
+        Reviewed by Adrienne Walker.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+
+2013-03-05  Min Qin  <qinmin@chromium.org>
+
+        Copy dictionary to the external storage before running layout test on android
+        https://bugs.webkit.org/show_bug.cgi?id=111480
+
+        Reviewed by Adam Barth.
+
+        TestWebKitPlatformSupport now needs to read an external dictionary file.
+        This file does not exist on the device. We need to copy it before running layout tests.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidDriver._setup_md5sum_and_push_data_if_needed):
+        (ChromiumAndroidDriver._push_platform_resources):
+
+2013-03-05  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] DRT crashes in an Aura/Win build
+        https://bugs.webkit.org/show_bug.cgi?id=111394
+
+        Reviewed by Tony Chang.
+
+        When building (and running) with use_aura=1, we assume that
+        we're using the default theme engine, but DRT creates the
+        DRTWin theme engine and overwrites the default, leading to crashes
+        in basically every test from the mismatch.
+
+        This fix gets us down to at least "lots of crashes" :).
+
+        * DumpRenderTree/chromium/TestShellWin.cpp:
+        (platformInit):
+
+2013-03-05  Eric Seidel  <eric@webkit.org>
+
+        Add html-parser-threaded perf test now that the threaded parser is enabled by default
+        https://bugs.webkit.org/show_bug.cgi?id=111200
+
+        Reviewed by Ryosuke Niwa.
+
+        Had to teach run-perf-tests to ignore one more warning.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest):
+
+2013-03-05  Jochen Eisinger  <jochen@chromium.org>
+
+        Update list of builders for test results server
+        https://bugs.webkit.org/show_bug.cgi?id=111166
+
+        Reviewed by Ojan Vafai.
+
+        * TestResultServer/static-dashboards/builders.jsonp:
+
+2013-03-05  Martin Robinson  <mrobinson@igalia.com> and Tomas Popela  <tpopela@redhat.com>
+
+        [GTK] Move basic dependency installation to a script
+        https://bugs.webkit.org/show_bug.cgi?id=110692
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * gtk/install-dependencies: Added. A Script which installs all dependencies
+        necessary for building for Debian-based distributions and Fedora.
+
+2013-03-05  James Robinson  <jamesr@chromium.org>
+
+        Chromium DumpRenderTree dumps a core every time it's run (Linux/Debug)
+        https://bugs.webkit.org/show_bug.cgi?id=111440
+
+        Reviewed by Adrienne Walker.
+
+        Remove unnecessary WebCompositorSupport::shutdown call
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (main):
+
+2013-03-05  Gustavo Noronha Silva  <gns@gnome.org>
+
+        Unreviewed build fix.
+
+        * GNUmakefile.am: add generate-feature-defines-files scripts to EXTRA_DIST.
+
+2013-03-05  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt][MiniBrowser] Improve the update of touch indicators
+        https://bugs.webkit.org/show_bug.cgi?id=111429
+
+        Reviewed by Jocelyn Turcotte.
+
+        MiniBrowserApplication::sendTouchEvent sends an empty list
+        to BrowserWindow::updateVisualMockTouchPoints if the control
+        button is released, in which case the touch indicators should
+        be hidden so that we never end up with a leftover indicator
+        sticking on the screen.
+        This patch also simplifies the lookup of the indicator items by
+        replacing the findChild search in the item tree with a QHash
+        that stores the touch ID's and the pointers to the corresponding
+        indicator items.
+
+        * MiniBrowser/qt/BrowserWindow.cpp:
+        (BrowserWindow::updateVisualMockTouchPoints):
+        * MiniBrowser/qt/BrowserWindow.h:
+        (BrowserWindow):
+
+2013-03-05  Tim Horton  <timothy_horton@apple.com>, Grzegorz Czajkowski  <g.czajkowski@samsung.com>
+
+        [WK2] WTR needs an implementation of setAsynchronousSpellCheckingEnabled
+        https://bugs.webkit.org/show_bug.cgi?id=81042
+
+        Reviewed by Enrica Casucci.
+
+        Add setAsynchronousSpellCheckingEnabled implementation for
+        WebKitTestRunner to have the possibility to test asynchronous
+        spell checking implementation from bug 109577.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setAsynchronousSpellCheckingEnabled):
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::resetStateToConsistentValues):
+
+2013-03-05  Tommy Widenflycht  <tommyw@google.com>
+
+        MediaStream API: Add the getStreamById method on RTCPeerConnection
+        https://bugs.webkit.org/show_bug.cgi?id=111311
+
+        Reviewed by Adam Barth.
+
+        Changing mocks to be more realistic.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp:
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::addStream):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::removeStream):
+        * DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.cpp:
+        (WebTestRunner::WebUserMediaClientMock::requestUserMedia):
+
+2013-03-05  Jochen Eisinger  <jochen@chromium.org>
+
+        Add content shell bots to garden-o-matic for general failurse
+        https://bugs.webkit.org/show_bug.cgi?id=111168
+
+        Reviewed by Adam Barth.
+
+        All but the WebKit (Content Shell) Android bot is stable enough. While
+        they're not green yet, there must not be any non-layout test failures on
+        them.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/config.js:
+        (.):
+
+2013-03-04  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] remove deprecated WebTestRunner::setFocus API
+        https://bugs.webkit.org/show_bug.cgi?id=111354
+
+        Reviewed by James Robinson.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestDelegate):
+
+2013-03-04  Jochen Eisinger  <jochen@chromium.org>
+
+        Run the bindings generation tests on EWS and CQ bots
+        https://bugs.webkit.org/show_bug.cgi?id=111358
+
+        Reviewed by Adam Barth.
+
+        The tests are super fast and not flaky.
+
+        * Scripts/webkitpy/common/config/ports.py:
+        (DeprecatedPort.run_bindings_tests_command):
+        * Scripts/webkitpy/common/config/ports_mock.py:
+        (MockPort.run_webkit_tests_command):
+        (MockPort):
+        (MockPort.run_bindings_tests_command):
+        * Scripts/webkitpy/tool/commands/download_unittest.py:
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+        (RunTestsTest.test_webkit_run_unit_tests):
+        * Scripts/webkitpy/tool/steps/steps_unittest.py:
+
+2013-03-04  Eric Seidel  <eric@webkit.org>
+
+        run-webkit-tests should support --profile and --profiler= just like run-perf-tests does
+        https://bugs.webkit.org/show_bug.cgi?id=111384
+
+        Reviewed by Ryosuke Niwa.
+
+        Sometimes I want to know why various LayoutTests are slow
+        without having to convert them into PerformanceTests in order
+        to use our fancy profiling.  The Driver already knows how to
+        do the right thing, we just need to expose the options to the user.
+
+        Handling of these options is already unittested in the perftests_unittest.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (parse_args):
+
+2013-03-04  Alan Cutter  <alancutter@chromium.org>
+
+        check-webkit-style says "Have to enable auto props in the subversion config file"
+        https://bugs.webkit.org/show_bug.cgi?id=107724
+
+        Reviewed by Tony Chang.
+
+        Added a standard svn config file for WebKit developers to use.
+        Updated the style and commit queue bot build scripts to load this file.
+
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh:
+        * EWSTools/configure-svn-config.sh: Copied from Tools/EWSTools/GoogleComputeEngine/build-commit-queue.sh.
+        * svn-config: Added.
+
+2013-03-04  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Switch to new webkit_support::CreateLayerTreeView interface
+        https://bugs.webkit.org/show_bug.cgi?id=111285
+
+        Reviewed by Adrienne Walker.
+
+        This removes the need for WebCompositorSupport::initialize and exposes
+        slightly fewer entry points across the repository boundary.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::webCompositorThread):
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::initializeLayerTreeView):
+
+2013-03-04  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Get rid of some AppleWin VS2010 build warnings.
+
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginCommon.props:
+
+2013-03-04  David Kilzer  <ddkilzer@apple.com>
+
+        BUILD FIX (r144657): Fix DumpRenderTree build failure on iOS
+
+            Tools/DumpRenderTree/ios/AccessibilityControllerIOS.mm:95:29: error: class method '+stringWithJSStringRef:' not found (return type defaults to 'id') [-Werror,-Wobjc-method-access]
+                NSString *idAttribute = [NSString stringWithJSStringRef:idAttributeRef];
+                                        ^         ~~~~~~~~~~~~~~~~~~~~~
+            1 error generated.
+
+        * DumpRenderTree/ios/AccessibilityControllerIOS.mm: Import
+        AccessibilityCommonMac.h.
+
+2013-03-04  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [WK2][EFL] Add callbacks to the WKViewClient to handle Web Process crash and relaunch
+        https://bugs.webkit.org/show_bug.cgi?id=109828
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Added API test for newly added Web Process crash and Web Process relaunch WKViewClient
+        callbacks.
+
+        * TestWebKitAPI/CMakeLists.txt:
+
+            Tests located in 'TestWebKitAPI/Tests/WebKit2' subdirectories are also
+            considered.
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+        * TestWebKitAPI/Tests/WebKit2/efl/WKViewClientWebProcessCallbacks.cpp: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::didFinishLoadForFrame):
+        (TestWebKitAPI::setPageLoaderClient):
+        (TestWebKitAPI::webProcessCrashed):
+        (TestWebKitAPI::webProcessDidRelaunch):
+        (TestWebKitAPI::setViewClient):
+        (TestWebKitAPI::TEST):
+
+2013-03-04  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Upstream iOS Accessibility DumpRenderTree changes
+        https://bugs.webkit.org/show_bug.cgi?id=111220
+
+        Reviewed by David Kilzer.
+
+        Upstream the iOS changes for accessibility in DumpRenderTree.
+
+        * DumpRenderTree/AccessibilityUIElement.cpp:
+        (headerElementAtIndexCallback):
+        (linkedElementCallback):
+        (elementsForRangeCallback):
+        (increaseTextSelectionCallback):
+        (decreaseTextSelectionCallback):
+        (assistiveTechnologySimulatedFocusCallback):
+        (stringForSelectionCallback):
+        (getIPhoneLabelCallback):
+        (getIPhoneHintCallback):
+        (getIPhoneValueCallback):
+        (getIPhoneIdentifierCallback):
+        (getIPhoneTraitsCallback):
+        (getIPhoneIsElementCallback):
+        (getIPhoneElementTextPositionCallback):
+        (getIPhoneElementTextLengthCallback):
+        (AccessibilityUIElement::getJSClass):
+        * DumpRenderTree/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj:
+        * DumpRenderTree/ios: Added.
+        * DumpRenderTree/ios/AccessibilityControllerIOS.mm: Added.
+        (AccessibilityController::AccessibilityController):
+        (AccessibilityController::~AccessibilityController):
+        (AccessibilityController::elementAtPoint):
+        (AccessibilityController::focusedElement):
+        (AccessibilityController::rootElement):
+        (findAccessibleObjectById):
+        (AccessibilityController::accessibleElementById):
+        (AccessibilityController::setLogFocusEvents):
+        (AccessibilityController::setLogScrollingStartEvents):
+        (AccessibilityController::setLogValueChangeEvents):
+        (AccessibilityController::setLogAccessibilityEvents):
+        (AccessibilityController::addNotificationListener):
+        (AccessibilityController::removeNotificationListener):
+        * DumpRenderTree/ios/AccessibilityUIElementIOS.mm: Added.
+        (AccessibilityUIElement::AccessibilityUIElement):
+        (AccessibilityUIElement::~AccessibilityUIElement):
+        (concatenateAttributeAndValue):
+        (AccessibilityUIElement::iphoneLabel):
+        (AccessibilityUIElement::iphoneHint):
+        (AccessibilityUIElement::iphoneValue):
+        (AccessibilityUIElement::iphoneIdentifier):
+        (AccessibilityUIElement::iphoneTraits):
+        (AccessibilityUIElement::iphoneIsElement):
+        (AccessibilityUIElement::iphoneElementTextPosition):
+        (AccessibilityUIElement::iphoneElementTextLength):
+        (AccessibilityUIElement::url):
+        (AccessibilityUIElement::x):
+        (AccessibilityUIElement::y):
+        (AccessibilityUIElement::width):
+        (AccessibilityUIElement::height):
+        (AccessibilityUIElement::clickPointX):
+        (AccessibilityUIElement::clickPointY):
+        (AccessibilityUIElement::getChildren):
+        (AccessibilityUIElement::getChildrenWithRange):
+        (AccessibilityUIElement::childrenCount):
+        (AccessibilityUIElement::elementAtPoint):
+        (AccessibilityUIElement::indexOfChild):
+        (AccessibilityUIElement::getChildAtIndex):
+        (AccessibilityUIElement::headerElementAtIndex):
+        (AccessibilityUIElement::linkedElement):
+        (AccessibilityUIElement::linkedUIElementAtIndex):
+        (AccessibilityUIElement::ariaOwnsElementAtIndex):
+        (AccessibilityUIElement::ariaFlowToElementAtIndex):
+        (AccessibilityUIElement::disclosedRowAtIndex):
+        (AccessibilityUIElement::selectedRowAtIndex):
+        (AccessibilityUIElement::rowAtIndex):
+        (AccessibilityUIElement::titleUIElement):
+        (AccessibilityUIElement::parentElement):
+        (AccessibilityUIElement::disclosedByRow):
+        (AccessibilityUIElement::increaseTextSelection):
+        (AccessibilityUIElement::decreaseTextSelection):
+        (AccessibilityUIElement::stringForSelection):
+        (AccessibilityUIElement::stringForRange):
+        (AccessibilityUIElement::attributedStringForRange):
+        (AccessibilityUIElement::attributedStringRangeIsMisspelled):
+        (AccessibilityUIElement::elementsForRange):
+        (AccessibilityUIElement::getLinkedUIElements):
+        (AccessibilityUIElement::getDocumentLinks):
+        (AccessibilityUIElement::attributesOfLinkedUIElements):
+        (AccessibilityUIElement::attributesOfDocumentLinks):
+        (AccessibilityUIElement::attributesOfChildren):
+        (AccessibilityUIElement::allAttributes):
+        (AccessibilityUIElement::stringAttributeValue):
+        (AccessibilityUIElement::isPressActionSupported):
+        (AccessibilityUIElement::isIncrementActionSupported):
+        (AccessibilityUIElement::isDecrementActionSupported):
+        (AccessibilityUIElement::boolAttributeValue):
+        (AccessibilityUIElement::isAttributeSettable):
+        (AccessibilityUIElement::isAttributeSupported):
+        (AccessibilityUIElement::parameterizedAttributeNames):
+        (AccessibilityUIElement::role):
+        (AccessibilityUIElement::subrole):
+        (AccessibilityUIElement::roleDescription):
+        (AccessibilityUIElement::title):
+        (AccessibilityUIElement::description):
+        (AccessibilityUIElement::orientation):
+        (AccessibilityUIElement::stringValue):
+        (AccessibilityUIElement::language):
+        (AccessibilityUIElement::helpText):
+        (AccessibilityUIElement::intValue):
+        (AccessibilityUIElement::minValue):
+        (AccessibilityUIElement::maxValue):
+        (AccessibilityUIElement::valueDescription):
+        (AccessibilityUIElement::insertionPointLineNumber):
+        (AccessibilityUIElement::isEnabled):
+        (AccessibilityUIElement::isRequired):
+        (AccessibilityUIElement::isFocused):
+        (AccessibilityUIElement::isSelected):
+        (AccessibilityUIElement::isExpanded):
+        (AccessibilityUIElement::isChecked):
+        (AccessibilityUIElement::hierarchicalLevel):
+        (AccessibilityUIElement::ariaIsGrabbed):
+        (AccessibilityUIElement::ariaDropEffects):
+        (AccessibilityUIElement::lineForIndex):
+        (AccessibilityUIElement::boundsForRange):
+        (AccessibilityUIElement::attributesOfColumnHeaders):
+        (AccessibilityUIElement::attributesOfRowHeaders):
+        (AccessibilityUIElement::attributesOfColumns):
+        (AccessibilityUIElement::attributesOfRows):
+        (AccessibilityUIElement::attributesOfVisibleCells):
+        (AccessibilityUIElement::attributesOfHeader):
+        (AccessibilityUIElement::rowCount):
+        (AccessibilityUIElement::columnCount):
+        (AccessibilityUIElement::indexInTable):
+        (AccessibilityUIElement::rowIndexRange):
+        (AccessibilityUIElement::columnIndexRange):
+        (AccessibilityUIElement::cellForColumnAndRow):
+        (AccessibilityUIElement::selectedTextRange):
+        (AccessibilityUIElement::assistiveTechnologySimulatedFocus):
+        (AccessibilityUIElement::setSelectedTextRange):
+        (AccessibilityUIElement::increment):
+        (AccessibilityUIElement::decrement):
+        (AccessibilityUIElement::showMenu):
+        (AccessibilityUIElement::press):
+        (AccessibilityUIElement::accessibilityValue):
+        (AccessibilityUIElement::documentEncoding):
+        (AccessibilityUIElement::documentURI):
+        (_accessibilityNotificationCallback):
+        (AccessibilityUIElement::addNotificationListener):
+        (AccessibilityUIElement::removeNotificationListener):
+        (AccessibilityUIElement::isFocusable):
+        (AccessibilityUIElement::isSelectable):
+        (AccessibilityUIElement::isMultiSelectable):
+        (AccessibilityUIElement::isSelectedOptionActive):
+        (AccessibilityUIElement::isVisible):
+        (AccessibilityUIElement::isOffScreen):
+        (AccessibilityUIElement::isCollapsed):
+        (AccessibilityUIElement::isIgnored):
+        (AccessibilityUIElement::hasPopup):
+        (AccessibilityUIElement::takeFocus):
+        (AccessibilityUIElement::takeSelection):
+        (AccessibilityUIElement::addSelection):
+        (AccessibilityUIElement::removeSelection):
+        (AccessibilityUIElement::uiElementForSearchPredicate):
+        (AccessibilityUIElement::numberAttributeValue):
+
+2013-03-04  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] pass all focus handling methods through the WebTestDelegate
+        https://bugs.webkit.org/show_bug.cgi?id=111328
+
+        Reviewed by Nico Weber.
+
+        In content_shell, the focus handling is asynchronous. To allow for
+        switching the focus synchronously between WebViews, we need to intercept
+        didFocus and didBlur and forward it to the WebTestDelegate.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestDelegate):
+        (WebTestRunner::WebTestDelegate::setFocus):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestRunner::WebTestProxy::didFocus):
+        (WebTestRunner::WebTestProxy::didBlur):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::setWindowIsKey):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::didFocus):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::didBlur):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didFocus):
+        (WebViewHost::didBlur):
+        (WebViewHost::setFocus):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-03-04  Claudio Saavedra  <csaavedra@igalia.com>
+
+        [GTK] No need to manually add system paths to jhbuildrc
+        https://bugs.webkit.org/show_bug.cgi?id=110850
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * gtk/jhbuildrc: Remove calls to addpath() for items that jhbuild
+        already takes care of.
+
+2013-03-04  Kinuko Yasuda  <kinuko@chromium.org>
+
+        [chromium] TestWebKitAPI WTF.StringHasher_addCharacters is broken on Chromium Android
+        https://bugs.webkit.org/show_bug.cgi?id=111284
+
+        Disabling the failing two tests on Android.
+
+        Reviewed by Jochen Eisinger.
+
+        * TestWebKitAPI/Tests/WTF/StringHasher.cpp:
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST):
+
+2013-03-04  Kunihiko Sakamoto  <ksakamoto@chromium.org>
+
+        Add build flag for FontLoader
+        https://bugs.webkit.org/show_bug.cgi?id=111289
+
+        Reviewed by Benjamin Poulain.
+
+        Add ENABLE_FONT_LOAD_EVENTS build flag (disabled by default).
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2013-03-03  Benjamin Poulain  <benjamin@webkit.org>
+
+        [Mac] Get rid of a useless method from DOMHTMLInputElement
+        https://bugs.webkit.org/show_bug.cgi?id=111279
+
+        Reviewed by Sam Weinig.
+
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        (TestRunner::setValueForUser):
+        The method _setValueForUser: was added for testing. This feature is already
+        exposed by DOMHTMLInputElement as a private API and it is how this code is exercised
+        in real use cases. Get rid of the method created for testing, use the real thing
+        instead.
+
+2013-03-03  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Some perf. tests have variances that differ greatly between runs
+        https://bugs.webkit.org/show_bug.cgi?id=97510
+
+        Reviewed by Benjamin Poulain.
+
+        Use multiple instances of DumpRenderTree or WebKitTestRunner to amortize the effect of the runtime
+        environment on test results (we run each instance after one another, not in parallel).
+
+        We use 4 instances of the test runner, each executing 5 in-process iterations, for the total of 20
+        iterations as it was done previously in single process. These values are hard-coded in perftest.py
+        and runner.js but they are to be configurable in the future.
+
+        Set of 5 iterations obtained by the same test runner is treated as an "iteration group" and each
+        metric now reports an array of the length 4 with each element containing an array of 5 iteration
+        values obtained by each test runner instance as opposed to a flattened array of 20 iteration values.
+
+        Unfortunately, we can use the same trick on Dromaeo because we're already doing only 5 iterations
+        and repeating the entire Dromaeo 4 times will take too long. We need to disable more Dromaeo tests
+        as needed. To this end, added SingleProcessPerfTest to preserve the old behavior.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTestMetric.append_group): Renamed from append.
+        (PerfTestMetric.grouped_iteration_values): Added.
+        (PerfTestMetric.flattened_iteration_values): Renamed from iteration_values.
+
+        (PerfTest.__init__): Takes the number of processes (drivers) to run tests with.
+        This parameter is only used by SingleProcessPerfTest.
+
+        (PerfTest.run): Repeat tests using different driver processes.
+        (PerfTest._run_with_driver): Returns a boolean instead of a list of measured metrics
+        since metrics are shared between multiple drivers (i.e. multiple calls to _run_with_driver).
+        We instead use _ensure_metrics to obtain the matched metrics and store the data there.
+        (PerfTest._ensure_metrics): Added.
+
+        (SingleProcessPerfTest): Added. Used to run Dromaeo tests where running it on 4 different
+        instances of DumpRenderTree/WebKitTestRunner takes too long.
+        (SingleProcessPerfTest.__init__):
+
+        (ReplayPerfTest._run_with_driver): Updated to use _ensure_metrics.
+
+        (PerfTestFactory): Use SingleProcessPerfTest to run Dromaeo tests.
+
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py: Updated various tests that expect
+        _run_with_driver to return a list of metrics. Now it returns a boolean indicating whether
+        the test succeeded or not. Obtain the dictionary of metrics via test._metrics instead.
+
+        (TestPerfTestMetric.test_append): Updated per name and added some test cases for
+        grouped_iteration_values.
+
+        (TestPerfTest._assert_results_are_correct):
+
+        (TestSingleProcessPerfTest): Added.
+        (TestSingleProcessPerfTest.test_use_only_one_process):
+        (TestSingleProcessPerfTest.test_use_only_one_process.run_single):
+
+        (TestReplayPerfTest.test_run_with_driver_accumulates_results):
+        (TestReplayPerfTest.test_run_with_driver_accumulates_memory_results):
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py: Updated values of
+        sample standard deviations since we're now running tests 4 times.
+        (MainTest._test_run_with_json_output.mock_upload_json):
+        (MainTest.test_run_with_upload_json_should_generate_perf_webkit_json):
+
+2013-03-03  Alexandre Elias  <aelias@chromium.org>
+
+        [chromium] Remove WebLayerTreeView::setViewportSize call
+        https://bugs.webkit.org/show_bug.cgi?id=110727
+
+        Reviewed by James Robinson.
+
+        After https://codereview.chromium.org/12328080 lands,
+        setViewportSize is called from the Chromium side. The multiplication
+        by deviceScaleFactor here was prone to off-by-one errors.
+        The layoutSize() function was only used here so delete it as well.
+
+        DumpRenderTree WebViewHost must now call this method as well.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::initializeLayerTreeView):
+        (WebViewHost::setWindowRect):
+        (WebViewHost::setDeviceScaleFactor):
+        (WebViewHost::updateViewportSize):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-02-27  Darin Adler  <darin@apple.com>
+
+        StringHasher functions require alignment that call sites do not all guarantee
+        https://bugs.webkit.org/show_bug.cgi?id=110171
+
+        Reviewed by Benjamin Poulain.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/GNUmakefile.am:
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj:
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WTF/WTF.pro:
+        * TestWebKitAPI/win/TestWebKitAPI.vcproj:
+        Added the StringHasher.cpp file.
+
+        * TestWebKitAPI/Tests/WTF/StringHasher.cpp: Added. Contains a bunch of tests
+        for the functions in the StringHasher class.
+
+2013-03-02  Benjamin Poulain  <bpoulain@apple.com>
+
+        Move computedStyleIncludingVisitedInfo from TestRunner to Internals
+        https://bugs.webkit.org/show_bug.cgi?id=109772
+
+        Reviewed by Andreas Kling.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2013-03-01  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: do not visit raw pointers by default.
+        https://bugs.webkit.org/show_bug.cgi?id=110943
+
+        Reviewed by Yury Semikhatsky.
+
+        Unfortunately in many cases raw pointer may point to an object that has been deleted.
+        There is no working solution to solve this problem in general.
+        It could be solved only on case by case basis.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp:
+        (TestWebKitAPI::TEST):
+
+2013-03-01  Jason Anderssen  <janderssen@gmail.com>
+
+        Move markerTextForListItem from TestRunner to Internals
+        https://bugs.webkit.org/show_bug.cgi?id=110939
+
+        Reviewed by Benjamin Poulain.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Don't use legacy test names when returning results from PerfTest.run
+        https://bugs.webkit.org/show_bug.cgi?id=111148
+
+        Reviewed by Dirk Pranke.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTestMetric.name): Renamed from metric.
+        (PerfTest.test_name_without_file_extension): Extracted from legacy_chromium_bot_compatible_test_name.
+        (PerfTest.run): Use metric name instead of the legacy name to store iteration values.
+        (ChromiumStylePerfTest.parse_and_log_output): Use the metric name to store results as done in PerfTest.run.
+
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (TestPerfTestMetric.test_init_set_time_metric):
+        (TestPerfTestMetric.legacy_chromium_bot_compatible_test_name): Removed. The integration tests test this.
+        (TestReplayPerfTest.test_run_with_driver_accumulates_results):
+        (TestReplayPerfTest.test_run_with_driver_accumulates_memory_results):
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner.__init__):
+        (PerfTestsRunner._generate_results_dict): Updated to iterate over (test, metrics) pair. Use view_source_url
+        to obtain the trac URL instead of hard coding it.
+        (PerfTestsRunner._run_tests_set):
+
+2013-03-01  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Add an extra project that assembles all project build logs on Windows into a single file.
+        https://bugs.webkit.org/show_bug.cgi?id=111202
+
+        This is useful for running VCExpress builds from command line because there is
+        no unified solution output, only per project build logs.
+        The project will be run as the last project in the solution.
+
+        * win/AssembleBuildLogs: Added.
+        * win/AssembleBuildLogs/AssembleBuildLogs.vcxproj: Added.
+        * win/AssembleBuildLogs/AssembleBuildLogs.vcxproj.filters: Added.
+        * win/AssembleBuildLogs/AssembleLogs.cmd: Added.
+        * win/AssembleBuildLogs/README: Added.
+
+2013-03-01  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Increase number of patches processed before clean building on WinEWS bots.
+
+        * EWSTools/start-queue-win.sh:
+
+2013-03-01  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Don't return statistics in PerfTest.run
+        https://bugs.webkit.org/show_bug.cgi?id=111145
+
+        Reviewed by Dirk Pranke.
+
+        Simply return a list of values obtained in each iteration from PerfTest.run.
+        Also simplify various methods as needed.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTestMetric.__init__): Moved the code to convert 'Time' metric to 'FrameRate' and 'Runs'
+        as needed from PerfTestsRunner._generate_results_dict.
+
+        (PerfTestMetric.legacy_chromium_bot_compatible_test_name): Always append the metric name now
+        that we don't have to worry about the backward compatibility here.
+
+        (PerfTestMetric.iteration_values): Added.
+        (PerfTestMetric.unit): Added.
+        (PerfTestMetric.metric_to_unit):
+        (PerfTestMetric.time_unit_to_metric): Extracted from PerfTestsRunner._generate_results_dict.
+
+        (PerfTest.run):
+        (PerfTest.log_statistics): Merged compute_statistics and self.output_statistics.
+
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (TestPerfTestMetric.test_init_set_missing_unit):
+        (TestPerfTestMetric.test_init_set_time_metric): Added.
+        (TestPerfTestMetric.test_legacy_chromium_bot_compatible_test_name):
+        (TestPerfTestMetric.test_append):
+        (TestPerfTestMetric.test_compute_statistics): Removed. Integration tests check some of these
+        test cases and it's not critical to keep math right as they're not used in output JSON anymore.
+        (TestPerfTest._assert_results_are_correct):
+        (TestReplayPerfTest.test_run_with_driver_accumulates_results):
+        (TestReplayPerfTest.test_run_with_driver_accumulates_memory_results):
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._generate_results_dict):
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (EventTargetWrapperTestData): The metric name shows up at the end of the test name as expected.
+        (SomeParserTestData): Ditto.
+        (MemoryTestData): Ditto.
+
+2013-03-01  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Enable LINK_PREFETCH
+        https://bugs.webkit.org/show_bug.cgi?id=111158
+
+        Reviewed by Simon Hausmann.
+
+        * qmake/mkspecs/features/features.pri:
+
+2013-03-01  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Update features.pri with new features
+        https://bugs.webkit.org/show_bug.cgi?id=111157
+
+        Reviewed by Jocelyn Turcotte.
+
+        * qmake/mkspecs/features/features.pri:
+
+2013-03-01  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] put WebTestProxy::scheduleComposite back in place
+        https://bugs.webkit.org/show_bug.cgi?id=111146
+
+        Reviewed by Nico Weber.
+
+        The call was removed in http://trac.webkit.org/changeset/144398 because
+        DRT doesn't need it. However, content shell depends on this call.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestRunner::WebTestProxy::scheduleComposite):
+
+2013-02-28  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Merge PerfTestRunner._run_single_test into PerfTestRunner._run_tests_set
+        https://bugs.webkit.org/show_bug.cgi?id=111142
+
+        Reviewed by Adam Barth.
+
+        Merged _run_single_test into _run_tests_set. The code looks much cleaner now.
+
+        Also removed _print_status since it's never used anywhere.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner.run):
+        (PerfTestsRunner._run_tests_set):
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (MainTest.run_test):
+        (MainTest.test_run_test_set):
+        (MainTest.test_run_test_set_kills_drt_per_run):
+        (MainTest.test_run_test_set_for_parser_tests):
+
+2013-02-28  Kiran Muppala  <cmuppala@apple.com>
+
+        Disable window occlusion detection for WebKitTestRunner Web View on Mac
+        https://bugs.webkit.org/show_bug.cgi?id=111116
+
+        Reviewed by Simon Fraser.
+
+        Window occlusion notifications were causing WebKitTestRunner's Web View
+        to be detected as occluded and causing a few JavaScript timer layout
+        tests to fail.  https://bugs.webkit.org/show_bug.cgi?id=111025, fixed this
+        by initializing the page visibility to "visible" after creating the view.
+        But a better solution is to disable window occlusion detection, so that
+        not only the page but also the view is treated as visible.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions): Remove call to
+        setVisibilityState, since it is no longer necessary.
+        * WebKitTestRunner/mac/PlatformWebViewMac.mm:
+        (WTR::PlatformWebView::PlatformWebView): Disable window occlusion
+        detection for the created WKView.
+
+2013-02-28  Li Yin  <li.yin@intel.com>
+
+        [chromium] Events can't be triggered on MediaStreamTrack
+        https://bugs.webkit.org/show_bug.cgi?id=110930
+
+        Reviewed by Kentaro Hara.
+
+        Related code was moved to MediaStreamCenterChromium::didStopLocalMediaStream
+
+        * DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.cpp:
+        (WebTestRunner::MockWebMediaStreamCenter::didStopLocalMediaStream):
+
+2013-02-27  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Use DumpRenderTree-specific interface for DRT's compositor embedding
+        https://bugs.webkit.org/show_bug.cgi?id=111017
+
+        Reviewed by Adam Barth.
+
+        This decouples DumpRenderTree from WebLayerTreeViewClient.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHostDRTLayerTreeViewClient):
+        (WebViewHostDRTLayerTreeViewClient::WebViewHostDRTLayerTreeViewClient):
+        (WebViewHostDRTLayerTreeViewClient::~WebViewHostDRTLayerTreeViewClient):
+        (WebViewHostDRTLayerTreeViewClient::Layout):
+        (WebViewHostDRTLayerTreeViewClient::ScheduleComposite):
+        (WebViewHost::initializeLayerTreeView):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (webkit_support):
+        (WebViewHost):
+
+2013-02-28  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        Unreviewed, add my secondary email address to the list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-28  Philip Rogers  <pdr@google.com>
+
+        Add Philip Rogers as a reviewer.
+
+        Unreviewed update of committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-28  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Merge more methods on PerfTest
+        https://bugs.webkit.org/show_bug.cgi?id=111030
+
+        Reviewed by Dirk Pranke.
+
+        Merged parse_output into _run_with_driver as it was the only caller. Also merged _should_ignore_line_in_stderr
+        and _should_ignore_line_in_parser_test_result into _filter_output since it was their only caller.
+
+        This makes the control flow a lot more comprehensible.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest._run_with_driver):
+        (PerfTest._should_ignore_line):
+        (PerfTest._filter_output):
+
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (TestPerfTest._assert_results_are_correct):
+        (test_ignored_stderr_lines):
+
+2013-02-28  Robert Hogan  <robert@webkit.org>
+
+        Update my IRC nick
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-28  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt] Enable thin archives before parsing the project files
+
+        Rubber-stamped by Simon Hausmann.
+
+        The targetSubDir() function can be called before default_post.prf has been
+        parsed therefore the gnu_thin_archives option has to be set in default_pre.prf
+        which is parsed before the main project file.
+        This issue was revealed by r144299 and fixes the clean build.
+
+        * qmake/mkspecs/features/default_post.prf:
+        * qmake/mkspecs/features/default_pre.prf:
+
+2013-02-28  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Enable CANVAS_PATH flag
+        https://bugs.webkit.org/show_bug.cgi?id=108508
+
+        Reviewed by Simon Hausmann.
+
+        Also enable CANVAS_PATH flag for Qt.
+
+        * qmake/mkspecs/features/features.pri:
+
+2013-02-28  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt][TestWebKitAPI] The activeBuildConfig() function has been replaced with targetSubDir()
+
+        Rubber-stamped by Csaba Osztrogonác.
+
+        Besides suppressing a warning about the non-existing function this
+        fixes the build if there is a subdirectory (eg. debug-and-release).
+
+        * TestWebKitAPI/InjectedBundle.pri:
+        * TestWebKitAPI/TestWebKitAPI.pri:
+
+2013-02-28  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [EFL][WTR] WTR cannot load injected bundle
+        https://bugs.webkit.org/show_bug.cgi?id=111063
+
+        Reviewed by Csaba Osztrogonác.
+
+        WTR was not able to load injected bundle because of undefined 
+        symbols for AccessibilityUIElement::scrollToMakeVisible(). 
+        Adding empty implementation of this function to AccessibilityUIElementAtk.cpp
+        solves the problem.
+
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::AccessibilityUIElement::scrollToMakeVisible):
+
+2013-02-28  Alberto Garcia  <albgarcia@rim.com>
+
+        [BlackBerry] TestRunnerBlackBerry: remove layerTreeAsText, it's gone from upstream
+        https://bugs.webkit.org/show_bug.cgi?id=110464
+
+        Reviewed by Rob Buis.
+
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+
+2013-02-28  Xan Lopez  <xlopez@rim.com>
+
+        [BlackBerry] DumpRenderTreeSupport: update the set position methods
+        https://bugs.webkit.org/show_bug.cgi?id=110578
+
+        Reviewed by Rob Buis.
+
+        TestRunner::setMockGeolocationPosition() changed in r130416:
+        http://trac.webkit.org/changeset/130416/trunk/Tools/DumpRenderTree/TestRunner.h
+
+        DumpRenderTreeSupport::setMockGeolocationError() was renamed to
+        setMockGeolocationPositionUnavailableError() in r129444:
+        http://trac.webkit.org/changeset/129444/trunk/Source/WebKit/blackberry/WebKitSupport/DumpRenderTreeSupport.h
+
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        (TestRunner::setMockGeolocationPosition):
+        (TestRunner::setMockGeolocationPositionUnavailableError):
+
+2013-02-28  Xan Lopez  <xlopez@rim.com>
+
+        [BlackBerry] WorkQueueItemBlackBerry: use the new FrameLoader API
+        https://bugs.webkit.org/show_bug.cgi?id=110465
+
+        Reviewed by Rob Buis.
+
+        * DumpRenderTree/blackberry/WorkQueueItemBlackBerry.cpp:
+        (LoadItem::invoke):
+
+2013-02-27  Ryosuke Niwa  <rniwa@webkit.org>
+
+        PerfTestRunner doesn't need _needs_http and _has_http_lock
+        https://bugs.webkit.org/show_bug.cgi?id=111037
+
+        Reviewed by Adam Barth.
+
+        Delete these variables in favor of using a local variable.
+
+        Member variables are like global variables. They introduce implicit dependencies
+        between member functions.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner.__init__):
+        (PerfTestsRunner._start_http_servers):
+        (PerfTestsRunner):
+        (PerfTestsRunner._stop_http_servers):
+        (PerfTestsRunner.run):
+
+2013-02-27  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r144224.
+        http://trac.webkit.org/changeset/144224
+        https://bugs.webkit.org/show_bug.cgi?id=111045
+
+        Caused plugins/pass-different-npp-struct.html to time out
+        (Requested by abarth on #webkit).
+
+        * DumpRenderTree/TestNetscapePlugIn/Tests/PassDifferentNPPStruct.cpp:
+        (PassDifferentNPPStruct::NPP_SetWindow):
+        * DumpRenderTree/TestNetscapePlugIn/main.cpp:
+        (NPP_SetWindow):
+
+2013-02-27  Adam Barth  <abarth@webkit.org>
+
+        [Chromium] Enable threaded HTML parser by default in DumpRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=110907
+
+        Reviewed by Eric Seidel.
+
+        This patch changes --enable-threaded-html-parser into
+        --disable-threaded-html-parser and thereby enables the threaded HTML
+        parser by default for the Chromium port.
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2013-02-27  Kiran Muppala  <cmuppala@apple.com>
+
+        Initialize page visibility after creating WebKitTestRunner WebView on Mac
+        https://bugs.webkit.org/show_bug.cgi?id=111025
+
+        Reviewed by Simon Fraser.
+
+        Set page visibility to "visible" after creating WebView to override
+        visibility state inferred from window occlusion notifications on Mac.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions): Add call to
+        setVisibilityState.
+
+2013-02-27  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Merge PageLoadingPerfTest into ReplayPerfTest
+        https://bugs.webkit.org/show_bug.cgi?id=111027
+
+        Reviewed by Dirk Pranke.
+
+        Merged two classes.
+
+        We should really move ahead with the bug 100991 and get rid of PageLoadingPerfTest
+        part of ReplayPerfTest.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (ReplayPerfTest): Moved _FORCE_GC_FILE here.
+        (ReplayPerfTest.__init__):
+        (ReplayPerfTest._run_with_driver): Moved from PageLoadingPerfTest.
+        (ReplayPerfTest.run_single): Load the GC page as run_single on PageLoadingPerfTest did.
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (TestReplayPerfTest):
+        (TestReplayPerfTest.test_run_single.run_test):
+        (TestReplayPerfTest.test_run_single): Make sure test_time is passed down properly from output.
+        (TestReplayPerfTest.test_run_with_driver_accumulates_results): Renamed from
+        TestPageLoadingPerfTest.test_run.
+        (TestReplayPerfTest.test_run_with_driver_accumulates_results.mock_run_signle):
+        (TestReplayPerfTest.test_run_with_driver_accumulates_memory_results): Renamed from
+        TestPageLoadingPerfTest.test_run_with_memory_output
+        (TestReplayPerfTest.test_run_with_driver_accumulates_memory_results.mock_run_signle):
+        (TestReplayPerfTest.test_prepare_calls_run_single):
+
+2013-02-27  Eric Seidel  <eric@webkit.org>
+
+        Add --additional-drt-flag option to run-perf-tests to make it easy to test runtime options
+        https://bugs.webkit.org/show_bug.cgi?id=111021
+
+        Reviewed by Dirk Pranke.
+
+        The underlying code (which is shared with run-webkit-tests)
+        already knew how to support this option, it just wasn't exposed
+        via the run-perf-tests front-end.  This patch fixes that.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+
+2013-02-27  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Stop uploading results to webkit-perf.appspot.com
+        https://bugs.webkit.org/show_bug.cgi?id=110954
+
+        Reviewed by Benjamin Poulain.
+
+        Pass in perf.webkit.org instead of webkit-perf.appspot.com as the test results server.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunAndUploadPerfTests):
+
+2013-02-27  James Simonsen  <simonjam@chromium.org>
+
+        [chromium] Lower priority of preloaded images
+        https://bugs.webkit.org/show_bug.cgi?id=110527
+
+        Plumb the didChangePriority signal into DRT so it can be tested.
+
+        Reviewed by Nate Chapin.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner::WebTestProxy::didChangeResourcePriority):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpResourcePriorities):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::dumpResourceRequestPriorities):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        (WebTestRunner::WebTestProxyBase::willSendRequest):
+        (WebTestRunner::WebTestProxyBase::didChangeResourcePriority):
+        (WebTestRunner):
+
+2013-02-27  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Mac platform should support ability to scroll an element into visible
+        https://bugs.webkit.org/show_bug.cgi?id=109860
+
+        Reviewed by Beth Dakin.
+
+        * DumpRenderTree/AccessibilityUIElement.cpp:
+        (scrollToMakeVisibleCallback):
+        (AccessibilityUIElement::getJSClass):
+        * DumpRenderTree/mac/AccessibilityUIElementMac.mm:
+        (AccessibilityUIElement::scrollToMakeVisible):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
+        (WTR::AccessibilityUIElement::scrollToMakeVisible):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
+        (WTR::AccessibilityUIElement::scrollToMakeVisible):
+        (WTR):
+
+2013-02-27  John Bauman  <jbauman@chromium.org>
+
+        Plugin in iframe may not display
+        https://bugs.webkit.org/show_bug.cgi?id=109879
+
+        Reviewed by Simon Fraser.
+
+        LogNPPSetWindow will be used with other ports as well.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt:
+
+2013-02-27  Jochen Eisinger  <jochen@chromium.org>
+
+        plugins/netscape-plugin-setwindow-size*.html and plugins/pass-different-npp-struct.html should be async
+        https://bugs.webkit.org/show_bug.cgi?id=110973
+
+        Reviewed by Adam Barth.
+
+        There is nothing that ensures that the log messages from the plugin
+        come in before the layout test finished loading.
+
+        * DumpRenderTree/TestNetscapePlugIn/Tests/PassDifferentNPPStruct.cpp:
+        (PassDifferentNPPStruct::NPP_SetWindow):
+        * DumpRenderTree/TestNetscapePlugIn/main.cpp:
+        (NPP_SetWindow):
+
+2013-02-27  Glenn Adams  <glenn@skynav.com>
+
+        Add ENABLE_CSS3_TEXT_LINE_BREAK flag.
+        https://bugs.webkit.org/show_bug.cgi?id=110944
+
+        Reviewed by Dean Jackson.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2013-02-27  Yong Li  <yong.li.webkit@outlook.com>
+
+        Unreviewed. Remove myself from watchlist.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-27  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        Switch QtWebKit to GStreamer 1.0.
+        https://bugs.webkit.org/show_bug.cgi?id=106669.
+
+        Original patch by Sebastian Dröge.
+        Reviewed by Csaba Osztrogonác.
+
+        Build with GStreamer 1.0 if available, but support GStreamer 0.10 
+        temporarily to make upgrading easy and the patch suitable for Qt5.
+
+        * qmake/mkspecs/features/features.prf:
+
+2013-02-27  Szilard Ledan  <szledan@inf.u-szeged.hu>
+
+        Unreviewed. Added myself to committers.py
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-27  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r144192.
+        http://trac.webkit.org/changeset/144192
+        https://bugs.webkit.org/show_bug.cgi?id=110984
+
+        Stored svn password on wrong computer (Requested by kkristof
+        on #webkit).
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-27  Szilard Ledan  <szledan@inf.u-szeged.hu>
+
+        Unreviewed. Added myself to committers.py
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-27  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Build fix after r144155. The report page is located at /api/report, not /api/test/report.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._upload_json):
+
+2013-02-27  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Stop uploading results to webkit-perf.appspot.com
+        https://bugs.webkit.org/show_bug.cgi?id=110954
+
+        Reviewed by Benjamin Poulain.
+
+        When the specified test results server was webkit-perf.appspot.com, replace it by perf.webkit.org.
+        Also, always use the new JSON format. Removed the code to generate the old format.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._generate_and_show_results):
+        (PerfTestsRunner._generate_results_dict):
+        (PerfTestsRunner._merge_slave_config_json):
+        (PerfTestsRunner._generate_output_files):
+
+2013-02-27  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r144136, r144143, and r144147.
+        http://trac.webkit.org/changeset/144136
+        http://trac.webkit.org/changeset/144143
+        http://trac.webkit.org/changeset/144147
+        https://bugs.webkit.org/show_bug.cgi?id=110950
+
+        Caused some timeouts and flaky crashes (Requested by abarth on
+        #webkit).
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (main):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2013-02-25  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Use perf.webkit.org JSON format in results page
+        https://bugs.webkit.org/show_bug.cgi?id=110842
+
+        Reviewed by Benjamin Poulain.
+
+        Change the default JSON format from that of webkit-perf.appspot.com to that of perf.webkit.org.
+
+        A whole bunch of integration tests have been updated to use the new JSON format.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._generate_and_show_results): Renamed output and output_path to legacy_output
+        and legacy_output_json_path respectively.
+        (PerfTestsRunner._generate_results_dict): Don't assume meta build information is always available.
+        (PerfTestsRunner._generate_output_files): Make json_output, which is used to generate the default
+        JSON file and the results page out of perf_webkit_output instead of legacy_output.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (MainTest.test_run_memory_test):
+        (MainTest._test_run_with_json_output.mock_upload_json):
+        (MainTest):
+        (MainTest.test_run_with_json_output):
+        (MainTest.test_run_with_description):
+        (MainTest.test_run_generates_json_by_default):
+        (MainTest.test_run_merges_output_by_default):
+        (MainTest.test_run_respects_reset_results):
+        (MainTest.test_run_generates_and_show_results_page):
+        (MainTest.test_run_with_slave_config_json):
+        (MainTest.test_run_with_multiple_repositories):
+        (MainTest.test_run_with_upload_json):
+        (MainTest.test_run_with_upload_json_should_generate_perf_webkit_json):
+
+2013-02-26  Adam Barth  <abarth@webkit.org>
+
+        [Chromium] Enable threaded HTML parser by default in DumpRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=110907
+
+        Reviewed by Eric Seidel.
+
+        This patch changes --enable-threaded-html-parser into
+        --disable-threaded-html-parser and thereby enables the threaded HTML
+        parser by default for the Chromium port.
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2013-02-26  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] Re-enable the fixed version of freetype on linux
+        https://bugs.webkit.org/show_bug.cgi?id=110542
+
+        Reviewed by Tony Chang.
+
+        Re-land the change in r143794 to switch to building with a fixed
+        version of FreeType for just DumpRenderTree. This allows us to share
+        one version of pixel baselines for both Lucid and Precise, and run the
+        layout tests in a stock Precise install (instead of a Lucid chroot).
+        Going forward, this approach isolates us from os-level changes to the
+        version of FreeType. Note that Chromium itself still uses the system
+        FreeType and is unaffected by this change.
+        
+        This setting can still be turned off (at compile/gyp-time) by
+        manually setting use_custom_freetype=0.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-02-26  Nico Weber  <thakis@chromium.org>
+
+        [chromium] content shell drt: Enable WebKit::setLayoutTestMode()
+        https://bugs.webkit.org/show_bug.cgi?id=110890
+
+        Reviewed by Jochen Eisinger.
+
+        Several functions in webkit check that bit to change rendering
+        in layout test mode. For example, platform/graphics/skia/FrontSkia.cpp
+        disables font smoothing in this mode. TestShell and DRT both set
+        this flag, so content shell drt should set it too.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+
+2013-02-26  Vivek Galatage  <vivek.vg@samsung.com>
+
+        new-commit-bot: Fix the unit test newcommitbot-unittest.py due to r144040
+        https://bugs.webkit.org/show_bug.cgi?id=110884
+
+        Reviewed by Csaba Osztrogonác.
+
+        Adding the missing spaces before ':' in the unit test.
+
+        * Scripts/webkitpy/tool/commands/newcommitbot_unittest.py:
+
+2013-02-26  Vivek Galatage  <vivek.vg@samsung.com>
+
+        new-commit-bot: Some IRC clients doesn't linkify rollout messages
+        https://bugs.webkit.org/show_bug.cgi?id=110861
+
+        Reviewed by Ryosuke Niwa.
+
+        Adding the space before ':' in order to fix the links shown for the rollout message.
+
+        * Scripts/webkitpy/tool/commands/newcommitbot.py:
+        (NewCommitBot._summarize_commit_log):
+
+2013-02-26  Joone Hur  <joone.hur@intel.com>
+
+        [GTK] Add Clutter to jhbuild
+        https://bugs.webkit.org/show_bug.cgi?id=110245
+
+        Reviewed by Martin Robinson.
+
+        Add clutter, cogl, clutter-gtk, and atk to the optional moduleset.
+        This allows to build WebKitGtk+ with clutter as an acceleration backend
+        within the jhbuild environment. 
+
+        * gtk/jhbuild-optional.modules:
+
+2013-02-25  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Another fix attempt after r143991 since having \r? after a greedy match doesn't help.
+
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVN.value_from_svn_info):
+
+2013-02-25  Alan Cutter  <alancutter@chromium.org>
+
+        GCE EWS bots failing intermittently on HTTP 502 error while updating their status
+        https://bugs.webkit.org/show_bug.cgi?id=110845
+
+        Unreviewed EWS bot fix.
+
+        Switch the Queue Status Server address the EWS bots use to a more direct URL that
+        doesn't seem to be having problems from GCE like queues.webkit.org.
+
+        * Scripts/webkitpy/common/net/statusserver.py:
+        (StatusServer):
+
+2013-02-25  Dirk Pranke  <dpranke@chromium.org>
+
+        Forgot to delete a no-longer-needed unit test after r143980.
+
+        Unreviewed, build fix.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py:
+        (ChromiumWinTest.test_path_to_image_diff):
+
+2013-02-25  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Build fix. run-perf-tests was reporting with revision numbers ending with \r.
+        Don't include \r at the end of svn info lines on Windows.
+
+        This is similar to r143839.
+
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVN.value_from_svn_info):
+
+2013-02-25  James Simonsen  <simonjam@chromium.org>
+
+        [Resource Timing] Update test suite so it can be exported to the W3C
+        https://bugs.webkit.org/show_bug.cgi?id=107343
+
+        Reviewed by Tony Gentilcore.
+
+        * Scripts/export-w3c-performance-wg-tests: Clean up output.
+        * Scripts/import-w3c-performance-wg-tests:
+
+2013-02-25  Anders Carlsson  <andersca@apple.com>
+
+        Add a new unavailablePluginButtonClicked callback that takes a WKDictionary of plug-in information
+        https://bugs.webkit.org/show_bug.cgi?id=110821
+        <rdar://problem/13265303>
+
+        Reviewed by Beth Dakin.
+
+        Update for WebKit2 changes.
+
+        * MiniBrowser/mac/WK2BrowserWindowController.m:
+        (-[WK2BrowserWindowController awakeFromNib]):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createOtherPage):
+        (WTR::TestController::createWebViewWithOptions):
+        (WTR::TestController::unavailablePluginButtonClicked):
+        * WebKitTestRunner/TestController.h:
+        (TestController):
+
+2013-02-21  Jeffrey Pfau  <jpfau@apple.com>
+
+        Optionally partition cache to prevent using cache for tracking
+        https://bugs.webkit.org/show_bug.cgi?id=110269
+
+        Reviewed by Maciej Stachowiak.
+
+        Add test suite for public suffix functions on Mac.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/mac/PublicSuffix.mm: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST_F):
+
+2013-02-25  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: reenable multiple http shards on chromium win
+        https://bugs.webkit.org/show_bug.cgi?id=110814
+
+        Reviewed by Tony Chang.
+
+        The underlying bug in DumpRenderTree that was causing us to look for a
+        pac file and timeout under load was fixed a while ago.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_win.py:
+        (ChromiumWinPort.relative_test_filename):
+
+2013-02-25  Dirk Pranke  <dpranke@chromium.org>
+
+        Make ninja the default w/ build-webkit --chromium on windows.
+        https://bugs.webkit.org/show_bug.cgi?id=110731
+
+        Unreviewed - TBR'ing thakis :).
+
+        * Scripts/update-webkit-chromium:
+
+2013-02-25  Anders Carlsson  <andersca@apple.com>
+
+        Add a new pluginDidFail callback that takes a WKDictionary of plug-in information
+        https://bugs.webkit.org/show_bug.cgi?id=110793
+        <rdar://problem/13265303>
+
+        Reviewed by Sam Weinig.
+
+        Update for WebKit2 API changes.
+
+        * MiniBrowser/mac/WK2BrowserWindowController.m:
+        (-[WK2BrowserWindowController awakeFromNib]):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions):
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        Fix python unit tests after yoli's email address update in http://trac.webkit.org/changeset/143922
+        https://bugs.webkit.org/show_bug.cgi?id=110775
+
+        Unreviewed, basically a rebaseline.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        [chromium] Try to get the webkit builder to use msvs again
+        https://bugs.webkit.org/show_bug.cgi?id=110771
+
+        Reviewed by Eric Seidel.
+
+        The msvs gyp generator apparently doesn't write the sln file on every
+        run, so check the vcxproj file instead.
+
+        * Scripts/webkitdirs.pm:
+        (determineIsChromiumNinja):
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        [chromium] try to unbreak run-chromium-webkit-unit-tests on the mac bots
+        https://bugs.webkit.org/show_bug.cgi?id=110767
+
+        Reviewed by Eric Seidel.
+
+        The tester runs gyp, which generates out/Release/build.ninja. The bot
+        scripts use existence (and timestamp) of that file to decide if the
+        current build is supposed to be ninja or xcodebuild. The file exists,
+        so the snapshot is extracted to out/Release. The snapshot doesn't
+        contain build.ninja however due to
+        http://trac.webkit.org/changeset/140375 , so after extracting the
+        snapshot the scripts think that this is an xcodebuild build. So remove
+        the part of that revision that removed ninja files from the archive,
+        and the bots should be happy again.
+
+        * BuildSlaveSupport/built-product-archive:
+        (archiveBuiltProduct):
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        Fix tests after r143910
+        https://bugs.webkit.org/show_bug.cgi?id=110757
+
+        Reviewed by Andreas Kling.
+
+        While here, also add a test for the bug r143910 fixed.
+
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+        (ScriptErrorTest.test_message_with_output):
+        (ScriptErrorTest):
+        (ScriptErrorTest.test_message_with_tuple):
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        [chromium] Apparently built-product-archive is written in Python, not Perl :-/
+        https://bugs.webkit.org/show_bug.cgi?id=110755
+
+        Reviewed by Jochen Eisinger.
+
+        * BuildSlaveSupport/built-product-archive:
+        (archiveBuiltProduct):
+        (extractBuiltProduct):
+
+2013-02-25  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r143895.
+        http://trac.webkit.org/changeset/143895
+        https://bugs.webkit.org/show_bug.cgi?id=110758
+
+        broke a bunch of tests (Requested by thakis__ on #webkit).
+
+        * Scripts/update-webkit-chromium:
+
+2013-02-25  Andreas Kling  <akling@apple.com>
+
+        Unreviewed, fix simple mistake in r143903.
+        <http://webkit.org/b/110746>
+
+        Reviewed by Andreas Kling.
+
+        Pass git revision, not svn revision, to git shell command.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.timestamp_of_latest_commit):
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        [chromium] Let built-product-archive log which directory it's archiving from and extracting to
+        https://bugs.webkit.org/show_bug.cgi?id=110748
+
+        Reviewed by Jochen Eisinger.
+
+        One of the mac testers runs DRT from out/ but WebKitUnitTests from
+        xcodebuild. I'm trying to understand what's going on.
+
+        * BuildSlaveSupport/built-product-archive:
+        (archiveBuiltProduct):
+        (extractBuiltProduct):
+
+2013-02-23  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: replace String with const char* in MemoryObjectInfo
+        https://bugs.webkit.org/show_bug.cgi?id=110599
+
+        Reviewed by Yury Semikhatsky.
+
+        Due to potentially dynamic nature of names and classNames we need to make a copy of the strings
+        that were given us via MemoryInstrumentation calls.
+        So I extended client api with registerString method that pushes the strings
+        down to the serializer.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp:
+        (TestWebKitAPI::Helper::Helper):
+        (Helper):
+        (TestWebKitAPI::Helper::addNode):
+        (TestWebKitAPI::TEST):
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        Make ScriptError not crash when args is a tuple
+        https://bugs.webkit.org/show_bug.cgi?id=110747
+
+        Reviewed by Jochen Eisinger.
+
+        I'm trying to understand the error on
+        http://build.webkit.org/builders/Chromium%20Win%20Release%20%28Tests%29/builds/34563/steps/layout-test/logs/stdio
+        better. I'll likely have to revert the ninja switch on windows, but
+        having error reporting code that doesn't itself crash sounds like a
+        good thing to have anyways.
+
+        The problem is that '%s' % (1, 2) errors out, and args is sometimes a
+        tuple not a list.
+
+        * Scripts/run-chromium-webkit-unit-tests:
+        * Scripts/webkitpy/common/system/executive.py:
+        (ScriptError.__init__):
+
+2013-02-25  Laszlo Gombos  <l.gombos@samsung.com>
+
+        [EFL] Align feature defaults
+        https://bugs.webkit.org/show_bug.cgi?id=110715
+
+        Enable 3D_RENDERING in FeatureList.pm as it is enabled by default in
+        OptionsEfl.cmake.
+
+        Reviewed by Gyuyoung Kim.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-02-25  Ryosuke Niwa  <rniwa@webkit.org>
+
+        run-perf-tests reports wrong commit time
+        https://bugs.webkit.org/show_bug.cgi?id=110746
+
+        Reviewed by Andreas Kling.
+
+        The bug was caused by running "svn info" on a subdirectory, which returns a timestamp
+        of when the subdirectory was last modified.
+
+        Run "svn info -r <revision> <repository root>" instead. Specifying revision number is
+        insufficient since running "svn log -r <revision>" on a partial checkout only returns
+        an empty result if the revision didn't modify the subdirectory.
+
+        For git, there is no partial checkout, so we just need to pass in "-r" option to keep
+        the interface compatible with svn.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.timestamp_of_latest_commit):
+        * Scripts/webkitpy/common/checkout/scm/scm.py:
+        (SCM.timestamp_of_latest_commit):
+        * Scripts/webkitpy/common/checkout/scm/scm_mock.py:
+        (MockSCM.timestamp_of_latest_commit):
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        (test_timestamp_of_latest_commit):
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVN.timestamp_of_latest_commit):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._generate_results_dict):
+
+2013-02-25  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move WebRuntimeFeatures configuration to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=110712
+
+        Reviewed by Nico Weber.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2013-02-25  Nico Weber  <thakis@chromium.org>
+
+        Make ninja the default build system for build-webkit --chromium on windows
+        https://bugs.webkit.org/show_bug.cgi?id=110731
+
+        Reviewed by Jochen Eisinger.
+
+        With http://crbug.com/169945 fixed, this should now work.
+
+        * Scripts/update-webkit-chromium:
+
+2013-02-24  Gustavo Noronha Silva  <gns@gnome.org>
+
+        [GTK] GTK+ 2 build broken since GTK_API_VERSION_2 moved to autoconfig.h
+        https://bugs.webkit.org/show_bug.cgi?id=110702
+
+        Reviewed by Martin Robinson.
+
+        * GtkLauncher/main.c: include autotoolsconfig.h.
+        * Scripts/webkitpy/style/checker.py: make GtkLauncher/main.c exempt of
+        the include ordering check, since it uses autotoolsconfig.h which needs to
+        come first.
+
+2013-02-24  Hajime Morrita  <morrita@google.com>
+
+        [Custom Elements] Implement bare-bone document.register()
+        https://bugs.webkit.org/show_bug.cgi?id=100229
+
+        Reviewed by Adam Barth.
+
+        Added enableCustomDOMElements flag.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2013-02-23  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] DumpRenderTree TestShell::initialize should take Platform* now that WebKitPlatformSupport is empty
+        https://bugs.webkit.org/show_bug.cgi?id=110606
+
+        Reviewed by Adam Barth.
+
+        Part of a larger refactoring series; see tracking bug 82948.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (WebKitSupportTestEnvironment::WebKitSupportTestEnvironment):
+        (WebKitSupportTestEnvironment::mockPlatform):
+        (WebKitSupportTestEnvironment):
+        * DumpRenderTree/chromium/MockPlatform.cpp: Copied from Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.cpp.
+        (MockPlatform::create):
+        (MockPlatform::MockPlatform):
+        (MockPlatform::~MockPlatform):
+        (MockPlatform::setInterfaces):
+        (MockPlatform::cryptographicallyRandomValues):
+        (MockPlatform::createMediaStreamCenter):
+        (MockPlatform::createRTCPeerConnectionHandler):
+        * DumpRenderTree/chromium/MockPlatform.h: Copied from Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.h.
+        (MockPlatform):
+        * DumpRenderTree/chromium/MockWebKitPlatformSupport.cpp: Removed.
+        * DumpRenderTree/chromium/MockWebKitPlatformSupport.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestDelegate):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+
+2013-02-23  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Chromium Windows Perf bot fix. Tolerate CR at the end of the line that contains the timestamp.
+
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVN.timestamp_of_latest_commit):
+
+2013-02-23  Jason Anderssen  <janderssen@gmail.com>
+
+        Move setAutofilled from TestRunner to WebCore
+        https://bugs.webkit.org/show_bug.cgi?id=110521
+
+        Reviewed by Benjamin Poulain.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+
+2013-02-22  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Upload results to perf.webkit.org in addition to the one specified by --test-results-server
+        https://bugs.webkit.org/show_bug.cgi?id=108577
+
+        Reviewed by Dirk Pranke.
+
+        Upload results to perf.webkit.org using new JSON format as well as the host specified by
+        --test-results-server. The new format is needed to provide extra information perf.webkit.org
+        need such as the subversion commit time and test URLs. This is a temporarily measure until
+        we complete the transition and the old JSON format and the code to upload results to
+        webkit-perf.appspot.com can be deleted.
+
+        This patch adds scm.timestamp_of_latest_commit to obtain the timestamp of the latest commit present
+        in a svn checkout or a git clone. This information is embedded in JSON submitted to perf.webkit.org
+        so that the app can sort performance test results based on the timestamp of the last commit.
+
+        It also changes the repository names returned by port objects to be properly capitalized
+        human readable names such as WebKit instead of lowercased names such as webkit since these names
+        are displayed on perf.webkit.org for humans. Several users of this feature has been updated
+        to explicitly lowercase the names.
+
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.timestamp_of_latest_commit): Added. Obtains the timestamp of the last commit. Unfortunately,
+        git's timestamp granularity is seconds so we're losing some information compared to using a regular
+        subversion client. To make matters worse, git doesn't have any option to show ISO-format timestamp in
+        UTC so we're going to manually fiddle with timezone.
+
+        * Scripts/webkitpy/common/checkout/scm/scm.py:
+        (SCM.timestamp_of_latest_commit): Added.
+
+        * Scripts/webkitpy/common/checkout/scm/scm_mock.py:
+        (MockSCM.timestamp_of_latest_commit): Added.
+
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        (test_timestamp_of_latest_commit): Added a test for Git.timestamp_of_latest_commit.
+
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVN.timestamp_of_latest_commit): Added. With svn, all we need to do is to use --xml option and parse
+        the timestamp which is always in UTC.
+
+        * Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py:
+        (JSONResultsGeneratorBase._insert_generic_metadata): Lowercase the name. Note that the name
+        'chromium' needs to be substituted by 'chrome' for historical reasons.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.repository_paths): Return WebKit instead of webkit as noted above.
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort.repository_paths): Return Chromium instead of chromium as noted above.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner.__init__): Store the current time in UTC as well as in local time.
+        (PerfTestsRunner._collect_tests):
+
+        (PerfTestsRunner._generate_and_show_results): Retrieve both regular output and one for perf.webkit.org,
+        and upload them appropriately.
+
+        (PerfTestsRunner._generate_results_dict): Store WebKit and Chromium revisions at which tests were ran
+        in revisions_for_perf_webkit and construct an output for perf.webkit.org.
+
+        (PerfTestsRunner._datetime_in_ES5_compatible_iso_format): Added.
+
+        (PerfTestsRunner._merge_slave_config_json): Merge slave configuration files into both regular output
+        and one for perf.webkit.org. Here, we prefix each key with "builder" for perf.webkit.org.
+        e.g. "processor" would be renamed to "builderProcessor".
+
+        (PerfTestsRunner._generate_output_files):
+
+        (PerfTestsRunner._upload_json): Added a remote path as an argument since we upload JSONs to /api/report
+        on perf.webkit.org whereas we upload it to /api/test/report on webkit-perf.appspot.com. Also added the code
+        to parse response as JSON when possible since perf.webkit.org returns a JSON response as opposed to
+        webkit-perf.appspot.com which spits out a plaintext response.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (MainTest._test_run_with_json_output.mock_upload_json): Tolerate perf.webkit.org/api/report for now.
+        (MainTest._test_run_with_json_output): Store a UTC time as perftestrunner would do.
+        (MainTest.test_run_with_upload_json_should_generate_perf_webkit_json): Added.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (MainTest.test_upload_json): Moved from itegrationtest.py since it really is a unit test. Also added test
+        cases to parse JSON responses.
+        (MainTest.test_upload_json.MockFileUploader): Refactored.
+        (MainTest.test_upload_json.MockFileUploader.reset): Added.
+        (MainTest.test_upload_json.MockFileUploader.__init__):
+        (MainTest.test_upload_json.MockFileUploader.upload_single_text_file):
+
+2013-02-22  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Update bot config for OpenSource bots to add two new Win7 Debug testers and get rid of WinXP Debug testers.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+
+2013-02-22  Dirk Pranke  <dpranke@chromium.org>
+
+        Unreviewed, rolling out r143794.
+        http://trac.webkit.org/changeset/143794
+        https://bugs.webkit.org/show_bug.cgi?id=110542
+
+        debug linux builds broken?
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-02-22  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] enable the fixed version of freetype on linux
+        https://bugs.webkit.org/show_bug.cgi?id=110542
+
+        Reviewed by Tony Chang.
+
+        Switch to building with a fixed version of FreeType for
+        just DumpRenderTree. This allows us to share one version
+        of pixel baselines for both Lucid and Precise, and run
+        the layout tests in a stock Precise install (instead of a Lucid
+        chroot). Going forward, this approach isolates us from os-level
+        changes to the version of FreeType. Note that Chromium itself
+        still uses the system FreeType and is unaffected by this change.
+        
+        This setting can still be turned off (at compile/gyp-time) by
+        manually setting use_custom_freetype=0.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-02-22  Anders Carlsson  <andersca@apple.com>
+
+        Move pluginLoadPolicy to the page loader client
+        https://bugs.webkit.org/show_bug.cgi?id=110635
+
+        Reviewed by Sam Weinig.
+
+        * MiniBrowser/mac/WK2BrowserWindowController.m:
+        (-[WK2BrowserWindowController awakeFromNib]):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createOtherPage):
+        (WTR::TestController::createWebViewWithOptions):
+
+2013-02-22  Kenneth Russell  <kbr@google.com>
+
+        Unreviewed. Changed gman's primary address for auto-complete in Bugzilla.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-22  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [WTR] Do not dump information about empty subframes.
+        https://bugs.webkit.org/show_bug.cgi?id=110585
+
+        Reviewed by Simon Fraser.
+
+        Follow DumpRenderTree more closely by skipping empty frames
+        (frames which have no document). We are not really interested in
+        showing anything about them.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::dumpDescendantFramesText): Do not print subframe names when they
+        have no associated Document.
+
+2013-02-21  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL][DRT] Do not dump empty frames.
+        https://bugs.webkit.org/show_bug.cgi?id=110474
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Follow the original Mac implementation more closely by skipping
+        empty frames (frames which have no document). We are not really
+        interested in showing anything about them.
+
+        * DumpRenderTree/efl/DumpRenderTree.cpp:
+        (dumpFramesAsText):
+
+2013-02-21  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] support the lucid version of freetype on precise in DRT
+        https://bugs.webkit.org/show_bug.cgi?id=107338
+
+        Reviewed by Tony Chang.
+
+        Modify the DRT build so that we can optionally link against
+        a fixed version of Freetype2. This allows us to share pixel test
+        results across multiple versions of Ubuntu without having to
+        worry about differences in font rendering.
+
+        At the moment this feature is off by default. Eventually it will
+        be on by default on linux.
+
+        Note that this only affects DRT; the regular Chromium binary
+        (and, for now, content_shell) will still use the system version
+        of Freetype.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-02-21  Rouslan Solomakhin  <rouslan@chromium.org>
+
+        [Chromium] Remove the word "cheher" from the list of misspelled words
+        https://bugs.webkit.org/show_bug.cgi?id=110447
+
+        Reviewed by Tony Chang.
+
+        Other platforms do not mark "cheher" as a misspelled word in layout tests.
+        This change is to bring Chromium platform in line with the rest of the
+        platforms.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (WebTestRunner::MockSpellCheck::hasInCache): Changed "cheher" to "wellcome".
+        (WebTestRunner::MockSpellCheck::fillSuggestionList): Removed "cheher" misspelling and "checker" suggestion.
+        (WebTestRunner::MockSpellCheck::initializeIfNeeded): Removed "cheher" misspelling.
+
+2013-02-21  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] document WebTestDelegate and WebTestRunner interfaces
+        https://bugs.webkit.org/show_bug.cgi?id=110472
+
+        Reviewed by Adam Barth.
+
+        Also remove the default implementation of the remaining WebTestDelegate
+        methods now that all embedders provide this interface.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestDelegate):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner):
+
+2013-02-19  Mark Hahnenberg  <mhahnenberg@apple.com>
+
+        Objective-C API: Need a way to use the Objective-C JavaScript API with WebKit
+        https://bugs.webkit.org/show_bug.cgi?id=106059
+
+        Reviewed by Geoffrey Garen.
+
+        Added new tests for the WebKit API portion of the JSC Objective-C API.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/mac/JSContextBackForwardCache1.html: Added.
+        * TestWebKitAPI/Tests/mac/JSContextBackForwardCache2.html: Added.
+        * TestWebKitAPI/Tests/mac/WebViewDidCreateJavaScriptContext.mm: Added.
+        (-[MyConsole log:]):
+        (-[MyConsole printHelloWorld]):
+        (-[MyConsole add:to:]):
+        (-[DidCreateJavaScriptContextFrameLoadDelegate webView:didFinishLoadForFrame:]):
+        (-[DidCreateJavaScriptContextFrameLoadDelegate webView:didCreateJavaScriptContext:forFrame:]):
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST):
+
+2013-02-21  Stephen Chenney  <schenney@chromium.org>
+
+        Unreviewed, add myself as a reviewer
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-21  Jer Noble  <jer.noble@apple.com>
+
+        Unreviewed; add myself to the Media watchlist and update my committers.py setting to Reviewer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-21  Martin Robinson  <mrobinson@igalia.com>
+
+        gtk/DumpRenderTree.cpp is missing <locale.h> include
+        https://bugs.webkit.org/show_bug.cgi?id=109386
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp: Fix the WebKitGTK+ Mac build
+        by include locale.h when we use setlocale.
+
+2013-02-21  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Move feature overriding to the configure phase
+        https://bugs.webkit.org/show_bug.cgi?id=110293
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * Scripts/webkitdirs.pm:
+        (runAutogenForAutotoolsProjectIfNecessary): Rename the feature file to
+        WebKitFeatureOverrides.txt to better match the other filenames used in
+        the new feature processing.
+        * gtk/generate-feature-defines-files: Added. A script which takes as an argument
+        the default features, overrides them with the contents of WebKitFeatureOverrrides.txt
+        and writes WebKitFeatures.txt and WebKitFeatures.h.
+        * gtk/override-feature-defines: Removed.
+
+2013-02-21  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
+
+        [Qt] Remove obsolete DEPENDPATH assignment
+
+        Reviewed by Simon Hausmann
+
+        qmake now adds CONFIG+=depend_includepath by default, making manual
+        DEPENDPATH setup unnecessary.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2013-02-20  Vivek Galatage  <vivekg@webkit.org>
+
+        Unreviewed. Changing primary email id.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-14  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Request WebLayerTreeView for DumpRenderTree via explicit testing path
+        https://bugs.webkit.org/show_bug.cgi?id=109634
+
+        Reviewed by Adrienne Walker.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createOutputSurface):
+        (WebViewHost::initializeLayerTreeView):
+
+2013-02-20  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Re-enable 3D CSS transforms when using build-webkit
+        https://bugs.webkit.org/show_bug.cgi?id=110402
+
+        Reviewed by Xan Lopez.
+
+        * Scripts/webkitperl/FeatureList.pm: Enable 3D rendering by default
+        when building WebKitGTK+.
+
+2013-02-20  Roger Fong  <roger_fong@apple.com>
+
+        Get VS2010 Solution B&I ready.
+        <rdar://problem/1322988>
+
+        Rubberstamped by Timothy Horton.        
+        
+        Add Production configurations.
+        
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj:
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncher.vcxproj:
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherProduction.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherRelease.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeProduction.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeRelease.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiff.vcxproj:
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncher.vcxproj:
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherProduction.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherRelease.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffProduction.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffRelease.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj:
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginProduction.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginRelease.props:
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj:
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIProduction.props: Added.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIRelease.props:
+        * WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj:
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj:
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibProduction.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibRelease.props:
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherProduction.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherRelease.props:
+        * win/record-memory/record-memory.vcxproj:
+        * win/record-memory/record-memoryProduction.props: Added.
+        * win/record-memory/record-memoryRelease.props:
+
+2013-02-20  Dirk Schulze  <krit@webkit.org>
+
+        Enable CANVAS_PATH flag
+        https://bugs.webkit.org/show_bug.cgi?id=108508
+
+        Reviewed by Simon Fraser.
+
+        Enable CANVAS_PATH flag on trunk.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-02-20  Tony Chang  <tony@chromium.org>
+
+        Parse author names with commas in ChangeLogs
+        https://bugs.webkit.org/show_bug.cgi?id=110356
+
+        Reviewed by Dirk Pranke.
+
+        Paweł's name has a comma in it, which was confusing the ChangeLog parser.
+
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        (ChangeLogEntry): Move name splitting regexp into a constant.
+        (ChangeLogEntry._parse_reviewer_text): Use _split_reviewer_names.
+        (ChangeLogEntry._split_reviewer_names): Rename to be more specific.
+        (ChangeLogEntry._split_author_names_with_emails): Rename to be more specific and require emails.
+        (ChangeLogEntry._parse_author_text): Use _split_author_names_with_emails.
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (test_parse_authors): Test case with Paweł's name.
+
+2013-02-15  Dirk Schulze  <krit@webkit.org>
+
+        [Chromium] Add runtime flag for CanvasPath
+        https://bugs.webkit.org/show_bug.cgi?id=109997
+
+        Reviewed by Adam Barth.
+
+        Added runtime flag for Canvas Path. Enabled it by default for TestShell. Otherwise
+        the constructor for Path on DOMWindow would never be activatable, since the script
+        is running after creating the DOMWindow object.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2013-02-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] use a WebTestProxyBase pointer to identify the window we need the history for
+        https://bugs.webkit.org/show_bug.cgi?id=110346
+
+        Reviewed by Adam Barth.
+
+        Using an index is very brittle, as the TestRunner API does not define
+        any ordering of windows.
+
+        Also, make TestRunner::shouldDumpBackForwardList() so content shell can
+        trigger the capturing in the browser process before generating the
+        text dump.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner):
+        (WebTestRunner::WebTestDelegate::captureHistoryForWindow):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::captureTree):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::captureHistoryForWindow):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-02-19  Rouslan Solomakhin  <rouslan@chromium.org>
+
+        [Chromium] Serve spellcheck suggestions for editing/spelling/spelling-changed-text.html from cache
+        https://bugs.webkit.org/show_bug.cgi?id=109220
+
+        Reviewed by Tony Chang.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (WebTestRunner::MockSpellCheck::hasInCache): Added a method to detect whether spellcheck results can be served from cache.
+        (WebTestRunner):
+        (WebTestRunner::MockSpellCheck::fillSuggestionList): Modified to suggest "checker" for the word "cheher".
+        (WebTestRunner::MockSpellCheck::initializeIfNeeded): Modified to mark "cheher" as misspelling.
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::requestCheckingOfText): Modified to serve spellcheck suggestions from cache when possible.
+
+2013-02-20  Xabier Rodriguez Calvar  <calvaris@igalia.com>
+
+        [Gtk] HTML5 Media controls require a design refresh
+        https://bugs.webkit.org/show_bug.cgi?id=83869
+
+        Reviewed by Philippe Normand.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (initializeGtkFontSettings): Added gnome as default icon theme for
+        the DRT.
+        * WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp:
+        (WTR::initializeGtkSettings): Added gnome as default icon theme for
+        the WTR.
+        * gtk/jhbuild.modules: Added gnome-icon-theme-symbolic as external
+        dependency.
+
+2013-02-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move most of the remaining mocks to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=110217
+
+        Reviewed by Nico Weber.
+
+        While most of the functionality provided by these mocks is also
+        available in the content module, there is no straight forward way to
+        inject the mock results required for layout tests.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxy::geolocationClient):
+        (WebTestRunner::WebTestProxy::speechInputController):
+        (WebTestRunner::WebTestProxy::speechRecognizer):
+        (WebTestRunner::WebTestProxy::deviceOrientationClient):
+        (WebTestRunner::WebTestProxy::requestPointerLock):
+        (WebTestRunner::WebTestProxy::requestPointerUnlock):
+        (WebTestRunner::WebTestProxy::isPointerLocked):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.cpp: Renamed from Tools/DumpRenderTree/chromium/MockWebSpeechInputController.cpp.
+        (WebTestRunner::MockWebSpeechInputController::MockWebSpeechInputController):
+        (WebTestRunner):
+        (WebTestRunner::MockWebSpeechInputController::~MockWebSpeechInputController):
+        (WebTestRunner::MockWebSpeechInputController::setDelegate):
+        (WebTestRunner::MockWebSpeechInputController::addMockRecognitionResult):
+        (WebTestRunner::MockWebSpeechInputController::setDumpRect):
+        (WebTestRunner::MockWebSpeechInputController::clearResults):
+        (WebTestRunner::MockWebSpeechInputController::startRecognition):
+        (WebTestRunner::MockWebSpeechInputController::cancelRecognition):
+        (WebTestRunner::MockWebSpeechInputController::stopRecording):
+        (WebTestRunner::MockWebSpeechInputController::speechTaskFired):
+        (WebTestRunner::MockWebSpeechInputController::SpeechTask::SpeechTask):
+        (WebTestRunner::MockWebSpeechInputController::SpeechTask::stop):
+        (WebTestRunner::MockWebSpeechInputController::SpeechTask::runIfValid):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.h: Renamed from Tools/DumpRenderTree/chromium/MockWebSpeechInputController.h.
+        (WebKit):
+        (WebTestRunner):
+        (MockWebSpeechInputController):
+        (WebTestRunner::MockWebSpeechInputController::taskList):
+        (SpeechTask):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.cpp: Renamed from Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp.
+        (WebTestRunner::MockWebSpeechRecognizer::MockWebSpeechRecognizer):
+        (WebTestRunner):
+        (WebTestRunner::MockWebSpeechRecognizer::~MockWebSpeechRecognizer):
+        (WebTestRunner::MockWebSpeechRecognizer::setDelegate):
+        (WebTestRunner::MockWebSpeechRecognizer::start):
+        (WebTestRunner::MockWebSpeechRecognizer::stop):
+        (WebTestRunner::MockWebSpeechRecognizer::abort):
+        (WebTestRunner::MockWebSpeechRecognizer::addMockResult):
+        (WebTestRunner::MockWebSpeechRecognizer::setError):
+        (WebTestRunner::MockWebSpeechRecognizer::startTaskQueue):
+        (WebTestRunner::MockWebSpeechRecognizer::clearTaskQueue):
+        (WebTestRunner::MockWebSpeechRecognizer::StepTask::runIfValid):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.h: Renamed from Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.h.
+        (WebKit):
+        (WebTestRunner):
+        (MockWebSpeechRecognizer):
+        (WebTestRunner::MockWebSpeechRecognizer::wasAborted):
+        (WebTestRunner::MockWebSpeechRecognizer::client):
+        (WebTestRunner::MockWebSpeechRecognizer::handle):
+        (WebTestRunner::MockWebSpeechRecognizer::taskList):
+        (Task):
+        (WebTestRunner::MockWebSpeechRecognizer::Task::Task):
+        (WebTestRunner::MockWebSpeechRecognizer::Task::~Task):
+        (StepTask):
+        (WebTestRunner::MockWebSpeechRecognizer::StepTask::StepTask):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        (WebTestRunner::TestInterfaces::windowOpened):
+        (WebTestRunner):
+        (WebTestRunner::TestInterfaces::windowClosed):
+        (WebTestRunner::TestInterfaces::windowList):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::requestPointerLock):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::requestPointerUnlock):
+        (WebTestRunner::TestRunner::isPointerLocked):
+        (WebTestRunner::TestRunner::didAcquirePointerLockInternal):
+        (WebTestRunner::TestRunner::didNotAcquirePointerLockInternal):
+        (WebTestRunner::TestRunner::didLosePointerLockInternal):
+        (WebTestRunner::TestRunner::windowCount):
+        (WebTestRunner::TestRunner::setMockDeviceOrientation):
+        (WebTestRunner::TestRunner::numberOfPendingGeolocationPermissionRequests):
+        (WebTestRunner::TestRunner::setGeolocationPermission):
+        (WebTestRunner::TestRunner::setMockGeolocationPosition):
+        (WebTestRunner::TestRunner::setMockGeolocationPositionUnavailableError):
+        (WebTestRunner::TestRunner::addMockSpeechInputResult):
+        (WebTestRunner::TestRunner::setMockSpeechInputDumpRect):
+        (WebTestRunner::TestRunner::addMockSpeechRecognitionResult):
+        (WebTestRunner::TestRunner::setMockSpeechRecognitionError):
+        (WebTestRunner::TestRunner::wasMockSpeechRecognitionAborted):
+        (WebTestRunner::TestRunner::didAcquirePointerLock):
+        (WebTestRunner::TestRunner::didNotAcquirePointerLock):
+        (WebTestRunner::TestRunner::didLosePointerLock):
+        (WebTestRunner::TestRunner::setPointerLockWillRespondAsynchronously):
+        (WebTestRunner::TestRunner::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner):
+        (TestRunner):
+        (HostMethodTask):
+        (WebTestRunner::TestRunner::HostMethodTask::HostMethodTask):
+        (WebTestRunner::TestRunner::HostMethodTask::runIfValid):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::setInterfaces):
+        (WebTestRunner::WebTestProxyBase::setDelegate):
+        (WebTestRunner::WebTestProxyBase::reset):
+        (WebTestRunner::WebTestProxyBase::captureTree):
+        (WebTestRunner::WebTestProxyBase::geolocationClientMock):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::deviceOrientationClientMock):
+        (WebTestRunner::WebTestProxyBase::speechInputControllerMock):
+        (WebTestRunner::WebTestProxyBase::speechRecognizerMock):
+        (WebTestRunner::WebTestProxyBase::geolocationClient):
+        (WebTestRunner::WebTestProxyBase::speechInputController):
+        (WebTestRunner::WebTestProxyBase::speechRecognizer):
+        (WebTestRunner::WebTestProxyBase::deviceOrientationClient):
+        (WebTestRunner::WebTestProxyBase::requestPointerLock):
+        (WebTestRunner::WebTestProxyBase::requestPointerUnlock):
+        (WebTestRunner::WebTestProxyBase::isPointerLocked):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::reset):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebKit):
+        (WebViewHost):
+
+2013-02-20  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt] Make debug builds possible on 32bit Linux
+        https://bugs.webkit.org/show_bug.cgi?id=110231
+
+        Reviewed by Tor Arne Vestbø.
+
+        Use the stabs format for debug builds to make the object files
+        a bit smaller so that they can be linked on a 32bit system.
+
+        * qmake/mkspecs/features/unix/default_post.prf:
+
+2013-02-20  Takashi Toyoshima  <toyoshim@chromium.org>
+
+        Unreviewed. Add myself to watch lists.
+
+        * Scripts/webkitpy/common/config/committers.py:
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-19  Joshua Bell  <jsbell@chromium.org>
+
+        Remove warning from run-bindings-tests
+        https://bugs.webkit.org/show_bug.cgi?id=110285
+
+        Reviewed by Kentaro Hara.
+
+        Since wkrev.com/139331 run-bindings-tests has been harmlessly emitting
+        "Unknown option: idlattributesfile". That option was removed from
+        bindings/scripts/preprocess-idls.pl but was still being passed by
+        the test script. Remove it.
+
+        * Scripts/webkitpy/bindings/main.py:
+        (BindingsTests.generate_supplemental_dependency): Remove unused arg.
+
+2013-02-19  Elliott Sprehn  <esprehn@chromium.org>
+
+        Unreviewed. Add myself to watch lists.
+
+        * Scripts/webkitpy/common/config/committers.py:
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-19  Hans Muller  <hmuller@adobe.com>
+
+        Unreviewed, corrected primary email.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-19  Hans Muller  <hmuller@adobe.com>
+
+        Unreviewed. Adding myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-19  Pravin D  <pravind@webkit.org>
+
+        Unreviewed, changing primary email.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-19  Alan Cutter  <alancutter@chromium.org>
+
+        REGRESSION: Sheriffbot is failing to process rollout requests
+        https://bugs.webkit.org/show_bug.cgi?id=106945
+
+        Reviewed by Adam Barth.
+
+        Modified Sheriffbot build script to track the svn repo from git and add bot user details to the git repo config file.
+        This resolves problems when Sheriffbot attempts to perform a rollout request.
+
+        * EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh:
+        * EWSTools/configure-git-svn.sh: Copied from Tools/EWSTools/create-webkit-git.
+        * EWSTools/configure-git-user.sh: Renamed from Tools/EWSTools/create-webkit-git.
+
+2013-02-19  Claudio Saavedra  <csaavedra@igalia.com>
+
+        Unreviewed build fix.
+
+        * efl/jhbuild.modules:
+        * gtk/jhbuild.modules:
+
+        Bump harfbuzz module to 0.9.7. See related bug 110145.
+
+2013-02-19  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Skip the build with a warning if certain tools cannot be found in the PATH
+        https://bugs.webkit.org/show_bug.cgi?id=110215
+
+        Reviewed by Tor Arne Vestbø.
+
+        Check that gperf, python, ruby, perl, bison and flex are in the PATH before
+        continuing the build. Otherwise skip with an error message explaining which
+        programs are missing from the build.
+
+        * qmake/mkspecs/features/configure.prf:
+        * qmake/mkspecs/features/functions.prf:
+
+2013-02-19  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r143319.
+        http://trac.webkit.org/changeset/143319
+        https://bugs.webkit.org/show_bug.cgi?id=110214
+
+        Causes build issues on win32 (Requested by carewolf on
+        #webkit).
+
+        * qmake/mkspecs/features/features.pri:
+
+2013-02-19  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Enable MathML
+        https://bugs.webkit.org/show_bug.cgi?id=110205
+
+        Reviewed by Simon Hausmann.
+
+        * qmake/mkspecs/features/features.pri:
+
+2013-02-17  Andrei Bucur  <abucur@adobe.com>
+
+        Unreviewed. Adding myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-19  Hajime Morrita  <morrita@google.com>
+
+        Unreviewed, updated spelling of my name.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-18  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Unreviewed. Adjust expectations.
+
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp:
+        (TestWebKitAPI::TEST):
+
+2013-02-18  Zan Dobersek  <zdobersek@igalia.com>
+
+        Unreviewed GTK gardening.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner): Skipped the ReloadPageAfterCrash unit test as it is flakily timing out.
+
+2013-02-18  Adenilson Cavalcanti  <cavalcantii@gmail.com>
+
+        [Qt][WK2] Remove duped test name and append new test in project file
+        https://bugs.webkit.org/show_bug.cgi?id=110117
+
+        A new WK2 API test has landed recently (ResizeWindowAfterCrash), this patch will
+        add this test into the runnable test suite and remove a duped test in project file.
+
+        Reviewed by Jocelyn Turcotte.
+
+        * TestWebKitAPI/Tests/WebKit2/WebKit2.pro:
+
+2013-02-18  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] remove log spew from dumpAllBackForwardLists
+        https://bugs.webkit.org/show_bug.cgi?id=110108
+
+        Reviewed by Nico Weber.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+
+2013-02-18  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL][WK2] Disable failing API tests
+        https://bugs.webkit.org/show_bug.cgi?id=110081
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Disable DOMWindowExtensionBasic WK2 test on EFL port as it times out.
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+
+2013-02-18  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Disable the build if certain configure checks fail
+        https://bugs.webkit.org/show_bug.cgi?id=110094
+
+        Reviewed by Tor Arne Vestbø.
+
+        Allow for the build to be skipped (clear out SUBDIRS) if certain
+        configure conditions aren't met.
+
+        * qmake/mkspecs/features/configure.prf:
+
+2013-02-15  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt][WK2] Support WK2 API tests
+        https://bugs.webkit.org/show_bug.cgi?id=109843
+
+        Reviewed by Jocelyn Turcotte.
+
+        * TestWebKitAPI/DerivedSources.pri: Added.
+        * TestWebKitAPI/InjectedBundle.pri: Added.
+        * TestWebKitAPI/PlatformWebView.h:
+        * TestWebKitAPI/TestWebKitAPI.pri:
+        * TestWebKitAPI/TestWebKitAPI.pro:
+        * TestWebKitAPI/Tests/JavaScriptCore/JavaScriptCore.pro: Added.
+        * TestWebKitAPI/Tests/WTF/WTF.pro:
+        * TestWebKitAPI/Tests/WebKit2/WebKit2.pro: Added.
+        * TestWebKitAPI/qt/PlatformUtilitiesQt.cpp:
+        (TestWebKitAPI::Util::sleep):
+        (TestWebKitAPI::Util::createInjectedBundlePath):
+        (TestWebKitAPI::Util::createURLForResource):
+        (TestWebKitAPI::Util::isKeyDown):
+        (Util):
+        * TestWebKitAPI/qt/PlatformWebViewQt.cpp: Added.
+        (TestWebKitAPI):
+        (WrapperWindow):
+        (TestWebKitAPI::WrapperWindow::WrapperWindow):
+        (TestWebKitAPI::WrapperWindow::handleStatusChanged):
+        (TestWebKitAPI::PlatformWebView::PlatformWebView):
+        (TestWebKitAPI::PlatformWebView::~PlatformWebView):
+        (TestWebKitAPI::PlatformWebView::resizeTo):
+        (TestWebKitAPI::PlatformWebView::page):
+        (TestWebKitAPI::PlatformWebView::focus):
+        (TestWebKitAPI::PlatformWebView::simulateSpacebarKeyPress):
+        (TestWebKitAPI::PlatformWebView::simulateAltKeyPress):
+        (TestWebKitAPI::PlatformWebView::simulateMouseMove):
+        (TestWebKitAPI::PlatformWebView::simulateRightClick):
+        * TestWebKitAPI/qt/main.cpp:
+        (addQtWebProcessToPath):
+        (main):
+
+2013-02-18  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL][WK2] Refactor Ewk_Favicon code and stop relying on internal C++ API
+        https://bugs.webkit.org/show_bug.cgi?id=108598
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Update EFL's MiniBrowser to make use of new Ewk_Favicon API.
+
+        * MiniBrowser/efl/main.c:
+        (update_view_favicon):
+        (on_view_favicon_changed):
+        (window_create):
+
+2013-02-18  Zoltan Arvai  <zarvai@inf.u-szeged.hu>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-13  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: reportLeaf method doesn't report the leaf node properly.
+        https://bugs.webkit.org/show_bug.cgi?id=109554
+
+        In some cases leaves have no pointer so with the old schema we can't generate nodeId for them because we
+        can't insert 0 into hashmap. It happens when we call addPrivateBuffer method.
+
+        Drive by fix: I introduced a client interface for the HeapGraphSerializer.
+        It helps me to do the tests for the serializer.
+
+        Reviewed by Yury Semikhatsky.
+
+        It is covered by newly added tests in TestWebKitAPI.
+
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: Added.
+        (TestWebKitAPI):
+        (HeapGraphReceiver):
+        (TestWebKitAPI::HeapGraphReceiver::HeapGraphReceiver):
+        (TestWebKitAPI::HeapGraphReceiver::printGraph):
+        (TestWebKitAPI::HeapGraphReceiver::dumpNodes):
+        (TestWebKitAPI::HeapGraphReceiver::dumpEdges):
+        (TestWebKitAPI::HeapGraphReceiver::dumpBaseToRealNodeId):
+        (TestWebKitAPI::HeapGraphReceiver::dumpStrings):
+        (TestWebKitAPI::HeapGraphReceiver::serializer):
+        (TestWebKitAPI::HeapGraphReceiver::chunkPart):
+        (TestWebKitAPI::HeapGraphReceiver::dumpPart):
+        (TestWebKitAPI::HeapGraphReceiver::stringValue):
+        (TestWebKitAPI::HeapGraphReceiver::intValue):
+        (TestWebKitAPI::HeapGraphReceiver::nodeToString):
+        (TestWebKitAPI::HeapGraphReceiver::edgeToString):
+        (TestWebKitAPI::HeapGraphReceiver::printNode):
+        (Helper):
+        (TestWebKitAPI::Helper::Helper):
+        (TestWebKitAPI::Helper::addNode):
+        (TestWebKitAPI::Helper::addEdge):
+        (TestWebKitAPI::Helper::done):
+        (Object):
+        (TestWebKitAPI::Helper::Object::Object):
+        (TestWebKitAPI::TEST):
+        (Owner):
+        (TestWebKitAPI::Owner::Owner):
+        (TestWebKitAPI::Owner::reportMemoryUsage):
+
+2013-02-18  Ryosuke Niwa  <rniwa@webkit.org>
+
+        WKR build fix. Always use ascii since irclib/ircbot doesn't support unicode.
+
+        * Scripts/webkitpy/tool/commands/newcommitbot.py:
+        (NewCommitBot.next_work_item):
+
+2013-02-17  Kangil Han  <kangil.han@samsung.com>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-17  Alan Cutter  <alancutter@chromium.org>
+
+        GCE EWS bots are all offline
+        https://bugs.webkit.org/show_bug.cgi?id=110069
+
+        Reviewed by Eric Seidel.
+
+        Updated GCE EWS build scripts to use the gcel-10-04-v20130104 image instead of the obsoleted ubuntu-10-04-v20120621.
+        This changed the ephemeral disk path to /dev/sdb and required /etc/hosts to be chmodded to 644.
+
+        * EWSTools/GoogleComputeEngine/build-chromium-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/GoogleComputeEngine/build-cr-linux-debug-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh:
+        * EWSTools/build-vm.sh:
+        * EWSTools/start-queue.sh:
+
+2013-02-18  Eugene Klyuchnikov  <eustas@chromium.org>
+
+        Unreviewed, add myself to commiters.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-17  Dongwoo Joshua Im  <dw.im@samsung.com>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-17  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Fix typo in script.
+
+        * EWSTools/start-queue-win.sh:
+
+2013-02-15  Roger Fong  <roger_fong@apple.com>
+
+        Pass in bot name as parameter to start-queue-win script.
+        https://bugs.webkit.org/show_bug.cgi?id=109998.
+
+        Reviewed by Darin Adler.
+
+        * EWSTools/start-queue-win.sh:
+
+2013-02-18  Byungwoo Lee  <bw80.lee@samsung.com>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-17  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Rename new-commit-bot to WKR to disambiguate it from commit-queue.
+
+        Rubber-stamped by Andreas Kling.
+
+        * Scripts/webkitpy/tool/commands/newcommitbot.py:
+        (NewCommitBot.begin_work_queue):
+
+2013-02-16  Glenn Adams  <glenn@skynav.com>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-16  Ryosuke Niwa  <rniwa@webkit.org>
+
+        new-commit-bot should report the full name of committer and reviewer instead of just nicks
+        https://bugs.webkit.org/show_bug.cgi?id=110040
+
+        Reviewed by Darin Adler.
+
+        Have it report names like "Ryosuke Niwa (rniwa)" instead of just "rniwa".
+
+        * Scripts/webkitpy/tool/commands/newcommitbot.py:
+        (NewCommitBot):
+        (NewCommitBot._summarize_commit_log):
+        * Scripts/webkitpy/tool/commands/newcommitbot_unittest.py:
+
+2013-02-16  Ryosuke Niwa  <rniwa@webkit.org>
+
+        We need a CIA replacement
+        https://bugs.webkit.org/show_bug.cgi?id=110008
+
+        Reviewed by Andreas Kling.
+
+        Added new-commit-bot.
+
+        * Scripts/webkitpy/tool/bot/queueengine.py:
+        (QueueEngine.__init__):
+        (QueueEngine): Made the sleep tiem configurable.
+        (QueueEngine._sleep_message):
+        (QueueEngine._sleep):
+        * Scripts/webkitpy/tool/bot/queueengine_unittest.py:
+        (QueueEngineTest.test_sleep_message):
+        * Scripts/webkitpy/tool/commands/__init__.py:
+        * Scripts/webkitpy/tool/commands/newcommitbot.py: Added.
+        (PingPong): Added. Implements the ping pong protocol.
+        (NewCommitBot):
+        (NewCommitBot.begin_work_queue):
+        (NewCommitBot.work_item_log_path):
+        (NewCommitBot.next_work_item): Update SVN revision and report any new commits made since
+        the last time we checked the head SVN revision.
+        (NewCommitBot.process_work_item):
+        (NewCommitBot._update_checkout): svn up.
+        (NewCommitBot._new_svn_revisions): Returns a range of new revisions.
+        (NewCommitBot._summarize_commit_log): Summarize a commit log to be posted on IRC.
+        (NewCommitBot.handle_unexpected_error):
+        (NewCommitBot.handle_script_error):
+        * Scripts/webkitpy/tool/commands/newcommitbot_unittest.py: Added.
+        (NewCommitBotTest.test_summarize_commit_log_basic): Tests for summarizing non-rollout commits.
+        (NewCommitBotTest.test_summarize_commit_log_rollout): Tests for summarizing rollouts.
+        * Scripts/webkitpy/tool/commands/queues.py:
+        (AbstractQueue.execute):
+        * Scripts/webkitpy/tool/commands/queuestest.py:
+        (MockQueueEngine.__init__):
+        * Scripts/webkitpy/tool/commands/sheriffbot_unittest.py:
+        (SheriffBotTest.test_command_aliases):
+        * Scripts/webkitpy/tool/main.py:
+        (WebKitPatch):
+
+2013-02-16  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] initialize all variables of TestRunner classes
+        https://bugs.webkit.org/show_bug.cgi?id=110013
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+
+2013-02-16  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] destroy the TestPlugin when the destroy() method is invoked.
+        https://bugs.webkit.org/show_bug.cgi?id=110012
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::destroy):
+
+2013-02-15  Adenilson Cavalcanti  <cavalcantii@gmail.com>
+
+        [WK2] Write a test to simulate crashed WebProcess followed by Window resize
+        https://bugs.webkit.org/show_bug.cgi?id=109842
+
+        Reviewed by Benjamin Poulain.
+
+        This new test will kill WebProcess, followed by next resizing the Window. It helps to
+        identify if the port is testing for WebPageProxy data members state (e.g. DrawingArea, Frames)
+        before making calls into them.
+
+        * TestWebKitAPI/GNUmakefile.am:
+        * TestWebKitAPI/PlatformEfl.cmake:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2/ResizeWindowAfterCrash.cpp: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::didFinishLoad):
+        (TestWebKitAPI::didCrash):
+        (TestWebKitAPI::TEST):
+
+2013-02-15  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        Add CString operators for comparison with const char*
+        https://bugs.webkit.org/show_bug.cgi?id=109947
+
+        Reviewed by Darin Adler.
+
+        Add tests for WTF::CString's comparison operators.
+
+        * TestWebKitAPI/Tests/WTF/CString.cpp:
+        (TEST):
+
+2013-02-15  Zan Dobersek  <zdobersek@igalia.com>
+
+        webkit-patch suggest-reviewers should limit itself to 5 reviewers
+        https://bugs.webkit.org/show_bug.cgi?id=107528
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/checkout.py:
+        (Checkout.suggested_reviewers): Iterate through the sorted commit info list,
+        scraping reviewers from the commit information and in the end producing a list
+        of reviewers that's sorted from the most to least recent activity of any reviewer
+        that has reviewed or authored patches for the changed files.
+        * Scripts/webkitpy/tool/commands/queries.py:
+        (SuggestReviewers): Use the SuggestReviewers step instead of reimplementing much of
+        the same logic.
+        (SuggestReviewers._prepare_state): Force the reviewer suggestion because the option
+        defaults to False.
+        * Scripts/webkitpy/tool/steps/suggestreviewers.py:
+        (SuggestReviewers.run): Only list the first five suggested reviewers, now printed out
+        on a single line.  Only ask for CC-ing the suggested reviewers to the bug if the
+        bug ID is located in the command's state.
+
+2013-02-15  Pablo Flouret  <pablof@motorola.com>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-15  Roger Fong  <roger_fong@apple.com>
+
+        Get Win EWS startup script checked into tree so we can make changes to all the EWS bots more easily.
+
+        * EWSTools/start-queue-win.sh: Added.
+
+2013-02-15  Andreas Kling  <akling@apple.com>
+
+        Unbreak webkit-patch -- can't have both Committer and Contributor entry with same e-mail address.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-15  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-15  Ryosuke Niwa  <rniwa@webkit.org>
+
+        NRWT: ML Debug Test bot is timing out after cleaning up ports
+        https://bugs.webkit.org/show_bug.cgi?id=109912
+
+        Reviewed by Simon Fraser.
+
+        Added more debug messgaes to diagnose the issue.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.run):
+
+2013-02-15  Claudio Saavedra  <csaavedra@igalia.com>
+
+        Unreviewed. Add myself as a committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-15  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        Unreviewed. Update Yi Shen, Antonio Gomes and Laszlo Gombos'
+        emails on their behalf.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-15  Andrey Lushnikov  <lushnikov@chromium.org>
+
+        Web Inspector: implement smart braces functionality
+        https://bugs.webkit.org/show_bug.cgi?id=109200
+
+        Reviewed by Pavel Feldman.
+
+        Fix eventSender.keyDown implementation to correctly process opening
+        round brace symbol.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::keyDown):
+
+2013-02-15  Jochen Eisinger  <jochen@chromium.org>
+
+        Speculative build fix for chromium-win.
+
+        Unreviewed build fix.
+
+        Add declarations of the copy constructor and assignment operator to
+        WebTestProxyBase, so VS doesn't try to generate them.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+
+2013-02-15  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Port GCController to JSC C API
+        https://bugs.webkit.org/show_bug.cgi?id=109690
+
+        Reviewed by Benjamin Poulain.
+
+        Rename TestRunner to TestRunnerQt to avoid conflict when
+        including TestRunner.h in the future.
+
+        Replaced QObject based GCController implementation with JSC C API
+        based one.
+
+        * DumpRenderTree/qt/DumpRenderTree.pro:
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::DumpRenderTree::DumpRenderTree):
+        (WebCore::DumpRenderTree::open):
+        (WebCore::DumpRenderTree::initJSObjects):
+        (WebCore::methodNameStringForFailedTest):
+        * DumpRenderTree/qt/DumpRenderTreeQt.h:
+        (WebCore::DumpRenderTree::testRunner):
+        (DumpRenderTree):
+        * DumpRenderTree/qt/GCControllerQt.cpp:
+        (GCController::getJSObjectCount):
+        * DumpRenderTree/qt/GCControllerQt.h: Removed.
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunnerQt::TestRunnerQt):
+        (TestRunnerQt::reset):
+        (TestRunnerQt::dumpNotifications):
+        (TestRunnerQt::processWork):
+        (TestRunnerQt::maybeDump):
+        (TestRunnerQt::dumpAsText):
+        (TestRunnerQt::waitUntilDone):
+        (TestRunnerQt::setViewModeMediaFeature):
+        (TestRunnerQt::webHistoryItemCount):
+        (TestRunnerQt::keepWebHistory):
+        (TestRunnerQt::notifyDone):
+        (TestRunnerQt::windowCount):
+        (TestRunnerQt::grantWebNotificationPermission):
+        (TestRunnerQt::ignoreLegacyWebNotificationPermissionRequests):
+        (TestRunnerQt::denyWebNotificationPermission):
+        (TestRunnerQt::removeAllWebNotificationPermissions):
+        (TestRunnerQt::simulateWebNotificationClick):
+        (TestRunnerQt::simulateLegacyWebNotificationClick):
+        (TestRunnerQt::display):
+        (TestRunnerQt::displayInvalidatedRegion):
+        (TestRunnerQt::clearBackForwardList):
+        (TestRunnerQt::pathToLocalResource):
+        (TestRunnerQt::dumpEditingCallbacks):
+        (TestRunnerQt::dumpFrameLoadCallbacks):
+        (TestRunnerQt::dumpProgressFinishedCallback):
+        (TestRunnerQt::dumpUserGestureInFrameLoadCallbacks):
+        (TestRunnerQt::dumpResourceLoadCallbacks):
+        (TestRunnerQt::dumpResourceResponseMIMETypes):
+        (TestRunnerQt::dumpWillCacheResponse):
+        (TestRunnerQt::dumpHistoryCallbacks):
+        (TestRunnerQt::setWillSendRequestReturnsNullOnRedirect):
+        (TestRunnerQt::setWillSendRequestReturnsNull):
+        (TestRunnerQt::setWillSendRequestClearHeader):
+        (TestRunnerQt::setDeferMainResourceDataLoad):
+        (TestRunnerQt::queueBackNavigation):
+        (TestRunnerQt::queueForwardNavigation):
+        (TestRunnerQt::queueLoad):
+        (TestRunnerQt::queueLoadHTMLString):
+        (TestRunnerQt::queueReload):
+        (TestRunnerQt::queueLoadingScript):
+        (TestRunnerQt::queueNonLoadingScript):
+        (TestRunnerQt::provisionalLoad):
+        (TestRunnerQt::timerEvent):
+        (TestRunnerQt::encodeHostName):
+        (TestRunnerQt::decodeHostName):
+        (TestRunnerQt::closeWebInspector):
+        (TestRunnerQt::setDeveloperExtrasEnabled):
+        (TestRunnerQt::setAsynchronousSpellCheckingEnabled):
+        (TestRunnerQt::showWebInspector):
+        (TestRunnerQt::evaluateInWebInspector):
+        (TestRunnerQt::goBack):
+        (TestRunnerQt::setDefersLoading):
+        (TestRunnerQt::setAllowUniversalAccessFromFileURLs):
+        (TestRunnerQt::setAllowFileAccessFromFileURLs):
+        (TestRunnerQt::setAppCacheMaximumSize):
+        (TestRunnerQt::setAutofilled):
+        (TestRunnerQt::setValueForUser):
+        (TestRunnerQt::setFixedContentsSize):
+        (TestRunnerQt::setPrivateBrowsingEnabled):
+        (TestRunnerQt::setSpatialNavigationEnabled):
+        (TestRunnerQt::setPopupBlockingEnabled):
+        (TestRunnerQt::setPluginsEnabled):
+        (TestRunnerQt::setPOSIXLocale):
+        (TestRunnerQt::setWindowIsKey):
+        (TestRunnerQt::setMainFrameIsFirstResponder):
+        (TestRunnerQt::setJavaScriptCanAccessClipboard):
+        (TestRunnerQt::setXSSAuditorEnabled):
+        (TestRunnerQt::dispatchPendingLoadRequests):
+        (TestRunnerQt::clearAllApplicationCaches):
+        (TestRunnerQt::clearApplicationCacheForOrigin):
+        (TestRunnerQt::localStorageDiskUsageForOrigin):
+        (TestRunnerQt::setApplicationCacheOriginQuota):
+        (TestRunnerQt::applicationCacheDiskUsageForOrigin):
+        (TestRunnerQt::originsWithApplicationCache):
+        (TestRunnerQt::setCacheModel):
+        (TestRunnerQt::setDatabaseQuota):
+        (TestRunnerQt::clearAllDatabases):
+        (TestRunnerQt::addOriginAccessWhitelistEntry):
+        (TestRunnerQt::removeOriginAccessWhitelistEntry):
+        (TestRunnerQt::setCustomPolicyDelegate):
+        (TestRunnerQt::waitForPolicyDelegate):
+        (TestRunnerQt::overridePreference):
+        (TestRunnerQt::setUserStyleSheetLocation):
+        (TestRunnerQt::setCaretBrowsingEnabled):
+        (TestRunnerQt::setAuthorAndUserStylesEnabled):
+        (TestRunnerQt::setUserStyleSheetEnabled):
+        (TestRunnerQt::setDomainRelaxationForbiddenForURLScheme):
+        (TestRunnerQt::callShouldCloseOnWebView):
+        (TestRunnerQt::setScrollbarPolicy):
+        (TestRunnerQt::setSmartInsertDeleteEnabled):
+        (TestRunnerQt::setSelectTrailingWhitespaceEnabled):
+        (TestRunnerQt::execCommand):
+        (TestRunnerQt::isCommandEnabled):
+        (TestRunnerQt::findString):
+        (TestRunnerQt::markerTextForListItem):
+        (TestRunnerQt::computedStyleIncludingVisitedInfo):
+        (TestRunnerQt::elementDoesAutoCompleteForElementWithId):
+        (TestRunnerQt::authenticateSession):
+        (TestRunnerQt::setIconDatabaseEnabled):
+        (TestRunnerQt::setMockDeviceOrientation):
+        (TestRunnerQt::setGeolocationPermission):
+        (TestRunnerQt::numberOfPendingGeolocationPermissionRequests):
+        (TestRunnerQt::setGeolocationPermissionCommon):
+        (TestRunnerQt::setMockGeolocationPositionUnavailableError):
+        (TestRunnerQt::setMockGeolocationPosition):
+        (TestRunnerQt::addMockSpeechInputResult):
+        (TestRunnerQt::setMockSpeechInputDumpRect):
+        (TestRunnerQt::startSpeechInput):
+        (TestRunnerQt::evaluateScriptInIsolatedWorldAndReturnValue):
+        (TestRunnerQt::evaluateScriptInIsolatedWorld):
+        (TestRunnerQt::addUserStyleSheet):
+        (TestRunnerQt::removeAllVisitedLinks):
+        (TestRunnerQt::addURLToRedirect):
+        (TestRunnerQt::originsWithLocalStorage):
+        (TestRunnerQt::deleteAllLocalStorage):
+        (TestRunnerQt::deleteLocalStorageForOrigin):
+        (TestRunnerQt::observeStorageTrackerNotifications):
+        (TestRunnerQt::syncLocalStorage):
+        (TestRunnerQt::resetPageVisibility):
+        (TestRunnerQt::setPageVisibility):
+        (TestRunnerQt::setAutomaticLinkDetectionEnabled):
+        (TestRunnerQt::setTextDirection):
+        (TestRunnerQt::setAlwaysAcceptCookies):
+        (TestRunnerQt::setAlwaysBlockCookies):
+        (TestRunnerQt::setAudioData):
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunnerQt):
+
+2013-02-14  Karen Grunberg  <kareng@chromium.org>
+
+        adding myself as a committer
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-14  Glenn Adams  <glenn@skynav.com>
+
+        new-run-webkit-tests needs a shared TestExpectations between all WebKit ports
+        https://bugs.webkit.org/show_bug.cgi?id=37565
+
+        Introduce generic TestExpectations file that applies as a fallback for all ports, the location of which
+        is LayoutTests/TestExpectations.
+
+        Reviewed by Dirk Pranke.
+
+        * Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py:
+        (FakePort.path_to_generic_test_expectations_file):
+        * Scripts/webkitpy/layout_tests/models/test_expectations.py:
+        (TestExpectations.__init__):
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.path_to_generic_test_expectations_file):
+        (Port):
+        (Port._port_specific_expectations_files):
+        (Port.expectations_files):
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort._port_specific_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidPort._port_specific_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py:
+        (ChromiumPortTestCase.test_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/efl.py:
+        (EflPort._port_specific_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort._port_specific_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest.test_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort._port_specific_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (PortTestCase.test_expectations_ordering):
+        (test_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/qt.py:
+        (QtPort._port_specific_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/qt_unittest.py:
+        (QtPortTest.test_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/win_unittest.py:
+        (WinPortTest.test_expectations_files):
+        * Scripts/webkitpy/tool/commands/queries_unittest.py:
+        (PrintExpectationsTest.test_paths):
+        * Scripts/webkitpy/tool/commands/rebaseline.py:
+        (RebaselineTest._update_expectations_file):
+
+2013-02-14  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move pixel generation logic to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109686
+
+        Reviewed by Stephen White.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::~TestInterfaces):
+        (WebTestRunner::TestInterfaces::setWebView):
+        (WebTestRunner::TestInterfaces::proxy):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (WebTestRunner):
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::setWebView):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::display):
+        (WebTestRunner::TestRunner::displayInvalidatedRegion):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::setWebView):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::reset):
+        (WebTestRunner::WebTestProxyBase::capturePixels):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::paintRect):
+        (WebTestRunner::WebTestProxyBase::paintInvalidatedRegion):
+        (WebTestRunner::WebTestProxyBase::paintPagesWithBoundaries):
+        (WebTestRunner::WebTestProxyBase::canvas):
+        (WebTestRunner::WebTestProxyBase::displayRepaintMask):
+        (WebTestRunner::WebTestProxyBase::display):
+        (WebTestRunner::WebTestProxyBase::displayInvalidatedRegion):
+        (WebTestRunner::WebTestProxyBase::discardBackingStore):
+        (WebTestRunner::WebTestProxyBase::setWindowRect):
+        (WebTestRunner::WebTestProxyBase::userMediaClient):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::createMainWindow):
+        (TestShell::~TestShell):
+        (TestShell::showDevTools):
+        (TestShell::closeDevTools):
+        (TestShell::dump):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::setWindowRect):
+        (WebViewHost::setDeviceScaleFactor):
+        (WebViewHost::reset):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-02-14  Tony Chang  <tony@chromium.org>
+
+        Unreviewed, set svn:eol-style native for .sln, .vcproj, and .vsprops files.
+        https://bugs.webkit.org/show_bug.cgi?id=96934
+
+        * CLWrapper/CLWrapper.sln: Modified property svn:eol-style.
+        * DumpRenderTree/DumpRenderTree.sln: Modified property svn:eol-style.
+        * DumpRenderTree/win/DumpRenderTreeLauncherCommon.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/DumpRenderTreeLauncherDebug.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/DumpRenderTreeLauncherDebugAll.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/DumpRenderTreeLauncherDebugCairoCFLite.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/DumpRenderTreeLauncherProduction.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/DumpRenderTreeLauncherRelease.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/DumpRenderTreeLauncherReleaseCairoCFLite.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffLauncherCommon.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffLauncherDebug.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffLauncherDebugAll.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffLauncherDebugCairoCFLite.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffLauncherProduction.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffLauncherRelease.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffLauncherReleaseCairoCFLite.vsprops: Added property svn:eol-style.
+        * DumpRenderTree/win/ImageDiffWinCairoCommon.vsprops: Added property svn:eol-style.
+        * MIDLWrapper/MIDLWrapper.sln: Modified property svn:eol-style.
+        * MiniBrowser/Configurations/MiniBrowserLauncherCommon.vsprops: Added property svn:eol-style.
+        * MiniBrowser/Configurations/MiniBrowserLauncherDebug.vsprops: Added property svn:eol-style.
+        * MiniBrowser/Configurations/MiniBrowserLauncherDebugAll.vsprops: Added property svn:eol-style.
+        * MiniBrowser/Configurations/MiniBrowserLauncherDebugCairoCFLite.vsprops: Added property svn:eol-style.
+        * MiniBrowser/Configurations/MiniBrowserLauncherProduction.vsprops: Added property svn:eol-style.
+        * MiniBrowser/Configurations/MiniBrowserLauncherRelease.vsprops: Added property svn:eol-style.
+        * MiniBrowser/Configurations/MiniBrowserLauncherReleaseCairoCFLite.vsprops: Added property svn:eol-style.
+        * TestWebKitAPI/Configurations/TestWebKitAPICFNetwork.vsprops: Added property svn:eol-style.
+        * TestWebKitAPI/Configurations/TestWebKitAPIDebug.vsprops: Added property svn:eol-style.
+        * TestWebKitAPI/Configurations/TestWebKitAPIDebugAll.vsprops: Added property svn:eol-style.
+        * TestWebKitAPI/Configurations/TestWebKitAPIDebugCairoCFLite.vsprops: Added property svn:eol-style.
+        * TestWebKitAPI/Configurations/TestWebKitAPIInjectedBundleCommon.vsprops: Added property svn:eol-style.
+        * TestWebKitAPI/Configurations/TestWebKitAPIRelease.vsprops: Added property svn:eol-style.
+        * TestWebKitAPI/Configurations/TestWebKitAPIReleaseCairoCFLite.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/Configurations/WebKitTestRunnerCoreGraphics.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/WebKitTestRunner.sln: Modified property svn:eol-style.
+        * WebKitTestRunner/win/WebKitTestRunnerLauncherCommon.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/win/WebKitTestRunnerLauncherDebug.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/win/WebKitTestRunnerLauncherDebugAll.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/win/WebKitTestRunnerLauncherDebugCairoCFLite.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/win/WebKitTestRunnerLauncherProduction.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/win/WebKitTestRunnerLauncherRelease.vsprops: Added property svn:eol-style.
+        * WebKitTestRunner/win/WebKitTestRunnerLauncherReleaseCairoCFLite.vsprops: Added property svn:eol-style.
+        * WinLauncher/WinLauncherLauncherCommon.vsprops: Added property svn:eol-style.
+        * WinLauncher/WinLauncherLauncherDebug.vsprops: Added property svn:eol-style.
+        * WinLauncher/WinLauncherLauncherDebugAll.vsprops: Added property svn:eol-style.
+        * WinLauncher/WinLauncherLauncherDebugCairoCFLite.vsprops: Added property svn:eol-style.
+        * WinLauncher/WinLauncherLauncherProduction.vsprops: Added property svn:eol-style.
+        * WinLauncher/WinLauncherLauncherRelease.vsprops: Added property svn:eol-style.
+        * WinLauncher/WinLauncherLauncherReleaseCairoCFLite.vsprops: Added property svn:eol-style.
+
+2013-02-14  Tony Chang  <tony@chromium.org>
+
+        Unreviewed, set svn:eol-style CRLF for .sln files.
+
+        * CLWrapper/CLWrapper.sln: Modified property svn:eol-style.
+        * DumpRenderTree/DumpRenderTree.sln: Modified property svn:eol-style.
+        * MIDLWrapper/MIDLWrapper.sln: Modified property svn:eol-style.
+        * WebKitTestRunner/WebKitTestRunner.sln: Modified property svn:eol-style.
+
+2013-02-14  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Errors when building WebKit2 with Clang
+        https://bugs.webkit.org/show_bug.cgi?id=109603
+
+        Reviewed by Alexey Proskuryakov.
+
+        * WebKitTestRunner/gtk/PlatformWebViewGtk.cpp:
+        (WTR::PlatformWebView::resizeTo): Cast the width and height parameters to the integer
+        type when constructing the GtkAllocation.
+
+        * CLWrapper/CLWrapper.sln: Modified property svn:eol-style.
+        * DumpRenderTree/DumpRenderTree.sln: Modified property svn:eol-style.
+        * MIDLWrapper/MIDLWrapper.sln: Modified property svn:eol-style.
+        * WebKitTestRunner/WebKitTestRunner.sln: Modified property svn:eol-style.
+
+2013-02-14  Roger Fong  <roger_fong@apple.com>
+
+        Add eol-style=native to solution files. Add a new solution file.
+
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree.sln: Added property svn:eol-style.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj: Added property svn:eol-style. Modified property svn:ignore.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.sln: Added.
+
+2013-02-14  Mario Sanchez Prada  <mario.prada@samsung.com>
+
+        [GTK] Missing call to g_object_ref while retrieving accessible table cells
+        https://bugs.webkit.org/show_bug.cgi?id=106903
+
+        Reviewed by Martin Robinson.
+
+        Both DRT and WKTR need to call g_object_unref() now that an extra
+        reference is added in the implementation of atk_table_ref_at().
+
+        * DumpRenderTree/atk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::cellForColumnAndRow): Call g_object_unref
+        before returning the new instance of AccessibilityUIElement.
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::AccessibilityUIElement::cellForColumnAndRow): Ditto.
+
+2013-02-14  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r142841.
+        http://trac.webkit.org/changeset/142841
+        https://bugs.webkit.org/show_bug.cgi?id=109791
+
+        Caused webkit_unit_tests to crash on chromium bots. (Requested
+        by atwilson_ on #webkit).
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createOutputSurface):
+        (WebViewHost::initializeLayerTreeView):
+
+2013-02-13  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL][jhbuild] Silence GSettings-related warning.
+        https://bugs.webkit.org/show_bug.cgi?id=109749
+
+        Reviewed by Martin Robinson.
+
+        Apply the same change done to the GTK+ port in r109127; this
+        silences the warnings printed by glib about the memory GSettings
+        backend being used.
+
+        Not only does this make the bots (as well as manual runs of, say,
+        WebKitTestRunner) much more silent, but it also removes an stderr
+        line (which run-perf-tests considers as a failure).
+
+        * Scripts/webkitpy/layout_tests/port/efl.py:
+        (EflPort.setup_environ_for_server): Explicitly set the
+        GSETTINGS_BACKEND environment variable to "memory".
+
+2013-02-14  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move mock notification presenter to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109706
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner::WebTestProxy::notificationPresenter):
+        * DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.cpp: Renamed from Tools/DumpRenderTree/chromium/NotificationPresenter.cpp.
+        (WebTestRunner::NotificationPresenter::NotificationPresenter):
+        (WebTestRunner):
+        (WebTestRunner::NotificationPresenter::~NotificationPresenter):
+        (WebTestRunner::NotificationPresenter::grantPermission):
+        (WebTestRunner::NotificationPresenter::simulateClick):
+        (WebTestRunner::NotificationPresenter::show):
+        (WebTestRunner::NotificationPresenter::cancel):
+        (WebTestRunner::NotificationPresenter::objectDestroyed):
+        (WebTestRunner::NotificationPresenter::checkPermission):
+        (WebTestRunner::NotificationPresenter::requestPermission):
+        * DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.h: Renamed from Tools/DumpRenderTree/chromium/NotificationPresenter.h.
+        (WebTestRunner):
+        (NotificationPresenter):
+        (WebTestRunner::NotificationPresenter::setDelegate):
+        (WebTestRunner::NotificationPresenter::reset):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::setDelegate):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::notificationPresenter):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::grantWebNotificationPermission):
+        (WebTestRunner::TestRunner::simulateLegacyWebNotificationClick):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebKit):
+        (WebTestRunner):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::notificationPresenter):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        (TestShell::resetTestController):
+        * DumpRenderTree/chromium/TestShell.h:
+        (WebKit):
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-02-13  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Add separate DumpRenderTree VS2010 solution file.
+
+        * DumpRenderTree/DumpRenderTree.vcxproj: Added property svn:ignore.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree.sln: Added.
+
+2013-02-12  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Request WebLayerTreeView for DumpRenderTree via explicit testing path
+        https://bugs.webkit.org/show_bug.cgi?id=109634
+
+        Reviewed by Adrienne Walker.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createOutputSurface):
+        (WebViewHost::initializeLayerTreeView):
+
+2013-02-13  David Farler  <dfarler@apple.com>
+
+        TestWebKitAPI fails to build for iphonesimulator: 'CFNetwork/CFNetworkDefs.h' file not found
+        https://bugs.webkit.org/show_bug.cgi?id=109766
+
+        Reviewed by David Kilzer.
+
+        * TestWebKitAPI/Configurations/Base.xcconfig:
+        - Don't search Mac OS X header search paths when building on iOS
+
+2013-02-13  Zan Dobersek  <zdobersek@igalia.com>
+
+        The 'global isinf/isnan' compiler quirk required when using clang with libstdc++
+        https://bugs.webkit.org/show_bug.cgi?id=109325
+
+        Reviewed by Anders Carlsson.
+
+        Prefix calls to the isinf and isnan methods with std::, declaring we want to use the
+        two methods as they're provided by the C++ standard library being used.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (setAppCacheMaximumSizeCallback):
+        (setApplicationCacheOriginQuotaCallback):
+        (setDatabaseQuotaCallback):
+
+2013-02-13  Alan Cutter  <alancutter@chromium.org>
+
+        cr-linux debug should use clang and maybe be a components build
+        https://bugs.webkit.org/show_bug.cgi?id=108512
+
+        Reviewed by Adam Barth.
+
+        Modified GCE cr-linux-debug-ews bot build scripts to configure clang over gcc for build performance.
+        Build bots will update clang with each bot cycle.
+        Updated GCE image paths to suit gcutil 1.6.1.
+
+        * EWSTools/GoogleComputeEngine/build-chromium-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/GoogleComputeEngine/build-cr-linux-debug-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh:
+        * EWSTools/configure-clang-linux.sh: Copied from Tools/EWSTools/GoogleComputeEngine/build-chromium-ews.sh.
+        * EWSTools/start-queue.sh:
+
+2013-02-13  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r142747.
+        http://trac.webkit.org/changeset/142747
+        https://bugs.webkit.org/show_bug.cgi?id=109746
+
+        broke component build (Requested by alecf_gardening on
+        #webkit).
+
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: Removed.
+
+2013-02-13  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] fix TestRunner build with enable_webrtc=0
+        https://bugs.webkit.org/show_bug.cgi?id=109700
+
+        Reviewed by Tony Chang.
+
+        We can't use ENABLE() macros in the TestRunner library, however,
+        ENABLE_WEBRTC is defined by build/common.gypi, so we can use it.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockConstraints.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::userMediaClient):
+        * DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.cpp:
+
+2013-02-12  Roger Fong  <roger_fong@apple.com>
+
+        TestWebKitAPI and record-memory projects and property sheets for VS2010.
+        https://bugs.webkit.org/show_bug.cgi?id=107034
+
+        Reviewed by Brent Fulgham.
+
+        * TestWebKitAPI/TestWebKitAPI.vcxproj: Added.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj: Added.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters: Added.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPostBuild.cmd: Copied from Tools/TestWebKitAPI/win/TestWebKitAPIPostBuild.cmd.
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPreBuild.cmd: Copied from Tools/TestWebKitAPI/win/TestWebKitAPIPreBuild.cmd.
+        * win/record-memory: Added.
+        * win/record-memory/main.cpp: Copied from Tools/record-memory-win/main.cpp.
+        * win/record-memory/record-memory.vcxproj: Added.
+        * win/record-memory/record-memory.vcxproj.filters: Added.
+        * win/record-memory/record-memoryCommon.props: Added.
+        * win/record-memory/record-memoryDebug.props: Added.
+        * win/record-memory/record-memoryRelease.props: Added.
+
+2013-02-13  Tommy Widenflycht  <tommyw@google.com>
+
+        MediaStream API: Use the source id when creating new tracks
+        https://bugs.webkit.org/show_bug.cgi?id=109688
+
+        Reviewed by Adam Barth.
+
+        Switching mock to new API.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.cpp:
+        (WebTestRunner::WebUserMediaClientMock::requestUserMedia):
+
+2013-02-13  Brent Fulgham  <bfulgham@webkit.org>
+
+        [Windows] Unreviewed VS2010 fix to add $(ConfigurationBuildDir)/private
+        to include paths, to match VS2005 build behavior.
+
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherCommon.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherCommon.props:
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginCommon.props:
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherCommon.props:
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibCommon.props:
+
+2013-02-13  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r142736.
+        http://trac.webkit.org/changeset/142736
+        https://bugs.webkit.org/show_bug.cgi?id=109716
+
+        Broke ABI, nightly builds crash on launch (Requested by ap on
+        #webkit).
+
+        * MiniBrowser/mac/WK2BrowserWindowController.m:
+        (-[WK2BrowserWindowController awakeFromNib]):
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions):
+
+2013-02-13  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [WK2][EFL][WTR] Regression(r141836): WTR crashes on exit
+        https://bugs.webkit.org/show_bug.cgi?id=109456
+
+        Reviewed by Anders Carlsson.
+
+        WebView instance must not live longer than EwkView, as EwkView owns
+        objects that page proxy refers to, doing otherwise leads to a crash.
+
+        Test controller has own ptr containing WebView. Invoking of ewk_shutdown()
+        leads to evas objects deletion. So, the problem was that test controller was
+        deleted after ewk_shutdown() had been called in main() function causing
+        crashes on WTR exit.
+
+        The patch introduces a scope for test controller so that it is deleted first.
+
+        * WebKitTestRunner/efl/main.cpp:
+        (main):
+
+2013-02-13  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: reportLeaf method doesn't report the leaf node properly.
+        https://bugs.webkit.org/show_bug.cgi?id=109554
+
+        In some cases leaves have no pointer so with the old schema we can't generate nodeId for them because we
+        can't insert 0 into hashmap. It happens when we call addPrivateBuffer method.
+
+        Drive by fix: I introduced a client interface for the HeapGraphSerializer.
+        It helps me to do the tests for the serializer.
+
+        Reviewed by Yury Semikhatsky.
+
+        It is covered by newly added tests in TestWebKitAPI.
+
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: Added.
+        (TestWebKitAPI):
+        (HeapGraphReceiver):
+        (TestWebKitAPI::HeapGraphReceiver::HeapGraphReceiver):
+        (TestWebKitAPI::HeapGraphReceiver::printGraph):
+        (TestWebKitAPI::HeapGraphReceiver::dumpNodes):
+        (TestWebKitAPI::HeapGraphReceiver::dumpEdges):
+        (TestWebKitAPI::HeapGraphReceiver::dumpBaseToRealNodeId):
+        (TestWebKitAPI::HeapGraphReceiver::dumpStrings):
+        (TestWebKitAPI::HeapGraphReceiver::serializer):
+        (TestWebKitAPI::HeapGraphReceiver::chunkPart):
+        (TestWebKitAPI::HeapGraphReceiver::dumpPart):
+        (TestWebKitAPI::HeapGraphReceiver::stringValue):
+        (TestWebKitAPI::HeapGraphReceiver::intValue):
+        (TestWebKitAPI::HeapGraphReceiver::nodeToString):
+        (TestWebKitAPI::HeapGraphReceiver::edgeToString):
+        (TestWebKitAPI::HeapGraphReceiver::printNode):
+        (Helper):
+        (TestWebKitAPI::Helper::Helper):
+        (TestWebKitAPI::Helper::addNode):
+        (TestWebKitAPI::Helper::addEdge):
+        (TestWebKitAPI::Helper::done):
+        (Object):
+        (TestWebKitAPI::Helper::Object::Object):
+        (TestWebKitAPI::TEST):
+        (Owner):
+        (TestWebKitAPI::Owner::Owner):
+        (TestWebKitAPI::Owner::reportMemoryUsage):
+
+2013-02-13  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
+
+        [WK2] Remove web intents callbacks
+        https://bugs.webkit.org/show_bug.cgi?id=109654
+
+        Reviewed by Benjamin Poulain.
+
+        Web intents was removed by r142549.
+
+        * MiniBrowser/mac/WK2BrowserWindowController.m:
+        (-[WK2BrowserWindowController awakeFromNib]):
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions):
+
+2013-02-12  Adenilson Cavalcanti  <cavalcantii@gmail.com>
+
+        [WK2] Page reloading will crash UIProcess after WebProcess was killed
+        https://bugs.webkit.org/show_bug.cgi?id=109305
+
+        Reviewed by Benjamin Poulain.
+
+        Adding a new test to simulate the case of WebProcess crash followed by a trying
+        to load a new page.
+
+        * TestWebKitAPI/GNUmakefile.am:
+        * TestWebKitAPI/PlatformEfl.cmake:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2/ReloadPageAfterCrash.cpp: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::didFinishLoad):
+        (TestWebKitAPI::TEST):
+
+2013-02-11  Brent Fulgham  <bfulgham@webkit.org>
+
+        Update WebKitDirs.pm for new Windows paths
+        https://bugs.webkit.org/show_bug.cgi?id=107714
+
+        Reviewed by Daniel Bates.
+
+        * Scripts/webkitdirs.pm: For each existing Windows environment
+        variable, also include creation of the 'new' variables. The
+        'old' variables will be removed in a future update.
+        (windowsSourceSourceDir): New helper routine to return the
+        actual 'Source' folder of the WebKit source tree.
+
+2013-02-12  Alec Flett  <alecflett@chromium.org>
+
+        Fix signedness in WebTestProxy
+        https://bugs.webkit.org/show_bug.cgi?id=109623
+
+        Reviewed by Adam Barth.
+
+        Fix signedness problem, using size_t instead of int.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+
+2013-02-12  Raymond Toy  <rtoy@google.com>
+
+        Add alias
+        https://bugs.webkit.org/show_bug.cgi?id=109621
+
+        No review needed.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-12  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move text dump generation to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109575
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebKit):
+        (WebTestRunner::WebTestDelegate::captureHistoryForWindow):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.cpp: Copied from Tools/DumpRenderTree/chromium/TestRunner/src/TestCommon.h.
+        (WebTestRunner::normalizeLayoutTestURL):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::checkResponseMimeType):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::shouldDumpAsText):
+        (WebTestRunner::TestRunner::shouldGeneratePixelResults):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebPermissions.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::captureTree):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::dump):
+        (TestShell::captureHistoryForWindow):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::captureHistoryForWindow):
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-02-12  Jessie Berlin  <jberlin@apple.com>
+
+        Rollout r142618, it broke all the Mac builds.
+
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: Removed.
+        * TestWebKitAPI/win/TestWebKitAPI.vcproj:
+
+2013-02-12  Yury Semikhatsky  <yurys@chromium.org>
+
+        Unreviewed. Fix Chromium compilation after r142618.
+
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp:
+        (TestWebKitAPI::HeapGraphReceiver::printNode):
+
+2013-02-12  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Add an optional moduleset with hard to get packages (including libsecret)
+        https://bugs.webkit.org/show_bug.cgi?id=109195
+
+        Reviewed by Philippe Normand.
+
+        Add an optional moduleset that includes libsecret. This moduleset will
+        be used to install some annoyingly hard to obtain dependencies on older
+        distributions.
+
+        * gtk/jhbuild-optional.modules: Added.
+        * gtk/jhbuild.modules: Add a reference to the new moduleset file.
+
+2013-02-12  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: reportLeaf method doesn't report the leaf node properly.
+        https://bugs.webkit.org/show_bug.cgi?id=109554
+
+        In some cases leaves have no pointer. As example when we report a leaf via addPrivateBuffer.
+        This patch has new set of tests for HeapGraphSerializer.
+
+        Reviewed by Yury Semikhatsky.
+
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: Added.
+        * TestWebKitAPI/win/TestWebKitAPI.vcproj:
+
+2013-02-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        Unreviewed followup to r142606, the EFL port also enables the CSS image-set
+        feature so the new configuration option's default value should reflect that.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-02-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Enable CSS Variables feature in development builds
+        https://bugs.webkit.org/show_bug.cgi?id=109474
+
+        Reviewed by Martin Robinson.
+
+        * Scripts/webkitperl/FeatureList.pm: Enable the feature on development
+        builds of the GTK port.
+
+2013-02-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Enable CSS image-set support in development builds
+        https://bugs.webkit.org/show_bug.cgi?id=109475
+
+        Reviewed by Martin Robinson.
+
+        * Scripts/webkitperl/FeatureList.pm: Add the configuration option for the feature.
+        Note that the Mac port also enables the feature but does so in Platform.h as the feature
+        is also enabled for the iOS port which can't at the moment be detected via webkitperl.
+
+2013-02-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Enable DOM4 events constructors in development builds
+        https://bugs.webkit.org/show_bug.cgi?id=109471
+
+        Reviewed by Martin Robinson.
+
+        * Scripts/webkitperl/FeatureList.pm: Enable the feature for the GTK port as well.
+
+2013-02-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        Remove unnecessary variables from FeatureList.pm
+        https://bugs.webkit.org/show_bug.cgi?id=109558
+
+        Reviewed by Daniel Bates.
+
+        A small cleanup, removing unused variables for which the related configuration
+        options were already removed.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-02-12  Zan Dobersek  <zdobersek@igalia.com>
+
+        Remove ENABLE_XHR_RESPONSE_BLOB handling from various build systems
+        https://bugs.webkit.org/show_bug.cgi?id=109481
+
+        Reviewed by Daniel Bates.
+
+        The ENABLE_XHR_RESPONSE_BLOB feature define was removed from the code
+        back in r120574. There are still occurrences of it in various build systems
+        which should all be removed as they are useless.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-02-12  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move webrtc mocks to testrunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109041
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (WebKitSupportTestEnvironment):
+        (WebKitSupportTestEnvironment::mockPlatform):
+        (main):
+        * DumpRenderTree/chromium/MockWebKitPlatformSupport.cpp:
+        (MockWebKitPlatformSupport::setInterfaces):
+        (MockWebKitPlatformSupport::createMediaStreamCenter):
+        (MockWebKitPlatformSupport::createRTCPeerConnectionHandler):
+        * DumpRenderTree/chromium/MockWebKitPlatformSupport.h:
+        (WebTestRunner):
+        (MockWebKitPlatformSupport):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxy::showContextMenu):
+        (WebTestRunner::WebTestProxy::userMediaClient):
+        * DumpRenderTree/chromium/TestRunner/src/MockConstraints.cpp: Renamed from Tools/DumpRenderTree/chromium/MockConstraints.cpp.
+        (WebTestRunner::MockConstraints::verifyConstraints):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockConstraints.h: Renamed from Tools/DumpRenderTree/chromium/MockConstraints.h.
+        (WebKit):
+        (WebTestRunner):
+        (MockConstraints):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.cpp: Renamed from Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp.
+        (WebTestRunner):
+        (WebTestRunner::MockWebMediaStreamCenter::MockWebMediaStreamCenter):
+        (WebTestRunner::MockWebMediaStreamCenter::queryMediaStreamSources):
+        (WebTestRunner::MockWebMediaStreamCenter::didEnableMediaStreamTrack):
+        (WebTestRunner::MockWebMediaStreamCenter::didDisableMediaStreamTrack):
+        (WebTestRunner::MockWebMediaStreamCenter::didAddMediaStreamTrack):
+        (WebTestRunner::MockWebMediaStreamCenter::didRemoveMediaStreamTrack):
+        (WebTestRunner::MockWebMediaStreamCenter::didStopLocalMediaStream):
+        (MockWebAudioDestinationConsumer):
+        (WebTestRunner::MockWebAudioDestinationConsumer::~MockWebAudioDestinationConsumer):
+        (WebTestRunner::MockWebMediaStreamCenter::didCreateMediaStream):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.h: Renamed from Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.h.
+        (WebKit):
+        (WebTestRunner):
+        (MockWebMediaStreamCenter):
+        (WebTestRunner::MockWebMediaStreamCenter::MockWebMediaStreamCenter):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.cpp: Renamed from Tools/DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.cpp.
+        (WebTestRunner):
+        (DTMFSenderToneTask):
+        (WebTestRunner::DTMFSenderToneTask::DTMFSenderToneTask):
+        (WebTestRunner::MockWebRTCDTMFSenderHandler::MockWebRTCDTMFSenderHandler):
+        (WebTestRunner::MockWebRTCDTMFSenderHandler::setClient):
+        (WebTestRunner::MockWebRTCDTMFSenderHandler::currentToneBuffer):
+        (WebTestRunner::MockWebRTCDTMFSenderHandler::canInsertDTMF):
+        (WebTestRunner::MockWebRTCDTMFSenderHandler::insertDTMF):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.h: Renamed from Tools/DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.h.
+        (WebTestRunner):
+        (MockWebRTCDTMFSenderHandler):
+        (WebTestRunner::MockWebRTCDTMFSenderHandler::taskList):
+        (WebTestRunner::MockWebRTCDTMFSenderHandler::clearToneBuffer):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.cpp: Renamed from Tools/DumpRenderTree/chromium/MockWebRTCDataChannelHandler.cpp.
+        (WebTestRunner):
+        (DataChannelReadyStateTask):
+        (WebTestRunner::DataChannelReadyStateTask::DataChannelReadyStateTask):
+        (WebTestRunner::MockWebRTCDataChannelHandler::MockWebRTCDataChannelHandler):
+        (WebTestRunner::MockWebRTCDataChannelHandler::setClient):
+        (WebTestRunner::MockWebRTCDataChannelHandler::bufferedAmount):
+        (WebTestRunner::MockWebRTCDataChannelHandler::sendStringData):
+        (WebTestRunner::MockWebRTCDataChannelHandler::sendRawData):
+        (WebTestRunner::MockWebRTCDataChannelHandler::close):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.h: Renamed from Tools/DumpRenderTree/chromium/MockWebRTCDataChannelHandler.h.
+        (WebTestRunner):
+        (MockWebRTCDataChannelHandler):
+        (WebTestRunner::MockWebRTCDataChannelHandler::taskList):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp: Renamed from Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp.
+        (WebTestRunner):
+        (RTCSessionDescriptionRequestSuccededTask):
+        (WebTestRunner::RTCSessionDescriptionRequestSuccededTask::RTCSessionDescriptionRequestSuccededTask):
+        (RTCSessionDescriptionRequestFailedTask):
+        (WebTestRunner::RTCSessionDescriptionRequestFailedTask::RTCSessionDescriptionRequestFailedTask):
+        (RTCStatsRequestSucceededTask):
+        (WebTestRunner::RTCStatsRequestSucceededTask::RTCStatsRequestSucceededTask):
+        (RTCVoidRequestTask):
+        (WebTestRunner::RTCVoidRequestTask::RTCVoidRequestTask):
+        (RTCPeerConnectionStateTask):
+        (WebTestRunner::RTCPeerConnectionStateTask::RTCPeerConnectionStateTask):
+        (RemoteDataChannelTask):
+        (WebTestRunner::RemoteDataChannelTask::RemoteDataChannelTask):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::initialize):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::createOffer):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::createAnswer):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::setLocalDescription):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::setRemoteDescription):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::localDescription):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::remoteDescription):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::updateICE):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::addICECandidate):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::addStream):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::removeStream):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::getStats):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::createDataChannel):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::createDTMFSender):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::stop):
+        * DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.h: Renamed from Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h.
+        (WebKit):
+        (WebTestRunner):
+        (MockWebRTCPeerConnectionHandler):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::taskList):
+        (WebTestRunner::MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        (WebTestRunner::TestInterfaces::setDelegate):
+        (WebTestRunner::TestInterfaces::delegate):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::createMediaStreamCenter):
+        (WebTestRunner):
+        (WebTestRunner::WebTestInterfaces::createWebRTCPeerConnectionHandler):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::userMediaClient):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.cpp: Renamed from Tools/DumpRenderTree/chromium/WebUserMediaClientMock.cpp.
+        (WebTestRunner):
+        (UserMediaRequestTask):
+        (WebTestRunner::UserMediaRequestTask::UserMediaRequestTask):
+        (MockExtraData):
+        (WebTestRunner::WebUserMediaClientMock::WebUserMediaClientMock):
+        (WebTestRunner::WebUserMediaClientMock::requestUserMedia):
+        (WebTestRunner::WebUserMediaClientMock::cancelUserMediaRequest):
+        * DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.h: Renamed from Tools/DumpRenderTree/chromium/WebUserMediaClientMock.h.
+        (WebTestRunner):
+        (WebUserMediaClientMock):
+        (WebTestRunner::WebUserMediaClientMock::~WebUserMediaClientMock):
+        (WebTestRunner::WebUserMediaClientMock::taskList):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-02-11  Timothy Loh  <timloh@chromium.com>
+
+        webkit-patch upload regenerates the WebCore ChangeLog every time it's called
+        https://bugs.webkit.org/show_bug.cgi?id=108983
+
+        Reviewed by Ryosuke Niwa.
+
+        This patch puts the behaviour from Bug 74358 behind the flag (default=OFF)
+        `--update-changelogs', and removes the flag `--no-prepare-changelogs'.
+        The flag name change from prepare to update is since we still want to
+        prepare changelogs in the default case when none currently exist.
+
+        * Scripts/webkitpy/tool/commands/commandtest.py:
+        (CommandsTest.assert_execute_outputs):
+        * Scripts/webkitpy/tool/steps/options.py:
+        (Options):
+        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog.options):
+        (PrepareChangeLog.run):
+
+2013-02-11  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move printPage() implementation to testRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109436
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestRunner::WebTestProxy::showContextMenu):
+        (WebTestRunner::WebTestProxy::printPage):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::printPage):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-02-11  James Robinson  <jamesr@chromium.org>
+
+        [Chromium] Get rid of WebAnimationController
+        https://bugs.webkit.org/show_bug.cgi?id=109235
+
+        Reviewed by Benjamin Poulain.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2013-02-11  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Disable delete button controller on non-Mac ports and delete EditorClient::shouldShowDeleteInterface
+        https://bugs.webkit.org/show_bug.cgi?id=109534
+
+        Reviewed by Anders Carlsson.
+
+        * DumpRenderTree/gtk/EditingCallbacks.cpp:
+        (shouldShowDeleteInterfaceForElement):
+
+2013-02-11  Nico Weber  <thakis@chromium.org>
+
+        Remove web intents code
+        https://bugs.webkit.org/show_bug.cgi?id=109501
+
+        Reviewed by Eric Seidel.
+
+        See thread "Removing ENABLE(WEB_INTENTS) code" on webkit-dev.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner::WebTestProxy::didEndEditing):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-02-11  Benjamin Poulain  <benjamin@webkit.org>
+
+        Kill TestRunner::setMinimumTimerInterval; implement the feature with InternalSettings
+        https://bugs.webkit.org/show_bug.cgi?id=109349
+
+        Reviewed by Sam Weinig.
+
+        Get rid of TestRunner's setMinimumTimerInterval and all the related functions.
+
+        This also fixes an oddity:
+        TestRunners were initialized with a minimum timer interval of 10 milliseconds instead
+        of using the default value. All with the same copy of an outdated comment.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner::WebPreferences::applyTo):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::reset):
+        * DumpRenderTree/efl/DumpRenderTreeChrome.cpp:
+        (DumpRenderTreeChrome::resetDefaultsToConsistentValues):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues):
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (resetWebViewToConsistentStateBeforeTesting):
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::WebPage::resetSettings):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (resetWebViewToConsistentStateBeforeTesting):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::beginTesting):
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2013-02-11  Dean Jackson  <dino@apple.com>
+
+        Remove use of plugInStartLabelImage
+        https://bugs.webkit.org/show_bug.cgi?id=108273
+
+        Reviewed by Simon Fraser.
+
+        Take two - after rollout in r142405.
+        Removed plugInStartLabelImage entry from client structure.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+
+2013-02-11  Tony Chang  <tony@chromium.org>
+
+        Move setFrameFlatteningEnabled from layoutTestController to window.internals.settings
+        https://bugs.webkit.org/show_bug.cgi?id=87149
+
+        Reviewed by Simon Fraser.
+
+        Remove testRunner.setFrameFlatteningEnabled from DRT and WTR. WebKit API
+        methods are left because there may be users of it. Add a test for Apple Mac
+        to ensure that the API for the preference still works using overridePreference.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/DumpRenderTree.cpp:
+        (BlackBerry::WebKit::DumpRenderTree::resetToConsistentStateBeforeTesting):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues):
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::WebPage::resetSettings):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2013-02-11  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Windows 7 Debug mode build fix.
+
+        * DumpRenderTree/TestNetscapePlugIn/win/TestNetscapePlugin.vcproj:
+
+2013-02-11  Tiancheng Jiang  <tijiang@rim.com>
+
+        [BlackBerry] Set mouse document position for mouse event in DRT.
+        https://bugs.webkit.org/show_bug.cgi?id=109094.
+
+        Reviewed by Rob Buis.
+
+        RIM PR 246976.
+        Internally Reviewed by Nima Ghanavatian & Genevieve Mak.
+
+        Set mouse document position when we create mouse event in DRT.
+
+        * DumpRenderTree/blackberry/EventSender.cpp:
+        (setMouseEventDocumentPos):
+        (mouseDownCallback):
+        (mouseUpCallback):
+        (mouseMoveToCallback):
+
+2013-02-11  Mike Lattanzio  <mlattanzio@rim.com>
+
+        [BlackBerry] Add graphics subdirectory to include path.
+        https://bugs.webkit.org/show_bug.cgi?id=109437
+
+        Reviewed by Rob Buis.
+
+        Add browser/platform/graphics to include path.
+
+        Internal review by Jeff Rogers.
+
+        * Scripts/webkitdirs.pm:
+        (blackberryCMakeArguments):
+
+2013-02-11  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL][WKTR] Regression(r141836) fast/dom/Window/mozilla-focus-blur.html started failing
+        https://bugs.webkit.org/show_bug.cgi?id=109438
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Some refactoring in r141836 caused the view not to get focus if the focused
+        frame is not the main one. The idea of the code was to remove focus from the
+        view if the focused frame was not the main one, and then focus the view again.
+        However, after the refactoring, the second step never happened: Focus was
+        removed but not given again.
+
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::focus):
+
+2013-02-11  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Don't generate documentation if building neither WebKit1 nor WebKit2
+        https://bugs.webkit.org/show_bug.cgi?id=109420
+
+        Reviewed by Philippe Normand.
+
+        Don't generate the GTK documentation if neither of the WebKit1 and WebKit2
+        layers was built. This just results in unnecessary errors being spewed out
+        by the gtkdoc utilities.
+
+        * Scripts/webkitdirs.pm:
+        (buildAutotoolsProject):
+
+2013-02-11  Antoine Quint  <graouts@apple.com>
+
+        Unreviewed change to add myself to the Inspector IDLs watchlist.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-11  Krzysztof Czech  <k.czech@samsung.com>
+
+        [GTK][EFL] Shares WebKit-GTK's DumpRenderTree accessibility implementation with other Webkit ports
+        https://bugs.webkit.org/show_bug.cgi?id=105007
+
+        Reviewed by Martin Robinson.
+
+        Shares specific ATK's accessibility implementation.
+        Keeps platform specific methods in EFL and GTK's directories.
+
+        * DumpRenderTree/atk/AccessibilityCallbacks.h: Renamed from Tools/DumpRenderTree/gtk/AccessibilityCallbacks.h.
+        * DumpRenderTree/atk/AccessibilityCallbacksAtk.cpp: Renamed from Tools/DumpRenderTree/gtk/AccessibilityCallbacks.cpp.
+        (printAccessibilityEvent):
+        (axObjectEventListener):
+        (connectAccessibilityCallbacks):
+        (disconnectAccessibilityCallbacks):
+        * DumpRenderTree/atk/AccessibilityControllerAtk.cpp: Copied from Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp.
+        (AccessibilityController::AccessibilityController):
+        (AccessibilityController::~AccessibilityController):
+        (AccessibilityController::elementAtPoint):
+        (AccessibilityController::setLogFocusEvents):
+        (AccessibilityController::setLogScrollingStartEvents):
+        (AccessibilityController::setLogValueChangeEvents):
+        (AccessibilityController::setLogAccessibilityEvents):
+        (AccessibilityController::addNotificationListener):
+        (AccessibilityController::removeNotificationListener):
+        * DumpRenderTree/atk/AccessibilityUIElementAtk.cpp: Copied from Tools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp.
+        (coreAttributeToAtkAttribute):
+        (roleToString):
+        (replaceCharactersForResults):
+        (AccessibilityUIElement::AccessibilityUIElement):
+        (AccessibilityUIElement::~AccessibilityUIElement):
+        (AccessibilityUIElement::getLinkedUIElements):
+        (AccessibilityUIElement::getDocumentLinks):
+        (AccessibilityUIElement::getChildren):
+        (AccessibilityUIElement::getChildrenWithRange):
+        (AccessibilityUIElement::rowCount):
+        (AccessibilityUIElement::columnCount):
+        (AccessibilityUIElement::childrenCount):
+        (AccessibilityUIElement::elementAtPoint):
+        (AccessibilityUIElement::linkedUIElementAtIndex):
+        (AccessibilityUIElement::getChildAtIndex):
+        (AccessibilityUIElement::indexOfChild):
+        (attributeSetToString):
+        (AccessibilityUIElement::allAttributes):
+        (AccessibilityUIElement::attributesOfLinkedUIElements):
+        (AccessibilityUIElement::attributesOfDocumentLinks):
+        (AccessibilityUIElement::titleUIElement):
+        (AccessibilityUIElement::parentElement):
+        (AccessibilityUIElement::attributesOfChildren):
+        (AccessibilityUIElement::parameterizedAttributeNames):
+        (AccessibilityUIElement::role):
+        (AccessibilityUIElement::subrole):
+        (AccessibilityUIElement::roleDescription):
+        (AccessibilityUIElement::title):
+        (AccessibilityUIElement::description):
+        (AccessibilityUIElement::stringValue):
+        (AccessibilityUIElement::language):
+        (AccessibilityUIElement::x):
+        (AccessibilityUIElement::y):
+        (AccessibilityUIElement::width):
+        (AccessibilityUIElement::height):
+        (AccessibilityUIElement::clickPointX):
+        (AccessibilityUIElement::clickPointY):
+        (AccessibilityUIElement::orientation):
+        (AccessibilityUIElement::intValue):
+        (AccessibilityUIElement::minValue):
+        (AccessibilityUIElement::maxValue):
+        (AccessibilityUIElement::valueDescription):
+        (checkElementState):
+        (AccessibilityUIElement::isEnabled):
+        (AccessibilityUIElement::insertionPointLineNumber):
+        (AccessibilityUIElement::isPressActionSupported):
+        (AccessibilityUIElement::isIncrementActionSupported):
+        (AccessibilityUIElement::isDecrementActionSupported):
+        (AccessibilityUIElement::isRequired):
+        (AccessibilityUIElement::isFocused):
+        (AccessibilityUIElement::isSelected):
+        (AccessibilityUIElement::hierarchicalLevel):
+        (AccessibilityUIElement::ariaIsGrabbed):
+        (AccessibilityUIElement::ariaDropEffects):
+        (AccessibilityUIElement::isExpanded):
+        (AccessibilityUIElement::isChecked):
+        (AccessibilityUIElement::attributesOfColumnHeaders):
+        (AccessibilityUIElement::attributesOfRowHeaders):
+        (AccessibilityUIElement::attributesOfColumns):
+        (AccessibilityUIElement::attributesOfRows):
+        (AccessibilityUIElement::attributesOfVisibleCells):
+        (AccessibilityUIElement::attributesOfHeader):
+        (AccessibilityUIElement::indexInTable):
+        (indexRangeInTable):
+        (AccessibilityUIElement::rowIndexRange):
+        (AccessibilityUIElement::columnIndexRange):
+        (AccessibilityUIElement::lineForIndex):
+        (AccessibilityUIElement::boundsForRange):
+        (AccessibilityUIElement::stringForRange):
+        (AccessibilityUIElement::attributedStringForRange):
+        (AccessibilityUIElement::attributedStringRangeIsMisspelled):
+        (AccessibilityUIElement::uiElementForSearchPredicate):
+        (AccessibilityUIElement::cellForColumnAndRow):
+        (AccessibilityUIElement::selectedTextRange):
+        (AccessibilityUIElement::setSelectedTextRange):
+        (AccessibilityUIElement::stringAttributeValue):
+        (AccessibilityUIElement::numberAttributeValue):
+        (AccessibilityUIElement::boolAttributeValue):
+        (AccessibilityUIElement::isAttributeSettable):
+        (AccessibilityUIElement::isAttributeSupported):
+        (alterCurrentValue):
+        (AccessibilityUIElement::increment):
+        (AccessibilityUIElement::decrement):
+        (AccessibilityUIElement::press):
+        (AccessibilityUIElement::showMenu):
+        (AccessibilityUIElement::disclosedRowAtIndex):
+        (AccessibilityUIElement::ariaOwnsElementAtIndex):
+        (AccessibilityUIElement::ariaFlowToElementAtIndex):
+        (AccessibilityUIElement::selectedRowAtIndex):
+        (AccessibilityUIElement::rowAtIndex):
+        (AccessibilityUIElement::disclosedByRow):
+        (AccessibilityUIElement::accessibilityValue):
+        (AccessibilityUIElement::documentEncoding):
+        (AccessibilityUIElement::documentURI):
+        (AccessibilityUIElement::url):
+        (AccessibilityUIElement::addNotificationListener):
+        (AccessibilityUIElement::removeNotificationListener):
+        (AccessibilityUIElement::isFocusable):
+        (AccessibilityUIElement::isSelectable):
+        (AccessibilityUIElement::isMultiSelectable):
+        (AccessibilityUIElement::isSelectedOptionActive):
+        (AccessibilityUIElement::isVisible):
+        (AccessibilityUIElement::isOffScreen):
+        (AccessibilityUIElement::isCollapsed):
+        (AccessibilityUIElement::isIgnored):
+        (AccessibilityUIElement::hasPopup):
+        (AccessibilityUIElement::takeFocus):
+        (AccessibilityUIElement::takeSelection):
+        (AccessibilityUIElement::addSelection):
+        (AccessibilityUIElement::removeSelection):
+        (AccessibilityUIElement::scrollToMakeVisible):
+        (AccessibilityUIElement::scrollToMakeVisibleWithSubFocus):
+        (AccessibilityUIElement::scrollToGlobalPoint):
+        * DumpRenderTree/efl/CMakeLists.txt: Adds ATK headers, libraries, new sources.
+        * DumpRenderTree/gtk/AccessibilityControllerGtk.cpp:
+        (AccessibilityController::focusedElement):
+        (AccessibilityController::rootElement):
+        (AccessibilityController::accessibleElementById):
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::helpText):
+        * GNUmakefile.am: Adds renamed sources.
+
+2013-02-11  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] clear the webcache from within the TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109405
+
+        Reviewed by Kentaro Hara.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::resetAll):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::resetTestController):
+
+2013-02-11  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] add a destructor to EventSender
+        https://bugs.webkit.org/show_bug.cgi?id=109401
+
+        Reviewed by Kentaro Hara.
+
+        Otherwise, the compiler will automatically generate a destructor, for
+        which we need to unnecessarily include WebContextMenuData.h in the
+        header.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::~EventSender):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (WebKit):
+        (EventSender):
+
+2013-02-10  Tim Horton  <timothy_horton@apple.com>
+
+        Unreviewed attempted build fix for Gtk after r142412
+
+        * WebKitTestRunner/gtk/PlatformWebViewGtk.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+
+2013-02-10  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r142413.
+        http://trac.webkit.org/changeset/142413
+        https://bugs.webkit.org/show_bug.cgi?id=109383
+
+        didn't fix the gtk build (Requested by thorton on #webkit).
+
+        * WebKitTestRunner/gtk/PlatformWebViewGtk.cpp:
+
+2013-02-10  Tim Horton  <timothy_horton@apple.com>
+
+        Unreviewed attempted build fix for Gtk after r142412
+        * WebKitTestRunner/gtk/PlatformWebViewGtk.cpp:
+
+2013-02-10  Tim Horton  <timothy_horton@apple.com>
+
+        WKTR should propagate view creation options to opened windows
+        https://bugs.webkit.org/show_bug.cgi?id=109381
+
+        Reviewed by Simon Fraser.
+
+        * WebKitTestRunner/PlatformWebView.h:
+        (WTR::PlatformWebView::options):
+        Add storage and a getter for PlatformWebView's creation options dictionary.
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createOtherPage):
+        Propagate creation options from parent to child PlatformWebView when creating subwindows.
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+        * WebKitTestRunner/gtk/PlatformWebViewGtk.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+        * WebKitTestRunner/mac/PlatformWebViewMac.mm:
+        (WTR::PlatformWebView::PlatformWebView):
+        * WebKitTestRunner/qt/PlatformWebViewQt.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+        Store creation options on the PlatformWebView.
+
+2013-02-10  Kent Tamura  <tkent@chromium.org>
+
+        Unreviewed, rolling out r142347.
+        http://trac.webkit.org/changeset/142347
+        https://bugs.webkit.org/show_bug.cgi?id=108273
+
+        Because a depending change r142343 was rolled out.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+
+2013-02-10  Kent Tamura  <tkent@chromium.org>
+
+        [Chromium] Build fix for r142371
+        https://bugs.webkit.org/show_bug.cgi?id=109313
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (WebKit):
+
+2013-02-10  Zan Dobersek  <zdobersek@igalia.com>
+
+        gtkdoc-scangobj throwing warnings when using Clang, causes generate-gtkdoc to fail
+        https://bugs.webkit.org/show_bug.cgi?id=109315
+
+        Reviewed by Philippe Normand.
+
+        * GNUmakefile.am: Define the CC environment variable to the CC compiler that the whole
+        project was configured to use. This ensures both the regular build and the gtkdoc-scangobj
+        program use the same compiler.
+        * gtk/generate-gtkdoc: Add '-Qunused-arguments' to the CFLAGS in case we're using Clang. This
+        forces Clang to suppress unused arguments warnings that can unnecessarily cause generate-gtkdoc
+        script to fail.
+
+2013-02-09  David Farler  <dfarler@apple.com>
+
+        Make TestWebKitAPI work for iOS
+        https://bugs.webkit.org/show_bug.cgi?id=108978
+
+        Reviewed by Joseph Pecoraro.
+
+        * TestWebKitAPI/Configurations/Base.xcconfig:
+        Added back FRAMEWORK_SEARCH_PATHS for Lion builds.
+
+2013-02-09  David Farler  <dfarler@apple.com>
+
+        Make TestWebKitAPI work for iOS
+        https://bugs.webkit.org/show_bug.cgi?id=108978
+
+        Reviewed by David Kilzer.
+
+        * Makefile: Added TestWebKitAPI to iOS MODULES list.
+        * TestWebKitAPI/Configurations/Base.xcconfig:
+        - Include FeatureDefines
+        - Removed VALID_ARCHS
+        - Removed FRAMEWORK_SEARCH_PATHS - allows building against other SDKs
+        - Excluded source files per platform
+        * TestWebKitAPI/Configurations/TestWebKitAPI.xcconfig:
+        - framework and library switches per platform
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        - Remove explicit framework and library linking (moved to xcconfigs)
+        - Added iOS main.mm
+        * TestWebKitAPI/config.h:
+        - Guard importing Cocoa.h and WebKit2_C.h on iOS
+        * TestWebKitAPI/ios/mainIOS.mm: Copied from Tools/TestWebKitAPI/mac/main.mm.
+        * TestWebKitAPI/mac/mainMac.mm: Renamed from Tools/TestWebKitAPI/mac/main.mm.
+
+2013-02-09  Justin Schuh  <jschuh@chromium.org>
+
+        [CHROMIUM] Suppress c4267 build warnings for Win64 tests
+        https://bugs.webkit.org/show_bug.cgi?id=109359
+
+        Reviewed by Abhishek Arya.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2013-02-09  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Add a link to EFL perf bot on build.webkit.org
+        https://bugs.webkit.org/show_bug.cgi?id=109342
+
+        Reviewed by Gyuyoung Kim.
+
+        Added.
+
+        * BuildSlaveSupport/build.webkit.org-config/templates/root.html:
+
+2013-02-09  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        Unreviewed. Update my IRC nickname in committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-09  David Farler  <dfarler@apple.com>
+
+        build-webkit: document sdk, debug, release, device, and simulator options
+        https://bugs.webkit.org/show_bug.cgi?id=109221
+
+        Reviewed by David Kilzer.
+
+        * Scripts/build-webkit: Add options to usage
+        * Scripts/webkitdirs.pm: Remove --deploy and --devel checks
+
+2013-02-09  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move context menu data tracking to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109313
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebKit):
+        (WebTestDelegate):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner::WebTestProxy::showContextMenu):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::setContextMenuData):
+        (WebTestRunner::EventSender::contextClick):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (WebKit):
+        (EventSender):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::showContextMenu):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::showContextMenu):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-02-09  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move methods that change initial testRunner state to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109043
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebKit):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::configureForTestWithURL):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (WebKit):
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::showDevTools):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::showWebInspector):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::configureForTestWithURL):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::runFileTest):
+
+2013-02-09  Nico Weber  <thakis@chromium.org>
+
+        Add myself as a reviewer. (Yay!!!!!)
+        https://bugs.webkit.org/show_bug.cgi?id=109110
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-08  Benjamin Poulain  <bpoulain@apple.com>
+
+        Move workerThreadCount from TestRunner to WebCore Internals
+        https://bugs.webkit.org/show_bug.cgi?id=109239
+
+        Reviewed by Darin Adler.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticValues):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        (TestRunner::webHistoryItemCount):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+
+2013-02-08  Dean Jackson  <dino@apple.com>
+
+        Remove use of plugInStartLabelImage
+        https://bugs.webkit.org/show_bug.cgi?id=108273
+
+        Reviewed by Simon Fraser.
+
+        Removed plugInStartLabelImage entry from client structure.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+
+2013-02-07  Timothy Hatcher  <timothy@apple.com>
+
+        Fix the WebInspectorAPI watch list.
+
+        Reviewed by Joseph Pecoraro.
+
+        * Scripts/webkitpy/common/config/watchlist: Fix the regrexs.
+        Added InjectedScriptSource.js and Console.idl.
+
+2013-02-08  Roger Fong  <roger_fong@apple.com>
+
+        DumpRenderTree, ImageDiff and TestNetscapePlugin projects, property sheets and resources for VS2010 solution.
+        https://bugs.webkit.org/show_bug.cgi?id=107034.
+
+        Reviewed by Brent Fulgham.
+
+        * DumpRenderTree/DumpRenderTree.vcxproj: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj.filters: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeApple.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeCommon.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebug.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncher.vcxproj: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherCommon.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherDebug.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherRelease.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePostBuild.cmd: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePreBuild.cmd: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeRelease.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiff.vcxproj: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommon.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebug.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncher.vcxproj: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherCommon.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherDebug.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherRelease.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPostBuild.cmd: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPreBuild.cmd: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffRelease.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.def: Copied from DumpRenderTree/TestNetscapePlugIn/win/TestNetscapePlugin.def.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.rc: Copied from DumpRenderTree/TestNetscapePlugIn/win/TestNetscapePlugin.rc.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginCommon.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginDebug.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPostBuild.cmd: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPreBuild.cmd: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginRelease.props: Added.
+        * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/resource.h: Copied from DumpRenderTree/TestNetscapePlugIn/win/resource.h.
+        * DumpRenderTree/TestNetscapePlugIn/Tests/win/CallJSThatDestroysPlugin.cpp: Copied from DumpRenderTree/TestNetscapePlugIn/win/CallJSThatDestroysPlugin.cpp.
+        * DumpRenderTree/TestNetscapePlugIn/win/CallJSThatDestroysPlugin.cpp: Removed.
+
+2013-02-08  Harald Alvestrand  <hta@google.com>
+
+        Fix and test for missing return
+
+        RTCPeerConnection.getStats() fails when remote stats are instantiated.
+        https://bugs.webkit.org/show_bug.cgi?id=109292
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::getStats):
+
+2013-02-08  Tommy Widenflycht  <tommyw@google.com>
+
+        MediaStream API: Removing the deprecated WebMediaStreamDescriptor and WebMediaStreamComponent shims
+        https://bugs.webkit.org/show_bug.cgi?id=109296
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.cpp:
+        (MockWebRTCDTMFSenderHandler::MockWebRTCDTMFSenderHandler):
+        * DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.h:
+        (MockWebRTCDTMFSenderHandler):
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::createDTMFSender):
+
+2013-02-08  Caio Marcelo de Oliveira Filho  <caio.oliveira@openbossa.org>
+
+        Update my entries in the watchlist
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-08  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] copy normalizeLayoutTestURL code to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=109269
+
+        Reviewed by Kent Tamura.
+
+        The method doesn't have any external dependencies, so there's no reason
+        it should be on the delegate. It's still required by TestShell, however,
+        by making a copy, we can avoid implementing this in content shell.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestDelegate):
+        * DumpRenderTree/chromium/TestRunner/src/WebPermissions.cpp:
+        (WebTestRunner::WebPermissions::allowImage):
+        (WebTestRunner::WebPermissions::allowScriptFromSource):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::windowCount):
+        * DumpRenderTree/chromium/TestShell.h:
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-02-08  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL] Make the Performance bot also build WebKit.
+        https://bugs.webkit.org/show_bug.cgi?id=109273
+
+        Reviewed by Philippe Normand.
+
+        There has not been much benefit in fetching binaries compiled by
+        another bot; it makes the build bot take 6 to 7 minutes to upload
+        the binaries to build.webkit.org, we need to manually override
+        LD_LIBRARY_PATH to find the compiled libraries and still have
+        other path-related problems.
+
+        Since we have enough horsepower in the perf bot, let's experiment
+        with building WebKit there instead.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+
+2013-02-07  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] turn TestRunner library into a component build
+        https://bugs.webkit.org/show_bug.cgi?id=108466
+
+        Reviewed by Adam Barth.
+
+        To achieve this, we need to drop all dependencies on WTF.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (WebTestRunner::MockGrammarCheck::checkGrammarOfString):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (WebTestRunner):
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (WebTestRunner::MockSpellCheck::spellCheckWord):
+        (WebTestRunner::MockSpellCheck::initializeIfNeeded):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        (isASCIIAlpha):
+        (isNotASCIIAlpha):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::simulateLegacyWebNotificationClick):
+        (WebTestRunner::TestRunner::setMockSpeechInputDumpRect):
+        (WebTestRunner::TestRunner::wasMockSpeechRecognitionAborted):
+        (WebTestRunner::TestRunner::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+
+2013-02-07  Zan Dobersek  <zdobersek@igalia.com>
+
+        Unreviewed followup to r142232.
+
+        Work around a bug in jhbuild that was incorrectly composing the source
+        package URL by adjusting slightly the repository and module paths.
+
+        * gtk/jhbuild.modules:
+
+2013-02-07  Zan Dobersek  <zdobersek@igalia.com>
+
+        Use a mirror for the sourceware.org repo used in jhbuild
+
+        Unreviewed.
+
+        The ftp://sourceware.org site is down, causing errors when running jhbuild
+        and subsequently failing complete builds on the builders. Use the mirrors.kernel.org
+        mirror to get sources for the desired libffi dependency.
+
+        * gtk/jhbuild.modules:
+
+2013-02-07  David Farler  <dfarler@apple.com>
+
+        Makefiles should work for arbitrary SDKs and architectures on Apple ports
+        https://bugs.webkit.org/show_bug.cgi?id=107863
+
+        Reviewed by Mark Rowe.
+
+        * DumpRenderTree/Makefile: SDKROOT=iphone* => -target All-iOS
+        * Makefile: Only build some projects for iOS
+
+2013-02-07  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Another temporary EWS bot fix. It'll totally work this time.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+
+2013-02-07  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Fix syntax error in runtests.py.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+
+2013-02-07  Roger Fong  <roger_fong@apple.com>
+
+        Temporary fix for Win EWS bots.
+        Don't build DRT since it has already been built in the build step.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+
+2013-02-07  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Cleanup command-line defines
+        https://bugs.webkit.org/show_bug.cgi?id=109213
+
+        Reviewed by Xan Lopez.
+
+        * TestWebKitAPI/config.h: Include the autotoolsconfig.h header to pick
+        up defines from autoconf.
+
+2013-02-07  Ryosuke Niwa  <rniwa@webkit.org>
+
+        git.svn_revision doesn't fetch the same revision as svn.svn_revision
+        https://bugs.webkit.org/show_bug.cgi?id=108684
+
+        Reviewed by Dirk Pranke.
+
+        Always call git log on the checkout root.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.svn_revision):
+
+2013-02-07  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Patch for testing Win EWS bots.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+
+2013-02-07  Gavin Peters  <gavinp@chromium.org>
+
+        Unreviewed, rolling out r142165.
+        http://trac.webkit.org/changeset/142165
+        https://bugs.webkit.org/show_bug.cgi?id=108466
+
+        Broke linux_aura builds.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        (WebTaskList):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (MockGrammarCheck::checkGrammarOfString):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (append):
+        (isNotASCIIAlpha):
+        (MockSpellCheck::spellCheckWord):
+        (MockSpellCheck::initializeIfNeeded):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner):
+        (WebTestRunner::WebTaskList::WebTaskList):
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Removed.
+
+2013-02-07  Benjamin Poulain  <bpoulain@apple.com>
+
+        Move pauseAnimation/pauseTransition from TestRunner to Internals
+        https://bugs.webkit.org/show_bug.cgi?id=109107
+
+        Reviewed by Anders Carlsson.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+
+2013-02-07  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] turn TestRunner library into a component build
+        https://bugs.webkit.org/show_bug.cgi?id=108466
+
+        Reviewed by Adam Barth.
+
+        To achieve this, we need to drop all dependencies on WTF.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (WebTestRunner::MockGrammarCheck::checkGrammarOfString):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (WebTestRunner):
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (WebTestRunner::MockSpellCheck::spellCheckWord):
+        (WebTestRunner::MockSpellCheck::initializeIfNeeded):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        (isASCIIAlpha):
+        (isNotASCIIAlpha):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::simulateLegacyWebNotificationClick):
+        (WebTestRunner::TestRunner::setMockSpeechInputDumpRect):
+        (WebTestRunner::TestRunner::wasMockSpeechRecognitionAborted):
+        (WebTestRunner::TestRunner::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+
+2013-02-07  Eunmi Lee  <eunmi15.lee@samsung.com>
+
+        Do not check enum's casing for WebKit2 C API.
+        https://bugs.webkit.org/show_bug.cgi?id=109128
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add "-readability/enum_casing" for WebKit2 C APIs because we use word
+        which starts with non-capital letter 'k' for types of enums.
+
+        * Scripts/webkitpy/style/checker.py:
+
+2013-02-07  Csaba Osztrogonác  <ossy@webkit.org>
+
+        Unreviewed warning fix.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (BuildAndTestFactory.__init__):
+        (DownloadAndPerfTestWebKit2Factory.__init__):
+
+2013-02-07  Csaba Osztrogonác  <ossy@webkit.org>
+
+        Unreviewed typo fix after r142121.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+
+2013-02-07  Vivek Galatage  <vivek.vg@samsung.com>
+
+        [Qt] QtTestBrowser should provide option to enable/disable Javascript
+        https://bugs.webkit.org/show_bug.cgi?id=107461
+
+        Reviewed by Jocelyn Turcotte.
+
+        Option to enable/disable Javascript would be handy option to test
+        certain functionalities of web pages with/without Javascript.
+
+        * QtTestBrowser/launcherwindow.cpp:
+        (LauncherWindow::createChrome):
+        (LauncherWindow::toggleJavaScriptEnabled):
+        * QtTestBrowser/launcherwindow.h:
+        (LauncherWindow):
+
+2013-02-07  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL] Add a WebKit2 Performance bot.
+        https://bugs.webkit.org/show_bug.cgi?id=109188
+
+        Reviewed by Csaba Osztrogonác.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json: Add the
+        efl-linux-perf-1 slave (a 64-bit Release WK2 Perf bot), and make
+        the "EFL Linux 64-bit Release" bot trigger it.
+
+2013-02-07  Xiaobo Wang  <xbwang@torchmobile.com.cn>
+
+        [BlackBerry] CHHW - Characters that are using 32 bits encoding get trunked to 16bits
+        https://bugs.webkit.org/show_bug.cgi?id=109126
+        PR 292540
+
+        Reviewed by Yong Li.
+
+        Change char code to 4 bytes.
+
+        * DumpRenderTree/blackberry/EventSender.cpp:
+        (keyDownCallback):
+
+2013-02-07  Gavin Peters  <gavinp@chromium.org>
+
+        Unreviewed, rolling out r142090.
+        http://trac.webkit.org/changeset/142090
+        https://bugs.webkit.org/show_bug.cgi?id=108466
+
+        lots of selection expectations failures
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        (WebTaskList):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (MockGrammarCheck::checkGrammarOfString):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (append):
+        (isNotASCIIAlpha):
+        (MockSpellCheck::spellCheckWord):
+        (MockSpellCheck::initializeIfNeeded):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner):
+        (WebTestRunner::WebTaskList::WebTaskList):
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Removed.
+
+2013-02-07  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] turn TestRunner library into a component build
+        https://bugs.webkit.org/show_bug.cgi?id=108466
+
+        Reviewed by Adam Barth.
+
+        To achieve this, we need to drop all dependencies on WTF.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (WebTestRunner::MockGrammarCheck::checkGrammarOfString):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (WebTestRunner):
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (WebTestRunner::MockSpellCheck::spellCheckWord):
+        (WebTestRunner::MockSpellCheck::initializeIfNeeded):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        (isASCIIAlpha):
+        (isNotASCIIAlpha):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::simulateLegacyWebNotificationClick):
+        (WebTestRunner::TestRunner::setMockSpeechInputDumpRect):
+        (WebTestRunner::TestRunner::wasMockSpeechRecognitionAborted):
+        (WebTestRunner::TestRunner::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+
+2013-02-07  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt] Use GNU ar's thin archive format for intermediate static libs
+        https://bugs.webkit.org/show_bug.cgi?id=109052
+
+        Reviewed by Jocelyn Turcotte.
+
+        With debug builds we exceed the 4GiB limit of GNU ar when creating the WebCore
+        intermediate static library which results in build failure even with a x86_64
+        toolchain (http://sourceware.org/bugzilla/show_bug.cgi?id=14625).
+
+        When using a GNU toolchain we can use the thin archive format for these static
+        libraries which also has the benefit of not copying the object files, thus
+        drastically reducing disk usage and overall compile time.
+
+        Currently qmake does not support GNU ar's thin archive format so for
+        now we need to do the magic in the build system as a stopgap solution.
+
+        * qmake/mkspecs/features/configure.prf:
+        * qmake/mkspecs/features/default_post.prf:
+        * qmake/mkspecs/features/functions.prf:
+
+2013-02-05  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Compile WTF tests of TestWebKitAPI
+        https://bugs.webkit.org/show_bug.cgi?id=108935
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add initial stubs and files for building at least the WTF tests.
+        The WK2 tests need more platform code, in particular PlatformWebView
+        and injected bundle support.
+
+        * TestWebKitAPI/TestWebKitAPI.pri: Added.
+        * TestWebKitAPI/TestWebKitAPI.pro: Added.
+        * TestWebKitAPI/Tests/WTF/WTF.pro: Added.
+        * TestWebKitAPI/qt/InjectedBundleControllerQt.cpp: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::InjectedBundleController::platformInitialize):
+        * TestWebKitAPI/qt/PlatformUtilitiesQt.cpp: Added.
+        (Util):
+        (TestWebKitAPI::Util::run):
+        (TestWebKitAPI::Util::sleep):
+        (TestWebKitAPI::Util::createInjectedBundlePath):
+        (TestWebKitAPI::Util::createURLForResource):
+        (TestWebKitAPI::Util::URLForNonExistentResource):
+        * TestWebKitAPI/qt/main.cpp: Added.
+        (main):
+        * Tools.pro:
+        * qmake/mkspecs/features/default_post.prf:
+
+2013-02-06  Roger Fong  <roger_fong@apple.com>
+
+        VS2010 WinLauncher project, property sheets and resources.
+        https://bugs.webkit.org/show_bug.cgi?id=107037.
+
+        Reviewed by Brent Fulgham.
+
+        * WinLauncher/WinLauncher.vcxproj: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncher.ico: Copied from WinLauncher/WinLauncher.ico.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncher.rc: Copied from WinLauncher/WinLauncherLauncher.rc.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj.filters: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj.user: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherCommon.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherDebug.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLib.rc: Copied from WinLauncher/WinLauncher.rc.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj.filters: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj.user: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibCommon.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibDebug.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibPostBuild.cmd: Copied from WinLauncher/WinLauncherPostBuild.cmd.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibPreBuild.cmd: Copied from WinLauncher/WinLauncherPreBuild.cmd.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibRelease.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherLibResource.h: Copied from WinLauncher/resource.h.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherPostBuild.cmd: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherPreBuild.cmd: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherRelease.props: Added.
+        * WinLauncher/WinLauncher.vcxproj/WinLauncherResource.h: Copied from WinLauncher/WinLauncherLauncherResource.h.
+        * WinLauncher/WinLauncher.vcxproj/small.ico: Copied from WinLauncher/small.ico.
+
+2013-02-06  Terry Anderson  <tdanderson@chromium.org>
+
+        Add support for gesture scroll events that do not propagate to enclosing scrollables
+        https://bugs.webkit.org/show_bug.cgi?id=108849
+
+        Reviewed by Antonio Gomes.
+
+        Modify chromium's DRT EventSender to support the new event type
+        GestureScrollUpdateWithoutPropagation.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::gestureScrollUpdateWithoutPropagation):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (EventSender):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::handleInputEvent):
+
+2013-02-06  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r142032.
+        http://trac.webkit.org/changeset/142032
+        https://bugs.webkit.org/show_bug.cgi?id=109095
+
+        component build still broken (Requested by jochen__ on
+        #webkit).
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        (WebTaskList):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (MockGrammarCheck::checkGrammarOfString):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (append):
+        (isNotASCIIAlpha):
+        (MockSpellCheck::spellCheckWord):
+        (MockSpellCheck::initializeIfNeeded):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner):
+        (WebTestRunner::WebTaskList::WebTaskList):
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Removed.
+
+2013-02-06  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] turn TestRunner library into a component build
+        https://bugs.webkit.org/show_bug.cgi?id=108466
+
+        Reviewed by Adam Barth.
+
+        To achieve this, we need to drop all dependencies on WTF.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (WebTestRunner::MockGrammarCheck::checkGrammarOfString):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (WebTestRunner):
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (WebTestRunner::MockSpellCheck::spellCheckWord):
+        (WebTestRunner::MockSpellCheck::initializeIfNeeded):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        (isASCIIAlpha):
+        (isNotASCIIAlpha):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::simulateLegacyWebNotificationClick):
+        (WebTestRunner::TestRunner::setMockSpeechInputDumpRect):
+        (WebTestRunner::TestRunner::wasMockSpeechRecognitionAborted):
+        (WebTestRunner::TestRunner::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+
+2013-02-06  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r142025.
+        http://trac.webkit.org/changeset/142025
+        https://bugs.webkit.org/show_bug.cgi?id=109091
+
+        broke the build (Requested by tdanderson on #webkit).
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (EventSender):
+
+2013-02-06  Terry Anderson  <tdanderson@chromium.org>
+
+        Add support for gesture scroll events that do not propagate to enclosing scrollables
+        https://bugs.webkit.org/show_bug.cgi?id=108849
+
+        Reviewed by Antonio Gomes.
+
+        Modify chromium's DRT EventSender to support the new event type
+        GestureScrollUpdateWithoutPropagation.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::gestureScrollUpdateWithoutPropagation):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (EventSender):
+
+2013-02-06  Zan Dobersek  <zdobersek@igalia.com>
+
+        [TestResultServer] Adjust the name of the GTK 64-bit debug builder
+        https://bugs.webkit.org/show_bug.cgi?id=109016
+
+        Reviewed by Ojan Vafai.
+
+        * TestResultServer/static-dashboards/builders.jsonp: The GTK 64-bit debug
+        builder was adjusted to build WebKit1 only, with the name changed accordingly.
+        Reflect that change here as well.
+
+2013-02-06  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r141991.
+        http://trac.webkit.org/changeset/141991
+        https://bugs.webkit.org/show_bug.cgi?id=109047
+
+        Fails to compile on all Chromium platforms (Requested by
+        schenney on #webkit).
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        (WebTaskList):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (MockGrammarCheck::checkGrammarOfString):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (append):
+        (isNotASCIIAlpha):
+        (MockSpellCheck::spellCheckWord):
+        (MockSpellCheck::initializeIfNeeded):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner):
+        (WebTestRunner::WebTaskList::WebTaskList):
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Removed.
+
+2013-02-06  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r141995.
+        http://trac.webkit.org/changeset/141995
+        https://bugs.webkit.org/show_bug.cgi?id=109046
+
+        May allow me to roll out the real problem (Requested by
+        schenney on #webkit).
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::sendWebIntentResponse):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+
+2013-02-06  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] fix android build which doesn't support intents
+
+        Unreviewed build fix.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::sendWebIntentResponse):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+
+2013-02-06  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] turn TestRunner library into a component build
+        https://bugs.webkit.org/show_bug.cgi?id=108466
+
+        Reviewed by Adam Barth.
+
+        To achieve this, we need to drop all dependencies on WTF.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTask.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElementList::getOrCreate):
+        (WebTestRunner::AccessibilityUIElementList::createRoot):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElementList):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner::CppBoundClass::~CppBoundClass):
+        (WebTestRunner::CppBoundClass::invoke):
+        (WebTestRunner::CppBoundClass::getProperty):
+        (WebTestRunner::CppBoundClass::setProperty):
+        (WebTestRunner::CppBoundClass::bindCallback):
+        (WebTestRunner::CppBoundClass::bindGetterCallback):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::getAsCppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        (CppBoundClass):
+        (WebTestRunner::CppBoundClass::bindProperty):
+        (WebTestRunner::CppBoundClass::bindFallbackCallback):
+        (WebTestRunner::CppBoundClass::bindFallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner::CppVariant::toString):
+        (WebTestRunner::CppVariant::toInt32):
+        (WebTestRunner::CppVariant::toDouble):
+        (WebTestRunner::CppVariant::toBoolean):
+        (WebTestRunner::CppVariant::toStringVector):
+        (WebTestRunner::CppVariant::invoke):
+        (WebTestRunner::CppVariant::invokeDefault):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (CppVariant):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::reset):
+        (WebTestRunner::EventSender::mouseDown):
+        (WebTestRunner::EventSender::mouseUp):
+        (WebTestRunner::EventSender::mouseMoveTo):
+        (WebTestRunner::EventSender::keyDown):
+        (WebTestRunner::EventSender::dispatchMessage):
+        (WebTestRunner::EventSender::leapForward):
+        (WebTestRunner::EventSender::replaySavedEvents):
+        (WebTestRunner::makeMenuItemStringsFor):
+        (WebTestRunner::EventSender::contextClick):
+        (WebTestRunner::EventSender::beginDragWithFiles):
+        (WebTestRunner::EventSender::addTouchPoint):
+        (WebTestRunner::EventSender::releaseTouchPoint):
+        (WebTestRunner::EventSender::updateTouchPoint):
+        (WebTestRunner::EventSender::cancelTouchPoint):
+        (WebTestRunner::EventSender::sendCurrentTouchEvent):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp:
+        (WebTestRunner::NativeKeyCodeForWindowsKeyCode):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        (WebTestRunner::MockGrammarCheck::checkGrammarOfString):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h:
+        (WebTestRunner):
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (WebTestRunner::MockSpellCheck::spellCheckWord):
+        (WebTestRunner::MockSpellCheck::initializeIfNeeded):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp:
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestCommon.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        (isASCIIAlpha):
+        (isNotASCIIAlpha):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp:
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h:
+        (TestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::simulateLegacyWebNotificationClick):
+        (WebTestRunner::TestRunner::setMockSpeechInputDumpRect):
+        (WebTestRunner::TestRunner::wasMockSpeechRecognitionAborted):
+        (WebTestRunner::TestRunner::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner::TextInputController::markedRange):
+        (WebTestRunner::TextInputController::selectedRange):
+        (WebTestRunner::TextInputController::firstRectForCharacterRange):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebTask.cpp:
+        (WebTestRunner::WebTaskList::~WebTaskList):
+        (WebTestRunner::WebTaskList::registerTask):
+        (WebTestRunner::WebTaskList::unregisterTask):
+        (WebTestRunner::WebTaskList::revokeAll):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        * DumpRenderTree/chromium/TestRunner/src/config.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+
+2013-02-06  Mike West  <mkwst@chromium.org>
+
+        Add an ENABLE_NOSNIFF feature flag.
+        https://bugs.webkit.org/show_bug.cgi?id=109029
+
+        Reviewed by Jochen Eisinger.
+
+        This new flag will control the behavior of 'X-Content-Type-Options: nosniff'
+        when processing script and other resource types.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2013-02-06  Tommy Widenflycht  <tommyw@google.com>
+
+        MediaStream API: Implement DTMF support in RTCPeerConnection
+        https://bugs.webkit.org/show_bug.cgi?id=106782
+
+        Reviewed by Adam Barth.
+
+        Adding Mock functionality for the DTMFSender.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.cpp: Added.
+        (DTMFSenderToneTask):
+        (DTMFSenderToneTask::DTMFSenderToneTask):
+        (MockWebRTCDTMFSenderHandler::MockWebRTCDTMFSenderHandler):
+        (MockWebRTCDTMFSenderHandler::setClient):
+        (MockWebRTCDTMFSenderHandler::currentToneBuffer):
+        (MockWebRTCDTMFSenderHandler::canInsertDTMF):
+        (MockWebRTCDTMFSenderHandler::insertDTMF):
+        * DumpRenderTree/chromium/MockWebRTCDTMFSenderHandler.h: Copied from Source/Platform/chromium/public/WebMediaStreamTrack.h.
+        (MockWebRTCDTMFSenderHandler):
+        (MockWebRTCDTMFSenderHandler::taskList):
+        (MockWebRTCDTMFSenderHandler::clearToneBuffer):
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::createDTMFSender):
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h:
+        (MockWebRTCPeerConnectionHandler):
+
+2013-02-06  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        Unreviewed. Update my email address in committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-05  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
+
+        [CMake] Don't warn unused cmake variables which aren't used by cmake ports
+        https://bugs.webkit.org/show_bug.cgi?id=108761
+
+        Reviewed by Laszlo Gombos.
+
+        Ignore unused macro variables which aren't used by cmake ports.
+
+        * Scripts/webkitdirs.pm:
+        (generateBuildSystemFromCMakeProject):
+
+2013-02-05  Julie Parent  <jparent@chromium.org>
+
+        Add cc_unittests to the dashboards
+        https://bugs.webkit.org/show_bug.cgi?id=108878
+
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/builders.js:
+        (loadBuildersList):
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (currentBuilderGroupCategory):
+
+2013-02-05  Adam Barth  <abarth@webkit.org>
+
+        DumpRenderTree should be able to enable the threaded parser
+        https://bugs.webkit.org/show_bug.cgi?id=108970
+
+        Reviewed by Eric Seidel.
+
+        We can now enable the parser at runtime using --enable-threaded-html-parser.
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (main):
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        (WebPreferences):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner::WebPreferences::applyTo):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        (TestShell::resetWebSettings):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::setThreadedHTMLParser):
+        (TestShell):
+
+2013-02-05  Benjamin Poulain  <bpoulain@apple.com>
+
+        Make StringBuilder::toAtomicString() consistent with StringBuilder::toString() for strings of null length
+        https://bugs.webkit.org/show_bug.cgi?id=108894
+
+        Reviewed by Andreas Kling.
+
+        * TestWebKitAPI/Tests/WTF/StringBuilder.cpp:
+        Extend the tests to check toAtomicString() on an empty builder.
+
+2013-02-05  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] remove methods from the WebTestRunner interface that are only used by WebTestProxyBase
+        https://bugs.webkit.org/show_bug.cgi?id=108926
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebKit):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2013-02-05  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] remove unneccessary 0 checks for testRunner now that the TestRunner library owns it
+        https://bugs.webkit.org/show_bug.cgi?id=108923
+
+        Reviewed by Kentaro Hara.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::shouldBeginEditing):
+        (WebTestRunner::WebTestProxyBase::shouldEndEditing):
+        (WebTestRunner::WebTestProxyBase::shouldInsertNode):
+        (WebTestRunner::WebTestProxyBase::shouldInsertText):
+        (WebTestRunner::WebTestProxyBase::shouldChangeSelectedRange):
+        (WebTestRunner::WebTestProxyBase::shouldDeleteRange):
+        (WebTestRunner::WebTestProxyBase::shouldApplyStyle):
+        (WebTestRunner::WebTestProxyBase::didBeginEditing):
+        (WebTestRunner::WebTestProxyBase::didChangeSelection):
+        (WebTestRunner::WebTestProxyBase::didChangeContents):
+        (WebTestRunner::WebTestProxyBase::didEndEditing):
+        (WebTestRunner::WebTestProxyBase::createView):
+        (WebTestRunner::WebTestProxyBase::setStatusText):
+        (WebTestRunner::WebTestProxyBase::didStopLoading):
+        (WebTestRunner::WebTestProxyBase::isSmartInsertDeleteEnabled):
+        (WebTestRunner::WebTestProxyBase::isSelectTrailingWhitespaceEnabled):
+        (WebTestRunner::WebTestProxyBase::willPerformClientRedirect):
+        (WebTestRunner::WebTestProxyBase::didCancelClientRedirect):
+        (WebTestRunner::WebTestProxyBase::didStartProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didReceiveServerRedirectForProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didFailProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didCommitProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didReceiveTitle):
+        (WebTestRunner::WebTestProxyBase::didFinishDocumentLoad):
+        (WebTestRunner::WebTestProxyBase::didHandleOnloadEvents):
+        (WebTestRunner::WebTestProxyBase::didFailLoad):
+        (WebTestRunner::WebTestProxyBase::didFinishLoad):
+        (WebTestRunner::WebTestProxyBase::didChangeLocationWithinPage):
+        (WebTestRunner::WebTestProxyBase::didDisplayInsecureContent):
+        (WebTestRunner::WebTestProxyBase::didRunInsecureContent):
+        (WebTestRunner::WebTestProxyBase::didDetectXSS):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        (WebTestRunner::WebTestProxyBase::willRequestResource):
+        (WebTestRunner::WebTestProxyBase::didCreateDataSource):
+        (WebTestRunner::WebTestProxyBase::willSendRequest):
+        (WebTestRunner::WebTestProxyBase::didReceiveResponse):
+        (WebTestRunner::WebTestProxyBase::didFinishResourceLoad):
+        (WebTestRunner::WebTestProxyBase::didFailResourceLoad):
+        (WebTestRunner::WebTestProxyBase::runModalBeforeUnloadDialog):
+        (WebTestRunner::WebTestProxyBase::locationChangeDone):
+        (WebTestRunner::WebTestProxyBase::decidePolicyForNavigation):
+        (WebTestRunner::WebTestProxyBase::willCheckAndDispatchMessageEvent):
+
+2013-02-04  Alan Cutter  <alancutter@chromium.org>
+
+        EWS bots don't remove untracked files after processing a patch
+        https://bugs.webkit.org/show_bug.cgi?id=108891
+
+        Reviewed by Adam Barth.
+
+        Added option to remove untracked files in the bot's repo.
+
+        * EWSTools/start-queue.sh:
+
+2013-02-04  Benjamin Poulain  <bpoulain@apple.com>
+
+        Kill suspendAnimation(), resumeAnimation() and numberOfActiveAnimations() from DRT/WTR; use Internals
+        https://bugs.webkit.org/show_bug.cgi?id=108741
+
+        Reviewed by Tony Chang.
+
+        Remove all support for suspendAnimation(), resumeAnimation() and numberOfActiveAnimations().
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2013-02-04  Nico Weber  <thakis@chromium.org>
+
+        [chromium] Try to get WebKit building with enable_web_intents set to 0 on Windows too.
+        https://bugs.webkit.org/show_bug.cgi?id=108887
+
+        Reviewed by Kentaro Hara.
+
+        This is a follow-up to http://trac.webkit.org/changeset/141614. The
+        Mac and Linux linkers didn't complain about the reference to
+        WebIntent in that function for some reason (probably because it's
+        a dead function that's stripped).
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2013-02-04  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: Make builder a real dashboardSpecificParameter.
+        https://bugs.webkit.org/show_bug.cgi?id=108706
+
+        Reviewed by Dirk Pranke.
+        
+        Add builder to g_defaultDashboardSpecificParameter maps for the
+        dashboards where it is used (flakiness, timeline, treemap).
+        Default it to null, and then update reads of it to check the
+        builder group's default if one is not set, rather than trying to
+        set and track this everywhere.
+        This allows us to remove tons of special-casing of builder parsing,
+        including where we used to add it to the query string even when the
+        user did not specify it.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseParameters):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (generatePage):
+        (handleQueryParameterChange):
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+        * TestResultServer/static-dashboards/treemap.html:
+
+2013-02-04  Julie Parent  <jparent@chromium.org>
+
+        Setting tests on flakiness dashboard should invalidate builder.
+        https://bugs.webkit.org/show_bug.cgi?id=108521
+
+        Reviewed by Dirk Pranke.
+        
+        When you move into a cross builder view, builder should not still be
+        set.  Currently, it is deleted from the internal state, but still shows
+        up in the url, causing the current state and the hash to not match.
+        
+        To see this in action, load the flakiness dashboard, select a builder,
+        and then click on an individual test, to get into individual test view.
+        The url will still have the builder you selected listed, even though it
+        is cleared in the UI.
+        
+        The fix is to consider 'tests' to be a parameter that invalidates builder.
+
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+
+2013-02-04  Kenneth Rohde Christiansen  <kenneth@webkit.org>
+
+        [EFL][WK2] Introduce a WebView class as counterpart for WKViewRef
+        https://bugs.webkit.org/show_bug.cgi?id=107931
+
+        Reviewed by Anders Carlsson.
+
+        Change platformView to be a WKView and use WKViewGetEvasObject
+        for the places where an Evas_Object is needed.
+
+        Instead of extracting the Ecore_Evas* from the m_view we use
+        the m_window instead, which actually holds the it.
+
+        * TestWebKitAPI/PlatformWebView.h:
+        * TestWebKitAPI/efl/PlatformWebView.cpp:
+        (TestWebKitAPI::PlatformWebView::PlatformWebView):
+        (TestWebKitAPI::PlatformWebView::~PlatformWebView):
+        (TestWebKitAPI::PlatformWebView::resizeTo):
+        (TestWebKitAPI::PlatformWebView::page):
+        (TestWebKitAPI::PlatformWebView::simulateSpacebarKeyPress):
+        (TestWebKitAPI::PlatformWebView::simulateMouseMove):
+        (TestWebKitAPI::PlatformWebView::simulateRightClick):
+        * WebKitTestRunner/PlatformWebView.h:
+        * WebKitTestRunner/efl/EventSenderProxyEfl.cpp:
+        (WTR::EventSenderProxy::sendTouchEvent):
+        (WTR::EventSenderProxy::setTouchModifier):
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+        (WTR::PlatformWebView::~PlatformWebView):
+        (WTR::PlatformWebView::resizeTo):
+        (WTR::PlatformWebView::page):
+        (WTR::PlatformWebView::focus):
+        (WTR::PlatformWebView::windowFrame):
+        (WTR::PlatformWebView::setWindowFrame):
+        (WTR::PlatformWebView::windowSnapshotImage):
+
+2013-02-04  Timothy Loh  <timloh@chromium.com>
+
+        Don't update author info in PrepareChangeLog and allow users to skip the PrepareChangeLog step entirely.
+        https://bugs.webkit.org/show_bug.cgi?id=108788
+
+        Reviewed by Ryosuke Niwa.
+
+        As per discussion in Bug 74358, it's probably preferable to remove the
+        behaviour of updating the author details in a ChangeLog entry. We also
+        want to be able to skip preparing change logs (e.g. rebaselining many
+        tests), so a --no-prepare-changelogs option is added to webkit-patch.
+
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        (ChangeLogEntry._parse_entry):
+        (ChangeLogEntry.date): Added
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (test_parse_log_entries_from_changelog):
+        * Scripts/webkitpy/tool/commands/commandtest.py:
+        (CommandsTest.assert_execute_outputs):
+        * Scripts/webkitpy/tool/steps/options.py:
+        (Options): Added --no-prepare-changelogs
+        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog.options):
+        (PrepareChangeLog._merge_entries): date_line() gets the entire line, including
+        the author's name and email, but we only want to replace the date.
+        (PrepareChangeLog.run):
+        * Scripts/webkitpy/tool/steps/preparechangelog_unittest.py:
+        (PrepareChangeLogTest.test_resolve_existing_entry): Added tests for changed
+        authors. Removed unneeded variable.
+
+2013-02-04  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] Remove WebEventSender and WebAccessibilityController from public TestRunner API
+        https://bugs.webkit.org/show_bug.cgi?id=108467
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebAccessibilityController.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebEventSender.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestRunner):
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestRunner):
+        (WebTestProxyBase):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        (WebTestRunner::TestInterfaces::setWebView):
+        (WebTestRunner::TestInterfaces::webView):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebAccessibilityController.cpp: Removed.
+        * DumpRenderTree/chromium/TestRunner/src/WebEventSender.cpp: Removed.
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::~WebTestInterfaces):
+        (WebTestRunner::WebTestInterfaces::setWebView):
+        (WebTestRunner::WebTestInterfaces::setDelegate):
+        (WebTestRunner::WebTestInterfaces::bindTo):
+        (WebTestRunner::WebTestInterfaces::resetAll):
+        (WebTestRunner::WebTestInterfaces::setTestIsRunning):
+        (WebTestRunner::WebTestInterfaces::webView):
+        (WebTestRunner::WebTestInterfaces::testRunner):
+        (WebTestRunner::WebTestInterfaces::testInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::setInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestRunner.cpp: Removed.
+        * DumpRenderTree/chromium/TestShell.h:
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-02-04  Bruno de Oliveira Abinader  <bruno.abinader@basyskom.com>
+
+        [EFL] Add "full screen" parameter to MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=108850
+
+        Reviewed by Antonio Gomes.
+
+        Implements the {-F,--full-screen}={true,false} parameter to WebKit EFL's
+        MiniBrowser.
+
+        * MiniBrowser/efl/main.c:
+        (window_create):
+        (elm_main):
+        Added '-F/--full-screen' parameter functionality.
+
+2013-02-04  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] remove WebTestPlugin from the public TestRunner API
+        https://bugs.webkit.org/show_bug.cgi?id=108467
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestPlugin.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::createPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp: Renamed from Tools/DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp.
+        (WebTestRunner::TestPlugin::TestPlugin):
+        (WebTestRunner):
+        (WebTestRunner::TestPlugin::~TestPlugin):
+        (WebTestRunner::TestPlugin::initialize):
+        (WebTestRunner::TestPlugin::destroy):
+        (WebTestRunner::TestPlugin::updateGeometry):
+        (WebTestRunner::TestPlugin::parsePrimitive):
+        (WebTestRunner::TestPlugin::parseColor):
+        (WebTestRunner::TestPlugin::parseOpacity):
+        (WebTestRunner::TestPlugin::parseBoolean):
+        (WebTestRunner::TestPlugin::initScene):
+        (WebTestRunner::TestPlugin::drawScene):
+        (WebTestRunner::TestPlugin::destroyScene):
+        (WebTestRunner::TestPlugin::initProgram):
+        (WebTestRunner::TestPlugin::initPrimitive):
+        (WebTestRunner::TestPlugin::drawPrimitive):
+        (WebTestRunner::TestPlugin::loadShader):
+        (WebTestRunner::TestPlugin::loadProgram):
+        (WebTestRunner::TestPlugin::handleInputEvent):
+        (WebTestRunner::TestPlugin::handleDragStatusUpdate):
+        (WebTestRunner::TestPlugin::create):
+        (WebTestRunner::TestPlugin::mimeType):
+        * DumpRenderTree/chromium/TestRunner/src/TestPlugin.h: Added.
+        (WebTestRunner):
+        (TestPlugin):
+        (WebTestRunner::TestPlugin::scriptableObject):
+        (WebTestRunner::TestPlugin::canProcessDrag):
+        (WebTestRunner::TestPlugin::paint):
+        (WebTestRunner::TestPlugin::updateFocus):
+        (WebTestRunner::TestPlugin::updateVisibility):
+        (WebTestRunner::TestPlugin::acceptsInputEvents):
+        (WebTestRunner::TestPlugin::didReceiveResponse):
+        (WebTestRunner::TestPlugin::didReceiveData):
+        (WebTestRunner::TestPlugin::didFinishLoading):
+        (WebTestRunner::TestPlugin::didFailLoading):
+        (WebTestRunner::TestPlugin::didFinishLoadingFrameRequest):
+        (WebTestRunner::TestPlugin::didFailLoadingFrameRequest):
+        (WebTestRunner::TestPlugin::isPlaceholder):
+        (WebTestRunner::TestPlugin::prepareTexture):
+        (WebTestRunner::TestPlugin::context):
+        (Scene):
+        (WebTestRunner::TestPlugin::Scene::Scene):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::createPlugin):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createPlugin):
+
+2013-02-04  Gustavo Noronha Silva  <gns@gnome.org>
+
+        Add a new method for obtaining a build-type-dependent path,
+        instead of modifying all call sites to pass it in.
+
+        Reviewed by Martin Robinson.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner.__init__): use the new method, which takes a tuple.
+        (TestRunner._setup_testing_environment): ditto.
+        * gtk/common.py:
+        (get_build_path): accept a tuple that may include Release and
+        Debug as build types, for searching.
+        (build_path_for_build_types): new method that finds the path when
+        it is dependent on the build type.
+        (build_path): restore its original behaviour.
+
+2013-02-04  David Kilzer  <ddkilzer@apple.com>
+
+        Remove duplicate entry from DumpRenderTree Xcode project
+
+            $ uniq Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj | diff -u - Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj | patch -p0 -R
+            patching file Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj
+
+        * DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj:
+        Remove duplicate.
+
+2013-02-04  David Kilzer  <ddkilzer@apple.com>
+
+        Sort TestWebKitAPI Xcode project file
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+
+2013-02-03  Alan Cutter  <alancutter@chromium.org>
+
+        PatchLogs are not getting created on QueueStatusServer
+        https://bugs.webkit.org/show_bug.cgi?id=108593
+
+        Reviewed by Eric Seidel.
+
+        Added missing "added" patch event to submit-to-ews handler.
+
+        * QueueStatusServer/app.yaml:
+        * QueueStatusServer/handlers/submittoews.py:
+        (SubmitToEWS._add_attachment_to_ews_queues):
+
+2013-02-03  Douglas Stockwell  <dstockwell@chromium.org>
+
+        Unreviewed. Add dstockwell as a contributor in comitters.py and to the watchlist for animation
+        https://bugs.webkit.org/show_bug.cgi?id=108777
+
+        * Scripts/webkitpy/common/config/committers.py:
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-02-03  Sam Weinig  <sam@webkit.org>
+
+        Fix failing test.
+
+        * TestWebKitAPI/Tests/WebKit2/ShouldGoToBackForwardListItem.cpp:
+        (TestWebKitAPI::didFinishLoadForFrame):
+
+2013-02-03  Timothy Loh  <timloh@chromium.com>
+
+        Make ChangeLogEntry detect annotations by prepare-ChangeLog (Added/Removed/Copied from/Renamed from) as clean.
+        https://bugs.webkit.org/show_bug.cgi?id=108433
+
+        Reviewed by Eric Seidel.
+
+        PrepareChangeLog is supposed to update the file/function list if we
+        haven't touched it, but the existing regex doesn't handle the
+        annotations prepare-ChangeLog adds (e.g. "Added.")
+
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        (ChangeLogEntry.is_touched_files_text_clean):
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (test_is_touched_files_text_clean):
+
+2013-02-02  Dean Jackson  <dino@apple.com>
+
+        Add Antoine Quint to the list of committers
+        https://bugs.webkit.org/show_bug.cgi?id=108750
+
+        No review necessary.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-02  Patrick Gansterer  <paroga@webkit.org>
+
+        [CMake] Adopt the WinCE port to new CMake
+        https://bugs.webkit.org/show_bug.cgi?id=108754
+
+        Reviewed by Laszlo Gombos.
+
+        * WinCELauncher/CMakeLists.txt: Mark WinCELauncher
+        as WIN32 target to use the correct entry point.
+
+2013-02-02  Alexey Proskuryakov  <ap@apple.com>
+
+        One is not allowed to use commit-queue to make oneself a committer.
+
+        * Scripts/webkitpy/common/config/committers.py: Rolled out r141693.
+        Also, changed e-mail order for Yongjun Zhang, so that Bugzilla autocomplete works.
+
+2013-02-02  Antoine Quint  <graouts@apple.com>
+
+        Add Antoine Quint to the list of committers
+        https://bugs.webkit.org/show_bug.cgi?id=108750
+
+        Reviewed by Dean Jackson.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-02-01  Adrian Perez de Castro  <aperez@igalia.com>
+
+        [GTK] Building fails in an armv5tel board
+        https://bugs.webkit.org/show_bug.cgi?id=108083
+
+        Reviewed by Martin Robinson.
+
+        In some systems in which $architecture is filled-in from "uname -m"
+        the value may not start with "arm-", but with "armvN", where "N" is
+        an architecture version number. The regexp in isARM() is modified
+        so it covers these kind of cases.
+
+        * Scripts/webkitdirs.pm:
+        (isARM):
+
+2013-02-01  Gregg Tavares  <gman@google.com>
+
+        Update LayoutTests scripts to skip webgl folder on ports
+        https://bugs.webkit.org/show_bug.cgi?id=108705
+
+        Reviewed by Dirk Pranke.
+
+        I'm working on checking in the WebGL Conformance Tests
+        as layout tests into LayoutTests/webgl. For ports
+        that do not have WebGL enabled this changes will
+        skip tests in the "webgl" folder.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port._missing_symbol_to_skipped_tests):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (PortTestCase.test_skipped_directories_for_symbols):
+
+2013-02-01  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Fix for webkitpy tests.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+
+2013-02-01  Jer Noble  <jer.noble@apple.com>
+
+        LLDB: add synthetic provider for WTF::HashTable
+        https://bugs.webkit.org/show_bug.cgi?id=108718
+
+        Reviewed by Darin Adler.
+
+        Add a synthetic provider which will emit the contents of a given
+        WTF::HashTable. This allows clients using Xcode/lldb to enumerate
+        the hash contents.
+
+        * lldb/lldb_webkit.py:
+        (__lldb_init_module):
+        (__lldb_init_module.lldb_webkit):
+        (WTFHashTable_SummaryProvider):
+        (WTFVectorProvider.has_children):
+        (WTFHashTableProvider):
+        (WTFHashTableProvider.__init__):
+        (WTFHashTableProvider.num_children):
+        (WTFHashTableProvider.get_child_index):
+        (WTFHashTableProvider.get_child_at_index):
+        (WTFHashTableProvider.tableSize):
+        (WTFHashTableProvider.keyCount):
+        (WTFHashTableProvider.update):
+        (WTFHashTableProvider.has_children):
+
+2013-02-01  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Fix webkitpy tests since a build_style is not specified in some cases.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+
+2013-02-01  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Re-try enabling Win-EWS tests for the third time. 
+        https://bugs.webkit.org/show_bug.cgi?id=107968
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-01-31  Roger Fong  <roger_fong@apple.com>
+
+        Fix test scripts for EWS bots to get them running once and for all.
+        https://bugs.webkit.org/show_bug.cgi?id=108422
+
+        Reviewed by Timothy Horton.
+
+        Disabling --quiet option on Windows for now because that fails when we try to use /dev/null.
+        runtests.py was not passing in a configuration to run-webkit-tests which causes DRT to build in release by default.
+        However, we build in Debug only on the EWS Windows bots, which caused the build to fail.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.options):
+        (RunTests.run):
+
+2013-02-01  Nico Weber  <thakis@chromium.org>
+
+        [chromium] Build webkit with enable_web_intents set to 0.
+        https://bugs.webkit.org/show_bug.cgi?id=108408
+
+        Reviewed by Tony Chang.
+
+        I'll then make chromium build fine with that, then switch
+        enable_web_intents to 0, roll that into webkit, and then
+        actually remove the code hidden behind this flag.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-02-01  Zan Dobersek  <zdobersek@igalia.com>
+
+        Set the GTK 64-bit Debug builder to build and test only WebKit1
+        https://bugs.webkit.org/show_bug.cgi?id=108648
+
+        Reviewed by Philippe Normand.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json: Change the builder name, type and
+        build directory to note that the builder builds and tests only the WebKit1 port on the GTK platform.
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (CompileWebKit1Only): Add the new build class that builds only the WebKit1 port of the builder's platform.
+        (BuildAndTestWebKit1OnlyFactory): Add the new factory that uses the CompileWebKit1Only build class
+        for building and testing only WebKit1 on the builder's platform.
+
+2013-02-01  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move ownership of TestRunner object to TestInterfaces
+        https://bugs.webkit.org/show_bug.cgi?id=108464
+
+        Reviewed by Adam Barth.
+
+        Before, TestShell owned the class. This also removes the last include
+        from DumpRenderTree to TestRunner/src.
+
+        This also deletes TestDelegate and uses WebTestDelegate everywhere
+        instead.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebKit):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.h:
+        (WebTestRunner):
+        (WebTestRunner::AccessibilityController::setDelegate):
+        (AccessibilityController):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::makeMenuItemStringsFor):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::setDelegate):
+        (EventSender):
+        * DumpRenderTree/chromium/TestRunner/src/GamepadController.cpp:
+        (WebTestRunner::GamepadController::setDelegate):
+        * DumpRenderTree/chromium/TestRunner/src/GamepadController.h:
+        (WebTestRunner):
+        (GamepadController):
+        * DumpRenderTree/chromium/TestRunner/src/TestDelegate.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner::TestInterfaces::TestInterfaces):
+        (WebTestRunner::TestInterfaces::~TestInterfaces):
+        (WebTestRunner::TestInterfaces::setWebView):
+        (WebTestRunner::TestInterfaces::setDelegate):
+        (WebTestRunner::TestInterfaces::bindTo):
+        (WebTestRunner::TestInterfaces::resetAll):
+        (WebTestRunner):
+        (WebTestRunner::TestInterfaces::setTestIsRunning):
+        (WebTestRunner::TestInterfaces::testRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (WebTestRunner):
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebKit):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::Internal::testRunner):
+        (WebTestInterfaces::Internal):
+        (WebTestRunner::WebTestInterfaces::Internal::Internal):
+        (WebTestRunner::WebTestInterfaces::Internal::setDelegate):
+        (WebTestRunner::WebTestInterfaces::Internal::setTestIsRunning):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestRunner.cpp: Added.
+        (WebTestRunner):
+        (WebTestRunner::WebTestRunner::WebTestRunner):
+        (WebTestRunner::WebTestRunner::shouldDumpEditingCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpAsText):
+        (WebTestRunner::WebTestRunner::setShouldDumpAsText):
+        (WebTestRunner::WebTestRunner::shouldGeneratePixelResults):
+        (WebTestRunner::WebTestRunner::setShouldGeneratePixelResults):
+        (WebTestRunner::WebTestRunner::shouldDumpChildFrameScrollPositions):
+        (WebTestRunner::WebTestRunner::shouldDumpChildFramesAsText):
+        (WebTestRunner::WebTestRunner::shouldDumpAsAudio):
+        (WebTestRunner::WebTestRunner::audioData):
+        (WebTestRunner::WebTestRunner::shouldDumpFrameLoadCallbacks):
+        (WebTestRunner::WebTestRunner::setShouldDumpFrameLoadCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpUserGestureInFrameLoadCallbacks):
+        (WebTestRunner::WebTestRunner::stopProvisionalFrameLoads):
+        (WebTestRunner::WebTestRunner::shouldDumpTitleChanges):
+        (WebTestRunner::WebTestRunner::shouldDumpCreateView):
+        (WebTestRunner::WebTestRunner::canOpenWindows):
+        (WebTestRunner::WebTestRunner::shouldDumpResourceLoadCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpResourceRequestCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpResourceResponseMIMETypes):
+        (WebTestRunner::WebTestRunner::webPermissions):
+        (WebTestRunner::WebTestRunner::shouldDumpStatusCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpProgressFinishedCallback):
+        (WebTestRunner::WebTestRunner::shouldDumpBackForwardList):
+        (WebTestRunner::WebTestRunner::deferMainResourceDataLoad):
+        (WebTestRunner::WebTestRunner::shouldDumpSelectionRect):
+        (WebTestRunner::WebTestRunner::testRepaint):
+        (WebTestRunner::WebTestRunner::sweepHorizontally):
+        (WebTestRunner::WebTestRunner::isPrinting):
+        (WebTestRunner::WebTestRunner::shouldStayOnPageAfterHandlingBeforeUnload):
+        (WebTestRunner::WebTestRunner::setTitleTextDirection):
+        (WebTestRunner::WebTestRunner::httpHeadersToClear):
+        (WebTestRunner::WebTestRunner::shouldBlockRedirects):
+        (WebTestRunner::WebTestRunner::willSendRequestShouldReturnNull):
+        (WebTestRunner::WebTestRunner::setTopLoadingFrame):
+        (WebTestRunner::WebTestRunner::topLoadingFrame):
+        (WebTestRunner::WebTestRunner::policyDelegateDone):
+        (WebTestRunner::WebTestRunner::policyDelegateEnabled):
+        (WebTestRunner::WebTestRunner::policyDelegateIsPermissive):
+        (WebTestRunner::WebTestRunner::policyDelegateShouldNotifyDone):
+        (WebTestRunner::WebTestRunner::shouldInterceptPostMessage):
+        (WebTestRunner::WebTestRunner::isSmartInsertDeleteEnabled):
+        (WebTestRunner::WebTestRunner::isSelectTrailingWhitespaceEnabled):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        (TestShell::createMainWindow):
+        (TestShell::~TestShell):
+        (TestShell::runFileTest):
+        (TestShell::resetTestController):
+        (TestShell::dump):
+        (TestShell::bindJSObjectsToWindow):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::testRunner):
+        (TestShell):
+
+2013-02-01  Alan Cutter  <alancutter@chromium.org>
+
+        PatchLog process durations are increasing linearly with time (faulty data logging)
+        https://bugs.webkit.org/show_bug.cgi?id=108621
+
+        Reviewed by Eric Seidel.
+
+        Added a check to prevent a stop event from happening to the same patch multiple times.
+
+        * QueueStatusServer/loggers/recordpatchevent.py:
+        (RecordPatchEvent.stopped):
+
+2013-02-01  Manuel Rego Casasnovas  <rego@igalia.com>
+
+        [GTK][WK2] MiniBrowser fullscreen signals support
+        https://bugs.webkit.org/show_bug.cgi?id=108005
+
+        Reviewed by Carlos Garcia Campos.
+
+        Shows a label for 2 seconds using overlay (if GTK >= 3.2.0) and hides
+        the toolbar when entering fullscreen. When leaving fullscreen the
+        label is hidden (if it's not hidden yet) and the toolbar is shown again.
+
+        * MiniBrowser/gtk/BrowserWindow.c:
+        (_BrowserWindow):
+        (fullScreenMessageTimeoutCallback):
+        (webViewEnterFullScreen):
+        (webViewLeaveFullScreen):
+        (browserWindowFinalize):
+        (browserWindowConstructed):
+
+2013-02-01  Alexis Menard  <alexis@webkit.org>
+
+        Enable unprefixed CSS transitions by default.
+        https://bugs.webkit.org/show_bug.cgi?id=108216
+
+        Reviewed by Dean Jackson.
+
+        Rename the flag CSS_TRANSFORMS_ANIMATIONS_TRANSITIONS_UNPREFIXED
+        to CSS_TRANSFORMS_ANIMATIONS_UNPREFIXED which will be used later to 
+        guard the unprefixing work for CSS Transforms and animations.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2013-01-31  David Farler  <dfarler@apple.com>
+
+        Provide a sensible default architecture when building on iOS SDKs
+        https://bugs.webkit.org/show_bug.cgi?id=108395
+
+        Reviewed by Anders Carlsson.
+
+        * Scripts/webkitdirs.pm:
+        (determineArchitecture): Anchor SDK regex matches at the beginning.
+
+2013-01-31  Ryosuke Niwa  <rniwa@webkit.org>
+
+        buildbot should not rely on webkitpy
+        https://bugs.webkit.org/show_bug.cgi?id=107379
+
+        Reviewed by Eric Seidel.
+
+        Move all Python files used in buildbot configuration into BuildSlaveSupport directory.
+        Once this patch is landed, we can stop restarting the master on webkitpy changes.
+
+        * BuildSlaveSupport/build.webkit.org-config/committer_auth.py:
+        * BuildSlaveSupport/build.webkit.org-config/htdigestparser.py: Copied from Tools/Scripts/webkitpy/common/net/htdigestparser.py.
+        * BuildSlaveSupport/build.webkit.org-config/htdigestparser_unittest.py: Copied from Tools/Scripts/webkitpy/common/net/htdigestparser_unittest.py.
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        * BuildSlaveSupport/build.webkit.org-config/wkbuild.py: Copied from Tools/Scripts/webkitpy/common/config/build.py.
+        * BuildSlaveSupport/build.webkit.org-config/wkbuild_unittest.py: Copied from Tools/Scripts/webkitpy/common/config/build_unittest.py.
+        (ShouldBuildTest.test_should_build):
+        * Scripts/webkitpy/common/config/build.py: Removed.
+        * Scripts/webkitpy/common/config/build_unittest.py: Removed.
+        * Scripts/webkitpy/common/net/htdigestparser.py: Removed.
+        * Scripts/webkitpy/common/net/htdigestparser_unittest.py: Removed.
+
+2013-01-31  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r141349.
+        http://trac.webkit.org/changeset/141349
+        https://bugs.webkit.org/show_bug.cgi?id=108422
+
+        "yet another windows ews fix needed" (Requested by lforschler
+        on #webkit).
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-01-31  Rouslan Solomakhin  <rouslan@chromium.org>
+
+        [Chromium] Suggest 'uppercase' for multi-word misspelling 'upper case'
+        https://bugs.webkit.org/show_bug.cgi?id=108509
+
+        Reviewed by Tony Chang.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (append): Added utility function to append WebString to WebVector.
+        (MockSpellCheck::fillSuggestionList): Suggest 'uppercase' for misspelling 'upper case'.
+
+2013-01-31  David Farler  <dfarler@apple.com>
+
+        Provide a sensible default architecture when building on iOS SDKs
+        https://bugs.webkit.org/show_bug.cgi?id=108395
+
+        Reviewed by Joseph Pecoraro.
+
+        * Scripts/webkitdirs.pm:
+        (determineArchitecture):
+        Check for iphoneos and iphonesimulator SDKs for a default arch.
+        (determineXcodeSDK): Added.
+        (xcodeSDK): Added.
+        (XcodeOptions): Add ARCHS= if defined.
+
+2013-01-31  Christopher Cameron  <ccameron@chromium.org>
+
+        Fix rubber-band effect on non-scrollable pages
+        https://bugs.webkit.org/show_bug.cgi?id=107611
+
+        Add mouseWheelBegin function to EventSender to allow
+        event-based rubber-banding tests.
+
+        Reviewed by Antonio Gomes.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::mouseDragBegin):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (EventSender):
+
+2013-01-31  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Notify the WebWidget when the WebViewHost is about to tear down compositing support
+        https://bugs.webkit.org/show_bug.cgi?id=108518
+
+        Reviewed by Adrienne Walker.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::shutdown):
+
+2013-01-31  Pratik Solanki  <psolanki@apple.com>
+
+        DumpRenderTree should put NSSound calls inside USE(APPKIT)
+        https://bugs.webkit.org/show_bug.cgi?id=108499
+
+        Reviewed by Andy Estes.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (dumpRenderTree):
+
+2013-01-30  Brian Weinstein  <bweinstein@apple.com>
+
+        Add a call to the page UI client to determine if a plug-in should load
+        https://bugs.webkit.org/show_bug.cgi?id=108407
+        <rdar://problem/13066332>
+
+        Add entries for the new function in the necessary structs.
+
+        Reviewed by Anders Carlsson.
+
+        * MiniBrowser/mac/WK2BrowserWindowController.m:
+        (-[WK2BrowserWindowController awakeFromNib]):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createOtherPage):
+        (WTR::TestController::createWebViewWithOptions):
+
+2013-01-31  Florin Malita  <fmalita@chromium.org>
+
+        [Chromium] Unreviewed gardening.
+
+        Win build fix after http://trac.webkit.org/changeset/141471.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (MockSpellCheck::spellCheckWord):
+
+2013-01-31  Enrica Casucci  <enrica@apple.com>
+
+        WebKit2: provide new bundle APIs to allow bundle clients to be notified of pasteboard access.
+        https://bugs.webkit.org/show_bug.cgi?id=108396.
+        <rdar://problem/12920461>
+
+        Reviewed by Alexey Proskuryakov.
+        
+        Adding new WebKit2 test with relevant bundle, to test the new APIs.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2/PasteboardNotifications.mm: Added.
+        (TestWebKitAPI::didReceiveMessageFromInjectedBundle):
+        (TestWebKitAPI::setInjectedBundleClient):
+        * TestWebKitAPI/Tests/WebKit2/PasteboardNotifications_Bundle.cpp: Added.
+        (PasteboardNotificationsTest):
+        (TestWebKitAPI::willWriteToPasteboard):
+        (TestWebKitAPI::getPasteboardDataForRange):
+        (TestWebKitAPI::didWriteToPasteboard):
+        (TestWebKitAPI::PasteboardNotificationsTest::PasteboardNotificationsTest):
+        (TestWebKitAPI::PasteboardNotificationsTest::didCreatePage):
+        * TestWebKitAPI/Tests/WebKit2/execCopy.html: Added.
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: Updated to reflect
+        changes in InjectedBundleEditorClient.
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+
+2013-01-31  Rouslan Solomakhin  <rouslan@chromium.org>
+
+        [Chromium] Add two-word misspelling to mock spellchecker
+        https://bugs.webkit.org/show_bug.cgi?id=108498
+
+        Reviewed by Tony Chang.
+
+        Some layout tests verify spellcheck behavior when multiple words are
+        marked as a single misspelling. This change adds a two-word misspelling
+        'upper case' to the mock spellchecker used by layout tests.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp:
+        (MockSpellCheck::spellCheckWord): Modified to handle spaces in misspellings.
+        (MockSpellCheck::initializeIfNeeded):  Modified to use a vector instead of a hash table.
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+        (MockSpellCheck): Changed misspellings container from hash table to vector.
+
+2013-01-31  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Prospective build fix.
+
+        Reviewed by Jocelyn Turcotte.
+
+        Don't create .prl files for intermediate libs as their contents get
+        injected within -Wl,-whole-archive -lFoo -wl,-no-whole-archive.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2013-01-31  Alan Cutter  <alancutter@chromium.org>
+
+        EWS graphs have unusual data for patch waiting times
+        https://bugs.webkit.org/show_bug.cgi?id=108427
+
+        Reviewed by Eric Seidel.
+
+        The max_patches_waiting QueueLog property may have missed recording patches waiting in idle times when no events are fired to update it. I added a cron job to take care of this issue.
+        The patch wait duration in PatchLogs was being incorrectly updated after a patch expired and was picked up again from the queue. That period should really count towards the processing time instead.
+        Added a WarningLog to record if any erroneous situations occur due to invalid contents in the datastore. These basically highlight if any "impossible" execution paths get executed.
+
+        * QueueStatusServer/app.yaml:
+        * QueueStatusServer/cron.yaml:
+        * QueueStatusServer/handlers/syncqueuelogs.py: Copied from Tools/QueueStatusServer/model/patchlog.py.
+        (SyncQueueLogs):
+        (SyncQueueLogs.get):
+        * QueueStatusServer/loggers/recordpatchevent.py:
+        (RecordPatchEvent.added):
+        (RecordPatchEvent.retrying):
+        (RecordPatchEvent.started):
+        (RecordPatchEvent.stopped):
+        (RecordPatchEvent.updated):
+        * QueueStatusServer/main.py:
+        * QueueStatusServer/model/patchlog.py:
+        (PatchLog.lookup):
+        (PatchLog):
+        (PatchLog.lookup_if_exists):
+        (PatchLog.calculate_process_duration):
+        (PatchLog._generate_key):
+        * QueueStatusServer/model/queuelog.py:
+        (QueueLog.update_max_patches_waiting):
+        (QueueLog._get_or_create_txn):
+        (QueueLog):
+        (QueueLog._get_patches_waiting):
+        * QueueStatusServer/model/warninglog.py: Copied from Tools/QueueStatusServer/model/patchlog.py.
+        (WarningLog):
+        (WarningLog.record):
+
+2013-01-31  Anders Carlsson  <andersca@apple.com>
+
+        Remove Web Intents code from WebKit2
+        https://bugs.webkit.org/show_bug.cgi?id=108506
+
+        Reviewed by Simon Fraser.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.h:
+        (InjectedBundlePage):
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2013-01-31  Tommy Widenflycht  <tommyw@google.com>
+
+        [chromium] MediaStream API: Rename WebMediaStreamDescriptor and WebMediaStreamComponent to WebMediaStream and WebMediaStreamTrack
+        https://bugs.webkit.org/show_bug.cgi?id=108458
+
+        Reviewed by Adam Barth.
+
+        Only renames, no other code changes.
+
+        * DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp:
+        (MockWebMediaStreamCenter::didEnableMediaStreamTrack):
+        (MockWebMediaStreamCenter::didDisableMediaStreamTrack):
+        (MockWebMediaStreamCenter::didAddMediaStreamTrack):
+        (MockWebMediaStreamCenter::didRemoveMediaStreamTrack):
+        (MockWebMediaStreamCenter::didStopLocalMediaStream):
+        (MockWebMediaStreamCenter::didCreateMediaStream):
+        * DumpRenderTree/chromium/MockWebMediaStreamCenter.h:
+        (MockWebMediaStreamCenter):
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::addStream):
+        (MockWebRTCPeerConnectionHandler::removeStream):
+        (MockWebRTCPeerConnectionHandler::getStats):
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h:
+        (MockWebRTCPeerConnectionHandler):
+        * DumpRenderTree/chromium/WebUserMediaClientMock.cpp:
+        (UserMediaRequestTask::UserMediaRequestTask):
+        (WebUserMediaClientMock::requestUserMedia):
+
+2013-01-31  Zan Dobersek  <zdobersek@igalia.com>
+
+        REGRESSION (r141402): incorrectly set injected bundle path when running GTK unit tests
+        https://bugs.webkit.org/show_bug.cgi?id=108496
+
+        Reviewed by Philippe Normand.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner.__init__): Add the build type as a member on the TestRunner interface.
+        (TestRunner._setup_testing_environment): Use the build type member to determine correct path
+        to the injected bundle.
+
+2013-01-31  Christophe Dumez  <dchris@gmail.com>
+
+        [EFL] Disable Web Intents
+        https://bugs.webkit.org/show_bug.cgi?id=108457
+
+        Reviewed by Alexey Proskuryakov.
+
+        Remove EFL DRT code related to Web intents.
+
+        * DumpRenderTree/efl/DumpRenderTreeChrome.cpp:
+        (DumpRenderTreeChrome::createView):
+        (DumpRenderTreeChrome::resetDefaultsToConsistentValues):
+        (DumpRenderTreeChrome::onFrameCreated):
+        * DumpRenderTree/efl/DumpRenderTreeChrome.h:
+        (DumpRenderTreeChrome):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        (TestRunner::sendWebIntentResponse):
+        (TestRunner::deliverWebIntent):
+        * Scripts/webkitperl/FeatureList.pm: Turn off WEB_INTENTS flag
+        for EFL port.
+
+2013-01-31  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Disable force_static_libs_as_shared in developer builds if wk2 is enabled
+
+        Reviewed by Jocelyn Turcotte.
+
+        This is a temporary workaround during the development of #108471, where we move files around
+        but some link time dependencies might remain.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2013-01-31  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Make it possible to compile WebKit2 Qt related files without access to internal WK2 C++ API
+        https://bugs.webkit.org/show_bug.cgi?id=108472
+
+        Reviewed by Andreas Kling.
+
+        Add a new module to the qmake build system that represents the part of the WebKit2 Qt integration
+        that doesn't depend on WebKit2 internals.
+
+        * qmake/mkspecs/features/webkit_modules.prf:
+        * qmake/mkspecs/modules/webkit2qml.prf: Copied from Source/WebKit2/WebKit2.pro.
+
+2013-01-31  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Remove dead transitional code from WebViewImpl
+        https://bugs.webkit.org/show_bug.cgi?id=107889
+
+        Reviewed by Adam Barth.
+
+        ScrollingCoordinatorChromiumTests need to initialize compositing, so its implementation of
+        WebWidgetClient has to support the new compositor initialization path.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::initializeLayerTreeView):
+        (WebViewHost::setWebWidget):
+
+2013-01-31  Gustavo Noronha Silva  <gns@gnome.org>
+
+        [GTK] run-gtk-tests does not respect the -d argument
+        https://bugs.webkit.org/show_bug.cgi?id=107822
+
+        Reviewed by Philippe Normand.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner.__init__): use the value for the debug option to decide what
+        build_type to request a path for.
+        * gtk/common.py:
+        (get_build_path): now accepts a build_type argument instead of trying both
+        Release and Debug in order, defaults to release.
+        (build_path): takes and passes a build_type argument, no default value.
+
+2013-01-31  Christophe Dumez  <dchris@gmail.com>
+
+        Update Christophe Dumez's email address
+        https://bugs.webkit.org/show_bug.cgi?id=108453
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Update my email address in committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-31  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move runModalBeforeUnloadDialog to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=108442
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestRunner::WebTestProxy::runModalBeforeUnloadDialog):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::runModalBeforeUnloadDialog):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-01-31  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move postMessage related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=108343
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::willCheckAndDispatchMessageEvent):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::willCheckAndDispatchMessageEvent):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::willCheckAndDispatchMessageEvent):
+
+2013-01-30  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move remaining resource load related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=108334
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::allowExternalPages):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::canHandleRequest):
+        (WebTestRunner::WebTestProxy::cannotHandleRequestError):
+        (WebTestRunner::WebTestProxy::didCreateDataSource):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::canHandleRequest):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::cannotHandleRequestError):
+        (WebTestRunner::WebTestProxyBase::didCreateDataSource):
+        (WebTestRunner::WebTestProxyBase::willSendRequest):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::canHandleRequest):
+        (WebViewHost::didCreateDataSource):
+        (WebViewHost::willSendRequest):
+        (WebViewHost::allowExternalPages):
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-01-30  Hajime Morrita  <morrita@google.com>
+
+        Unreviewed test failure fix for r141341.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+
+2013-01-30  Levi Weintraub  <leviw@chromium.org>
+
+        [Chromium] WebPluginContainerImpl adding imbalanced touch handler refs
+        https://bugs.webkit.org/show_bug.cgi?id=108381
+
+        Reviewed by James Robinson.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp: Adding an attribute that
+        tickles the case in WebPluginContainerImpl that imbalanced touch handler refs in Document.
+
+2013-01-30  Julie Parent  <jparent@chromium.org>
+
+        Add a concept of dashboard parameters that invalidate others
+        https://bugs.webkit.org/show_bug.cgi?id=108362
+
+        Reviewed by Dirk Pranke.
+
+        There are certain parameters to the dashboards, that when selected,
+        invalidate others, such as selecting the test type invalidates the
+        builder group. Add this concept to dashboard_base and allow specifc
+        dashboard to add their own invalidating parameters.
+        
+        The result is that when the user takes a specific action, like changing
+        the test type, the builder would get reset to the default for the new
+        test type, rather than erroring or not matching the query param, as is
+        the current behavior.
+        
+        Also deletes some unused code (selectBuilder).
+        
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (invalidateQueryParameters):
+        (setQueryParameter):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+        * TestResultServer/static-dashboards/treemap.html:
+
+2013-01-30  Kiran Muppala  <cmuppala@apple.com>
+
+        Disable process suppression of DumpRenderTree on Mac
+        https://bugs.webkit.org/show_bug.cgi?id=108400
+
+        Reviewed by Jessie Berlin.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (prepareConsistentTestingEnvironment): Take assertion to prevent
+        process suppression.
+
+2013-01-30  Roger Fong  <roger_fong@apple.com>
+
+        Enable tests for Windows EWS!
+        https://bugs.webkit.org/show_bug.cgi?id=107968.
+        Patch by Lucas Forschler.
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-01-30  Christophe Dumez  <christophe.dumez@intel.com>
+
+        Add a StringTypeAdapter for ASCIILiteral
+        https://bugs.webkit.org/show_bug.cgi?id=108338
+
+        Reviewed by Benjamin Poulain.
+
+        Add API tests for operator+() taking an ASCIILiteral.
+
+        * TestWebKitAPI/Tests/WTF/StringOperators.cpp:
+        (TestWebKitAPI::TEST):
+
+2013-01-30  Roger Fong  <roger_fong@apple.com>
+
+        Modify runtests.py script so that --skip-failing-tests option is not added when platform is cygwin.
+
+        Rubberstamped by Timothy Horton.
+
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+
+2013-01-30  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r141205.
+        http://trac.webkit.org/changeset/141205
+        https://bugs.webkit.org/show_bug.cgi?id=108353
+
+        Command for running tests on windows needs to be investigated.
+        (Requested by lforschler on #webkit).
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-01-30  Tony Chang  <tony@chromium.org>
+
+        [Chromium] Enable textarea resize corner for tests
+        https://bugs.webkit.org/show_bug.cgi?id=108385
+
+        Reviewed by Ojan Vafai.
+
+        We should test what we ship. Also, this makes us pass more tests in content_shell.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset): Turn on resize corner.
+
+2013-01-30  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move custom policy delegate to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=108328
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::decidePolicyForNavigation):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::policyDelegateEnabled):
+        (WebTestRunner::WebTestRunner::policyDelegateIsPermissive):
+        (WebTestRunner::WebTestRunner::policyDelegateShouldNotifyDone):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateEnabled):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::policyDelegateIsPermissive):
+        (WebTestRunner::TestRunner::policyDelegateShouldNotifyDone):
+        (WebTestRunner::TestRunner::setCustomPolicyDelegate):
+        (WebTestRunner::TestRunner::waitForPolicyDelegate):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::decidePolicyForNavigation):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::decidePolicyForNavigation):
+        (WebViewHost::reset):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-30  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt][WK1] Support better testing of Web Notifications
+        https://bugs.webkit.org/show_bug.cgi?id=107696
+
+        Reviewed by Jocelyn Turcotte.
+
+        Do not dump notification output to the console by default, instead allow the 
+        tests that need this feature to enable it.
+
+        Implement denyWebNotificationPermission and removeAllWebNotificationPermissions.
+        Remove unused m_desktopNotificationAllowedOrigins variable.
+
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunner::TestRunner):
+        (TestRunner::reset):
+        (TestRunner::dumpNotifications):
+        (TestRunner::grantWebNotificationPermission):
+        (TestRunner::denyWebNotificationPermission):
+        (TestRunner::removeAllWebNotificationPermissions):
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+
+2013-01-30  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move methods from WebTestDelegate to WebTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=108309
+
+        Reviewed by Adam Barth.
+
+        By moving more logic to the TestRunner library, we can share more
+        code with content shell.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::createView):
+        (WebTestRunner::WebTestProxy::isSmartInsertDeleteEnabled):
+        (WebTestRunner::WebTestProxy::isSelectTrailingWhitespaceEnabled):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::isSmartInsertDeleteEnabled):
+        (WebTestRunner::WebTestRunner::isSelectTrailingWhitespaceEnabled):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::isSmartInsertDeleteEnabled):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::isSelectTrailingWhitespaceEnabled):
+        (WebTestRunner::TestRunner::setSmartInsertDeleteEnabled):
+        (WebTestRunner::TestRunner::setSelectTrailingWhitespaceEnabled):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::createView):
+        (WebTestRunner::WebTestProxyBase::isSmartInsertDeleteEnabled):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::isSelectTrailingWhitespaceEnabled):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createView):
+        (WebViewHost::didStartLoading):
+        (WebViewHost::didStopLoading):
+        (WebViewHost::isSmartInsertDeleteEnabled):
+        (WebViewHost::isSelectTrailingWhitespaceEnabled):
+        (WebViewHost::reset):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-30  Kwang Yul Seo  <skyul@company100.net>
+
+        Unreviewed. Add Jae Hyun Park to contributor list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-29  Alan Cutter  <alancutter@chromium.org>
+
+        Need a cr-linux debug EWS bot
+        https://bugs.webkit.org/show_bug.cgi?id=98957
+
+        Reviewed by Eric Seidel.
+
+        Added cr-linux-debug-ews bot to webkit-patch, QueueStatusServer and GCE build scripts.
+
+        * EWSTools/GoogleComputeEngine/build-cr-linux-debug-ews.sh: Added.
+        * QueueStatusServer/app.yaml:
+        * QueueStatusServer/config/queues.py: Added.
+        * QueueStatusServer/model/queues.py:
+        (Queue.__init__):
+        (Queue.queue_with_name):
+        (Queue.all):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (ChromiumLinuxDebugEWS):
+
+2013-01-29  Alan Cutter  <alancutter@chromium.org>
+
+        Tidy up Sheriffbot's Sheriffs command's unit tests
+        https://bugs.webkit.org/show_bug.cgi?id=108262
+
+        Reviewed by Eric Seidel.
+
+        Added the use of MockWeb instead of the filesystem to test the sheriffs command.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+        (Sheriffs._retrieve_webkit_sheriffs):
+        (Sheriffs.execute):
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py:
+        (IRCCommandTest.test_sheriffs):
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_0.js: Removed.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_1.js: Removed.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_2.js: Removed.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_malformed.js: Removed.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_zero.js: Removed.
+
+2013-01-29  Lucas Forschler  <lforschler@apple.com>
+
+        Enable tests for Windows EWS!
+        https://bugs.webkit.org/show_bug.cgi?id=107968
+        
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (WinEWS):
+
+2013-01-29  Alan Cutter  <alancutter@chromium.org>
+
+        MockWeb should be able to serve mock web content
+        https://bugs.webkit.org/show_bug.cgi?id=108240
+
+        Reviewed by Dirk Pranke.
+
+        Added the ability to have MockWeb serve mock web data.
+
+        * Scripts/webkitpy/common/host_mock.py:
+        (MockHost.__init__):
+        * Scripts/webkitpy/common/net/web_mock.py:
+        (MockWeb.__init__):
+        (MockWeb.get_binary):
+
+2013-01-29  Jessie Berlin  <jberlin@apple.com>
+
+        run-api-tests should have an option to specify root
+        https://bugs.webkit.org/show_bug.cgi?id=108210
+
+        Reviewed by Ryosuke Niwa.
+
+        * Scripts/run-api-tests:
+        Add the option and use it to set the configuration product directory. Since it is supposed
+        to point to the built products, do not build the products if root is specified (this mimics
+        the behavior of run-javascriptcore-tests).
+
+2013-01-29  Bruno de Oliveira Abinader  <bruno.abinader@basyskom.com>
+
+        [EFL] Add Toggle fullscreen (F11) to MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=108122
+
+        Reviewed by Antonio Gomes.
+
+        Adds fullscreen mode toggle (F11) option to MiniBrowser using native API.
+
+        * MiniBrowser/efl/main.c:
+        (on_key_down): Add 'F11' key handler.
+
+2013-01-29  Patrick Gansterer  <paroga@webkit.org>
+
+        [CMake] Use offical Windows CE support
+        https://bugs.webkit.org/show_bug.cgi?id=108061
+
+        Reviewed by Laszlo Gombos.
+
+        Recent version of CMake has added Windows CE support, but uses a
+        slightly different interface than the patched version used before.
+        Change the command line parameters to use the offical CMake binaries.
+
+        * Scripts/webkitdirs.pm:
+        (cmakeBasedPortArguments):
+
+2013-01-29  Alan Cutter  <alancutter@chromium.org>
+
+        QueueStatusServer needs pages to display historical queue data
+        https://bugs.webkit.org/show_bug.cgi?id=107659
+
+        Reviewed by Eric Seidel.
+
+        Created a /queue-charts/<queue-name> handler to present queue and patch data using Google Chart Tools.
+
+        * QueueStatusServer/app.yaml:
+        * QueueStatusServer/config/charts.py: Copied from Tools/QueueStatusServer/model/queuelog.py.
+        (get_time_unit):
+        * QueueStatusServer/filters/webkit_extras.py:
+        (webkit_linkify):
+        (webkit_bug_id):
+        (webkit_attachment_id):
+        (results_link):
+        (queue_status_link):
+        (queue_charts_link):
+        * QueueStatusServer/handlers/queuecharts.py: Added.
+        (QueueCharts):
+        (QueueCharts.get):
+        (QueueCharts._get_min_med_max):
+        (QueueCharts._get_patch_data):
+        (QueueCharts._get_patch_logs):
+        (QueueCharts._get_queue_data):
+        (QueueCharts._get_queue_logs):
+        (QueueCharts._get_time_unit):
+        (QueueCharts._get_timestamp):
+        (QueueCharts._get_view_range):
+        * QueueStatusServer/handlers/queuestatus.py:
+        (QueueStatus.get):
+        * QueueStatusServer/index.yaml:
+        * QueueStatusServer/main.py:
+        * QueueStatusServer/model/queuelog.py:
+        (QueueLog):
+        (QueueLog.create_key):
+        (QueueLog.get_at):
+        (QueueLog.get_current):
+        (QueueLog.get_or_create):
+        (QueueLog._get_or_create_txn):
+        * QueueStatusServer/stylesheets/charts.css: Added.
+        (.chart):
+        (.choices):
+        * QueueStatusServer/templates/queuecharts.html: Added.
+        * QueueStatusServer/templates/queuestatus.html:
+
+2013-01-29  Mario Sanchez Prada  <mario.prada@samsung.com>
+
+        [GTK] Missing build flags when building with Harfbuzz
+        https://bugs.webkit.org/show_bug.cgi?id=108174
+
+        Reviewed by Martin Robinson.
+
+        Add FREETYPE_CFLAGS and FREETYPE_LIBS to makefiles so -lharfbuzz
+        parameter will be added to linking lines when needed.
+
+        * GNUmakefile.am: Added FREETYPE_CFLAGS and FREETYPE_LIBS.
+        * MiniBrowser/gtk/GNUmakefile.am: Ditto.
+        * TestWebKitAPI/GNUmakefile.am: Ditto.
+
+2013-01-29  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Implement resources API using injected bundle
+        https://bugs.webkit.org/show_bug.cgi?id=107457
+
+        Reviewed by Sam Weinig.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner): Unksip resources unit tests.
+
+2013-01-29  Michael Brüning  <michael.bruning@digia.com>
+
+        Unreviewed, updated my email information.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-29  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] delete DRTTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=108082
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/DRTTestRunner.cpp: Removed.
+        * DumpRenderTree/chromium/DRTTestRunner.h: Removed.
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::testFinished):
+        (WebTestRunner::WebTestDelegate::testTimedOut):
+        (WebTestRunner::WebTestDelegate::isBeingDebugged):
+        (WebTestRunner::WebTestDelegate::layoutTestTimeout):
+        (WebTestRunner::WebTestDelegate::closeRemainingWindows):
+        (WebTestRunner::WebTestDelegate::navigationEntryCount):
+        (WebTestRunner::WebTestDelegate::windowCount):
+        (WebTestRunner::WebTestDelegate::setCustomPolicyDelegate):
+        (WebTestRunner::WebTestDelegate::waitForPolicyDelegate):
+        (WebTestRunner::WebTestDelegate::goToOffset):
+        (WebTestRunner::WebTestDelegate::reload):
+        (WebTestRunner::WebTestDelegate::loadURLForFrame):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::policyDelegateDone):
+        (WebTestRunner::WebTestRunner::shouldInterceptPostMessage):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::WorkQueue::~WorkQueue):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::WorkQueue::processWorkSoon):
+        (WebTestRunner::TestRunner::WorkQueue::processWork):
+        (WebTestRunner::TestRunner::WorkQueue::reset):
+        (WebTestRunner::TestRunner::WorkQueue::addWork):
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::policyDelegateDone):
+        (WebTestRunner::TestRunner::shouldInterceptPostMessage):
+        (WebTestRunner::TestRunner::waitUntilDone):
+        (WebTestRunner::TestRunner::notifyDone):
+        (WebTestRunner::TestRunner::completeNotifyDone):
+        (WorkItemBackForward):
+        (WebTestRunner::WorkItemBackForward::WorkItemBackForward):
+        (WebTestRunner::WorkItemBackForward::run):
+        (WebTestRunner::TestRunner::queueBackNavigation):
+        (WebTestRunner::TestRunner::queueForwardNavigation):
+        (WorkItemReload):
+        (WebTestRunner::WorkItemReload::run):
+        (WebTestRunner::TestRunner::queueReload):
+        (WorkItemLoadingScript):
+        (WebTestRunner::WorkItemLoadingScript::WorkItemLoadingScript):
+        (WebTestRunner::WorkItemLoadingScript::run):
+        (WorkItemNonLoadingScript):
+        (WebTestRunner::WorkItemNonLoadingScript::WorkItemNonLoadingScript):
+        (WebTestRunner::WorkItemNonLoadingScript::run):
+        (WebTestRunner::TestRunner::queueLoadingScript):
+        (WebTestRunner::TestRunner::queueNonLoadingScript):
+        (WorkItemLoad):
+        (WebTestRunner::WorkItemLoad::WorkItemLoad):
+        (WebTestRunner::WorkItemLoad::run):
+        (WebTestRunner::TestRunner::queueLoad):
+        (WorkItemLoadHTMLString):
+        (WebTestRunner::WorkItemLoadHTMLString::WorkItemLoadHTMLString):
+        (WebTestRunner::WorkItemLoadHTMLString::run):
+        (WebTestRunner::TestRunner::queueLoadHTMLString):
+        (WebTestRunner::TestRunner::locationChangeDone):
+        (WebTestRunner::TestRunner::windowCount):
+        (WebTestRunner::TestRunner::setCloseRemainingWindowsWhenComplete):
+        (WebTestRunner::TestRunner::setCustomPolicyDelegate):
+        (WebTestRunner::TestRunner::waitForPolicyDelegate):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        (WorkItem):
+        (WebTestRunner::TestRunner::WorkItem::~WorkItem):
+        (WorkQueue):
+        (WebTestRunner::TestRunner::WorkQueue::WorkQueue):
+        (WebTestRunner::TestRunner::WorkQueue::setFrozen):
+        (WebTestRunner::TestRunner::WorkQueue::isEmpty):
+        (WebTestRunner::TestRunner::WorkQueue::taskList):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        (TestShell::runFileTest):
+        (TestShell::loadURL):
+        (TestShell::createNewWindow):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::testRunner):
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::testFinished):
+        (WebViewHost::testTimedOut):
+        (WebViewHost::isBeingDebugged):
+        (WebViewHost::layoutTestTimeout):
+        (WebViewHost::closeRemainingWindows):
+        (WebViewHost::navigationEntryCount):
+        (WebViewHost::windowCount):
+        (WebViewHost::setCustomPolicyDelegate):
+        (WebViewHost::waitForPolicyDelegate):
+        (WebViewHost::goToOffset):
+        (WebViewHost::reload):
+        (WebViewHost::loadURLForFrame):
+        (WebViewHost::shutdown):
+        (WebViewHost::testRunner):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebTestRunner):
+        (WebViewHost):
+
+2013-01-28  Timothy Loh  <timloh@chromium.com>
+
+        Refactor ChangeLog and PrepareChangeLog to use FileSystem objects
+        https://bugs.webkit.org/show_bug.cgi?id=107903
+
+        Reviewed by Eric Seidel.
+
+        To make ChangeLog and PrepareChangeLog easier to test, we can use
+        FileSystem objects instead of just passing around paths.
+
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        (ChangeLog.__init__):
+        (ChangeLog.parse_latest_entry_from_file):
+        (ChangeLog.parse_entries_from_file):
+        (ChangeLog.latest_entry):
+        (ChangeLog.update_with_unreviewed_message):
+        (ChangeLog.set_reviewer):
+        (ChangeLog.set_short_description_and_bug_url):
+        (ChangeLog.delete_entries):
+        (ChangeLog.prepend_text):
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (ChangeLogTest):
+        (test_parse_log_entries_from_changelog):
+        (test_latest_entry_parse_single_entry):
+        (test_set_reviewer):
+        (test_set_short_description_and_bug_url):
+        (test_delete_entries):
+        (test_prepend_text):
+        * Scripts/webkitpy/common/system/filesystem_mock.py:
+        (ReadableTextFileObject.__init__):
+        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog._ensure_bug_url):
+        (PrepareChangeLog._resolve_existing_entry):
+        (PrepareChangeLog.run):
+        * Scripts/webkitpy/tool/steps/preparechangelog_unittest.py:
+        (test_ensure_bug_url):
+        * Scripts/webkitpy/tool/steps/preparechangelogforrevert_unittest.py:
+        (_assert_message_for_revert_output):
+
+2013-01-28  Raymond Toy  <rtoy@google.com>
+
+        Add myself to committers.py
+        https://bugs.webkit.org/show_bug.cgi?id=107992
+
+        Reviewed by kbr@google.com.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-28  Joseph Pecoraro  <pecoraro@apple.com>
+
+        [Mac] Update PageVisibilityState when WebView is hidden / visible
+        https://bugs.webkit.org/show_bug.cgi?id=107509
+
+        Reviewed by Sam Weinig.
+
+        Add a test that PageVisibility of WK1 WebViews and WK2 WKViews
+        automatically changes between hidden and visible as the view is added
+        and removed from window, or when it is in a window that changes
+        visibility, for instance by minimizing / deminimizing.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.html: Added.
+        * TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.mm: Added.
+        (-[PageVisibilityStateDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]):
+        (runJavaScriptAlert):
+        (PageVisibilityStateWithWindowChanges):
+        (TestWebKitAPI::PageVisibilityStateWithWindowChanges::initializeView):
+        (TestWebKitAPI::PageVisibilityStateWithWindowChanges::teardownView):
+        (TestWebKitAPI::PageVisibilityStateWithWindowChanges::runTest):
+        (TestWebKitAPI::TEST_F):
+        Test visibility state of a page in a WebView/WKView with different window states.
+
+        * TestWebKitAPI/mac/WebKitAgnosticTest.h:
+        * TestWebKitAPI/mac/WebKitAgnosticTest.mm:
+        (TestWebKitAPI::WebKitAgnosticTest::teardownView):
+        (TestWebKitAPI::WebKitAgnosticTest::runWebKit1Test):
+        (TestWebKitAPI::WebKitAgnosticTest::runWebKit2Test):
+        Add a WK1 and WK2 teardownView to balance initializeView.
+
+2013-01-28  Joseph Pecoraro  <pecoraro@apple.com>
+
+        Improve PageVisibility API with enums
+        https://bugs.webkit.org/show_bug.cgi?id=107364
+
+        Reviewed by Sam Weinig.
+
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        (TestRunner::resetPageVisibility):
+        (TestRunner::setPageVisibility):
+        Update the WK1 test code to use the new WK1 enums.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::setVisibilityState):
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.h:
+        (InjectedBundle):
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setPageVisibility):
+        (WTR::TestRunner::resetPageVisibility):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::setVisibilityState):
+        * WebKitTestRunner/TestController.h:
+        (TestController):
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
+        Update the WK2 test code to use the new WK2 API and enums.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::setPageVisibilityStateWithEvalContinuation):
+        (TestWebKitAPI::assertSerializedScriptValueIsStringValue):
+        (TestWebKitAPI::didRunStep1StateChangeVisibleToHidden):
+        (TestWebKitAPI::didRunStep2StateChangeHiddenToPrerender):
+        (TestWebKitAPI::didRunStep3StateChangePrerenderToPreview):
+        (TestWebKitAPI::didRunStep4InStatePreview):
+        (TestWebKitAPI::TEST):
+        Test the new WK2 API with all enum types.
+
+2013-01-28  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] remove temporary define used for updating TestRunner API
+
+        Unreviewed. Clean-up change.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+
+2013-01-28  James Craig  <james@cookiecrook.com>
+
+        HTML5 promotes DL from specific 'definition list' to superset 'description list'; accessibility strings and accessors should be updated to match.
+        https://bugs.webkit.org/show_bug.cgi?id=107650
+
+        Reviewed by Chris Fleizach.
+
+        Updating accessibility strings and accessors for DL/DT/DD.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/Utilities.js:
+        (createDescriptionList):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+
+2013-01-28  Manuel Rego Casasnovas  <rego@igalia.com>
+
+        [GTK][WTR] Update layoutTestController.pathToLocalResource
+        https://bugs.webkit.org/show_bug.cgi?id=107538
+
+        Reviewed by Martin Robinson.
+
+        * WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp:
+        (WTR::TestRunner::pathToLocalResource): Update implementation based on
+        DRT code.
+
+2013-01-28  Manuel Rego Casasnovas  <rego@igalia.com>
+
+        [GTK][WTR] Move getTopLevelPath() to utilities file
+        https://bugs.webkit.org/show_bug.cgi?id=107541
+
+        Reviewed by Martin Robinson.
+
+        * WebKitTestRunner/GNUmakefile.am: Add new files.
+        * WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp:
+        (WTR::getOutputDir): Uses the moved method from InjectedBundleUtilities.
+        * WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.cpp: Added.
+        (WTR):
+        (WTR::topLevelPath): Implementation moved from ActivateFontsGtk.
+        * WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.h: Added.
+        (WTR): Add new method header and documentation.
+
+2013-01-28  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL] Include Ecore_Getopt.h in MiniBrowser.
+        https://bugs.webkit.org/show_bug.cgi?id=108067
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Be explicit and include Ecore_Getopt.h since we use it for parsing
+        command line options. It is safer than relying on other headers
+        including it for us.
+
+        * MiniBrowser/efl/main.c:
+
+2013-01-28  Renata Hodovan  <reni@webkit.org>
+
+        [WK2] Putting QtWebProcess into a chrooted sandbox
+        https://bugs.webkit.org/show_bug.cgi?id=90005
+
+        Reviewed by Anders Carlsson and  Zoltan Herczeg.
+
+        Add feature flag for suid sandbox in linux.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-01-27  David Farler  <dfarler@apple.com>
+
+        REGRESSION (r140912): Broke specifying non-trivial ARCHS value to make / build-webkit
+        https://bugs.webkit.org/show_bug.cgi?id=108028
+
+        Reviewed by Dan Bernstein.
+
+        * DumpRenderTree/Makefile: Reverted.
+        * Makefile: Reverted.
+        * Scripts/webkitdirs.pm: Reverted.
+
+2013-01-27  Zoltan Arvai  <zarvai@inf.u-szeged.hu>
+
+        Fixing atomicIncrement implementation for Windows by dropping support before XP SP2.
+        https://bugs.webkit.org/show_bug.cgi?id=106740
+
+        Reviewed by Benjamin Poulain.
+
+        * DumpRenderTree/config.h:
+        * WinLauncher/stdafx.h:
+
+2013-01-26  David Farler  <dfarler@apple.com>
+
+        Makefiles should work for arbitrary SDKs and architectures on Apple ports
+        https://bugs.webkit.org/show_bug.cgi?id=107863
+
+        Reviewed by David Kilzer.
+
+        * Makefile:
+        Added temporary filters for projects not yet building on iOS.
+        * DumpRenderTree/Makefile:
+        Building with iOS SDKs -> -target All-iOS
+        * Scripts/webkitdirs.pm:
+        (determineConfiguration):
+        Added --configuration switch detection.
+        (determineArchitecture):
+        Added --architecture and ARCH=(.*) switch detection.
+        (argumentsForConfiguration):
+        (determineXcodeSDK):
+        Look for --device, --simulator, and --sdk switches.
+        (xcodeSDK):
+        Added.
+        (XcodeOptions):
+        Determine Xcode SDK and generate -arch switches.
+
+2013-01-25  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move tracking of the top loading frame to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=107948
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::WorkQueue::processWorkSoon):
+        (DRTTestRunner::WorkQueue::processWork):
+        (DRTTestRunner::completeNotifyDone):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::setTopLoadingFrame):
+        (WebTestRunner::WebTestRunner::topLoadingFrame):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setTopLoadingFrame):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::topLoadingFrame):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        (WebTestRunner::TestRunner::locationChangeDone):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::didStartProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didFailProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didFailLoad):
+        (WebTestRunner::WebTestProxyBase::didFinishLoad):
+        (WebTestRunner::WebTestProxyBase::locationChangeDone):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::reset):
+        (WebViewHost::updateURL):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-25  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r140774.
+        http://trac.webkit.org/changeset/140774
+        https://bugs.webkit.org/show_bug.cgi?id=107932
+
+         Tests ScrollingCoordinatorChromiumTest.fastScrollingByDefault
+        and fastScrollingForFixedPosition are failing (Requested by
+        keishi on #webkit).
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::initializeLayerTreeView):
+        (WebViewHost::setWebWidget):
+
+2013-01-25  Alan Cutter  <alancutter@chromium.org>
+
+        Quick fix for Chromium EWS bots running out of space due to a tmp file leak
+        https://bugs.webkit.org/show_bug.cgi?id=107905
+
+        Reviewed by Eric Seidel.
+
+        Added line to EWS loop to clear /tmp of known Chromium test leak.
+        Directories named ".org.chromium.Chromium.XXXXXX" not getting cleaned up.
+
+        * EWSTools/start-queue.sh:
+
+2013-01-25  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Update Anne's email address
+        https://bugs.webkit.org/show_bug.cgi?id=107866
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-24  Alan Cutter  <alancutter@chromium.org>
+
+        HTTP 500 error between QueueStatusServer and bot(s)
+        https://bugs.webkit.org/show_bug.cgi?id=107184
+
+        Reviewed by Adam Barth.
+
+        Removed the use of memcache which was the source of the exception.
+
+        * QueueStatusServer/handlers/updatestatus.py:
+        (UpdateStatus.post):
+        * QueueStatusServer/model/attachment.py:
+        (Attachment):
+        (Attachment.summary):
+
+2013-01-24  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r140653.
+        http://trac.webkit.org/changeset/140653
+        https://bugs.webkit.org/show_bug.cgi?id=107916
+
+        Causes a temp file leak on the bots (Requested by abarth on
+        #webkit).
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::resetTestController):
+
+2013-01-24  Eric Seidel  <eric@webkit.org>
+
+        Skip haslanded_unittest.py on systems which do not have interdiff installed
+        https://bugs.webkit.org/show_bug.cgi?id=106402
+
+        Unreviewed.
+
+        * Scripts/webkitpy/tool/steps/haslanded_unittest.py:
+        (HasLandedTest):
+
+2013-01-24  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Disable the failing webkitpy test for now.
+
+        * Scripts/webkitpy/tool/steps/haslanded_unittest.py:
+
+2013-01-24  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Fixing the diff_parser to correctly identify git diffs even with leading comments.
+        https://bugs.webkit.org/show_bug.cgi?id=107871
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/diff_parser.py:
+        * Scripts/webkitpy/common/checkout/diff_parser_unittest.py:
+        * Scripts/webkitpy/tool/steps/haslanded.py:
+
+2013-01-24  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Remove dead transitional code from WebViewImpl
+        https://bugs.webkit.org/show_bug.cgi?id=107889
+
+        Reviewed by Adrienne Walker.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::initializeLayerTreeView):
+        (WebViewHost::setWebWidget):
+
+2013-01-24  Joshua Bell  <jsbell@chromium.org>
+
+        Add watchlist for IndexedDB development, and add myself and others.
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-01-24  Martin Robinson  <mrobinson@igalia.com>
+
+        Abstract the logic for appending a UChar32 onto StringBuilder
+        https://bugs.webkit.org/show_bug.cgi?id=107505
+
+        Reviewed by Darin Adler.
+
+        * TestWebKitAPI/Tests/WTF/StringBuilder.cpp:
+        (TestWebKitAPI::TEST): Added a simple test for appending UChar32.
+
+2013-01-24  Erik Arvidsson  <arv@chromium.org>
+
+        Unreviewed, rolling out r140703.
+        http://trac.webkit.org/changeset/140703
+        https://bugs.webkit.org/show_bug.cgi?id=107556
+
+        r140561 was not the reason for the Android breakage
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::~TestShell):
+        (TestShell::closeWindow):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::WebViewHost):
+        (WebViewHost::~WebViewHost):
+        (WebViewHost::shutdown):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-24  Dean Jackson  <dino@apple.com>
+
+        Allow some plugin snapshot UI content to come from Injected Bundle
+        https://bugs.webkit.org/show_bug.cgi?id=107852
+
+        Reviewed by Anders Carlsson.
+
+        Null implementations of plugInStartLabelTitle, plugInStartLabelSubtitle and
+        plugInExtraStyleSheet.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage):
+
+2013-01-24  Erik Arvidsson  <arv@chromium.org>
+
+        Unreviewed, rolling out r140561.
+        http://trac.webkit.org/changeset/140561
+        https://bugs.webkit.org/show_bug.cgi?id=107556
+
+        Suspected to break Android which prevens WebKit roll
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::~TestShell):
+        (TestShell::closeWindow):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::WebViewHost):
+        (WebViewHost::~WebViewHost):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-24  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Adding "has-landed" command to webkit-patch which compares a
+        committed patch to the changes which exist locally (ignoring the
+        ChangeLog file).
+
+        https://bugs.webkit.org/show_bug.cgi?id=106402
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/diff_parser.py:
+        (git_diff_to_svn_diff):
+        * Scripts/webkitpy/common/net/bugzilla/bug.py:
+        (Bug.commit_revision):
+        * Scripts/webkitpy/common/net/bugzilla/bug_unittest.py:
+        (BugTest.test_is_in_comments):
+        (BugTest):
+        (BugTest.test_commit_revision):
+        * Scripts/webkitpy/tool/commands/upload.py:
+        (HasLanded):
+        * Scripts/webkitpy/tool/steps/__init__.py:
+        * Scripts/webkitpy/tool/steps/haslanded.py: Added.
+        (HasLanded):
+        (HasLanded.convert_to_svn):
+        (HasLanded.strip_change_log):
+        (run):
+
+        * Scripts/webkitpy/common/net/bugzilla/bug.py:
+        (Bug.commit_revision):
+        * Scripts/webkitpy/common/net/bugzilla/bug_unittest.py:
+        (BugTest.test_is_in_comments):
+        (BugTest):
+        (BugTest.test_commit_revision):
+        * Scripts/webkitpy/tool/commands/upload.py:
+        (HasLanded):
+        * Scripts/webkitpy/tool/steps/__init__.py:
+        * Scripts/webkitpy/tool/steps/haslanded.py: Added.
+        (HasLanded):
+        (HasLanded.convert_to_svn):
+        (HasLanded.strip_change_log):
+        (HasLanded.diff_diff):
+        (HasLanded.run):
+        * Scripts/webkitpy/tool/steps/haslanded_unittest.py: Added.
+        (HasLandedTest):
+        (HasLandedTest.test_run):
+        (test_convert_to_svn_and_strip_change_log):
+
+2013-01-24  Dan Carney  <dcarney@google.com>
+
+        [chromium] move most WebViewHost printf calls to WebTestProxy
+        https://bugs.webkit.org/show_bug.cgi?id=107553
+
+        Reviewed by Jochen Eisinger.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::unableToImplementPolicyWithError):
+        (WebTestRunner::WebTestProxy::didAddMessageToConsole):
+        (WebTestRunner::WebTestProxy::runModalAlertDialog):
+        (WebTestRunner::WebTestProxy::runModalConfirmDialog):
+        (WebTestRunner::WebTestProxy::runModalPromptDialog):
+        (WebTestRunner::WebTestProxy::runModalBeforeUnloadDialog):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::reset):
+        (WebTestRunner::WebTestProxyBase::setLogConsoleOutput):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::unableToImplementPolicyWithError):
+        (WebTestRunner::WebTestProxyBase::didAddMessageToConsole):
+        (WebTestRunner::WebTestProxyBase::runModalAlertDialog):
+        (WebTestRunner::WebTestProxyBase::runModalConfirmDialog):
+        (WebTestRunner::WebTestProxyBase::runModalPromptDialog):
+        (WebTestRunner::WebTestProxyBase::runModalBeforeUnloadDialog):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::showDevTools):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didAddMessageToConsole):
+        (WebViewHost::runModalAlertDialog):
+        (WebViewHost::runModalConfirmDialog):
+        (WebViewHost::runModalPromptDialog):
+        (WebViewHost::runModalBeforeUnloadDialog):
+        (WebViewHost::unableToImplementPolicyWithError):
+        (WebViewHost::reset):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-23  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] Give webkit_support a chance to reset state between layout test runs
+        https://bugs.webkit.org/show_bug.cgi?id=107132
+
+        Reviewed by Adam Barth.
+
+        We currently only have need for this on OS(ANDROID), but now it
+        would be useful to have a hook for resetting state on all
+        platforms. Will soon be using this for IDBFactory initialization.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::resetTestController): Call webkit_support::ResetTestEnvironment()
+
+2013-01-23  Alan Cutter  <alancutter@chromium.org>
+
+        QueueStatusServer crashes in production on next-patch
+        https://bugs.webkit.org/show_bug.cgi?id=107775
+
+        Reviewed by Adam Barth.
+
+        Replaced Python 2.5 incompatible call to timedelta.total_seconds().
+
+        * QueueStatusServer/app.yaml:
+        * QueueStatusServer/model/patchlog.py:
+        (PatchLog.calculate_wait_duration):
+        (PatchLog.calculate_process_duration):
+        (PatchLog):
+        (PatchLog._time_delta_to_seconds):
+
+2013-01-23  Ryosuke Niwa  <rniwa@webkit.org>
+
+        The previous patch wasn't complete. Finish reverting r139998 for real.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/WebInspectorShims.js:
+        (ProfilerAgent.getProfile):
+
+2013-01-23  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Revert r139998 for now since the Leaks Viewer pulls in a specific version of Inspector code.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/WebInspectorShims.js:
+        (ProfilerAgent.getProfile):
+
+2013-01-23  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] Remove unused header files in chromium/public/platform/
+        https://bugs.webkit.org/show_bug.cgi?id=107741
+
+        Reviewed by James Robinson.
+
+        These header files have migrated to the new Platform directory.
+        This patch updates the remaining #include references and removes
+        the old files that did nothing but redirect to the new ones.
+
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h:
+
+2013-01-23  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Bump webkitgtk-test-fonts dependency to cover fallbacks for Tamil, Bengali, and others
+        https://bugs.webkit.org/show_bug.cgi?id=107727
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * gtk/jhbuild.modules: Update the JHBuild moduleset to point to the new webkitgtk-test-fonts.
+        We are using the git repository now that github has deprecated the downloads feature.
+
+2013-01-23  Tony Chang  <tony@chromium.org>
+
+        Unreviewed, set svn:eol-style to CRLF on Windows .sln files.
+
+        * CLWrapper/CLWrapper.sln: Modified property svn:eol-style.
+        * DumpRenderTree/DumpRenderTree.sln: Modified property svn:eol-style.
+        * MIDLWrapper/MIDLWrapper.sln: Modified property svn:eol-style.
+        * WebKitTestRunner/WebKitTestRunner.sln: Modified property svn:eol-style.
+
+2013-01-23  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] Update some #includes in DumpRenderTree for headers in the new Platform directory
+        https://bugs.webkit.org/show_bug.cgi?id=107145
+
+        Reviewed by Adam Barth.
+
+        Part of a larger refactoring series; see tracking bug 82948.
+        
+        * DumpRenderTree/chromium/DRTDevToolsAgent.cpp:
+        * DumpRenderTree/chromium/DRTDevToolsAgent.h:
+        * DumpRenderTree/chromium/DRTDevToolsClient.h:
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        * DumpRenderTree/chromium/MockWebPrerenderingSupport.h:
+        * DumpRenderTree/chromium/MockWebSpeechInputController.cpp:
+        * DumpRenderTree/chromium/MockWebSpeechInputController.h:
+        * DumpRenderTree/chromium/NotificationPresenter.cpp:
+        * DumpRenderTree/chromium/TestNavigationController.h:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        * DumpRenderTree/chromium/TestRunner/src/GamepadController.h:
+        * DumpRenderTree/chromium/TestRunner/src/TestDelegate.h:
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebPermissions.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp:
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        * DumpRenderTree/chromium/TestShell.cpp:
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.h:
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.mm:
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp:
+        * DumpRenderTree/chromium/WebThemeEngineDRTWin.h:
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+
+2013-01-23  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] Use after free in plugins/geturlnotify-during-document-teardown.html
+        https://bugs.webkit.org/show_bug.cgi?id=107556
+
+        Reviewed by Tony Chang.
+
+        WebViewHost initiates a navigation to about:blank in its destructor.
+        However, since WebTestProxy inherits from WebViewHost, at this point
+        the WebViewClient and WebFrameClient interfaces are already partially
+        destructed resulting in the use after free.
+
+        This does not affect the chromium implementation since it doesn't
+        invoke WebKit API methods in its destructor.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::~TestShell):
+        (TestShell::closeWindow):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::WebViewHost):
+        (WebViewHost::~WebViewHost):
+        (WebViewHost::shutdown):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-23  Andrei Bucur  <abucur@adobe.com>
+
+        [CSS Regions] Create Regions watchlist
+        https://bugs.webkit.org/show_bug.cgi?id=107281
+
+        Reviewed by Adam Barth.
+
+        This patch adds 4 new definitions:
+        - RegionsDevelopment - used to track the development progress for regions
+        - RegionsExpectationsMore and RegionsExpectationsLess - used to track expectations changes for the regions tests
+        - RegionsUsage - used to track changes that make use of regions in all the code base
+
+        For now, the Adobe internal tracker is the only email address listening for these patterns.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-01-22  Pavel Feldman  <pfeldman@chromium.org>
+
+        Web Inspector: only allow evaluateForTestInFrontend for front-ends under test.
+        https://bugs.webkit.org/show_bug.cgi?id=107523
+
+        Reviewed by Yury Semikhatsky.
+
+        * DumpRenderTree/chromium/DRTDevToolsClient.cpp:
+        (DRTDevToolsClient::isUnderTest):
+        (DRTDevToolsClient::call):
+        * DumpRenderTree/chromium/DRTDevToolsClient.h:
+        (DRTDevToolsClient):
+
+2013-01-23  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Removing command line shortening as it makes it difficult to see the command during errors.
+        https://bugs.webkit.org/show_bug.cgi?id=107643
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (ScriptError):
+        (ScriptError.__init__):
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+
+2013-01-23  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Adding myself as contributor in committers.py (as requested by eseidel).
+        https://bugs.webkit.org/show_bug.cgi?id=107647
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-22  Alan Cutter  <alancutter@chromium.org>
+
+        Add monitoring of patches and queues to the QueueStatusServer
+        https://bugs.webkit.org/show_bug.cgi?id=107612
+
+        Reviewed by Adam Barth.
+
+        Created classes for recording events into the datastore and integrated them into the existing handlers.
+        Code for presenting the recorded data will come in a separate patch.
+
+        * QueueStatusServer/app.yaml:
+        * QueueStatusServer/config/__init__.py: Added.
+        * QueueStatusServer/config/logging.py: Copied from Tools/QueueStatusServer/model/queuestatus.py.
+        * QueueStatusServer/config/messages.py: Copied from Tools/QueueStatusServer/model/queuestatus.py.
+        * QueueStatusServer/handlers/nextpatch.py:
+        (NextPatch.get):
+        (NextPatch._assign_patch):
+        * QueueStatusServer/handlers/releasepatch.py:
+        (ReleasePatch.post):
+        * QueueStatusServer/handlers/updatestatus.py:
+        (UpdateStatus.post):
+        * QueueStatusServer/handlers/updateworkitems.py:
+        (UpdateWorkItems._parse_work_items_string):
+        (UpdateWorkItems):
+        (UpdateWorkItems._update_work_items_from_request):
+        (UpdateWorkItems._queue_from_request):
+        (UpdateWorkItems.post):
+        * QueueStatusServer/loggers/__init__.py: Added.
+        * QueueStatusServer/loggers/recordbotevent.py: Copied from Tools/QueueStatusServer/model/queuestatus.py.
+        (RecordBotEvent):
+        (RecordBotEvent.activity):
+        * QueueStatusServer/loggers/recordpatchevent.py: Added.
+        (RecordPatchEvent):
+        (RecordPatchEvent.added):
+        (RecordPatchEvent.retrying):
+        (RecordPatchEvent.started):
+        (RecordPatchEvent.stopped):
+        (RecordPatchEvent.updated):
+        (RecordPatchEvent._get_patches_waiting):
+        * QueueStatusServer/model/patchlog.py: Copied from Tools/QueueStatusServer/model/queuestatus.py.
+        (PatchLog):
+        (PatchLog.lookup):
+        (PatchLog.calculate_wait_duration):
+        (PatchLog.calculate_process_duration):
+        * QueueStatusServer/model/queuelog.py: Copied from Tools/QueueStatusServer/handlers/nextpatch.py.
+        (QueueLog):
+        (QueueLog.get_current):
+        (QueueLog.create_key):
+        * QueueStatusServer/model/queuestatus.py:
+        (QueueStatus.is_retry_request):
+
+2013-01-22  Timothy Loh  <timloh@chromium.com>
+
+        prepare-Changelog should support updating the list of changed files
+        https://bugs.webkit.org/show_bug.cgi?id=74358
+
+        Reviewed by Eric Seidel.
+
+        Needing to re-make ChangeLog entries when the list of files/functions
+        changes is a bit annoying, it'd be nice to have this more automated.
+        This patch makes `webkit-patch update' update the date line and bug
+        description if needed, and if the list of changed files/functions has
+        changed, either updates the list (if there are no annotations), or
+        otherwise appends the new list below.
+
+        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog._resolve_existing_entry):
+        (PrepareChangeLog):
+        (PrepareChangeLog._merge_entries):
+        (PrepareChangeLog.run):
+        * Scripts/webkitpy/tool/steps/preparechangelog_unittest.py:
+        (PrepareChangeLogTest.test_resolve_existing_entry):
+        (make_entry):
+        (test_ensure_bug_url):
+
+2013-01-22  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Use Python 2.7 unittest syntax in our unittests
+        https://bugs.webkit.org/show_bug.cgi?id=105607
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/**/*_unittest.py:
+
+2013-01-22  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Convert disable-msg to disable for new pylint.
+        https://bugs.webkit.org/show_bug.cgi?id=107627
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVNRepository.has_authorization_for_realm):
+        * Scripts/webkitpy/common/net/buildbot/buildbot.py:
+        (Builder.force_build):
+        * Scripts/webkitpy/common/system/executive_mock.py:
+        (MockExecutive2.run_command):
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.reference_files):
+        * Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py:
+        (ChromiumPortTestCase.test_default_configuration):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (PortTestCase.test_expectations_ordering):
+        * Scripts/webkitpy/layout_tests/servers/http_server_base.py:
+        (HttpServerBase._check_that_all_ports_are_available):
+        * Scripts/webkitpy/tool/commands/abstractlocalservercommand.py:
+        (AbstractLocalServerCommand.execute):
+        * Scripts/webkitpy/tool/commands/download.py:
+        (AbstractPatchProcessingCommand):
+        * Scripts/webkitpy/tool/commands/rebaseline.py:
+        (AbstractRebaseliningCommand):
+        (AbstractParallelRebaselineCommand):
+        * Scripts/webkitpy/tool/commands/rebaseline_unittest.py:
+        (_BaseTestCase.setUp):
+        (TestAnalyzeBaselines.setUp):
+
+2013-01-22  Frank Farzan  <frankf@chromium.org>
+
+        Flakiness dashboard: update builders.jsonp
+        https://bugs.webkit.org/show_bug.cgi?id=107610
+
+        Reviewed by Ojan Vafai.
+
+        * TestResultServer/static-dashboards/builders.jsonp:
+
+2013-01-22  Frank Farzan  <frankf@chromium.org>
+
+        Add Android instrumentation tests from ChromiumLinux waterfall
+        https://bugs.webkit.org/show_bug.cgi?id=107597
+
+        Reviewed by Ojan Vafai.
+
+        * TestResultServer/static-dashboards/builders.js:
+        (loadBuildersList):
+
+2013-01-21  Kentaro Hara  <haraken@chromium.org>
+
+        Implement UIEvent constructor
+        https://bugs.webkit.org/show_bug.cgi?id=107430
+
+        Reviewed by Adam Barth.
+
+        Editor's draft: https://dvcs.w3.org/hg/d4e/raw-file/tip/source_respec.htm
+
+        UIEvent constructor is implemented under a DOM4_EVENTS_CONSTRUCTOR flag,
+        which is enabled on Safari and Chromium for now.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-01-22  Timothy Loh  <timloh@chromium.com>
+
+        Add functions to ChangeLog - parse bug desc/changed functions, delete/prepend entries
+        https://bugs.webkit.org/show_bug.cgi?id=107478
+
+        Reviewed by Eric Seidel.
+
+        On the road to resolving Bug 74358, we need a few more functions in
+        changelog.py.
+        To make things easier to mock, change @staticmethods to @classmethods.
+
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        (ChangeLogEntry):
+        (ChangeLogEntry._parse_reviewer_text):
+        (ChangeLogEntry._split_contributor_names):
+        (ChangeLogEntry._parse_author_name_and_email):
+        (ChangeLogEntry._parse_author_text):
+        (ChangeLogEntry._parse_touched_functions):
+        (ChangeLogEntry._parse_bug_description):
+        (ChangeLogEntry._parse_entry):
+        (ChangeLogEntry.date_line):
+        (ChangeLogEntry.bug_description):
+        (ChangeLogEntry.touched_functions):
+        (ChangeLogEntry.touched_files_text):
+        (ChangeLogEntry.is_touched_files_text_clean):
+        (ChangeLog):
+        (ChangeLog.parse_latest_entry_from_file):
+        (ChangeLog._separate_revision_and_line):
+        (ChangeLog.parse_entries_from_file):
+        (ChangeLog.set_short_description_and_bug_url):
+        (ChangeLog.delete_entries):
+        (ChangeLog.prepend_text):
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (test_parse_log_entries_from_changelog):
+        (test_latest_entry_parse):
+        (test_set_short_description_and_bug_url):
+        (test_delete_entries):
+        (test_prepend_text):
+
+2013-01-22  Lucas Forschler  <lforschler@apple.com>
+
+        Create a MAC EWS startup shell script.
+
+        Reviewed by Ryosuke Niwa.
+
+        * EWSTools/start-queue-mac.sh: Added.
+
+2013-01-22  Joseph Pecoraro  <pecoraro@apple.com>
+
+        [Mac] Enable Page Visibility (PAGE_VISIBILITY_API)
+        https://bugs.webkit.org/show_bug.cgi?id=107230
+
+        Reviewed by David Kilzer.
+
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        (TestRunner::resetPageVisibility):
+        Fix a typo in the original implementation. resetPageVisibility should
+        pass initialState YES so an event is not dispatched, which causes
+        issues in multiple tests. This now matches other ports.
+
+2013-01-22  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Enable CSS Image Orientation feature
+        https://bugs.webkit.org/show_bug.cgi?id=99040
+
+        Reviewed by Martin Robinson.
+
+        Enable the CSS Image Orientation feature in the development
+        builds of the GTK port. The feature is still disabled in the release
+        builds.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-01-22  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Enable the <template> element support in development builds
+        https://bugs.webkit.org/show_bug.cgi?id=106575
+
+        Reviewed by Martin Robinson.
+
+        Enable the <template> element support in the development builds of the GTK port.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-01-22  Zan Dobersek  <zandobersek@gmail.com>
+
+        Prettify the output of the override-feature-defines script
+        https://bugs.webkit.org/show_bug.cgi?id=106542
+
+        Reviewed by Martin Robinson.
+
+        The output now clearly lists the feature defines being overridden
+        along with the default and overriding values for each feature define.
+
+        * gtk/override-feature-defines:
+        (adjust_feature_defines_makefile):
+        (adjust_feature_defines_makefile.override_feature_define):
+
+2013-01-22  Zan Dobersek  <zdobersek@igalia.com>
+
+        Remove uses of deprecated unittest.TestCase aliases
+        https://bugs.webkit.org/show_bug.cgi?id=102252
+
+        Reviewed by Adam Barth.
+
+        Replace the deprecated assertEquals method of the TestCase interface
+        used in some webkitpy unittests with the assertEqual method.
+
+        * Scripts/webkitpy/common/system/profiler_unittest.py:
+        (ProfilerFactoryTest._assert_default_profiler_name):
+        (ProfilerFactoryTest.test_default_profiler_output):
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest.test_expectations_files):
+        * Scripts/webkitpy/layout_tests/servers/http_server_unittest.py:
+        (TestHttpServer.test_win32_start_and_stop):
+
+2013-01-22  Jer Noble  <jer.noble@apple.com>
+
+        REGRESSION(r140344): Repeated crashes in WKTR PlatformWebView::viewSupportsOptions().
+        https://bugs.webkit.org/show_bug.cgi?id=107562
+
+        Rubber-stamped by Alexy Proskuryakov.
+
+        The input to WKBooleanGetValue() is not NULL-safe, so NULL check its inputs before calling.
+
+        * WebKitTestRunner/mac/PlatformWebViewMac.mm:
+        (WTR::PlatformWebView::PlatformWebView):
+        (WTR::PlatformWebView::viewSupportsOptions):
+
+2013-01-22  Alexey Proskuryakov  <ap@apple.com>
+
+        One is not allowed to use commit-queue to make oneself a committer.
+
+        * Scripts/webkitpy/common/config/committers.py: Removing eustas@chromium.org.
+
+2013-01-22  Eugene Klyuchnikov  <eustas@chromium.org>
+
+        Add myself to commiters.py
+        https://bugs.webkit.org/show_bug.cgi?id=107546
+
+        Reviewed by Kentaro Hara.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-22  Manuel Rego Casasnovas  <rego@igalia.com>
+
+        [GTK] Implement TestRunner::setTextDirection
+        https://bugs.webkit.org/show_bug.cgi?id=107131
+
+        Reviewed by Philippe Normand.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues): Reset direction to default value.
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        (TestRunner::setTextDirection): Implement method using
+        gtk_widget_set_direction.
+
+2013-01-22  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move spell checking mocks to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=107455
+
+        Reviewed by Kent Tamura.
+
+        The content module doesn't provide its own WebSpellCheckClient.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::fillSpellingSuggestionList):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner):
+        (WebTestProxyBase):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::makeMenuItemStringsFor):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp: Renamed from Tools/DumpRenderTree/chromium/MockGrammarCheck.cpp.
+        (MockGrammarCheck::checkGrammarOfString):
+        * DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h: Renamed from Tools/DumpRenderTree/chromium/MockGrammarCheck.h.
+        (WebKit):
+        (MockGrammarCheck):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp: Renamed from Tools/DumpRenderTree/chromium/MockSpellCheck.cpp.
+        (MockSpellCheck::MockSpellCheck):
+        (MockSpellCheck::~MockSpellCheck):
+        (isNotASCIIAlpha):
+        (MockSpellCheck::spellCheckWord):
+        (MockSpellCheck::fillSuggestionList):
+        (MockSpellCheck::initializeIfNeeded):
+        * DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h: Renamed from Tools/DumpRenderTree/chromium/MockSpellCheck.h.
+        (MockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp: Added.
+        (WebTestRunner::SpellCheckClient::SpellCheckClient):
+        (WebTestRunner):
+        (WebTestRunner::SpellCheckClient::~SpellCheckClient):
+        (WebTestRunner::SpellCheckClient::setDelegate):
+        (WebTestRunner::SpellCheckClient::spellCheck):
+        (WebTestRunner::SpellCheckClient::checkTextOfParagraph):
+        (WebTestRunner::SpellCheckClient::requestCheckingOfText):
+        (WebTestRunner::SpellCheckClient::finishLastTextCheck):
+        (WebTestRunner::SpellCheckClient::autoCorrectWord):
+        * DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/src/TestDelegate.h.
+        (WebTestRunner):
+        (SpellCheckClient):
+        (WebTestRunner::SpellCheckClient::taskList):
+        (WebTestRunner::SpellCheckClient::mockSpellCheck):
+        * DumpRenderTree/chromium/TestRunner/src/TestDelegate.h:
+        (TestDelegate):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestInterfaces::Internal):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::~WebTestProxyBase):
+        (WebTestRunner::WebTestProxyBase::setDelegate):
+        (WebTestRunner::WebTestProxyBase::spellCheckClient):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::WebViewHost):
+        (WebViewHost::setWebWidget):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-22  Krzysztof Czech  <k.czech@samsung.com>
+
+        [EFL] Adds Accessibility support to wk1
+        https://bugs.webkit.org/show_bug.cgi?id=107440
+
+        Reviewed by Gyuyoung Kim.
+
+        * DumpRenderTree/efl/CMakeLists.txt: Adds ATK headers and libraries.
+
+2013-01-21  Joseph Pecoraro  <pecoraro@apple.com>
+
+        [Mac] WK1 MiniBrowser should clear delegates before releasing webview
+        https://bugs.webkit.org/show_bug.cgi?id=107506
+
+        Reviewed by Dan Bernstein.
+
+        * MiniBrowser/mac/WK1BrowserWindowController.m:
+        (-[WK1BrowserWindowController dealloc]):
+
+2013-01-21  Dirk Schulze  <dschulze@adobe.com>
+
+        Add build flag for Canvas's Path object (disabled by default)
+        https://bugs.webkit.org/show_bug.cgi?id=107473
+
+        Reviewed by Dean Jackson.
+
+        Add CANVAS_PATH build flag to build systems.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-01-21  Jinwoo Song  <jinwoo7.song@samsung.com>
+
+        [EFL][WK2] Add APIs to set/get view source mode
+        https://bugs.webkit.org/show_bug.cgi?id=106633
+
+        Reviewed by Gyuyoung Kim.
+
+        Added a shotcut 'F8' in Minibrowser to display a source code
+        of the web page in a new window.
+
+       * MiniBrowser/efl/main.c:
+        (on_key_down):
+        (on_window_create):
+        (window_create):
+        (elm_main):
+
+2013-01-21  Nico Weber  <thakis@chromium.org>
+
+        [chromium] Don't archive generated source files.
+        https://bugs.webkit.org/show_bug.cgi?id=106736
+
+        Reviewed by Eric Seidel.
+
+        They shouldn't be needed to run tests. They don't need a lot of space,
+        but add many lines to the "extracting" stdout. This attempts to reduce
+        that noise a bit.
+
+        * BuildSlaveSupport/built-product-archive:
+        (archiveBuiltProduct):
+
+2013-01-21  Benjamin Poulain  <benjamin@webkit.org>
+
+        Mac DumpRenderTree's installSignalHandlers() is unreachable code
+        https://bugs.webkit.org/show_bug.cgi?id=107383
+
+        Reviewed by Sam Weinig.
+
+        The CrashHandler of DumpRenderTree were originally used for restoring
+        the color profile of the main display even if DRT crashes.
+
+        That feature was later limited to pixel tests only in r29999.
+
+        In r104351, the DRT was changed to use device color space. Making the crash
+        handlers useless, but they were left in the code since the error reporting
+        code was still reachable.
+
+        Later, r124581 refactored the code and dumpPixelsForCurrentTest
+        is being used before being assigned its value.
+        This did cause any regression because the code had become useless with the previous change.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        Remove crashHandler() and installSignalHandlers() as they have become useless and
+        have been unreachable code for 6 months.
+        (dumpRenderTree):
+        Remove the code that was unreachable due to dumpPixelsForCurrentTest being always false
+        at those points.
+
+2013-01-21  Nico Weber  <thakis@chromium.org>
+
+        Make ninja the default build system for build-webkit --chromium on mac
+        https://bugs.webkit.org/show_bug.cgi?id=106737
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/update-webkit-chromium:
+
+2013-01-21  Christophe Dumez  <christophe.dumez@intel.com>
+
+        Regression(r140262): Causes a lot of flakiness
+        https://bugs.webkit.org/show_bug.cgi?id=107454
+
+        Reviewed by Alexey Proskuryakov.
+
+        r140262 introduced a lot of flakiness due to fixed layout mode
+        not getting disabled on the view after being enabled for
+        specific test cases. This patch makes sure fixed layout mode
+        properly gets reset in WebKitTestRunner to avoid flakiness.
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::updateLayoutType):
+
+2013-01-21  Gustavo Noronha Silva  <gns@gnome.org>
+
+        REGRESSION (r140285): GTK uses WKPageResourceLoadClient which was removed
+        https://bugs.webkit.org/show_bug.cgi?id=107421
+
+        Unreviewed build fix.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner): skip Resource tests.
+
+2013-01-21  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [EFL][WKTR] platformRunUntil() should keep the main loop running
+        https://bugs.webkit.org/show_bug.cgi?id=107442
+
+        Reviewed by Noam Rosenthal.
+
+        EFL's implementation of platformRunUntil() should keep the main loop
+        running and avoid calling sleep() between calls to
+        ecore_main_loop_iterate(). This call to sleep seems to be a source
+        of deadlocks (see Bug 106884).
+
+        * WebKitTestRunner/efl/TestControllerEfl.cpp:
+        (WTR::TestController::platformRunUntil):
+
+2013-01-21  Vivek Galatage  <vivek.vg@samsung.com>
+
+        QtTestBrowser should provide way to clear selected elements
+        https://bugs.webkit.org/show_bug.cgi?id=107437
+
+        Reviewed by Simon Hausmann.
+
+        Provide a way to "Clear selection" in the "Develop" menu to clear the previous search highlight.
+        Invoke the clearSelection prior to highlighting new elements.
+
+        * QtTestBrowser/launcherwindow.cpp:
+        (ElementHighlight):
+        (LauncherWindow::createChrome):
+        (LauncherWindow::selectElements):
+        (LauncherWindow::clearSelection):
+        * QtTestBrowser/launcherwindow.h:
+        (LauncherWindow):
+
+2013-01-21  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move methods interacting with willSendRequest to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=107270
+
+        Reviewed by Kent Tamura.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::waitForPolicyDelegate):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::shouldStayOnPageAfterHandlingBeforeUnload):
+        (WebTestRunner::WebTestRunner::httpHeadersToClear):
+        (WebTestRunner::WebTestRunner::shouldBlockRedirects):
+        (WebTestRunner::WebTestRunner::willSendRequestShouldReturnNull):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::httpHeadersToClear):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::shouldBlockRedirects):
+        (WebTestRunner::TestRunner::willSendRequestShouldReturnNull):
+        (WebTestRunner::TestRunner::setWillSendRequestClearHeader):
+        (WebTestRunner::TestRunner::setWillSendRequestReturnsNullOnRedirect):
+        (WebTestRunner::TestRunner::setWillSendRequestReturnsNull):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::willSendRequest):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::willSendRequest):
+        (WebViewHost::reset):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-21  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Stop building WebKit2 on GTK EWSs
+        https://bugs.webkit.org/show_bug.cgi?id=107435
+
+        Reviewed by Philippe Normand.
+
+        The WebKit2 build of the GTK is at the moment not efficiently maintainable,
+        so stop building it on GTK EWSs.
+
+        * Scripts/webkitpy/common/config/ports.py:
+        (GtkPort.build_webkit_command):
+        * Scripts/webkitpy/common/config/ports_unittest.py:
+        (DeprecatedPortTest.test_gtk_port):
+
+2013-01-21  Tommy Widenflycht  <tommyw@google.com>
+
+        MediaStream API: Update the RTCPeerConnection states to match the latest specification
+        https://bugs.webkit.org/show_bug.cgi?id=107120
+
+        Reviewed by Adam Barth.
+
+        Updating mock to use the new states.
+
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (RTCPeerConnectionStateTask::RTCPeerConnectionStateTask):
+        (MockWebRTCPeerConnectionHandler::initialize):
+        (MockWebRTCPeerConnectionHandler::updateICE):
+
+2013-01-20  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Extend diff_parser to support the --full-index output.
+        https://bugs.webkit.org/show_bug.cgi?id=107408
+
+        Reviewed by Maciej Stachowiak.
+
+        * Scripts/webkitpy/common/checkout/diff_parser.py:
+        (git_diff_to_svn_diff):
+        * Scripts/webkitpy/common/checkout/diff_parser_unittest.py:
+        (DiffParserTest):
+        (DiffParserTest.test_git_diff_to_svn_diff):
+        (git_diff_to_svn_diff):
+
+2013-01-20  Yoshifumi Inoue  <yosin@chromium.org>
+
+        Dragging over an element with scrollbars should scroll the element when dragging near edges
+        https://bugs.webkit.org/show_bug.cgi?id=39725
+
+        Reviewed by Hajime Morita.
+
+        This patch introduces canceling drag-and-drop by escape key for testing
+        behavior after cancellation drag-and-drop.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::doMouseUp):
+        (WebTestRunner::EventSender::finishDragAndDrop):
+        (WebTestRunner::EventSender::keyDown):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (EventSender):
+        * DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.h: Added VKEY_ESCAPE.
+
+2013-01-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move frame generation related methods to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=107268
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::setWillSendRequestReturnsNull):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::display):
+        (WebTestRunner::WebTestDelegate::displayInvalidatedRegion):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::display):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::displayInvalidatedRegion):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::display):
+        (WebViewHost::displayInvalidatedRegion):
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-01-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move speech related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=107266
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::displayInvalidatedRegion):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestDelegate):
+        (WebTestRunner::WebTestDelegate::addMockSpeechInputResult):
+        (WebTestRunner::WebTestDelegate::setMockSpeechInputDumpRect):
+        (WebTestRunner::WebTestDelegate::addMockSpeechRecognitionResult):
+        (WebTestRunner::WebTestDelegate::setMockSpeechRecognitionError):
+        (WebTestRunner::WebTestDelegate::wasMockSpeechRecognitionAborted):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::addMockSpeechInputResult):
+        (WebTestRunner::TestRunner::setMockSpeechInputDumpRect):
+        (WebTestRunner::TestRunner::addMockSpeechRecognitionResult):
+        (WebTestRunner::TestRunner::setMockSpeechRecognitionError):
+        (WebTestRunner::TestRunner::wasMockSpeechRecognitionAborted):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::addMockSpeechInputResult):
+        (WebViewHost::setMockSpeechInputDumpRect):
+        (WebViewHost::addMockSpeechRecognitionResult):
+        (WebViewHost::setMockSpeechRecognitionError):
+        (WebViewHost::wasMockSpeechRecognitionAborted):
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-01-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move notification related methods to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=107269
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestDelegate):
+        (WebTestRunner::WebTestDelegate::grantWebNotificationPermission):
+        (WebTestRunner::WebTestDelegate::simulateLegacyWebNotificationClick):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::grantWebNotificationPermission):
+        (WebTestRunner::TestRunner::simulateLegacyWebNotificationClick):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::grantWebNotificationPermission):
+        (WebViewHost::simulateLegacyWebNotificationClick):
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-01-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move geolocation related methods to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=107267
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::numberOfPendingGeolocationPermissionRequests):
+        (WebTestRunner::WebTestDelegate::setGeolocationPermission):
+        (WebTestRunner::WebTestDelegate::setMockGeolocationPosition):
+        (WebTestRunner::WebTestDelegate::setMockGeolocationPositionUnavailableError):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::numberOfPendingGeolocationPermissionRequests):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setGeolocationPermission):
+        (WebTestRunner::TestRunner::setMockGeolocationPosition):
+        (WebTestRunner::TestRunner::setMockGeolocationPositionUnavailableError):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::numberOfPendingGeolocationPermissionRequests):
+        (WebViewHost::setGeolocationPermission):
+        (WebViewHost::setMockGeolocationPosition):
+        (WebViewHost::setMockGeolocationPositionUnavailableError):
+        * DumpRenderTree/chromium/WebViewHost.h:
+
+2013-01-19  Zan Dobersek  <zdobersek@igalia.com>
+
+        Unreviewed build fix for Qt WK2 after r140258.
+        Use the size_t type instead of unsigned for the variable
+        which holds the position of the first null character in the
+        console message.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::willAddMessageToConsole):
+
+2013-01-19  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r140260.
+        http://trac.webkit.org/changeset/140260
+        https://bugs.webkit.org/show_bug.cgi?id=107387
+
+        breaks fast/text/hyphens.html, fast/text/hyphenate-* (but
+        nothing else) (Requested by thakis__ on #webkit).
+
+        * Scripts/update-webkit-chromium:
+
+2013-01-19  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        Delegated scrolling: Assertion on attempt to show a CSS sticky element
+        https://bugs.webkit.org/show_bug.cgi?id=106890
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Enabled fixed layout mode in WTR for 'fast/css/sticky' tests.
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::shouldUseFixedLayout):
+        (WTR):
+        (WTR::updateLayoutType):
+
+2013-01-19  Nico Weber  <thakis@chromium.org>
+
+        Make ninja the default build system for build-webkit --chromium on mac
+        https://bugs.webkit.org/show_bug.cgi?id=106737
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/update-webkit-chromium:
+
+2013-01-19  Zan Dobersek  <zdobersek@igalia.com>
+
+        [WK2] svg/dom/fuzz-path-parser.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=107133
+
+        Reviewed by Alexey Proskuryakov.
+
+        Console messages can contain null characters before the end of string.
+        Appending such message to the StringBuilder as a WTFString appends the
+        complete string, including the null character. This later cuts off everything
+        after the null character when the string is being printed out to the test
+        output.
+
+        To avoid this, truncate the string up to the first null character. This
+        preserves the newline character appended immediately after this and
+        stops giving incorrect output.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::willAddMessageToConsole):
+
+2013-01-19  Eric Seidel  <eric@webkit.org>
+
+        Update error regexps so that Parser/html-parser-srcdoc.html can "pass"
+        https://bugs.webkit.org/show_bug.cgi?id=107367
+
+        Reviewed by Ryosuke Niwa.
+
+        Using srcdoc instead of document.write changes the error output
+        ever so slightly.  Clearly we were already trying to ignore these
+        messages, just not succeeding.  This change makes this new test "pass" correctly.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest):
+
+2013-01-18  Dan Winship  <danw@gnome.org>
+
+        REGRESSION (r139071): run-webkit-httpd complains at launch
+        https://bugs.webkit.org/show_bug.cgi?id=107310
+
+        Reviewed by Alexey Proskuryakov.
+
+        * Scripts/webkitperl/httpd.pm:
+        (getApacheVersion): use preferred perl syntax
+
+2013-01-18  Julie Parent  <jparent@chromium.org>
+
+        Add back 'group' as a default cross dashboard parameter, but with null as its value.
+        https://bugs.webkit.org/show_bug.cgi?id=107336
+
+        We need to have 'group' listed as a parameter, else we never parse it,
+        as we only parse parameters with defaults.
+        
+        Reviewed by Ojan Vafai.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+
+2013-01-18  Emil A Eklund  <eae@chromium.org>
+
+        Update LayoutUnit rounding unit test
+        https://bugs.webkit.org/show_bug.cgi?id=107322
+
+        Reviewed by Levi Weintraub.
+        
+        Update the LayoutUnitRounding test to use fromFloatRound for
+        values that cannot accurately be represented as a LayoutUnit
+        (the default behavior is to floor the value to the nearest
+        LayoutUnit).
+
+        * TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp:
+        (TestWebKitAPI::TEST):
+
+2013-01-18  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        VCSUtils.pm: Stop calling git repo-config.
+        https://bugs.webkit.org/show_bug.cgi?id=107294
+
+        Reviewed by Dirk Pranke.
+
+        The `repo-config' git command has been deprecated since early
+        2008, and recent versions have started warning it is deprecated.
+
+        Basically revert r27870 and use the `config' command all the time.
+
+        * Scripts/VCSUtils.pm:
+        (gitConfig):
+
+2013-01-18  Levi Weintraub  <leviw@chromium.org>
+
+        LayoutUnit should round half consistently, not away from zero
+        https://bugs.webkit.org/show_bug.cgi?id=107208
+
+        Reviewed by Eric Seidel.
+
+        * TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp: Updating to reflect and
+        cover this change in rounding behavior.
+
+2013-01-18  Tim Horton  <timothy_horton@apple.com>
+
+        [mac] DumpRenderTree/WebKitTestRunner should not participate in Exposé/Mission Control
+        https://bugs.webkit.org/show_bug.cgi?id=107234
+
+        Reviewed by Simon Fraser.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (createWebViewAndOffscreenWindow): Disable participation in Exposé via NSWindowCollectionBehaviorStationary.
+        * WebKitTestRunner/mac/PlatformWebViewMac.mm:
+        (WTR::PlatformWebView::PlatformWebView): Ditto.
+
+2013-01-18  Tim Horton  <timothy_horton@apple.com>
+
+        [mac] DumpRenderTree/WebKitTestRunner should disable NSBeep
+        https://bugs.webkit.org/show_bug.cgi?id=107251
+
+        Reviewed by Simon Fraser.
+
+        Disable NSBeep in DumpRenderTree and WebKitTestRunner using NSSound SPI.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (dumpRenderTree):
+        * WebKitTestRunner/InjectedBundle/mac/InjectedBundleMac.mm:
+        (WTR::InjectedBundle::platformInitialize):
+
+2013-01-18  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Enable indexed database for development builds
+        https://bugs.webkit.org/show_bug.cgi?id=107299
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * Scripts/webkitperl/FeatureList.pm: Enable indexed database by default
+        for GTK+ development builds.
+
+2013-01-18  Dominic Mazzoni  <dmazzoni@google.com>
+
+        AX: Improve table-guessing heuristics
+        https://bugs.webkit.org/show_bug.cgi?id=107042
+
+        Reviewed by Chris Fleizach.
+
+        Implement parentElementCallback on Chromium to make testing easier.
+
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::parentElementCallback):
+
+2013-01-18  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Add property for IndexedDB database path to WebKitGTK+
+        https://bugs.webkit.org/show_bug.cgi?id=106136
+
+        Reviewed by Gustavo Noronha Silva.
+
+        During testing, set the web database directory to DUMPRENDERTREE_TEMP
+        before falling back to the old default. This is necessary because
+        indexed database tests require that each DRT shard is using a different
+        IDB database location.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (temporaryDatabaseDirectory): Added this helper for getting the
+        database directory.
+        (setDefaultsToConsistentStateValuesForTesting): Use the new helper.
+
+2013-01-18  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Enable API test InjectedBundleFrameHitTest on EFL
+        https://bugs.webkit.org/show_bug.cgi?id=107264
+
+        Reviewed by Laszlo Gombos.
+
+        Enable API test InjectedBundleFrameHitTest for hit-testing,
+        since it is now passing on both Debug and Release builds.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/PlatformEfl.cmake:
+
+2013-01-18  Manuel Rego Casasnovas  <rego@igalia.com>
+
+        [GTK] Implement TestRunner::addUserScript
+        https://bugs.webkit.org/show_bug.cgi?id=107275
+
+        Reviewed by Philippe Normand.
+
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        (TestRunner::addUserScript): Implement method using
+        DumpRenderTreeSupportGtk::addUserScript.
+
+2013-01-18  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        Unreviewed, add my secondary email address to the list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-18  Dan Carney  <dcarney@google.com>
+
+        [chromium] move pointerlock functions to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=107241
+
+        Reviewed by Jochen Eisinger.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::didAcquirePointerLock):
+        (WebTestRunner::WebTestDelegate::didNotAcquirePointerLock):
+        (WebTestRunner::WebTestDelegate::didLosePointerLock):
+        (WebTestRunner::WebTestDelegate::setPointerLockWillRespondAsynchronously):
+        (WebTestRunner::WebTestDelegate::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::didAcquirePointerLock):
+        (WebTestRunner::TestRunner::didNotAcquirePointerLock):
+        (WebTestRunner::TestRunner::didLosePointerLock):
+        (WebTestRunner::TestRunner::setPointerLockWillRespondAsynchronously):
+        (WebTestRunner::TestRunner::setPointerLockWillFailSynchronously):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-14  Dominik Röttsches  <dominik.rottsches@intel.com>
+
+        [EFL] Update freetype in jhbuild to 2.4.11 and activate subpixel layout
+        https://bugs.webkit.org/show_bug.cgi?id=106774
+
+        Reviewed by Martin Robinson.
+
+        In order to fix a long standing linespacing/font ascent & descent issue
+        we found that FreeType commit b0962ac34e660 solves that problem.
+        Let's update FreeType accordingly, but bump it to 2.4.11 due to the
+        maintainer recommending several security updates after that said commit.
+
+        Also, in order to avoid extra rebaselining, let's activate subpixel
+        layout at the same time.
+
+        * efl/jhbuild.modules: New freetype 2.4.11
+
+2013-01-17  Xiaobo Wang  <xbwang@torchmobile.com.cn>
+
+        [BlackBerry] DRT - Accept http/file URL when running drt-launcher from command line
+        https://bugs.webkit.org/show_bug.cgi?id=107107
+        PR 282192
+
+        Reviewed by Rob Buis.
+
+        The DRT application will convert relative/absolute file path to
+        file://<real-file-path> format, so we only check for http/file prefix.
+
+        * DumpRenderTree/blackberry/DumpRenderTree.cpp:
+        (BlackBerry::WebKit::isFullUrl):
+        (WebKit):
+        (BlackBerry::WebKit::DumpRenderTree::runCurrentTest):
+
+2013-01-17  Frank Farzan  <frankf@chromium.org>
+
+        Flakiness dashboard: Add ChromiumFYI master
+        https://bugs.webkit.org/show_bug.cgi?id=107180
+
+        Reviewed by Ojan Vafai.
+
+        This is needed to enable Chrome Android bots
+        to upload results for instrumentation tests.
+
+        * TestResultServer/generate_builders_json.py:
+        (main):
+        * TestResultServer/static-dashboards/builders.jsonp:
+
+2013-01-17  Frank Farzan  <frankf@chromium.org>
+
+        Add Chrome on Android instrumentation test types to flakiness dashboard
+        https://bugs.webkit.org/show_bug.cgi?id=106964
+
+        Reviewed by Ojan Vafai.
+
+        Specifically, add these test types:
+        
+         androidwebview_instrumentation_tests
+         chromiumtestshell_instrumentation_tests
+         contentshell_instrumentation_tests
+        
+        Also, add ChromiumFYI to the list of masters.
+
+        * TestResultServer/static-dashboards/builders.js:
+        (loadBuildersList):
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (currentBuilderGroupCategory):
+
+2013-01-17  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Fixing webkitpy's SCM unit tests.
+        https://bugs.webkit.org/show_bug.cgi?id=106429
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/scm/detection_unittest.py:
+        (SCMDetectorTest.test_detect_scm_system):
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.in_working_directory):
+        (Git.read_git_config):
+        (Git._assert_can_squash):
+        (Git.remote_branch_ref):
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        (GitSVNTest.test_commit_with_message_multiple_local_commits_always_squash):
+        (GitTestWithMock):
+        (GitTestWithMock.make_scm):
+        (GitTestWithMock.test_create_patch):
+        * Scripts/webkitpy/common/system/outputcapture.py:
+        (OutputCapture.assert_outputs):
+        (OutputCaptureTestCaseBase):
+        * Scripts/webkitpy/test/printer.py:
+        (Printer.configure):
+
+2013-01-17  Julie Parent  <jparent@chromium.org>
+
+        Flakiness dashboard assumes there must be ToT tests
+        https://bugs.webkit.org/show_bug.cgi?id=107155
+
+        Remove group as a default parameter, since we can't actually know
+        the name of a group initially.  Instead, introduces 
+        currentBuilderGroupName which returns the current builder group
+        if it has been explicitly set, or picks the first one available
+        as a default. Allows us to remove some extra code tracking this
+        stuff as well.
+        
+        Reviewed by Ojan Vafai.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseCrossDashboardParameters):
+        (currentBuilderGroupName):
+        (currentBuilderGroup):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (platformAndBuildType):
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+
+2013-01-16  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Remove NodeListsNodeData when it's no longer needed
+        https://bugs.webkit.org/show_bug.cgi?id=107074
+
+        Reviewed by Darin Adler.
+
+        Generalize the warning a little so that it's also ignored on PerformanceTests/DOM/TraverseChildNodes.html
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest):
+
+2013-01-17  Simon Fraser  <simon.fraser@apple.com>
+
+        Ref test images are upside-down in WebKit2
+        https://bugs.webkit.org/show_bug.cgi?id=105457
+
+        Reviewed by Sam "Speedy" Weinig.
+        
+        The bitmap context created in TestInvocation::dumpPixelsAndCompareWithExpected()
+        from the window snapshot contained a flipped copy of the image, causing all ref
+        and pixel images to be upside-down.
+
+        * WebKitTestRunner/cg/TestInvocationCG.cpp:
+        (WTR::TestInvocation::dumpPixelsAndCompareWithExpected):
+
+2013-01-17  Timothy Loh  <timloh@google.com>
+
+        Replaced specifiers variable with is_debug in builders.py
+        https://bugs.webkit.org/show_bug.cgi?id=107057
+
+        Reviewed by Dirk Pranke.
+
+        Replaced specifiers variable with is_debug in builders.py to simplify
+        Bug 106259. The other specifiers are not used elsewhere in the code.
+        Fixed builder_name_for_port_name to return a debug builder if we don't
+        have a release builder.
+
+        * Scripts/webkitpy/layout_tests/port/builders.py:
+        (all_port_names):
+        (builder_name_for_port_name):
+        * Scripts/webkitpy/tool/commands/rebaseline_unittest.py:
+        (TestRebaselineExpectations.test_rebaseline_expectations):
+
+2013-01-17  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Build with LevelDB when IndexedDB is enabled
+        https://bugs.webkit.org/show_bug.cgi?id=103220
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * Scripts/webkitpy/style/checker.py: Do not style check the leveldb source code
+        as it does not conform to WebKit style.
+
+2013-01-17  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Fix misuse of ASSERT on ecore_evas_init()
+        https://bugs.webkit.org/show_bug.cgi?id=107119
+
+        Reviewed by Laszlo Gombos.
+
+        Do not use ASSERT on ecore_evas_init(), since the expression inside
+        the macro compiles out of release builds.
+
+        * TestWebKitAPI/PlatformEfl.cmake: Enable API test UserMessage.
+        * TestWebKitAPI/efl/PlatformWebView.cpp:
+        (TestWebKitAPI::initEcoreEvas): Remove ASSERT on ecore_evas_init().
+
+2013-01-17  Eugene Klyuchnikov  <eustas@chromium.org>
+
+        Web Inspector: Profiler: split "getProfile" to "getCPUProfile" and "loadHeapSnapshot"
+        https://bugs.webkit.org/show_bug.cgi?id=104545
+
+        Reviewed by Yury Semikhatsky.
+
+        Adopt signature changes.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/WebInspectorShims.js:
+        (ProfilerAgent.getCPUProfile): Renamed.
+        (ProfilerAgent.getHeapSnapshot): Added.
+
+2013-01-17  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK][EFL] NWRT should check that Xvfb is installed
+        https://bugs.webkit.org/show_bug.cgi?id=71767
+
+        Reviewed by Dirk Pranke.
+
+        EFL and GTK ports now check that Xvfb is installed before running
+        layout tests. The command line used to check whether Xvfb is present
+        is a simple `which Xvfb` that should return 0 as the exit code upon
+        success.
+
+        * Scripts/webkitpy/layout_tests/port/efl.py:
+        (EflPort.show_results_html_file):
+        (EflPort):
+        (EflPort.check_sys_deps):
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort.check_sys_deps):
+        * Scripts/webkitpy/layout_tests/port/xvfbdriver.py:
+        (XvfbDriver):
+        (XvfbDriver.check_xvfb):
+
+2013-01-16  Alan Cutter  <alancutter@chromium.org>
+
+        sheriffbot can't tell me who "kov" is
+        https://bugs.webkit.org/show_bug.cgi?id=106184
+
+        Reviewed by Eric Seidel.
+
+        Added glob style searching to the CommitterList contributors_by_search_string function so exact matches are favoured.
+
+        * Scripts/webkitpy/common/config/committers.py:
+        (Account.matches_glob):
+        (CommitterList.contributors_by_search_string):
+        * Scripts/webkitpy/common/config/committers_unittest.py:
+        (CommittersTest.test_committer_lookup):
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+        (Whois):
+
+2013-01-16  David Kilzer  <ddkilzer@apple.com>
+
+        Use xcrun to find path to make for Mac port
+        <http://webkit.org/b/107091>
+
+        Reviewed by Dan Bernstein.
+
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort._build_java_test_support): Call self.make_command().
+        (MacPort.make_command): Add.  Call xcrun_find().
+        (MacPort.nm_command): Use self.xcrun_find().
+        (MacPort.xcrun_find): Add.  Extract from nm_command().
+
+2013-01-16  Sam Weinig  <sam@webkit.org>
+
+        Make debug-safari --target-web-process work again
+        https://bugs.webkit.org/show_bug.cgi?id=107088
+
+        Reviewed by Anders Carlsson.
+
+        * Scripts/webkitdirs.pm:
+        (execMacWebKitAppForDebugging):
+        The shim is now called SecItemShim.
+
+2013-01-16  Alan Cutter  <alancutter@chromium.org>
+
+        GCE build scripts don't take working directory into account when calling findzone.sh
+        https://bugs.webkit.org/show_bug.cgi?id=106962
+
+        Reviewed by Adam Barth.
+
+        * EWSTools/GoogleComputeEngine/build-chromium-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh:
+
+2013-01-16  Alan Cutter  <alancutter@chromium.org>
+
+        start-queue.sh does not pass remaining parameters correctly
+        https://bugs.webkit.org/show_bug.cgi?id=107054
+
+        Reviewed by Adam Barth.
+
+        start-queue.sh now passes all remaining params to the webkit-patch command.
+        Previously only one additional queue parameter could be sent.
+
+        * EWSTools/start-queue.sh:
+
+2013-01-16  Xueqing Huang  <huangxueqing@baidu.com>
+
+        check-webkit-style script cannot running in Chinese windows.
+        https://bugs.webkit.org/show_bug.cgi?id=87548
+
+        Reviewed by Darin Adler.
+
+        * Scripts/webkitpy/common/system/platforminfo.py:
+        (PlatformInfo._win_version_tuple_from_cmd):
+
+2013-01-16  Dirk Pranke  <dpranke@chromium.org>
+
+        Delete an extraneous print statement.
+        https://bugs.webkit.org/show_bug.cgi?id=106562
+
+        Delete the extraneous print statement introduced in r139841.
+
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer.print_found):
+
+2013-01-16  Zan Dobersek  <zdobersek@igalia.com>
+
+        Please reinstate --pixel
+        https://bugs.webkit.org/show_bug.cgi?id=101995
+
+        Reviewed by Dirk Pranke.
+
+        Add the '--pixel' and '--no-pixel' options for NRWT as aliases for
+        the '--pixel-tests' (or '-p') and '--no-pixel-tests' options respectively.
+        Some developers are still used to these options that were available in the ORWT.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (parse_args):
+
+2013-01-16  Eric Seidel  <eric@webkit.org>
+
+        Remove --shark* support from sunspider/run-sunspider now that Shark is dead
+        https://bugs.webkit.org/show_bug.cgi?id=99512
+
+        Reviewed by Darin Adler.
+
+        * Scripts/run-sunspider:
+
+2013-01-16  Eric Seidel  <eric@webkit.org>
+
+        Remove webkitpy Visual Studio files, as core developers are not interested in maintaining them
+        https://bugs.webkit.org/show_bug.cgi?id=106036
+
+        Reviewed by Darin Adler.
+
+        * Scripts/webkitpy/webkitpy.pyproj: Removed.
+        * Scripts/webkitpy/webkitpy.sln: Removed.
+
+2013-01-16  Chris Hopman  <cjhopman@chromium.org>
+
+        [Chromium] Remove hardcoded chromium_*.jar in gyp files
+        https://bugs.webkit.org/show_bug.cgi?id=104049
+
+        Reviewed by Eric Seidel.
+
+        Targets with dependencies (direct/indirect) on a java target receive
+        the chromium_*.jar paths in the variable input_jars_paths. Targets
+        should use that rather than hardcoding where they think the jar will
+        be. These can be passed directly to ant as INPUT_JARS_PATHS rather
+        than as --jars to generate_native_test.py.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp:
+
+2013-01-16  Dan Carney  <dcarney@google.com>
+
+        [chromium] move setMockDeviceOrientation to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106895
+
+        Reviewed by Jochen Eisinger.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebKit):
+        (WebTestRunner::WebTestDelegate::setDeviceOrientation):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::setMockDeviceOrientation):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::setDeviceOrientation):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-16  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] route more webkit_support and webviewhost callbacks through WebTestDelegate
+        https://bugs.webkit.org/show_bug.cgi?id=106904
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::notifyDone):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::setDeviceScaleFactor):
+        (WebTestRunner::WebTestDelegate::setFocus):
+        (WebTestRunner::WebTestDelegate::setAcceptAllCookies):
+        (WebTestRunner::WebTestDelegate::pathToLocalResource):
+        (WebTestRunner::WebTestDelegate::setLocale):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setAlwaysAcceptCookies):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setWindowIsKey):
+        (WebTestRunner::TestRunner::pathToLocalResource):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::setPOSIXLocale):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::taskList):
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::setDeviceScaleFactor):
+        (WebViewHost::setFocus):
+        (WebViewHost::setAcceptAllCookies):
+        (WebViewHost::pathToLocalResource):
+        (WebViewHost::setLocale):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-16  Sergio Villar Senin  <svillar@igalia.com>
+
+        [GTK] build-webkit fails if the jhbuild wrapper is not used
+        https://bugs.webkit.org/show_bug.cgi?id=106769
+
+        Reviewed by Martin Robinson.
+
+        Return an empty array instead of "" in
+        jhbuildWrapperPrefixIfNeeded() because otherwise that empty string
+        will not be recognized as a valid command when the returned array
+        is directly passed to perl's system() call.
+
+        * Scripts/webkitdirs.pm:
+        (jhbuildWrapperPrefixIfNeeded):
+
+2013-01-16  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] add title text direction attribute to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=106907
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::setTitleTextDirection):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setTitleTextDirection):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::didReceiveTitle):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didReceiveTitle):
+
+2013-01-16  Jussi Kukkonen  <jussi.kukkonen@intel.com>
+
+        NRWT still confused about test count with --repeat-each and --iterations
+        https://bugs.webkit.org/show_bug.cgi?id=106562
+
+        Reviewed by Dirk Pranke.
+
+        Fix the printed unique test count and skipped count. This
+        seems to have broken in r127688 ("NRWT lies about the number
+        of tests that it's skipping when used with --repeat-each").
+
+        Also add a test for print_found()
+
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer.print_found):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.test_details):
+        (Testprinter):
+        (Testprinter.test_found):
+
+2013-01-15  Zan Dobersek  <zdobersek@igalia.com>
+
+        Unreviewed follow-up to r139769.
+
+        Note that omitting the WebKit1 code from the build now
+        works for GTK as well.
+
+        * Scripts/build-webkit:
+
+2013-01-15  Dirk Pranke  <dpranke@chromium.org>
+
+        test-webkitpy: truncate output to the terminal width when necessary
+        https://bugs.webkit.org/show_bug.cgi?id=106973
+
+        Reviewed by Ojan Vafai.
+
+        this implements the same logic for test-webkitpy that we have
+        for run-webkit-tests (and ninja).
+
+        No tests written as this is exercised by running test-webkitpy itself.
+
+        * Scripts/webkitpy/test/printer.py:
+        (Printer.configure):
+        (Printer._test_line):
+
+2013-01-15  Dirk Pranke  <dpranke@chromium.org>
+
+        remove extraneous output in test-webkitpy
+        https://bugs.webkit.org/show_bug.cgi?id=106971
+
+        Reviewed by Ojan Vafai.
+
+        We weren't ignoring or capturing the echoed output from
+        these two tests, and getting noise in the logs as a result.
+
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+        (ExecutiveTest.test_auto_stringify_args):
+        (ExecutiveTest.test_popen_args):
+
+2013-01-15  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy.layout_tests.servers.http_server_unittest.TestHttpServer.test_win32_start_and_stop is flaky
+        https://bugs.webkit.org/show_bug.cgi?id=106974
+
+        Reviewed by Ryosuke Niwa.
+
+        I forgot to stub out the call to check to ensure that the ports were
+        available, so this test could fail if something was listening on 8000 or
+        8443 on the machine.
+
+        * Scripts/webkitpy/layout_tests/servers/http_server_unittest.py:
+        (TestHttpServer.test_win32_start_and_stop):
+
+2013-01-15  Levi Weintraub  <leviw@chromium.org>
+
+        Unreviewed, rolling out r139792.
+        http://trac.webkit.org/changeset/139792
+        https://bugs.webkit.org/show_bug.cgi?id=106970
+
+        Broke the windows build.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::notifyDone):
+        (DRTTestRunner::reset):
+        (DRTTestRunner::setAlwaysAcceptCookies):
+        (DRTTestRunner::setWindowIsKey):
+        (DRTTestRunner::pathToLocalResource):
+        (DRTTestRunner::setPOSIXLocale):
+        (InvokeCallbackTask):
+        (InvokeCallbackTask::InvokeCallbackTask):
+        (InvokeCallbackTask::runIfValid):
+        (DRTTestRunner::setBackingScaleFactor):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        (DRTTestRunner::taskList):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::setDatabaseQuota):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setDatabaseQuota):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::setPendingExtraData):
+        (WebViewHost::setDeviceScaleFactor):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-15  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Build fix after r139357. The port name of MacWK2EWS should be 'mac-wk2'.
+
+        * Scripts/webkitpy/common/config/ports.py:
+        (MacWK2Port):
+
+2013-01-15  Alan Cutter  <alancutter@chromium.org>
+
+        Extend sheriffbot's "help" command to be able to get help on individual commands
+        https://bugs.webkit.org/show_bug.cgi?id=106629
+
+        Reviewed by Eric Seidel.
+
+        Added a help command to sheriffbot.
+        Fixed some style issues and ordered the commands alphabetically.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+        (IRCCommand):
+        (IRCCommand.execute):
+        (IRCCommand.usage):
+        (IRCCommand.help):
+        (CreateBug):
+        (CreateBug.execute):
+        (Help):
+        (Help.execute):
+        (Help._post_command_help):
+        (Hi):
+        (Hi.execute):
+        (Restart):
+        (RollChromiumDEPS):
+        (RollChromiumDEPS._parse_args):
+        (RollChromiumDEPS._expand_irc_nickname):
+        (RollChromiumDEPS.execute):
+        (Rollout):
+        (Rollout._extract_revisions):
+        (Rollout.execute):
+        (Sheriffs):
+        (Sheriffs.execute):
+        (Whois):
+        (Whois.execute):
+        * Scripts/webkitpy/tool/bot/ircbot_unittest.py:
+        (IRCBotTest.test_help):
+
+2013-01-15  Enrica Casucci  <enrica@apple.com>
+
+        Add a new set of WebKit2 APIs for text search and
+        search results management.
+        https://bugs.webkit.org/show_bug.cgi?id=106834.
+        <rdar://problem/12597159>
+
+        Added new test for the new WebKit2 API for
+        text search.
+        
+        Reviewed by Simon Fraser.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2/FindMatches.mm: Added.
+
+2013-01-15  Levi Weintraub  <leviw@chromium.org>
+
+        [chromium] route more webkit_support and webviewhost callbacks through WebTestDelegate
+        https://bugs.webkit.org/show_bug.cgi?id=106904
+
+        Reverting 139794. It broke the build. It appears that a header file,
+        WebTextDirection.h, was left out.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner::setTitleTextDirection):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::shouldStayOnPageAfterHandlingBeforeUnload):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldStayOnPageAfterHandlingBeforeUnload):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::didReceiveTitle):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didReceiveTitle):
+
+2013-01-15  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] route more webkit_support and webviewhost callbacks through WebTestDelegate
+        https://bugs.webkit.org/show_bug.cgi?id=106904
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::notifyDone):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::setDeviceScaleFactor):
+        (WebTestRunner::WebTestDelegate::setFocus):
+        (WebTestRunner::WebTestDelegate::setAcceptAllCookies):
+        (WebTestRunner::WebTestDelegate::pathToLocalResource):
+        (WebTestRunner::WebTestDelegate::setLocale):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setAlwaysAcceptCookies):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setWindowIsKey):
+        (WebTestRunner::TestRunner::pathToLocalResource):
+        (WebTestRunner::TestRunner::setBackingScaleFactor):
+        (WebTestRunner::TestRunner::setPOSIXLocale):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner::TestRunner::taskList):
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::setDeviceScaleFactor):
+        (WebViewHost::setFocus):
+        (WebViewHost::setAcceptAllCookies):
+        (WebViewHost::pathToLocalResource):
+        (WebViewHost::setLocale):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-15  Zan Dobersek  <zdobersek@igalia.com>
+
+        Tests with WontFix expectation are (indirectly) skipped
+        https://bugs.webkit.org/show_bug.cgi?id=105860
+
+        Reviewed by Dirk Pranke.
+
+        Only skip the WontFix expectation if there are no other layout test
+        expectations (like Failure, ImageOnlyFailure) listed for the test.
+        This makes it possible to run an expected failure for which there
+        is no reason or interest to fix. There are some ports that would like
+        to exercise this behavior as well as specific test cases that should use
+        such expectations.
+
+        * Scripts/webkitpy/layout_tests/models/test_expectations.py:
+        (TestExpectationParser._tokenize_line): Only add the SKIP modifier for a
+        WONTFIX test if there are no expectations listed. The warning is adjusted
+        to reflect the new behavior.
+        * Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py: Add
+        and adjust test cases for these changes.
+        (ExpectationSyntaxTests.test_wontfix):
+        (SemanticTests.test_skip_and_wontfix):
+
+2013-01-15  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] add title text direction attribute to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=106907
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::setTitleTextDirection):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setTitleTextDirection):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::didReceiveTitle):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didReceiveTitle):
+
+2013-01-15  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: change the default # of locked shards on chromium_win to 1
+        https://bugs.webkit.org/show_bug.cgi?id=106938
+
+        Reviewed by Eric Seidel.
+
+        It looks like LigHTTPd might be buggy or unstable if we are
+        running multiple http tests in parallel; see
+        http://code.google.com/p/chromium/issues/detail?id=169530 for more
+        context as well. This change will stop running http tests in parallel
+        and we can see if this fixes things.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_win.py:
+        (ChromiumWinPort.default_max_locked_shards):
+        * Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py:
+        (ChromiumWinTest.test_path_to_image_diff):
+        (ChromiumWinTest):
+        (ChromiumWinTest.test_default_max_locked_shards):
+
+2013-01-15  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move WebDatabase related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106905
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::clearAllDatabases):
+        (WebTestRunner::WebTestDelegate::setDatabaseQuota):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::clearAllDatabases):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setDatabaseQuota):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::clearAllDatabases):
+        (WebViewHost::setDatabaseQuota):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-15  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Renaming CleanWorkingDirectory step to DiscardLocalChanges to make
+        functionality match the name.
+        https://bugs.webkit.org/show_bug.cgi?id=106870
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/tool/commands/download.py:
+        (Clean):
+        (Update):
+        (Build):
+        (BuildAndTest):
+        (CheckStyle):
+        (BuildAttachment):
+        (BuildAndTestAttachment):
+        (AbstractPatchApplyingCommand):
+        (ApplyWatchList):
+        (AbstractPatchLandingCommand):
+        (CreateRollout):
+        * Scripts/webkitpy/tool/steps/__init__.py:
+        * Scripts/webkitpy/tool/steps/cleanworkingdirectory.py:
+        (CleanWorkingDirectory.options):
+        (CleanWorkingDirectory.run):
+        * Scripts/webkitpy/tool/steps/cleanworkingdirectory_unittest.py:
+        * Scripts/webkitpy/tool/steps/discardlocalchanges.py: Copied from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory.py.
+        * Scripts/webkitpy/tool/steps/discardlocalchanges_unittest.py: Copied from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory_unittest.py.
+
+2013-01-15  Zan Dobersek  <zandobersek@gmail.com>
+
+        [Autotools] Add support for WebKit2-only builds
+        https://bugs.webkit.org/show_bug.cgi?id=106889
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * GNUmakefile.am: Only build the GtkLauncher and DumpRenderTree if building WebKit1.
+        * Scripts/build-webkit: Pass along the information on whether to build WebKit1 when
+        building the GTK port through build-webkit.
+        * Scripts/webkitdirs.pm:
+        (buildAutotoolsProject): Add the --disable-webkit1 configuration flag to the build
+        arguments when not building WebKit1.
+        (buildGtkProject): Pass along the information on whether to build WebKit1 when building
+        through the Autotools build system.
+
+2013-01-15  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Enable Performance Timeline, Resource Timing, Navigation Timing features
+        https://bugs.webkit.org/show_bug.cgi?id=106197
+
+        Reviewed by Martin Robinson.
+
+        * Scripts/webkitperl/FeatureList.pm: Add the configuration options for all three
+        features. Enable them on GTK, meaning they will be enabled in development builds
+        (i.e. when building with build-webkit).
+
+2013-01-15  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Enable CSS Image Resolution feature
+        https://bugs.webkit.org/show_bug.cgi?id=99038
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Enable the CSS Image Resolution feature for the development
+        builds of the GTK port.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-01-15  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Stop passing the unstable features flag to configure script when using build-webkit
+        https://bugs.webkit.org/show_bug.cgi?id=106579
+
+        Reviewed by Gustavo Noronha Silva.
+
+        The --enable-unstable-features flag is not required to be passed anymore
+        to the configure script as it was removed in r138252.
+
+        * Scripts/webkitdirs.pm:
+        (buildAutotoolsProject):
+
+2013-01-15  Tony Chang  <tony@chromium.org>
+
+        [chromium] Unreviewed, fix a bug where we don't properly shutdown lighttpd.
+
+        * Scripts/webkitpy/layout_tests/servers/http_server.py:
+        (Lighttpd._check_and_kill): Pass /pid so taskkill.exe doesn't error out on us.
+        * Scripts/webkitpy/layout_tests/servers/http_server_unittest.py:
+        (TestHttpServer.test_win32_start_and_stop):
+
+2013-01-15  Joshua Bell  <jsbell@chromium.org>
+
+        Unreviewed. Adding Michael Pruett as contributor.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-15  Victor Carbune  <victor@rosedu.org>
+
+        Unreviewed. Update my email addresses.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-15  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Waiting on the gdb process will lead to deadlock
+        https://bugs.webkit.org/show_bug.cgi?id=106906
+
+        Reviewed by Philippe Normand.
+
+        Use communicate() rather than wait() on the Popen object that's running the gdb
+        command. This avoids the deadlock that occurs on the GTK builders.
+
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort._get_gdb_output):
+
+2013-01-15  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GTK] Limit the number of frames printed out when backtracing with gdb
+        https://bugs.webkit.org/show_bug.cgi?id=106901
+
+        Reviewed by Philippe Normand.
+
+        Printing an unlimited number of frames when dumping the gdb backtracing
+        output can cause timeouts in the builders. This patch limits the number
+        of frames that are printed out to 1024.
+
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort._get_gdb_output):
+
+2013-01-15  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt] Fix ImageDiff's image format conversion
+        https://bugs.webkit.org/show_bug.cgi?id=106880
+
+        Reviewed by Csaba Osztrogonác.
+
+        Besides actually doing the conversion this also silences the suspicious warning:
+        "ignoring return value of function declared with warn_unused_result attribute".
+
+        * ImageDiff/qt/ImageDiff.cpp:
+        (main): QImage::convertToFormat, contrary to the assumed behaviour, returns a
+        copy of the image in the given format and does not alter the image itself.
+
+2013-01-15  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move remaining methods that just set a boolean flag to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106823
+
+        Reviewed by Darin Fisher.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::shouldDumpBackForwardList):
+        (WebTestRunner::WebTestRunner::deferMainResourceDataLoad):
+        (WebTestRunner::WebTestRunner::shouldDumpSelectionRect):
+        (WebTestRunner::WebTestRunner::testRepaint):
+        (WebTestRunner::WebTestRunner::sweepHorizontally):
+        (WebTestRunner::WebTestRunner::isPrinting):
+        (WebTestRunner::WebTestRunner::shouldStayOnPageAfterHandlingBeforeUnload):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpBackForwardList):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::deferMainResourceDataLoad):
+        (WebTestRunner::TestRunner::shouldDumpSelectionRect):
+        (WebTestRunner::TestRunner::testRepaint):
+        (WebTestRunner::TestRunner::sweepHorizontally):
+        (WebTestRunner::TestRunner::isPrinting):
+        (WebTestRunner::TestRunner::shouldStayOnPageAfterHandlingBeforeUnload):
+        (WebTestRunner::TestRunner::dumpBackForwardList):
+        (WebTestRunner::TestRunner::setDeferMainResourceDataLoad):
+        (WebTestRunner::TestRunner::dumpSelectionRect):
+        (WebTestRunner::TestRunner::repaintSweepHorizontally):
+        (WebTestRunner::TestRunner::setPrinting):
+        (WebTestRunner::TestRunner::setShouldStayOnPageAfterHandlingBeforeUnload):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2013-01-14  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: stub out show_results_html for mock ports
+        https://bugs.webkit.org/show_bug.cgi?id=106848
+
+        Reviewed by Ojan Vafai.
+
+        We were accidentally using the underlying ports'
+        show_results_html_file() implementation, which would, unsurprisingly,
+        fail in many cases (e.g., running mock-efl on the mac).
+
+        No test added since we don't generally add tests for the mock
+        implementation.
+
+        * Scripts/webkitpy/layout_tests/port/mock_drt.py:
+        (MockDRTPort.show_results_html_file):
+
+2013-01-14  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Changing clean_working_directory/clean_local_commits and related
+        functions to have consistent naming.
+
+        https://bugs.webkit.org/show_bug.cgi?id=104198
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        * Scripts/webkitpy/common/checkout/scm/scm.py:
+        * Scripts/webkitpy/common/checkout/scm/scm_mock.py:
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        * Scripts/webkitpy/tool/steps/cleanworkingdirectory.py:
+        * Scripts/webkitpy/tool/steps/cleanworkingdirectory_unittest.py:
+
+2013-01-14  Alan Cutter  <alancutter@chromium.org>
+
+        Fix EWS GCE build scripts to detect which zone is available
+        https://bugs.webkit.org/show_bug.cgi?id=106524
+
+        Reviewed by Adam Barth.
+
+        * EWSTools/GoogleComputeEngine/build-chromium-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh:
+        * EWSTools/GoogleComputeEngine/findzone.sh: Added.
+
+2013-01-14  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Adding an error string to AmbiguousCommitError.
+        https://bugs.webkit.org/show_bug.cgi?id=106846
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (AmbiguousCommitError.__init__):
+
+2013-01-14  Dirk Pranke  <dpranke@chromium.org>
+
+        kill whole lighttpd process tree for chromium win
+        https://bugs.webkit.org/show_bug.cgi?id=106838
+
+        Reviewed by Tony Chang.
+
+        Land a speculative fix for lighttpd.exe hanging on some chromium bots;
+        I think a test is causing a httpd server child process to wedge and
+        killing the parent httpd server process isn't sufficient to ensure
+        that the children are also killed.
+
+        * Scripts/webkitpy/layout_tests/servers/http_server.py:
+        (Lighttpd._check_and_kill):
+        * Scripts/webkitpy/layout_tests/servers/http_server_unittest.py:
+        (TestHttpServer.test_start_cmd):
+        (TestHttpServer):
+        (TestHttpServer.test_win32_start_and_stop):
+        (TestHttpServer.test_win32_start_and_stop.wait_for_action):
+        (TestHttpServer.test_win32_start_and_stop.mock_returns):
+        (TestHttpServer.test_win32_start_and_stop.mock_returns.return_value_thunk):
+
+2013-01-14  Nico Weber  <thakis@chromium.org>
+
+        [chromium] Enable `update-webkit --chromium --ninja` on windows
+        https://bugs.webkit.org/show_bug.cgi?id=106836
+
+        Reviewed by Eric Seidel.
+
+        After running this, build-webkit --chromium will use ninja to build.
+        Apparently there are some minor issues with that still, so it's
+        not quite ready for use yet.
+
+        * Scripts/webkitdirs.pm:
+        (determineIsChromiumNinja):
+        (buildChromium):
+
+2013-01-14  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: use the same search path for baselines and TestExpectations on apple mac
+        https://bugs.webkit.org/show_bug.cgi?id=105599
+
+        Reviewed by Ryosuke Niwa.
+
+        Bug 105583 revealed some confusion due to the fact that the Apple
+        Mac port used a different list of directories to search for baselines
+        and TestExpectations files (actually, pretty much every port does).
+
+        It seems like a good idea to use the same list for both by default, but
+        making this happen will affect every port in slightly different ways, so
+        we'll try this on the Apple Mac port first.
+
+        Note that the effective changes for this are that:
+        1) The apple mac port will look in platform/wk2 for baselines where
+        it didn't before (it will look after looking in mac-wk2 but before
+        the non-wk2 dirs)
+        2) The apple mac-snowleopard port will use the expectations in
+        mac-lion as well as the expectations in mac-snowleopard, although
+        I'm not even sure if mac-snowleopard is still supported ...
+
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort.default_baseline_search_path):
+        (MacPort.expectations_files):
+        * Scripts/webkitpy/layout_tests/port/mac_unittest.py:
+        (test_baseline_search_path):
+
+2013-01-14  Dominic Mazzoni  <dmazzoni@google.com>
+
+        AX: Need to implement ColorWellRole
+        https://bugs.webkit.org/show_bug.cgi?id=106756
+
+        Reviewed by Chris Fleizach.
+
+        Returns a string representation of the value of a color
+        when the role is Color Well, to make it easy to write layout
+        tests for color controls.
+
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+
+2013-01-14  Dominic Mazzoni  <dmazzoni@google.com>
+
+        Chromium: Error in AccessibilityUIElement::intValueGetterCallback
+        https://bugs.webkit.org/show_bug.cgi?id=106682
+
+        Reviewed by Chris Fleizach.
+
+        Modify Chromium's DRT implementation of intValue to return a
+        different value depending on the role.
+
+        There are actually platform-specific differences in what should
+        be returned in the "value" of an object, so Chromium normally keeps
+        these separate (i.e. valueForRange, headingLevel, hierarchicalLevel, etc.)
+        but this is a fine simplification to make cross-platform tests easier.
+
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::intValueGetterCallback):
+
+2013-01-14  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move remaining methods to dump WebViewClient callbacks to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106785
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::setStatusText):
+        (WebTestRunner::WebTestProxy::didStopLoading):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::shouldDumpStatusCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpProgressFinishedCallback):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpStatusCallbacks):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::shouldDumpProgressFinishedCallback):
+        (WebTestRunner::TestRunner::dumpWindowStatusChanges):
+        (WebTestRunner::TestRunner::dumpProgressFinishedCallback):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::setStatusText):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::didStopLoading):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didStopLoading):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-14  Andrey Lushnikov  <lushnikov@chromium.org>
+
+        Web Inspector: devtools front-end doesn't have focus in TestShell
+        https://bugs.webkit.org/show_bug.cgi?id=106778
+
+        Reviewed by Pavel Feldman.
+
+        Focus devTools window after loadURL method.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::runFileTest):
+
+2013-01-14  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL][jhbuild] Build the GStreamer-related dependencies with the "configure" script
+        https://bugs.webkit.org/show_bug.cgi?id=106573
+
+        Reviewed by Philippe Normand.
+
+        Similarly to what's been described in bug 106569, we're building
+        from release tarballs, so there's no reason to regenerate the
+        autoconf-related stuff with autogen.sh, especially since we might
+        run into trouble with automake 1.13 and deprecated macros.
+
+        * efl/jhbuild.modules:
+
+2013-01-14  Jocelyn Turcotte  <jocelyn.turcotte@digia.com>
+
+        [Qt] The Qt's configuration isn't honoured regarding the use of the system libpng and libjpeg
+        https://bugs.webkit.org/show_bug.cgi?id=104909
+
+        Reviewed by Simon Hausmann.
+
+        To be able to build redistribuable binary packages, Qt's configure switches
+        -qt-libpng and -qt-libjpeg are used to avoid having the binaries trying to
+        dynamically link to optional system libraries.
+        QtWebKit is doing its own configure checks for those libraries, thus adding a
+        runtime dependency that might not be fulfilled if the packager's machine had
+        those libraries while the user's machine won't.
+
+        Since in most cases where WebKit will want to use those system libraries, Qt will
+        also be using them, remove these configure tests from WebKit.
+
+        * qmake/config.tests/libjpeg/libjpeg.cpp: Removed.
+        * qmake/config.tests/libjpeg/libjpeg.pro: Removed.
+        * qmake/config.tests/libpng/libpng.cpp: Removed.
+        * qmake/config.tests/libpng/libpng.pro: Removed.
+        * qmake/mkspecs/features/features.prf:
+
+2013-01-09  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL][jhbuild] Bump the EFL dependencies in jhbuild to 1.7.5.
+        https://bugs.webkit.org/show_bug.cgi?id=106574
+
+        Reviewed by Laszlo Gombos.
+
+        Rely on a more recent stable release, which includes support for
+        Lua 5.2 in Edje and other assorted minor fixes.
+
+        While here, also use the "configure" script to build the libraries
+        instead of relying on autogen.sh, which is not really needed with
+        a release tarball and may have problems with automake 1.13.
+
+        * efl/jhbuild.modules:
+
+2013-01-14  Andrey Lushnikov  <lushnikov@chromium.org>
+
+        Web Inspector: fix DRT to deliver simulated events to devtools front-end
+        https://bugs.webkit.org/show_bug.cgi?id=106650
+
+        Reviewed by Pavel Feldman.
+
+        Add separated m_devToolsTestInterfaces object to testShell which is
+        bind to devTools webview.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        (TestShell::createMainWindow):
+        (TestShell::~TestShell):
+        (TestShell::showDevTools):
+        (TestShell::resetTestController):
+        (TestShell::bindJSObjectsToWindow):
+        (TestShell::createNewWindow):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+
+2013-01-14  Alan Cutter  <alancutter@chromium.org>
+
+        Sheriffbot command aliases need test cases
+        https://bugs.webkit.org/show_bug.cgi?id=106754
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/tool/commands/sheriffbot_unittest.py:
+        (SheriffBotTest.test_command_aliases):
+
+2013-01-13  Alan Cutter  <alancutter@chromium.org>
+
+        Allow users to misspell the "sheriffs" command in sheriffbot
+        https://bugs.webkit.org/show_bug.cgi?id=106628
+
+        Reviewed by Steve Block.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+
+2013-01-13  Alan Cutter  <alancutter@chromium.org>
+
+        Make "gardeners" an alias for "sheriffs" in sherrifbot
+        https://bugs.webkit.org/show_bug.cgi?id=106627
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+
+2013-01-13  Dirk Pranke  <dpranke@chromium.org>
+
+        [chromium] webkitpy-test: executive.py stringify_args error on the release test bot
+        https://bugs.webkit.org/show_bug.cgi?id=105380
+
+        Reviewed by Eric Seidel.
+
+        Fix a regression introduced in r137692 where we were double-encoding
+        the arguments to popen(); this was only an issue on windows, where
+        we would try to encode something to mbcs, then try to encode it
+        to unicode as if the input as ascii.
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (Executive.run_command):
+
+2013-01-13  Alan Cutter  <alancutter@chromium.org>
+
+        State who told sheriffbot to roll the Chromium deps and to what revision
+        https://bugs.webkit.org/show_bug.cgi?id=106626
+
+        Reviewed by Eric Seidel.
+
+        Added optional argument to post-chromium-deps-roll so Sheriffbot can specify ChangeLog message.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+        (RollChromiumDEPS._expand_irc_nickname):
+        (RollChromiumDEPS.execute):
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py:
+        (IRCCommandTest.test_roll_chromium_deps):
+        * Scripts/webkitpy/tool/bot/sheriff.py:
+        (Sheriff.post_chromium_deps_roll):
+        * Scripts/webkitpy/tool/commands/roll.py:
+        (RollChromiumDEPS._prepare_state):
+        (PostChromiumDEPSRoll):
+        (PostChromiumDEPSRoll._prepare_state):
+        * Scripts/webkitpy/tool/commands/roll_unittest.py:
+        (PostRollCommandsTest.test_prepare_state):
+        * Scripts/webkitpy/tool/steps/preparechangelogfordepsroll.py:
+        (PrepareChangeLogForDEPSRoll.run):
+
+2013-01-13  Alan Cutter  <alancutter@chromium.org>
+
+        Add Alan Cutter as contributor
+        https://bugs.webkit.org/show_bug.cgi?id=106747
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-13  Jonathan Liu  <net147@gmail.com>
+
+        Fix CONFIG missing link_pkgconfig on Windows
+        https://bugs.webkit.org/show_bug.cgi?id=106647
+
+        Some libraries (e.g. libxslt, libxml2 and sqlite3) fail to link
+        properly on Windows because they are added to PKGCONFIG but
+        CONFIG does not contain link_pkgconfig.
+
+        This is because link_pkgconfig is added in unix/default_pre.prf
+        which is only used for UNIX platforms. To fix this, move it to
+        the general default_pre.prf.
+
+        Reviewed by Simon Hausmann.
+
+        * qmake/mkspecs/features/default_pre.prf:
+        * qmake/mkspecs/features/unix/default_pre.prf:
+
+2013-01-12  Nico Weber  <thakis@chromium.org>
+
+        nrwt/chromium: Don't prefer chromium over webkit build directories
+        https://bugs.webkit.org/show_bug.cgi?id=105597
+
+        Reviewed by Dirk Pranke.
+
+        Rely on the new timestamp logic instead. Requested by dpranke in
+        https://bugs.webkit.org/show_bug.cgi?id=105498
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort._static_build_path):
+        * Scripts/webkitpy/layout_tests/port/chromium_linux_unittest.py:
+        (ChromiumLinuxPortTest.test_build_path):
+        * Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py:
+        (ChromiumMacPortTest.test_build_path):
+        * Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py:
+        (ChromiumWinTest.test_build_path):
+
+2013-01-12  Nico Weber  <thakis@chromium.org>
+
+        Use ninja by default on Linux for build-webkit --chromium, bot edition
+        https://bugs.webkit.org/show_bug.cgi?id=104434
+
+        Reviewed by Eric Seidel.
+
+        r139557 changed update-webkit to pick ninja by default on linux, but
+        the bots run update-webkit-chromium directly so they didn't see this.
+        Move the default for ninja into update-webkit-chromium so that it's
+        picked up by the bots, and let update-webkit forward non-default
+        options to there.
+
+        This way, the default is in one place only and both developers (who
+        usually use update-webkit which then shells out to
+        updat-webkit-chromium) and bots (which use update-webkit-chromium
+        directly) see the same behavior.
+
+        * Scripts/update-webkit:
+        * Scripts/update-webkit-chromium:
+
+2013-01-12  Nico Weber  <thakis@chromium.org>
+
+        Make ninja the default build system on Linux for build-webkit --chromium
+        https://bugs.webkit.org/show_bug.cgi?id=104434
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/update-webkit:
+
+2013-01-12  Alan Cutter  <alancutter@chromium.org>
+
+        Migrate the remaining bots in EC2 to Google Compute Engine
+        https://bugs.webkit.org/show_bug.cgi?id=106005
+
+        Reviewed by Eric Seidel.
+
+        Updated bot scripts for launching feeder-queue, style-queue and sheriffbot on GCE.
+
+        * EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh: Copied from Tools/EWSTools/build-repo.sh.
+        * EWSTools/boot.sh:
+        * EWSTools/build-repo.sh:
+        * EWSTools/start-queue.sh:
+
+2013-01-12  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move inspector related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106654
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::showDevTools):
+        (WebTestRunner::WebTestDelegate::closeDevTools):
+        (WebTestRunner::WebTestDelegate::evaluateInWebInspector):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::showWebInspector):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::closeWebInspector):
+        (WebTestRunner::TestRunner::evaluateInWebInspector):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::showDevTools):
+        (WebViewHost::closeDevTools):
+        (WebViewHost::evaluateInWebInspector):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-11  Julie Parent  <jparent@chromium.org>
+
+        Builder should not be a valid parameter for stats dashboard
+        https://bugs.webkit.org/show_bug.cgi?id=106698
+
+        Reviewed by Dirk Pranke.
+        
+        Since builder is a dashboard specific parameter, dashboard_base
+        should not be handling it in handleValidHashParameterWrapper, rather,
+        each specific dashboard should in its handleValidHashParameter function.
+    
+        Note that the FIXME in dashboard_base about this was actually wrong -
+        we don't want to move it to g_crossDashboardState, because it isn't
+        actually cross dashboard state.
+        
+        In fact, flakiness and treemap have the code in 
+        handleValidHashParameter, but it is currently dead code because 
+        dashboard_base gets to it first.
+        
+        Added the proper handling to timeline_explorer, since builder is
+        valid there.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+
+2013-01-11  Ryosuke Niwa  <rniwa@webkit.org>
+
+        REGRESSION: buildbot mangles error messages with timestamps run-webkit-tests outputs
+        https://bugs.webkit.org/show_bug.cgi?id=106688
+
+        Reviewed by Eric Seidel.
+
+        Update the regular expression used to strip the garbage at the beginning.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunWebKitTests.nrwt_log_message_regexp):
+
+2013-01-11  Pratik Solanki  <psolanki@apple.com>
+
+        TestRunner leaks when running tests
+        https://bugs.webkit.org/show_bug.cgi?id=106683
+
+        Reviewed by Simon Fraser.
+
+        Remove extra ref() that we missed out on deleting when refactoring window.layoutTestController
+        to window.testRunner in r124705. This caused the TestRunner object to be leaked when running
+        tests.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::makeWindowObject):
+
+2013-01-11  Julie Parent  <jparent@chromium.org>
+
+        Dashboard Cleanup: Add isLoadingComplete to the loader.Loader object.
+        https://bugs.webkit.org/show_bug.cgi?id=106247
+
+        Old code nulled out the loader instance when it completed loading and
+        then later used the fact that it was null to determine if it had loaded
+        or not.  This is not only unintuitive, but it also prevents using the
+        loader object later on.
+        
+        Added new method, used it, added unit test for it.
+        
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (resourceLoadingComplete):
+        (handleLocationChange):
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2013-01-11  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Try CRLF to LF change in r139407 again.
+
+        * BuildSlaveSupport/delete-stale-build-files:
+        (main):
+        (webkitBuildDirectory):
+        * BuildSlaveSupport/kill-old-processes:
+        (main):
+
+2013-01-11  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Disable the unit tests timeout when running from make check
+        https://bugs.webkit.org/show_bug.cgi?id=106670
+
+        Reviewed by Philippe Normand.
+
+        * GNUmakefile.am: Pass --timeout=-1 to run-gtk-test.
+
+2013-01-11  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        Yet another unreviewed fix after r139431.
+
+        * Scripts/run-launcher: Pass the arguments to `jhbuild-wrapper' in
+        the correct order.
+
+2013-01-11  Dan Carney  <dcarney@google.com>
+
+        [chromium] move some whitespace and resize related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106655
+
+        Reviewed by Jochen Eisinger.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebKit):
+        (WebTestRunner::WebTestDelegate::setClientWindowRect):
+        (WebTestRunner::WebTestDelegate::setSelectTrailingWhitespaceEnabled):
+        (WebTestRunner::WebTestDelegate::setSmartInsertDeleteEnabled):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::setSmartInsertDeleteEnabled):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setSelectTrailingWhitespaceEnabled):
+        (WebTestRunner::TestRunner::enableAutoResizeMode):
+        (WebTestRunner::TestRunner::disableAutoResizeMode):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::setClientWindowRect):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-11  Mario Sanchez Prada  <mario.prada@samsung.com>
+
+        Unreviewed. Update my e-mail addresses.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-11  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        Another unreviewed fix after r139431.
+
+        In a way, this is also a generic bug fix, since previously isEfl()
+        would fail when called from run-efl-tests and we thus did not use
+        jhbuild to run our tests. This now resulted in us calling
+        "jhbuild-wrapper run" without specifying a platform.
+
+        * Scripts/run-efl-tests: Pass "--efl" to ARGV manually for isEfl()
+        to work.
+
+2013-01-11  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt][WK1] Web Audio support
+        https://bugs.webkit.org/show_bug.cgi?id=106651
+
+        Reviewed by Jocelyn Turcotte.
+
+        Implements support for dumping audio data in DumpRenderTree.
+
+        Adds WebAudio to toggleable features in QtTestBrowser.
+
+        Enables LEGACY_WEB_AUDIO. This feature is required for 2/3 of the web audio regression tests. It is enabled by default
+        because it has no effect when WEB_AUDIO is not enabled. This combination matches the settings in FeatureList.pm.
+
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::DumpRenderTree::dump):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunner::reset):
+        (TestRunner::overridePreference):
+        (TestRunner::setAudioData):
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner::shouldDumpAsAudio):
+        (TestRunner::audioData):
+        (TestRunner):
+        * QtTestBrowser/launcherwindow.cpp:
+        (LauncherWindow::applyPrefs):
+        (LauncherWindow::createChrome):
+        (LauncherWindow::toggleWebAudio):
+        * QtTestBrowser/launcherwindow.h:
+        (WindowOptions::WindowOptions):
+        (WindowOptions):
+        (LauncherWindow):
+        * qmake/mkspecs/features/features.prf:
+        * qmake/mkspecs/features/features.pri:
+
+2013-01-11  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        Unreviewed jhbuild-related fix after r139431.
+
+        * Scripts/webkitpy/layout_tests/port/efl.py:
+        (EflPort.__init__): Pass a string to set_option_default(), since
+        shlex.split() will be called on it later.
+
+2013-01-11  Csaba Osztrogonác  <ossy@webkit.org>
+
+        Unreviewed typo fixes after r139431.
+
+        * Scripts/run-javascriptcore-tests:
+
+2013-01-11  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [jhbuild] Remove the "run-with-jhbuild" scripts.
+        https://bugs.webkit.org/show_bug.cgi?id=106572
+
+        Reviewed by Martin Robinson.
+
+        Both ports which use jhbuild were mostly duplicating the
+        `run-with-jhbuild' script in their own directories for no clear reason.
+
+        The script itself was just a thin wrapper around the `jhbuild-wrapper',
+        so just start using that directly and get rid of a useless middle man.
+
+        Adjust scripts which called run-with-jhbuild to call jhbuild-wrapper
+        instead.
+
+        * Scripts/run-javascriptcore-tests:
+        * Scripts/run-launcher:
+        * Scripts/webkitdirs.pm:
+        (runAutogenForAutotoolsProjectIfNecessary):
+        (buildAutotoolsProject):
+        (jhbuildWrapperPrefixIfNeeded):
+        (generateBuildSystemFromCMakeProject):
+        (buildCMakeGeneratedProject):
+        * Scripts/webkitpy/common/multiprocessing_bootstrap.py:
+        (run):
+        * Scripts/webkitpy/layout_tests/port/efl.py:
+        (EflPort.__init__):
+        (EflPort._image_diff_command):
+        * efl/run-with-jhbuild: Removed.
+        * gtk/run-with-jhbuild: Removed.
+
+2013-01-11  Alan Cutter  <alancutter@chromium.org>
+
+        Allow arbitrary queue launch parameters in EWSTools/start-queue.sh
+        https://bugs.webkit.org/show_bug.cgi?id=106636
+
+        Reviewed by Adam Barth.
+
+        This parameter will allow the bot boot script to use start-queue.sh and provide an IRC password for sheriffbot.
+
+        * EWSTools/GoogleComputeEngine/build-chromium-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/screen-config:
+        * EWSTools/start-queue.sh:
+
+2013-01-10  Ryosuke Niwa  <rniwa@webkit.org>
+
+        kill-old-processes and delete-stale-build-files use CRLF linebreaks
+        https://bugs.webkit.org/show_bug.cgi?id=106622
+
+        Reviewed by Simon Fraser.
+
+        Use LF instead of CRLF in kill-old-processes and delete-stale-build-files.
+        Also escape clang\+\+ correctly in kill-old-processes.
+
+        * BuildSlaveSupport/delete-stale-build-files:
+        * BuildSlaveSupport/kill-old-processes:
+
+2013-01-10  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Build fix after r139357. It was missing a comma.
+
+        * QueueStatusServer/model/queues.py:
+        (Queue):
+
+2013-01-10  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Fixing AuthenticationError when running test-webkitpy as a non-committer.
+        https://bugs.webkit.org/show_bug.cgi?id=106420
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.push_local_commits_to_server):
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVNRepository):
+        (SVNRepository.has_authorization_for_realm):
+
+2013-01-10  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [EFL][jhbuild] Use tarballs for gstreamer instead of git
+        https://bugs.webkit.org/show_bug.cgi?id=106552
+
+        Reviewed by Laszlo Gombos.
+
+        Use tarballs for gstreamer instead of git in EFL's jhbuild
+        to work around intermittent network issues on our build
+        bots. Tarballs are fully cached and require no network
+        operation if their checksum matches.
+
+        * efl/jhbuild.modules:
+
+2013-01-10  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Add Mac WK2 EWS bots
+        https://bugs.webkit.org/show_bug.cgi?id=106590
+
+        Reviewed by Adam Barth.
+
+        Added MacWK2EWS, and made myself a watcher for MacEWS and MacWK2EWS.
+        Also add a deprecated MacWK2Port class.
+
+        * QueueStatusServer/model/queues.py:
+        (Queue):
+        * Scripts/webkitpy/common/config/ports.py:
+        (DeprecatedPort.port):
+        (MacWK2Port):
+        (MacWK2Port.run_webkit_tests_command):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (MacEWS):
+        (MacWK2EWS):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:
+        (_test_ewses):
+
+2013-01-10  Dan Carney  <dcarney@google.com>
+
+        [chromium] move webpermissionclient related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106548
+
+        Reviewed by Jochen Eisinger.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner::WebTestDelegate::normalizeLayoutTestURL):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebKit):
+        (WebTestRunner::WebTestRunner::webPermissions):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::setDelegate):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::webPermissions):
+        (WebTestRunner::TestRunner::dumpPermissionClientCallbacks):
+        (WebTestRunner::TestRunner::setImagesAllowed):
+        (WebTestRunner::TestRunner::setScriptsAllowed):
+        (WebTestRunner::TestRunner::setStorageAllowed):
+        (WebTestRunner::TestRunner::setPluginsAllowed):
+        (WebTestRunner::TestRunner::setAllowDisplayOfInsecureContent):
+        (WebTestRunner::TestRunner::setAllowRunningOfInsecureContent):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebPermissions.cpp: Renamed from Tools/DumpRenderTree/chromium/WebPermissions.cpp.
+        (WebTestRunner):
+        (WebTestRunner::WebPermissions::WebPermissions):
+        (WebTestRunner::WebPermissions::~WebPermissions):
+        (WebTestRunner::WebPermissions::allowImage):
+        (WebTestRunner::WebPermissions::allowScriptFromSource):
+        (WebTestRunner::WebPermissions::allowStorage):
+        (WebTestRunner::WebPermissions::allowPlugins):
+        (WebTestRunner::WebPermissions::allowDisplayingInsecureContent):
+        (WebTestRunner::WebPermissions::allowRunningInsecureContent):
+        (WebTestRunner::WebPermissions::setImagesAllowed):
+        (WebTestRunner::WebPermissions::setScriptsAllowed):
+        (WebTestRunner::WebPermissions::setStorageAllowed):
+        (WebTestRunner::WebPermissions::setPluginsAllowed):
+        (WebTestRunner::WebPermissions::setDisplayingInsecureContentAllowed):
+        (WebTestRunner::WebPermissions::setRunningInsecureContentAllowed):
+        (WebTestRunner::WebPermissions::setDelegate):
+        (WebTestRunner::WebPermissions::setDumpCallbacks):
+        (WebTestRunner::WebPermissions::reset):
+        * DumpRenderTree/chromium/TestRunner/src/WebPermissions.h: Renamed from Tools/DumpRenderTree/chromium/WebPermissions.h.
+        (WebTestRunner):
+        (WebPermissions):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        (TestShell::resetTestController):
+        (TestShell::createNewWindow):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::normalizeLayoutTestURL):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-10  Alan Cutter  <alancutter@chromium.org>
+
+        Split EWS tool cold-boot.sh into modular components
+        https://bugs.webkit.org/show_bug.cgi?id=106527
+
+        Reviewed by Adam Barth.
+
+        Split cold-boot.sh script up into build-vm.sh, build-repo.sh and build-boot-cmd.sh.
+        Updated GCE bot build scripts to match.
+        Unable to test scripts directly as they depend on being in the repository to work!
+
+        * EWSTools/GoogleComputeEngine/build-chromium-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/build-boot-cmd.sh: Copied from Tools/EWSTools/GoogleComputeEngine/build-chromium-ews.sh.
+        * EWSTools/build-repo.sh: Copied from Tools/EWSTools/cold-boot.sh.
+        * EWSTools/build-vm.sh: Renamed from Tools/EWSTools/cold-boot.sh.
+
+2013-01-10  Julie Parent  <jparent@chromium.org>
+
+        Dashboard Cleanup: Do not generate the page if we are about to reload.
+        https://bugs.webkit.org/show_bug.cgi?id=106584
+
+        Reviewed by Dirk Pranke.
+
+        Move the logic to determine if we should generate the page into
+        parseParameters() since that is where we have the knowledge to
+        determine it, and return that value to handleLocationChange, 
+        rather than passing the changed parameters back to handleLocationChange
+        and having it make the decision.
+        
+        This is logically equivalent, save one case: when we are about to do
+        a reload, we know that there is no reason to generate the page.  Old
+        code was causing an extra page generation in this case.
+        
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseParameters):
+        (handleLocationChange):
+
+2013-01-10  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [jhbuild] Use the "configure" script to build glib
+        https://bugs.webkit.org/show_bug.cgi?id=106569
+
+        Reviewed by Martin Robinson.
+
+        So far both EFL and GTK have been using autogen.sh to build glib.
+        While that does work most of the time, it's not really needed since
+        we are downloading and building stable releases from tarballs.
+        Additionally, autogen.sh fails to work with automake 1.13 due to the
+        usage of some macros that have been removed (this has already been
+        fixed in glib master).
+
+        * efl/jhbuild.modules:
+        * gtk/jhbuild.modules:
+
+2013-01-10  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Changing tests to be consistent and use self.scm rather then recreating the scm object.
+        (Missed a couple)
+        https://bugs.webkit.org/show_bug.cgi?id=106536
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+
+2013-01-10  Tony Chang  <tony@chromium.org>
+
+        Speed up supplemental dependency computation
+        https://bugs.webkit.org/show_bug.cgi?id=106503
+
+        Reviewed by Adam Barth.
+
+        Pass the IDL attributes file for generating the bindings in WebKitTestRunner.
+
+        * WebKitTestRunner/CMakeLists.txt:
+
+2013-01-10  Zan Dobersek  <zandobersek@gmail.com>
+
+        Remove the ENABLE_ANIMATION_API feature define occurences
+        https://bugs.webkit.org/show_bug.cgi?id=106544
+
+        Reviewed by Simon Fraser.
+
+        The Animation API code was removed in r137243. The ENABLE_ANIMATION_API
+        feature define handling still lingers in various build systems and configurations
+        but is of no use, so it should be removed.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2013-01-10  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Add support for loading web process extensions
+        https://bugs.webkit.org/show_bug.cgi?id=105631
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * MiniBrowser/gtk/GNUmakefile.am:
+        * MiniBrowser/gtk/main.c:
+        (main): Set WEBKIT_INJECTED_BUNDLE env var to use the injected
+        bundle lib from build dir.
+        * Scripts/webkitpy/style/checker.py: Add exceptions for GTK+ API
+        located in WebProcess/InjectedBundle/API/gtk.
+        * gtk/generate-gtkdoc:
+        (get_webkit2_options): Scan also files in
+        WebProcess/InjectedBundle/API/gtk to generate API docs.
+        (get_webkit2_options.injected_bundle_src_path): Helper function to
+        build paths in WebProcess/InjectedBundle/API/gtk.
+
+2013-01-10  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [EFL][WK2] Writing immediately to created windows (open) fails
+        https://bugs.webkit.org/show_bug.cgi?id=105276
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Do not reset 'about:blank' url for the new pages in mini browser.
+
+        * MiniBrowser/efl/main.c:
+        (window_create):
+
+2013-01-10  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Changing tests to be consistent and use self.scm rather then recreating the scm object.
+        https://bugs.webkit.org/show_bug.cgi?id=106536
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+
+2013-01-10  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Converting to unittest2 so we can use assertItemsEqual, making tests
+        not dependent on order of items.
+        https://bugs.webkit.org/show_bug.cgi?id=106532
+
+        Before:
+        Ran 1733 tests in 38.385s
+        FAILED (failures=1, errors=22)
+
+        After:
+        Ran 1733 tests in 32.298s
+        FAILED (failures=0, errors=22)
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        * Scripts/webkitpy/thirdparty/__init__.py:
+        (AutoinstallImportHook._install_unittest2):
+
+2013-01-10  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [EFL] Add gstreamer 1.0.5 to jhbuild
+        https://bugs.webkit.org/show_bug.cgi?id=106178
+
+        Reviewed by Laszlo Gombos.
+
+        Add gstreamer 1.0.5 to EFL's jhbuild configuration.
+
+        * efl/jhbuild.modules:
+
+2013-01-09  Alan Cutter  <alancutter@chromium.org>
+
+        Updated parameters in GCE build scripts so they now work.
+        https://bugs.webkit.org/show_bug.cgi?id=106523
+
+        Reviewed by Adam Barth.
+
+        * EWSTools/GoogleComputeEngine/build-chromium-ews.sh:
+        * EWSTools/GoogleComputeEngine/build-commit-queue.sh:
+        * EWSTools/cold-boot.sh:
+
+2013-01-09  Mark Pilgrim  <pilgrim@chromium.org>
+
+        [Chromium] Remove some stray references to WebKitPlatformSupport.h in DumpRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=106520
+
+        Reviewed by James Robinson.
+
+        Part of a larger refactoring series. See tracking bug 82948.
+
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.h:
+        * DumpRenderTree/chromium/WebThemeEngineDRTMac.mm:
+
+2013-01-09  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: Remove code for currentState and window.location.hash getting out of state
+        https://bugs.webkit.org/show_bug.cgi?id=106514
+
+        This is old code, as these can no longer get out of sync.
+        permmaLinkURLHash is generated from currentState, which is set only
+        from the location.  The commment about how these can get out of sync
+        refers to a function that no longer exists.
+        
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (handleLocationChange):
+
+2013-01-09  Julie Parent  <jparent@chromium.org>
+
+        Dashboard Cleanup: Reload the page as soon as we know we need to.
+        https://bugs.webkit.org/show_bug.cgi?id=106515
+
+        No need to continue parsing all of the data once we know that
+        we need to do a reload.
+        
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseParameters):
+
+2013-01-09  Eric Seidel  <eric@webkit.org>
+
+        run-perf-tests --chromium-android --profile should show symbols for the kernel
+        https://bugs.webkit.org/show_bug.cgi?id=106498
+
+        Reviewed by Adam Barth.
+
+        Turns out this was easy, once I finally read the output from "perf report".
+        It appears there may be a bug in "perf record" on android, as it complains
+        about not being able to read from /proc/kallsyms even when
+        /proc/sys/kernel/kptr_restrict is 0.  For now I've not bothered
+        to keep /proc/sys/kernel/kptr_restrict as 0 during the actual record
+        but rather just flip it to 0 long enough to grab the /proc/kallsyms
+        and then flip it back to whatever the device had.
+
+        /proc/sys/kernel/kptr_restrict controls what /proc/kallsyms returns
+        on Linux.  /proc/kallsyms contains a mapping of kernel addresses
+        to symbol names.  Its world-readable, but will return all 0s if you
+        don't have permission to see the kernel symbols.  kptr_restrict
+        supports values 0, 1, 2.  Where 0 means "everyone can see the real symbols"
+        1 is only a specific group, and 2 is "no one, not even root".
+        By default kptr_restrict is 2 on Android it seems.
+        More kptr_restrict docs: http://lwn.net/Articles/420403/
+
+        I also took this opportunity to clean up how the perf record command
+        was built for use/display in AndroidPerf.profile_after_exit and
+        change to always using long-form names for the arguments (to hopefully help readability).
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (AndroidPerf.__init__):
+        (profile_after_exit):
+        (ChromiumAndroidDriver.__init__):
+        (ChromiumAndroidDriver._update_kallsyms_cache):
+        * Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py:
+
+2013-01-09  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: remove dead code.
+        https://bugs.webkit.org/show_bug.cgi?id=106509
+
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseParameters):
+
+2013-01-09  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        [GTK] accessibility/aria-labelledby-overrides-label.html requires a proper baseline
+        https://bugs.webkit.org/show_bug.cgi?id=105638
+
+        Reviewed by Martin Robinson.
+
+        The test was failing for two reasons:
+        - AccessibilityRenderObject::correspondingLabelForControlElement() was
+          not ignoring the ARIA labelled-by property
+        - AccessibilityController::accessibleElementById() was not implemented
+
+        Because getting an element by ID cannot be done in the UIProcess, the
+        decision was made to expose the element's ID as an accessible attribute
+        of the object.
+
+        In addition, fixing the bug in AccessibilityRenderObject made it possible
+        to eliminate the Gtk platform-specific expectations for another test.
+
+        * DumpRenderTree/gtk/AccessibilityControllerGtk.cpp:
+        (childElementById): Added. Walks the tree looking for the AtkObject
+        Attribute which exposes the HTML element's ID.
+        (AccessibilityController::accessibleElementById): Implemented.
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::title): Modified to print out "AXTitle: " even
+        when there is no title, as is done with the Mac port.
+        * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp:
+        (WTR::childElementById): Added. Walks the tree looking for the AtkObject
+        Attribute which exposes the HTML element's ID.
+        (WTR):
+        (WTR::AccessibilityController::accessibleElementById): Implemented.
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::AccessibilityUIElement::title): Modified to print out "AXTitle: "
+        even when there is no title, as is done with the Mac port.
+
+2013-01-09  Gregg Tavares  <gman@google.com>
+
+        Add Gregg Tavares as a committer
+        https://bugs.webkit.org/show_bug.cgi?id=106492
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-09  Roger Fong  <roger_fong@apple.com>
+
+        Enable seamless iFrames for Windows DRT.
+        https://bugs.webkit.org/show_bug.cgi?id=106468.
+
+        Rubberstamped by Timothy Horton.
+
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues):
+
+2013-01-09  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [WK2] Implement eventSender.scheduleAsynchronousKeyDown
+        https://bugs.webkit.org/show_bug.cgi?id=93979
+
+        Reviewed by Benjamin Poulain.
+
+        Implement eventSender.scheduleAsynchronousKeyDown() in
+        WebKitTestRunner.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
+        * WebKitTestRunner/InjectedBundle/EventSendingController.cpp:
+        (WTR::createKeyDownMessageBody):
+        (WTR::EventSendingController::keyDown):
+        (WTR::EventSendingController::scheduleAsynchronousKeyDown):
+        * WebKitTestRunner/InjectedBundle/EventSendingController.h:
+        (EventSendingController):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::didReceiveKeyDownMessageFromInjectedBundle):
+        (WTR::TestController::didReceiveMessageFromInjectedBundle):
+        (WTR::TestController::didReceiveSynchronousMessageFromInjectedBundle):
+        * WebKitTestRunner/TestController.h:
+        (TestController):
+
+2013-01-09  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move resource load callback dumping to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106449
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebKit):
+        (WebTestRunner::WebTestDelegate::makeURLErrorDescription):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::assignIdentifierToRequest):
+        (WebTestRunner::WebTestProxy::willRequestResource):
+        (WebTestRunner::WebTestProxy::willSendRequest):
+        (WebTestRunner::WebTestProxy::didReceiveResponse):
+        (WebTestRunner::WebTestProxy::didFinishResourceLoad):
+        (WebTestRunner::WebTestProxy::didFailResourceLoad):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::shouldDumpResourceLoadCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpResourceRequestCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpResourceResponseMIMETypes):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpResourceLoadCallbacks):
+        (WebTestRunner::TestRunner::shouldDumpResourceRequestCallbacks):
+        (WebTestRunner::TestRunner::shouldDumpResourceResponseMIMETypes):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::dumpResourceLoadCallbacks):
+        (WebTestRunner::TestRunner::dumpResourceRequestCallbacks):
+        (WebTestRunner::TestRunner::dumpResourceResponseMIMETypes):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::reset):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::assignIdentifierToRequest):
+        (WebTestRunner::WebTestProxyBase::willRequestResource):
+        (WebTestRunner::WebTestProxyBase::willSendRequest):
+        (WebTestRunner::WebTestProxyBase::didReceiveResponse):
+        (WebTestRunner::WebTestProxyBase::didFinishResourceLoad):
+        (WebTestRunner::WebTestProxyBase::didFailResourceLoad):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::willSendRequest):
+        (WebViewHost::makeURLErrorDescription):
+        (WebViewHost::reset):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-09  Dan Carney  <dcarney@google.com>
+
+        [chromium] move dumpcreateview methods to testrunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106434
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::shouldDumpCreateView):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpCreateView):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::dumpCreateView):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2013-01-09  Csaba Osztrogonác  <ossy@webkit.org>
+
+        webkitpy cleanup: Merge additional_comment_text into comment_text
+        https://bugs.webkit.org/show_bug.cgi?id=106421
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/common/config/committervalidator.py:
+        (CommitterValidator.reject_patch_from_commit_queue):
+        (CommitterValidator.reject_patch_from_review_queue):
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla.py:
+        (Bugzilla.set_flag_on_attachment):
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla_mock.py:
+        (MockBugzilla.set_flag_on_attachment):
+        * Scripts/webkitpy/tool/bot/feeders_unittest.py:
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (AbstractEarlyWarningSystem._post_reject_message_on_bug):
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+
+2013-01-09  Mario Sanchez Prada  <mario.prada@samsung.com>
+
+        [GTK] Raise version of gdk-pixbuf in jhbuild up to 2.26.5
+        https://bugs.webkit.org/show_bug.cgi?id=106464
+
+        Reviewed by Martin Robinson.
+
+        Current version in jhbuild.modules (2.26.0) is giving trouble to
+        when trying to build WebKitGTK from scratch, due to a segmentation
+        fault error in gdk-pixbuf-query-loader during the 'make'
+        phase. Raising the version to 2.26.5 fixes this issue.
+
+        * gtk/jhbuild.modules: Version raised, checksums updated.
+
+2013-01-09  János Badics  <jbadics@inf.u-szeged.hu>
+
+        [Qt][NRWT] Pass --timeout to DRT/WTR if a test is marked as SLOW.
+        https://bugs.webkit.org/show_bug.cgi?id=90968.
+
+        Reviewed by Csaba Osztrogonác.
+
+        Added functionality in DRT and WTR to use any timeout value while running
+        slow tests (eventually, any test). Now NRWT --time-out-ms determines the
+        timeout value for the test. Added a flag in NRWT (supports_per_test_timeout)
+        to indicate whether the current port supports setting timeout value
+        per test (it's False by default; I enabled it only on Qt).
+        Also corrected a typo in driver.py
+
+        * DumpRenderTree/DumpRenderTree.h:
+        (TestCommand::TestCommand):
+        (TestCommand):
+        * DumpRenderTree/DumpRenderTreeCommon.cpp:
+        (parseInputLine):
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::DumpRenderTree::processLine):
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.supports_per_test_timeout):
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver.run_test):
+        (Driver._command_from_driver_input):
+        * Scripts/webkitpy/layout_tests/port/qt.py:
+        (QtPort.supports_per_test_timeout):
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::InjectedBundle):
+        (WTR::InjectedBundle::didReceiveMessage):
+        (WTR::InjectedBundle::beginTesting):
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.h:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setCustomTimeout):
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+        * WebKitTestRunner/InjectedBundle/qt/TestRunnerQt.cpp:
+        (WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::TestController):
+        (WTR::TestController::getCustomTimeout):
+        (WTR):
+        (WTR::TestCommand::TestCommand):
+        (TestCommand):
+        (WTR::parseInputLine):
+        (WTR::TestController::runTest):
+        (WTR::TestController::runUntil):
+        * WebKitTestRunner/TestController.h:
+        (TestController):
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::TestInvocation):
+        (WTR::TestInvocation::setCustomTimeout):
+        (WTR):
+        (WTR::TestInvocation::invoke):
+        * WebKitTestRunner/TestInvocation.h:
+        (TestInvocation):
+
+2013-01-08  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
+
+        Regression(r138681): Add HAVE(ACCESSIBILITY) guard to atk files
+        https://bugs.webkit.org/show_bug.cgi?id=106290
+
+        Reviewed by Martin Robinson.
+
+        Some atk files don't use HAVE(ACCESSIBILITY). It might make build errors when
+        the macro isn't enabled.
+
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+
+2013-01-08  Martin Robinson  <mrobinson@igalia.com>
+
+        WebKitTestRunner needs support for setHandlesAuthenticationChallenges
+        https://bugs.webkit.org/show_bug.cgi?id=103653
+
+        Reviewed by Anders Carlsson.
+
+        Implement setHandlesAuthenticationChallenges in the UIProcess by sending credentials
+        and the enabled boolean to the UIProcess and then implementing the didReceiveAuthenticationChallengeInFrame
+        client callback.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: Exposed the new TestRunner
+        methods to the JavaScript API.
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setHandlesAuthenticationChallenges): Added this callback for the JavaScript API.
+        (WTR::TestRunner::setAuthenticationUsername): Ditto.
+        (WTR::TestRunner::setAuthenticationPassword): Ditto.
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner): Added new declarations for the above.
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions): Hook up the new didReceiveSynchronousMessageFromInjectedBundle
+        callback.
+        (WTR::TestController::resetStateToConsistentValues): Reset the credentials and enabled boolean between tests.
+        (WTR::TestController::didReceiveAuthenticationChallengeInFrame): Handle the callback by using
+        the authentication information passed from the InjectedBundle.
+        * WebKitTestRunner/TestController.h:
+        (WTR::TestController::setHandlesAuthenticationChallenges): Added setter to allow TestInvocation
+        to communicate with the TestController.
+        (WTR::TestController::setAuthenticationUsername): Ditto.
+        (WTR::TestController::setAuthenticationPassword): Ditto.
+        (TestController):
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle): Handle the messages sending authentication
+        information from the InjectedBundle.
+        (WTR::TestInvocation::outputText): Added this method so that the TestController can output
+        text to the TestInvocation text output.
+        * WebKitTestRunner/TestInvocation.h:
+        (TestInvocation): Added declaration for new method.
+
+2013-01-08  Benjamin Poulain  <benjamin@webkit.org>
+
+        Add myself as a watcher for Web Geolocation
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-01-08  Zan Dobersek  <zandobersek@gmail.com>
+
+        [webkitpy] Call setup_test_run method of the parent Port interface when method is called on subclasses
+        https://bugs.webkit.org/show_bug.cgi?id=106364
+
+        Reviewed by Eric Seidel.
+
+        When the setup_test_run method is called on the subclasses of the base Port
+        interface, the parent method should also be called via super(), despite the
+        parent method not doing anything at the moment.
+
+        The according calls to super() are required in the ChromiumPort, EflPort
+        and GtkPort implementations.
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort.setup_test_run):
+        * Scripts/webkitpy/layout_tests/port/efl.py:
+        (EflPort.setup_test_run):
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort.setup_test_run):
+
+2013-01-08  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: Remove globals g_buildersThatFailedToLoad and g_staleBuilders
+        https://bugs.webkit.org/show_bug.cgi?id=106356
+
+        g_buildersThatFailedToLoad and g_staleBuilders were globals defined in
+        dashboard_base, assigned by Loader, and used only by dashboard_base to
+        create error messages.  Moved the variables to be privates on the Loader
+        object, moved error message creation to _getLoadingErrorMessages on the
+        Loader object, and now pass the errors back to dashboard base via the
+        resourceLoadingComplete callback.
+        
+        Also removed the now unused clearError function, it was only being used
+        by unit tests to clean up global state.
+        
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (resourceLoadingComplete):
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2013-01-08  Zan Dobersek  <zandobersek@gmail.com>
+
+        [EFL][GTK] Make the PulseAudioSanitizer an object on the EflPort, GtkPort
+        https://bugs.webkit.org/show_bug.cgi?id=106354
+
+        Reviewed by Eric Seidel.
+
+        Put the PulseAudioSanitizer object on the EflPort and GtkPort interfaces
+        instead of those two inheriting from it. Also add a mock object of the
+        sanitizer that's used in unit tests.
+
+        * Scripts/webkitpy/layout_tests/port/efl.py:
+        (EflPort):
+        (EflPort.__init__):
+        (EflPort.setup_test_run):
+        (EflPort.clean_up_test_run):
+        * Scripts/webkitpy/layout_tests/port/efl_unittest.py: Also correct the
+        importing order.
+        (EflPortTest.make_port): Put a mock PulseAudioSanitizer on the instance.
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort):
+        (GtkPort.__init__):
+        (GtkPort.setup_test_run):
+        (GtkPort.clean_up_test_run):
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py: Also correct the
+        importing order.
+        (GtkPortTest.make_port): Put a mock PulseAudioSanitizer on the instance.
+        * Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer.py:
+        (PulseAudioSanitizer.unload_pulseaudio_module): Stylize the method as public.
+        (PulseAudioSanitizer.restore_pulseaudio_module): Ditto.
+        * Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer_mock.py: Added.
+        (PulseAudioSanitizerMock): A simple mock interface for PulseAudioSanitizer.
+        (PulseAudioSanitizerMock.unload_pulseaudio_module):
+        (PulseAudioSanitizerMock.restore_pulseaudio_module):
+
+2013-01-08  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move dumpFrameLoadCallbacks and friends to the TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106324
+
+        Reviewed by Adam Barth.
+
+        Since the frame load callbacks are part of the WebFrameClient, the
+        WebTestProxy is now intercepting both WebViewClient and WebFrameClient
+        methods.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxy::WebTestProxy):
+        (WebTestProxy):
+        (WebTestRunner::WebTestProxy::didInvalidateRect):
+        (WebTestRunner::WebTestProxy::didScrollRect):
+        (WebTestRunner::WebTestProxy::scheduleComposite):
+        (WebTestRunner::WebTestProxy::scheduleAnimation):
+        (WebTestRunner::WebTestProxy::setWindowRect):
+        (WebTestRunner::WebTestProxy::show):
+        (WebTestRunner::WebTestProxy::didAutoResize):
+        (WebTestRunner::WebTestProxy::postAccessibilityNotification):
+        (WebTestRunner::WebTestProxy::startDragging):
+        (WebTestRunner::WebTestProxy::shouldBeginEditing):
+        (WebTestRunner::WebTestProxy::shouldEndEditing):
+        (WebTestRunner::WebTestProxy::shouldInsertNode):
+        (WebTestRunner::WebTestProxy::shouldInsertText):
+        (WebTestRunner::WebTestProxy::shouldChangeSelectedRange):
+        (WebTestRunner::WebTestProxy::shouldDeleteRange):
+        (WebTestRunner::WebTestProxy::shouldApplyStyle):
+        (WebTestRunner::WebTestProxy::didBeginEditing):
+        (WebTestRunner::WebTestProxy::didChangeSelection):
+        (WebTestRunner::WebTestProxy::didChangeContents):
+        (WebTestRunner::WebTestProxy::didEndEditing):
+        (WebTestRunner::WebTestProxy::registerIntentService):
+        (WebTestRunner::WebTestProxy::dispatchIntent):
+        (WebTestRunner::WebTestProxy::willPerformClientRedirect):
+        (WebTestRunner::WebTestProxy::didCancelClientRedirect):
+        (WebTestRunner::WebTestProxy::didStartProvisionalLoad):
+        (WebTestRunner::WebTestProxy::didReceiveServerRedirectForProvisionalLoad):
+        (WebTestRunner::WebTestProxy::didFailProvisionalLoad):
+        (WebTestRunner::WebTestProxy::didCommitProvisionalLoad):
+        (WebTestRunner::WebTestProxy::didReceiveTitle):
+        (WebTestRunner::WebTestProxy::didFinishDocumentLoad):
+        (WebTestRunner::WebTestProxy::didHandleOnloadEvents):
+        (WebTestRunner::WebTestProxy::didFailLoad):
+        (WebTestRunner::WebTestProxy::didFinishLoad):
+        (WebTestRunner::WebTestProxy::didChangeLocationWithinPage):
+        (WebTestRunner::WebTestProxy::didDisplayInsecureContent):
+        (WebTestRunner::WebTestProxy::didRunInsecureContent):
+        (WebTestRunner::WebTestProxy::didDetectXSS):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::setTestIsRunning):
+        (WebTestRunner::WebTestRunner::shouldDumpFrameLoadCallbacks):
+        (WebTestRunner::WebTestRunner::setShouldDumpFrameLoadCallbacks):
+        (WebTestRunner::WebTestRunner::shouldDumpUserGestureInFrameLoadCallbacks):
+        (WebTestRunner::WebTestRunner::stopProvisionalFrameLoads):
+        (WebTestRunner::WebTestRunner::shouldDumpTitleChanges):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setTestIsRunning):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::shouldDumpFrameLoadCallbacks):
+        (WebTestRunner::TestRunner::setShouldDumpFrameLoadCallbacks):
+        (WebTestRunner::TestRunner::shouldDumpUserGestureInFrameLoadCallbacks):
+        (WebTestRunner::TestRunner::stopProvisionalFrameLoads):
+        (WebTestRunner::TestRunner::shouldDumpTitleChanges):
+        (WebTestRunner::TestRunner::dumpFrameLoadCallbacks):
+        (WebTestRunner::TestRunner::dumpUserGestureInFrameLoadCallbacks):
+        (WebTestRunner::TestRunner::setStopProvisionalFrameLoads):
+        (WebTestRunner::TestRunner::dumpTitleChanges):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestInterfaces::Internal):
+        (WebTestRunner::WebTestInterfaces::Internal::webView):
+        (WebTestRunner::WebTestInterfaces::Internal::Internal):
+        (WebTestRunner::WebTestInterfaces::Internal::setWebView):
+        (WebTestRunner):
+        (WebTestRunner::WebTestInterfaces::Internal::setTestIsRunning):
+        (WebTestRunner::WebTestInterfaces::setWebView):
+        (WebTestRunner::WebTestInterfaces::setTestIsRunning):
+        (WebTestRunner::WebTestInterfaces::webView):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::willPerformClientRedirect):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::didCancelClientRedirect):
+        (WebTestRunner::WebTestProxyBase::didStartProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didReceiveServerRedirectForProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didFailProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didCommitProvisionalLoad):
+        (WebTestRunner::WebTestProxyBase::didReceiveTitle):
+        (WebTestRunner::WebTestProxyBase::didFinishDocumentLoad):
+        (WebTestRunner::WebTestProxyBase::didHandleOnloadEvents):
+        (WebTestRunner::WebTestProxyBase::didFailLoad):
+        (WebTestRunner::WebTestProxyBase::didFinishLoad):
+        (WebTestRunner::WebTestProxyBase::didChangeLocationWithinPage):
+        (WebTestRunner::WebTestProxyBase::didDisplayInsecureContent):
+        (WebTestRunner::WebTestProxyBase::didRunInsecureContent):
+        (WebTestRunner::WebTestProxyBase::didDetectXSS):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::runFileTest):
+        (TestShell::testFinished):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::didStartProvisionalLoad):
+        (WebViewHost::didReceiveServerRedirectForProvisionalLoad):
+        (WebViewHost::didFailProvisionalLoad):
+        (WebViewHost::didCommitProvisionalLoad):
+        (WebViewHost::didReceiveTitle):
+        (WebViewHost::didFailLoad):
+        (WebViewHost::didFinishLoad):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2013-01-08  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Lower the default timeout value for WebKitTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=106353
+
+        Reviewed by Dirk Pranke.
+
+        The default timeout value for WebKitTestRunner should be lowered.
+        The current value (80 seconds) is irrational and just leads to producing
+        text failures for layout tests that genuinely time out. This just leads
+        to more deviation from the GTK WK1 port in terms of test expectations.
+
+        The value used is the same as when running the DumpRenderTree, that's
+        6 seconds in release builds and 12 seconds in debug builds.
+
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest.test_default_timeout_ms):
+
+2013-01-08  Zan Dobersek  <zandobersek@gmail.com>
+
+        test-webkitpy shows failure output on my linux box
+        https://bugs.webkit.org/show_bug.cgi?id=101261
+
+        Reviewed by Eric Seidel.
+
+        Mock out the PulseAudioSanitizer methods when creating testing instances
+        of EflPort and GtkPort interfaces in unit tests. This stops throwing up
+        PulseAudio output when the sanitizer was trying to unload modules which
+        were already unloaded by another unit test that was being run in parallel.
+
+        * Scripts/webkitpy/layout_tests/port/efl_unittest.py:
+        (EflPortTest):
+        (EflPortTest.make_port):
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest):
+        (GtkPortTest.make_port):
+
+2013-01-08  Julie Parent  <jparent@chromium.org>
+
+        Dashboard Cleanup: Remove g_hasDoneInitialPageGeneration
+        https://bugs.webkit.org/show_bug.cgi?id=106254
+
+        Remove the global variable g_hasDoneInitialPageGeneration.  It was used
+        only to figure out if we should call addBuilderLoadErrors during
+        handleLocationChange, which was called when the loader completed and on
+        any hash change, but we only ever wanted to call addBuilderLoadErrors
+        on the initial loader load.  Moved the call of addBuilderLoadErrors to
+        resourceLoadingComplete rather than handleLocationChange, so now we
+        only call it when we want to, and the check can go away completely.
+
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (addBuilderLoadErrors):
+        (resourceLoadingComplete):
+        (handleLocationChange):
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+
+2013-01-08  Dominic Mazzoni  <dmazzoni@google.com>
+
+        Add aboxhall@chromium.org to accessibility watchlist.
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-01-08  Dan Winship  <danw@gnome.org>
+
+        Add Apache 2.4 support for Fedora 18
+        https://bugs.webkit.org/show_bug.cgi?id=104478
+
+        Reviewed by Martin Robinson.
+
+        Apache 2.4's httpd.conf is slightly incompatible with 2.2's, so we
+        need a separate config.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port._apache_version):
+        (Port._apache_config_file_name_for_platform):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        * Scripts/run-webkit-httpd:
+        * Scripts/webkitperl/httpd.pm:
+        (getApacheVersion):
+        (getDefaultConfigForTestDirectory):
+        (getHTTPDConfigPathForTestDirectory):
+
+2013-01-08  Zan Dobersek  <zandobersek@gmail.com>
+
+        Make the override-feature-defines script compatible with Python v3
+        https://bugs.webkit.org/show_bug.cgi?id=105742
+
+        Reviewed by Martin Robinson.
+
+        Instead of printing output through a statement, use the print function and format
+        the output using the str.format method. This makes the script runnable with Python v3.
+
+        * gtk/override-feature-defines:
+        (adjust_feature_defines_makefile):
+
+2013-01-08  Heikki Paajanen  <heikki.paajanen@palm.com>
+
+        [Qt] Fix libxml2 config test
+        https://bugs.webkit.org/show_bug.cgi?id=106317
+
+        Reviewed by Simon Hausmann.
+
+        Don't assume standard include/libxml2, libxml-2.0.pc should know
+        where it's headers are.
+
+        * qmake/config.tests/libxml2/libxml2.cpp: Fix include
+
+2013-01-08  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Make Tools/gtk/generate-gtkdoc compatible with Python 3
+        https://bugs.webkit.org/show_bug.cgi?id=106195
+
+        Reviewed by Philippe Normand.
+
+        Perform changes in the generate-gtkdoc script and common and gtkdoc modules
+        to make the Python code compatible with Python 3. This includes modifying
+        print statements, exception handling, dictionary iteration and
+        byte-sequence-to-string conversion.
+
+        * gtk/common.py:
+        (get_build_path):
+        (pkg_config_file_variable):
+        (gtk_version_of_pkg_config_file):
+        * gtk/generate-gtkdoc:
+        (print_missing_api):
+        * gtk/gtkdoc.py:
+        (GTKDoc.__init__):
+        (GTKDoc._run_command):
+
+2013-01-02  Steve Block  <steveblock@chromium.org>
+
+        Add chromium.org email address for Steve Block.
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2013-01-07  Filip Pizlo  <fpizlo@apple.com>
+
+        Rationalize closure call heuristics and profiling
+        https://bugs.webkit.org/show_bug.cgi?id=106270
+
+        Reviewed by Oliver Hunt.
+        
+        Add ability to use display-profiler-output via a pipe, and add the ability to dump
+        all generated code ('display *' or 'd *').
+
+        * Scripts/display-profiler-output:
+
+2013-01-07  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Sorted more xcodeproj files.
+
+        * MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * WebKitLauncher/WebKitLauncher.xcodeproj/project.pbxproj:
+
+2013-01-07  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Sorted xcodeproj files.
+
+        * DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj:
+        * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
+
+2013-01-07  Dan Bernstein  <mitz@apple.com>
+
+        [mac] WebKit1 clients can’t tell when a frame has been removed from the hierarchy
+        https://bugs.webkit.org/show_bug.cgi?id=106261
+
+        Reviewed by Simon Fraser.
+
+        Added a test for -[WebFrameLoadDelegate webView:didRemoveFrameFromHierarchy:].
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/mac/WebViewDidRemoveFrameFromHierarchy.mm: Added.
+        (-[DidRemoveFrameFromHierarchyFrameLoadDelegate webView:didFinishLoadForFrame:]):
+        (-[DidRemoveFrameFromHierarchyFrameLoadDelegate webView:didRemoveFrameFromHierarchy:]):
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST):
+
+2013-01-07  Ojan Vafai  <ojan@chromium.org>
+
+        Add the Apple MountainLion bots to garden-o-matic.
+        Eventually, we really should move away from hardcoding
+        the list of bots.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/config.js:
+
+2013-01-07  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move web audio related methods to testrunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106211
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebKit):
+        (WebTestRunner::WebTestRunner::shouldDumpAsAudio):
+        (WebTestRunner::WebTestRunner::audioData):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpAsAudio):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::audioData):
+        (WebTestRunner::TestRunner::setAudioData):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::dump):
+
+2013-01-07  Mike West  <mkwst@chromium.org>
+
+        Make the IFRAME_SEAMLESS flag runtime-enabled.
+        https://bugs.webkit.org/show_bug.cgi?id=106213
+
+        Reviewed by Ojan Vafai.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        * DumpRenderTree/efl/DumpRenderTreeChrome.cpp:
+        (DumpRenderTreeChrome::resetDefaultsToConsistentValues):
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues):
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (resetDefaultsToConsistentValues):
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::WebPage::resetSettings):
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::beginTesting):
+            Ensure that seamless IFrames are enabled for layout tests in each of
+            the ports that support seamless IFrames.
+
+2013-01-07  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move dumpAsText and friends to the TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=106222
+
+        Reviewed by Adam Barth.
+
+        This moves dumpAsText, dumpChildFramesAsText, and dumpChildFrameScrollPositions to the TestRunner library.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h:
+        (WebTestRunner::WebTestRunner::shouldDumpAsText):
+        (WebTestRunner::WebTestRunner::setShouldDumpAsText):
+        (WebTestRunner::WebTestRunner::shouldGeneratePixelResults):
+        (WebTestRunner::WebTestRunner::setShouldGeneratePixelResults):
+        (WebTestRunner::WebTestRunner::shouldDumpChildFrameScrollPositions):
+        (WebTestRunner::WebTestRunner::shouldDumpChildFramesAsText):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpAsText):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setShouldDumpAsText):
+        (WebTestRunner::TestRunner::shouldGeneratePixelResults):
+        (WebTestRunner::TestRunner::setShouldGeneratePixelResults):
+        (WebTestRunner::TestRunner::shouldDumpChildFrameScrollPositions):
+        (WebTestRunner::TestRunner::shouldDumpChildFramesAsText):
+        (WebTestRunner::TestRunner::dumpAsText):
+        (WebTestRunner::TestRunner::dumpChildFrameScrollPositions):
+        (WebTestRunner::TestRunner::dumpChildFramesAsText):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2013-01-07  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Build fix attempt after r138810.
+
+        Apparently python 2.6 is really bad at floating point computation.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (MainTest.test_run_memory_test):
+
+2013-01-07  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Extract a class to represent a test result to simplify PerfTest.parse_output and PageLoadPerfTest._run_with_driver
+        https://bugs.webkit.org/show_bug.cgi?id=106172
+
+        Reviewed by Tony Chang.
+
+        Extracted PerfTestMetric, which represents a test result and knows how to compute statistics and convert itself
+        to a dictionary. A metric is a type of measurement each test makes such as "Time", "Malloc", and "JSHeap".
+        A single test (e.g. html5-full-render.html) may have multiple metrics, each of which is reported as a separate
+        test on perf-o-matic and perf. test's results page.
+
+        Also, use python's compute_statistics instead of reading statistics off of DriverOutput to simplify the code.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTestMetric): Added.
+        (PerfTestMetric.__init__): Added.
+        (PerfTestMetric.metric): Added.
+        (PerfTestMetric.has_values): Added.
+        (PerfTestMetric.legacy_chromium_bot_compatible_test_name): Added. Following the legacy convention, "Malloc" and
+        "JSHeap" will use "test_name:Malloc" whereas "Time" uses "test_name" itself. We should eventually move these
+        conversions to be done on the client side (perf-o-matic and results page).
+        (PerfTestMetric.append): Added.
+        (PerfTestMetric.to_dict): Added. Computes the statistics and generates the dictionary object that represents
+        a result for this metric.
+        (PerfTestMetric.metric_to_unit): Added. Each metric maps to exactly one unit (it's not one-to-one).
+        (PerfTestMetric.compute_statistics): Moved from PerfTest.
+
+        (PerfTest._create_driver): Extracted from PerfTest.run.
+        (PerfTest.run): Given an array of PerfTestMetric, generate the results dictionary. Also print out results
+        as needed.
+        (PerfTest._run_with_driver):
+        (PerfTest): Removed _result_classes and _result_class_regex. "result class" is the old name for "metric".
+        (PerfTest.parse_output): Dramatically simplified. We now just return an array of PerfTestMetric's. Also ignore
+        all keys except "values". We rely on PerfTestMetric to compute the statistics for us.
+
+        (ChromiumStylePerfTest.run): Added and merged _run_with_driver. Since chromium style perf tests are so different
+        from other perf tests, there isn't much point in sharing the code here.
+
+        (PageLoadingPerfTest._run_with_driver): Simplified. Just create an array of PerfTestMetric's without computing
+        statistics for the measured values.
+
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (TestPerfTestMetric): Added.
+        (TestPerfTestMetric.test_init_set_missing_unit): Added.
+        (TestPerfTestMetric.test_legacy_chromium_bot_compatible_test_name): Added.
+        (TestPerfTestMetric.test_has_values): Added.
+        (TestPerfTestMetric.test_append): Added.
+        (TestPerfTestMetric.test_compute_statistics.compute_statistics):
+        (TestPerfTestMetric.test_compute_statistics): Added a trivial test case.
+
+        (TestPerfTest._assert_results_are_correct): Updated as needed.
+        (TestPageLoadingPerfTest.test_run): Ditto. Notice that we no longer log anything in _run_with_driver. It's done
+        in PerfTest.run now after generating the results dictionary.
+        (TestPageLoadingPerfTest.test_run_with_memory_output): Ditto.
+
+2013-01-07  Julien Chaffraix  <jchaffraix@webkit.org>
+
+        Support size_t multiplication and division operators on LayoutUnit
+        https://bugs.webkit.org/show_bug.cgi?id=83848
+
+        Reviewed by Emil A Eklund.
+
+        * TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp:
+        Added some simple tests for the new operators using size_t.
+
+2013-01-07  Csaba Osztrogonác  <ossy@webkit.org>
+
+        [Qt] run-webkit-tests cleanup for parallel NRWT
+        https://bugs.webkit.org/show_bug.cgi?id=106220
+
+        Reviewed by Dirk Pranke.
+
+        * Scripts/run-webkit-tests:
+        (useNewRunWebKitTests):
+        * Scripts/webkitpy/layout_tests/port/qt.py:
+        (QtPort):
+        (QtPort.default_child_processes):
+
+2013-01-07  Philippe Normand  <pnormand@igalia.com>
+
+        Create a GStreamerAudio watchlist and add myself to it.
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-01-05  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Add svn:executable to a bunch of scripts in BuildSlaveSupport.
+        Also removed the empty mac directory.
+
+        * BuildSlaveSupport/built-product-archive: Added property svn:executable.
+        * BuildSlaveSupport/download-built-product: Added property svn:executable.
+        * BuildSlaveSupport/mac: Removed.
+        * BuildSlaveSupport/test-result-archive: Added property svn:executable.
+
+2013-01-04  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Add a script to delete stale zero-byte build files
+        https://bugs.webkit.org/show_bug.cgi?id=106131
+
+        Reviewed by Tony Chang.
+
+        Delete zero-byte build files on Mac port for now. It doesn't do anything on other ports.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (DeleteStaleBuildFiles): Added.
+        (Factory.__init__): Add DeleteStaleBuildFiles step.
+        * BuildSlaveSupport/delete-stale-build-files: Added.
+        (main): Delete zero-byte files except ones intentionally generated by our build process.
+        (webkitBuildDirectory): Copied from build-product-archive.
+
+2013-01-04  Michael Pruett  <michael@68k.org>
+
+        [GTK] Fix build error on GTK due to r138836
+        https://bugs.webkit.org/show_bug.cgi?id=106154
+
+        Reviewed by Kentaro Hara.
+
+        * GNUmakefile.am:
+
+2013-01-04  Dan Bernstein  <mitz@apple.com>
+
+        [mac] WebKit1 has no equivalent of WKBundleNodeHandleCopyHTMLTableCellElementCellAbove
+        https://bugs.webkit.org/show_bug.cgi?id=106121
+
+        Reviewed by Adele Peterson.
+
+        Added test for -[DOMTHMLTableCellElement _cellAbove].
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/mac/DOMHTMLTableCellCellAbove.mm: Added.
+        (-[HTMLTableCellElementCellAboveTest webView:didFinishLoadForFrame:]):
+        (TestWebKitAPI):
+        (TestWebKitAPI::expectCellAboveCell):
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/Tests/mac/DOMHTMLTableCellElementCellAbove.html: Added.
+
+2013-01-04  Eric Seidel  <eric@webkit.org>
+
+        FlakyTestReporter should be re-enabled and taught how to post patches
+        https://bugs.webkit.org/show_bug.cgi?id=103839
+
+        Reviewed by Adam Barth.
+
+        This moves LayoutTestResultsReader off of the DeprecatedPort object.
+        It also adds a real Port object to the EWS and CommitQueue objects
+        using a new PatchProcessingQueue superclass.
+        PatchProcessingQueue doesn't seem to be the cleanest insertion point
+        but works for this purpose.
+        I also moved _upload_results_archive_for_patch into PatchProcessingQueue
+        to resolve a FIXME.
+
+        This required some hacks/shiming between the non-specific "old"
+        port names which the EWS system is currently using, and the new
+        port objects.  This shimming is done in PatchProcessingQueue._new_port_name_from_old.
+
+        Hopefully this will fix the flaky test reporter and results uploading.
+        Certainly it's another small step towards getting rid of the old ports.py
+        infrastructure and making the NRWT Port class common webkitpy infrastructure.
+
+        Now that DeprecatedPort is no longer used for the results directory
+        I removed all the explicit results-dir code which webkit-patch was using
+        in --non-interactive mode to tell NRWT to use a results-dir it understood. :)
+
+        * Scripts/webkitpy/common/config/ports.py:
+        (DeprecatedPort.run_perl_unittests_command):
+        * Scripts/webkitpy/common/config/ports_mock.py:
+        (MockPort.name):
+        * Scripts/webkitpy/common/system/outputcapture.py:
+        (OutputCapture.assert_outputs):
+        * Scripts/webkitpy/layout_tests/port/apple.py:
+        (ApplePort.determine_full_port_name):
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader.py:
+        (LayoutTestResultsReader.__init__):
+        (LayoutTestResultsReader):
+        (LayoutTestResultsReader._read_file_contents):
+        (LayoutTestResultsReader._create_layout_test_results):
+        (LayoutTestResultsReader._create_unit_test_results):
+        (LayoutTestResultsReader.results):
+        (LayoutTestResultsReader.archive):
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py:
+        (LayoutTestResultsReaderTest.test_missing_layout_test_results):
+        (LayoutTestResultsReaderTest.test_create_unit_test_results):
+        (test_missing_unit_test_results_path):
+        (test_layout_test_results):
+        (test_archive_last_layout_test_results):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (AbstractEarlyWarningSystem):
+        (AbstractEarlyWarningSystem.__init__):
+        (AbstractEarlyWarningSystem.begin_work_queue):
+        (AbstractEarlyWarningSystem.run_command):
+        * Scripts/webkitpy/tool/commands/queues.py:
+        (AbstractPatchQueue.work_item_log_path):
+        (PatchProcessingQueue):
+        (PatchProcessingQueue._new_port_name_from_old):
+        (PatchProcessingQueue.begin_work_queue):
+        (PatchProcessingQueue._upload_results_archive_for_patch):
+        (CommitQueue):
+        (CommitQueue.begin_work_queue):
+        (CommitQueue.run_command):
+        (AbstractReviewQueue):
+        (AbstractReviewQueue.__init__):
+        (AbstractReviewQueue.begin_work_queue):
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+        (AbstractPatchQueueTest.test_next_patch):
+        (PatchProcessingQueueTest):
+        (PatchProcessingQueueTest.test_upload_results_archive_for_patch):
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+
+2013-01-04  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Remove lost-compositor-context layout tests
+        https://bugs.webkit.org/show_bug.cgi?id=106089
+
+        Reviewed by James Robinson.
+
+        Remove the loseCompositorContext() test function.
+
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2013-01-04  Adam Klein  <adamk@chromium.org>
+
+        Remove ENABLE_MUTATION_OBSERVERS #define
+        https://bugs.webkit.org/show_bug.cgi?id=105459
+
+        Reviewed by Ryosuke Niwa.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2013-01-04  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Statistics used in perftest_unittest.py and perftest_integrationtest.py are bogus
+        https://bugs.webkit.org/show_bug.cgi?id=106078
+
+        Reviewed by Tony Chang.
+
+        This patch updates values for individual iterations in dummy performance tests used in
+        perftest_unittest.py and perftest_integrationtest.py so that they match up with
+        statistics such as stdev and median reported in those tests. This change is required
+        to resolve the bug 97510.
+
+        This patch also refactors integration tests by extracting *TestData classes that
+        centralizes the definitions of each dummy performance test's text (DRT output),
+        runner output, and parsed results (JSON) so that we may share more data between
+        python tests.
+
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (MainTest._assert_results_are_correct): Extracted from test_parse_output.
+        Use self.assertAlmostEqual when comparing the standard deviation.
+        (MainTest.test_parse_output):
+        (test_parse_output_with_failing_line):
+        (test_parse_output_with_description): Use _assert_results_are_correct.
+        (test_parse_output_with_subtests): Ditto.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py:
+        (InspectorPassTestData): Extracted from tests below.
+        (EventTargetWrapperTestData): Ditto.
+        (SomeParserTestData): Ditto.
+        (MemoryTestData): Ditto.
+        (TestDriver.run_test): Moved test definitions out of the method.
+        (MainTest._normalize_output): Truncate standard deviations at 5th decimal point.
+        (MainTest._load_output_json): Extracted from create_runner.
+        (MainTest.create_runner):
+        (MainTest.test_run_test_set_for_parser_tests):
+        (MainTest.test_run_memory_test):
+        (MainTest._test_run_with_json_output):
+        (MainTest.test_run_with_json_output):
+        (MainTest.test_run_with_description):
+        (MainTest.test_run_generates_json_by_default):
+        (MainTest.test_run_merges_output_by_default):
+        (MainTest.test_run_respects_reset_results):
+        (MainTest.test_run_generates_and_show_results_page):
+        (MainTest.test_run_with_slave_config_json):
+        (MainTest.test_run_with_multiple_repositories):
+
+2013-01-04  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] [WebKit2] Clicking on a word that is selected in an editable area deletes it
+        https://bugs.webkit.org/show_bug.cgi?id=106045
+
+        Reviewed by Carlos Garcia Campos.
+
+        Update test results to confirm that compositions without preedits do not trigger
+        a composition confirmation.
+
+        * TestWebKitAPI/Tests/gtk/InputMethodFilter.cpp:
+        (TestWebKitAPI::verifyCanceledComposition):
+
+2013-01-04  Sailesh Agrawal  <sail@chromium.org>
+
+        [Mac] [WK2] platform/mac/fast/events/numpad-keycode-mapping.html fails
+        https://bugs.webkit.org/show_bug.cgi?id=105958
+
+        Reviewed by Alexey Proskuryakov.
+
+        Ported code from DumpRenderTree to WebKitTestRunner to map all numpad keys.
+
+        * WebKitTestRunner/mac/EventSenderProxy.mm:
+        (KeyMappingEntry):
+        (WTR):
+        (WTR::EventSenderProxy::keyDown): Added all numpad keys.
+
+2013-01-03  Chris Fleizach  <cfleizach@apple.com>
+
+        REGRESSION: [Mac] Intermittent crash in WTR::AccessibilityUIElement::isEqual
+        https://bugs.webkit.org/show_bug.cgi?id=106073
+
+        Reviewed by Ryosuke Niwa.
+
+        Check that the element being compared to is not nil. 
+        This crash is happening because one of the accessibility tests does an isEqual comparison within a callback function.
+        It looks like occasionally, one of the elements passed in to the isEqual is nil because the notification handler is on the accessibility
+        controller, and the notification is being delivered after the document objects are cleared. This shouldn't happen but I've seen it 
+        sometimes before on parallel WebKitTestRunner runs.
+
+        * DumpRenderTree/AccessibilityUIElement.cpp:
+        (AccessibilityUIElement::isEqual):
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
+        (WTR::AccessibilityUIElement::isEqual):
+
+2013-01-03  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Downloads can be flaky, so try downloading multiple times.
+        https://bugs.webkit.org/show_bug.cgi?id=105976
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/system/autoinstall.py:
+        (AutoInstaller._download_to_stream):
+
+2013-01-03  Eric Seidel  <eric@webkit.org>
+
+        Rename Tool.port to deprecated_port in preparation for removing more callers
+        https://bugs.webkit.org/show_bug.cgi?id=106076
+
+        Reviewed by Ryosuke Niwa.
+
+        This resolves a long-standing FIXME to rename this method. :)
+
+        * Scripts/webkitpy/tool/bot/botinfo.py:
+        (BotInfo.summary_text):
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+        (Rollout._update_working_copy):
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader.py:
+        (LayoutTestResultsReader._create_layout_test_results):
+        (LayoutTestResultsReader._create_unit_test_results):
+        (LayoutTestResultsReader._results_directory):
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py:
+        (test_missing_unit_test_results_path):
+        * Scripts/webkitpy/tool/main.py:
+        (WebKitPatch.deprecated_port):
+        * Scripts/webkitpy/tool/mocktool.py:
+        (MockTool.deprecated_port):
+        * Scripts/webkitpy/tool/steps/build.py:
+        (Build.build):
+        * Scripts/webkitpy/tool/steps/checkstyle.py:
+        (CheckStyle.run):
+        * Scripts/webkitpy/tool/steps/commit.py:
+        (Commit._check_test_expectations):
+        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog.run):
+        * Scripts/webkitpy/tool/steps/preparechangelogfordepsroll.py:
+        (PrepareChangeLogForDEPSRoll.run):
+        * Scripts/webkitpy/tool/steps/preparechangelogforrevert.py:
+        (PrepareChangeLogForRevert.run):
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/steps_unittest.py:
+        (StepsTest.test_runtests_args):
+        * Scripts/webkitpy/tool/steps/update.py:
+        (Update._update_command):
+
+2013-01-03  Eric Seidel  <eric@webkit.org>
+
+        Add myself to the webkitpy watchlist.
+
+        Unreviewed.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2013-01-03  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Cleanup perftest* tests and add a test for computing statistics
+        https://bugs.webkit.org/show_bug.cgi?id=105685
+
+        Reviewed by Eric Seidel.
+
+        Add a test for PerfTest.compute_statistics (moved and renamed from PageLoadingPerfTest.calculate_statistics) and
+        extracted perftestsrunner_itegrationtests.py from perftestsrunner_unittests.py.
+
+        Also fixed a bug in compute_statistics that the mean ('avg') value can have a large rounding errors in some cases.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest.compute_statistics): Moved from PageLoadingPerfTest to prepare for the bug 97510. Also compute the mean
+        directly from sorted_values instead of using the one from Knuth's online algorithm. This approach gives more
+        accurate result for the mean.
+        (PageLoadingPerfTest.run_single):
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (MainTest.test_compute_statistics):
+        (MainTest.test_compute_statistics.compute_statistics): Added.
+        (TestPageLoadingPerfTest.test_run): floatify values.
+        (TestPageLoadingPerfTest.test_run_with_memory_output): Ditto. Also got rid of ".0" from mean values now that Python
+        correctly recognizes them as integers.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py: Copied from
+        Tools/Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py.
+        (TestDriver): Moved out of MainTest.
+        (MainTest): Got rid of assertWritten and all unit tests.
+        (MainTest._normalize_output): Renamed from normalizeFinishedTime to match the PEP8 naming convention.
+        (MainTest.test_run_test_set_kills_drt_per_run.TestDriverWithStopCount):
+        (MainTest.test_run_test_set_for_parser_tests):
+        (MainTest.test_run_memory_test):
+        (MainTest._test_run_with_json_output):
+        (MainTest.test_run_generates_json_by_default):
+        (MainTest.test_run_merges_output_by_default):
+        (MainTest.test_run_respects_reset_results):
+        (MainTest.test_run_generates_and_show_results_page): Use runner.load_output_json() instead of manually loading and
+        parsing output JSON files. Just verify that the output path is correct instead.
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (MainTest): Removed all integration tests.
+        (MainTest.create_runner): Simplified.
+
+2013-01-03  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: remove usage of global g_defaultBuilderName
+        https://bugs.webkit.org/show_bug.cgi?id=106043
+
+        Use now public defaultBuilder() from the BuilderGroup, rather
+        than global variable.
+
+        Also eliminates the setup() and initBuilders() functions since we
+        no longer need to track the global.
+
+        Reviewed by Adam Barth.
+
+        * TestResultServer/static-dashboards/builders.js:
+        (BuilderGroup.prototype.defaultBuilder):
+        (BuilderGroup.prototype.master):
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (parseParameters):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (updateDefaultBuilderState):
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2013-01-03  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Disable an intermittently failing unit test for now.
+        The failure is tracked by the bug 106051.
+
+        * TestWebKitAPI/Tests/mac/MemoryCachePruneWithinResourceLoadDelegate.mm:
+        (TestWebKitAPI::TEST):
+
+2013-01-03  Dan Bernstein  <mitz@apple.com>
+
+        No way to obtain a DOMNode given a JS wrapper for a Node
+        https://bugs.webkit.org/show_bug.cgi?id=106033
+
+        Added a test for +[DOMNode _nodeFromJSWrapper:].
+
+        Reviewed by Sam Weinig.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/mac/DOMNodeFromJSObject.mm: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST):
+
+2013-01-03  Emil A Eklund  <eae@chromium.org>
+
+        Fix overflow in LayoutUnit::ceil and floor for SATURATED_LAYOUT_ARITHMETIC
+        https://bugs.webkit.org/show_bug.cgi?id=105961
+
+        Reviewed by Levi Weintraub.
+        
+        Add tests for LayoutUnit::ceil and floor.
+
+        * TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp:
+        (TestWebKitAPI::TEST):
+        (TestWebKitAPI):
+
+2013-01-03  Julie Parent  <jparent@chromium.org>
+
+        Add unit test for default builder for the dashboards.
+        https://bugs.webkit.org/show_bug.cgi?id=105972
+
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2013-01-03  Tony Chang  <tony@chromium.org>
+
+        Generate internal.settings from Settings.in
+        https://bugs.webkit.org/show_bug.cgi?id=104740
+
+        Reviewed by Adam Barth.
+
+        * GNUmakefile.am: Compile new generated files on GTK+.
+        * qmake/mkspecs/features/default_post.prf: Qt: Make it so an action
+        with both extra_sources and add_output_to_sources=false will still
+        compile the files in extra_sources. This makes it possible to compile
+        InternalSettingsGenerated.cpp and not be confused by
+        InternalSettingsGenerated.idl.
+
+2013-01-03  Zan Dobersek  <zandobersek@gmail.com>
+
+        [style] WebIDL-reflecting uppercase enums reported as style violation
+        https://bugs.webkit.org/show_bug.cgi?id=105832
+
+        Reviewed by Tony Chang.
+
+        Recognize the enum as WebIDL-reflecting one if there's a comment present that
+        indicates this. In enums spanning over multiple lines, the comment is expected
+        on the first line. In enums placed in one line, the comment is expected at the
+        end of that line.
+
+        WebIDL-reflecting enum values are required to be written in uppercase and as such
+        violate the common rule of these values being written in InterCaps. Annotating
+        enums this way makes it possible to avoid false style violation reports.
+
+        The comment is of form '// Web(?:Kit)?IDL enum'.
+
+        * Scripts/webkitpy/style/checkers/cpp.py:
+        (_EnumState.__init__):
+        (_EnumState.process_clean_line):
+        (check_enum_casing):
+        * Scripts/webkitpy/style/checkers/cpp_unittest.py:
+        (NoNonVirtualDestructorsTest.test_enum_casing):
+
+2013-01-03  Tim 'mithro' Ansell  <mithro@mithis.com>
+
+        Adding favicon.ico to the garden-o-matic.
+        https://bugs.webkit.org/show_bug.cgi?id=105982
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/tool/servers/gardeningserver.py:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/favicon.ico:
+
+2013-01-03  Jonathan Liu  <net147@gmail.com>
+
+        [Qt] Fix library linking order
+        https://bugs.webkit.org/show_bug.cgi?id=105818
+
+        Some Qt libraries are linked before the private static libraries
+        that depend on them which results in QtWebKit failing to link.
+
+        Copy Qt module dependencies from QT to QT_PRIVATE when creating
+        module to ensure the Qt libraries are linked after the private
+        static libraries that depend on them.
+
+        Reviewed by Tor Arne Vestbø.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2013-01-02  Byungwoo Lee  <bw80.lee@samsung.com>
+
+        [EFL][WK2] Fix tooltip bugs in MiniBrowser.
+        https://bugs.webkit.org/show_bug.cgi?id=102209
+
+        Reviewed by Gyuyoung Kim.
+
+        Set tooltip on the elm_window instead of ewk_view, and add delay to
+        show the tooltip window.
+
+        Setting tooltip on the ewk_view makes elementary error message because
+        ewk_view is not an elementary widget. To remove the error message,
+        tooltip should be set on the elm_window.
+
+        Most browsers show the tooltip after a mouse pointer stays on an
+        element object that has tooltip text.
+        But elm_tooltip widget itself doesn't have delay or handle mouse
+        events to show/hide.
+
+        So additional codes are added to show/hide tooltip widget along with
+        mouse events.
+          1) When a mouse pointer stays for a second on an element which has
+             tooltip text, then tooltip widget is displayed.
+          2) When a mouse pointer is moved or out of ewk_view, hide the tooltip
+             widget.
+
+        * MiniBrowser/efl/main.c:
+        (_Tooltip_Information):
+        (_Browser_Window):
+        (on_tooltip_show):
+        (window_tooltip_hide):
+        (window_tooltip_update):
+        (on_mouse_in):
+        (on_mouse_move):
+        (on_mouse_out):
+        (window_free):
+        (on_tooltip_text_set):
+        (on_tooltip_text_unset):
+        (window_create):
+
+2013-01-02  Tony Chang  <tony@chromium.org>
+
+        Unreviewed, rolling out r138661.
+        http://trac.webkit.org/changeset/138661
+        https://bugs.webkit.org/show_bug.cgi?id=104740
+
+        Compile problems on EFL
+
+        * GNUmakefile.am:
+        * qmake/mkspecs/features/default_post.prf:
+
+2013-01-02  Tony Chang  <tony@chromium.org>
+
+        Generate internal.settings from Settings.in
+        https://bugs.webkit.org/show_bug.cgi?id=104740
+
+        Reviewed by Adam Barth.
+
+        * GNUmakefile.am: Compile new generated files on GTK+.
+        * qmake/mkspecs/features/default_post.prf: Qt: Make it so an action
+        with both extra_sources and add_output_to_sources=false will still
+        compile the files in extra_sources. This makes it possible to compile
+        InternalSettingsGenerated.cpp and not be confused by
+        InternalSettingsGenerated.idl.
+
+2013-01-02  Adam Barth  <abarth@webkit.org>
+
+        Remove old-run-webkit-tests support from webkitpy
+        https://bugs.webkit.org/show_bug.cgi?id=105619
+
+        Reviewed by Eric Seidel.
+
+        This patch removes support for webkitpy parsing the
+        old-run-webkit-tests results format. There doesn't seem to be any
+        reason to keep this code around anymore now that most bots have
+        switched to new-run-webkit-tests.
+
+        * Scripts/webkitpy/common/net/buildbot/buildbot.py:
+        (Builder.fetch_layout_test_results):
+        * Scripts/webkitpy/common/net/layouttestresults.py:
+        (path_for_layout_test):
+        (LayoutTestResults.results_from_string):
+        (LayoutTestResults):
+        * Scripts/webkitpy/common/net/layouttestresults_unittest.py:
+        (LayoutTestResultsTest.test_results_from_string):
+        * Scripts/webkitpy/tool/bot/commitqueuetask_unittest.py:
+        (test_flaky_test_failure):
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py:
+        (LayoutTestResultsReaderTest.test_missing_layout_test_results):
+        * Scripts/webkitpy/tool/bot/patchanalysistask.py:
+        (PatchAnalysisTask._test_patch):
+        * Scripts/webkitpy/tool/commands/queuestest.py:
+        (QueuesTest.assert_queue_outputs):
+
+2013-01-02  Heikki Paajanen  <heikki.paajanen@palm.com>
+
+        [Qt][WK2] Add simple UI to find text from page
+        https://bugs.webkit.org/show_bug.cgi?id=96481
+
+        Reviewed by Jocelyn Turcotte.
+
+        Find bar that slides between navigation bar and WebView.
+
+        * MiniBrowser/qt/BrowserWindow.cpp:
+        (BrowserWindow::toggleFind):
+        * MiniBrowser/qt/BrowserWindow.h:
+        (BrowserWindow):
+        * MiniBrowser/qt/MiniBrowser.qrc:
+        * MiniBrowser/qt/MiniBrowserApplication.cpp:
+        (MiniBrowserApplication::notify):
+        * MiniBrowser/qt/icons/find.png: Added.
+        * MiniBrowser/qt/qml/BrowserWindow.qml:
+
+2013-01-02  Christophe Dumez  <christophe.dumez@intel.com>
+
+        Regression(r138603): Caused 2 webkitpy tests to fail
+        https://bugs.webkit.org/show_bug.cgi?id=105913
+
+        Reviewed by Kentaro Hara.
+
+        Fix 2 webkitpy tests that started to fail after
+        r138603.
+
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py:
+        (IRCCommandTest._sheriff_test_data_url): Make sure the
+        returned test file URL is valid no matter what the
+        current working directory is.
+        * Scripts/webkitpy/tool/bot/ircbot_unittest.py:
+        (IRCBotTest.test_help): Add "sheriffs" command to the
+        list of available commands.
+
+2013-01-01  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [WK2] plugins/clicking-missing-plugin-fires-delegate.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=105897
+
+        Reviewed by Alexey Proskuryakov.
+
+        Dump in WebKitTestRunner the message that is expected by layout tests
+        when the missing plugin button is clicked.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions):
+        (WTR::TestController::unavailablePluginButtonClicked):
+        (WTR):
+        * WebKitTestRunner/TestController.h:
+        (TestController):
+
+2013-01-01  KwangYong Choi  <ky0.choi@samsung.com>
+
+        [EFL] Enable MHTML feature
+        https://bugs.webkit.org/show_bug.cgi?id=105815
+
+        Reviewed by Laszlo Gombos.
+
+        Enable MHTML feature for EFL port by default.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2013-01-01  Alan Cutter  <alancutter@chromium.org>
+
+        sheriff-bot should know who the gardeners/sheriffs are
+        https://bugs.webkit.org/show_bug.cgi?id=105698
+
+        Reviewed by Eric Seidel.
+
+        Added a "sheriffs" command to sheriffbot to fetch the current Chromium Webkit sheriffs.
+
+        * Scripts/webkitpy/tool/bot/irc_command.py:
+        (Current):
+        (Current._retrieve_webkit_sheriffs):
+        (Current.execute):
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py:
+        (IRCCommandTest.test_current):
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_0.js: Added.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_1.js: Added.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_2.js: Added.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_malformed.js: Added.
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_zero.js: Added.
+
+2012-12-31  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Move ImageDiff to the Tools directory root
+        https://bugs.webkit.org/show_bug.cgi?id=105421
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * DumpRenderTree/gtk/GNUmakefile.ImageDiff.am: Removed.
+        * GNUmakefile.am:
+        * ImageDiff/gtk/ImageDiff.cpp: Renamed from Tools/DumpRenderTree/gtk/ImageDiff.cpp.
+
+2012-12-30  Mike West  <mkwst@chromium.org>
+
+        Add myself to watchlists for CSP and console logs.
+        https://bugs.webkit.org/show_bug.cgi?id=105874
+
+        Reviewed by Dirk Pranke.
+
+        Because I really, really, really need more email.
+
+        * Scripts/webkitpy/common/config/committers.py:
+            Add mkwst+watchlist@chromium.org as a contributor.
+        * Scripts/webkitpy/common/config/watchlist:
+            Create watchlist categories for 1) the various mechanisms used to
+            generate console messages, and 2) CSP usage and files.
+
+2012-12-30  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
+
+        [EFL] Enable TEMPLATE_ELEMENT feature
+        https://bugs.webkit.org/show_bug.cgi?id=105865
+        
+        Reviewed by Laszlo Gombos.
+
+        * Scripts/webkitperl/FeatureList.pm: Enable template element feature for EFL port.
+
+2012-12-30  Zan Dobersek  <zandobersek@gmail.com>
+
+        Unreviewed GTK gardening of the unit tests.
+
+        Skip the TestInspectorServer unit test that's timing out completely.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner):
+
+2012-12-29  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation plugin: do not generate 'not instrumented' warning for instrumented mutable members.
+        https://bugs.webkit.org/show_bug.cgi?id=105855
+
+        Reviewed by Vsevolod Vlasov.
+
+        Extract MemberExpr from ImplicitCastExpr. It happens when we instrument a mutable member because
+        addMember expects const T& and the mutable ref to member implicitly converts into const ref to member.
+
+        * clang/ReportMemoryUsagePlugin/ReportMemoryUsage.cpp:
+        (ReportMemoryUsageVisitor):
+        (clang::AddMemberCallVisitor::VisitCallExpr):
+        (clang::ReportMemoryUsageVisitor::VisitCXXMethodDecl):
+        (clang::ReportMemoryUsageVisitor::checkMembersCoverage):
+
+2012-12-29  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation plugin: move function bodies out of class declarations.
+        https://bugs.webkit.org/show_bug.cgi?id=105852
+
+        Reviewed by Alexander Pavlov.
+
+        * clang/ReportMemoryUsagePlugin/ReportMemoryUsage.cpp:
+        (clang):
+        (AddMemberCallVisitor):
+        (ReportMemoryUsageVisitor):
+        (clang::ReportMemoryUsageAction::ParseArgs):
+        (clang::AddMemberCallVisitor::VisitCallExpr):
+        (clang::ReportMemoryUsageVisitor::VisitCXXMethodDecl):
+        (clang::ReportMemoryUsageVisitor::emitWarning):
+        (clang::ReportMemoryUsageVisitor::findInstrumentationMethod):
+        (clang::ReportMemoryUsageVisitor::needsToBeInstrumented):
+        (clang::ReportMemoryUsageVisitor::CheckMembersCoverage):
+
+2012-12-29  Zan Dobersek  <zandobersek@gmail.com>
+
+        [webkitpy] Omit webkitpy/thirdparty/BeautifulSoup.py from code coverage checking
+        https://bugs.webkit.org/show_bug.cgi?id=105835
+
+        Reviewed by Dirk Pranke.
+
+        The BeautifulSoup module is a third-party import and as such we don't have much control
+        over its testing. Because of that it should be omitted from code coverage checking.
+
+        * Scripts/webkitpy/test/main.py:
+        (Tester._run_tests):
+
+2012-12-28  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK][WK2] Add support for IME Composition
+        https://bugs.webkit.org/show_bug.cgi?id=65093
+
+        Reviewed by Carlos Garcia Campos.
+
+        Update unit tests for GtkInputMethodFilter to note whether or not an event
+        was a fake event synthesized for composition purposes. This is now used
+        for WebKit2.
+
+        * TestWebKitAPI/Tests/gtk/InputMethodFilter.cpp:
+        (TestWebKitAPI::TestInputMethodFilter::sendSimpleKeyEvent):
+        (TestWebKitAPI::TestInputMethodFilter::sendKeyEventWithCompositionResults):
+        (TestWebKitAPI::TEST):
+        * gtk/generate-gtkdoc:
+        (get_webkit2_options): Skip new files in the WebKit2 source directory for documentation
+        generation.
+
+2012-12-27  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation. Update clang plugin according to the current state of memory instrumentation code.
+        https://bugs.webkit.org/show_bug.cgi?id=105800
+
+        Reviewed by Yury Semikhatsky.
+
+        * clang/ReportMemoryUsagePlugin/ReportMemoryUsage.cpp:
+        (clang::ReportMemoryUsageConsumer::ReportMemoryUsageConsumer):
+        (clang):
+
+2012-12-27  Zan Dobersek  <zandobersek@gmail.com>
+
+        Create a GTK build system watchlist and add myself to it
+        https://bugs.webkit.org/show_bug.cgi?id=105769
+
+        Reviewed by Dirk Pranke.
+
+        Add a GTK build system watchlist, watching the configure.ac, GNUmakefile.am files
+        and the input GNUmakefile.features.am.in file. The GNUmakefile.list.am files are
+        omitted on purpose due to relatively high change rate they are exposed to.
+
+        The new watchlist would be of use to me as the GTK build system recently went
+        through a series of changes that included a changed policy on adding configuration
+        flags to configure.ac and subsequent additions to GNUmakefile.am files. A PSA on the
+        mailing list about this change will be published later, but I'd also like to be
+        notified of any pending changes to these files just so I can check the changes are
+        in compliance with the new policy.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-12-26  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Unreviewed. Replace find("Tools") with rfind("Tools") because base dir of WebKit may have Tools word.
+        As example ..../DevTools/src/third_party/WebKit
+
+        * Scripts/webkitpy/common/webkit_finder.py:
+        (WebKitFinder.webkit_base):
+
+2012-12-25  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [EFL][WK2] Refactor snapshot taking code
+        https://bugs.webkit.org/show_bug.cgi?id=105687
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Call WKViewCreateSnapshot() instead of WKViewGetSnapshot()
+        since the function was renamed to follow naming style.
+
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::windowSnapshotImage):
+
+2012-12-24  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: propagate member type as edge type to the serialized heap graph.
+        https://bugs.webkit.org/show_bug.cgi?id=105725
+
+        Reviewed by Yury Semikhatsky.
+
+        MemberType value names were adjusted according to Style Guide.
+        Existing tests were extended with link type validation.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+2012-12-24  Xiaobo Wang  <xbwang@torchmobile.com.cn>
+
+        [BlackBerry] DRT - Crashed when running pixels tests
+        https://bugs.webkit.org/show_bug.cgi?id=105711
+
+        RIM PR 270003
+
+        Reviewed by George Staikos.
+
+        Calling window->post() here will result in buffer swapping which is
+        only allowed in UI thread now, and I found we don't need to call it
+        for GL renderer.
+
+        * DumpRenderTree/blackberry/PixelDumpSupportBlackBerry.cpp:
+        (createBitmapContextFromWebView):
+
+2012-12-22  Dan Winship  <danw@gnome.org>
+
+        Add a patch to fix libxml2 2.9.0 regression
+        https://bugs.webkit.org/show_bug.cgi?id=104494
+
+        Reviewed by Martin Robinson.
+
+        * gtk/jhbuild.modules:
+        * gtk/patches/libxml2-2.9.0-dtd.patch: patch from upstream
+
+2012-12-23  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        Unreviewed update of status to reviewer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-23  Philippe Normand  <pnormand@igalia.com>
+
+        [GTK][jhbuild] Bump GStreamer to 1.0.4
+        https://bugs.webkit.org/show_bug.cgi?id=105640
+
+        Reviewed by Martin Robinson.
+
+        * gtk/jhbuild.modules: Update GStreamer modules to 1.0.4.
+
+2012-12-21  Nico Weber  <thakis@chromium.org>
+
+        chromium: webkit-build-directory doesn't handle ninja output dirs
+        https://bugs.webkit.org/show_bug.cgi?id=105671
+
+        Reviewed by Daniel Bates.
+
+        Teach webkit-build-directory to detect the ninja build directory.
+
+        * Scripts/webkitdirs.pm:
+        (determineBaseProductDir):
+        (determineIsChromiumNinja):
+
+2012-12-21  Ryosuke Niwa  <rniwa@webkit.org>
+
+        [Mountain Lion] platform/mac/editing/spelling/removing-underline-after-accepting-autocorrection-using-punctuation.html failing
+        https://bugs.webkit.org/show_bug.cgi?id=95477
+
+        Reviewed by Sam Weinig.
+
+        Co-authored by Jia Pu.
+
+        Specify a fixed autocorrection dictionary in resetDefaultsToConsistentValues() so that
+        we can have consistent autocorrection behavior when running tests.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (resetDefaultsToConsistentValues):
+        * WebKitTestRunner/InjectedBundle/mac/InjectedBundleMac.mm:
+        (WTR::InjectedBundle::platformInitialize):
+
+2012-12-21  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Add WebKit1-specific TestExpectations file
+        https://bugs.webkit.org/show_bug.cgi?id=97562
+
+        Reviewed by Dirk Pranke.
+
+        Implement the expectations_files method inside the GtkPort class that
+        returns the list of the TestExpectations files the current test configuration
+        requires. The method is implemented in a similar way as on the EFL port.
+        A unit test is also added.
+
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort._search_paths):
+        (GtkPort):
+        (GtkPort.expectations_files):
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest.test_expectations_files):
+
+2012-12-21  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL] Enable feature option for the CSS sticky position
+        https://bugs.webkit.org/show_bug.cgi?id=105630
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Enable CSS sticky position feature by default for the
+        EFL port. This feature option was added in r138252.
+
+        No new tests. Existing layout tests pass.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-21  Jussi Kukkonen  <jussi.kukkonen@intel.com>
+
+        [WK2] REGRESSION(r138232): It made 4 tests timeout
+        https://bugs.webkit.org/show_bug.cgi?id=105623
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        r138232 changed functionality so that empty text output
+        no longer leads to a dump() call, which leads to a timeout.
+        Instead do a text dump if there is text output or if there
+        is no audio output.
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::dumpResults):
+
+2012-12-21  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt][Mac] run-launcher cannot find Qt5WebKitWidgets.
+        https://bugs.webkit.org/show_bug.cgi?id=105309
+
+        On Windows the library name is Qt5WebKitWidgets as well.
+        So r138136 should not have adjusted the library name for Windows.
+
+        Reviewed by Simon Hausmann.
+
+        * Scripts/webkitdirs.pm:
+        (builtDylibPathForName):
+
+2012-12-21  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt] Add new TestExpectations for qt-5.0-mac-wk2.
+        https://bugs.webkit.org/show_bug.cgi?id=105424
+
+        This change will allow us to run a very specific
+        subset of the available LayoutTests on a mac buildbot.
+        The new baseline search path for mac will look as follows:
+        qt-5.0-mac-wk2 -> qt-5.0-wk2 -> qt-5.0 -> qt-mac -> qt
+
+        Reviewed by Dirk Pranke.
+
+        * Scripts/webkitpy/layout_tests/port/qt.py:
+        (QtPort._search_paths):
+        * Scripts/webkitpy/layout_tests/port/qt_unittest.py:
+        (QtPortTest):
+
+2012-12-20  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL] Build break with latest EFL libraries.
+        https://bugs.webkit.org/show_bug.cgi?id=104827
+
+        Reviewed by Laszlo Gombos.
+
+        The eo EFL package is introduced and evas and ecore use it since 1.8.
+        While introducing Eo, EFL changed several structures of Evas and Ecore
+        from own specific class to Eo.
+
+        So, this patch adds FindEo and changes declaration of Evas, Evas_Object,
+        Ecore_Timer to build with latest EFL libraries.
+
+        * DumpRenderTree/efl/CMakeLists.txt: Includes eo EFL library.
+        * EWebLauncher/CMakeLists.txt: Ditto.
+        * MiniBrowser/efl/CMakeLists.txt: Ditto.
+        * ImageDiff/PlatformEfl.cmake: Ditto.
+        * TestWebKitAPI/PlatformEfl.cmake: Ditto.
+        * TestWebKitAPI/PlatformWebView.h: Modified declaration of Evas_Object.
+        * WebKitTestRunner/InjectedBundle/TestRunner.h: Modified declaration of Ecore_Timer.
+        * WebKitTestRunner/PlatformEfl.cmake: Includes eo EFL library.
+        * WebKitTestRunner/PlatformWebView.h: Modified declaration of Evas_Object.
+
+2012-12-20  Dirk Pranke  <dpranke@chromium.org>
+
+        TestExpectation fallback is broken
+        https://bugs.webkit.org/show_bug.cgi?id=105583
+
+        Reviewed by Ryosuke Niwa.
+
+        When I added support for the -wk2 in port names, it looks
+        like I broke the way we computed the list of TestExpectations
+        files so that the implementation-version directory was left out :(.
+        Fixed and cleaned up the tests.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.expectations_files):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (TestWebKitPort.__init__):
+        (PortTestCase.test_skipped_directories_for_symbols):
+        (test_skipped_directories_for_features):
+        (test_skipped_directories_for_features_no_matching_tests_in_test_list):
+        (test_skipped_tests_for_unsupported_features_empty_test_list):
+        (test_skipped_layout_tests):
+        (test_expectations_files):
+
+2012-12-20  Anders Carlsson  <andersca@apple.com>
+
+        Don't include WebKit2 headers when building TestWebKitAPI on windows
+        https://bugs.webkit.org/show_bug.cgi?id=105582
+
+        Reviewed by Tim Horton.
+
+        * TestWebKitAPI/config.h:
+        * TestWebKitAPI/win/main.cpp:
+
+2012-12-20  Ryosuke Niwa  <rniwa@webkit.org>
+
+        REGRESSION(r133820?): SimplifyMarkupTest API test asserts
+        https://bugs.webkit.org/show_bug.cgi?id=105370
+
+        Reviewed by Simon Fraser.
+
+        Re-enable the test.
+
+        * TestWebKitAPI/Tests/mac/SimplifyMarkup.mm:
+        (TestWebKitAPI::TEST):
+
+2012-12-20  Nico Weber  <thakis@chromium.org>
+
+        chromium nrwt: Pick the newest binary found in DEFAULT_BUILD_DIRECTORIES, not the first
+        https://bugs.webkit.org/show_bug.cgi?id=105498
+
+        Reviewed by Dirk Pranke.
+
+        Use the newest binary available rather than an than always picking one
+        build directory over another based on iteration order.
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort._static_build_path):
+        Check for timestamps.
+        * Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py:
+        (ChromiumMacPortTest.test_build_path_timestamps):
+        Test that out / xcodebuild selection happens based on timestamps
+        * Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py:
+        (ChromiumWinPortTest.test_build_path_timestamps):
+        Test that out / build selection happens based on timestamps
+
+2012-12-19  Simon Fraser  <simon.fraser@apple.com>
+
+        Lots of sticky tests failing in WK2
+        https://bugs.webkit.org/show_bug.cgi?id=105464
+
+        Reviewed by Beth Dakin.
+
+        WebKitTestRunner had a race between snapshotting in the UI process,
+        and resettting after the test in the web process. InjectedBundle::done()
+        was a bad place to call page()->resetAfterTest(), because of this race;
+        it could reset the scroll position before the UI snapshot had been obtained.
+        
+        Fix by moving the call to page()->resetAfterTest() into didReceiveMessage(),
+        for the "Reset" message which will come in before the next test.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::didReceiveMessage):
+        (WTR::InjectedBundle::done):
+
+2012-12-19  Filip Pizlo  <fpizlo@apple.com>
+
+        DFG speculation checks that take JumpList should consolidate OSRExits
+        https://bugs.webkit.org/show_bug.cgi?id=105401
+
+        Reviewed by Oliver Hunt.
+
+        Update the profiler to understand that an OSR exit may have multiple
+        candidate exit sites.
+
+        * Scripts/display-profiler-output:
+
+2012-12-20  Eric Seidel  <eric@webkit.org>
+
+        EWSes do not need to dump build/test logs when things pass
+        https://bugs.webkit.org/show_bug.cgi?id=105402
+
+        Reviewed by Dirk Pranke.
+
+        When we were first writing the commit-queue and EWS system
+        and running them locally, we thought it was important to see the
+        build/test output as it happened.  Now these queues have been running
+        for years, and we don't use this feature anymore.  So this patch
+        makes us stop tee-ing the output directly to stdout, and instead
+        only print any output from commands when they fail.
+
+        I also added some logging when we execute each command
+        since we are no longer printing the command output itself.
+        This should make it much easier to see errors with the EWS
+        system itself, now that all the passing-build output is removed.
+
+        This required updating a zillion unittests, since we have a bunch of
+        "integration" style testing of the queue-bots.  Many of the unittests for the bots were
+        already approximating this behavior by using a "logging" Executive.
+        I disabled logging in those cases to avoid redundant logging in those tests.
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (Executive.command_for_printing):
+        (Executive.run_command):
+        * Scripts/webkitpy/common/system/executive_mock.py:
+        (MockExecutive.command_for_printing):
+        (MockExecutive.run_command):
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+        (ExecutiveTest.test_auto_stringify_args):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:
+        (EarlyWarningSytemTest._default_expected_logs):
+        (_test_ews):
+        (_test_ewses):
+        * Scripts/webkitpy/tool/commands/queues.py:
+        (AbstractQueue.run_webkit_patch):
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+        (AbstractQueueTest._assert_run_webkit_patch):
+        (CommitQueueTest.test_commit_queue):
+        (test_rollout):
+        (test_rollout_lands):
+        (test_manual_reject_during_processing):
+        (StyleQueueTest.test_style_queue_with_style_exception):
+        (test_style_queue_with_watch_list_exception):
+
+2012-12-20  Dominic Mazzoni  <dmazzoni@google.com>
+
+        AX: support clickPoint in DRT for chromium
+        https://bugs.webkit.org/show_bug.cgi?id=97359
+
+        Reviewed by Chris Fleizach.
+
+        Implement clickPointX, clickPointY, and elementAtPoint for Chromium, so that
+        several more tests can pass.
+
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElement::clickPointXGetterCallback):
+        (WebTestRunner):
+        (WebTestRunner::AccessibilityUIElement::clickPointYGetterCallback):
+        (WebTestRunner::AccessibilityUIElement::elementAtPointCallback):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElement):
+
+2012-12-20  Dan Bernstein  <mitz@apple.com>
+
+        prepare-ChangeLog adds "Additional information of the change such as approach, rationale" where it doesn't make sense
+        https://bugs.webkit.org/show_bug.cgi?id=99268
+
+        Reviewed by Alexey Proskuryakov.
+
+        * Scripts/prepare-ChangeLog:
+        (generateNewChangeLogs): Removed the "Additional information of the change" line.
+
+2012-12-20  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        Unreviewed. Skip unit test /webkit/atk/getTextInParagraphAndBodyModerate
+
+        * Scripts/run-gtk-tests:
+        (TestRunner):
+
+2012-12-20  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [Qt] Move ImageDiff to the Tools directory root
+        https://bugs.webkit.org/show_bug.cgi?id=105420
+
+        Reviewed by Tor Arne Vestbø.
+
+        Moved ImageDiff from outside DumpRenderTree because it is also a
+        dependency when running pixel tests for WebKit2.
+
+        * ImageDiff/ImageDiff.pro: Renamed from Tools/DumpRenderTree/qt/ImageDiff.pro.
+        * ImageDiff/qt/ImageDiff.cpp: Renamed from Tools/DumpRenderTree/qt/ImageDiff.cpp.
+        * Tools.pro:
+
+2012-12-20  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Remove the --enable-unstable-features configuration option
+        https://bugs.webkit.org/show_bug.cgi?id=105327
+
+        Reviewed by Martin Robinson.
+
+        Add a missing feature option for the CSS sticky position feature.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-20  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        Unreviewed. Skip unit test WebKit2.ForceRepaint that times out
+
+        * Scripts/run-gtk-tests:
+        (TestRunner):
+
+2012-12-20  Dominik Röttsches  <dominik.rottsches@intel.com>
+
+        [EFL] MiniBrowser does not play Infinite Gangnam Style
+        https://bugs.webkit.org/show_bug.cgi?id=103531
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        For EFL we would like this feature to be built by default.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-20  Csaba Osztrogonác  <ossy@webkit.org>
+
+        [Qt] EWS bots should call qmake always
+        https://bugs.webkit.org/show_bug.cgi?id=90049
+
+        Reviewed by Simon Hausmann.
+
+        * Scripts/webkitdirs.pm:
+        (buildQMakeProjects):
+
+2012-12-20  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] fix stray printf in TestRunner's WebTestProxy
+        https://bugs.webkit.org/show_bug.cgi?id=105515
+
+        Reviewed by Ryosuke Niwa.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::shouldInsertNode):
+
+2012-12-20  Dominik Röttsches  <dominik.rottsches@intel.com>
+
+        [WK2] WebAudio WKTR support
+        https://bugs.webkit.org/show_bug.cgi?id=95084
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Implementing audio data dump support for WebKitTestRunner,
+        by adding the API to the IDL, enabling IPC for transferring
+        the audio data as bytebuffer and dumping it according
+        to run-webkit-tests script's expectations.
+        This enables audio testing on WebKit2 ports.
+        Based on initial wip-patch from Philippe Normand - thanks.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: Adding setAudioData API.
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp: Assign audio buffer data to a local WKDataRef after extracting it from WK2 using WKBundleDataFromUint8Array bundle API.
+        (WTR::TestRunner::setAudioData):
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/TestRunner.h: Add a whatToDump state for dumping Audio.
+        (TestRunner):
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp: Add audio to the message that's transferred to the WKTR process.
+        (WTR::InjectedBundle::done):
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.h: Allow setting and audio result handle to be transferred.
+        (WTR::InjectedBundle::setAudioResult):
+        (InjectedBundle):
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::dump): Dummy handling the Audio case in the switch, build fix for Mac.
+        * WebKitTestRunner/TestInvocation.cpp: Audio dump support, dump audio if we haven't received a text dump from the web process.
+        (WTR::TestInvocation::dumpResults):
+        (WTR):
+        (WTR::TestInvocation::dumpAudio):
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle): Storing received audio data before dumping.
+        * WebKitTestRunner/TestInvocation.h:
+        (TestInvocation):
+
+2012-12-20  Alberto Garcia  <agarcia@igalia.com>
+
+        [GTK] Count failed and timed out tests separately
+        https://bugs.webkit.org/show_bug.cgi?id=105448
+
+        Reviewed by Carlos Garcia Campos.
+
+        Display the number of tests that fail, time out and are skipped
+        separately in the buildbot page.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunGtkAPITests.commandComplete):
+        (RunGtkAPITests.evaluateCommand):
+        (RunGtkAPITests.getText2):
+        * Scripts/run-gtk-tests:
+        (TestRunner.run_tests):
+
+2012-12-19  Ryosuke Niwa  <rniwa@webkit.org>
+
+        PerfTest.parse_output does too much
+        https://bugs.webkit.org/show_bug.cgi?id=105391
+
+        Reviewed by Tony Chang.
+
+        Moved the code to filter lines into PerfTest._filter_output, which has been renamed from _filter_stderr.
+        Also moved the code to output test results into PerfTest._run_with_driver.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest.__init__): Added _description.
+        (PerfTest.description): Added.
+        (PerfTest._run_with_driver): Moved the code to output test description and test results.
+        (PerfTest._filter_output): Moved and renamed from PerfTest._filter_stderr.
+        (PerfTest.parse_output): Removed the code to output test results. Return test results and description
+        respectively. Also removed the code that allowed some tests to omit values since all tests report each
+        iteration now since r136492.
+        (PerfTest.output_statistics): Removed the code to print test description, now done in _run_with_driver.
+        (ChromiumStylePerfTest._run_with_driver): Added. Chromium style tests are sufficiently different from
+        regular PerfTest that it doesn't make much sense to share _run_with_driver. But really, we should just
+        get rid of this type of test altogether in favor of regular performance tests that uses runner.js.
+        (ChromiumStylePerfTest.parse_and_log_output): Renamed from parse_output.
+        (PageLoadingPerfTest._run_with_driver): Removed the explicit '' for the test description.
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (MainTest.test_parse_output): Removed the expected logs since parse_output no longer prints out results.
+        Also added a call to _filter_output since parse_output doesn't filter the output text anymore.
+        (MainTest.test_parse_output_with_failing_line): Added a call to _filter_output. Also added ',' after 'Time:'
+        so that it's not string-concatenated with the next line.
+        (MainTest.test_parse_output_with_description): Added; a test for PerfTest.description().
+        (MainTest.test_parse_output_with_subtests): Removed the expected logs, and added a call to _filter_output.
+
+2012-12-19  Alexis Menard  <alexis@webkit.org>
+
+        Implement CSS parsing for CSS transitions unprefixed.
+        https://bugs.webkit.org/show_bug.cgi?id=104804
+
+        Reviewed by Dean Jackson.
+
+        Add a new flag ENABLE_CSS_TRANSFORMS_ANIMATIONS_TRANSITIONS_UNPREFIXED
+        to cover the work of unprefixing Transforms, Animations and 
+        Transitions. It will let the possibility of each ports to turn it off 
+        in their release branches until we're confident that these CSS 
+        properties are ready to be unprefixed.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2012-12-19  Julien Chaffraix  <jchaffraix@webkit.org>
+
+        2 clampTo unit tests are failing
+        https://bugs.webkit.org/show_bug.cgi?id=105253
+
+        Reviewed by Emil A Eklund.
+
+        Removed clampToUnsigned as it was actually testing exactly what
+        clampToUnsignedLong was doing. Also made clampToIntFloat more robust
+        to precision loss (fix suggested by Emil).
+
+        * TestWebKitAPI/Tests/WTF/MathExtras.cpp:
+
+2012-12-19  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [EFL] Move ImageDiff to the Tools directory root
+        https://bugs.webkit.org/show_bug.cgi?id=105305
+
+        Reviewed by Laszlo Gombos.
+
+        We previously moved this directory from the DRT directory to
+        efl/ImageDiff. The major reason for doing so was because ImageDiff does
+        not depend on DumpRenderTree but for legacy reasons was living inside the
+        DRT folder, even though it is needed when running pixel tests for WK2.
+
+        Now we are moving to Tool directory root as other ports agreed to do the same.
+
+        * CMakeLists.txt:
+        * ImageDiff/CMakeLists.txt: Added.
+        * ImageDiff/PlatformEfl.cmake: Added.
+        * ImageDiff/efl/ImageDiff.cpp: Renamed from Tools/efl/ImageDiff/ImageDiff.cpp.
+        * efl/ImageDiff/CMakeLists.txt: Removed.
+
+2012-12-19  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt][Mac] run-launcher cannot find Qt5WebKitWidgets.
+        https://bugs.webkit.org/show_bug.cgi?id=105309
+
+        The version number is only used as a part
+        of the library name on Linux.
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * Scripts/webkitdirs.pm:
+        (builtDylibPathForName):
+
+2012-12-19  Alberto Garcia  <agarcia@igalia.com>
+
+        [GTK] Tests that time out are not considered as failures.
+        https://bugs.webkit.org/show_bug.cgi?id=105318
+
+        Reviewed by Martin Robinson.
+
+        Fix parsing of the GTK API tests log files.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunGtkAPITests.commandComplete):
+
+2012-12-18  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Unreviewed, rolling out r138061.
+        https://bugs.webkit.org/show_bug.cgi?id=105396
+
+        Original patch:
+        http://trac.webkit.org/changeset/138061
+        https://bugs.webkit.org/show_bug.cgi?id=97359
+
+        It is crashing on Debug bots
+
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElement::elementAtPointCallback):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElement):
+
+2012-12-18  Alice Liu  <alice.liu@apple.com>
+
+        Test for https://bugs.webkit.org/show_bug.cgi?id=105106
+        Add SPI to WebKit1 WebFrame for hit testing
+
+        Reviewed by Dan Bernstein.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Added file Tests/mac/ElementAtPointInWebFrame.mm
+        * TestWebKitAPI/Tests/mac/ElementAtPointInWebFrame.mm: Added.
+        (TestWebKitAPI::TEST): Loads html with two divs positioned in the 2nd and 4th quadrants of the webview.
+        Then hit-tests at three points, expecting to hit the two divs and body element. 
+
+2012-12-18  Alice Liu  <alice.liu@apple.com>
+
+        Test for https://bugs.webkit.org/show_bug.cgi?id=105262
+        Add SPI to WebKit1 WebFrame for node conversion to JSValueRef
+
+        Reviewed by Anders Carlsson.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Added file Tests/mac/JSWrapperForNodeInWebFrame.mm.mm
+        * TestWebKitAPI/Tests/mac/JSWrapperForNodeInWebFrame.mm.mm: Added.
+        (TestWebKitAPI::TEST): Tests for the correct JS wrapper for a DOMNode, provided a WebScriptWorld.
+        Loads html with a single div element. In an isolated world, creates a property on that node.
+        Also, in the standard world, creates a different property on that node.  Then tests for 4 things:
+            - Existence of the isolated property in the isolated world.
+            - Existence of the standard property in the standard world.
+            - Non-existence of the isolated property in the standard world.
+            - Non-existence of the standard property in the isolated world.
+
+2012-12-18  Simon Fraser  <simon.fraser@apple.com>
+
+        Disable the SimplifyMarkup API test, wich asserts in debug builds.
+        Tracked by https://bugs.webkit.org/show_bug.cgi?id=105370.
+        
+        * TestWebKitAPI/Tests/mac/SimplifyMarkup.mm:
+        (TestWebKitAPI::TEST):
+
+2012-12-18  Joseph Pecoraro  <pecoraro@apple.com>
+
+        [Mac] Add Build Phase to Check Headers for Inappropriate Macros (Platform.h macros)
+        https://bugs.webkit.org/show_bug.cgi?id=104279
+
+        Reviewed by David Kilzer.
+
+        Add a build phase script that checks a framework's header files for
+        Platform.h and Compiler.h macros. Also add some tests for the script.
+
+        * Scripts/check-for-inappropriate-macros-in-external-headers: Added.
+        Script to be used in build phases to check for inappropriate macros in headers.
+
+        * Scripts/test-webkitruby: Added.
+        Script that can be used to run all webkitruby tests.
+
+        * Scripts/test-webkit-scripts:
+        Also run the ruby tests.
+
+        * Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/fake-data-failing-expected.txt: Added.
+        * Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/pass-expected.txt: Added.
+        * Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Fail.h: Added.
+        * Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Pass.h: Added.
+        * Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/run-test.rb: Added.
+        Tests for the new script.
+
+2012-12-18  Dominic Mazzoni  <dmazzoni@google.com>
+
+        AX: support clickPoint in DRT for chromium
+        https://bugs.webkit.org/show_bug.cgi?id=97359
+
+        Reviewed by Chris Fleizach.
+
+        Implement clickPointX, clickPointY, and elementAtPoint for Chromium, so that
+        several more tests can pass.
+
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElement::clickPointXGetterCallback):
+        (WebTestRunner):
+        (WebTestRunner::AccessibilityUIElement::clickPointYGetterCallback):
+        (WebTestRunner::AccessibilityUIElement::elementAtPointCallback):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElement):
+
+2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Build fix after r138045.
+
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._collect_tests): Use relative_path. We skip only when this path
+        is not explicitly specified. The condition was backwards but never matched so we
+        always ran the test regardless of whether it's listed in the skipped list or not.
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (test_collect_tests_with_ignored_skipped_list): Renamed so that it actually runs.
+
+2012-12-18  Emil A Eklund  <eae@chromium.org>
+
+        TestWebKitAPI/Tests/WebCore/LayoutUnit fails on mac
+        https://bugs.webkit.org/show_bug.cgi?id=105332
+        
+        Reviewed by Levi Weintraub.
+        
+        Create new test suite for LayoutUnit tests as the KURL tests are
+        of the incompatible TEST_F type.
+
+        * TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp:
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST_F):
+
+2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Running a skipped test with run-perf-tests could alert the user
+        https://bugs.webkit.org/show_bug.cgi?id=105219
+
+        Reviewed by Eric Seidel.
+
+        Force run skipped performance tests explicitly specified in the command line.
+        Also warn the user when the specified paths don't exist.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.relative_test_filename):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+        (PerfTestsRunner._collect_tests):
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (test_collect_tests_with_skipped_list_and_files):
+
+2012-12-18  Yaron Friedman  <yfriedman@chromium.org>
+
+        Chrome Android java output is too verbose
+        https://bugs.webkit.org/show_bug.cgi?id=105247
+
+        Reviewed by Tony Chang.
+
+        Pass -quiet to ant to suppress extraneous output.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+        * TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp:
+
+2012-12-18  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Consider removing --pause-before-testing option
+        https://bugs.webkit.org/show_bug.cgi?id=105248
+
+        Reviewed by Eric Seidel.
+
+        Remove --pause-before-testing option.
+
+        * Tools/Scripts/webkitpy/layout_tests/port/driver.py:
+        (DriverProxy.start): Removed.
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest.__init__):
+        (PerfTest.test_path): Renamed from path_or_url.
+        (PerfTest.run):
+        (PerfTest): Removed "driver" argument.
+        (PerfTest._run_with_driver):
+        (PerfTest.run_single):
+        (ChromiumStylePerfTest.__init__):
+        (PageLoadingPerfTest.__init__):
+        (PageLoadingPerfTest.run_single):
+        (PageLoadingPerfTest._run_with_driver): Renamed from run so that PerfTest.run can create a driver for us.
+        (ReplayPerfTest.__init__):
+        (ReplayPerfTest.prepare):
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (TestPageLoadingPerfTest.test_run):
+        (TestPageLoadingPerfTest.test_run_with_memory_output):
+        (TestPageLoadingPerfTest.test_run_with_bad_output):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+        (PerfTestsRunner._run_tests_set): Removed the code to create a driver and pause before running the test.
+        (PerfTestsRunner._run_single_test): Removed "driver" argument.
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (run_test):
+        (test_run_test_pause_before_testing): Removed.
+
+2012-12-18  Alberto Garcia  <agarcia@igalia.com>
+
+        [GTK] Tests that time out are not considered as failures.
+        https://bugs.webkit.org/show_bug.cgi?id=105318
+
+        Reviewed by Martin Robinson.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunGtkAPITests.commandComplete):
+        Consider log lines that end with TIMEOUT as errors.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner.run_tests):
+        Consider timeouts as failures when returning the number of failed
+        tests.
+
+2012-12-18  Pravin D  <pravin.d@samsung.com>
+
+        Unreviewed, adding secondary email.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-18  Pravin D  <pravin.d@samsung.com>
+
+        Unreviewed, promoting myself to committer's list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-18  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [EFL] ImageDiff does not build on WebKit2 only builds
+        https://bugs.webkit.org/show_bug.cgi?id=105288
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Moved ImageDiff to the efl/ folder inside Tools/ (so we don't pollute
+        the folder with things which are EFL-specific.
+
+        ImageDiff will be built by default now regardless of WebKit API flavor
+        you choose.
+
+        * CMakeLists.txt:
+        * DumpRenderTree/efl/CMakeLists.txt:
+        * efl/ImageDiff/CMakeLists.txt: Added.
+        * efl/ImageDiff/ImageDiff.cpp: Renamed from Tools/DumpRenderTree/efl/ImageDiff.cpp.
+
+2012-12-18  Kenneth Rohde Christiansen  <kenneth@webkit.org>
+
+        [EFL][WK2] When creating new windows, use the opener's context
+        https://bugs.webkit.org/show_bug.cgi?id=105283
+
+        Reviewed by Laszlo Gombos.
+
+        Use the context of the opener if exists.
+
+        * MiniBrowser/efl/main.c:
+        (on_key_down):
+        (on_window_create):
+        (window_create):
+        (elm_main):
+
+2012-12-18  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [EFL][WK2] Gardening of TestWebKitAPI tests
+        https://bugs.webkit.org/show_bug.cgi?id=105268
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Some tests were marked as failing but are passing and the newly added
+        LayoutUnit should have it's own binary because it conflicts with the
+        fixture used by KURL and is failing on the bots because of that.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/PlatformEfl.cmake:
+
+2012-12-18  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move webintent related methods to TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=105164
+
+        Reviewed by Darin Fisher.
+
+        Also deleted the unused deliveredIntentFailure and
+        deliveredIntentResult methods.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebKit):
+        (WebTestRunner::WebTestDelegate::setCurrentWebIntentRequest):
+        (WebTestRunner::WebTestDelegate::currentWebIntentRequest):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::registerIntentService):
+        (WebTestRunner::WebTestProxy::dispatchIntent):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::sendWebIntentResponse):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::deliverWebIntent):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::postAccessibilityNotification):
+        (WebTestRunner::WebTestProxyBase::registerIntentService):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::dispatchIntent):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::setCurrentWebIntentRequest):
+        (WebViewHost::currentWebIntentRequest):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebKit):
+        (WebViewHost):
+
+2012-12-18  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move editing callback dumping to the WebTestProxy
+        https://bugs.webkit.org/show_bug.cgi?id=105013
+
+        Reviewed by Darin Fisher.
+
+        To decide whether or not to dump the editing callbacks, the WebTestProxy
+        needs to query the TestRunner. For this purpose, I introduce a
+        WebTestRunner class that just exposes the shouldDumpEditingCallbacks
+        method. In contrast to e.g. WebEventSender, the WebTestRunner is just
+        an interface, and it is not owned by the WebTestInterfaces, but the
+        embedder of the TestRunner library must provide it. This will change
+        once all TestRunner methods are in the library.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        (DRTTestRunner::taskList):
+        (DRTTestRunner::WorkQueue::taskList):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h:
+        (WebTestRunner):
+        (WebTestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestRunner):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::shouldBeginEditing):
+        (WebTestRunner::WebTestProxy::shouldEndEditing):
+        (WebTestRunner::WebTestProxy::shouldInsertNode):
+        (WebTestRunner::WebTestProxy::shouldInsertText):
+        (WebTestRunner::WebTestProxy::shouldChangeSelectedRange):
+        (WebTestRunner::WebTestProxy::shouldDeleteRange):
+        (WebTestRunner::WebTestProxy::shouldApplyStyle):
+        (WebTestRunner::WebTestProxy::didBeginEditing):
+        (WebTestRunner::WebTestProxy::didChangeSelection):
+        (WebTestRunner::WebTestProxy::didChangeContents):
+        (WebTestRunner::WebTestProxy::didEndEditing):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h: Copied from Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h.
+        (WebTestRunner):
+        (WebTestRunner::WebTestRunner::shouldDumpEditingCallbacks):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::~TestRunner):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::shouldDumpEditingCallbacks):
+        (WebTestRunner::TestRunner::dumpEditingCallbacks):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp:
+        (WebTestRunner::WebTestInterfaces::Internal::testRunner):
+        (WebTestRunner::WebTestInterfaces::Internal::setTestRunner):
+        (WebTestInterfaces::Internal):
+        (WebTestRunner::WebTestInterfaces::Internal::Internal):
+        (WebTestRunner::WebTestInterfaces::testRunner):
+        (WebTestRunner):
+        (WebTestRunner::WebTestInterfaces::setTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::postAccessibilityNotification):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::shouldBeginEditing):
+        (WebTestRunner::WebTestProxyBase::shouldEndEditing):
+        (WebTestRunner::WebTestProxyBase::shouldInsertNode):
+        (WebTestRunner::WebTestProxyBase::shouldInsertText):
+        (WebTestRunner::WebTestProxyBase::shouldChangeSelectedRange):
+        (WebTestRunner::WebTestProxyBase::shouldDeleteRange):
+        (WebTestRunner::WebTestProxyBase::shouldApplyStyle):
+        (WebTestRunner::WebTestProxyBase::didBeginEditing):
+        (WebTestRunner::WebTestProxyBase::didChangeSelection):
+        (WebTestRunner::WebTestProxyBase::didChangeContents):
+        (WebTestRunner::WebTestProxyBase::didEndEditing):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::initialize):
+        (TestShell::createNewWindow):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::shouldBeginEditing):
+        (WebViewHost::shouldEndEditing):
+        (WebViewHost::shouldInsertNode):
+        (WebViewHost::shouldInsertText):
+        (WebViewHost::shouldChangeSelectedRange):
+        (WebViewHost::shouldDeleteRange):
+        (WebViewHost::shouldApplyStyle):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2012-12-17  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] Fix methods in TestRunner that directly modify the settings instead of going through WebPreferences
+        https://bugs.webkit.org/show_bug.cgi?id=105154
+
+        Reviewed by Tony Chang.
+
+        If the settings are modified directly, the embedder can't keep track of
+        them and might accidentially override the changed settings.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        (WebPreferences):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::setAsynchronousSpellCheckingEnabled):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setMinimumTimerInterval):
+        (WebTestRunner::TestRunner::setTouchDragDropEnabled):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner::WebPreferences::applyTo):
+
+2012-12-17  Julien Chaffraix  <jchaffraix@webkit.org>
+
+        Unreviewed unit test skipping.
+
+        Filed https://bugs.webkit.org/show_bug.cgi?id=105253 to re-enable them.
+
+        * TestWebKitAPI/Tests/WTF/MathExtras.cpp:
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST):
+
+2012-12-17  Dean Jackson  <dino@apple.com>
+
+        Unreviewed. Add Silvia Pfeiffer to contributor list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-17  Dirk Pranke  <dpranke@chromium.org>
+
+        build.webkit.org - add more google windows bots
+        https://bugs.webkit.org/show_bug.cgi?id=105225
+
+        Reviewed by Eric Seidel.
+
+        Adds two more windows bots (google-windows-3, a builder, and
+        google-windows-4, a tester) for the Chromium configs.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+
+2012-12-17  Eric Seidel  <eric@webkit.org>
+
+        Cleanup --profiler=perf code a little and allow up to 1000 report files (instead of 100)
+        https://bugs.webkit.org/show_bug.cgi?id=105217
+
+        Reviewed by Dirk Pranke.
+
+        Previously --profile would fail strangely if find_unused_filename returned None
+        (which would happen as soon as we had 100 report files).
+        Now we'll search through 1000 filenames before giving up (and assert if we failed to find one).
+        I also made some minor cleanups to the output of perf, and tried to make the
+        commands more self-documenting by using long-names for args.
+
+        * Scripts/webkitpy/common/system/profiler.py:
+        (SingleFileOutputProfiler.__init__):
+        (Perf.attach_to_pid):
+        (Perf.profile_after_exit):
+
+2012-12-17  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r137198.
+        http://trac.webkit.org/changeset/137198
+        https://bugs.webkit.org/show_bug.cgi?id=105212
+
+        This patch is causing API behavior compatibility problems
+        (Requested by zdobersek on #webkit).
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (willSendRequestCallback):
+
+2012-12-17  Elliott Sprehn  <esprehn@chromium.org>
+
+        Unreviewed. Adding myself to committers list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-17  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: shuffle code around for cleanup in run_webkit_tests.py
+        https://bugs.webkit.org/show_bug.cgi?id=105078
+
+        Reviewed by Ojan Vafai.
+
+        This patch reorders functions so that run_webkit_tests can be
+        understood in a top-down matter better, and to make things slightly
+        more sensible when I merge manager.py into it.
+
+        Also, this adds tests for the actual main() routine, which had several
+        bugs get through testing a week or two ago.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (main):
+        (parse_args):
+        (_set_up_derived_options):
+        (run):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (RunTest):
+        (RunTest.test_no_http_tests):
+        (PortTest.disabled_test_mac_lion):
+        (MainTest):
+        (MainTest.test_exception_handling):
+        (MainTest.test_exception_handling.interrupting_run):
+        (MainTest.test_exception_handling.successful_run):
+        (MainTest.test_exception_handling.successful_run.FakeRunDetails):
+        (MainTest.test_exception_handling.exception_raising_run):
+
+2012-12-17  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: move --lint-test-files code into its own module
+        https://bugs.webkit.org/show_bug.cgi?id=105077
+
+        Reviewed by Eric Seidel.
+
+        It really didn't need to be in run_webkit_tests.py anymore.
+        This patch adds a new lint-test-expectations scripts to Tools/Scripts;
+        rwt --lint-test-files is still supported for backwards compatibility
+        for now.
+
+        * Scripts/lint-test-expectations: Added.
+        * Scripts/webkitpy/layout_tests/lint_test_expectations.py: Added.
+        (lint):
+        (main):
+        * Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py: Added.
+        (FakePort):
+        (FakePort.__init__):
+        (FakePort.test_configuration):
+        (FakePort.expectations_dict):
+        (FakePort.skipped_layout_tests):
+        (FakePort.all_test_configurations):
+        (FakePort.configuration_specifier_macros):
+        (FakePort.get_option):
+        (FakeFactory):
+        (FakeFactory.__init__):
+        (FakeFactory.get):
+        (FakeFactory.all_port_names):
+        (LintTest):
+        (LintTest.test_all_configurations):
+        (LintTest.test_lint_test_files):
+        (LintTest.test_lint_test_files__errors):
+        (MainTest):
+        (MainTest.test_success):
+        (MainTest.test_success.interrupting_lint):
+        (MainTest.test_success.successful_lint):
+        (MainTest.test_success.exception_raising_lint):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (main):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (StreamTestingMixin.assertNotEmpty):
+
+2012-12-17  Adam Klein  <adamk@chromium.org>
+
+        build-webkit: rename --template-tag to --template-element to match ENABLE #define name
+        https://bugs.webkit.org/show_bug.cgi?id=105072
+
+        Reviewed by Laszlo Gombos.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-17  Julien Chaffraix  <jchaffraix@webkit.org>
+
+        Add some unit testing for WTF::clampTo* functions
+        https://bugs.webkit.org/show_bug.cgi?id=105060
+
+        Reviewed by Emil A Eklund.
+
+        The new tests are targeted at clamping to int / unsigned and float as those are
+        the one explicitely exposed through more dedicated functions (like clampToInteger,
+        clampToPositiveInteger and clampToFloat).
+
+        * TestWebKitAPI/Tests/WTF/MathExtras.cpp:
+
+2012-12-17  Eric Seidel  <eric@webkit.org>
+
+        rpt --profile --chromium-android throws exception
+        https://bugs.webkit.org/show_bug.cgi?id=105061
+
+        Reviewed by Daniel Bates.
+
+        Somehow popen(args) got turned into popen(*args) at some point,
+        which caused my new stringify code to fail when args was passed by name.
+        Fixed and tested.
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (Executive._stringify_args):
+        (Executive):
+        (Executive.popen):
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+        (ExecutiveTest.test_popen_args):
+
+2012-12-17  Mark Pilgrim  <pilgrim@chromium.org>
+
+        Use Platform::current() instead of webKitPlatformSupport() in DumpRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=105054
+
+        Reviewed by Jochen Eisinger.
+
+        Part of a refactoring series; see tracking bug 82948.
+
+        * DumpRenderTree/chromium/NotificationPresenter.cpp:
+        (NotificationPresenter::show):
+        * DumpRenderTree/chromium/Task.cpp:
+        (postTask):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp:
+
+2012-12-17  Emil A Eklund  <eae@chromium.org>
+
+        Clamp values in LayoutUnit::operator/ when SATURATED_LAYOUT_ARITHMETIC is enabled
+        https://bugs.webkit.org/show_bug.cgi?id=104955
+
+        Reviewed by Julien Chaffraix.
+
+        Add tests for LayoutUnit.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/ForwardingHeaders: Added.
+        * TestWebKitAPI/ForwardingHeaders/WebCore: Added.
+        * TestWebKitAPI/ForwardingHeaders/WebCore/LayoutUnit.h: Added.
+        * TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp:
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/win/TestWebKitAPI.vcproj:
+
+2012-12-17  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] removed unused preferences from testRunner.overridePreference
+        https://bugs.webkit.org/show_bug.cgi?id=105169
+
+        Reviewed by Tony Chang.
+
+        Most notably this removes the code related to font family maps which is
+        now handled via window.internals.settings
+
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        (WebPreferences):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::overridePreference):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::applyTo):
+
+2012-12-17  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Move creation of WebLayerTreeView to WebWidgetClient
+        https://bugs.webkit.org/show_bug.cgi?id=105071
+
+        Reviewed by Adrienne Walker.
+
+        Update WebViewHost for the new WebWidgetClient interface.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::initializeLayerTreeView):
+        (WebViewHost::layerTreeView):
+        (WebViewHost::~WebViewHost):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2012-12-17  Kenneth Rohde Christiansen  <kenneth@webkit.org>
+
+        [EFL][WK2] window_create doesn't receive the url
+        https://bugs.webkit.org/show_bug.cgi?id=105184
+
+        Reviewed by Alexis Menard.
+
+        * MiniBrowser/efl/main.c: Use the url supplied to window_create
+        (on_window_create):
+
+2012-12-17  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: MemoryInstrumentation doesn't detect reportMemoryUsage method defined in a base class.
+        https://bugs.webkit.org/show_bug.cgi?id=105026
+
+        Reviewed by Yury Semikhatsky.
+
+        Old SFINAE test was replaced with new one based on this article:
+        http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions
+
+        New test which covers this problem was added.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+2012-12-17  Anthony Scian  <ascian@rim.com>
+
+        [Blackberry] Static code analysis warning fixes
+        https://bugs.webkit.org/show_bug.cgi?id=105129
+
+        Reviewed by Rob Buis.
+
+        Added null checks for fopen calls, no recovery attempted; access fault prevention only.
+
+        * DumpRenderTree/blackberry/DumpRenderTree.cpp:
+        (BlackBerry::WebKit::createFile):
+        (BlackBerry::WebKit::DumpRenderTree::runTest):
+
+2012-12-17  John Mellor  <johnme@chromium.org>
+
+        Add Anton Vayvod and Tim Volodine as contributors in committers.py
+        https://bugs.webkit.org/show_bug.cgi?id=105025
+
+        Unreviewed. Adds two contributors to committers.py.
+        They are initially contributing to the Text Autosizing feature (master bug: 84186).
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-17  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        Unreviewed, add myself to committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-17  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
+
+        [Qt] remove some unnecessary CONFIG additions
+
+        Reviewed by Simon Hausmann.
+
+        qt is already added by spec_pre.prf, warn_on and depend_includepath by
+        default_pre.prf.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2012-12-17  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Unreviewed, rolling out r137892.
+        http://trac.webkit.org/changeset/137892
+        https://bugs.webkit.org/show_bug.cgi?id=105026
+
+        it broke compilation on windows
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+2012-12-14  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: MemoryInstrumentation doesn't detect reportMemoryUsage method defined in a base class.
+        https://bugs.webkit.org/show_bug.cgi?id=105026
+
+        Reviewed by Yury Semikhatsky.
+
+        Old SFINAE test was replaced with new one based on this article:
+        http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions
+
+        New test which covers this problem was added.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+2012-12-17  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
+
+        [Qt] rely on automatic output directory setup
+
+        Reviewed by Simon Hausmann.
+
+        Now being a proper qt module (by virtue of having load(qt_build_config)
+        in .qmake.conf), webkit gets the path setup goodies for free.
+
+        This also fixes Makefile.api.Debug/Release trying to generate qrc_WebKit.cpp
+        at the same time, instead of the debug and release version ending up in different
+        directories as they should.
+
+        * qmake/mkspecs/features/default_pre.prf:
+
+2012-12-17  Charles Wei  <charles.wei@torchmobile.com.cn>
+
+        [BlackBerry] Need to re-enable video track
+        https://bugs.webkit.org/show_bug.cgi?id=105155
+
+        Reviewed by George Staikos.
+
+        Just enable Video Track for BlackBerry.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-17  János Badics  <jbadics@inf.u-szeged.hu>
+
+        Unreviewed. Added myself to committers.py
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-17  Jonathan Liu  <net147@gmail.com>
+
+        Fix linking of libraries with -Wl,-whole-archive
+        https://bugs.webkit.org/show_bug.cgi?id=104436
+
+        Reviewed by Simon Hausmann.
+
+        If there is more than one library in LIBS linked with
+        -Wl,-whole-archive -l... -Wl,-no-whole-archive, qmake tries to
+        merge the duplicate flags in LIBS which causes linking to fail.
+
+        Add no_smart_library_merge to CONFIG to prevent the duplicate
+        flags from being removed when using -Wl,-whole-archive.
+
+        * qmake/mkspecs/features/functions.prf:
+
+2012-12-16  Arvid Nilsson  <anilsson@rim.com>
+
+        [BlackBerry] Adapt to new BlackBerry::Platform::TouchPoint API
+        https://bugs.webkit.org/show_bug.cgi?id=105143
+        RIM PR 171941
+
+        Reviewed by Rob Buis.
+        Internally reviewed by George Staikos.
+
+        Adapt to new method names and encapsulation of TouchPoint data members.
+
+        * DumpRenderTree/blackberry/EventSender.cpp:
+        (addTouchPointCallback):
+        (updateTouchPointCallback):
+        (touchEndCallback):
+        (releaseTouchPointCallback):
+        (sendTouchEvent):
+
+2012-12-16  Maciej Stachowiak  <mjs@apple.com>
+
+        Add a script to compute the mean and 95% confidence interval (using two-sided t-test) of a sample set
+        https://bugs.webkit.org/show_bug.cgi?id=105148
+
+        Reviewed by Filip Pizlo.
+
+        Usage examples:
+        
+        $ sampstat --help
+        Usage: sampstat [options] [FILES]
+          Compute the mean and 95% confidence interval of a sample set.
+          Standard input or files must contain two or more decimal numbers, one per line.
+        
+        Options:
+          -h, --help            show this help message and exit
+          -u UNIT, --unit=UNIT  assume values are in units of UNIT
+          -v, --verbose         print all values (with units)
+        
+        $ sampstat -u MB memresults.txt
+        2356.90 MB +/- 101.34 MB (4.3%)
+        
+        $ sampstat -v -u MB memresults.txt
+              2318.21 MB
+              2399.56 MB
+              2352.93 MB
+        ----------------
+        Mean: 2356.90 MB +/- 101.34 MB (4.3%)
+        
+
+        * Scripts/sampstat: Added.
+        (sum): Helper function to compute the sum of a list.
+        (arithmeticMean): Compute the meam of a list.
+        (standardDeviation): Compute the sample standard deviation (unbiased estimator).
+        (standardError): Compute the sample standard error.
+        (tDist): Compute t(.025, n-1), the t-value for atwo-sided 95% confidence interval. 
+        (twoSidedConfidenceInterval): Compute the two-sided confidence interval range about the mean.
+
+2012-12-15  Nima Ghanavatian  <nghanavatian@rim.com>
+
+        [BlackBerry] Pass key modifiers with touch and mouse events
+        https://bugs.webkit.org/show_bug.cgi?id=105108
+
+        Reviewed by Rob Buis.
+
+        Update DRT to new api.
+
+        Internally reviewed by Gen Mak.
+
+        * DumpRenderTree/blackberry/EventSender.cpp:
+        (mouseDownCallback):
+        (mouseUpCallback):
+        (mouseMoveToCallback):
+
+2012-12-15  Zan Dobersek  <zandobersek@gmail.com>
+
+        Stop the XvfbDriver before proceeding with its starting setup
+        https://bugs.webkit.org/show_bug.cgi?id=105006
+
+        Reviewed by Philippe Normand.
+
+        Just as with the base Driver implementation, stop the XvfbDriver
+        before proceeding with setting up lock files and a new Xvfb instance.
+        This forces any driver or Xvfb instances that are currently under
+        the driver's control to be closed/killed and cleaned up after.
+
+        * Scripts/webkitpy/layout_tests/port/xvfbdriver.py:
+        (XvfbDriver._start):
+
+2012-12-14  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: make port_name a required parameter to the non-test ports
+        https://bugs.webkit.org/show_bug.cgi?id=105057
+
+        Reviewed by Eric Seidel.
+
+        This is just minor code cleanup along the path to making Port
+        constructors simpler and pushing more logic into the port factory.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.__init__):
+        * Scripts/webkitpy/layout_tests/port/base_unittest.py:
+        (PortTest.make_port):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (TestWebKitPort.__init__):
+        * Scripts/webkitpy/layout_tests/port/test.py:
+        (TestPort):
+        (TestPort.determine_full_port_name):
+        (TestPort.__init__):
+        * Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py:
+        (XvfbDriverTest.make_driver):
+        (XvfbDriverTest.test_stop):
+
+2012-12-14  Dirk Pranke  <dpranke@chromium.org>
+
+        garden-o-matic doesn't know about reftests
+        https://bugs.webkit.org/show_bug.cgi?id=101976
+
+        Reviewed by Eric Seidel.
+
+        Attempt to make garden-o-matic properly aware of reftests again.
+
+        This is re-landing r137407 with a change to
+        rebaselineWithStatusUpdates() to actually pass the filtered
+        failureInofLost to checkout.rebaseline().
+
+        Unfortunately, the testing coverage for this whole module is almost
+        non-existent, and it's not obvious that there's a good way to
+        stub out checkout.rebaseline() to test that the right thing
+        happens. I verified the change manually.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js:
+
+2012-12-14  Ryosuke Niwa  <rniwa@webkit.org>
+
+        "Running 1 DumpRenderTree over X shards" is not a helpful output
+        https://bugs.webkit.org/show_bug.cgi?id=104858
+
+        Reviewed by Dirk Pranke.
+
+        The word "shard" is not typically used in test frameworks. This word is confusing for many WebKit
+        contributors who typically don't have much experience on distributed computations and databases.
+        So only print this message out in the debug mode.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer.print_workers_and_shards):
+
+2012-12-13  Eric Seidel  <eric@webkit.org>
+
+        Add --profiler=PROFILER option to run-perf-tests to allow specifying which profiler to use on platforms with many
+        https://bugs.webkit.org/show_bug.cgi?id=104891
+
+        Reviewed by Ryosuke Niwa.
+
+        I also implemented a very simple "Sample" Profiler using
+        Mac OS X's /usr/bin/sample command line tool.
+
+        The real reason for this abstraction is to make it easy
+        to support both perf and pprof on linux which seem to
+        be about equally popular among those I ask in the Chrome team.
+
+        * Scripts/webkitpy/common/system/profiler.py:
+        (ProfilerFactory.create_profiler):
+        (ProfilerFactory):
+        (ProfilerFactory.available_profilers_by_name):
+        (ProfilerFactory.default_profiler_name):
+        (Sample):
+        (Sample.__init__):
+        (Sample.attach_to_pid):
+        (Sample.profile_after_exit):
+        (IProfiler.attach_to_pid):
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver.__init__):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+
+2012-12-13  Eric Seidel  <eric@webkit.org>
+
+        Unreviewed, fixing typo in python unittest.
+
+        I changed the default profiler on linux from pprof to perf in
+        bug 104971.  I failed to update the unittest results at that time.
+
+        * Scripts/webkitpy/common/system/profiler_unittest.py:
+        (ProfilerFactoryTest.test_basic):
+
+2012-12-13  Ian Vollick  <vollick@chromium.org>
+
+        [chromium] Add a virtual test suite for enabling opt-in to composited scrolling
+        https://bugs.webkit.org/show_bug.cgi?id=104911
+
+        Reviewed by Dirk Pranke.
+
+        Adds two virtual tests suites to run the tests in
+        compositing/overflow/ and scrollbars/ with the flag
+        --enable-accelerated-overflow-scroll, which I've also plumbed through
+        in the usual way.
+
+        * DumpRenderTree/chromium/DumpRenderTree.cpp:
+        (main):
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h:
+        (WebPreferences):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp:
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner::WebPreferences::applyTo):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        (TestShell::resetWebSettings):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::setAcceleratedCompositingForOverflowScrollEnabled):
+        (TestShell):
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort.virtual_test_suites):
+
+2012-12-13  Eric Seidel  <eric@webkit.org>
+
+        Use 'perf' to profile on linux instead of google-pprof by default
+        https://bugs.webkit.org/show_bug.cgi?id=104971
+
+        Reviewed by Dirk Pranke.
+
+        This makes Chromium Linux match Chromium Android and use the perf
+        tool by default.  Once https://bugs.webkit.org/show_bug.cgi?id=104891
+        lands it will be possible to use pprof again on Linux.
+
+        This is slightly more advanced than the AndroidPerf profiler as
+        instead of using a timeout on "perf record" I instead watch
+        for the termination of the target process and then control-C
+        the 'perf record' process.  This required me to add two new
+        methods to Executive, one to have a limited-time wait() and
+        the second to be able to send a control-C.  I chose to add
+        these to Executive to make them easier to mock/fix-for-win32
+        at a later time if needed.
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (Executive.wait_limited):
+        (Executive.interrupt):
+        * Scripts/webkitpy/common/system/profiler.py:
+        (ProfilerFactory.create_profiler):
+        (Perf):
+        (Perf.__init__):
+        (Perf._perf_path):
+        (Perf.attach_to_pid):
+        (Perf._first_ten_lines_of_profile):
+        (Perf.profile_after_exit):
+
+2012-12-13  Julie Parent  <jparent@chromium.org>
+
+        Dashboard cleanup: remove usage of global g_builders.
+        https://bugs.webkit.org/show_bug.cgi?id=104941
+
+        Reviewed by Dirk Pranke.
+
+        The dashboards use a lot of global state, which makes hacking on them
+        complicated. This change removes the use of one such global: g_builders.
+        In most cases, we can just use currentBuilderGroup().builders instead,
+        which is now currentBuilders().
+        Surprisingly, the most changes were required to the unit tests, since
+        they were even bigger offenders of bad hygiene, relying on global state
+        set by other tests, randomly clobbering global variables in ways the
+        real code doesn't, etc.
+
+        * TestResultServer/static-dashboards/builders.js:
+        (BuilderGroup.prototype.setup):
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (.switch.return):
+        (htmlForTestTypeSwitcher):
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (generatePage):
+        (getAllTestsTrie):
+        (processTestRunsForAllBuilders):
+        (showPopupForBuild):
+        (generatePageForExpectationsUpdate):
+        (loadExpectationsLayoutTests):
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        (resetGlobals):
+        (stubResultsByBuilder):
+        (test):
+        * TestResultServer/static-dashboards/loader.js:
+        (.):
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2012-12-13  Eric Seidel  <eric@webkit.org>
+
+        Callers should not have to stringify args before calling Executive run_command/popen
+        https://bugs.webkit.org/show_bug.cgi?id=104975
+
+        Reviewed by Dirk Pranke.
+
+        One could argue that we should match the python call syntax here,
+        but I think it's a more friendly API if we automagically handle
+        stringification of args in run_command, etc.
+        This removes map(unicode, args) from several callsites.
+
+        When I first tried to land this change, I didn't realize that
+        Executive._command_for_printing depended on this behavior
+        having been applied to args in run_command.  The fix is to
+        call _stringify_args in both run_command and popen.
+        This is slightly redundant, but given how short args have to be
+        (due to shell limits), I don't think the double-encode check
+        matters in practice.
+
+        This is slightly complicated by the fact that apache_http_server.py
+        is the one caller in our codebase which uses shell=True.
+        shell=True is a well-documented trail-of-tears:
+        http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess
+        but to support this legacy (windows-only) code (which I can't easily test)
+        I've added an if-hack to avoid stringifying the the popen(shell=True) case.
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (Executive.run_command):
+        (Executive._stringify_args):
+        (Executive.popen):
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+        (ExecutiveTest.test_auto_stringify_args):
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (attach_to_pid):
+
+2012-12-13  Adrienne Walker  <enne@chromium.org>
+
+        Unreviewed, rolling out r137645, r137646, and r137667.
+        http://trac.webkit.org/changeset/137645
+        http://trac.webkit.org/changeset/137646
+        http://trac.webkit.org/changeset/137667
+        https://bugs.webkit.org/show_bug.cgi?id=104911
+
+        Breaks some overflow layout tests
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort.virtual_test_suites):
+
+2012-12-13  Dirk Pranke  <dpranke@chromium.org>
+
+        Unreviewed, rolling out r137661.
+        http://trac.webkit.org/changeset/137661
+        https://bugs.webkit.org/show_bug.cgi?id=104891
+
+        broke unit tests, run-webkit-tests
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (Executive._run_command_with_teed_output):
+        (Executive.run_command):
+        (Executive.popen):
+        * Scripts/webkitpy/common/system/profiler.py:
+        (ProfilerFactory.create_profiler):
+        (GooglePProf.profile_after_exit):
+        (IProfiler.attach_to_pid):
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver.__init__):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+
+2012-12-13  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: move rundetails, summarize_results into test_run_results
+        https://bugs.webkit.org/show_bug.cgi?id=104963
+
+        Reviewed by Eric Seidel.
+
+        More cleanup; this the plain-old-data functions out of manager.py
+        and into test_run_results next to the other aggregate data structures.
+
+        Also this cleans up a bunch of test code and reduces duplication.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.run):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ManagerTest.test_look_for_new_crash_logs):
+        * Scripts/webkitpy/layout_tests/models/test_run_results.py:
+        (TestRunResults.__init__):
+        (TestRunResults.add):
+        (RunDetails):
+        (RunDetails.__init__):
+        (_interpret_test_failures):
+        (summarize_results):
+        * Scripts/webkitpy/layout_tests/models/test_run_results_unittest.py: Added.
+        (get_result):
+        (run_results):
+        (summarized_results):
+        (InterpretTestFailuresTest):
+        (InterpretTestFailuresTest.setUp):
+        (InterpretTestFailuresTest.test_interpret_test_failures):
+        (SummarizedResultsTest):
+        (SummarizedResultsTest.setUp):
+        (SummarizedResultsTest.test_no_svn_revision):
+        (SummarizedResultsTest.test_svn_revision):
+        (SummarizedResultsTest.test_summarized_results_wontfix):
+        * Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py:
+        (BuildBotPrinterTests.get_printer):
+        (BuildBotPrinterTests.test_print_unexpected_results):
+        (BuildBotPrinterTests.test_print_results):
+
+2012-12-13  Eric Seidel  <eric@webkit.org>
+
+        Make --profile output easier to understand for pprof on linux
+        https://bugs.webkit.org/show_bug.cgi?id=104957
+
+        Reviewed by Dirk Pranke.
+
+        pprof is kinda mysterious, so we print some information
+        on how to use it, and how to learn how to read the sample dump.
+        This is similar to what we've done for perf output for Chromium Android.
+
+        * Scripts/webkitpy/common/system/profiler.py:
+        (GooglePProf._pprof_path):
+        (GooglePProf.profile_after_exit):
+
+2012-12-13  Dirk Pranke  <dpranke@chromium.org>
+
+        Revert r137407 - it didn't actually work right.
+        https://bugs.webkit.org/show_bug.cgi?id=101976
+
+        Unreviewed, build fix.
+
+        Turns out that rebaselining was completely broken with this change :(
+        We're passing in a list of test names rather than the list of
+        failureInfo objects.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js:
+
+2012-12-13  Antoine Labour  <piman@chromium.org>
+
+        [chromium] Small fixes for WebPluginContainer::setWebLayer
+        https://bugs.webkit.org/show_bug.cgi?id=104953
+
+        Reviewed by James Robinson.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp: Clean up
+        dangling pointers, force correct invalidation of the layer.
+
+2012-12-13  Eric Seidel  <eric@webkit.org>
+
+        Add --profiler=PROFILER option to run-perf-tests to allow specifying which profiler to use on platforms with many
+        https://bugs.webkit.org/show_bug.cgi?id=104891
+
+        Reviewed by Dirk Pranke.
+
+        I also implemented a very simple "Sample" Profiler using
+        Mac OS X's /usr/bin/sample command line tool.
+
+        I also moved the map(unicode, args) call into Executive.popen
+        so that all callers don't have to do it themselves.
+
+        The real reason for this abstraction is to make it easy
+        to support both perf and pprof on linux which seem to
+        be about equally popular among those I ask in the Chrome team.
+
+        * Scripts/webkitpy/common/system/executive.py:
+        (Executive.popen):
+        * Scripts/webkitpy/common/system/profiler.py:
+        (ProfilerFactory.create_profiler):
+        (ProfilerFactory):
+        (ProfilerFactory.available_profilers_by_name):
+        (ProfilerFactory.default_profiler_name):
+        (Sample):
+        (Sample.__init__):
+        (Sample.attach_to_pid):
+        (Sample.profile_after_exit):
+        (IProfiler.attach_to_pid):
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver.__init__):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+
+2012-12-13  Dirk Pranke  <dpranke@chromium.org>
+
+        support -wk2 port names properly in webkitpy.layout_tests.port
+        https://bugs.webkit.org/show_bug.cgi?id=104761
+
+        Reviewed by Eric Seidel.
+
+        Our support for WK2 port names was inconsistent at best; this patch
+        modifies the code so that <port_name>-wk2 is supported for all ports that
+        have WK2 implementations and is equivalent to specifying <port_name>
+        and -2/--webkit-test-runner. In addition, this modifies
+        builders.all_port_names() to include the wk2 variants.
+
+        * Scripts/webkitpy/common/checkout/baselineoptimizer.py:
+        * Scripts/webkitpy/layout_tests/port/apple.py:
+        (ApplePort.determine_full_port_name):
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.determine_full_port_name):
+        (Port.__init__):
+        * Scripts/webkitpy/layout_tests/port/builders.py:
+        * Scripts/webkitpy/layout_tests/port/driver_unittest.py:
+        (DriverTest.make_port):
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort.default_baseline_search_path):
+        * Scripts/webkitpy/layout_tests/port/win.py:
+        (WinPort.default_baseline_search_path):
+        * Scripts/webkitpy/tool/commands/rebaseline_unittest.py:
+        (TestRebaselineExpectations.test_rebaseline_expectations):
+
+2012-12-13  Ian Vollick  <vollick@chromium.org>
+
+        [chromium] Add a virtual test suite for enabling opt-in to composited scrolling
+        https://bugs.webkit.org/show_bug.cgi?id=104911
+
+        Reviewed by Adrienne Walker.
+
+        Adds two virtual tests suites to run the tests in
+        compositing/overflow/ and scrollbars/ with the flag
+        --enable-accelerated-compositing-for-overflow-scroll
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort.virtual_test_suites):
+
+2012-12-13  Dirk Pranke  <dpranke@chromium.org>
+
+        delete extraneous self.fail in mastercfg_unittest.py
+        https://bugs.webkit.org/show_bug.cgi?id=104940
+
+        Reviewed by Eric Seidel.
+
+        This was accidentally introduced in r137404.
+
+        * BuildSlaveSupport/build.webkit.org-config/mastercfg_unittest.py:
+
+2012-12-13  Dirk Pranke  <dpranke@chromium.org>
+
+        Fix a mis-named variable after r137621.
+        https://bugs.webkit.org/show_bug.cgi?id=104871
+
+        Unreviewed, build fix.
+
+        * Scripts/webkitpy/layout_tests/views/buildbot_results.py:
+        (BuildBotPrinter.print_results):
+        * Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py:
+
+2012-12-13  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: rename ResultSummary
+        https://bugs.webkit.org/show_bug.cgi?id=104871
+
+        Reviewed by Eric Seidel.
+
+        This patch changes the names of ResultSummary and related modules,
+        classes, and variables as a part of the larger clean up in bug 103824.
+
+        This change is basically a bunch of search and replaces:
+        - result_summary.py -> test_run_results.py
+        - class ResultSummary -> class TestRunResults
+        - "result_summary" or "rs" as a generic variable name -> "run_results",
+          when it doesn't matter (or we don't know) if this refers to the
+          initial pass over the tests or the retry pass.
+        - "result_summary" as a variable containing the results of the initial,
+          complete test run -> "initial_results"
+        - "retry_summary" as a variable containing the results of retried
+          results -> "retry_results"
+        - ResultSummary.results (the property) -> TestRunResults.results_by_name
+        - ResultSummary.failures (the property) -> TestRunResults.failures_by_name
+        - RunDetails.result_summary -> RunDetails.initial_results
+        - RunDetails.retry_summary -> RunDetails.retry_results
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (LayoutTestRunner.__init__):
+        (LayoutTestRunner.run_tests):
+        (LayoutTestRunner._mark_interrupted_tests_as_skipped):
+        (LayoutTestRunner._interrupt_if_at_failure_limits):
+        (LayoutTestRunner._interrupt_if_at_failure_limits.interrupt_if_at_failure_limit):
+        (LayoutTestRunner._update_summary_with_result):
+        (LayoutTestRunner._handle_finished_test):
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        (FakePrinter.print_expected):
+        (LayoutTestRunnerTests.test_interrupt_if_at_failure_limits):
+        (LayoutTestRunnerTests.test_update_summary_with_result):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (RunDetails.__init__):
+        (summarize_results):
+        (Manager.run):
+        (Manager._look_for_new_crash_logs):
+        (Manager._tests_to_retry):
+        (Manager._upload_json_files):
+        (Manager._stats_trie):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ManagerTest.test_look_for_new_crash_logs):
+        (SummarizeResultsTest):
+        (SummarizeResultsTest.get_run_results):
+        (SummarizeResultsTest.summarized_results):
+        * Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py:
+        (JSONLayoutResultsGenerator.__init__):
+        (JSONLayoutResultsGenerator._get_modifier_char):
+        (JSONLayoutResultsGenerator._insert_failure_summaries):
+        (JSONLayoutResultsGenerator._get_failure_summary_entry):
+        * Scripts/webkitpy/layout_tests/models/test_run_results.py: Renamed from Tools/Scripts/webkitpy/layout_tests/models/result_summary.py.
+        (TestRunResults):
+        (TestRunResults.__init__):
+        (TestRunResults.add):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (get_test_results):
+        (MainTest.test_basic):
+        * Scripts/webkitpy/layout_tests/views/buildbot_results.py:
+        (BuildBotPrinter.print_results):
+        (BuildBotPrinter.print_run_results):
+        (BuildBotPrinter._print_run_results_entry):
+        * Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py:
+        (BuildBotPrinterTests.get_run_results):
+        (BuildBotPrinterTests.test_print_unexpected_results.get_unexpected_results):
+        (BuildBotPrinterTests):
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer.print_expected):
+        (Printer._print_expected_results_of_type):
+        (Printer.print_results):
+        (Printer._print_timing_statistics):
+        (Printer._print_worker_statistics):
+        (Printer._print_aggregate_test_statistics):
+        (Printer._print_individual_test_times):
+        (Printer._print_directory_timings):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+
+2012-12-13  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [EFL] The WebKit2 bots are building and executing WebKit1 tests
+        https://bugs.webkit.org/show_bug.cgi?id=104690
+
+        Reviewed by Csaba Osztrogonác.
+
+        Pass --no-webkit1 option to the EFL WK2 bots when building. This
+        will disable WK1 API and thus, the WK1 API tests.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (CompileWebKit2Only):
+        (BuildAndTestFactory):
+        (BuildAndTestFactory.__init__):
+        (BuildAndTestWebKit2OnlyFactory):
+        Now bots using BuildAndTestWebKit2OnlyFactory (for instance only EFL) will
+        get --no-webkit1 as a parameter on the build-webkit script.
+        * Scripts/build-webkit:
+        Added support for -no-webkit1 for the Qt and EFL port.
+
+2012-12-13  Eric Seidel  <eric@webkit.org>
+
+        build-webkit --chromium-android forces Make even when update-webkit used --ninja
+        https://bugs.webkit.org/show_bug.cgi?id=104839
+
+        Reviewed by Tony Chang.
+
+        This was recommended by Peter as part of:
+        https://bugs.webkit.org/show_bug.cgi?id=104434#c4
+        Fixing this makes build-webkit --chromium-android work for the common (ninja) case.
+
+        * Scripts/webkitdirs.pm:
+        (buildChromium):
+
+2012-12-13  Julie Parent  <jparent@chromium.org>
+
+        Loader_unittests should reset state between runs.
+        https://bugs.webkit.org/show_bug.cgi?id=104862
+
+        Reviewed by Dirk Pranke.
+
+        The loader_unittests were not resetting state between runs, leaving
+        a lot of data behind in global objects that the dashboard and tests
+        rely on.  A handful were resetting just a few objects.  Use the common
+        resetGlobals() method instead.
+
+        * TestResultServer/static-dashboards/loader_unittests.js:
+
+2012-12-13  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt][WK2] Fix painting on Mac with retina display
+        https://bugs.webkit.org/show_bug.cgi?id=104574
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Remove setting the devicePixelRatio experimental property
+        since the value is now automatically picked up from Qt.
+
+        * MiniBrowser/qt/qml/BrowserWindow.qml:
+
+2012-12-13  Jussi Kukkonen  <jussi.kukkonen@intel.com>
+
+        [EFL][GTK] Don't call deprecated g_type_init when glib => 2.35
+        https://bugs.webkit.org/show_bug.cgi?id=103209
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        g_type_init() is deprecated from 2.35.0 onwards. Don't call it
+        in that case to avoid warnings and/or build failure.
+
+        * DumpRenderTree/gtk/ImageDiff.cpp:
+        (main):
+
+2012-12-13  Claudio Saavedra  <csaavedra@igalia.com>
+
+        [Tools] Add exception for gtk_style_context_get()
+        https://bugs.webkit.org/show_bug.cgi?id=104896
+
+        Reviewed by Martin Robinson.
+
+        Add new exception for gtk_style_context_get().
+
+        * Scripts/webkitpy/style/checkers/cpp.py:
+        (check_for_null): Add exception for gtk_style_context_get().
+        * Scripts/webkitpy/style/checkers/cpp_unittest.py:
+        (WebKitStyleTest.test_null_false_zero): Add a unit
+        test for the new exception.
+
+2012-12-13  Joaquim Rocha  <jrocha@igalia.com>
+
+        REGRESSION (r137432): The /webkit2/WebKitCookieManager/accept-policy unit test is failing
+        https://bugs.webkit.org/show_bug.cgi?id=104790
+
+        Reviewed by Carlos Garcia Campos.
+
+        Unskip the GTK accept policy test.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner):
+
+2012-12-13  Xingnan Wang  <xingnan.wang@intel.com>
+
+        Unreviewed. Adding myself to committers list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-12  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Fix typo in NRWT.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.is_reference_html_file):
+
+2012-12-12  Roger Fong  <roger_fong@apple.com>
+
+        Fix detection of ref test files in old and new run webkit tests.
+        https://bugs.webkit.org/show_bug.cgi?id=104850.
+
+        Reviewed by Timothy Horton.
+
+        * Scripts/old-run-webkit-tests:
+        (isUsedInReftest): 
+        Add notref and ref prefix and suffix cases to isUsedinReftest.
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port):
+        (Port.is_reference_html_file): 
+        Typo in NRWT.
+
+2012-12-12  Dirk Pranke  <dpranke@chromium.org>
+
+        rework ChromiumAndroidDriver.start() et. al to avoid funky layering
+        https://bugs.webkit.org/show_bug.cgi?id=104856
+
+        Reviewed by Eric Seidel.
+
+        r137523 / bug 10357 introduced some back-and-forth hopping during
+        driver.start() in the chromium android port. This patch cleans it
+        up a bit.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidDriver.__init__):
+        (ChromiumAndroidDriver._start_once):
+        * Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py:
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver.start):
+        (Driver._start):
+
+2012-12-12  Eric Seidel  <eric@webkit.org>
+
+        Add support for run-perf-tests --chromium-android --profile
+        https://bugs.webkit.org/show_bug.cgi?id=103587
+
+        Reviewed by Dirk Pranke.
+
+        This makes it possible to profile PerformanceTests on an Android device
+        using run-perf-tests --chromium-android --profile.
+        CPU profiling on Android is sadly non-trivial, but this goes a long
+        ways towards making it more accessible to non-Android developers.
+
+        Although this script requires your device to be flashed with a
+        userdebug build (an annoyingly non-trivial endeavor for external contributors)
+        it endeavors to detect and explain the common errors encountered
+        while trying to setup a device for perf-based profiling.
+
+        * Scripts/webkitpy/common/system/profiler.py:
+        (GooglePProf.profile_after_exit): Discovered that pprof will just hang if passed a missing file.
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (AndroidPerf):
+        (AndroidPerf.__init__):
+        (AndroidPerf.check_configuration):
+        (AndroidPerf.print_setup_instructions):
+        (_file_exists_on_device):
+        (_run_adb_command):
+        (attach_to_pid):
+        (_perf_version_string):
+        (_find_perfhost_binary):
+        (_perfhost_path):
+        (_first_ten_lines_of_profile):
+        (profile_after_exit):
+        (ChromiumAndroidDriver.__init__):
+        (ChromiumAndroidDriver.__init__.methods):
+        (ChromiumAndroidDriver._find_or_create_symfs):
+        (ChromiumAndroidDriver._start_once):
+        (ChromiumAndroidDriver):
+        (ChromiumAndroidDriver._run_post_start_tasks):
+        (ChromiumAndroidDriver._pid_from_android_ps_output):
+        (ChromiumAndroidDriver._pid_on_target):
+        * Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py:
+        (ChromiumAndroidDriverTest.test_pid_from_android_ps_output):
+        (AndroidPerfTest):
+        (AndroidPerfTest.test_perf_output_regexp):
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver._setup_environ_for_driver):
+        (Driver):
+        (Driver._start):
+        (Driver._run_post_start_tasks):
+        (Driver._pid_on_target):
+
+2012-12-12  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: remove deprecated ORWT compatibility command line flags
+        https://bugs.webkit.org/show_bug.cgi?id=104301
+
+        Reviewed by Eric Seidel.
+
+        The command line flags for --noshow-results, --[no-]launch-safari,
+        and --use-remote-links-to-tests were for compatibility with
+        old-run-webkit-tests, but the compatibility is not needed any more
+        since NRWT is basically default and the scripts that passed the
+        old flags have been updated.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (_set_up_derived_options):
+        (parse_args):
+
+2012-12-12  John Griggs  <jgriggs@rim.com>
+
+        2012-12-12  John Griggs  <jgriggs@rim.com>
+
+        [BlackBerry] Update Media Controls
+        https://bugs.webkit.org/show_bug.cgi?id=104443
+        https://przilla.ott.qnx.com/bugzilla/show_bug.cgi?id=204748
+
+        Update Media Controls for BlackBerry platform to allow audio, embedded video and fullscreen video controls to be positioned and styled differently.
+
+        Reviewed by Rob Buis.
+
+        BlackBerry-specific update to Media Controls - No new tests required.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-12  Justin Novosad  <junov@google.com>
+
+        Adding myself to SkiaGraphics watchlist
+
+        Unreviewed
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-12-12  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Add authentication support to DRT and fix exposed issues in the libsoup backend
+        https://bugs.webkit.org/show_bug.cgi?id=104285
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Add support to DumpRenderTree for running authentication tests. Since the DRT
+        expects an authentication callback, we add one to DRTSupport to avoid #ifdefs
+        in platform-independent code for GTK+.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues): Reset the authentication password and username.
+        (authenticationCallback): Added.
+        (createWebView): Attach the authentiation callback during startup.
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        (soupURIToKURL): soup_uri_to_string does not preserve passwords embedded
+        in the URL so we add a somewhat messy method of re-adding them when they exist.
+        It would be nice to use soupURIToKURL here, but it seems we cannot use KURL without
+        pulling in lots of WebCore code so we use string search and replace.
+        (TestRunner::queueLoad): Use the new helper.
+
+2012-12-12  Dirk Pranke  <dpranke@chromium.org>
+
+        garden-o-matic should prefer efl/ over efl-wk1/ and efl-wk2/ when rebaselining
+        https://bugs.webkit.org/show_bug.cgi?id=102389
+
+        Reviewed by Tony Chang.
+
+        The code wasn't aware of both the efl-wk1 and efl-wk2 variants,
+        because all_port_names() by itself doesn't tell you about the
+        variants. Work around this for now, and filed bug 104761 to
+        address the underlying problem.
+
+        * Scripts/webkitpy/common/checkout/baselineoptimizer.py:
+        * Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py:
+        (BaselineOptimizerTest.test_efl):
+
+2012-12-12  Krzysztof Czech  <k.czech@samsung.com>
+
+        [EFL] Possibility to turn off accessibility feature for WebKit-EFL.
+        https://bugs.webkit.org/show_bug.cgi?id=103036
+
+        Reviewed by Laszlo Gombos.
+
+        Guard dependencies for accessibility (ATK), so that they can be turned off.
+
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * WebKitTestRunner/PlatformEfl.cmake:
+
+2012-12-12  Simon Fraser  <simon.fraser@apple.com>
+
+        Add some entries in the watchlist, and register me for them.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-12-12  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Web Inspector: Native Memory Instrumentation: remove fake root MemoryObjectInfo.
+        https://bugs.webkit.org/show_bug.cgi?id=104796
+
+        Reviewed by Yury Semikhatsky.
+
+        It was not a good idea to introduce a fake root MemoryObjectInfo.
+        It makes a problem when we visit an object without its own MemoryObjectType.
+
+        Example: RenderBox has a global pointer to a hash map.
+        HashMap doesn't have its own object type because it is a generic container.
+        It will inherit object type from the fake root memory object info.
+        The same could happen for another container in another class with other MemoryObjectType.
+
+        This fact forces me to create custom process method for root objects
+        because they need to have their own MemoryObjectInfo with customisable memory object type.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+        Drive by fix: InstrumentedPointer* was replaced with Wrapper* because actually it is using
+        for instrumented and not instrumented object classes.
+
+2012-12-12  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Remove the last of unnecessary configuration options in configure.ac
+        https://bugs.webkit.org/show_bug.cgi?id=104793
+
+        Reviewed by Martin Robinson.
+
+        Removing the filters and indexed database features from the list of features
+        being configurable through the configure script. This is not the case anymore
+        as the corresponding configuration options are being removed.
+
+        * Scripts/webkitdirs.pm:
+        (buildAutotoolsProject):
+
+2012-12-12  Mario Sanchez Prada  <mario@webkit.org>
+
+        [GTK][WK2] New API to detect display/execution of insecure content
+        https://bugs.webkit.org/show_bug.cgi?id=104578
+
+        Reviewed by Martin Robinson.
+
+        Add coding style exception for 'readability/enum_casing' in GTK.
+
+        The GTK+ API use upper case, underscore separated, words in
+        certain types of enums (e.g. signals, properties).
+
+        * Scripts/webkitpy/style/checker.py: Added exception, both for
+        WebKitGTK+ and WebKit2GTK+.
+
+2012-12-12  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] Fix build on chromium-win
+
+        Unreviewed build-fix.
+
+        MSVS indeed doesn't have snprintf, adding wtf/StringExtras.h include
+        to work around that.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp:
+
+2012-12-12  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Fix build on Mac
+
+        Reviewed by Csaba Osztrogonác.
+
+        On Mac OS X we have sqlite as a system library available.
+
+        * qmake/mkspecs/features/features.prf:
+
+2012-12-12  Zan Dobersek  <zandobersek@gmail.com>
+
+        Unreviewed GTK gardening.
+
+        Skipping another unit test that regressed in r137432.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner):
+
+2012-12-12  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Fix linkage against SQLite
+        https://bugs.webkit.org/show_bug.cgi?id=104781
+
+        Reviewed by Csaba Osztrogonác.
+
+        Detect SQLite either through pkg-config, from the SQLITE3SRCDIR
+        environment variable or from qtbase via a qt5.git build. Bail out early
+        with an error message if neither option applies.
+
+        This removes the usage of $$QT.core.sources and the dependency on Qt's
+        system-sqlite configure setting. We should always favour a system
+        library over a copy in Qt.
+
+        * qmake/mkspecs/features/features.prf:
+
+2012-12-12  Tommy Widenflycht  <tommyw@google.com>
+
+        MediaStream API: Change the data channel descriptor pattern to a handler pattern
+        https://bugs.webkit.org/show_bug.cgi?id=104543
+
+        Reviewed by Kent Tamura.
+
+        Adding mocks to be able to test this refactoring.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/MockWebRTCDataChannelHandler.cpp: Added.
+        (DataChannelReadyStateTask):
+        (DataChannelReadyStateTask::DataChannelReadyStateTask):
+        (MockWebRTCDataChannelHandler::MockWebRTCDataChannelHandler):
+        (MockWebRTCDataChannelHandler::setClient):
+        (MockWebRTCDataChannelHandler::bufferedAmount):
+        (MockWebRTCDataChannelHandler::sendStringData):
+        (MockWebRTCDataChannelHandler::sendRawData):
+        (MockWebRTCDataChannelHandler::close):
+        * DumpRenderTree/chromium/MockWebRTCDataChannelHandler.h: Added.
+        (MockWebRTCDataChannelHandler):
+        (MockWebRTCDataChannelHandler::taskList):
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (RTCPeerConnectionReadyStateTask::RTCPeerConnectionReadyStateTask):
+        (RemoteDataChannelTask::RemoteDataChannelTask):
+        (MockWebRTCPeerConnectionHandler::createDataChannel):
+        (MockWebRTCPeerConnectionHandler::stop):
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h:
+        (MockWebRTCPeerConnectionHandler):
+
+2012-12-12  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] WebTestPlugin must not depend on WTF::String
+        https://bugs.webkit.org/show_bug.cgi?id=104783
+
+        Reviewed by Kent Tamura.
+
+        In a component build, we can't access the WTF that is part of the
+        WebKit component. Accessing WTF instead will pull in a separate copy
+        into the TestRunner library. Instead of WTF::String::number use
+        snprintf() to print numbers.
+
+        * DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp:
+
+2012-12-12  Jocelyn Turcotte  <jocelyn.turcotte@digia.com>
+
+        [Qt] Do not automatically enable force_static_libs_as_shared when using debug_and_release
+        https://bugs.webkit.org/show_bug.cgi?id=104562
+
+        Reviewed by Tor Arne Vestbø.
+
+        force_static_libs_as_shared creates issues on Mac if QtWebKit is built as a framework.
+        QtWebProcess, for example, will link to the framework's release library and will rely
+        on DYLD_IMAGE_SUFFIX to switch to the debug build. Since QtWebProcess will also links
+        directly to the debug build of WebCore, and that QtWebKit release will link in the
+        release build of WebCore, both the debug and release version will be loaded.
+
+        To fix this properly we should make sure that applications always link to the release
+        build of dependent libraries by bypassing resolveFinalLibraryName.
+        Disable it for now as force_static_libs_as_shared is mainly for development while
+        debug_and_release is mainly for production builds.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2012-12-12  Zan Dobersek  <zandobersek@gmail.com>
+
+        Unreviewed GTK gardening of the unit tests.
+
+        Skip two unit tests that regressed during the hackfest.
+
+        * Scripts/run-gtk-tests:
+        (TestRunner):
+
+2012-12-11  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Add Koji Ishii to the list of contributors.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-11  Dominic Mazzoni  <dmazzoni@google.com>
+
+        AX: Make isActionSupported cross-platform.
+        https://bugs.webkit.org/show_bug.cgi?id=104681
+
+        Reviewed by Chris Fleizach.
+
+        Replace isActionSupported, which takes a platform-specific
+        argument, with three cross-platform methods.
+
+        * DumpRenderTree/AccessibilityUIElement.cpp:
+        (isPressActionSupportedCallback):
+        (isIncrementActionSupportedCallback):
+        (isDecrementActionSupportedCallback):
+        (AccessibilityUIElement::getJSClass):
+        * DumpRenderTree/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * DumpRenderTree/blackberry/AccessibilityUIElementBlackBerry.cpp:
+        (AccessibilityUIElement::isPressActionSupported):
+        (AccessibilityUIElement::isIncrementActionSupported):
+        (AccessibilityUIElement::isDecrementActionSupported):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner::AccessibilityUIElement::AccessibilityUIElement):
+        (WebTestRunner::AccessibilityUIElement::isPressActionSupportedCallback):
+        (WebTestRunner):
+        (WebTestRunner::AccessibilityUIElement::isIncrementActionSupportedCallback):
+        (WebTestRunner::AccessibilityUIElement::isDecrementActionSupportedCallback):
+        (WebTestRunner::AccessibilityUIElement::incrementCallback):
+        (WebTestRunner::AccessibilityUIElement::decrementCallback):
+        (WebTestRunner::AccessibilityUIElement::pressCallback):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (AccessibilityUIElement):
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::isPressActionSupported):
+        (AccessibilityUIElement::isIncrementActionSupported):
+        (AccessibilityUIElement::isDecrementActionSupported):
+        * DumpRenderTree/mac/AccessibilityUIElementMac.mm:
+        (AccessibilityUIElement::isPressActionSupported):
+        (AccessibilityUIElement::isIncrementActionSupported):
+        (AccessibilityUIElement::isDecrementActionSupported):
+        * DumpRenderTree/win/AccessibilityUIElementWin.cpp:
+        (AccessibilityUIElement::isPressActionSupported):
+        (AccessibilityUIElement::isIncrementActionSupported):
+        (AccessibilityUIElement::isDecrementActionSupported):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
+        (WTR::AccessibilityUIElement::isPressActionSupported):
+        (WTR::AccessibilityUIElement::isIncrementActionSupported):
+        (WTR::AccessibilityUIElement::isDecrementActionSupported):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
+        (WTR::AccessibilityUIElement::isPressActionSupported):
+        (WTR):
+        (WTR::AccessibilityUIElement::isIncrementActionSupported):
+        (WTR::AccessibilityUIElement::isDecrementActionSupported):
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: remove result_summary.total_tests_by_expectation
+        https://bugs.webkit.org/show_bug.cgi?id=104756
+
+        Reviewed by Eric Seidel.
+
+        This field wasn't being used by anything.
+
+        * Scripts/webkitpy/layout_tests/models/result_summary.py:
+        (ResultSummary.__init__):
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        garden-o-matic doesn't know about reftests
+        https://bugs.webkit.org/show_bug.cgi?id=101976
+
+        Reviewed by Ojan Vafai.
+
+        This is a first attempt at fixing this, sort of a "stop-the-bleeding"
+        fix. We will now look at the list of tests we're asked to rebaseline,
+        and log which ones are reftests into the status area, and rebaseline
+        the rest.
+
+        Longer-term, we should display feedback in the results area based on
+        which tests we're looking at. If the test list contains no reftests,
+        we should behave as today; if the list is all reftest, we should
+        probably disable the button, and if the list is a mix, we should
+        probably display an alert next to the button or something. It would
+        also be nice to annotate which tests were reftests, maybe with a
+        "(reftest)" next to the test name or something.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js:
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        REGRESSION(r133380): new tests without expected file reported as failing tests on the bots
+        https://bugs.webkit.org/show_bug.cgi?id=101469
+
+        Reviewed by Ryosuke Niwa.
+
+        Fix parsing of NRWT's output to identify missing results separately
+        from other regressions.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunWebKitTests._parseNewRunWebKitTestsOutput):
+        * BuildSlaveSupport/build.webkit.org-config/mastercfg_unittest.py:
+        (MasterCfgTest.test_nrwt_leaks_parsing):
+        (test_nrwt_missing_results):
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        buildbot: change run-webkit-tests --no-launch-safari to --no-show-results
+        https://bugs.webkit.org/show_bug.cgi?id=104299
+
+        Reviewed by Ryosuke Niwa.
+
+        Since --no-show-results is the more generically-named flag that NRWT uses.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunWebKitTests):
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        remove --use-remote-links-to-tests from buildbot configs (except apple win)
+        https://bugs.webkit.org/show_bug.cgi?id=104291
+
+        Reviewed by Csaba Osztrogonác.
+
+        This flag is ignored by NRWT and was just implemented for compatibility.
+        ORWT still uses it, though.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunWebKitTests):
+        (RunWebKitTests.start):
+
+2012-12-11  Anders Carlsson  <andersca@apple.com>
+
+        ASSERT running platform/mac/plugins/convert-point.html on the WK2 bots
+        https://bugs.webkit.org/show_bug.cgi?id=104735
+
+        Reviewed by Jon Honeycutt.
+
+        Do the testing from within NPP_New instead of NPN_SetWindow. Plug-ins aren't supposed to do any real work inside NPP_SetWindow,
+        and doing so will more easily trigger the assertion failure. Ideally we should get rid of the initial sync painting pass, but this
+        gets the test passing again!
+
+        * DumpRenderTree/TestNetscapePlugIn/Tests/mac/ConvertPoint.cpp:
+        (ConvertPoint::NPP_New):
+
+2012-12-11  Julie Parent  <jparent@chromium.org>
+
+        Dashboard unit tests should not make xhrs.
+        https://bugs.webkit.org/show_bug.cgi?id=104598
+
+        Reviewed by Dirk Pranke.
+
+        The unit test were requesting 25 files that they did not use.
+        Stub out loader.request to avoid making the xhrs.
+        Result: order of magnitude speed improvement in test run time (from ~1600ms to 160ms on my machine).
+        
+        * TestResultServer/static-dashboards/run-embedded-unittests.html:
+        * TestResultServer/static-dashboards/run-unittests.html:
+
+2012-12-11  Filip Pizlo  <fpizlo@apple.com>
+
+        Profiler should show bytecode dumps as they would have been visible to the JITs, including the profiling data that the JITs would see
+        https://bugs.webkit.org/show_bug.cgi?id=104647
+
+        Reviewed by Oliver Hunt.
+
+        Added a "profiling" (or "p") command to show the profiling data that the JITs saw
+        for each JIT compilation of a code block.
+        
+        Also added instruction counts in the "full" display and made the "full" display the
+        default thing you see.
+
+        * Scripts/display-profiler-output:
+
+2012-12-11  Eric Seidel  <eric@webkit.org>
+
+        Unreviewed, rolling out r137371.
+        http://trac.webkit.org/changeset/137371
+        https://bugs.webkit.org/show_bug.cgi?id=104434
+
+        Various scripts are not ready for out/ as the build directory,
+        this can't work as written.
+
+        * Scripts/update-webkit:
+        * Scripts/webkitdirs.pm:
+        (buildChromium):
+
+2012-12-11  Zan Dobersek  <zandobersek@gmail.com>
+
+        Unreviewed GTK build functionality fix.
+
+        Turns out the CSP feature was not enabled, that's why all the tests were failing.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-11  Eric Seidel  <eric@webkit.org>
+
+        Make Ninja the default build system for build-webkit --chromium
+        https://bugs.webkit.org/show_bug.cgi?id=104434
+
+        Reviewed by Daniel Bates.
+
+        As far as I can tell, most Chromium developers are now using Ninja
+        as their default build system instead of the native Xcode/Visual Studio/Make.
+        This change makes Ninja the default for developers as well as all Chromium webkit bots.
+
+        Developers can pass --no-ninja to get the platform-native buildsystem instead of Ninja.
+        It's possible we may wish to make this a per-platform default, and have
+        Ninja only be the default for Mac/Linux.
+
+        There was a thread on webkit-dev discussing this change:
+        http://lists.webkit.org/pipermail/webkit-dev/2012-December/023113.html
+
+        * Scripts/update-webkit:
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: record the order and run times of all of the tests in a single file
+        https://bugs.webkit.org/show_bug.cgi?id=104184
+
+        Reviewed by Ryosuke Niwa.
+
+        Replace the N tests_run*.txt files that we output into
+        layout-test-results with a single packed JSON trie that contains
+        the test ordering and run statistics. This can eventually be uploaded
+        to the TestResultsServer to replace the times.json file we currently
+        upload as well, and will let us replay the results of a previous
+        run fairly deterministically.
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (Worker.__init__):
+        (Worker.start):
+        (Worker._run_test):
+        (Worker.stop):
+        (Worker._clean_up_after_test):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._upload_json_files):
+        (Manager._copy_results_html_file):
+        (Manager):
+        (Manager._stats_trie):
+        (Manager._stats_trie._worker_number):
+        * Scripts/webkitpy/layout_tests/models/test_results.py:
+        (TestResult.__init__):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (MainTest.test_missing_and_unexpected_results):
+        (MainTest.test_retrying_and_flaky_tests):
+        (EndToEndTest.test_end_to_end):
+        (EndToEndTest.test_reftest_with_two_notrefs):
+        (RebaselineTest.test_reset_results):
+        (RebaselineTest.test_missing_results):
+        (RebaselineTest.test_new_baseline):
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        check-webkit-style complaining about TestExpectations lines a patch didn't modify
+        https://bugs.webkit.org/show_bug.cgi?id=104687
+
+        Reviewed by Ojan Vafai.
+
+        Way back in bug 60466 / r86165, we changed the style checker
+        for TestExpectations to ensure that the entire file linted, not
+        just the lines modified by a patch, in order to ensure that a
+        new line didn't cause errors elsewhere in the file (e.g., by
+        introducing duplicate lines). At the time, errors in the
+        expectations files were fatal and we didn't have a separate step
+        on the bots that would lint the files to ensure things were still
+        okay, so this was probably the right thing to do, but it could
+        cause some patches to fail the style check even though the patches
+        themselves were fine.
+
+        However, now errors aren't always fatal, and we have a separate build
+        step to lint the files. So, we should probably not punish the
+        patches and the style checker should filter out "unrelated" errors.
+
+        In theory we should be comparing the output pre- and post-patch
+        to filter out pre-existing errors, but I don't think the style
+        checker has that ability.
+
+        * Scripts/webkitpy/style/checkers/test_expectations.py:
+        (TestExpectationsChecker.__init__):
+        * Scripts/webkitpy/style/checkers/test_expectations_unittest.py:
+        (TestExpectationsTestCase.assert_lines_lint):
+
+2012-12-11  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt isn't rejecting unrecognized expectations
+        https://bugs.webkit.org/show_bug.cgi?id=104701
+
+        Reviewed by Ojan Vafai.
+
+        NRWT is silently ignoring unrecognized expectations like "Text"
+        and "Audio" (largely because I haven't fully removed support for
+        the old syntax and keywords and restructured the code to do the
+        proper checking). Temporarily change the tokenizer to reject
+        unrecognized expectations until I can make those changes.
+
+        * Scripts/webkitpy/layout_tests/models/test_expectations.py:
+        (TestExpectationParser._tokenize_line):
+        * Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py:
+        (ExpectationSyntaxTests.test_unknown_expectation):
+        (TestExpectationSerializationTests.disabled_test_string_whitespace_stripping):
+
+2012-12-11  Martin Robinson  <mrobinson@igalia.com>
+
+        Fix a typo in my previous commit that is causing test failures.
+
+        Reviewed by Gustavo Noronha Silva.
+
+        There was an extra bit of statement appended after the end of a conditional. Somehow
+        this compiled and caused test failures.
+
+        * DumpRenderTree/gtk/EventSender.cpp:
+        (continuousMouseScrollByCallback):
+
+2012-12-11  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Spurious stderr output from the event sender
+        https://bugs.webkit.org/show_bug.cgi?id=104678
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Eliminate some spurious stderr output from the EventSender by using an early return
+        instead of an assertion that prints a warning to the console.
+
+        * DumpRenderTree/gtk/EventSender.cpp:
+        (continuousMouseScrollByCallback): We don't support continuous scroll events that
+        move by page, but we should just fail silently instead of printing an error.
+
+2012-12-11  Joone Hur  <joone.hur@intel.com>
+
+        [GTK] Add GraphicsLayerActor
+        https://bugs.webkit.org/show_bug.cgi?id=91940
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Add GraphicsLayerActor to the list of classes that contain GObjects
+        in the style checker script so that it does not complain about GObject
+        coding style.
+
+        * Scripts/webkitpy/style/checker.py:
+
+2012-12-11  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
+
+        [Qt] remove hack which avoids unused .obj directories all over the place
+
+        Reviewed by Simon Hausmann.
+
+        The feature is subject to upstreaming in Qt itself in
+        https://codereview.qt-project.org/#change,42011
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2012-12-11  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
+
+        [Qt] move SQLITE3SRCDIR assignment to only use site
+
+        Reviewed by Simon Hausmann.
+
+        Target.pri includes WebCore.pri the almost first thing, so that is
+        covered as well.
+
+        * qmake/mkspecs/features/default_pre.prf:
+
+2012-12-11  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
+
+        [Qt] delete dead include paths
+
+        Reviewed by Simon Hausmann.
+
+        followup to https://bugs.webkit.org/show_bug.cgi?id=93446
+
+        * DumpRenderTree/qt/DumpRenderTree.pro:
+
+2012-12-11  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Implement some missing FrameLoaderClient message in DRT
+        https://bugs.webkit.org/show_bug.cgi?id=104444
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Install a FrameLoadEvent callback that prints the necessary output for some
+        missing FrameLoader events.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (frameLoadEventCallback): Added.
+        (createWebView): Install the FrameLoader event callback.
+
+2012-12-11  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
+
+        [Qt] change setup of QMAKE_MOC
+
+        Reviewed by Simon Hausmann.
+
+        don't load(moc) explicitly - turns out that this breaks
+        debug_and_release builds (the feature does not like being loaded before
+        default_post has been loaded).
+        so instead just do a minimal call to find the moc executable.
+
+        as it's in fact only two files which need it, so de-centralize this call
+        for the sake of saving some cpu cycles spent in qmake.
+
+        * WebKitTestRunner/InjectedBundle/DerivedSources.pri:
+        * qmake/mkspecs/features/default_pre.prf:
+
+2012-12-11  Jocelyn Turcotte  <jocelyn.turcotte@digia.com>
+
+        [Qt] Fix the linking of debug builds on Mac with force_static_libs_as_shared
+        https://bugs.webkit.org/show_bug.cgi?id=104559
+
+        Reviewed by Tor Arne Vestbø.
+
+        "contains(libraries, $$TARGET): return(true)" fails for intermediate libraries since
+        at this point TARGET may contain the "_debug" suffix.
+
+        Fix it by moving the TARGET adjustment later in the file.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2012-12-11  Martin Robinson  <mrobinson@igalia.com>
+
+        [Coverity] [GTK] Remove some redundant null checks in DumpRenderTree
+        https://bugs.webkit.org/show_bug.cgi?id=104570
+
+        Reviewed by Daniel Bates.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (descriptionSuitableForTestResult): Remove a redundant null check.
+
+2012-12-11  Alberto Garcia  <agarcia@igalia.com>
+
+        Remove unused GErrors
+        https://bugs.webkit.org/show_bug.cgi?id=104657
+
+        Reviewed by Martin Robinson.
+
+        Replace unused GErrors with null pointers.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (initializeFonts):
+        * DumpRenderTree/gtk/EditingCallbacks.cpp:
+        (dumpRange):
+        * WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp:
+        (WTR::inititializeFontConfigSetting):
+
+2012-12-11  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Bump the jhbuild libsoup version to fix an authentication issue
+        https://bugs.webkit.org/show_bug.cgi?id=104448
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Bump the libsoup version to one from the git repository. This requires updating
+        GLib as well which in turn requires adjusting the CFLAGS we pass when compiling
+        the scanobj step of the gtkdoc generation.
+
+        * gtk/generate-gtkdoc:
+        * gtk/jhbuild.modules:
+
+2012-12-11  Zan Dobersek  <zandobersek@gmail.com>
+
+        Unreviewed functionality fix for the GTK port.
+
+        Enable the MicroData feature support for the GTK port in the FeatureList module.
+        This feature listing now again affects which features are enabled and which disabled
+        on the development builds of the GTK port.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-11  Jinwoo Song  <jinwoo7.song@samsung.com>
+
+        [EFL][WK2] MiniBrowser is not built
+        https://bugs.webkit.org/show_bug.cgi?id=104629
+
+        Reviewed by Gyuyoung Kim.
+
+        As we are finding an elementary package in Tools/MiniBrowser/efl/CMakeList.txt since r137203,
+        we need to check if the package is found in the same place not in the Tools/CMakeList.txt.
+
+        * CMakeLists.txt:
+        * MiniBrowser/efl/CMakeLists.txt:
+
+2012-12-11  Xabier Rodriguez Calvar  <calvaris@igalia.com>
+
+        [GTK][jhbuild] Switch to GStreamer 1.0 build
+        https://bugs.webkit.org/show_bug.cgi?id=91727
+
+        Reviewed by Philippe Normand.
+
+        Switch build-webkit --gtk to GStreamer 1.0 support and build the
+        necessary GStreamer git modules from JHBuild.
+
+        * gtk/jhbuild.modules: Added GStreamer 1.0.3 build support.
+
+2012-12-11  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Feature enabling/disabling should be possible through build-webkit
+        https://bugs.webkit.org/show_bug.cgi?id=99271
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Refactor the code in webkitdirs.pm that builds an autotools project to generate
+        autogen.sh arguments, make arguments and installation prefix from the passed-in
+        parameters rather than generating all of that in build-webkit. The autogen.sh
+        arguments now contain only enable/disable flags for options that are actually
+        configurable in configure.ac, the flag value actually reflecting whether the feature
+        is enabled or disabled in the feature list.
+
+        Other features are overridable through modifying the GNUmakefile.features.am file.
+        All these features are now stored in the build directory and upon change trigger
+        a rerun of the autogen.sh script, pretty much like the autogen.sh arguments do.
+
+        The override-feature-defines script is called by autogen.sh, before GNUmakefile.in is
+        generated when calling autoreconf. Its task is to copy the GNUmakefile.features.am.in
+        into GNUmakefile.features.am and modify it if there's a text file in the build directory
+        that contains all the feature defines the build-webkit script has written. If the build
+        is not done through build-webkit (and there's no file in build directory listing all the
+        feature defines) the script does not advance further from copying.
+
+        This approach is taken to overcome the rigidness of the automake system as it's impossible
+        to effectively generate and use GNUmakefile.features.am or even GNUmakefile.features file
+        after the autoreconf command execution in autogen.sh.
+
+        * Scripts/build-jsc:
+        (buildMyProject):
+        * Scripts/build-webkit:
+        * Scripts/webkitdirs.pm:
+        (runAutogenForAutotoolsProjectIfNecessary):
+        (mustReRunAutogen):
+        (buildAutotoolsProject):
+        (buildGtkProject):
+        * Scripts/webkitperl/FeatureList.pm: Update the features that are currently enabled in
+        Source/WebCore/GNUmakefile.features.am.in but aren't in the feature list.
+        * Scripts/webkitpy/style/checker.py: Source/WebCore/GNUmakefile.features.am.in is recognized
+        as a text file and tabulation errors are reported. Skip the file to suppress them.
+        * gtk/override-feature-defines: Added.
+        (copy_feature_defines_makefile):
+        (adjust_feature_defines_makefile):
+        (adjust_feature_defines_makefile.override_feature_define):
+        (override_feature_defines):
+
+2012-12-10  Yury Semikhatsky  <yurys@chromium.org>
+
+        Memory instrumentation: make sure each edge is reported only once
+        https://bugs.webkit.org/show_bug.cgi?id=104630
+
+        Reviewed by Pavel Feldman.
+
+        Test that outgoing edges are reported only once if we come to the same
+        object twice: first by an address of a base class and then by a real address
+        of the object.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+2012-12-10  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Remove WebCompositorOutputSurface implementations from DRT
+        https://bugs.webkit.org/show_bug.cgi?id=104046
+
+        Reviewed by Darin Fisher.
+
+        The classes are now provided through WebCompositorSupport.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createOutputSurface):
+        * DumpRenderTree/chromium/WebViewHostOutputSurface.cpp: Removed.
+        * DumpRenderTree/chromium/WebViewHostOutputSurface.h: Removed.
+        * DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.cpp: Removed.
+        * DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.h: Removed.
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        change --no-launch-safari to --no-show-results in scripts
+        https://bugs.webkit.org/show_bug.cgi?id=104298
+
+        Reviewed by Eric Seidel.
+
+        Since Safari only exists on the Apple ports, NRWT calls the
+        command line flag --[no-]show-results instead. This updates
+        the scripts to use the new flag (but not the buildbot config yet).
+
+        * Scripts/generate-coverage-data:
+        * Scripts/webkit-tools-completion.sh:
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: fix mapping of AUDIO onto FAIL when printing unexpected results
+        https://bugs.webkit.org/show_bug.cgi?id=104597
+
+        Reviewed by Ojan Vafai.
+
+        This was broken in the recent printer refactoring.
+
+        * Scripts/webkitpy/layout_tests/views/buildbot_results.py:
+        (BuildBotPrinter.print_unexpected_results.add_result.is_expected):
+        * Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py:
+        (BuildBotPrinterTests.get_result):
+        (BuildBotPrinterTests.test_print_unexpected_results):
+        (BuildBotPrinterTests.test_print_unexpected_results.get_unexpected_results):
+        (BuildBotPrinterTests):
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        old-run-webkit-tests: add --show-results properly
+        https://bugs.webkit.org/show_bug.cgi?id=104608
+
+        Reviewed by Eric Seidel.
+
+        Rework r137219 / bug 104601 to use the correct perl idiom.
+
+        * Scripts/old-run-webkit-tests:
+
+2012-12-10  Aaron Colwell  <acolwell@chromium.org>
+
+        Unreviewed. Adding Aaron Colwell to the contributor list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-10  Anders Carlsson  <andersca@apple.com>
+
+        Remove WebKit2 tests on Windows
+        https://bugs.webkit.org/show_bug.cgi?id=104607
+
+        Reviewed by Tim Horton.
+
+        Stop building WebKit2 tests and remove associated files.
+
+        * TestWebKitAPI/win/InjectedBundleControllerWin.cpp: Removed.
+        * TestWebKitAPI/win/PlatformUtilitiesWin.cpp: Removed.
+        * TestWebKitAPI/win/PlatformWebViewWin.cpp: Removed.
+        * TestWebKitAPI/win/TestWebKitAPI.sln: Removed.
+        * TestWebKitAPI/win/TestWebKitAPI.vcproj:
+        * TestWebKitAPI/win/TestWebKitAPIGenerated.vcproj: Removed.
+        * TestWebKitAPI/win/TestWebKitAPIGeneratedCommon.vsprops: Removed.
+        * TestWebKitAPI/win/TestWebKitAPIInjectedBundle.vcproj: Removed.
+        * TestWebKitAPI/win/WindowMessageObserver.h: Removed.
+        * TestWebKitAPI/win/copy-resources.cmd: Removed.
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        old-run-webkit-tests: support --no-show-results for compatibility w/ NRWT
+        https://bugs.webkit.org/show_bug.cgi?id=104601
+
+        Reviewed by Eric Siedel.
+
+        This flag is being added so we can move all of the calling scripts
+        over to using --no-show-results instead of --no-launch-safari.
+
+        * Scripts/old-run-webkit-tests:
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: use the default logic for skipping platform-specific tests for chromium
+        https://bugs.webkit.org/show_bug.cgi?id=104403
+
+        Reviewed by Stephen White.
+
+        I thought I had fixed this a while ago, but the chromium port was
+        using custom logic to figure out which platform/* tests to run (or
+        skip) and as a result we were getting some odd behavior (like running
+        tests in chromium-linux on chromium-mac, but only when there was
+        an expectation listed for the test).
+
+        Ports are supposed to only run the tests found under their
+        baseline_search_path() by default.
+
+        Not writing a test for this; theoretically there shouldn't been a
+        test checking that the behavior for Chromium was *different* than
+        the other ports before.
+
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort._missing_symbol_to_skipped_tests):
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        fix regression in test-webkitpy after r137189
+        https://bugs.webkit.org/show_bug.cgi?id=104589
+
+        Reviewed by Eric Seidel.
+
+        Need to specify full port names.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (MainTest.test_build_check):
+
+2012-12-10  Laszlo Gombos  <l.gombos@samsung.com>
+
+        [EFL] Change the minimum required EFL version to 1.6
+        https://bugs.webkit.org/show_bug.cgi?id=104431
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Change the minimum required EFL version to 1.6 from 1.7.
+        The elementary EFL package is only required to build MiniBrowser,
+        so I moved the required only to the Minibrowser CMake file.
+
+        * MiniBrowser/efl/CMakeLists.txt: In addition removed
+        ENABLE_GLIB_SUPPORT as it is obsolete and it was always set to be on.
+
+2012-12-10  Dean Jackson  <dino@apple.com>
+
+        Unreviewed. Adding Antoine to the contributor list so his name autocompletes in bugzilla.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-10  Zan Dobersek  <zandobersek@gmail.com>
+
+        REGRESSION (r118735): svg/dom/complex-svgView-specification.html, svg/dom/SVGViewSpec.html, svg/dom/viewspec-parser.html failing on GTK Linux 64-bit Release
+        https://bugs.webkit.org/show_bug.cgi?id=87734
+
+        Reviewed by Martin Robinson.
+
+        When willSendRequest should return null in testing, cancel the SoupMessage
+        instead of setting the request's URI to about:blank.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (willSendRequestCallback):
+
+2012-12-10  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] Move the test implementation of WebKit::WebPlugin to the TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=104537
+
+        Reviewed by Tony Chang.
+
+        In order to hide implementation details from the public TestRunner API,
+        I moved the plugin to WebTestPluginImpl and added a static create
+        method to WebTestPlugin. Also, I renamed the plugin from TestWebPlugin
+        to WebTestPlugin to be more in line with other classes in the
+        TestRunner API.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/TestRunner/public/WebTestPlugin.h: Added.
+        (WebTestRunner):
+        (WebTestPlugin):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestPlugin.cpp: Renamed from Tools/DumpRenderTree/chromium/TestWebPlugin.cpp.
+        (WebTestRunner::WebTestPlugin::create):
+        (WebTestRunner):
+        (WebTestRunner::WebTestPlugin::WebTestPlugin):
+        (WebTestRunner::WebTestPlugin::~WebTestPlugin):
+        (WebTestRunner::WebTestPlugin::mimeType):
+        * DumpRenderTree/chromium/TestWebPlugin.h: Removed.
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createPlugin):
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        run_webkit_tests throws exception when DRT is not present
+        https://bugs.webkit.org/show_bug.cgi?id=104565
+
+        Reviewed by Jochen Eisinger.
+
+        Don't actually try to print the bot results if there aren't
+        any because we exited before running any tests.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (main):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (MainTest.test_build_check):
+
+2012-12-10  Benjamin Poulain  <benjamin@webkit.org>
+
+        Add convenience methods to use ListHashSet for a LRU cache
+        https://bugs.webkit.org/show_bug.cgi?id=104499
+
+        Reviewed by Sam Weinig.
+
+        Test the new methods added to ListHashSet.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/GNUmakefile.am:
+        * TestWebKitAPI/TestWebKitAPI.gypi:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WTF/ListHashSet.cpp: Added.
+        (TestWebKitAPI):
+        (TestWebKitAPI::TEST):
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        webkit-patch print-expectations doesn't work right for platforms w/ shared expectations
+        https://bugs.webkit.org/show_bug.cgi?id=104405
+
+        Reviewed by Eric Seidel.
+
+        If multiple ports shared a TestExpectations file, webkit-patch
+        print-expectations would use the expectation for the first port
+        using that file and print the result for all ports, rather than
+        re-parse and print each port separately (e.g., we might print
+        the chromium-linux expectation for a file for both chromium-linux
+        and chromium-mac). Discovered while testing/debugging the fix
+        for bug 104403.
+
+        * Scripts/webkitpy/layout_tests/port/test.py:
+        (TestPort._skipped_tests_for_unsupported_features):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (lint):
+        * Scripts/webkitpy/tool/commands/queries.py:
+        (PrintExpectations._model):
+        * Scripts/webkitpy/tool/commands/queries_unittest.py:
+        (PrintExpectationsTest.test_platform):
+
+2012-12-10  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: fix total number of tests computed in the result summary
+        https://bugs.webkit.org/show_bug.cgi?id=104061
+
+        Reviewed by Jochen Eisinger.
+
+        Good thing I left this open, because I actually broke it again
+        the same way in a merge. Fix the computation of the one_line_summary
+        again, and add tests for it (also clean up some redundant tests).
+
+        Also, add constants into the test port code so that the knowledge
+        of how many tests should fail and how is next to the list of tests,
+        rather than a totally different place.
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (LayoutTestRunner.run_tests):
+        * Scripts/webkitpy/layout_tests/port/test.py:
+        (TestList.__getitem__):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (get_test_results):
+        (MainTest.setUp):
+        (MainTest.test_basic):
+        (MainTest.test_run_singly_actually_runs_tests):
+        (MainTest.test_test_list_with_prefix):
+        (MainTest.test_missing_and_unexpected_results_with_custom_exit_code.CustomExitCodePort):
+        (MainTest.test_tolerance.ImageDiffTestPort):
+        (EndToEndTest.parse_full_results):
+
+2012-12-10  Mike West  <mkwst@chromium.org>
+
+        Log to console when script is blocked by sandbox attributes.
+        https://bugs.webkit.org/show_bug.cgi?id=104365
+
+        Reviewed by Ojan Vafai.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest):
+            Ignoring the new console message in perftests, as it broke parsing
+            for the Parser/html-parser.html microbenchmark.
+
+2012-12-10  Filip Pizlo  <fpizlo@apple.com>
+
+        JSC profiling and debug dump code should use inferred names when possible
+        https://bugs.webkit.org/show_bug.cgi?id=104519
+
+        Reviewed by Oliver Hunt.
+
+        The format I'm using for referring to a code block is now name#hash. For example,
+        v8-crypto has something called bnpSquareTo#B5QFbU. The profiler allows you to use
+        either the hash, the inferred name, or the combined hash and full name when referring
+        to blocks.
+
+        * Scripts/display-profiler-output:
+
+2012-12-09  Filip Pizlo  <fpizlo@apple.com>
+
+        Profiler should say things about OSR exits
+        https://bugs.webkit.org/show_bug.cgi?id=104497
+
+        Reviewed by Oliver Hunt.
+
+        Adds support for displaying OSR exit information for full summary (just displays the
+        counts and the number of recompilations), bytecode display (says which bytecodes
+        exited), and DFG display (annotates disassembly with taken OSR exits and their
+        counts).
+
+        * Scripts/display-profiler-output:
+
+2012-12-10  Alexis Menard  <alexis@webkit.org>
+
+        [CSS3 Backgrounds and Borders] Remove CSS3_BACKGROUND feature flag.
+        https://bugs.webkit.org/show_bug.cgi?id=104539
+
+        Reviewed by Antonio Gomes.
+
+        As discussed on webkit-dev it is not needed to keep this feature flag 
+        as support for <position> type is a small feature that is already 
+        implemented by three other UAs. It was useful while landing this 
+        feature as partial bits were landed one after one.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2012-12-10  Martin Robinson  <mrobinson@igalia.com>
+
+        Build fix.
+
+        Add a patchfile missing from my previous commit.
+
+        * gtk/patches/harfbuzz-icu-detection-fix.patch: Added.
+
+2012-12-10  Martin Robinson  <mrobinson@igalia.com>
+
+        REGRESSION(137127): Causes assertion failures on the debug bots
+        https://bugs.webkit.org/show_bug.cgi?id=104549
+
+        Reviewed by Alejandro G. Castro.
+
+        After handling the new TextOutput message we should return the method
+        handling messages received.
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle): Fix a missing early return.
+
+2012-12-09  Gustavo Noronha Silva  <gustavo.noronha@collabora.com>
+
+        [Soup] utilize multipart/x-mixed-replace support recently added to libsoup
+        https://bugs.webkit.org/show_bug.cgi?id=94515
+
+        Reviewed by Martin Robinson.
+
+        This change requires a very recent libsoup, so update our jhbuild
+        requirements.
+
+        * gtk/jhbuild.modules: depend on soup version that adds the multipart/x-mixed-replace
+        support
+        * efl/jhbuild.modules: ditto
+
+2012-12-10  Zoltan Nyul  <zoltan.nyul@intel.com>
+
+        Implement testRunner.setViewModeMediaFeature() in WebKitTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=103886
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Implement testRunner.setViewModeMediaFeature() in WebKitTestRunner.
+        This API is required by layout tests.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setViewModeMediaFeature):
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2012-12-10  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Bring Harfbuzz-ng support to Gtk
+        https://bugs.webkit.org/show_bug.cgi?id=92098
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Add HarfBuzz dependency.
+
+        * GNUmakefile.am: Add FreeType/HarfBuzz CFLAGS to the WebCore Internals library.
+        * gtk/jhbuild.modules: Add HarfBuzz to the JHbuild and remove Pango, since it
+        should no longer affect layout test results.
+
+2012-12-10  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Use QLibraryInfo::LibraryExecutablesPath unconditionally
+        https://bugs.webkit.org/show_bug.cgi?id=104541
+
+        Reviewed by Jocelyn Turcotte.
+
+        We now depend on a Qt 5 version that is guaranteed to have this API, so we
+        can remove the configure checks for it.
+
+        * qmake/config.tests/libexecdir/libexecdir.cpp: Removed.
+        * qmake/config.tests/libexecdir/libexecdir.pro: Removed.
+        * qmake/mkspecs/features/features.prf:
+
+2012-12-10  Víctor Manuel Jáquez Leal  <vjaquez@igalia.com>
+
+        REGRESSION(r135863): GtkLauncher --help no longer displays all help options
+        https://bugs.webkit.org/show_bug.cgi?id=104382
+
+        Reviewed by Philippe Normand.
+
+        Remove gst_init() because it steals the GOptionContext.
+        gst_init_get_option_group() already does the initialization job.
+
+        * GtkLauncher/main.c:
+        (main):
+
+2012-12-10  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK][WTR] Implement AccessibilityUIElement::titleUIElement
+        https://bugs.webkit.org/show_bug.cgi?id=102953
+
+        Reviewed by Martin Robinson.
+
+        Implement AccessibilityUIElement::titleUIElement in the ATK backend
+        in the same manner it is implemented in DumpRenderTree. Both implementations
+        are updated to unref the relation set before the final function return
+        rather than at the end of each loop through the relations held in the said
+        relation set.
+
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::titleUIElement):
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::AccessibilityUIElement::titleUIElement):
+
+2012-12-10  Martin Robinson  <mrobinson@igalia.com>
+
+        Fix the WebKit2 debug build
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle): Fix a typo of WKStringGetTypeID().
+
+2012-12-10  Martin Robinson  <mrobinson@igalia.com>
+
+        [WTR] Move text output accumulation to the UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=104214
+
+        Reviewed by Darin Adler.
+
+        Instead of accumulating text output in the InjectedBundle and then sending it to the UIProcess 
+        once a test is finished, immediately send any text output to the UIProcess. This will allow
+        WebKitTestRunner to output text from the UIProcess as well.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp: Remove the handling of the text output
+        StringBuilder. Add a method to send output to the UIProcess.
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.h:
+        (InjectedBundle):
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: Change code that appends to the StringBuilder
+        to use the new outputText method.
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.h:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp: Ditto.
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp: Ditto.
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::TestInvocation): Intialize the StringBuilder.
+        (WTR::TestInvocation::invoke): Clear the StringBuilder when a new tests starts.
+        (WTR::TestInvocation::dumpResults): m_textOutput is a StringBuilder now so the
+        method of printing the text is slightly different.
+        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle): Handle the new TextOutput
+        message by appending the results to the StringBuilder.
+        * WebKitTestRunner/TestInvocation.h:
+        (TestInvocation): Switch the type of m_textOutput.
+
+2012-12-10  Mihnea Ovidenie  <mihnea@adobe.com>
+
+        Unreviewed. Adding Mihai Maerean to the list of contributors, working on CSSRegions.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-10  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        [GTK] accessibility/language-attribute.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=98369
+
+        Reviewed by Chris Fleizach.
+
+        The test is failing for two reasons: Not exposing the language
+        for accessible objects and AccessibilityUIElement::language() not
+        being implemented.
+
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::language): Implemented.
+
+2012-12-10  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        [GTK] accessibility/editable-webarea-context-menu-point.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=98364
+
+        Reviewed by Chris Fleizach.
+
+        The test is failing because the clickPoint values remain unchanged. The
+        values remain unchanged because ATK lacks a means to keep track of this
+        information.
+
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::clickPointX): Added comment that ATK doesn't have clickPoint details
+        (AccessibilityUIElement::clickPointY): Added comment that ATK doesn't have clickPoint details
+
+2012-12-09  Alejandro Piñeiro  <apinheiro@igalia.com>
+
+        [GTK] lack of implemention of AccessibilityUIElementGtk::isSelectable and AccessibilityUIElementGtk::isMultiSelectable
+        https://bugs.webkit.org/show_bug.cgi?id=104481
+
+        Reviewed by Martin Robinson.
+
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::isSelectable): Implement this by checking
+        the current state of the AtkObject.
+        (AccessibilityUIElement::isMultiSelectable): Implement this by
+        checking the current state of the AtkObject.
+
+2012-12-09  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        [GTK] accessibility/placeholder.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=98373
+
+        Reviewed by Martin Robinson.
+
+        The test was failing because the placeholder text was not supported and
+        AccessibilityUIElement::stringAttributeValue() was not implemented.
+
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (coreAttributeToAtkAttribute): New convenience method to convert WebCore attribute
+        names into AtkObject attribute names
+        (AccessibilityUIElement::stringAttributeValue): implemented
+
+2012-12-09  Dan Winship  <danw@gnome.org>
+
+        [GTK] Bump libxml2 requirement in jhbuild.modules
+        https://bugs.webkit.org/show_bug.cgi?id=104477
+
+        Reviewed by Martin Robinson.
+
+        Fedora 18's Apache depends on symbols in libxml2 2.9.0, so the
+        tests won't run if we only have libxml2 2.8.0 installed in the
+        jhbuild root.
+
+        * gtk/jhbuild.modules:
+
+2012-12-09  Zan Dobersek  <zandobersek@gmail.com>
+
+        Remove testRunner.disableImageLoading()
+        https://bugs.webkit.org/show_bug.cgi?id=98083
+
+        Reviewed by Gustavo Noronha Silva.
+
+        Remove the disableImageLoading methods and callback.
+        No tests use the method anymore and all ports except Wx
+        now support this behavior through overriding the
+        WebKitDisplayImagesKey preference.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        (TestRunner::overridePreference): Add support for overriding the
+        WebKitDisplayImagesKey preference which is now the preferred way
+        of disabling image loading.
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        * DumpRenderTree/qt/TestRunnerQt.h:
+        (TestRunner):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+
+2012-12-09  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        [GTK] accessibility/label-for-control-hittest.html is failing
+        https://bugs.webkit.org/show_bug.cgi?id=98368
+
+        Reviewed by Martin Robinson.
+
+        The test was failing because AccessibilityUIElement::elementAtPoint was
+        not implemented.
+
+        * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp:
+        (AccessibilityUIElement::elementAtPoint): implemented
+
+2012-12-09  Jon Lee  <jonlee@apple.com>
+
+        [WK2] Move button image to injected bundle
+        https://bugs.webkit.org/show_bug.cgi?id=104107
+        <rdar://problem/12813842>
+
+        Reviewed by Simon Fraser.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::InjectedBundlePage): Update the bundle page UI client.
+
+2012-12-08  Halton Huo  <halton.huo@intel.com>
+
+        [CMake] Add CMake style checker
+        https://bugs.webkit.org/show_bug.cgi?id=104240
+
+        Reviewed by Eric Seidel.
+
+        The CMake style checker is followed by existing style checkers like cpp, python.
+        Unit test is added as well.
+
+        * Scripts/webkitpy/style/checker.py: Use CMakeChecker CMAKE type files(.cmake or CMakeLists.txt)
+        (FileType):
+        (CheckerDispatcher._file_type):
+        (CheckerDispatcher._create_checker):
+        * Scripts/webkitpy/style/checkers/cmake.py: Added.
+        (CMakeChecker):
+        (CMakeChecker.__init__): 
+        (CMakeChecker.check):
+        (CMakeChecker._process_line):
+        (CMakeChecker._check_trailing_whitespace):
+        (CMakeChecker._check_no_space_cmds):
+        (CMakeChecker._check_one_space_cmds):
+        (CMakeChecker._check_non_lowercase_cmd):
+        (CMakeChecker._check_indent):
+        * Scripts/webkitpy/style/checkers/cmake_unittest.py: Added.
+        (CMakeCheckerTest):
+        (CMakeCheckerTest.test_init):
+        (CMakeCheckerTest.test_init._mock_handle_style_error):
+        (CMakeCheckerTest.test_check):
+        (CMakeCheckerTest.test_check._mock_handle_style_error):
+
+2012-12-08  Kondapally Kalyan  <kalyan.kondapally@intel.com>
+
+        [EFL] Enable WebGL by default.
+        https://bugs.webkit.org/show_bug.cgi?id=102991.
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Enable WebGL by default.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-07  Scott Violet  <sky@chromium.org>
+
+        [chromium] Remove linux theme related files and switch to default
+        https://bugs.webkit.org/show_bug.cgi?id=103897
+
+        Reviewed by Dimitri Glazkov.
+
+        * Scripts/webkitpy/common/config/build_unittest.py:
+        (ShouldBuildTest): linux->default
+
+2012-12-07  Mike Lattanzio  <mlattanzio@rim.com>
+
+        [BlackBerry] Update BlackBerry Port to use new Graphics::createBuffer BufferType enum values.
+        https://bugs.webkit.org/show_bug.cgi?id=104121
+
+        Reviewed by Rob Buis.
+
+        Update createBuffer call to reflect new BufferType enum.
+        Internal PR 254649
+        Internal Review: Jakob Petsovits
+
+        DRT is always backed for maximum compatibility.
+
+        * DumpRenderTree/blackberry/PixelDumpSupportBlackBerry.cpp:
+        (createBitmapContextFromWebView):
+
+2012-12-07  Jochen Eisinger  <jochen@chromium.org>
+
+        Add 'CHROMIUM_DEVEL_SANDBOX' to the environment variables to copy for layout test drivers
+        https://bugs.webkit.org/show_bug.cgi?id=104355
+
+        Reviewed by Dirk Pranke.
+
+        This enables chromium's content_shell driver to run with the full SUID
+        sandbox.
+
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.to.setup_environ_for_server):
+
+2012-12-07  KyungTae Kim  <ktf.kim@samsung.com>
+
+        [EFL] Fix tools for WebKit2-only builds
+        https://bugs.webkit.org/show_bug.cgi?id=103904
+
+        Reviewed by Laszlo Gombos.
+
+        The libewebkit2.so should be used for library path for EFL WebKit2.
+
+        * Scripts/webkitdirs.pm:
+        (builtDylibPathForName):
+
+2012-12-07  Xiaobo Wang  <xbwang@torchmobile.com.cn>
+
+        [BlackBerry] DRT - Update implementation of TestRunner.setCustomPolicyDelegate()
+        https://bugs.webkit.org/show_bug.cgi?id=104243
+
+        RIM PR 259337
+
+        Reviewed by Rob Buis.
+
+        1. Implement calculation of navigation originating in
+        didDecidePolicyForNavigationAction().
+        2. Implement policy delegate for resource response.
+        3. Enable customPolicyDelegate if waitForPolicyDelegate() is called.
+        4. Minor optional updates in dump() and dumpFrameLoadCallbacks().
+
+        The patch fixed the following tests:
+        - http/tests/download
+        - fast/forms/mailto/formenctype-attribute-button-html.html
+        - fast/forms/mailto/formenctype-attribute-input-html.html
+        - fast/encoding/mailto-always-utf-8.html
+
+        * DumpRenderTree/blackberry/DumpRenderTree.cpp:
+        (BlackBerry::WebKit::DumpRenderTree::DumpRenderTree):
+        (BlackBerry::WebKit::DumpRenderTree::resetToConsistentStateBeforeTesting):
+        (BlackBerry::WebKit::DumpRenderTree::dump):
+        (BlackBerry::WebKit::DumpRenderTree::didFinishLoadForFrame):
+        (BlackBerry::WebKit::DumpRenderTree::didDecidePolicyForNavigationAction):
+        (BlackBerry::WebKit::DumpRenderTree::didDecidePolicyForResponse):
+        (BlackBerry::WebKit::DumpRenderTree::setCustomPolicyDelegate):
+        * DumpRenderTree/blackberry/DumpRenderTreeBlackBerry.h:
+        (DumpRenderTree):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        (TestRunner::setCustomPolicyDelegate):
+        (TestRunner::waitForPolicyDelegate):
+        (TestRunner::overridePreference):
+
+2012-12-07  Gwang Yoon Hwang  <ryumiel@company100.net>
+
+        [Qt] Adjust library name in layout_tests/port/qt.py after Qt5-r40
+        https://bugs.webkit.org/show_bug.cgi?id=104348
+
+        Reviewed by Csaba Osztrogonác.
+
+        After Qt-5.0.0-r40, the library was renamed from QtWebKitWidgets to
+        Qt5WebKitWidgets. run-webkit-tests were still looking for QtWebKitWidgets
+
+        * Scripts/webkitpy/layout_tests/port/qt.py:
+        (QtPort._path_to_webcore_library):
+
+2012-12-07  Csaba Osztrogonác  <ossy@webkit.org>
+
+        Unreviewed fix, unbreak run-launcher after library renaming.
+
+        * Scripts/webkitdirs.pm:
+        (builtDylibPathForName):
+
+2012-12-06  Csaba Osztrogonác  <ossy@webkit.org>
+
+        Unreviewed fix after r136896, unbreak --debug-rwt to make bots result verbose again.
+        https://bugs.webkit.org/show_bug.cgi?id=104296
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (main):
+
+2012-12-06  Rick Byers  <rbyers@chromium.org>
+
+        CSS cursor property should support webkit-image-set
+        https://bugs.webkit.org/show_bug.cgi?id=99493
+
+        Reviewed by Beth Dakin.
+
+        Add ENABLE_MOUSE_CURSOR_SCALE - disabled by default
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2012-12-06  Vivek Galatage  <vivek.vg@samsung.com>
+
+        Unreviewed. Fixing the email address order to work correctly with bugzilla.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-06  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] when forwarding events through the WebPluginContainer, create a UserGestureIndicator if processing a user gesture
+        https://bugs.webkit.org/show_bug.cgi?id=104306
+
+        Reviewed by Dimitri Glazkov.
+
+        * DumpRenderTree/chromium/TestWebPlugin.cpp:
+        (TestWebPlugin::TestWebPlugin):
+        (TestWebPlugin::handleInputEvent): add support for printing the user gesture status
+        * DumpRenderTree/chromium/TestWebPlugin.h:
+        (TestWebPlugin):
+
+2012-12-06  Dirk Pranke  <dpranke@chromium.org>
+
+        new-run-webkit-tests --lint-test-files seems to be broken
+        https://bugs.webkit.org/show_bug.cgi?id=104296
+
+        Unreviewed, build fix.
+
+        My recent refactoring caused me to not initialize the printer
+        before calling lint(); this patch restructures the code to make
+        the lint routine self-contained and do all the work necessary.
+        This will also make it easier to move this code out into a standalone
+        file.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (lint):
+        (main):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (LintTest.test_all_configurations):
+        (LintTest.test_lint_test_files):
+        (LintTest.test_lint_test_files__errors):
+
+2012-12-05  Filip Pizlo  <fpizlo@apple.com>
+
+        DFG profiler should be helpful about gem installation
+        https://bugs.webkit.org/show_bug.cgi?id=104217
+
+        Reviewed by Oliver Hunt.
+        
+        'json' and 'highline' are not installed by default on the ruby distributions with
+        which I am familiar, and the default error messages don't make me happy. This makes
+        display-profiler-output print a helpful message if those gems are not found.
+
+        * Scripts/display-profiler-output:
+
+2012-12-05  Filip Pizlo  <fpizlo@apple.com>
+
+        Profiler should print a helpful message if you pass the wrong arguments
+        https://bugs.webkit.org/show_bug.cgi?id=104222
+
+        Reviewed by Oliver Hunt.
+
+        * Scripts/display-profiler-output:
+
+2012-12-06  Ojan Vafai  <ojan@chromium.org>
+
+        Allow for CCing a secondary email address from watchlists
+        https://bugs.webkit.org/show_bug.cgi?id=104286
+
+        Reviewed by Dirk Pranke.
+
+        Change my watchlist CC address so I can filter these separately from
+        when people explicitly CC me and update the watchlist parser to allow that.
+
+        * Scripts/webkitpy/common/config/committers.py:
+        * Scripts/webkitpy/common/config/watchlist:
+        * Scripts/webkitpy/common/watchlist/watchlistparser.py:
+        (WatchListParser._validate):
+        * Scripts/webkitpy/common/watchlist/watchlistparser_unittest.py:
+        (WatchListParserTest.test_cc_rule_with_invalid_email):
+        (WatchListParserTest.test_cc_rule_with_secondary_email):
+
+2012-12-06  Max Vujovic  <mvujovic@adobe.com>
+
+        Unreviewed. Add myself to committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-06  Yael Aharon  <yael.aharon@intel.com>
+
+        [EFL] [WK2] fast/dom/vertical-scrollbar-in-rtl.html makes fast/regions tests flaky
+        https://bugs.webkit.org/show_bug.cgi?id=104139
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Resize the window back to 800x600 between tests.
+        This should be a no-op if the test did not resize the window.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::resetStateToConsistentValues):
+
+2012-12-06  Tommy Widenflycht  <tommyw@google.com>
+
+        Speech Recognition API: Change the error code to a string on SpeechRecognitionError
+        https://bugs.webkit.org/show_bug.cgi?id=104254
+
+        Reviewed by Adam Barth.
+
+        Changes the mock error function to take a string instead of an int.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::setMockSpeechRecognitionError):
+        * DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp:
+        (WebTestRunner::ErrorTask::ErrorTask):
+        (MockWebSpeechRecognizer::setError):
+        * DumpRenderTree/chromium/MockWebSpeechRecognizer.h:
+        (MockWebSpeechRecognizer):
+
+2012-12-06  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt][Mac] Fix libxslt and libxml2 config tests
+        https://bugs.webkit.org/show_bug.cgi?id=104164
+
+        Reviewed by Simon Hausmann.
+
+        We should not use pkg-config on Mac instead use direct include
+        paths and add needed libraries to the linker options to detect
+        libxslt and libxml2 provided by the system.
+        Previously we would always fall back to qtxmlpatterns.
+
+        * qmake/config.tests/libxml2/libxml2.pro:
+        * qmake/config.tests/libxslt/libxslt.pro:
+
+2012-12-06  Csaba Osztrogonác  <ossy@webkit.org>
+
+        [Qt] Fix the build if the path contains "+" character
+        https://bugs.webkit.org/show_bug.cgi?id=104120
+
+        Reviewed by Tor Arne Vestbø.
+
+        The second parameter of qmake's replace() is regular expression, so
+        we have to escape special characters in paths passed to replace().
+
+        * qmake/mkspecs/features/default_post.prf:
+        * qmake/mkspecs/features/default_pre.prf:
+        * qmake/mkspecs/features/functions.prf:
+
+2012-12-06  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r136825.
+        http://trac.webkit.org/changeset/136825
+        https://bugs.webkit.org/show_bug.cgi?id=104251
+
+        It made 100+ test fail on Qt-WK2 pixel bot, and 1800+ test
+        flakey on Qt-WK2 non-pixel bot (Requested by Ossy on #webkit).
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::resetStateToConsistentValues):
+
+2012-12-06  Yael Aharon  <yael.aharon@intel.com>
+
+        [EFL] [WK2] fast/dom/vertical-scrollbar-in-rtl.html makes fast/regions tests flaky
+        https://bugs.webkit.org/show_bug.cgi?id=104139
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Resize the window back to 800x600 between tests.
+        This should be a no-op if the test did not resize the window.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::resetStateToConsistentValues):
+
+2012-12-06  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r136784 and r136802.
+        http://trac.webkit.org/changeset/136784
+        http://trac.webkit.org/changeset/136802
+        https://bugs.webkit.org/show_bug.cgi?id=104231
+
+        breaks chromium canary (Requested by morrita on #webkit).
+
+        * Scripts/webkitpy/common/config/build_unittest.py:
+        (ShouldBuildTest):
+
+2012-12-05  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Add myself to watch changes in PerformanceTests/*.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-12-05  Shinya Kawanaka  <shinyak@chromium.org>
+
+        [Chromium] DRT on Windows crashes when a testcase has a progress element in indeterminate state
+        https://bugs.webkit.org/show_bug.cgi?id=102459
+
+        Reviewed by Dimitri Glazkov.
+
+        Since WebThemeControlDRTWin::markState does not consider indeterminate state, DRT caused a crash.
+
+        * DumpRenderTree/chromium/WebThemeControlDRTWin.cpp:
+        (WebThemeControlDRTWin::markState):
+
+2012-12-05  Filip Pizlo  <fpizlo@apple.com>
+
+        DFG profiler should be able to display where a code block was inlined into, and what it inlined
+        https://bugs.webkit.org/show_bug.cgi?id=104216
+
+        Reviewed by Oliver Hunt.
+
+        Added an "inlines" command that shows the inline stacks that a code block participated
+        in. Also cleaned up some of the ways we print compilation units.
+
+        * Scripts/display-profiler-output:
+
+2012-12-05  Halton Huo  <halton.huo@intel.com>
+
+        [CMake] Unify coding style for CMake files
+        https://bugs.webkit.org/show_bug.cgi?id=103605
+
+        Reviewed by Laszlo Gombos.
+
+        Update cmake files(.cmake, CMakeLists.txt) with following style rules:
+        1. Indentation
+        1.1 Use spaces, not tabs.
+        1.2 Four spaces as indent.
+        2. Spacing
+        2.1 Place one space between control statements and their parentheses.
+            For eg, if (), else (), elseif (), endif (), foreach (),
+            endforeach (), while (), endwhile (), break ().
+        2.2 Do not place spaces between function and macro statements and
+            their parentheses. For eg, macro(), endmacro(), function(),
+            endfunction().
+        2.3 Do not place spaces between a command or function or macro and its
+            parentheses, or between a parenthesis and its content. For eg,
+            message("testing") not message( "testing") or message ("testing" )
+        2.4 No space at line ending.
+        3. Lowercase when call commands macros and functions. For eg,
+           add_executable() not ADD_EXECUTABLE(), set() not SET().
+
+        * CMakeLists.txt:
+        * DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt:
+        * DumpRenderTree/efl/CMakeLists.txt:
+        * EWebLauncher/CMakeLists.txt:
+        * EWebLauncher/ControlTheme/CMakeLists.txt:
+        * MiniBrowser/efl/CMakeLists.txt:
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/PlatformEfl.cmake:
+        * WebKitTestRunner/CMakeLists.txt:
+        * WebKitTestRunner/PlatformEfl.cmake:
+        * WinCELauncher/CMakeLists.txt:
+        * clang/ReportMemoryUsagePlugin/CMakeLists.txt:
+
+2012-12-05  Scott Violet  <sky@chromium.org>
+
+        [chromium] Remove linux theme related files and switch to default
+        https://bugs.webkit.org/show_bug.cgi?id=103897
+
+        Reviewed by Tony Chang.
+
+        * Scripts/webkitpy/common/config/build_unittest.py:
+        (ShouldBuildTest): linux->default
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: run_webkit_tests_integrationtest.py depends on being able to share a port w/ between master and worker
+        https://bugs.webkit.org/show_bug.cgi?id=78168
+
+        Reviewed by Ojan Vafai.
+
+        This patch adds a single ordered list to ResultSummary that contains
+        the results of every test run in order of result received, and
+        modifies the TestResults class to contain the list of references used
+        for each test as well as the pid of the driver; this allows us to stop
+        having to override the test drivers to record the tests, and makes the
+        integration tests that test rdering, retries, restarts, etc. black-box
+        tests.
+
+        * Scripts/webkitpy/layout_tests/controllers/single_test_runner.py:
+        (SingleTestRunner._run_rebaseline):
+        (SingleTestRunner._compare_output):
+        (SingleTestRunner._run_reftest):
+        (SingleTestRunner._compare_output_with_reference):
+        * Scripts/webkitpy/layout_tests/models/result_summary.py:
+        (ResultSummary.__init__):
+        (ResultSummary.add):
+        * Scripts/webkitpy/layout_tests/models/test_results.py:
+        (TestResult.__init__):
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (DriverOutput.__init__):
+        (Driver.run_test):
+        * Scripts/webkitpy/layout_tests/port/test.py:
+        (TestDriver):
+        (TestDriver.__init__):
+        (TestDriver.run_test):
+        (TestDriver.stop):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (get_tests_run):
+        (get_test_batches):
+        (get_test_results):
+        (MainTest.test_batch_size):
+        (MainTest.test_dryrun):
+        (MainTest.test_natural_order):
+        (MainTest.test_natural_order_test_specified_multiple_times):
+        (MainTest.test_random_order):
+        (MainTest.test_random_order_test_specified_multiple_times):
+        (MainTest.test_no_order):
+        (MainTest.test_no_order_test_specified_multiple_times):
+        (MainTest.test_no_order_with_directory_entries_in_natural_order):
+        (MainTest.test_repeat_each):
+        (MainTest.test_ignore_flag):
+        (MainTest.test_skipped_flag):
+        (MainTest.test_iterations):
+        (MainTest.test_run_chunk):
+        (MainTest.test_run_part):
+        (MainTest.test_run_singly):
+        (MainTest.test_skip_failing_tests):
+        (MainTest.test_single_file):
+        (MainTest.test_single_file_with_prefix):
+        (MainTest.test_single_skipped_file):
+        (MainTest.test_test_list):
+        (MainTest.test_test_list_with_prefix):
+        (MainTest.test_exit_after_n_failures):
+        (MainTest.test_exit_after_n_crashes):
+        (MainTest.test_run_order__inline):
+        (MainTest.test_reftest_run):
+        (MainTest.test_reftest_run_reftests_if_pixel_tests_are_disabled):
+        (MainTest.test_reftest_skip_reftests_if_no_ref_tests):
+        (MainTest.test_reftest_expected_html_should_be_ignored):
+        (MainTest.test_reftest_driver_should_run_expected_html):
+        (MainTest.test_reftest_driver_should_run_expected_mismatch_html):
+        (MainTest.test_no_http_tests):
+        (MainTest.test_platform_tests_are_found):
+
+2012-12-05  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Make WebCompositorOutputSurface an empty class when USE_CC_OUTPUT_SURFACE is defined.
+        https://bugs.webkit.org/show_bug.cgi?id=103967
+
+        Reviewed by James Robinson.
+
+        Use the WebCompositorSupport methods to create an OutputSurface. If they
+        fail, then fall back to the WebViewHost methods.
+
+        Once the chromium side lands, the WebCompositorSupport methods will stop
+        failing, and will replace the WebViewHost ones.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createOutputSurface):
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: split all of the buildbot-specific output into its own file
+        https://bugs.webkit.org/show_bug.cgi?id=104165
+
+        Reviewed by Ojan Vafai.
+
+        Now that we have the RunDetails object we can move all of the
+        buildbot-specific knowledge out of the core test-running code
+        and into the outermost run_webkit_tests layer.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (run):
+        (main):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (passing_run):
+        (logging_run):
+        (run_and_capture):
+        (MainTest.test_all):
+        (MainTest.test_max_locked_shards):
+        (MainTest.test_child_processes_2):
+        (MainTest.test_child_processes_min):
+        (MainTest.test_full_results_html):
+        (MainTest.test_hung_thread):
+        (MainTest.test_keyboard_interrupt):
+        (MainTest.test_no_tests_found):
+        (MainTest.test_no_tests_found_2):
+        (MainTest.test_repeat_each_iterations_num_tests):
+        (MainTest.test_run_singly_actually_runs_tests):
+        (MainTest.test_test_list):
+        (MainTest.test_unexpected_failures):
+        (MainTest.test_missing_and_unexpected_results):
+        (MainTest.test_pixel_test_directories):
+        (MainTest.test_missing_and_unexpected_results_with_custom_exit_code):
+        (MainTest.test_crash_with_stderr):
+        (MainTest.test_no_image_failure_with_image_diff):
+        (MainTest.test_crash_log):
+        (MainTest.test_web_process_crash_log):
+        (MainTest.test_exit_after_n_failures_upload):
+        (MainTest.test_results_directory_absolute):
+        (MainTest.test_results_directory_default):
+        (MainTest.test_results_directory_relative):
+        (MainTest.test_retrying_and_flaky_tests):
+        (MainTest.test_reftest_should_not_use_naming_convention_if_not_listed_in_reftestlist):
+        (MainTest.test_output_diffs):
+        (MainTest.test_unsupported_platform):
+        (MainTest.test_verbose_in_child_processes):
+        (EndToEndTest.test_end_to_end):
+        (EndToEndTest.test_reftest_with_two_notrefs):
+        (RebaselineTest.test_reset_results):
+        (RebaselineTest.test_missing_results):
+        (RebaselineTest.test_new_baseline):
+        * Scripts/webkitpy/layout_tests/views/buildbot_results.py: Added.
+        (BuildBotPrinter):
+        (BuildBotPrinter.__init__):
+        (BuildBotPrinter.print_results):
+        (BuildBotPrinter._print):
+        (BuildBotPrinter.print_result_summary):
+        (BuildBotPrinter._print_result_summary_entry):
+        (BuildBotPrinter.print_unexpected_results):
+        (BuildBotPrinter.print_unexpected_results.add_to_dict_of_lists):
+        (BuildBotPrinter.print_unexpected_results.add_result):
+        * Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py: Added.
+        (BuildBotPrinterTests):
+        (BuildBotPrinterTests.assertEmpty):
+        (BuildBotPrinterTests.assertNotEmpty):
+        (BuildBotPrinterTests.get_printer):
+        (BuildBotPrinterTests.get_result):
+        (BuildBotPrinterTests.get_result_summary):
+        (BuildBotPrinterTests.test_print_unexpected_results):
+        (BuildBotPrinterTests.test_print_unexpected_results.get_unexpected_results):
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer):
+        (Printer.__init__):
+        (Printer.print_results):
+        (Printer._print_statistics_for_test_timings):
+        (Printer._print_baseline):
+        (Printer._print_debug):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.get_printer):
+        (Testprinter.get_result):
+        (Testprinter.test_configure_and_cleanup):
+        (Testprinter.test_print_config):
+        (Testprinter.test_print_one_line_summary):
+        (Testprinter.test_test_status_line):
+        (Testprinter.test_details):
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: collect all of the information about a run into a new RunDetails class
+        https://bugs.webkit.org/show_bug.cgi?id=104158
+
+        Reviewed by Ojan Vafai.
+
+        This patch collects the information from both test passes (the
+        main one and the retries) as well as the summarized results and
+        the exit code into a RunDetails class, so that the integration
+        tests can more easily tell what happened.
+
+        Also, change the way the --lint-test-files works slightly so that
+        we don't need to create a printer object (and hence we need to
+        rework the tests that are testing logging).
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (RunDetails):
+        (RunDetails.__init__):
+        (Manager.run):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (run):
+        (main):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (passing_run):
+        (run_and_capture):
+        (LintTest.test_lint_test_files):
+        (LintTest.test_lint_test_files__errors):
+        (MainTest.test_verbose_in_child_processes):
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: remove --no-record-results
+        https://bugs.webkit.org/show_bug.cgi?id=104072
+
+        Reviewed by Ojan Vafai.
+
+        The command line flag was only being used in the unit tests and
+        wasn't really needed once we started using a mock filesystem.
+
+        Also, reformat a bunch of long lines ...
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.run):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (parse_args):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (parse_args):
+        (passing_run):
+        (logging_run):
+        (MainTest.test_repeat_each_iterations_num_tests):
+        (MainTest.test_test_list):
+        (MainTest.test_missing_and_unexpected_results):
+        (MainTest.test_pixel_test_directories):
+        (MainTest.test_missing_and_unexpected_results_with_custom_exit_code):
+        (MainTest.test_crash_with_stderr):
+        (MainTest.test_no_image_failure_with_image_diff):
+        (MainTest.test_crash_log):
+        (MainTest.test_web_process_crash_log):
+        (MainTest.test_exit_after_n_failures_upload):
+        (MainTest.test_results_directory_absolute):
+        (MainTest.test_results_directory_relative):
+        (MainTest.test_reftest_should_not_use_naming_convention_if_not_listed_in_reftestlist):
+        (MainTest.test_additional_expectations):
+        (MainTest.test_output_diffs):
+        (EndToEndTest.test_end_to_end):
+        (EndToEndTest.test_reftest_with_two_notrefs):
+        (RebaselineTest.test_reset_results):
+        (RebaselineTest.test_missing_results):
+        (RebaselineTest.test_new_baseline):
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: only summarize the results one way
+        https://bugs.webkit.org/show_bug.cgi?id=104064
+
+        Reviewed by Ojan Vafai.
+
+        Change manager.summarize_results so that we always (and only)
+        include both expected and unexpected results. Previously we
+        would summarize the results twice, once with expected results
+        and once without. This made the code much more confusing than
+        it needed to be.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (summarize_results):
+        (Manager.run):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ResultSummaryTest.summarized_results):
+        (ResultSummaryTest.test_no_svn_revision):
+        (ResultSummaryTest.test_svn_revision):
+        (ResultSummaryTest.test_summarized_results_wontfix):
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer.print_results):
+        (Printer._print_unexpected_results):
+        (Printer._print_unexpected_results.add_result):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.test_print_unexpected_results.get_unexpected_results):
+        (Testprinter):
+
+2012-12-05  Filip Pizlo  <fpizlo@apple.com>
+
+        DFG profiler should display more information
+        https://bugs.webkit.org/show_bug.cgi?id=104163
+
+        Reviewed by Gavin Barraclough.
+
+        Added the following:
+        
+        - Distinguish between source counts and bytecode counts.
+        
+        - Add a "full" summary view that shows both kinds of counts, plus inline counts.
+        
+        - Add a "source" command to see the source.
+        
+        - Add a "bytecode" command to see the bytecode and counts.
+
+        * Scripts/display-profiler-output:
+
+2012-12-05  Yong Li  <yoli@rim.com>
+
+        [BlackBerry] Build with libjpegturbo
+        https://bugs.webkit.org/show_bug.cgi?id=104152
+
+        Reviewed by Rob Buis.
+
+        RIM PR# 196975.
+        Make sure the right include path for libjpeg is included.
+
+        * Scripts/webkitdirs.pm:
+        (blackberryCMakeArguments):
+
+2012-12-05  Joseph Pecoraro  <pecoraro@apple.com>
+
+        Remove stale check in check-for-webkit-framework-include-consistency
+        https://bugs.webkit.org/show_bug.cgi?id=103775
+
+        Reviewed by David Kilzer.
+
+        The underlying issue was fixed in r81173.
+
+        * Scripts/check-for-webkit-framework-include-consistency:
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: simplify the finding of tests to retry
+        https://bugs.webkit.org/show_bug.cgi?id=104067
+
+        Reviewed by Ryosuke Niwa.
+
+        I think this makes the code a little clearer; note that
+        we were no longer using the include_missing flag.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.run):
+        (Manager._failed_test_names):
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: remove two unused parameters from a function
+        https://bugs.webkit.org/show_bug.cgi?id=104059
+
+        Reviewed by Ryosuke Niwa.
+
+        Also remove an old, stale FIXME.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (interpret_test_failures):
+        (summarize_results):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ResultSummaryTest.test_interpret_test_failures):
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: return result_summaries from LayoutTestRunner.run_tests()
+        https://bugs.webkit.org/show_bug.cgi?id=104051
+
+        Reviewed by Ojan Vafai.
+
+        This patch completes the refactoring that makes the result summary      
+        an object returned from the layout test runner, rather than having      
+        it passed in and modified. This makes the split of duties between       
+        the manager and runner clearer and makes the data flow more             
+        functionally.                                                           
+
+        Also clean up some minor lint issues.
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (LayoutTestRunner.__init__):
+        (LayoutTestRunner.run_tests):
+        (LayoutTestRunner._mark_interrupted_tests_as_skipped):
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        (FakePrinter.print_expected):
+        (LockCheckingRunner.__init__):
+        (LayoutTestRunnerTests._runner):
+        (LayoutTestRunnerTests._run_tests):
+        (LayoutTestRunnerTests.test_interrupt_if_at_failure_limits):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.__init__):
+        (Manager.run):
+        (Manager._run_tests):
+
+2012-12-05  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: move creation of the resultsummary objects into Manager._run_tests()
+        https://bugs.webkit.org/show_bug.cgi?id=104048
+
+        Reviewed by Ojan Vafai.
+
+        This is a preparatory step to making the resultsummary just get
+        returned from the layout_test_runner; this does most of manager-side
+        changes.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._prepare_lists):
+        (Manager.run):
+        (Manager._run_tests):
+
+2012-12-05  Leo Yang  <leoyang@rim.com>
+
+        [BlackBerry] Enable CSS_IMAGE_RESOLUTION
+        https://bugs.webkit.org/show_bug.cgi?id=104132
+
+        Reviewed by Yong Li.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-05  Filip Pizlo  <fpizlo@apple.com>
+
+        JSC profiler should not count executions of op_call_put_result because doing so changes DFG codegen
+        https://bugs.webkit.org/show_bug.cgi?id=104102
+
+        Reviewed by Oliver Hunt.
+
+        Modify the profiler to not output counts for op_call_put_result, since there
+        won't be any. Also fix a few weird bugs, like providing better error reporting
+        when you type something incorrectly and not reporting counts for slow paths
+        in the old JIT since those counts are actually not what you think they are
+        (we don't actually count slow path executions separately).
+
+        * Scripts/display-profiler-output:
+
+2012-12-05  Andras Becsi  <andras.becsi@digia.com>
+
+        Fix compilation for Qt5.0.0 stable branch.
+        https://bugs.webkit.org/show_bug.cgi?id=103870
+
+        Reviewed by Simon Hausmann.
+
+        Fix the use of renamed QWindow functions.
+        Patch by Andras Becsi <andras.becsi@digia.com>
+
+        * MiniBrowser/qt/BrowserWindow.cpp:
+        (BrowserWindow::BrowserWindow):
+        (BrowserWindow::onTitleChanged):
+        * MiniBrowser/qt/raw/View.cpp:
+        (View::View):
+
+2012-12-05  Jussi Kukkonen  <jussi.kukkonen@intel.com>
+
+        [WK2] InjectedBundle should check Intent url for null
+        https://bugs.webkit.org/show_bug.cgi?id=104117
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        WKIntentServiceInfoCopyHref() can return null, we need to check
+        for that in InjectedBundlePage::registerIntentServiceForFrame()
+        to avoid crashing.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp:
+        (WTR::InjectedBundlePage::registerIntentServiceForFrame):
+
+2012-12-04  Jonathan Dong  <jonathan.dong@torchmobile.com.cn>
+
+        Change email address of Jonathan Dong
+        https://bugs.webkit.org/show_bug.cgi?id=103976
+
+        Unreviewed, change my email address from jonathan.dong@torchmobile.com.cn
+        to jonathan.dong.webkit@gmail.com in committers list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-04  Xiaobo Wang  <xbwang@torchmobile.com.cn>
+
+        [BlackBerry] DRT - Tests under "dumpAsText" directory should be dumped as text
+        https://bugs.webkit.org/show_bug.cgi?id=103986
+
+        Reviewed by Rob Buis.
+
+        Also move declaration of webSettingTransaction to before any WebSettings
+        ::setXXX() calls so that it works as expected (commit only once in the
+        function scope).
+
+        * DumpRenderTree/blackberry/DumpRenderTree.cpp:
+        (shouldDumpAsText):
+        (BlackBerry::WebKit::DumpRenderTree::resetToConsistentStateBeforeTesting):
+
+2012-12-04  Filip Pizlo  <fpizlo@apple.com>
+
+        display-profiler-output should be able to show source code
+        https://bugs.webkit.org/show_bug.cgi?id=104073
+
+        Reviewed by Oliver Hunt.
+
+        Display source code in the summary, using a one-line shortening.
+
+        * Scripts/display-profiler-output:
+
+2012-12-04  Filip Pizlo  <fpizlo@apple.com>
+
+        display-profiler-output should not use reflective infocation to resolve command names
+
+        Rubber stamped by Mark Hahnenberg.
+
+        Reflection is amazing, but here it was just kind of a bit much.
+
+        * Scripts/display-profiler-output:
+
+2012-12-02  Filip Pizlo  <fpizlo@apple.com>
+
+        JSC should be able to report profiling data associated with the IR dumps and disassembly
+        https://bugs.webkit.org/show_bug.cgi?id=102999
+
+        Reviewed by Gavin Barraclough.
+
+        Added a tool that allows you to grok the output from JSC's new profiler. Currently,
+        this still gets confused a bit about the execution counts of a method running
+        standalone versus a method running inlined, but other than that, it's pretty cool.
+        See the attached "sampling profiling session" attached to the bug to see it in
+        action.
+        
+        Also had to feed EFL's build system.
+
+        * DumpRenderTree/efl/CMakeLists.txt:
+        * Scripts/display-profiler-output: Added.
+
+2012-12-04  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: fix total number of tests computed in the result summary
+        https://bugs.webkit.org/show_bug.cgi?id=104061
+
+        Unreviewed, build fix.
+
+        One of the recent changes to the resultsummary refactoring caused
+        us to not include the number of skipped tests in the total number
+        of tests, throwing off the totals printed in print_one_line_summary().
+
+        Unfortunately, given the current state of the code it is difficult
+        to construct an accurate unit test for this. I have verified the
+        fix by hand, and will write a test once the remaining refactoring
+        patches land, at which point it will be trivial to test it.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._prepare_lists):
+
+2012-12-04  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt is not returning the exit status properly
+        https://bugs.webkit.org/show_bug.cgi?id=103830
+
+        Unreviewed, build fix.
+
+        The fix in r136474 wasn't quite right either, and would return
+        the correct exceptional status, but not the correct failing status.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+
+2012-12-04  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: make paths and test_names passed arguments in Manager._prepare_lists et al
+        https://bugs.webkit.org/show_bug.cgi?id=104047
+
+        Reviewed by Eric Seidel.
+
+        The code becomes cleaner if we are just passing values around rather
+        than hanging them off the manager object, helps move _prepare_lists()
+        to a pure function, and is needed to eventually make the
+        result_summary object something returned from runner.run_tests()
+        (note that two more patches are needed for that to happen).
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.__init__):
+        (Manager._http_tests):
+        (Manager._prepare_lists):
+        (Manager.needs_servers):
+        (Manager._set_up_run):
+        (Manager.run):
+        (Manager._run_tests):
+        (Manager._upload_json_files):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ManagerTest.test_needs_servers.get_manager):
+        (ManagerTest.test_needs_servers):
+        (ManagerTest.integration_test_needs_servers.get_manager):
+        (ManagerTest.integration_test_needs_servers):
+        (ManagerTest.test_look_for_new_crash_logs.get_manager):
+        (ManagerTest):
+        (ManagerTest.test_look_for_new_crash_logs):
+        * Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py:
+        (JSONLayoutResultsGenerator.__init__):
+        (JSONLayoutResultsGenerator._get_modifier_char):
+
+2012-12-04  Adam Barth  <abarth@webkit.org>
+
+        commit-queue can get stuck with a local commit
+        https://bugs.webkit.org/show_bug.cgi?id=104032
+
+        Reviewed by Dirk Pranke.
+
+        Previously the commit-queue would only clean down to HEAD. If the
+        commit-queue gets interrupted in the middle of a commit (e.g., after
+        the local commit but before the dcommit), then it can end up with a
+        patch locally committed. That patch will then prevent the commit-queue
+        from functioning.
+
+        This patch teaches the commit-queue to clean down to the merge base,
+        which will remove any local commits.
+
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git.working_directory_is_clean):
+        (Git.clean_working_directory):
+        * Scripts/webkitpy/tool/commands/roll_unittest.py:
+        * Scripts/webkitpy/tool/steps/commit.py:
+        (Commit._commit_warning):
+        (Commit.run):
+
+2012-12-04  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: store only the total number of tests in the result summary
+        https://bugs.webkit.org/show_bug.cgi?id=103963
+
+        Reviewed by Ryosuke Niwa.
+
+        The result summary only needs the total number of tests that will
+        be run (including repetitions) in order to provide the correct stats;
+        it doesn't actually need to know how many unique tests there are, or
+        or how many repetitions there are.
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        (LayoutTestRunnerTests._result_summary):
+        (LayoutTestRunnerTests.test_update_summary_with_result):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._prepare_lists):
+        (Manager.run):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ManagerTest.test_look_for_new_crash_logs):
+        (ResultSummaryTest.get_result_summary):
+        * Scripts/webkitpy/layout_tests/models/result_summary.py:
+        (ResultSummary.__init__):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.get_result_summary):
+
+2012-12-04  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: do less work when ctrl-c'ed
+        https://bugs.webkit.org/show_bug.cgi?id=103961
+
+        Reviewed by Ryosuke Niwa.
+
+        Do less work when we are ctrl-c'ed, because the statistics aren't
+        that useful anyway. While we're at it, modify summarize_results
+        to be aware that we don't always retry results (instead of pretending
+        that the retry produced the same results the initial run did).
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (summarize_results):
+        (Manager.run):
+
+2012-12-04  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: result summaries should not require a list of tests to skip
+        https://bugs.webkit.org/show_bug.cgi?id=103951
+
+        Reviewed by Ryosuke Niwa.
+
+        We shouldn't really be passing a list of tests to skip to the
+        ResultSummary objects; they should be handled like any other
+        test result as much as possible.
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        (LayoutTestRunnerTests._result_summary):
+        (LayoutTestRunnerTests.test_update_summary_with_result):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._prepare_lists):
+        (Manager.run):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ManagerTest.test_look_for_new_crash_logs):
+        (ResultSummaryTest.get_result_summary):
+        * Scripts/webkitpy/layout_tests/models/result_summary.py:
+        (ResultSummary.__init__):
+        * Scripts/webkitpy/layout_tests/models/test_expectations.py:
+        (TestExpectations):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.get_result_summary):
+
+2012-12-04  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: derive per-thread, per-worker stats from result summaries
+        https://bugs.webkit.org/show_bug.cgi?id=103943
+
+        Reviewed by Ojan Vafai.
+
+        This patch changes the manager and printing code to pull more           
+        information from the ResultSummary object rather than tracking          
+        additional statistics on the side. This allows us to consolidate        
+        a bunch of logic and remove a bunch of free-floating lists and dicts of 
+        of values. We add the shard_name and worker_name to each TestResult,    
+        and then modify print_timing_statistics() and upload_json_files()       
+        to just need the result summaries.                                      
+
+        Note that this patch also changes the timing statistics slightly
+        so that the individual test times are the times to run just the
+        tests themselves (TestResult.test_run_time) and do not include the
+        times taken to run the ref tests, compute diffs, etc. The aggregated
+        per-worker and per-shard statistics still use the total time to
+        process each test (TestResult.total_run_time).
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (LayoutTestRunner.__init__):
+        (LayoutTestRunner.run_tests):
+        (LayoutTestRunner._handle_finished_test_list):
+        (LayoutTestRunner._handle_finished_test):
+        (Worker.handle):
+        (Worker._run_test):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (summarize_results):
+        (Manager.run):
+        (Manager._upload_json_files):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ResultSummaryTest.summarized_results):
+        * Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py:
+        (JSONLayoutResultsGenerator.__init__):
+        (JSONLayoutResultsGenerator._get_test_timing):
+        * Scripts/webkitpy/layout_tests/models/test_results.py:
+        (TestResult.__init__):
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer.print_results):
+        (Printer._print_timing_statistics):
+        (Printer):
+        (Printer._print_worker_statistics):
+        (Printer._print_aggregate_test_statistics):
+        (Printer._print_individual_test_times):
+        (Printer._print_directory_timings):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.test_print_unexpected_results.get_unexpected_results):
+        (Testprinter):
+
+2012-12-04  Adam Barth  <abarth@webkit.org>
+
+        Remove obsolete code from webkitpy
+        https://bugs.webkit.org/show_bug.cgi?id=104029
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/tool/bot/commitqueuetask.py:
+        (CommitQueueTask.run):
+        * Scripts/webkitpy/tool/steps/commit.py:
+        (Commit.options):
+        * Scripts/webkitpy/tool/steps/options.py:
+        (Options):
+
+2012-12-04  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move WebPreferences and methods for modifying them to the TestRunner library
+        https://bugs.webkit.org/show_bug.cgi?id=103841
+
+        Reviewed by Darin Fisher.
+
+        * DumpRenderTree/DumpRenderTree.gypi:
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/public/WebPreferences.h: Renamed from Tools/DumpRenderTree/chromium/WebPreferences.h.
+        (WebKit):
+        (WebTestRunner):
+        (WebPreferences):
+        (WebTestRunner::WebPreferences::WebPreferences):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h:
+        (WebTestRunner):
+        (WebTestDelegate):
+        (WebTestRunner::WebTestDelegate::localFileToDataURL):
+        (WebTestRunner::WebTestDelegate::rewriteLayoutTestsURL):
+        (WebTestRunner::WebTestDelegate::preferences):
+        (WebTestRunner::WebTestDelegate::applyPreferences):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner::TestRunner::setUserStyleSheetEnabled):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setUserStyleSheetLocation):
+        (WebTestRunner::TestRunner::setAuthorAndUserStylesEnabled):
+        (WebTestRunner::TestRunner::setPopupBlockingEnabled):
+        (WebTestRunner::TestRunner::setJavaScriptCanAccessClipboard):
+        (WebTestRunner::TestRunner::setXSSAuditorEnabled):
+        (WebTestRunner::TestRunner::setAllowUniversalAccessFromFileURLs):
+        (WebTestRunner::TestRunner::setAllowFileAccessFromFileURLs):
+        (WebTestRunner::TestRunner::overridePreference):
+        (WebTestRunner::TestRunner::setPluginsEnabled):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp: Renamed from Tools/DumpRenderTree/chromium/WebPreferences.cpp.
+        (WebTestRunner::WebPreferences::reset):
+        (WebTestRunner):
+        (WebTestRunner::WebPreferences::applyTo):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::preferences):
+        (TestShell):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::localFileToDataURL):
+        (WebViewHost::rewriteLayoutTestsURL):
+        (WebViewHost::preferences):
+        (WebViewHost::applyPreferences):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2012-12-04  Zan Dobersek  <zandobersek@gmail.com>
+
+        Many webkitpy unit tests can be run standalone, are executable
+        https://bugs.webkit.org/show_bug.cgi?id=103900
+
+        Reviewed by Eric Seidel.
+
+        There's no need anymore to run unit tests in standalone mode as they
+        are now handled by test-webkitpy in a formidable fashion. This makes
+        it possible for this patch to remove the following unnecessary bits:
+        - remove shebang lines from unit test files,
+        - remove calls to unittest.main(),
+        - make unit test files non-executable.
+
+        * Scripts/webkitpy/common/checkout/diff_parser_unittest.py:
+        (DiffParserTest.test_git_mnemonicprefix):
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        (GitTestWithMock.test_push_local_commits_to_server_without_username_and_with_password):
+        * Scripts/webkitpy/common/config/build_unittest.py:
+        (ShouldBuildTest.test_should_build):
+        * Scripts/webkitpy/common/config/ports_unittest.py:
+        (DeprecatedPortTest.test_chromium_xvfb_port):
+        * Scripts/webkitpy/common/find_files_unittest.py:
+        (TestWinNormalize.test_win):
+        * Scripts/webkitpy/common/lru_cache_unittest.py:
+        (LRUCacheTest.test_set_again):
+        * Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py:
+        (test_results_zip_url):
+        * Scripts/webkitpy/common/net/credentials_unittest.py:
+        (test_keyring_without_git_repo_nor_keychain):
+        * Scripts/webkitpy/common/net/omahaproxy_unittest.py:
+        (OmahaProxyTest.test_get_revisions):
+        * Scripts/webkitpy/common/net/unittestresults_unittest.py:
+        * Scripts/webkitpy/common/newstringio_unittest.py:
+        (NewStringIOTest.test_with):
+        * Scripts/webkitpy/common/read_checksum_from_png_unittest.py:
+        (ReadChecksumFromPngTest.test_read_checksum):
+        * Scripts/webkitpy/common/system/file_lock_integrationtest.py:
+        * Scripts/webkitpy/common/system/filesystem_mock_unittest.py:
+        (MockFileSystemTest.test_normpath):
+        * Scripts/webkitpy/common/system/filesystem_unittest.py:
+        (RealFileSystemTest.test_sep):
+        * Scripts/webkitpy/common/system/platforminfo_unittest.py:
+        (TestPlatformInfo.test_total_bytes_memory):
+        * Scripts/webkitpy/common/system/zipfileset_unittest.py:
+        (ZipFileSetTest.test_namelist):
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        * Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py:
+        (TestResultWriterTest.test_reftest_diff_image):
+        * Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py:
+        (JSONGeneratorTest.test_test_timings_trie):
+        * Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py:
+        (TestExpectationSerializationTests.test_string_whitespace_stripping):
+        * Scripts/webkitpy/layout_tests/port/base_unittest.py:
+        (KeyCompareTest.test_test_key):
+        * Scripts/webkitpy/layout_tests/port/builders_unittest.py:
+        (BuildersTest.test_path_from_name):
+        * Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py:
+        (ChromiumAndroidTwoPortsTest.test_options_with_two_ports):
+        * Scripts/webkitpy/layout_tests/port/chromium_linux_unittest.py:
+        (ChromiumLinuxPortTest.test_path_to_image_diff):
+        * Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py:
+        (ChromiumMacPortTest.test_path_to_image_diff):
+        * Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py:
+        (ChromiumPortLoggingTest.test_check_sys_deps):
+        * Scripts/webkitpy/layout_tests/port/chromium_unittest.py:
+        (ChromiumPortLoggingTest.test_check_sys_deps):
+        * Scripts/webkitpy/layout_tests/port/config_unittest.py:
+        (ConfigTest.test_default_configuration__scripterror):
+        * Scripts/webkitpy/layout_tests/port/driver_unittest.py:
+        (DriverTest.test_start_actually_starts):
+        * Scripts/webkitpy/layout_tests/port/factory_unittest.py:
+        (FactoryTest.test_get_from_builder_name):
+        * Scripts/webkitpy/layout_tests/port/http_lock_unittest.py:
+        * Scripts/webkitpy/layout_tests/port/image_diff_unittest.py:
+        * Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py:
+        * Scripts/webkitpy/layout_tests/reftests/extract_reference_link_unittest.py:
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (PortTest.disabled_test_mac_lion):
+        * Scripts/webkitpy/layout_tests/servers/http_server_integrationtest.py:
+        * Scripts/webkitpy/layout_tests/views/metered_stream_unittest.py:
+        (VerboseTest.test_log_args):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (test_details):
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (TestPerfTestFactory.test_inspector_test):
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (test_parse_args):
+        * Scripts/webkitpy/style/checker_unittest.py:
+        * Scripts/webkitpy/style/checkers/changelog_unittest.py:
+        (ChangeLogCheckerTest.test_no_error):
+        * Scripts/webkitpy/style/checkers/common_unittest.py:
+        (TabCheckerTest.test_tab):
+        * Scripts/webkitpy/style/checkers/cpp_unittest.py:
+        (CppCheckerTest.test_ne):
+        * Scripts/webkitpy/style/checkers/jsonchecker_unittest.py:
+        * Scripts/webkitpy/style/checkers/png_unittest.py:
+        (PNGCheckerTest.test_check):
+        * Scripts/webkitpy/style/checkers/test_expectations_unittest.py:
+        * Scripts/webkitpy/style/checkers/text_unittest.py:
+        (TextCheckerTest.test_init):
+        * Scripts/webkitpy/style/checkers/watchlist_unittest.py:
+        * Scripts/webkitpy/style/checkers/xcodeproj_unittest.py:
+        (XcodeProjectFileCheckerTest.test_detect_development_region):
+        * Scripts/webkitpy/style/checkers/xml_unittest.py:
+        (XMLCheckerTest.test_no_error):
+        * Scripts/webkitpy/style/patchreader_unittest.py:
+        * Scripts/webkitpy/test/finder_unittest.py:
+        (FinderTest.test_paths):
+        * Scripts/webkitpy/test/runner_unittest.py:
+        (RunnerTest.test_run):
+        * Scripts/webkitpy/test/skip_unittest.py:
+        (SkipTest.test_skip_if_true):
+        * Scripts/webkitpy/thirdparty/__init___unittest.py:
+        (ThirdpartyTest.test_imports):
+        * Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests_unittest.py:
+        (TestTranslation.test_include_rewriting):
+        * Scripts/webkitpy/tool/bot/queueengine_unittest.py:
+        (QueueEngineTest.tearDown):
+        * Scripts/webkitpy/tool/grammar_unittest.py:
+        (GrammarTest.test_join_with_separators):
+        * Scripts/webkitpy/tool/mocktool_unittest.py:
+        (MockOptionsTest.test_kwarg__set):
+        * Scripts/webkitpy/tool/multicommandtool_unittest.py:
+        (test_command_help):
+
+2012-12-04  Zan Dobersek  <zandobersek@gmail.com>
+
+        Many webkitpy module files are executable, have shebang line
+        https://bugs.webkit.org/show_bug.cgi?id=103985
+
+        Reviewed by Dirk Pranke.
+
+        Remove the executable bit from webkitpy module files that are
+        unnecessarily executable. Remove the shebang line from webkitpy
+        module files, they are of no use. Only non-third-party files are
+        changed.
+
+        * Scripts/webkitpy/bindings/main.py:
+        * Scripts/webkitpy/common/config/watchlist:
+        * Scripts/webkitpy/common/find_files.py:
+        * Scripts/webkitpy/common/lru_cache.py:
+        * Scripts/webkitpy/common/multiprocessing_bootstrap.py:
+        * Scripts/webkitpy/common/net/file_uploader.py:
+        * Scripts/webkitpy/common/newstringio.py:
+        * Scripts/webkitpy/common/read_checksum_from_png.py:
+        * Scripts/webkitpy/common/system/autoinstall.py:
+        * Scripts/webkitpy/common/system/file_lock.py:
+        * Scripts/webkitpy/common/system/file_lock_mock.py:
+        * Scripts/webkitpy/common/version_check.py:
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        * Scripts/webkitpy/layout_tests/models/test_expectations.py:
+        * Scripts/webkitpy/layout_tests/models/test_failures.py:
+        * Scripts/webkitpy/layout_tests/models/test_input.py:
+        * Scripts/webkitpy/layout_tests/port/__init__.py:
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        * Scripts/webkitpy/layout_tests/port/builders.py:
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        * Scripts/webkitpy/layout_tests/port/chromium_linux.py:
+        * Scripts/webkitpy/layout_tests/port/chromium_mac.py:
+        * Scripts/webkitpy/layout_tests/port/chromium_win.py:
+        * Scripts/webkitpy/layout_tests/port/config.py:
+        * Scripts/webkitpy/layout_tests/port/factory.py:
+        * Scripts/webkitpy/layout_tests/port/http_lock.py:
+        * Scripts/webkitpy/layout_tests/port/image_diff.py:
+        * Scripts/webkitpy/layout_tests/port/mock_drt.py:
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        * Scripts/webkitpy/layout_tests/port/server_process.py:
+        * Scripts/webkitpy/layout_tests/port/test.py:
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        * Scripts/webkitpy/layout_tests/servers/apache_http_server.py:
+        * Scripts/webkitpy/layout_tests/servers/http_server.py:
+        * Scripts/webkitpy/layout_tests/servers/http_server_base.py:
+        * Scripts/webkitpy/layout_tests/servers/websocket_server.py:
+        * Scripts/webkitpy/layout_tests/views/metered_stream.py:
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        * Scripts/webkitpy/style/checkers/changelog.py:
+        * Scripts/webkitpy/style/checkers/cpp.py:
+        * Scripts/webkitpy/style/checkers/xcodeproj.py:
+        * Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests.py:
+        (main): There's no need to run this module in standalone because
+        it's wrapped by the Tools/Scripts/update-webgl-conformance-tests script.
+        * Scripts/webkitpy/tool/commands/upload.py:
+        * Scripts/webkitpy/tool/comments.py:
+        * Scripts/webkitpy/tool/main.py:
+
+2012-12-04  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Add a Chromium Android Release (Perf) to the list of perf. bots.
+
+        * BuildSlaveSupport/build.webkit.org-config/templates/root.html:
+
+2012-12-04  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] Insert the jhbuild wrapper command at the beginning of the command list
+        https://bugs.webkit.org/show_bug.cgi?id=103991
+
+        Reviewed by Martin Robinson.
+
+        Insert the Tools/gtk/run-with-jhbuild wrapper at the beginning of the
+        command that's being formed in multiprocessing bootstrap. The wrapper is
+        an executable Python script while the command being wrapped perhaps isn't
+        and therefore requires the Python interpreter to be listed at the beginning
+        of the command sublist that is then executed by the wrapper.
+
+        Specifically, the webkitpy/layout_tests/run_webkit_tests.py module file
+        is about to lose the executable bit and the Python-signaling shebang line.
+        The Jhbuild wrapper simply executes the command that's passed, but that errs
+        in this case unless the Python executable is executed and the module file
+        is passed to it as an argument.
+
+        * Scripts/webkitpy/common/multiprocessing_bootstrap.py:
+        (run):
+
+2012-12-04  Peter Beverloo  <peter@chromium.org>
+
+        Add the Chromium Android Release (Perf) bot
+        https://bugs.webkit.org/show_bug.cgi?id=103891
+
+        Reviewed by Eric Seidel.
+
+        Add configuration for the bot itself. It will be triggered by the Chromium
+        Android Release builder. When running for Android, the DownloadAndPerfTest
+        factory will also add the OutputAndroidDeviceStatus step.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (DownloadAndPerfTestFactory.__init__):
+
+2012-12-04  Peter Beverloo  <peter@chromium.org>
+
+        [Chromium] The ChromiumAndroidDriver constructor should not rely on adb being available
+        https://bugs.webkit.org/show_bug.cgi?id=103758
+
+        Reviewed by Eric Seidel.
+
+        Lazily initialize the adb command parameters rather than initializing it in the
+        constructor now that there is an assert if adb is not available on the system and
+        we're not in a Chromium Android checkout.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidDriver.__init__):
+        (ChromiumAndroidDriver._push_file_if_needed):
+        (ChromiumAndroidDriver._run_adb_command):
+        (ChromiumAndroidDriver.cmd_line):
+        (ChromiumAndroidDriver._start_once):
+        (ChromiumAndroidDriver._read_prompt):
+        (ChromiumAndroidDriver):
+        (ChromiumAndroidDriver._adb_command):
+
+2012-12-03  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Dromaeo should report individual test result
+        https://bugs.webkit.org/show_bug.cgi?id=99800
+
+        Reviewed by Eric Seidel.
+
+        Ignore subtest results spit out by Dromaeo tests.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest): Added a line to ignore.
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (MainTest.test_parse_output_with_subtests): Added.
+
+2012-12-03  Zan Dobersek  <zandobersek@gmail.com>
+
+        Unreviewed, functionality fix after r136437.
+
+        Calling sys.exit actually raises a SystemExit exception that
+        is then handled in the second block and causes the script to
+        return an 'exceptional' exit code rather than the code presenting
+        the number of failed tests.
+
+        This is just a temporary fix to get the faultless bots green while
+        they are unnecessarily red at the moment. The problem and a proper
+        fix will be properly addressed.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+
+2012-12-03  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r136460.
+        http://trac.webkit.org/changeset/136460
+        https://bugs.webkit.org/show_bug.cgi?id=103958
+
+        This patch caused compile error when building DumpRenderTree
+        (Requested by tasak on #webkit).
+
+        * Scripts/webkitpy/common/config/build_unittest.py:
+        (ShouldBuildTest):
+
+2012-12-03  Scott Violet  <sky@chromium.org>
+
+        [chromium] Remove linux theme related files and switch to default
+        https://bugs.webkit.org/show_bug.cgi?id=103897
+
+        Reviewed by Darin Fisher.
+
+        * Scripts/webkitpy/common/config/build_unittest.py:
+        (ShouldBuildTest): linux->default
+
+2012-12-03  Roger Fong  <roger_fong@apple.com>
+
+        Disable WebKit2 API tests on Apple Windows port.
+        https://bugs.webkit.org/show_bug.cgi?id=103929.
+
+        Reviewed by Timothy Horton.
+
+        * Scripts/run-api-tests:
+        (runTestsBySuite):
+
+2012-12-03  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy's run_webkit_tests should initialize the printer earlier on
+        https://bugs.webkit.org/show_bug.cgi?id=103661
+
+        Reviewed by Eric Seidel.
+
+        Initialize the printer before computing the derived options
+        from the command line arguments, so that we can safely log from
+        port methods.
+
+        Also clean up a few miscellaneous lint warnings.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidPort.path_to_adb):
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort.default_child_processes):
+        (MacPort.sample_process):
+        (MacPort.start_helper):
+        (MacPort.stop_helper):
+        (MacPort.nm_command):
+        * Scripts/webkitpy/layout_tests/port/mac_unittest.py:
+        (test_default_child_processes):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (run):
+        (_set_up_derived_options):
+
+2012-12-03  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: autoinstaller is failing on windows
+        https://bugs.webkit.org/show_bug.cgi?id=103699
+
+        Reviewed by Tony Chang.
+
+        Attempt to fix the python autoinstaller to work for pylint on win32
+        again ... it turns out one of the dependent packages contains
+        a write-protected test file and windows will choke when it tries to move
+        it into place. Fortunately we can just delete the file prior to
+        installing it in the final location, but we have to jump through
+        a couple of hoops to do so.
+
+        Also, make sure that we're flattening nested module names like
+        "logilab/common" into either safe basenames (logilab_common) or
+        host-specific subdirs (logilab\common) as needed.
+
+        * Scripts/webkitpy/common/system/autoinstall.py:
+        (AutoInstaller._url_downloaded_path):
+        (AutoInstaller._install):
+        (AutoInstaller.install):
+        * Scripts/webkitpy/thirdparty/__init__.py:
+        (AutoinstallImportHook._install_pylint):
+
+2012-12-03  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: clean up exception propagation / handling for interrupts and early exits
+        https://bugs.webkit.org/show_bug.cgi?id=103830
+
+        Reviewed by Ojan Vafai.
+
+        The code for propagating early exits out of the test run was
+        convoluted and hard to follow. By adjusting the WorkerException to
+        derive from BaseException rather than Exception (which is a fair
+        way of representing an error that was really unexpected/unrecoverable
+        anyway) and pushing the TestRunInterruptedException into the
+        ResultSummary (which is also fair since it was more of a result
+        than an exception) this allows us to consolidate and clean up
+        a bunch of the try/catch logic and pass fewer state flags around.
+
+        There are no real functional changes to this patch; there's an
+        API change in that we stop exporting TestRunInterruptedException
+        and WorkerException out of the Manager, and the existence of the
+        MessagePool is now completely hidden.
+
+        * Scripts/webkitpy/common/message_pool.py:
+        (WorkerException):
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (LayoutTestRunner.run_tests):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (summarize_results):
+        (Manager.run):
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ResultSummaryTest.summarized_results):
+        * Scripts/webkitpy/layout_tests/models/result_summary.py:
+        (ResultSummary.__init__):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (run):
+        (main):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (MainTest.test_exception_raised.of):
+        (MainTest.test_exception_raised):
+        (MainTest.test_run_force):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.test_print_unexpected_results.get_unexpected_results):
+        (Testprinter):
+
+2012-12-03  Julien BRIANCEAU   <jbrianceau@nds.com>
+
+        Add Qt/SH4 build slave to build.webkit.org
+        https://bugs.webkit.org/show_bug.cgi?id=103384
+
+        Reviewed by Csaba Osztrogonác.
+
+        * BuildSlaveSupport/build.webkit.org-config/config.json:
+
+2012-12-03  Alexis Menard  <alexis@webkit.org>
+
+        Enable CSS3 background-position offset by default
+        https://bugs.webkit.org/show_bug.cgi?id=103917
+
+        Reviewed by Benjamin Poulain.
+
+        Even though each port may enable or not the feature we still need
+        to pass it at configure time otherwise it will be disabled.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-12-03  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        Unreviewed. Adding myself to committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-12-03  Laszlo Gombos  <l.gombos@samsung.com>
+
+        [CMake] Enable building WebKit2-only build for the EFL port
+        https://bugs.webkit.org/show_bug.cgi?id=103820
+
+        Reviewed by Gyuyoung Kim.
+
+        Set ENABLE_WEBKIT2 to OFF if build-webkit was run with --no-webkit2.
+        Never set ENABLE_WEBKIT in build-webkit. This will simplyfy invoking
+        cmake directly. Initialize $cmakeArgs to avoid potential
+        warnings when running the script.
+
+        * Scripts/build-webkit:
+
+2012-12-03  Tommy Widenflycht  <tommyw@google.com>
+
+        Speech Recognition API: Update SpeechRecognitionEvent to match the specification
+        https://bugs.webkit.org/show_bug.cgi?id=103407
+
+        Reviewed by Kentaro Hara.
+
+        Changing the mock to use the new results delivery API.
+
+        * DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp:
+
+2012-12-03  Alexis Menard  <alexis@webkit.org>
+
+        [Qt] Enable CSS3 background-position offsets by default.
+        https://bugs.webkit.org/show_bug.cgi?id=103877
+
+        Reviewed by Tor Arne Vestbø.
+
+        Enable by default CSS3 background-position offsets.
+
+        * qmake/mkspecs/features/features.pri:
+
+2012-12-03  KyungTae Kim  <ktf.kim@samsung.com>
+
+        [EFL][WK2] Use float variable for zoom levels for MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=103863
+
+        Reviewed by Gyuyoung Kim.
+
+        Use float instead of int for zoomLevels variables for a clearer expression
+
+        * MiniBrowser/efl/main.c:
+        (on_key_down):
+
+2012-12-02  KyungTae Kim  <ktf.kim@samsung.com>
+
+        [EFL][WK2] Add support for a zoom level setting to MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=99285
+
+        Reviewed by Gyuyoung Kim.
+
+         Add support for a zoom level setting to MiniBrowser.
+         Shortcuts for setting operations are same as common browsers:
+         Ctrl + '+' to zoom in, Ctrl + '-' to zoom out and Ctrl + '0' to zoom to default.
+
+        * MiniBrowser/efl/main.c:
+        (on_key_down):
+
+2012-12-02  KyungTae Kim  <ktf.kim@samsung.com>
+
+        [EFL][WK2] ECORE_GETOPT_VALUE_BOOL need to be used for Eina_Bool
+        https://bugs.webkit.org/show_bug.cgi?id=103835
+
+        Reviewed by Kentaro Hara.
+
+        Because legacy_behavior_enabled is Eina_Bool, ECORE_GETOPT_VALUE_BOOL need to be used
+
+        * MiniBrowser/efl/main.c:
+        (elm_main):
+
+2012-12-02  Mike West  <mkwst@chromium.org>
+
+        Garden-o-matic shouldn't die when blank JSON results are received.
+        https://bugs.webkit.org/show_bug.cgi?id=103838
+
+        Reviewed by Adam Barth.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js:
+            If the JSONP string doesn't contain '(' or ')', return an empty object.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js:
+            Check that this behavior stays in place.
+
+2012-12-02  Eric Seidel  <eric@webkit.org>
+
+        run-perf-tests --profile should use iprofiler instead of instruments on Mac
+        https://bugs.webkit.org/show_bug.cgi?id=103765
+
+        Unreviewed.  Updating the unittests after my previous change.
+
+        * Scripts/webkitpy/common/system/profiler_unittest.py:
+        (ProfilerFactoryTest.test_basic):
+
+2012-12-02  Julie Parent  <jparent@chromium.org>
+
+        Remove dead code in flakiness dashboard for obsolete buildDir option
+        https://bugs.webkit.org/show_bug.cgi?id=103792
+
+        Reviewed by Dirk Pranke.
+
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        (initBuilders):
+
+2012-12-02  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: clean up logic for retrying failed tests a bit
+        https://bugs.webkit.org/show_bug.cgi?id=103829
+
+        Reviewed by Ojan Vafai.
+
+        The code for determining when to retry test failures and
+        show the results.html file was awkward and could stand some
+        cleaning up. This patch should have no functional changes.
+
+        The routine called _get_failures() returned a dict of test names
+        to failure types, but we only ever used the names, so I've converted
+        it to return a list (and renamed it); also, the show_results_html()
+        file was calling that routine to figure out if anything failed, when
+        the information was already in the result_summary (as either
+        unexpected_results or total_failures), so we were doing unnecessary work.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager.__init__):
+        (Manager.run):
+        (Manager._run_tests):
+        (Manager._failed_test_names):
+        (Manager._copy_results_html_file):
+
+2012-12-02  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: remove unused methods in manager.py
+        https://bugs.webkit.org/show_bug.cgi?id=103828
+
+        Reviewed by Eric Seidel.
+
+        These two methods weren't being called by anything and were no
+        longer needed.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._get_failures):
+        (Manager._upload_json_files):
+
+2012-12-02  Laszlo Gombos  <l.gombos@samsung.com>
+
+        Correct the spelling of the cmakeargs argument
+        https://bugs.webkit.org/show_bug.cgi?id=103814
+
+        Reviewed by Darin Adler.
+
+        The script expects cmakeargs (plural), so lets get the
+        documentation of the script report the same.
+
+        * Scripts/build-webkit:
+
+2012-12-02  Mike West  <mkwst@chromium.org>
+
+        [gtk] Enable the CSP_NEXT runtime flag.
+        https://bugs.webkit.org/show_bug.cgi?id=103810
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/gtk/DumpRenderTree.cpp:
+        (resetDefaultsToConsistentValues):
+            Turn on the CSP_NEXT runtime flag when running tests under GTK.
+
+2012-12-02  Eric Seidel  <eric@webkit.org>
+
+        run-perf-tests --profile should use iprofiler instead of instruments on Mac
+        https://bugs.webkit.org/show_bug.cgi?id=103765
+
+        Reviewed by Ryosuke Niwa.
+
+        Stephanie pointed out that iprofiler is the newer command-line interface
+        to replace /usr/bin/instruments in Instruments 4 (which according to the
+        interblags is supported on everything since 10.6.6), so I've moved --profile
+        to use iprofiler on Mac.
+
+        I also made the IProfiler class wait for iprofiler to complete so that
+        iprofiler won't continue running after run-perf-tests is complete (and
+        spam over the top of your shell output).
+
+        There are a couple of "got-chas" to this approach:
+        1.  iprofiler will ask for your password the first time you run it, which may
+            cause your first test to fail.  /usr/bin/instruments doesn't seem to do that.
+        2.  iprofiler has nice (but kinda awkward for our purposes) support for separate
+            directory and basename arguments, making IProfiler a somewhat awkward
+            baseclass of SingleFileOutputProfiler
+
+        I suspect we'll iterate from here.  It does seem slightly faster than
+        /usr/bin/instruments was.
+
+        * Scripts/webkitpy/common/system/profiler.py:
+        (ProfilerFactory.create_profiler):
+        (IProfiler):
+        (IProfiler.__init__):
+        (IProfiler.attach_to_pid):
+
+2012-12-02  Yongjun Zhang  <yongjun_zhang@apple.com>
+
+        Need a method to close all idle localstorage databases immediately.
+        https://bugs.webkit.org/show_bug.cgi?id=103469
+
+        Reviewed by David Kilzer.
+
+        Add an JS method to TestRunner, to enable testing closing idle local storage databases in
+        DumpRenderTree layout tests.
+
+        * DumpRenderTree/TestRunner.cpp:
+        (closeIdleLocalStorageDatabasesCallback):
+        (TestRunner::staticFunctions):
+        * DumpRenderTree/TestRunner.h:
+        (TestRunner):
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        (TestRunner::closeIdleLocalStorageDatabases):
+        * DumpRenderTree/efl/TestRunnerEfl.cpp:
+        (TestRunner::closeIdleLocalStorageDatabases):
+        * DumpRenderTree/gtk/TestRunnerGtk.cpp:
+        (TestRunner::closeIdleLocalStorageDatabases):
+        * DumpRenderTree/mac/TestRunnerMac.mm:
+        (TestRunner::closeIdleLocalStorageDatabases):
+        * DumpRenderTree/win/TestRunnerWin.cpp:
+        (TestRunner::closeIdleLocalStorageDatabases):
+        * DumpRenderTree/wx/TestRunnerWx.cpp:
+        (TestRunner::closeIdleLocalStorageDatabases):
+
+2012-12-02  Yael Aharon  <yael.aharon@intel.com>
+
+        [EFL][WK2] MiniBrowser should have a legacy mode
+        https://bugs.webkit.org/show_bug.cgi?id=103679
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add an option to start MiniBrowser in legacy mode.
+
+        * MiniBrowser/efl/main.c:
+        (window_create):
+        (elm_main):
+
+2012-12-02  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r136236.
+        http://trac.webkit.org/changeset/136236
+        https://bugs.webkit.org/show_bug.cgi?id=103833
+
+        [chromium] Flakey crashes in SpeechRecognitionEvent::emma
+        during GC. (Requested by mkwst on #webkit).
+
+        * DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp:
+
+2012-12-01  Zan Dobersek  <zandobersek@gmail.com>
+
+        [XvfbDriver] XvfbDriverTest.test_next_free_display is flaky on builders using XvfbDriver
+        https://bugs.webkit.org/show_bug.cgi?id=103806
+
+        Reviewed by Dirk Pranke.
+
+        There are occasional mishaps on builders where XvfbDriver doesn't properly
+        clean up the Xvfb instance it was managing so the related guard lock files
+        are still existing when the webkitpy unit tests are run. This can cause failures
+        in XvfbDriverTest.test_next_free_display as the test tries to acquire displays
+        with a specific number but is unable to due to the stale locks.
+
+        The solution to this is to use MockFileLock when inside unit test. This is achievable
+        by creating a file lock through the SystemHost instance connected to the Port object,
+        the latter available to the Driver.
+
+        * Scripts/webkitpy/common/system/file_lock_mock.py:
+        (MockFileLock.acquire_lock): Return True to signal lock acquiring succeeded.
+        (MockFileLock.release_lock): Return True to signal lock releasing succeeded.
+        * Scripts/webkitpy/layout_tests/port/xvfbdriver.py:
+        (XvfbDriver._next_free_display): Create the file lock through a mockable way.
+        * Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py:
+        (XvfbDriverTest.test_next_free_display): Enable back the unit test.
+
+2012-12-01  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK] A11y tests in WK2 report badly-formatted AX roles
+        https://bugs.webkit.org/show_bug.cgi?id=102947
+
+        Reviewed by Xan Lopez.
+
+        As in DRT, convert the ATK accessibility roles to corresponding AXRoles.
+        These are expected in both tests and their baselines.
+
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::roleToString):
+        (WTR):
+        (WTR::AccessibilityUIElement::role):
+
+2012-11-30  Mike West  <mkwst@chromium.org>
+
+        CSP 1.1: Make the CSP_NEXT flag runtime enabled.
+        https://bugs.webkit.org/show_bug.cgi?id=103652
+
+        Reviewed by Adam Barth.
+
+        Ensures that the new SecurityPolicy runtime flag is enabled for Chromium's tests.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2012-11-30  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Removed temporary debugging change from DRT (r136300).
+
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (dump):
+
+2012-11-30  Roger Fong  <roger_fong@apple.com>
+
+        Unreviewed. Temporary change to DRT for debugging purposes.
+
+        * DumpRenderTree/win/DumpRenderTree.cpp:
+        (dump):
+
+2012-11-29  Tommy Widenflycht  <tommyw@google.com>
+
+        Speech Recognition API: Update SpeechRecognitionEvent to match the specification
+        https://bugs.webkit.org/show_bug.cgi?id=103407
+
+        Reviewed by Adam Barth.
+
+        Changing the mock to use the new results delivery API.
+
+        * DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp:
+
+2012-11-30  Simon Hausmann  <simon.hausmann@digia.com>, Pierre Rossi  <pierre.rossi@digia.com>
+
+        [Qt] Separate Qt WebKit into Qt WebKit and Qt WebKit Widgets
+        https://bugs.webkit.org/show_bug.cgi?id=99314
+
+        Reviewed by Tor Arne Vestbø.
+
+        This big change separates QtWebKit into QtWebKit and QtWebKitWidgets as
+        shared libraries.
+
+        It's a big refactoring that mostly involves moving WebCore dependent
+        code into QtWebKit and accessing it through exported QWebFrameAdapter
+        and QWebPageAdapter classes.
+
+        * DumpRenderTree/qt/DumpRenderTree.pro:
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::DumpRenderTree::dump): Adapt to internal API changes.
+        * MiniBrowser/qt/MiniBrowser.pro:
+        * Scripts/webkitpy/style/checker.py: Adapt Qt exceptions to new paths.
+        * Scripts/webkitpy/style/checker_unittest.py:
+        (GlobalVariablesTest.test_path_rules_specifier):
+        * WebKitTestRunner/InjectedBundle/Target.pri:
+        * qmake/mkspecs/features/default_post.prf:
+        * qmake/mkspecs/features/webkit_modules.prf:
+        * qmake/mkspecs/modules/webkitwidgets.prf: Removed.
+
+2012-11-30  Csaba Osztrogonác  <ossy@webkit.org>
+
+        [Qt] Unreviewed trivial fix.
+
+        Add empty.cpp back, it was removed accidentally by r129092.
+
+        * qmake/config.tests/gccdepends/empty.cpp: Added.
+
+2012-11-30  Tor Arne Vestbø  <tor.arne.vestbo@digia.com>
+
+        [Qt] Add support for prepare_docs and generate_docs
+
+        Follow-up to changes in Qt in how documentation is built.
+
+        Reviewed by Simon Hausmann.
+
+        * qmake/mkspecs/features/default_post.prf:
+
+2012-11-30  Zan Dobersek  <zandobersek@gmail.com>
+
+        Finally remove webkitpy.common.system.deprecated_logging
+        https://bugs.webkit.org/show_bug.cgi?id=103624
+
+        Reviewed by Adam Barth.
+
+        Remove the deprecated logging module and its unit tests now that such logging is not
+        used anymore in webkitpy.
+
+        The tee and OutputTee classes are moved into a new module, webkitpy.common.system.outputtee.
+        The tee class is renamed to Tee to conform with the usual guidelines.
+
+        Only unit test for the Tee class is currently provided as the OutputTee is not currently
+        using the webkitpy Filesystem abstraction that would make its functionality testable.
+
+        * Scripts/webkitpy/common/system/executive.py: tee (now Tee) is now in a new module.
+        (Executive.run_and_throw_if_fail):
+        * Scripts/webkitpy/common/system/outputtee.py: Renamed from Tools/Scripts/webkitpy/common/system/deprecated_logging.py.
+        (Tee):
+        (Tee.__init__):
+        (Tee.write):
+        (OutputTee):
+        (OutputTee.__init__):
+        (OutputTee.add_log):
+        (OutputTee.remove_log):
+        (OutputTee._open_log_file):
+        (OutputTee._tee_outputs_to_files):
+        * Scripts/webkitpy/common/system/outputtee_unittest.py: Renamed from Tools/Scripts/webkitpy/common/system/deprecated_logging_unittest.py.
+        (SimpleTeeTest):
+        (SimpleTeeTest.test_simple_tee):
+        * Scripts/webkitpy/tool/bot/queueengine.py: OutputTee is now in a new module.
+        * Scripts/webkitpy/webkitpy.pyproj: Remove the deprecated_logging module and related unit test file.
+
+2012-11-30  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Add support for PlatformWebView::simulateRightClick() in TestWebKitAPI
+        https://bugs.webkit.org/show_bug.cgi?id=103634
+
+        Reviewed by Gyuyoung Kim.
+
+        Add support for PlatformWebView::simulateRightClick() and enable
+        WebKit2 API test HitTestResultNodeHandle.
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+        * TestWebKitAPI/efl/PlatformWebView.cpp:
+        (TestWebKitAPI::PlatformWebView::simulateRightClick):
+        (TestWebKitAPI):
+
+2012-11-30  Mihai Maerean  <mmaerean@adobe.com>
+
+        [CSSRegions] when WebKit uses V8, there should be a single variable to store if the CSS Regions feature is enabled
+        https://bugs.webkit.org/show_bug.cgi?id=101192
+
+        Reviewed by Hajime Morita.
+
+        Removed the CSS Regions flag in Settings and switched to using the new flag I have added in RuntimeEnabledFeatures.
+
+        Tests: No new tests because there is no functional change.
+
+        * DumpRenderTree/chromium/WebPreferences.cpp:
+        (WebPreferences::applyTo):
+
+2012-11-29  Rafael Weinstein  <rafaelw@chromium.org>
+
+        [HTMLTemplateElement] Add feature flag
+        https://bugs.webkit.org/show_bug.cgi?id=103694
+
+        Reviewed by Adam Barth.
+
+        This flag will guard the implementation of the HTMLTemplateElement.
+        http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-11-29  Dirk Pranke  <dpranke@chromium.org>
+
+        Ignore errors when removing directories on win32 during autoinstall
+        https://bugs.webkit.org/show_bug.cgi?id=103699
+
+        Unreviewed, build fix.
+
+        I think this will work on win32; if not, I'll have to actually
+        reproduce this :). The problem is that the logilab files
+        appear to contain a write-protected file, and deleting those
+        is problematic on windows.
+
+        * Scripts/webkitpy/common/system/autoinstall.py:
+        (AutoInstaller._install):
+        (AutoInstaller.install):
+
+2012-11-29  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: autoinstaller is failing on windows
+        https://bugs.webkit.org/show_bug.cgi?id=103699
+
+        Unreviewed, build fix.
+
+        We're attempting to create directories with forward slashes in them;
+        this is a no-no on windows.
+
+        * Scripts/webkitpy/common/system/autoinstall.py:
+        (AutoInstaller._create_scratch_directory_inner):
+
+2012-11-29  Dirk Pranke  <dpranke@chromium.org>
+
+        Fix python unit tests after r136158 (android port tests failing)
+        https://bugs.webkit.org/show_bug.cgi?id=103581
+
+        Unreviewed, build fix.
+
+        The unit tests apparently weren't ran for this patch; we failed
+        to update the mock executive calls out to adb to determine various
+        aspects of the environment, and were failing to create drivers.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py:
+        (MockRunCommand.mock_run_command_fn):
+
+2012-11-29  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r136175 and r136177.
+        http://trac.webkit.org/changeset/136175
+        http://trac.webkit.org/changeset/136177
+        https://bugs.webkit.org/show_bug.cgi?id=103683
+
+        Changes did not correct Windows build. (Requested by bfulgham
+        on #webkit).
+
+        * TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp:
+
+2012-11-29  Brent Fulgham  <bfulgham@webkit.org>
+
+        [Windows, WinCairo] Unreviewed build correction. Correct debug
+        build case on build machine.
+
+        * TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp:
+
+2012-11-29  Brent Fulgham  <bfulgham@webkit.org>
+
+        [Windows, WinCairo] Unreviewed build correction. Hide the
+        unexported 'notSolidColor' symbol when testing against
+        the BitmapImage class to avoid having to deal with a
+        debug-only symbol in the Windows export definition file.
+
+        * TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp: 
+
+2012-11-29  Peter Beverloo  <peter@chromium.org>
+
+        run-perf-tests --chromium-android should not require adb in my path
+        https://bugs.webkit.org/show_bug.cgi?id=103581
+
+        Reviewed by Eric Seidel.
+
+        Remove the need to have "adb" available in the path for Layout and Performance
+        tests. We'll determine the versions of the "adb" version in path (if any) and
+        the one provided in the Chromium Android checkout. Unless the "adb" available
+        in the path is newer, the provided version will be used.
+
+        Some other minor nits addressed:
+        - The path_to_forwarder/path_to_md5sum should not be in the "private overrides"
+          section, as they're not overriding anything and are used by the driver.
+        - Make _restart_adb_as_root slightly more robust by waiting for the device
+          to come back online regardless of the output.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidPort.__init__):
+        (ChromiumAndroidPort.check_build):
+        (ChromiumAndroidPort.path_to_adb):
+        (ChromiumAndroidPort):
+        (ChromiumAndroidPort.path_to_forwarder):
+        (ChromiumAndroidPort.path_to_md5sum):
+        (ChromiumAndroidPort._path_to_helper):
+        (ChromiumAndroidPort._determine_adb_version):
+        (ChromiumAndroidPort._get_devices):
+        (ChromiumAndroidDriver.__init__):
+        (ChromiumAndroidDriver._setup_md5sum_and_push_data_if_needed):
+        (ChromiumAndroidDriver._push_executable):
+        (ChromiumAndroidDriver._restart_adb_as_root):
+
+2012-11-29  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] [WebKit2] Embed the HTTP authentication dialog into the WebView
+        https://bugs.webkit.org/show_bug.cgi?id=103277
+
+        Reviewed by Carlos Garcia Campos.
+
+        Skip the new WebKit2GtkAuthenticationDialog files so that they are not processed
+        during gtkdoc generation.
+
+        * gtk/generate-gtkdoc:
+        (get_webkit2_options):
+
+2012-11-29  Eric Seidel  <eric@webkit.org>
+
+        run-perf-tests --chromium-android fails due to Skia INFO logging
+        https://bugs.webkit.org/show_bug.cgi?id=103585
+
+        Reviewed by Adam Barth.
+
+        Ignore all INFO logging from Chromium code.
+        Also added some basic testing of the ignored-stderr lines code.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest):
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (MainTest.test_ignored_stderr_lines):
+
+2012-11-29  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Add support for PlatformWebView::simulateMouseMove() in TestWebKitAPI
+        https://bugs.webkit.org/show_bug.cgi?id=103252
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add support for PlatformWebView::simulateMouseMove() and enable
+        WebKit2 API test MouseMoveAfterCrash.
+
+        * TestWebKitAPI/PlatformEfl.cmake: Enable MouseMoveAfterCrash API
+        test.
+        * TestWebKitAPI/efl/PlatformWebView.cpp:
+        (TestWebKitAPI::onWebProcessCrashed): Handle 'webprocess,crashed' signal
+        to prevent loading an error page since the test case is reloading actual
+        page after web process has terminated and recovered.
+        (TestWebKitAPI):
+        (TestWebKitAPI::PlatformWebView::PlatformWebView):
+        (TestWebKitAPI::PlatformWebView::simulateMouseMove): Implemented.
+
+2012-11-29  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt] Fix installation of QtWebProcess binary
+        https://bugs.webkit.org/show_bug.cgi?id=101735
+
+        Reviewed by Simon Hausmann.
+
+        Add config test to detect the availability of support
+        for "program executables" in Qt (libexec).
+
+        This test can be removed after the Qt5 release.
+
+        * Tools.pro:
+        * qmake/mkspecs/features/features.prf:
+        * qmake/config.tests/libexecdir/libexecdir.cpp:
+        * qmake/config.tests/libexecdir/libexecdir.pro:
+
+2012-11-29  Eric Seidel  <eric@webkit.org>
+
+        run-perf-tests does not work when the layout test directory does not exist
+        https://bugs.webkit.org/show_bug.cgi?id=103572
+
+        Reviewed by Ryosuke Niwa.
+
+        Make sure that Profiler() calls maybe_make_directory for the output_dir
+        before ever using it.  It's a little awkward to create the directory
+        from the constructor, but its simplest that way as the various subclasses
+        all use the directory at different times.
+
+        Since this required having a filesystem in Profiler (and I didn't want
+        to grab inside Workspace to get one), I just made Profiler expect a
+        SystemHost instead of a separate filesystem, executive and workspace.
+
+        * Scripts/webkitpy/common/system/profiler.py:
+        (ProfilerFactory.create_profiler):
+        (Profiler.__init__):
+        (SingleFileOutputProfiler.__init__):
+        (GooglePProf.__init__):
+        (GooglePProf.profile_after_exit):
+        (Instruments.__init__):
+        (Instruments.attach_to_pid):
+        * Scripts/webkitpy/common/system/profiler_unittest.py:
+        (ProfilerFactoryTest.test_basic):
+
+2012-11-28  Vivek Galatage  <vivek.vg@samsung.com>
+
+        Adding secondary email id
+        https://bugs.webkit.org/show_bug.cgi?id=103594
+
+        Unreviewed. Adding secondary email.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-28  Kent Tamura  <tkent@chromium.org>
+
+        garden-o-matic: Use indeterminate <progress> in the status area
+        https://bugs.webkit.org/show_bug.cgi?id=103494
+
+        Reviewed by Adam Barth.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js:
+        Wrap the "Processing..." message with an indeterminate progress bar.
+        We keep the message as a fallback content.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui_unittests.js:
+        Follow the above change.
+
+2012-11-28  Nima Ghanavatian  <nghanavatian@rim.com>
+
+        Adding Nima Ghanavatian to committers.py
+        https://bugs.webkit.org/show_bug.cgi?id=103533
+
+        Reviewed by Rob Buis.
+
+        Adding myself to committers.py as a Committer.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-28  peavo@outlook.com  <peavo@outlook.com>
+
+        [WinCairo] Crash when requesting favicon.
+        https://bugs.webkit.org/show_bug.cgi?id=102689
+
+        Reviewed by Brent Fulgham.
+
+        * TestWebKitAPI/Tests/WebCore/win: Added.
+        * TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp: Added.
+        (TestWebKitAPI::BitmapImageTest::BitmapImageTest): Allocate frame in constructor.
+        (TestWebKitAPI::BitmapImageTest::frameCount): Override frameCount() method.
+        (TestWebKitAPI::TEST): Added new test.
+        * TestWebKitAPI/config.h: Make sure defines are correct for WinCairo.
+       * TestWebKitAPI/win/TestWebKitAPI.vcproj: Added new test.
+
+2012-11-28  Eric Seidel  <eric@webkit.org>
+
+        run-perf-tests should have a --profile option for easy profiling
+        https://bugs.webkit.org/show_bug.cgi?id=99517
+
+        Reviewed by Adam Barth.
+
+        This is a very basic implementation which works on Mac and Linux
+        and makes it trivial for anyone to profile a PerformanceTest.
+
+        Currently it's not "hard" to profile a PerformanceTest
+        but lowering the barriers to entry here allows all of us to focus
+        less on the tools and more on the code.
+
+        This also paves the way for adding easy mobile-profiling (e.g. chromium-android)
+        which is actually "hard", and this option will make much easier.
+
+        * Scripts/webkitpy/common/system/profiler.py: Added.
+        (ProfilerFactory):
+        (ProfilerFactory.create_profiler):
+        (Profiler):
+        (Profiler.__init__):
+        (Profiler.adjusted_environment):
+        (Profiler.attach_to_pid):
+        (Profiler.did_stop):
+        (SingleFileOutputProfiler):
+        (SingleFileOutputProfiler.__init__):
+        (GooglePProf):
+        (GooglePProf.__init__):
+        (GooglePProf.adjusted_environment):
+        (GooglePProf.did_stop):
+        (Instruments):
+        (Instruments.__init__):
+        (Instruments.attach_to_pid):
+        * Scripts/webkitpy/common/system/profiler_unittest.py: Added.
+        (ProfilerFactoryTest):
+        (ProfilerFactoryTest.test_basic):
+        * Scripts/webkitpy/layout_tests/port/driver.py:
+        (Driver.__init__):
+        (Driver._start):
+        (Driver.stop):
+        (Driver.cmd_line):
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest.parse_output):
+        * Scripts/webkitpy/performance_tests/perftest_unittest.py:
+        (MainTest.test_parse_output):
+        (MainTest.test_parse_output_with_failing_line):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner._parse_args):
+        (PerfTestsRunner.run):
+
+2012-11-28  Zan Dobersek  <zandobersek@gmail.com>
+
+        Remove deprecated logging usage from QueueEngine
+        https://bugs.webkit.org/show_bug.cgi?id=103532
+
+        Reviewed by Dirk Pranke.
+
+        Replace usage of deprecated logging in webkitpy.tool.bot.queueengine with
+        logging through the Logger object. The unit test is modified to reflect
+        these changes.
+
+        After these changes the deprecated logging (i.e. logging to stderr) is not
+        used anymore through webkitpy and can be removed.
+
+        * Scripts/webkitpy/tool/bot/queueengine.py:
+        (QueueEngine.exit_after_handled_error):
+        (QueueEngine.run):
+        (QueueEngine._stopping):
+        (QueueEngine._sleep):
+        * Scripts/webkitpy/tool/bot/queueengine_unittest.py:
+        (QueueEngineTest._run_engine):
+
+2012-11-28  Nate Chapin  <japhet@chromium.org>
+
+        Move empty loading to DocumentLoader, simplify FrameLoader::init()
+        https://bugs.webkit.org/show_bug.cgi?id=101512
+
+        Reviewed by Adam Barth.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::updateForCommittedLoad): This function doesn't play nicely with empty urls and incorrectly
+            interprets them as a non-empty load. This change is required for
+             http/tests/navigation/new-window-redirect-history.html to continue to pass in chromium.
+        * TestWebKitAPI/Tests/WebKit2/AboutBlankLoad.cpp: This test relies on a callback that no longer
+             is sent for about:blank loads.  Hook into didFinishLoadForFrame() instead.
+        (TestWebKitAPI::didFinishLoadForFrame):
+        (TestWebKitAPI::TEST):
+
+2012-11-28  Sadrul Habib Chowdhury  <sadrul@chromium.org>
+
+        [chromium] Allow plugins to opt-in to receive synthetic mouse events out of touch events.
+        https://bugs.webkit.org/show_bug.cgi?id=103092
+
+        Reviewed by Tony Chang.
+
+        Update the test web-plugin to be able to opt-in to receive synthesized mouse events created
+        from touch events.
+
+        * DumpRenderTree/chromium/TestWebPlugin.cpp:
+        (parseTouchEventRequestType):
+        (TestWebPlugin::TestWebPlugin):
+        (TestWebPlugin::initialize):
+        * DumpRenderTree/chromium/TestWebPlugin.h:
+        (TestWebPlugin):
+
+2012-11-28  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Add support for PlatformWebView::simulateSpacebarKeyPress() in TestWebKitAPI
+        https://bugs.webkit.org/show_bug.cgi?id=103123
+
+        Reviewed by Laszlo Gombos.
+
+        Add support for PlatformWebView::simulateSpacebarKeyPress().
+        This functionality is needed by WebKit2 API test MouseMoveAfterCrash
+        which is going to be unskipped in bug #103252.
+
+        * TestWebKitAPI/efl/PlatformUtilities.cpp:
+        (TestWebKitAPI::Util::sleep):
+        * TestWebKitAPI/efl/PlatformWebView.cpp: Use usleep() instead of
+        sleep().
+        (TestWebKitAPI::PlatformWebView::simulateSpacebarKeyPress):
+        (TestWebKitAPI):
+
+2012-11-28  Yael Aharon  <yael.aharon@intel.com>
+
+        Minor cleanup in TestInvocation
+        https://bugs.webkit.org/show_bug.cgi?id=103512
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Remove a function declaration that is not defined and not used.
+        Fix spelling error in m_webProcessIsUnresponsive.
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::TestInvocation):
+        (WTR::TestInvocation::invoke):
+        * WebKitTestRunner/TestInvocation.h:
+        (TestInvocation):
+        * WebKitTestRunner/cairo/TestInvocationCairo.cpp:
+        (WTR::TestInvocation::dumpPixelsAndCompareWithExpected):
+        * WebKitTestRunner/qt/TestInvocationQt.cpp:
+        (WTR::TestInvocation::dumpPixelsAndCompareWithExpected):
+
+2012-11-28  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        Unreviewed. Use my personal email as bugzilla email.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-28  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        Unreviewed. Adding myself to committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-26  Andrey Adaikin  <aandrey@chromium.org>
+
+        Unreviewed. Adding myself to committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-28  Tommy Widenflycht  <tommyw@google.com>
+
+        Add basic implementation for MediaStreamAudioDestinationNode
+        https://bugs.webkit.org/show_bug.cgi?id=101815
+
+        Reviewed by Chris Rogers.
+
+        Adds a bit of code that exercises the WebKit API.
+
+        * DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp:
+        (MockWebMediaStreamSourceConsumer):
+        (MockWebMediaStreamSourceConsumer::~MockWebMediaStreamSourceConsumer):
+        (MockWebMediaStreamCenter::didCreateMediaStream):
+
+2012-11-28  Matt Falkenhagen  <falken@chromium.org>
+
+        Unreviewed. Adding myself to committers list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-27  Li Yin  <li.yin@intel.com>
+
+        Unreviewed. Adding myself to committers list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-27  Christophe Dumez  <christophe.dumez@intel.com>
+
+        Unreviewed. Adding myself to committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-27  Vivek Galatage  <vivek.vg@samsung.com>
+
+        Unreviewd. Adding myself to committers list.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-27  Tony Chang  <tony@chromium.org>
+
+        Bring back partytime!
+        https://bugs.webkit.org/show_bug.cgi?id=103466
+
+        Reviewed by Adam Barth.
+
+        "code 404, message Unknown function images/partytime_gif" since we didn't
+        allow .gif or .png files to be served.
+
+        * Scripts/webkitpy/tool/servers/gardeningserver.py:
+        (GardeningHTTPRequestHandler):
+
+2012-11-27  Adam Barth  <abarth@webkit.org>
+
+        run-perf-tests fails on Android because of stderr output
+        https://bugs.webkit.org/show_bug.cgi?id=103462
+
+        Reviewed by Ryosuke Niwa.
+
+        The chromium-android port produces some stderr output that causes
+        run-perf-tests to get sad and not record the results of the performance
+        test. This patch teaches run-perf-test to ignore this output much in
+        the same way that it currently ignores some stdout messages.
+
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (PerfTest.run):
+        (PerfTest._should_ignore_line):
+        (PerfTest):
+        (PerfTest._should_ignore_line_in_stderr):
+        (PerfTest._filter_stderr):
+        (PerfTest._should_ignore_line_in_parser_test_result):
+
+2012-11-27  Tony Chang  <tony@chromium.org>
+
+        Fix garden-o-matic for non-chromium ports
+        https://bugs.webkit.org/show_bug.cgi?id=103458
+
+        Reviewed by Adam Barth.
+
+        I was getting a 403 error when trying to select any non-chromium port.
+
+        * Scripts/webkitpy/tool/servers/reflectionhandler.py:
+        (ReflectionHandler._handle_request): Use the path without query params.
+
+2012-11-27  Yael Aharon  <yael.aharon@intel.com>
+
+        [EFL][WK2] 3D pixel tests are failing
+        https://bugs.webkit.org/show_bug.cgi?id=102833
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Generate a snapshot of the view in the UI process instead of the web process.
+        We have to use Texture Mapper in order to correctly paint 3D transforms etc.
+
+        * WebKitTestRunner/TestInvocation.h:
+        (TestInvocation):
+        * WebKitTestRunner/cairo/TestInvocationCairo.cpp:
+        (WTR::writeFunction):
+        (WTR::paintRepaintRectOverlay):
+        (WTR):
+        (WTR::TestInvocation::forceRepaintDoneCallback):
+        (WTR::TestInvocation::dumpPixelsAndCompareWithExpected):
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::windowSnapshotImage):
+
+2012-11-27  Adam Barth  <abarth@webkit.org>
+
+        Make it possible to run performance tests on Chromium Android
+        https://bugs.webkit.org/show_bug.cgi?id=103268
+
+        Reviewed by Ryosuke Niwa.
+
+        Based on a patch by Peter Beverloo.
+
+        This patch (almost) makes it possible to run WebKit performance tests
+        on the Chromium port for Android. There are a few things I had to do
+        in order to make this happen:
+
+        1) The worker number when creating a driver for a port is zero-based
+           for layout tests and elsewhere. Android uses this to determine
+           which device it has to run on, so make it zero based for performance
+           tests as well.
+
+        2) Tests aren't available on the Android device, so we start an HTTP
+           server that serves the tests to the device or emulator.
+
+        The one shortcoming of this patch is that chromium-android produces
+        some stderr output that confuses run-perf-tests. I'll address that
+        issue in a subsequent CL. This patch also depends on
+        https://codereview.chromium.org/11416182 in order to work.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidPort.start_http_server):
+        (ChromiumAndroidDriver._command_from_driver_input):
+        * Scripts/webkitpy/performance_tests/perftest.py:
+        (ReplayPerfTest.prepare):
+        * Scripts/webkitpy/performance_tests/perftestsrunner.py:
+        (PerfTestsRunner.__init__):
+        (PerfTestsRunner._parse_args):
+        (PerfTestsRunner._start_servers):
+        (PerfTestsRunner):
+        (PerfTestsRunner._stop_servers):
+        (PerfTestsRunner.run):
+        (PerfTestsRunner._run_tests_set):
+
+2012-11-27  Zan Dobersek  <zandobersek@gmail.com>
+
+        Remove use of deprecated logging from webkitpy.common and webkitpy.layout_tests
+        https://bugs.webkit.org/show_bug.cgi?id=103408
+
+        Reviewed by Dirk Pranke.
+
+        Remove the use of the deprecated log and error methods by replacing them with
+        logging through Python's logging.Logger objects.
+
+        This patch covers such changes in webkitpy.common and webkitpy.layout_tests and also
+        updates any affected unit test.
+
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        (ChangeLogEntry._parse_entry):
+        * Scripts/webkitpy/common/checkout/checkout.py:
+        * Scripts/webkitpy/common/checkout/checkout_unittest.py:
+        (CheckoutTest.test_apply_patch):
+        * Scripts/webkitpy/common/checkout/deps_mock.py:
+        (MockDEPS.write_variable):
+        * Scripts/webkitpy/common/checkout/scm/detection.py:
+        (SCMDetector.default_scm):
+        * Scripts/webkitpy/common/checkout/scm/detection_unittest.py:
+        (SCMDetectorTest.test_detect_scm_system):
+        * Scripts/webkitpy/common/checkout/scm/git.py:
+        (Git._check_git_architecture):
+        (Git._commit_on_branch):
+        * Scripts/webkitpy/common/checkout/scm/scm.py:
+        (SCM.ensure_clean_working_directory):
+        (SCM.ensure_no_local_commits):
+        (SCM.will.commit_locally_with_message):
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVN.apply_reverse_diff):
+        * Scripts/webkitpy/common/net/bugzilla/attachment.py:
+        (Attachment._validate_flag_value):
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla.py:
+        (Bugzilla._fetch_bug_page):
+        (Bugzilla.bug_id_for_attachment_id):
+        (Bugzilla.authenticate):
+        (Bugzilla._commit_queue_flag):
+        (Bugzilla.add_attachment_to_bug):
+        (Bugzilla.add_patch_to_bug):
+        (Bugzilla.create_bug):
+        (Bugzilla.clear_attachment_flags):
+        (Bugzilla.set_flag_on_attachment):
+        (Bugzilla.obsolete_attachment):
+        (Bugzilla.add_cc_to_bug):
+        (Bugzilla.post_comment_to_bug):
+        (Bugzilla.close_bug_as_fixed):
+        (Bugzilla.reassign_bug):
+        (reopen_bug):
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla_mock.py:
+        (MockBugzilla.create_bug):
+        (MockBugzilla.reassign_bug):
+        (MockBugzilla.set_flag_on_attachment):
+        (MockBugzilla.post_comment_to_bug):
+        (MockBugzilla.add_attachment_to_bug):
+        (MockBugzilla.add_patch_to_bug):
+        (MockBugzilla.reopen_bug):
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py:
+        (test_add_cc_to_bug):
+        (_assert_reopen):
+        (test_reopen_bug):
+        * Scripts/webkitpy/common/net/buildbot/buildbot_mock.py:
+        (MockBuilder.force_build):
+        * Scripts/webkitpy/common/net/credentials.py:
+        (Credentials._run_security_tool):
+        * Scripts/webkitpy/common/net/credentials_unittest.py:
+        (_assert_security_call):
+        * Scripts/webkitpy/common/net/irc/irc_mock.py:
+        (MockIRC.post):
+        (MockIRC.disconnect):
+        * Scripts/webkitpy/common/net/irc/ircproxy.py:
+        (IRCProxy.__init__):
+        (IRCProxy.disconnect):
+        * Scripts/webkitpy/common/net/irc/ircproxy_unittest.py:
+        (IRCProxyTest.test_trivial):
+        * Scripts/webkitpy/common/net/layouttestresults.py:
+        (ORWTResultsHTMLParser._failures_from_fail_row):
+        * Scripts/webkitpy/common/net/layouttestresults_unittest.py:
+        (test_failures_from_fail_row):
+        * Scripts/webkitpy/common/net/networktransaction.py:
+        * Scripts/webkitpy/common/net/resultsjsonparser.py:
+        (JSONTestResult._tokenize):
+        (JSONTestResult._failure_types_from_actual_result):
+        * Scripts/webkitpy/common/net/statusserver.py:
+        (StatusServer.update_status):
+        (StatusServer.update_svn_revision):
+        * Scripts/webkitpy/common/net/statusserver_mock.py:
+        (MockStatusServer.release_work_item):
+        (MockStatusServer.update_work_items):
+        (MockStatusServer.submit_to_ews):
+        (MockStatusServer.update_status):
+        * Scripts/webkitpy/common/net/unittestresults.py:
+        (UnitTestResults.results_from_string):
+        * Scripts/webkitpy/common/system/executive_mock.py:
+        (MockExecutive.running_pids):
+        (MockExecutive.run_and_throw_if_fail):
+        (MockExecutive.run_command):
+        (MockExecutive.popen):
+        * Scripts/webkitpy/common/system/user_mock.py:
+        (MockUser.confirm):
+        (MockUser.open_url):
+        * Scripts/webkitpy/common/system/workspace_unittest.py:
+        (WorkspaceTest.test_create_zip):
+        (WorkspaceTest.test_create_zip_exception):
+        * Scripts/webkitpy/common/watchlist/watchlist_mock.py:
+        (MockWatchList.determine_cc_and_messages):
+        * Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py:
+        (ChromiumWinTest.test_setup_environ_for_server_register_cygwin):
+        * Scripts/webkitpy/layout_tests/port/efl_unittest.py:
+        (EflPortTest.test_show_results_html_file):
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest.test_show_results_html_file):
+        * Scripts/webkitpy/layout_tests/port/mac_unittest.py:
+        (test_show_results_html_file):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (test_build_driver):
+        * Scripts/webkitpy/layout_tests/port/qt_unittest.py:
+        (QtPortTest.test_show_results_html_file):
+        * Scripts/webkitpy/layout_tests/port/win_unittest.py:
+        (WinPortTest.test_show_results_html_file):
+        * Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py:
+        (XvfbDriverTest.assertDriverStartSuccessful):
+        (XvfbDriverTest.test_start_no_pixel_tests):
+        (XvfbDriverTest.test_start_pixel_tests):
+        (XvfbDriverTest.test_start_arbitrary_worker_number):
+        (XvfbDriverTest.test_start_next_worker):
+        (XvfbDriverTest.test_stop):
+        * Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py:
+        (TestLayoutTestApacheHttpd.test_start_cmd):
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (test_run_test_pause_before_testing):
+        (test_run_memory_test):
+        (_test_run_with_json_output):
+        (test_run_respects_no_results):
+        (test_run_generates_and_show_results_page):
+        (test_run_respects_no_show_results):
+        * Scripts/webkitpy/tool/bot/feeders_unittest.py:
+        (FeedersTest.test_commit_queue_feeder):
+        * Scripts/webkitpy/tool/bot/flakytestreporter_unittest.py:
+        (FlakyTestReporterTest.test_create_bug_for_flaky_test):
+        (test_report_flaky_tests_creating_bug):
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py:
+        (IRCCommandTest.test_rollout_updates_working_copy):
+        * Scripts/webkitpy/tool/bot/ircbot_unittest.py:
+        (IRCBotTest.test_exception_during_command):
+        (IRCBotTest.test_hi):
+        (IRCBotTest.test_help):
+        (IRCBotTest.test_restart):
+        (IRCBotTest.test_rollout):
+        (IRCBotTest.test_revert):
+        (IRCBotTest.test_roll_chromium_deps):
+        (IRCBotTest.test_roll_chromium_deps_to_lkgr):
+        (IRCBotTest.test_multi_rollout):
+        (IRCBotTest.test_rollout_with_r_in_svn_revision):
+        (IRCBotTest.test_multi_rollout_with_r_in_svn_revision):
+        (IRCBotTest.test_rollout_bananas):
+        (IRCBotTest.test_rollout_invalidate_revision):
+        (IRCBotTest.test_rollout_invalidate_reason):
+        (test_multi_rollout_invalidate_reason):
+        (test_rollout_no_reason):
+        (test_multi_rollout_no_reason):
+        * Scripts/webkitpy/tool/bot/sheriff_unittest.py:
+        (SheriffTest.test_post_blame_comment_on_bug):
+        * Scripts/webkitpy/tool/commands/applywatchlistlocal_unittest.py:
+        (ApplyWatchListLocalTest.test_args_parsing):
+        (test_args_parsing_with_bug):
+        * Scripts/webkitpy/tool/commands/download_unittest.py:
+        (test_land_cowboy):
+        (test_check_style):
+        (test_create_rollout):
+        (test_create_rollout_resolved):
+        (test_rollout):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:
+        (AbstractEarlyWarningSystemTest.test_failing_tests_message):
+        (EarlyWarningSytemTest._default_expected_logs):
+        (EarlyWarningSytemTest._test_builder_ews):
+        (EarlyWarningSytemTest._test_testing_ews):
+        * Scripts/webkitpy/tool/commands/openbugs_unittest.py:
+        (OpenBugsTest.test_args_parsing):
+        * Scripts/webkitpy/tool/commands/queries_unittest.py:
+        (QueryCommandsTest.test_bugs_to_commit):
+        (QueryCommandsTest.test_patches_in_commit_queue):
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+        (FeederQueueTest.test_feeder_queue):
+        (AbstractPatchQueueTest.test_next_patch):
+        (AbstractPatchQueueTest.test_upload_results_archive_for_patch):
+        (CommitQueueTest.test_commit_queue):
+        (test_commit_queue_failure):
+        (test_commit_queue_failure_with_failing_tests):
+        (test_rollout):
+        (test_rollout_lands):
+        (test_auto_retry):
+        (test_manual_reject_during_processing):
+        (test_report_flaky_tests):
+        (StyleQueueTest.test_style_queue_with_style_exception):
+        (test_style_queue_with_watch_list_exception):
+        * Scripts/webkitpy/tool/commands/queuestest.py:
+        (QueuesTest._default_begin_work_queue_logs):
+        * Scripts/webkitpy/tool/commands/roll_unittest.py:
+        (RollCommandsTest.test_update_chromium_deps):
+        * Scripts/webkitpy/tool/commands/upload_unittest.py:
+        (UploadCommandsTest.test_assign_to_committer):
+        (test_post):
+        (test_attach_to_bug):
+        (test_attach_to_bug_no_description_or_comment):
+        (test_land_safely):
+        (test_prepare):
+        (test_upload):
+        (test_mark_bug_fixed):
+        * Scripts/webkitpy/tool/steps/applywatchlist_unittest.py:
+        (ApplyWatchListTest.test_apply_watch_list_local):
+        * Scripts/webkitpy/tool/steps/commit_unittest.py:
+        (CommitTest._test_check_test_expectations):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+        (RunTestsTest.test_webkit_run_unit_tests):
+        * Scripts/webkitpy/tool/steps/steps_unittest.py:
+        (StepsTest._assert_step_output_with_bug):
+        (StepsTest._assert_post_diff_output_for_bug):
+        (StepsTest.test_post_diff):
+        (StepsTest.test_post_diff_for_commit):
+        (StepsTest.test_ensure_bug_is_open_and_assigned):
+        (StepsTest.test_runtests_args):
+        * Scripts/webkitpy/tool/steps/suggestreviewers_unittest.py:
+        (SuggestReviewersTest.test_basic):
+        * Scripts/webkitpy/tool/steps/validatechangelogs_unittest.py:
+        (ValidateChangeLogsTest._assert_start_line_produces_output):
+
+2012-11-27  Pratik Solanki  <psolanki@apple.com>
+
+        objc/objc-runtime.h does not exist on all PLATFORM(MAC)
+        https://bugs.webkit.org/show_bug.cgi?id=101780
+
+        Reviewed by Brent Fulgham.
+
+        Clean up header includes so we don't include objc/objc-runtime.h.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        * DumpRenderTree/mac/ObjCPlugin.m:
+        * TestWebKitAPI/mac/InstanceMethodSwizzler.h:
+        * WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm:
+
+2012-11-27  Marja Hölttä  <marja@chromium.org>
+
+        Add callbacks to the FrameLoaderClient when a resource is requested
+        https://bugs.webkit.org/show_bug.cgi?id=92761
+
+        Reviewed by Adam Barth.
+
+        In Chromium, when an extension script cancels a network
+        request (which happens out of process), we'd like to
+        notify content scripts running on the current page about
+        which elements failed to load because the requests were
+        cancelled (as opposed to e.g. the network request just
+        didn't work). Since the resource request itself does not
+        carry any information what DOM element is was made for,
+        currently a content script has to search the DOM tree and
+        guess which requests will be cancelled by its counter
+        part. By adding these callbacks, the embedder can make
+        this connection explictly.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::dumpResourceRequestCallbacks):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        (DRTTestRunner::setShouldDumpResourceRequestCallbacks):
+        (DRTTestRunner::shouldDumpResourceRequestCallbacks):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::shouldDumpResourceRequestCallbacks):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::willRequestResource):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2012-11-27  Víctor Manuel Jáquez Leal  <vjaquez@igalia.com>
+
+        [GStreamer] Verify if GStreamer was previously initialized
+        https://bugs.webkit.org/show_bug.cgi?id=103151
+
+        Reviewed by Philippe Normand.
+
+        This patch adds the gst_init() in GtkLauncher, so we can add the
+        GStreamer options in the command line through
+        gst_init_get_option_group().
+
+        This approach is not valid for MiniBrowser because it uses WebKit2,
+        where the GStreamer backend lives in the web process, which is
+        different from the UI process.
+
+        * GNUmakefile.am:
+        * GtkLauncher/main.c:
+        (main):
+
+2012-11-27  Andras Becsi  <andras.becsi@digia.com>
+
+        [Qt] Fix the build with new Qt5 hash
+        https://bugs.webkit.org/show_bug.cgi?id=103406
+
+        Reviewed by Csaba Osztrogonác.
+
+        Remove references to deprecated QApplication::GuiServer which
+        has been removed, and use QStyleFactory::create instead of
+        instantiating a QWindowsStyle directly since it is about to
+        become an internal class.
+
+        * DumpRenderTree/qt/DumpRenderTreeMain.cpp:
+        (main):
+        * QtTestBrowser/qttestbrowser.cpp:
+        (LauncherApplication::LauncherApplication):
+        * WebKitTestRunner/InjectedBundle/qt/InjectedBundleQt.cpp:
+        (WTR::InjectedBundle::platformInitialize):
+
+2012-11-27  Sadrul Habib Chowdhury  <sadrul@chromium.org>
+
+        [style] Add a style-check for enum-member names
+        https://bugs.webkit.org/show_bug.cgi?id=103157
+
+        Reviewed by Daniel Bates.
+
+        * Scripts/webkitpy/style/checkers/cpp.py:
+        (_EnumState):
+        (_EnumState.__init__):
+        (_EnumState.process_clean_line):
+        (check_enum_casing):
+        (check_style):
+        (process_line):
+        (_process_lines):
+        (CppChecker):
+        * Scripts/webkitpy/style/checkers/cpp_unittest.py:
+        (NoNonVirtualDestructorsTest.test_enum_casing):
+        (NoNonVirtualDestructorsTest.test_internal_braces.Foo):
+
+2012-11-26  Ryuan Choi  <ryuan.choi@gmail.com>
+
+        [EFL][jhbuild] Disable unnecessary options of elementary module
+        https://bugs.webkit.org/show_bug.cgi?id=103360
+
+        Reviewed by Gyuyoung Kim.
+
+        When jhbuild configures elementary, unnecessary options may be enabled by
+        user installed modules and it causes build break.
+
+        * efl/jhbuild.modules:
+        Added --disable-emap --disable-ethumb --disable-eweather to elementary.
+
+2012-11-26  Varun Jain  <varunjain@chromium.org>
+
+        LongPress and LongTap gestures should start drag/drop and open context menu respectively.
+        https://bugs.webkit.org/show_bug.cgi?id=101545
+
+        Reviewed by Antonio Gomes.
+
+        For LongPress, we simulate drag by sending a mouse down and mouse drag
+        events. If a drag is not started (because maybe there is no draggable
+        element), then we show context menu instead (which is the current
+        behavior for LongPress). For LongTap, we use the existing functions that
+        LongPress uses to summon the context menu. LongPress initiated drag and
+        drop can be enabled/disabled by the platform using the Setting
+        touchDragDropEnabled which is disabled by default.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::gestureLongTap):
+        (WebTestRunner::EventSender::gestureEvent):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (EventSender):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::setTouchDragDropEnabled):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (TestRunner):
+
+2012-11-26  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [EFL][WK2] Add setting to enable / disable HTML5 local storage functionality
+        https://bugs.webkit.org/show_bug.cgi?id=103224
+
+        Reviewed by Laszlo Gombos.
+
+        Add --local-storage command line argument to MiniBrowser to
+        explicitely disable HTML5 local storage functionality. This
+        is useful for testing purposes.
+
+        * MiniBrowser/efl/main.c:
+        (window_create):
+        (elm_main):
+
+2012-11-26  Zan Dobersek  <zandobersek@gmail.com>
+
+        Remove use of deprecated logging from most of webkitpy.tool
+        https://bugs.webkit.org/show_bug.cgi?id=103180
+
+        Reviewed by Dirk Pranke.
+
+        Remove calls to log and error methods of the deprecated_logging module, replacing them
+        by using Python's Logger objects. This patch covers the switch in all of webkitpy.tool
+        except the QueueEngine.
+
+        Unit tests are adjusted for these changes, moving output from expected stderr to expected logs.
+
+        * Scripts/webkitpy/tool/bot/commitqueuetask_unittest.py:
+        (MockCommitQueue.run_command):
+        (MockCommitQueue.command_passed):
+        (MockCommitQueue.command_failed):
+        (MockCommitQueue.report_flaky_tests):
+        (MockCommitQueue.archive_last_test_results):
+        (CommitQueueTaskTest._run_through_task):
+        (CommitQueueTaskTest.test_success_case):
+        (test_fast_success_case):
+        (test_clean_failure):
+        (test_update_failure):
+        (test_apply_failure):
+        (test_validate_changelog_failure):
+        (test_build_failure):
+        (test_red_build_failure):
+        (test_flaky_test_failure):
+        (test_failed_archive):
+        (test_double_flaky_test_failure):
+        (test_test_failure):
+        (test_red_test_failure):
+        (test_very_red_tree_retry):
+        (test_red_tree_patch_rejection):
+        (test_land_failure):
+        * Scripts/webkitpy/tool/bot/feeders.py:
+        (CommitQueueFeeder._update_work_items):
+        (EWSFeeder.feed):
+        * Scripts/webkitpy/tool/bot/feeders_unittest.py:
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader.py:
+        (LayoutTestResultsReader.archive):
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py:
+        (test_archive_last_layout_test_results):
+        * Scripts/webkitpy/tool/bot/sheriff.py:
+        * Scripts/webkitpy/tool/commands/abstractsequencedcommand.py:
+        (AbstractSequencedCommand.execute):
+        * Scripts/webkitpy/tool/commands/commandtest.py:
+        (CommandsTest.assert_execute_outputs):
+        * Scripts/webkitpy/tool/commands/download.py:
+        (AbstractPatchProcessingCommand._process_patch.execute):
+        (ProcessBugsMixin._fetch_list_of_patches_to_process):
+        (ProcessURLsMixin._fetch_list_of_patches_to_process):
+        (AbstractRolloutPrepCommand._commit_info):
+        * Scripts/webkitpy/tool/commands/download_unittest.py:
+        (AbstractRolloutPrepCommandTest.test_commit_info):
+        (DownloadCommandsTest.test_build):
+        (DownloadCommandsTest.test_build_and_test):
+        (test_apply_attachment):
+        (test_apply_from_bug):
+        (test_apply_watch_list):
+        (test_land):
+        (test_land_red_builders):
+        (test_check_style):
+        (test_build_attachment):
+        (test_land_attachment):
+        (test_land_from_bug):
+        (test_land_from_url):
+        (test_prepare_rollout):
+        (test_create_rollout):
+        (test_create_rollout_resolved):
+        (test_rollout):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (AbstractEarlyWarningSystem.handle_script_error.does):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py:
+        (EarlyWarningSytemTest._default_expected_stderr):
+        (EarlyWarningSytemTest._default_expected_logs):
+        (EarlyWarningSytemTest._test_testing_ews):
+        * Scripts/webkitpy/tool/commands/openbugs.py:
+        (OpenBugs.execute):
+        * Scripts/webkitpy/tool/commands/openbugs_unittest.py:
+        (OpenBugsTest.test_args_parsing):
+        * Scripts/webkitpy/tool/commands/perfalizer.py:
+        (Perfalizer.handle_unexpected_error):
+        * Scripts/webkitpy/tool/commands/queries.py:
+        (PatchesInCommitQueue.execute):
+        (PatchesToCommitQueue._needs_commit_queue):
+        * Scripts/webkitpy/tool/commands/queries_unittest.py:
+        (QueryCommandsTest.test_bugs_to_commit):
+        (QueryCommandsTest.test_patches_in_commit_queue):
+        (QueryCommandsTest.test_patches_to_commit_queue):
+        * Scripts/webkitpy/tool/commands/queues.py:
+        (AbstractQueue._cc_watchers):
+        (AbstractQueue.begin_work_queue):
+        (FeederQueue.handle_unexpected_error):
+        (CommitQueue.handle_script_error):
+        (AbstractReviewQueue.handle_unexpected_error):
+        (AbstractReviewQueue.handle_script_error):
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+        (test_auto_retry):
+        * Scripts/webkitpy/tool/commands/queuestest.py:
+        (QueuesTest.assert_outputs):
+        (QueuesTest._default_begin_work_queue_stderr):
+        (QueuesTest):
+        (QueuesTest._default_begin_work_queue_logs):
+        (QueuesTest.assert_queue_outputs):
+        * Scripts/webkitpy/tool/commands/roll_unittest.py:
+        (RollCommandsTest.test_update_chromium_deps):
+        (test_update_chromium_deps_older_revision):
+        * Scripts/webkitpy/tool/commands/sheriffbot.py:
+        (SheriffBot.handle_unexpected_error):
+        * Scripts/webkitpy/tool/commands/stepsequence.py:
+        (StepSequence.run_and_handle_errors):
+        * Scripts/webkitpy/tool/commands/upload.py:
+        (AssignToCommitter._assign_bug_to_last_patch_attacher):
+        (AbstractPatchUploadingCommand._prepare_state):
+        (PostCommits.execute):
+        (MarkBugFixed._determine_bug_id_and_svn_revision):
+        (MarkBugFixed.execute):
+        (CreateBug.create_bug_from_commit):
+        (CreateBug.execute):
+        * Scripts/webkitpy/tool/commands/upload_unittest.py:
+        (test_obsolete_attachments):
+        (test_land_safely):
+        (test_mark_bug_fixed):
+        * Scripts/webkitpy/tool/multicommandtool.py:
+        (Command.check_arguments_and_execute):
+        (MultiCommandTool.main):
+        * Scripts/webkitpy/tool/multicommandtool_unittest.py:
+        (CommandTest.test_required_arguments):
+        * Scripts/webkitpy/tool/steps/addsvnmimetypeforpng.py:
+        (AddSvnMimetypeForPng.run):
+        * Scripts/webkitpy/tool/steps/applypatch.py:
+        (ApplyPatch.run):
+        * Scripts/webkitpy/tool/steps/build.py:
+        (Build.run):
+        * Scripts/webkitpy/tool/steps/checkstyle.py:
+        * Scripts/webkitpy/tool/steps/closebug.py:
+        (CloseBug.run):
+        * Scripts/webkitpy/tool/steps/closebugforlanddiff.py:
+        (CloseBugForLandDiff.run):
+        * Scripts/webkitpy/tool/steps/closebugforlanddiff_unittest.py:
+        (CloseBugForLandDiffTest.test_empty_state):
+        * Scripts/webkitpy/tool/steps/commit.py:
+        (Commit.run):
+        * Scripts/webkitpy/tool/steps/commit_unittest.py:
+        (CommitTest._test_check_test_expectations):
+        * Scripts/webkitpy/tool/steps/ensurelocalcommitifneeded.py:
+        (EnsureLocalCommitIfNeeded.run):
+        * Scripts/webkitpy/tool/steps/obsoletepatches.py:
+        (ObsoletePatches.run):
+        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog.run):
+        * Scripts/webkitpy/tool/steps/reopenbugafterrollout.py:
+        (ReopenBugAfterRollout.run):
+        * Scripts/webkitpy/tool/steps/runtests.py:
+        (RunTests.run):
+        * Scripts/webkitpy/tool/steps/runtests_unittest.py:
+        (RunTestsTest.test_webkit_run_unit_tests):
+        * Scripts/webkitpy/tool/steps/steps_unittest.py:
+        (StepsTest.test_update_step):
+        (StepsTest.test_runtests_args):
+        * Scripts/webkitpy/tool/steps/update.py:
+        (Update.run):
+        * Scripts/webkitpy/tool/steps/updatechangelogswithreview_unittest.py:
+        (UpdateChangeLogsWithReviewerTest.test_guess_reviewer_from_bug):
+        (UpdateChangeLogsWithReviewerTest.test_guess_reviewer_from_multipatch_bug):
+        * Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py:
+        (UpdateChangeLogsWithReviewer._guess_reviewer_from_bug):
+        (UpdateChangeLogsWithReviewer.run):
+        * Scripts/webkitpy/tool/steps/updatechromiumdeps.py:
+        (UpdateChromiumDEPS._validate_revisions):
+        (UpdateChromiumDEPS.run):
+        * Scripts/webkitpy/tool/steps/validatechangelogs.py:
+        (ValidateChangeLogs._check_changelog_diff):
+        (ValidateChangeLogs.run):
+        * Scripts/webkitpy/tool/steps/validatechangelogs_unittest.py:
+        (ValidateChangeLogsTest._assert_start_line_produces_output):
+        * Scripts/webkitpy/tool/steps/validatereviewer.py:
+        (ValidateReviewer.run):
+
+2012-11-26  Zan Dobersek  <zandobersek@gmail.com>
+
+        Coverage testing in webkitpy should omit some paths
+        https://bugs.webkit.org/show_bug.cgi?id=103267
+
+        Reviewed by Dirk Pranke.
+
+        Omit testing coverage of any file under /usr directory and any file
+        that is of third party origin and was autoinstalled.
+
+        * Scripts/webkitpy/test/main.py:
+        (Tester._run_tests):
+
+2012-11-26  Jaehun Lim  <ljaehun.lim@samsung.com>
+
+        Text Autosizing: Add Text Autosizing APIs for WK2
+        https://bugs.webkit.org/show_bug.cgi?id=100633
+
+        Reviewed by Sam Weinig.
+
+        Add test cases for Text Autosizing in WKPreferences.
+
+        * TestWebKitAPI/Tests/WebKit2/WKPreferences.cpp:
+        (TestWebKitAPI::TEST):
+
+2012-11-26  Pierre Rossi  <pierre.rossi@gmail.com>
+
+        [Qt] REGRESSION(r135575): It made all tests assert
+        https://bugs.webkit.org/show_bug.cgi?id=103169
+
+        Reviewed by Simon Hausmann.
+
+        This fixes another regression introduced in r135515:
+        initializeWebKitQt shouldn't implicitely call initializeWebCoreQt
+        since it can be called from WebKit2 to initialize QStyle for testing.
+        This would then lead to things such as PlatformStrategies being
+        initialized twice.
+
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp: Also propagate the change to DRT this time.
+        (WebCore::DumpRenderTree::DumpRenderTree):
+
+2012-11-24  Zan Dobersek  <zandobersek@gmail.com>
+
+        Add the --order option to NRWT
+        https://bugs.webkit.org/show_bug.cgi?id=102229
+
+        Reviewed by Dirk Pranke.
+
+        The --order option controls in what order the gathered tests will be run.
+        There are 3 options:
+        - natural, the tests are sorted in natural order,
+        - random, the tests are sorted in random order,
+        - none, the tests are kept in the order in which they were specified through
+        arguments or the test list.
+
+        The natural option is the default one and maintains the current behavior.
+
+        The none option is primarily intended to be used with the --test-list option,
+        with the test list file expected to list specific test names.
+        When a directory is specified as one of the paths from under which tests should
+        be gathered and the none option is used, that path will expand to all the tests
+        under it, with these tests sorted in the natural order.
+
+        Using --order=random duplicated the behavior of the --randomize-order option, so
+        the latter is removed.
+
+        This patch also incorporates the change with which makes it is possible to specify
+        a test via arguments or the test list multiple tests and then have the test run
+        that many times.
+
+        * Scripts/webkitpy/common/find_files.py:
+        (find): Accept an optional sorting key that is used to sort files found in the directories
+        that the given paths specify.
+        (_normalized_find): Both paths that are then searched for the tests and the tests that
+        were found are now kept in lists. This makes it possible to run a test multiple times
+        by specifying it multiple times through arguments or the test list file.
+        (_normalized_find.sort_by_directory_key):
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_finder.py:
+        (LayoutTestFinder.find_tests): Keep the paths where we should search for tests in a list.
+        (LayoutTestFinder.skip_tests): Subtracting from a set of paths is necessary.
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (LayoutTestRunner.__init__): The Sharder class no longer needs a test path separator.
+        (Sharder.__init__): Ditto.
+        (Sharder._resize_shards):
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        (SharderTests.get_shards): Modify the Shader initializing as required.
+        (SharderTests.test_multiple_locked_shards): The natural sorting and test name key unit tests
+        are now moved to the base Port unit tests.
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._prepare_lists): Keep the test names in a list. Order that list as specified by
+        the new --order option.
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.tests): This method should now return a list of all the tests found in the specified
+        paths.
+        (Port._real_tests): A list is required, so no conversion to a set is made.
+        (Port):
+        (Port.test_key): Place this method here for now, but it should really move into a separate
+        module.
+        (Port._natural_sort_key): Ditto.
+        (Port._natural_sort_key.tryint):
+        (Port._virtual_tests): A list is required, so the function now operates on that rather than
+        on a set.
+        * Scripts/webkitpy/layout_tests/port/base_unittest.py:
+        (PortTest.test_find_with_skipped_directories_2): Adjust the test case to check for an empty
+        list rather than an empty set.
+        (PortTest.test_dont_require_http_server):
+        (NaturalCompareTest): The natural sorting unit tests are placed here for now.
+        (NaturalCompareTest.assert_cmp):
+        (NaturalCompareTest.test_natural_compare):
+        (KeyCompareTest): The test name key unit tests are placed here for now.
+        (KeyCompareTest.assert_cmp):
+        (KeyCompareTest.test_test_key):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (parse_args): Remove the --randomize-order option, it's now possible to replicate its behavior
+        by using --order=random.
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py: Add unit tests covering
+        various aspects of this change.
+        (MainTest.test_natural_order):
+        (MainTest):
+        (MainTest.test_natural_order_test_specified_multiple_times):
+        (MainTest.test_random_order):
+        (MainTest.test_random_order_test_specified_multiple_times):
+        (MainTest.test_no_order):
+        (MainTest.test_no_order_test_specified_multiple_times):
+        (MainTest.test_no_order_with_directory_entries_in_natural_order):
+        * Scripts/webkitpy/tool/commands/queries.py:
+        (PrintExpectations.execute): Operate on a set of tests when printing out expectations.
+
+2012-11-24  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r135600.
+        http://trac.webkit.org/changeset/135600
+        https://bugs.webkit.org/show_bug.cgi?id=103173
+
+        It made EFL API test is failed (Requested by gyuyoung_mbp on
+        #webkit).
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+        * TestWebKitAPI/efl/PlatformUtilities.cpp:
+        (TestWebKitAPI::Util::sleep):
+        * TestWebKitAPI/efl/PlatformWebView.cpp:
+
+2012-11-23  Alexis Menard  <alexis@webkit.org>
+
+        [CSS3 Backgrounds and Borders] Implement new CSS3 background-position parsing.
+        https://bugs.webkit.org/show_bug.cgi?id=102104
+
+        Reviewed by Julien Chaffraix.
+
+        Protect the new feature behind a feature flag.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2012-11-23  Mario Sanchez Prada  <mario@webkit.org>
+
+        Unreviewed. Update my e-mail address.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-23  Mateusz Leszko  <m.leszko@samsung.com>
+
+        [EFL][GTK] Adapt accessibility feature to WebKitTestRunner.
+        https://bugs.webkit.org/show_bug.cgi?id=100757
+
+        Reviewed by Laszlo Gombos.
+
+        Allow to build accessibility feature in WebkitTestRunner for EFL Platform.
+        Updating CMake files due to changes from Bug 99011.
+
+        * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
+        (WTR::AccessibilityController::AccessibilityController):
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/AccessibilityController.h:
+        (AccessibilityController):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
+        (AccessibilityUIElement):
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp: - Removed gtk/gtk.h dependency.
+        * WebKitTestRunner/PlatformEfl.cmake: - Adding atk includes.
+
+2012-11-16  Yury Semikhatsky  <yurys@chromium.org>
+
+        Memory instrumentation: extract MemoryObjectInfo declaration into a separate file
+        https://bugs.webkit.org/show_bug.cgi?id=102510
+
+        Reviewed by Pavel Feldman.
+
+        Added missing includes.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+2012-11-23  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Add support for PlatformWebView::simulateSpacebarKeyPress() in TestWebKitAPI
+        https://bugs.webkit.org/show_bug.cgi?id=103123
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add support for PlatformWebView::simulateSpacebarKeyPress() and enable
+        WebKit2 API test ResponsivenessTimerDoesntFireEarly.
+
+        * TestWebKitAPI/PlatformEfl.cmake: Enable ResponsivenessTimerDoesntFireEarly
+        test.
+        * TestWebKitAPI/efl/PlatformUtilities.cpp:
+        (TestWebKitAPI::Util::sleep): Use usleep() instead of sleep since the
+        test case is passing 0.5 seconds to sleep.
+        * TestWebKitAPI/efl/PlatformWebView.cpp:
+        (TestWebKitAPI::PlatformWebView::simulateSpacebarKeyPress): Implemented.
+        (TestWebKitAPI):
+
+2012-11-23  Wojciech Bielawski  <w.bielawski@samsung.com>
+
+        [WK2][WKTR] WebKitTestRunner needs eventSender.contextClick()
+        https://bugs.webkit.org/show_bug.cgi?id=86881
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        eventSender object extended with contextClick() method in WebKitTestRunner.
+        contextClick() method returns an array of menu items objects with field 'title' containing title of single
+        context menu entry. According to some tests menu items objects shall also support 'click()' method, but it's not
+        delivered in this patch.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
+        * WebKitTestRunner/InjectedBundle/EventSendingController.cpp:
+        (WTR::EventSendingController::contextClick):
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/EventSendingController.h:
+        (EventSendingController):
+
+2012-11-23  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] Compiling against QtWebkit API requires QT_DLL to be defined
+        https://bugs.webkit.org/show_bug.cgi?id=102942
+
+        Reviewed by Tor Arne Vestbø.
+
+        Remove the requirement of having QT_DLL defined in order for the QWEBKIT_EXPORT
+        macro to be defined as Q_DECL_IMPORT. Instead unify the export macro definition
+        to follow the same rules as other Qt 5 modules, with the exception that instead of
+        QT_BUILD_WEBKIT_LIB we continue to use BUILDING_WEBKIT, because that's used also
+        in other cross-platform header files to determine the correct meaning of export
+        macros.
+
+        * qmake/mkspecs/features/default_post.prf:
+        * qmake/mkspecs/features/win32/default_post.prf:
+
+2012-11-23  Simon Hausmann  <simon.hausmann@digia.com>
+
+        [Qt] QWebPage::shouldInterruptJavaScript should be virtual in Qt 5
+        https://bugs.webkit.org/show_bug.cgi?id=103111
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        This function was added as a slot during Qt 4.x times because adding
+        virtual functions breaks binary compatibility. This constraint is gone
+        with the initial release of WebKit with Qt 5, and therefore we can
+        make it virtual now.
+
+        The change is fully source compatible as existing "re-implementations"
+        as slots will now be called through it being a virtual function. They
+        become unused slots.
+
+        * DumpRenderTree/qt/DumpRenderTreeQt.h:
+        (WebCore::WebPage::shouldInterruptJavaScript):
+        (WebPage):
+        * QtTestBrowser/webpage.h:
+        (WebPage):
+
+2012-11-22  Peter Beverloo  <peter@chromium.org>
+
+        [Chromium] Return an accurate exit code when running Android suites, and wait after restarting adb as root
+        https://bugs.webkit.org/show_bug.cgi?id=103065
+
+        Reviewed by Dirk Pranke.
+
+        This addresses two further reliability issues in the Android test running
+        scripts. Firstly, the run_tests.py script needs to have the --exit_code
+        argument passed in order to return non-zero codes, which we need for the
+        build master to distinguish failures from successful runs.
+
+        Secondly, it modifies the layout test runner to briefly wait (through
+        the wait-for-device command) after requesting a device to switch to root
+        mode. Without this waiting period, commands might get lost and thereby
+        unexpectedly fail.
+
+        * Scripts/run-api-tests:
+        * Scripts/run-chromium-webkit-unit-tests:
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidDriver._setup_test):
+        (ChromiumAndroidDriver._restart_adb_as_root):
+
+2012-11-22  Simon Hausmann  <simon.hausmann@digia.com>, Pierre Rossi <pierre.rossi@digia.com>
+
+        [Qt] Separate QWidget dependant code into separate WebKitWidgets static library
+        https://bugs.webkit.org/show_bug.cgi?id=102800
+
+        Reviewed by Tor Arne Vestbø.
+
+        This patch separates code that needs to use QWidget related APIs in
+        WebKit/qt/WebCoreSupport and Api from code that doesn't. This means for
+        example FrameLoaderClientQt.cpp remains in the WebKit1 static library,
+        while qwebpage.cpp and qwebframe.cpp become part of the WebKitWidgets
+        static library. WebKit1 is compiled without QT += widgets and therefore
+        any widget related dependency has been moved "up" and out of WebKit1 into
+        the WebKitWidgets library.
+
+        Between the code in WebKit.a and WebKitWidgets.a new adapters and
+        interfaces have been introduced, such as QWebPageAdapter and
+        QWebFrameAdapter. QWebPageAdapter, when used from WebKit1, is a way to
+        call out into the API layer, implemented by QWebPage (QWebPagePrivate).
+        The other way around if QWebPage wants to access WebCore or
+        WebCoreSupport related functionality, it will go through
+        QWebPageAdapater (as base class). The separation in the direction up
+        into the API layer is complete with this patch, no code in WebKit1
+        depends on QtWidgets. The separation the other way around, code in the
+        API layer not using any WebCore types, is not complete yet.
+
+        Some classes such as QWebSettings, QWebElement or
+        DumpRenderTreeSupportQt remain in WebKit1. While they are API layer,
+        they do not depend on widget related Qt APIs and they make much more
+        use of WebCore internal APIs and therefore are easier to keep in
+        WebKit1.
+
+        In the future we plan to place a real shared library boundary between
+        WebKit1 and WebKitWidgets, by keeping the WebKit1 static library as
+        part of the QtWebKit shared library and by turning the WebKitWidgets
+        static library into a shared one.
+
+        * DumpRenderTree/qt/DumpRenderTreeQt.cpp:
+        (WebCore::WebPage::resetSettings):
+        (WebCore::WebPage::createWindow):
+        (WebCore::DumpRenderTree::DumpRenderTree):
+        (WebCore::DumpRenderTree::resetToConsistentStateBeforeTesting):
+        (WebCore::DumpRenderTree::initJSObjects):
+        (WebCore::DumpRenderTree::dumpFrameScrollPosition):
+        (WebCore::DumpRenderTree::dumpFramesAsText):
+        (WebCore::DumpRenderTree::dump):
+        (WebCore::DumpRenderTree::createWindow):
+        (WebCore::DumpRenderTree::pageAdapter):
+        (WebCore):
+        (WebCore::DumpRenderTree::mainFrameAdapter):
+        * DumpRenderTree/qt/DumpRenderTreeQt.h:
+        (DumpRenderTree):
+        * DumpRenderTree/qt/EventSenderQt.cpp:
+        (EventSender::contextClick):
+        (EventSender::scalePageBy):
+        * DumpRenderTree/qt/TestRunnerQt.cpp:
+        (TestRunner::reset):
+        (TestRunner::display):
+        (TestRunner::closeWebInspector):
+        (TestRunner::showWebInspector):
+        (TestRunner::evaluateInWebInspector):
+        (TestRunner::setFrameFlatteningEnabled):
+        (TestRunner::goBack):
+        (TestRunner::setDefersLoading):
+        (TestRunner::pauseAnimationAtTimeOnElementWithId):
+        (TestRunner::pauseTransitionAtTimeOnElementWithId):
+        (TestRunner::numberOfActiveAnimations):
+        (TestRunner::setCaretBrowsingEnabled):
+        (TestRunner::setAuthorAndUserStylesEnabled):
+        (TestRunner::callShouldCloseOnWebView):
+        (TestRunner::setSmartInsertDeleteEnabled):
+        (TestRunner::setSelectTrailingWhitespaceEnabled):
+        (TestRunner::execCommand):
+        (TestRunner::isCommandEnabled):
+        (TestRunner::findString):
+        (TestRunner::elementDoesAutoCompleteForElementWithId):
+        (TestRunner::setMockDeviceOrientation):
+        (TestRunner::setGeolocationPermission):
+        (TestRunner::numberOfPendingGeolocationPermissionRequests):
+        (TestRunner::setMockGeolocationPositionUnavailableError):
+        (TestRunner::setMockGeolocationPosition):
+        (TestRunner::evaluateScriptInIsolatedWorld):
+        (TestRunner::addUserStyleSheet):
+        (TestRunner::setMinimumTimerInterval):
+        * DumpRenderTree/qt/TextInputControllerQt.cpp:
+        (TextInputController::selectedRange):
+        (TextInputController::firstRectForCharacterRange):
+        (TextInputController::unmarkText):
+        * DumpRenderTree/qt/WorkQueueItemQt.cpp:
+        (LoadAlternateHTMLStringItem::invoke):
+        * qmake/mkspecs/features/default_post.prf:
+        * qmake/mkspecs/features/production_build.prf:
+        * qmake/mkspecs/features/webkit_modules.prf:
+        * qmake/mkspecs/modules/webkitwidgets.prf: Added.
+
+2012-11-22  Christophe Dumez  <christophe.dumez@intel.com>
+
+        WebKitTestRunner needs layoutTestController.setCacheModel
+        https://bugs.webkit.org/show_bug.cgi?id=42684
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add support for testRunner.setCacheModel to WebKitTestRunner.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::beginTesting):
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setCacheModel):
+        (WTR):
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (TestRunner):
+
+2012-11-22  Balazs Kelemen  <kbalazs@webkit.org>
+
+        [Qt][WTR] TestController::platformRunUntil should not do busy waiting
+        https://bugs.webkit.org/show_bug.cgi?id=101327
+
+        Reviewed by Simon Hausmann.
+
+        Avoid busy waiting for events in platformRunUntil while making
+        sure we don't change the behavior of modal event loops.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::~TestController):
+        * WebKitTestRunner/TestController.h:
+        (TestController):
+        * WebKitTestRunner/efl/TestControllerEfl.cpp:
+        (WTR::TestController::platformDestroy):
+        (WTR):
+        * WebKitTestRunner/gtk/TestControllerGtk.cpp:
+        (WTR::TestController::platformDestroy):
+        (WTR):
+        * WebKitTestRunner/mac/TestControllerMac.mm:
+        (WTR::TestController::platformDestroy):
+        (WTR):
+        * WebKitTestRunner/qt/TestControllerQt.cpp:
+        (TestController::RunLoop): Helper class to handle
+        the event loop logic
+        (WTR):
+        (WTR::TestController::RunLoop::RunLoop):
+        (WTR::TestController::RunLoop::runUntil): Use QEventLoop to implement
+        the run loop. This is the appropriate API to push the WaitForMoreEvents
+        flag to QCoreApplication::processEvents and also being able to exit the
+        loop if we have timed out.
+        (WTR::TestController::RunLoop::notifyDone):
+        (WTR::TestController::RunLoop::timerFired):
+        (WTR::TestController::RunLoop::runModal):
+        (WTR::TestController::notifyDone):
+        (WTR::TestController::platformInitialize):
+        (WTR::TestController::platformDestroy):
+        (WTR::TestController::platformRunUntil):
+        (WTR::TestController::runModal):
+        * WebKitTestRunner/win/TestControllerWin.cpp:
+        (WTR::TestController::platformDestroy):
+        (WTR):
+
+2012-11-22  Sudarsana Nagineni  <sudarsana.nagineni@intel.com>
+
+        [EFL][WK2] Enable WKPreferences and AboutBlankLoad API tests
+        https://bugs.webkit.org/show_bug.cgi?id=102926
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add missing bits needed by WKPreferences and AboutBlankLoad API
+        tests in the test harness and enable these tests on EFL port.
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+        * TestWebKitAPI/Tests/WebKit2/WKPreferences.cpp:
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/efl/PlatformUtilities.cpp:
+        (TestWebKitAPI::Util::MIMETypeForWKURLResponse):
+        (Util):
+
+2012-11-21  Zan Dobersek  <zandobersek@gmail.com>
+
+        [GTK][WTR] Implement AccessibilityUIElement::stringValue
+        https://bugs.webkit.org/show_bug.cgi?id=102951
+
+        Reviewed by Martin Robinson.
+
+        Implement AccessibilityUIElement::stringValue in the ATK backend
+        in the same manner it is implemented in DumpRenderTree.
+
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp:
+        (WTR::replaceCharactersForResults):
+        (WTR):
+        (WTR::AccessibilityUIElement::stringValue):
+
+2012-11-21  Vineet Chaudhary  <rgf748@motorola.com>
+
+        Unreviewed. Adding myself to committers.py.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-21  Tien-Ren Chen  <trchen@chromium.org>
+
+        [chromium] Device scale factor should be no-op when applyDeviceScaleFactorInCompositor == 0
+        https://bugs.webkit.org/show_bug.cgi?id=100061
+
+        Reviewed by Adam Barth.
+
+        On Android we're using a different pixel scaling implementation
+        (WebCore::Settings::applyDefaultDeviceScaleFactorInCompositor() == 0) than other
+        platforms. In this mode, we don't make use of device-independent pixels. Device
+        scale factor is provided to WebKit and get merged into page scale factor. Other
+        than that device scale factor should have no effects on rendering.
+
+        * DumpRenderTree/chromium/WebPreferences.cpp:
+        (WebPreferences::applyTo):
+
+2012-11-21  Fady Samuel  <fsamuel@chromium.org>
+
+        Clear MousePressed state on context menu to avoid initiating a drag
+        https://bugs.webkit.org/show_bug.cgi?id=101786
+
+        Reviewed by Ojan Vafai.
+
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.cpp:
+        (WebTestRunner):
+        (WebTestRunner::EventSender::EventSender):
+        (WebTestRunner::EventSender::contextClick):
+        Only send a MouseUp on Windows. Keep the current mouse pressed state when
+        calling up a context menu.
+
+2012-11-21  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [EFL] KURL unit test crashing when tiled backing store is enabled on Release Bots
+        https://bugs.webkit.org/show_bug.cgi?id=102895
+
+        Reviewed by Gyuyoung Kim.
+
+        Change the link order so it wont override the new operator on gtest.
+        Looks like it was crashing because an allocator mismatch (using libc's
+        new and later fastMalloc delete. Thanks to Kangil Han for hinting on
+        the fastMalloc issue.
+
+        * TestWebKitAPI/CMakeLists.txt:
+
+2012-11-21  Kentaro Hara  <haraken@chromium.org>
+
+        Unreviewed, rolling out r135340.
+        http://trac.webkit.org/changeset/135340
+        https://bugs.webkit.org/show_bug.cgi?id=102492
+
+        It broke Safari's internal build
+
+        * WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm:
+        (new):
+        (GenerateModule):
+        (GenerateInterface):
+        (finish):
+
+2012-11-21  Yael Aharon  <yael.aharon@intel.com>, Gyuyoung Kim <gyuyoung.kim@samsung.com>
+
+        [EFL] Turn on WTF_USE_TILED_BACKING_STORE by default
+        https://bugs.webkit.org/show_bug.cgi?id=101526
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Turn on WTF_USE_TILED_BACKING_STORE for EFL port.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * TestWebKitAPI/CMakeLists.txt: No include KURL.cpp because of API test crash.
+
+2012-11-21  Jongseok Yang  <js45.yang@samsung.com>
+
+        [EFL][WK2] Rename ewk_view_setting_encoding_custom_XXX to ewk_view_custom_encoding_XXX
+        https://bugs.webkit.org/show_bug.cgi?id=102867
+
+        Reviewed by Gyuyoung Kim.
+
+        Rename ewk_view_setting_encoding_custom_XXX to ewk_view_custom_encoding_XXX.
+
+        ewk_view_setting_encoding_custom_XXX APIs might be misunderstanded as the "setting" word
+        because ewk_view_setting_encoding_custom_set triggers the "reload" operation.
+        And ewk_view_setting_XXX is not correct because there is ewk_settings object for settings.
+
+        * MiniBrowser/efl/main.c:
+        (on_key_down):
+
+2012-11-20  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r133859.
+        http://trac.webkit.org/changeset/133859
+        https://bugs.webkit.org/show_bug.cgi?id=102875
+
+        This patch makes API test broken (Requested by gyuyoung on
+        #webkit).
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-11-20  Jinwoo Song  <jinwoo7.song@samsung.com>
+
+        [EFL][WK2] Add Ewk_Window_Features API and related UI callbacks
+        https://bugs.webkit.org/show_bug.cgi?id=99114
+
+        Reviewed by Gyuyoung Kim.
+
+        Implemented window_create and window_close smartcallback functions.
+
+        * MiniBrowser/efl/main.c:
+        (on_window_create):
+        (on_window_close):
+        (window_create):
+
+2012-11-20  Ojan Vafai  <ojan@chromium.org>
+
+        Simplify builder filters now that we have lists of which builders run which tests
+        https://bugs.webkit.org/show_bug.cgi?id=102849
+
+        Reviewed by Dirk Pranke.
+
+        We only need filters when we load the same master for multiple groups in the
+        same test type, i.e. when we need to only include some of the builders that run
+        a given test suite on a given master.
+
+        Also, get rid of the DEFAULT_BUILDER enum. We were always using the first builder anyways.
+        Now just make it a method on BuilderGroup.
+
+        * TestResultServer/static-dashboards/builders.js:
+        (BuilderGroup.prototype.append):
+        (BuilderGroup.prototype.setup):
+        (BuilderGroup.prototype._defaultBuilder):
+        (BuilderGroup.prototype.master):
+        (requestBuilderList):
+        (isChromiumWebkitTipOfTreeTestRunner):
+        (isChromiumWebkitDepsTestRunner):
+        (loadBuildersList):
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        (test):
+
+2012-11-20  Ojan Vafai  <ojan@chromium.org>
+
+        Remove perfav master for webkit_unit_tests and test_shell_tests.
+        There are no bots on this master that run these tests.
+        * TestResultServer/static-dashboards/builders.js:
+
+2012-11-20  Ojan Vafai  <ojan@chromium.org>
+
+        Remove special case for layout tests when builders fail to load
+        https://bugs.webkit.org/show_bug.cgi?id=102842
+
+        Reviewed by Tony Chang.
+
+        Now that we load only builders that actually run the given test
+        type, we can reliably show errors to the users because it
+        represents a broken bot.
+        * TestResultServer/static-dashboards/loader.js:
+
+2012-11-15  Ojan Vafai  <ojan@chromium.org>
+
+        Generate a list of builders/test suites from the buildbot json
+        https://bugs.webkit.org/show_bug.cgi?id=102443
+
+        Reviewed by Dirk Pranke.
+
+        Instead of the cludgy things we do now to track which bots run which tests,
+        we generate all that data from the buildbots' json files.
+        This is the minimal amount to keep everything working. Once this lands,
+        we can also do a bunch of followup cleanup.
+
+        For now we commit the generated data. In theory, in the future, we could
+        have the test results server generate the data on the fly.
+
+        For the sake of easily understanding what changes when we run the generate script,
+        also checkin a pretty printed version of the output. The pretty printed version
+        is too large to serve as part of the flakiness dashboard though.
+
+        This also has the benefit of making the dashboard load much faster since
+        we no longer ever need to block on requests to buildbot.
+
+        * TestResultServer/generate_builders_json.py: Added.
+        (master_json_url):
+        (builder_json_url):
+        (cached_build_json_url):
+        (fetch_json):
+        (insert_builder_and_test_data):
+        (main):
+        * TestResultServer/generate_builders_json_unittest.py: Added.
+        (GenerateBuildersJsonTest):
+        (GenerateBuildersJsonTest.test_master_json_url):
+        (GenerateBuildersJsonTest.test_builder_json_url):
+        (GenerateBuildersJsonTest.test_cached_build_json_url):
+        (GenerateBuildersJsonTest.test_generate_json_data):
+        (GenerateBuildersJsonTest.test_generate_json_data.dummy_fetch_json):
+        * TestResultServer/static-dashboards/builders-pretty.jsonp: Added.
+        * TestResultServer/static-dashboards/builders.js:
+        (LOAD_BUILDBOT_DATA):
+        (BuilderGroup):
+        (BuilderGroup.prototype.append):
+        (BuilderGroup.prototype.master):
+        (requestBuilderList):
+        * TestResultServer/static-dashboards/builders.jsonp: Added.
+        * TestResultServer/static-dashboards/builders_unittests.js: Added.
+        * TestResultServer/static-dashboards/dashboard_base.js:
+        * TestResultServer/static-dashboards/flakiness_dashboard.js:
+        (showPopupForBuild):
+        (htmlForTestResults):
+        (htmlForIndividualTestOnAllBuildersWithResultsLinks):
+        (loadExpectationsLayoutTests):
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+        (resetGlobals):
+        (test):
+        * TestResultServer/static-dashboards/loader.js:
+        * TestResultServer/static-dashboards/loader_unittests.js:
+        * TestResultServer/static-dashboards/run-embedded-unittests.html:
+        * TestResultServer/static-dashboards/run-unittests.html:
+        * TestResultServer/static-dashboards/timeline_explorer.html:
+
+2012-11-20  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [WTR][Qt] Enable fixedLayout when needed by the test
+        https://bugs.webkit.org/show_bug.cgi?id=102811
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Create a flickable view for CSS Device Adaptation tests. This is
+        crucial for testing them since they will change the size of the
+        viewport.
+
+        * WebKitTestRunner/PlatformWebView.h:
+        (PlatformWebView):
+        * WebKitTestRunner/qt/PlatformWebViewQt.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+        (WTR::PlatformWebView::viewSupportsOptions):
+        (WTR):
+        * WebKitTestRunner/qt/main.cpp:
+        (main):
+
+2012-11-20  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        [WTR] WebKitTestRunner should be able to run tests using fixed layout
+        https://bugs.webkit.org/show_bug.cgi?id=102517
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        WTR will now request the creation of a view that has a page using
+        fixed layout for CSS Device Adaptation tests, but this feature might
+        be used in the future by any other test that requires a mobile-like type
+        of viewport (i.e. Viewport META tests should be ported).
+
+        The viewport type of the other tests remains unchanged and is restored
+        when the runner leaves the device-adapt/ folder.
+
+        * WebKitTestRunner/PlatformWebView.h:
+        (PlatformWebView):
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR):
+        (WTR::shouldUseFixedLayout):
+        (WTR::updateLayoutType):
+        (WTR::TestInvocation::invoke):
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+        (WTR::PlatformWebView::viewSupportsOptions):
+        (WTR):
+
+2012-11-20  Csaba Osztrogonác  <ossy@webkit.org>
+
+        [Qt] REGRESSION(r128174): Fast build path doesn't work now
+        https://bugs.webkit.org/show_bug.cgi?id=100360
+
+        Reviewed by Tor Arne Vestbø.
+
+        Use a separated .builtRevisions.cache file instead of .qmake.cache to cache built SVN revisions.
+
+        * Scripts/webkitdirs.pm:
+        (buildQMakeProjects):
+
+2012-11-20  Mateusz Leszko  <m.leszko@samsung.com>
+
+        [EFL][GTK]Sharing accessibility support in WebKitTestRunner.
+        https://bugs.webkit.org/show_bug.cgi?id=99011
+
+        Reviewed by Martin Robinson.
+
+        Accessibility files from gtk folder are moved to atk folder due to common implementation. Event Type naming changed to default, from Gtk to ATK.
+
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp: Renamed from Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityControllerGtk.cpp.
+        (WTR::AccessibilityController::logAccessibilityEvents):
+        * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp: Renamed from Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityUIElementGtk.cpp.
+
+2012-11-20  Zan Dobersek  <zandobersek@gmail.com>
+
+        webkitpy unit tests should run serially when checking code coverage
+        https://bugs.webkit.org/show_bug.cgi?id=102693
+
+        Reviewed by Dirk Pranke.
+
+        When checking code coverage, the unit tests should not be run in parallel
+        as this causes the tracing functions (set via sys.settrace in the coverage
+        module) being overriden, resulting in incorrect coverage reports.
+
+        * Scripts/webkitpy/test/main.py:
+        (Tester._run_tests):
+
+2012-11-19  Viatcheslav Ostapenko  <v.ostapenko@samsung.com>
+
+        [EFL] Add fallback for WebkitTestRunner if opengl is not available.
+        https://bugs.webkit.org/show_bug.cgi?id=102704
+
+        Reviewed by Laszlo Gombos.
+
+        Add fallback to non-opengl evas engine in WebkitTestRunner if opengl is not available.
+
+        * WebKitTestRunner/efl/PlatformWebViewEfl.cpp:
+        (WTR::initEcoreEvas):
+
+2012-11-19  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        [garden-o-matic] Switch frontend to use the gardeningserver.
+        https://bugs.webkit.org/show_bug.cgi?id=102712
+
+        Reviewed by Dirk Pranke.
+
+        Instead of serving garden-o-matic frontend as file, we now serve it from the gardening server. This enables
+        using garden-o-matic in a Chrome OS device, with a separate machine as a headless server.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/garden-o-matic.html: Changed CSP policy to use 'self'.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout.js: Removed now-unnecessary references to kLocalServerURL.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/checkout_unittests.js: Tweaked the test expectation.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/config.js: Removed kLocalServerURL.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js: Spuriously updated the name of the webkit-patch command.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js: Removed kLocalServerURL.
+        * Scripts/webkitpy/tool/servers/gardeningserver.py: Changed to use the new launch URL.
+
+2012-11-19  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r135172.
+        http://trac.webkit.org/changeset/135172
+        https://bugs.webkit.org/show_bug.cgi?id=102710
+
+        Broke some WebKit2 api tests :( (Requested by japhet on
+        #webkit).
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::updateForCommittedLoad):
+
+2012-11-19  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        [garden-o-matic] Enable serving garden-o-matic with gardeningserver.
+        https://bugs.webkit.org/show_bug.cgi?id=102703
+
+        Reviewed by Ojan Vafai.
+
+        To enable gardening from a Chrome OS device, we need the ability to serve garden-o-matic
+        from the same origin as the gardening server. This change gently massages the current
+        logic to adapt an extension-sniffing-based approach of identifying static files,
+        rather than requiring an explicit list.
+
+        * Scripts/webkitpy/tool/servers/reflectionhandler.py:
+        (ReflectionHandler): Replaced STATIC_FILE_NAMES with STATIC_FILE_EXTENSIONS.
+        (ReflectionHandler._handle_request): Changed the logic to smell for extensions, rather than specific files.
+        * Scripts/webkitpy/tool/servers/reflectionhandler_unittest.py: Added.
+
+2012-11-19  Ojan Vafai  <ojan@chromium.org>
+
+        Add DOM and HTML watchlists and add myself to a bunch of lists
+        https://bugs.webkit.org/show_bug.cgi?id=102707
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-11-19  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move methods that only use the WebKit API from DRTTestRunner to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=102676
+
+        Reviewed by Tony Chang.
+
+        In addition, I've replaced parsePageNumber with the more commonly used
+        cppVariantToInt32, moved abortModal to the list of stubbed out methods,
+        and removed setAutomaticLinkDetectionEnabled which wasn't used
+        anywhere.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        (DRTTestRunner::overridePreference):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner::TestRunner::reset):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::setTabKeyCyclesThroughElements):
+        (WebTestRunner::TestRunner::setAsynchronousSpellCheckingEnabled):
+        (WebTestRunner::TestRunner::execCommand):
+        (WebTestRunner::TestRunner::isCommandEnabled):
+        (WebTestRunner::TestRunner::pauseAnimationAtTimeOnElementWithId):
+        (WebTestRunner::TestRunner::pauseTransitionAtTimeOnElementWithId):
+        (WebTestRunner::TestRunner::elementDoesAutoCompleteForElementWithId):
+        (WebTestRunner::TestRunner::numberOfActiveAnimations):
+        (WebTestRunner::TestRunner::callShouldCloseOnWebView):
+        (WebTestRunner::TestRunner::setDomainRelaxationForbiddenForURLScheme):
+        (WebTestRunner::TestRunner::evaluateScriptInIsolatedWorldAndReturnValue):
+        (WebTestRunner::TestRunner::evaluateScriptInIsolatedWorld):
+        (WebTestRunner::TestRunner::setIsolatedWorldSecurityOrigin):
+        (WebTestRunner::TestRunner::setIsolatedWorldContentSecurityPolicy):
+        (WebTestRunner::TestRunner::addOriginAccessWhitelistEntry):
+        (WebTestRunner::TestRunner::removeOriginAccessWhitelistEntry):
+        (WebTestRunner::TestRunner::hasCustomPageSizeStyle):
+        (WebTestRunner::TestRunner::forceRedSelectionColors):
+        (WebTestRunner::TestRunner::addUserScript):
+        (WebTestRunner::TestRunner::addUserStyleSheet):
+        (WebTestRunner::TestRunner::startSpeechInput):
+        (WebTestRunner::TestRunner::loseCompositorContext):
+        (WebTestRunner::TestRunner::markerTextForListItem):
+        (WebTestRunner::TestRunner::findString):
+        (WebTestRunner::TestRunner::setMinimumTimerInterval):
+        (WebTestRunner::TestRunner::setAutofilled):
+        (WebTestRunner::TestRunner::setValueForUser):
+        (WebTestRunner::TestRunner::enableFixedLayoutMode):
+        (WebTestRunner::TestRunner::setFixedLayoutSize):
+        (WebTestRunner::TestRunner::selectionAsMarkup):
+        (WebTestRunner::TestRunner::setTextSubpixelPositioning):
+        (WebTestRunner::TestRunner::resetPageVisibility):
+        (WebTestRunner::TestRunner::setPageVisibility):
+        (WebTestRunner::TestRunner::setTextDirection):
+        (WebTestRunner::TestRunner::textSurroundingNode):
+        (WebTestRunner::TestRunner::workerThreadCount):
+        (WebTestRunner::TestRunner::cppVariantToBool):
+        (WebTestRunner::TestRunner::cppVariantToInt32):
+        (WebTestRunner::TestRunner::cppVariantToWebString):
+        (WebTestRunner::TestRunner::cppVariantToWebStringArray):
+        (WebTestRunner::TestRunner::printErrorMessage): formerly logErrorToConsole
+        (WebTestRunner::TestRunner::fallbackMethod):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebKit):
+        (WebTestRunner::TestRunner::setWebView):
+        (TestRunner):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::createMainWindow):
+        (TestShell::~TestShell):
+
+2012-11-19  Yusuke Sato  <yusukes@chromium.org>
+
+        [Chromium] Flash cannot receive scroll events when threaded compositing is in use
+        https://bugs.webkit.org/show_bug.cgi?id=101423
+
+        Reviewed by James Robinson.
+
+        Call setWantsWheelEvents(true) in initialize() so that gesture-events and transformed-events tests in
+        LayoutTests/platform/chromium/plugins/ will not fail even if a buildbot introduces threaded compositing
+        in the future.
+
+        * DumpRenderTree/chromium/TestWebPlugin.cpp:
+        (TestWebPlugin::initialize):
+
+2012-11-19  Nate Chapin  <japhet@chromium.org>
+
+        Move empty loading to DocumentLoader, simplify FrameLoader::init()
+        https://bugs.webkit.org/show_bug.cgi?id=101512
+
+        Reviewed by Adam Barth.
+
+        Chromium DRT has some code that doesn't play nicely with empty urls and incorrectly
+        interprets them as a non-empty load. This ensures
+        http/tests/navigation/new-window-redirect-history.html continues to pass
+        in chromium.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::updateForCommittedLoad):
+
+2012-11-19  Vincent Scheib  <scheib@chromium.org>
+
+        [Chromium] Remove WebKit::WebRuntimeFeatures::enablePointerLock.
+        https://bugs.webkit.org/show_bug.cgi?id=96946
+
+        Reviewed by Adam Barth.
+
+        The runtime flag functionality has already been removed.
+        Now that Chromium no longer has a compile dependency on this
+        API, it can be removed as well.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+
+2012-11-19  Kihong Kwon  <kihong.kwon@samsung.com>
+
+        Add PROXIMITY_EVENTS feature
+        https://bugs.webkit.org/show_bug.cgi?id=102658
+
+        Reviewed by Kentaro Hara.
+
+        Add PROXIMITY_EVENTS feature to FeatureList and qmake.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        * qmake/mkspecs/features/features.pri:
+
+2012-11-19  Christophe Dumez  <christophe.dumez@intel.com>
+
+        [WK2][WTR] Memory leak in TestController::initialize()
+        https://bugs.webkit.org/show_bug.cgi?id=102616
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Remove call to WKStringCreateWithUTF8CString() to construct
+        the icon database path which was leaking memory since the
+        returned WKStringRef was not adopted. The code now uses
+        WTF::String instead of std::string and converts it to a
+        WKStringRef using toWK().
+
+        * WebKitTestRunner/StringFunctions.h:
+        (WTR::toWK): Overload toWK() to take a WTF::String in
+        argument.
+        (WTR):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::initialize):
+
+2012-11-19  Kentaro Hara  <haraken@chromium.org>
+
+        Remove IDLStructure.pm
+        https://bugs.webkit.org/show_bug.cgi?id=102642
+
+        Reviewed by Adam Barth.
+
+        Previously IDLStructure.pm was full of regular expressions to
+        parse IDL files. Now a new IDL parser is implemented, IDLStructure.pm
+        just contains several data structures for the IDL parser. We can
+        move them to IDLParser.pm and thus remove IDLStructure.pm.
+
+        No tests. No change in generated code.
+
+        * WebKitTestRunner/DerivedSources.make:
+        * WebKitTestRunner/GNUmakefile.am:
+        * WebKitTestRunner/InjectedBundle/DerivedSources.pri:
+
+2012-11-18  KyungTae Kim  <ktf.kim@samsung.com>
+
+        [EFL] Not to include "ewk_view_private.h" in Tools
+        https://bugs.webkit.org/show_bug.cgi?id=102644
+
+        Reviewed by Gyuyoung Kim.
+
+        Include ewk_view.h instead of ewk_view_private.h in Tools
+
+        * DumpRenderTree/efl/PixelDumpSupportEfl.cpp:
+
+2012-11-18  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r135104.
+        http://trac.webkit.org/changeset/135104
+        https://bugs.webkit.org/show_bug.cgi?id=102638
+
+        Should not use commit queue to add people to committer list.
+        (Requested by ap_ on #webkit).
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-18  Vivek Galatage  <vivek.vg@samsung.com>
+
+        Add myself to committers.py
+        https://bugs.webkit.org/show_bug.cgi?id=102636
+
+        Reviewed by Laszlo Gombos.
+
+        Add myself to committers.py
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-18  Genevieve Mak  <gmak@rim.com>
+
+        [BlackBerry] Enable Touch Sliders
+        https://bugs.webkit.org/show_bug.cgi?id=102516
+
+        Reviewed by Rob Buis.
+
+        Enabled for BlackBerry only
+        PR #242781
+        PR #176014
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-11-17  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Remove unused code I wrote a long time ago from gardeningserver.py
+        https://bugs.webkit.org/show_bug.cgi?id=102605
+
+        Reviewed by Adam Barth.
+
+        * Scripts/webkitpy/tool/servers/gardeningserver.py: Removed.
+        * Scripts/webkitpy/tool/servers/gardeningserver_unittest.py: Removed.
+
+2012-11-16  Tony Chang  <tony@chromium.org>
+
+        Remove ENABLE_CSS_HIERARCHIES since it's no longer in use
+        https://bugs.webkit.org/show_bug.cgi?id=102554
+
+        Reviewed by Andreas Kling.
+
+        As mentioned in https://bugs.webkit.org/show_bug.cgi?id=79939#c41 ,
+        we're going to revist this feature once additional vendor support is
+        achieved.
+
+        * Scripts/webkitperl/FeatureList.pm:
+
+2012-11-16  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move stubs from DRTTestRunner to TestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=102489
+
+        Reviewed by Adam Barth.
+
+        This is part of moving all methods from DRTTestRunner to TestRunner.
+        Instead of keeping one stub per method, I'm using a shared stub to
+        clean up the code.
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner::TestRunner::TestRunner):
+        (WebTestRunner):
+        (WebTestRunner::TestRunner::fallbackMethod):
+        (WebTestRunner::TestRunner::notImplemented):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner):
+        (TestRunner):
+        (WebTestRunner::TestRunner::setDelegate):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::createMainWindow):
+        (TestShell::~TestShell):
+
+2012-11-16  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] fake drag drop operations in the WebTestProxyBase instead of the WebViewHost
+        https://bugs.webkit.org/show_bug.cgi?id=102495
+
+        Reviewed by Adam Barth.
+
+        When a drag operation is initiated in a layout test, we need to
+        simulate a corresponding drop event, otherwise the WebViewImpl will sit
+        there waiting for it. Instead of having the embedder taking care of
+        this, move this into the TestRunner library.
+
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::startDragging):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::startDragging):
+        (WebTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2012-11-16  Tien-Ren Chen  <trchen@chromium.org>
+
+        Rename applyDefaultDeviceScaleFactorInCompositor to setApplyDeviceScaleFactorInCompositor
+        https://bugs.webkit.org/show_bug.cgi?id=102462
+
+        Reviewed by James Robinson.
+
+        As we no longer have this "default" device scale factor.
+
+        * DumpRenderTree/chromium/WebPreferences.cpp:
+        (WebPreferences::applyTo):
+
+2012-11-15  Takashi Sakamoto  <tasak@google.com>
+
+        [Win] key event's location does not work on Windows platform.
+        https://bugs.webkit.org/show_bug.cgi?id=89742
+
+        Reviewed by Brent Fulgham.
+
+        Modified keyDownCallback to use lparam to specify left-hand keys or
+        right-hand keys.
+
+        * DumpRenderTree/win/EventSender.cpp:
+        (makeKeyDataForScanCode):
+        Given a virtual keycode, generate scancode and extended key bit of
+        lparam.
+        (keyDownCallback):
+        Use lparam for left-hand and right-hand keys, because Windows doesn't
+        directly provide a virtual keycode which distinguishes between
+        left-hand and right-hand. For example, when control key is pressed,
+        wparam has VK_CONTROL, neither VK_RCONTROL nor VK_LCONTROL.
+
+2012-11-16  Tommy Widenflycht  <tommyw@google.com>
+
+        [chromium] MediaStream API: Add missing WebRTCPeerConnectionHandlerClient::didAddRemoteDataChannel
+        https://bugs.webkit.org/show_bug.cgi?id=102386
+
+        Reviewed by Adam Barth.
+
+        Adding mock data channel functionality.
+
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::openDataChannel):
+
+2012-11-16  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] delete unused testRunner methods
+        https://bugs.webkit.org/show_bug.cgi?id=102479
+
+        Reviewed by Adam Barth.
+
+        These methods aren't used by any layout test. Remove them to avoid bit rot
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::DRTTestRunner):
+        (DRTTestRunner::reset):
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::shouldBeginEditing):
+        (WebViewHost::shouldEndEditing):
+        (WebViewHost::shouldInsertNode):
+        (WebViewHost::shouldInsertText):
+        (WebViewHost::shouldChangeSelectedRange):
+        (WebViewHost::shouldDeleteRange):
+        (WebViewHost::shouldApplyStyle):
+        (WebViewHost::startDragging):
+        (WebViewHost::enterFullScreenNow):
+        (WebViewHost::exitFullScreenNow):
+
+2012-11-15  Alexey Proskuryakov  <ap@apple.com>
+
+        Private Browsing is a per-page setting that sets a global value
+        https://bugs.webkit.org/show_bug.cgi?id=67870
+
+        Reviewed by Sam Weinig.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm: (setDefaultsToConsistentValuesForTesting):
+        Call _switchNetworkLoaderToNewTestingSession before making other settings, so that
+        they would actually apply to the testing session.
+
+        * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
+        (WTR::InjectedBundle::initialize):
+        (WTR::InjectedBundle::beginTesting):
+        Only call WKBundleSwitchNetworkLoaderToNewTestingSession once per process, matching
+        WebKit1. I'm not fully sure what is going wrong, but apparently creating mutiple
+        sessions with the same identifier doesn't quite work.
+
+2012-11-16  Yael Aharon  <yael.aharon@intel.com>
+
+        Unreviewed. Help bugzilla find me.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-16  Peter Beverloo  <peter@chromium.org>
+
+        Running TestWebKitAPI and webkit_unit_tests for Chromium Android should defer to the Chromium-sided test runner
+        https://bugs.webkit.org/show_bug.cgi?id=102245
+
+        Reviewed by Tony Chang.
+
+        When running TestWebKitAPI and webkit_unit_test for Chromium Android, defer
+        the actual running part to the test runner which lives on the Chromium side.
+        Re-implementing or even generalizing the device-interaction part in WebKit
+        is error prone and not worth the effort.
+
+        * Scripts/run-api-tests:
+        * Scripts/run-chromium-webkit-unit-tests:
+
+2012-11-15  Yury Semikhatsky  <yurys@chromium.org>
+
+        Memory instrumentation: add code for reporting stack traces of unknown instrumented objects
+        https://bugs.webkit.org/show_bug.cgi?id=102384
+
+        Reviewed by Pavel Feldman.
+
+        Updated return type in accord with the changes in MemoryInstrumentationClient.
+
+        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
+
+2012-11-15  Gustavo Noronha Silva  <gns@gnome.org>
+
+        [GTK] Split WebCore/platform into a separate library
+        https://bugs.webkit.org/show_bug.cgi?id=94435
+
+        Reviewed by Martin Robinson.
+
+        More people have been reporting problems when linking WebCore because
+        the command line limit is being exceeded. Splitting WebCore a bit more
+        is in order.
+
+        * GNUmakefile.am: link libWebCorePlatform into DRT
+
+2012-11-15  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Stop using the WebCompositorSupport methods for changing settings
+        https://bugs.webkit.org/show_bug.cgi?id=101968
+
+        Reviewed by James Robinson.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::setPerTilePaintingEnabled):
+        (TestShell::setAcceleratedAnimationEnabled):
+
+2012-11-15  Tony Chang  <tony@chromium.org>
+
+        Generate Settings from a .in file
+        https://bugs.webkit.org/show_bug.cgi?id=100393
+
+        Reviewed by Adam Barth.
+
+        Add the generated WebCore files to the include dir.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * WebKitTestRunner/CMakeLists.txt:
+
+2012-11-15  Roger Fong  <roger_fong@apple.com>
+
+        Make old-run-webkit-tests handle setting the results directory properly.
+        https://bugs.webkit.org/show_bug.cgi?id=102273
+        <rdar://problem/11571607>
+
+        Reviewed by Timothy Horton.
+
+        A call to chdirWebkit in old-run-webkit-tests set the current working directory to the OpenSource folder.
+        Thus setting --results-directory to OpenSource/layout-test-results would create OpenSource/layout-test-results inside the main OpenSource folder.
+        This caused many other problems including failure to upload test results and failed future test runs.
+        The solution is to save the current working directory before calling chdirWebKit and then reconstructing the full path to the results directory 
+        using the saved directory when setting $testResultsDirectory.
+
+        * Scripts/old-run-webkit-tests:
+
+2012-11-15  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r134800 and r134805.
+        http://trac.webkit.org/changeset/134800
+        http://trac.webkit.org/changeset/134805
+        https://bugs.webkit.org/show_bug.cgi?id=102417
+
+        This patch broke chromium port (Requested by jianli on
+        #webkit).
+
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::openDataChannel):
+
+2012-11-15  Tommy Widenflycht  <tommyw@google.com>
+
+        [chromium] MediaStream API: Add missing WebRTCPeerConnectionHandlerClient::didAddRemoteDataChannel
+        https://bugs.webkit.org/show_bug.cgi?id=102386
+
+        Reviewed by Adam Barth.
+
+        Adding mock data channel functionality.
+
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::openDataChannel):
+
+2012-11-15  Sheriff Bot  <webkit.review.bot@gmail.com>
+
+        Unreviewed, rolling out r134649 and r134665.
+        http://trac.webkit.org/changeset/134649
+        http://trac.webkit.org/changeset/134665
+        https://bugs.webkit.org/show_bug.cgi?id=102413
+
+        Broke a ton of downstream chromium tests (Requested by japhet
+        on #webkit).
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::updateForCommittedLoad):
+
+2012-11-15  Andreas Kling  <akling@apple.com>
+
+        Update my e-mail address.
+
+        Rubber-stamped by Anders Koivisto.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-15  Dominik Röttsches  <dominik.rottsches@intel.com>
+
+        [EFL] Bump Harfbuzz to allow fixing bug 101009 on EFL
+        https://bugs.webkit.org/show_bug.cgi?id=101323
+
+        Reviewed by Martin Robinson.
+
+        Bumping Harfbuzz to newer version so that we can remove the
+        ifdef round the fix for bug 101009 for EFL, too.
+        We're using the zip snapshot since jhbuild can fallback to the previously
+        downloaded blob in case of network failures which leads to better
+        buildbot robustness. This zip snapshot currently needs to be locally
+        patched to fix ICU detection on systems that don't have icu pkg-config files.
+        The patch is suggested for merging into HarfBuzz. We can remove it locally
+        once it's accepted into HarfBuzz upstream.
+
+        * efl/patches/harfbuzz-icu-detection-fix.patch: Applied after retrieving source to fix harfbuzz detection on systems that don't have pkg-config files for it.
+        * efl/jhbuild.modules: Bumping harfbuzz version.
+
+2012-11-15  Alexey Proskuryakov  <ap@apple.com>
+
+        [Mac] Implement WTR --no-timeout-at-all option
+        https://bugs.webkit.org/show_bug.cgi?id=102251
+
+        Reviewed by Eric Carlson.
+
+        * WebKitTestRunner/mac/TestControllerMac.mm: (WTR::TestController::platformRunUntil):
+        Just do it, and convert to Objective C on the way for simplicity.
+
+2012-11-14  Ryuan Choi  <ryuan.choi@gmail.com>
+
+        [EFL] Port tiled backing store
+        https://bugs.webkit.org/show_bug.cgi?id=71352
+
+        Reviewed by Gyuyoung Kim.
+
+        * EWebLauncher/main.c: Added option to test the WebCore's tiled backing store.
+        (_User_Arguments):
+        (windowCreate):
+        (parseUserArguments):
+
+2012-11-14  Andy Estes  <aestes@apple.com>
+
+        Fix the build.
+
+        * TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.h:
+
+2012-11-14  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: consolidate webkit-base-finding code
+        https://bugs.webkit.org/show_bug.cgi?id=102007
+
+        Reviewed by Eric Seidel.
+
+        This patch creates a new "WebKitFinder" class that other
+        modules can use to find the top of the WebKit tree and
+        commonly used subdirectories. This logic was in the
+        webkitpy.layout_test.port classes but wasn't specific to those
+        classes and now can be used by other modules without needing a port
+        (e.g., by the check-webkit-style python linter).
+
+        This code is somewhat redundant with the code for find_checkout_root()
+        in the scm modules, but it does not rely on the presence of a version
+        control system to work. This is a requirement for some uses of the
+        tree (e.g., Chromium tester checkouts).
+
+        This patch removes most of the logic from the layout_tests.port.config
+        module and makes that as private as possible. Now we just need to move
+        the default_configuration and flag_from_configuration logic into
+        DeprecatedPort (or someplace else appropriate) and we can finish
+        getting rid of the Config class (but that is a separate patch).
+
+        * Scripts/webkitpy/common/webkit_finder.py: Added.
+        (WebKitFinder):
+        (WebKitFinder.__init__):
+        (WebKitFinder.webkit_base):
+        (WebKitFinder.path_from_webkit_base):
+        (WebKitFinder.path_to_script):
+        (WebKitFinder.layout_tests_dir):
+        (WebKitFinder.perf_tests_dir):
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.__init__):
+        (Port):
+        (Port.webkit_base):
+        (Port.path_from_webkit_base):
+        (Port.path_to_script):
+        (Port.layout_tests_dir):
+        (Port.perf_tests_dir):
+        (Port.set_option_default):
+        (Port._run_script):
+        * Scripts/webkitpy/layout_tests/port/base_unittest.py:
+        (PortTest.test_diff_text):
+        * Scripts/webkitpy/layout_tests/port/chromium_linux.py:
+        (ChromiumLinuxPort._determine_driver_path_statically):
+        * Scripts/webkitpy/layout_tests/port/chromium_unittest.py:
+        * Scripts/webkitpy/layout_tests/port/config.py:
+        (Config.__init__):
+        (Config.build_directory):
+        (Config.default_configuration):
+        (Config._read_configuration):
+        * Scripts/webkitpy/layout_tests/port/config_mock.py: Removed.
+        * Scripts/webkitpy/layout_tests/port/config_unittest.py:
+        (ConfigTest.test_default_configuration__standalone):
+        (ConfigTest.test_default_configuration__scripterror):
+        * Scripts/webkitpy/layout_tests/port/driver_unittest.py:
+        (DriverTest.make_port):
+        (DriverTest.test_no_timeout):
+        * Scripts/webkitpy/layout_tests/port/gtk.py:
+        (GtkPort.setup_environ_for_server):
+        * Scripts/webkitpy/layout_tests/port/mac.py:
+        (MacPort.show_results_html_file):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (TestWebKitPort.__init__):
+        (PortTestCase.make_port):
+        * Scripts/webkitpy/layout_tests/port/win_unittest.py:
+        (WinPortTest.test_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py:
+        (XvfbDriverTest.make_driver):
+        (XvfbDriverTest.test_stop):
+        * Scripts/webkitpy/style/checkers/python.py:
+        (Pylinter.__init__):
+
+2012-11-14  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] WebPreferences reset() should set perTilePainting and acceleratedAnimation settings to false.
+        https://bugs.webkit.org/show_bug.cgi?id=102296
+
+        Reviewed by James Robinson.
+
+        These settings are always set by TestShell anyhow, but we should be
+        setting them to false here along with everything else.
+
+        * DumpRenderTree/chromium/WebPreferences.cpp:
+        (WebPreferences::reset):
+
+2012-11-08  Andy Estes  <aestes@apple.com>
+
+        [WebKit2] Need API in UIProcess to enable loading of custom protocols
+        https://bugs.webkit.org/show_bug.cgi?id=101674
+
+        Reviewed by Brady Eidson.
+
+        Add an API test that implements a custom protocol and attempts to load
+        a resource requiring that protocol in a WKView. The test passes only if
+        didFinishLoadForFrame: fires.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2ObjC/CustomProtocolsTest.mm: Added.
+        (+[TestProtocol canInitWithRequest:]):
+        (+[TestProtocol canonicalRequestForRequest:]):
+        (+[TestProtocol requestIsCacheEquivalent:toRequest:]):
+        (-[TestProtocol startLoading]):
+        (-[TestProtocol stopLoading]):
+        * TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm:
+        * TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.h: Copied from Source/WebKit2/UIProcess/API/mac/WKBrowsingContextControllerInternal.h.
+        * TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.mm: Copied from Source/WebKit2/UIProcess/API/mac/WKBrowsingContextControllerInternal.h.
+        (-[TestBrowsingContextLoadDelegate initWithBlockToRunOnLoad:]):
+        (-[TestBrowsingContextLoadDelegate browsingContextControllerDidFinishLoad:]):
+
+2012-11-14  Ojan Vafai  <ojan@chromium.org>
+
+        Fix some defuct flakiness dashboard unittests.
+        * TestResultServer/static-dashboards/flakiness_dashboard_unittests.js:
+
+2012-11-14  Glenn Adams  <glenn@skynav.com>
+
+        webkitpy: print-expectations - add --paths option to print only paths of test expectation files
+        https://bugs.webkit.org/show_bug.cgi?id=102269
+
+        Reviewed by Dirk Pranke.
+
+        Add --paths option to print-expectations command in order to obtain list of applicable
+        test expectation file paths.
+
+        * Scripts/webkitpy/tool/commands/queries.py:
+        (PrintExpectations.__init__):
+        (PrintExpectations.execute):
+        * Scripts/webkitpy/tool/commands/queries_unittest.py:
+        (PrintExpectationsTest.run_test):
+        (PrintExpectationsTest.test_paths):
+
+2012-11-14  James Robinson  <jamesr@chromium.org>
+
+        webgl-background-color.html started failing
+        https://bugs.webkit.org/show_bug.cgi?id=102247
+
+        Reviewed by Adrienne Walker.
+
+        The compositor thread should outlive the WebView.
+
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+
+2012-11-14  Nate Chapin  <japhet@chromium.org>
+
+        Move empty loading to DocumentLoader, simplify FrameLoader::init()
+        https://bugs.webkit.org/show_bug.cgi?id=101512
+
+        Reviewed by Adam Barth.
+
+        Chromium DRT has some code that doesn't play nicely with empty urls and incorrectly
+        interprets them as a non-empty load. This ensures
+        http/tests/navigation/new-window-redirect-history.html continues to pass
+        in chromium.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::updateForCommittedLoad):
+
+2012-11-14  Zan Dobersek  <zandobersek@gmail.com>
+
+        Remove uses of deprecated unittest.TestCase aliases
+        https://bugs.webkit.org/show_bug.cgi?id=102253
+
+        Reviewed by Dirk Pranke.
+
+        Replace the deprecated unittest.TestCase methods with the corresponding methods
+        everywhere inside the Tools directory. The following replacements are done:
+        - assertEquals -> assertEqual
+        - assert_ -> assertTrue
+        - failUnlessRaises -> assertRaises
+
+        * BuildSlaveSupport/build.webkit.org-config/mastercfg_unittest.py:
+        (SVNMirrorTest.test_CheckOutSource):
+        * QueueStatusServer/model/queuepropertymixin_unittest.py:
+        (QueuePropertyMixinTest.test_queue_property):
+        * QueueStatusServer/model/queues_unittest.py:
+        (QueueTest._assert_short_name):
+        (QueueTest._assert_display_name):
+        (QueueTest._assert_name_with_underscores):
+        * QueueStatusServer/model/workitems_unittest.py:
+        (WorkItemsTest.test_display_position_for_attachment):
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (test_parse_log_entries_from_changelog):
+        (test_parse_log_entries_from_annotated_file):
+        (_assert_parse_reviewer_text_and_list):
+        (_assert_parse_reviewer_text_list):
+        (_assert_fuzzy_reviewer_match):
+        (_assert_parse_authors):
+        (test_latest_entry_parse):
+        (test_latest_entry_parse_single_entry):
+        (test_set_reviewer):
+        (test_set_short_description_and_bug_url):
+        * Scripts/webkitpy/common/checkout/diff_parser_unittest.py:
+        (DiffParserTest.test_diff_parser):
+        * Scripts/webkitpy/common/checkout/scm/scm_unittest.py:
+        (GitSVNTest.test_revisions_changing_files_with_local_commit):
+        (GitSVNTest.test_upstream_branch):
+        (GitSVNTest.test_create_patch_with_rm_and_changed_files):
+        (GitTestWithMock.test_push_local_commits_to_server_with_username_and_password):
+        * Scripts/webkitpy/common/config/ports_unittest.py:
+        (DeprecatedPortTest.test_mac_port):
+        (DeprecatedPortTest.test_gtk_port):
+        (DeprecatedPortTest.test_efl_port):
+        (DeprecatedPortTest.test_qt_port):
+        (DeprecatedPortTest.test_chromium_port):
+        (DeprecatedPortTest.test_chromium_android_port):
+        (DeprecatedPortTest.test_chromium_xvfb_port):
+        * Scripts/webkitpy/common/config/urls_unittest.py:
+        (URLsTest.test_parse_bug_id):
+        (URLsTest.test_parse_attachment_id):
+        * Scripts/webkitpy/common/find_files_unittest.py:
+        (TestWinNormalize.assert_filesystem_normalizes):
+        * Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py:
+        (test_url_creation):
+        (test_parse_bug_id):
+        (_assert_dictionaries_equal):
+        (test_parse_bugs_from_xml):
+        (test_attachment_detail_bug_parsing):
+        (_assert_result_count):
+        (test_request_page_parsing):
+        (test_quip_page_parsing):
+        (EditUsersParserTest._assert_login_userid_pairs):
+        * Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py:
+        (test_status_parsing):
+        (test_latest_cached_build):
+        (test_results_zip_url):
+        * Scripts/webkitpy/common/net/credentials_unittest.py:
+        (test_credentials_from_environment):
+        * Scripts/webkitpy/common/net/failuremap_unittest.py:
+        (FailureMapTest.test_failing_revisions):
+        (FailureMapTest.test_new_failures):
+        (FailureMapTest.test_new_failures_with_old_revisions):
+        (FailureMapTest.test_new_failures_with_more_old_revisions):
+        (FailureMapTest.test_tests_failing_for):
+        (FailureMapTest.test_failing_tests):
+        * Scripts/webkitpy/common/net/layouttestresults_unittest.py:
+        (LayoutTestResultsTest.test_set_failure_limit_count):
+        * Scripts/webkitpy/common/net/unittestresults_unittest.py:
+        (UnitTestResultsTest.test_nostring):
+        (UnitTestResultsTest.test_emptystring):
+        * Scripts/webkitpy/common/read_checksum_from_png_unittest.py:
+        (ReadChecksumFromPngTest.test_read_checksum):
+        * Scripts/webkitpy/common/system/deprecated_logging_unittest.py:
+        (LoggingTest.assert_log_equals):
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+        (ScriptErrorTest.test_string_from_args):
+        (ScriptErrorTest.test_message_with_output):
+        (ExecutiveTest.test_run_command_with_bad_command):
+        (ExecutiveTest.test_run_command_with_unicode):
+        (ExecutiveTest.serial_test_run_in_parallel):
+        * Scripts/webkitpy/common/system/filesystem_mock_unittest.py:
+        (MockFileSystemTest.quick_check):
+        * Scripts/webkitpy/common/system/filesystem_unittest.py:
+        (GenericFileSystemTests.test_glob__trailing_asterisk):
+        (GenericFileSystemTests.test_glob__leading_asterisk):
+        (GenericFileSystemTests.test_glob__middle_asterisk):
+        (GenericFileSystemTests.test_glob__period_is_escaped):
+        (RealFileSystemTest.test_chdir):
+        (RealFileSystemTest.test_remove_file_with_retry):
+        (RealFileSystemTest.test_sep):
+        * Scripts/webkitpy/common/system/logtesting.py:
+        (TestLogStream.assertMessages):
+        * Scripts/webkitpy/common/system/logutils_unittest.py:
+        (GetLoggerTest.test_get_logger_in_webkitpy):
+        (GetLoggerTest.test_get_logger_not_in_webkitpy):
+        * Scripts/webkitpy/common/system/outputcapture.py:
+        (OutputCaptureTestCaseBase.assertStdout):
+        (OutputCaptureTestCaseBase.assertStderr):
+        * Scripts/webkitpy/common/system/path_unittest.py:
+        (AbspathTest.test_abspath_to_uri_cygwin):
+        (AbspathTest.test_abspath_to_uri_unixy):
+        (AbspathTest.test_abspath_to_uri_win):
+        (AbspathTest.test_abspath_to_uri_escaping_unixy):
+        (AbspathTest.test_abspath_to_uri_escaping_cygwin):
+        * Scripts/webkitpy/common/system/platforminfo_unittest.py:
+        (TestPlatformInfo.test_real_code):
+        (TestPlatformInfo.test_os_name_and_wrappers):
+        (TestPlatformInfo.test_os_version):
+        (TestPlatformInfo.test_total_bytes_memory):
+        * Scripts/webkitpy/common/system/user_unittest.py:
+        (UserTest.test_confirm.mock_raw_input):
+        (UserTest.test_confirm):
+        * Scripts/webkitpy/common/system/zipfileset_unittest.py:
+        (ZipFileSetTest.test_open):
+        (ZipFileSetTest.test_read):
+        * Scripts/webkitpy/common/watchlist/watchlist_unittest.py:
+        (WatchListTest.test_filename_definition_no_matches):
+        (WatchListTest.test_filename_definition):
+        (WatchListTest.test_cc_rules_simple):
+        (WatchListTest.test_cc_rules_complex):
+        (WatchListTest.test_cc_and_message_rules_complex):
+        (WatchListTest.test_cc_and_message_rules_no_matches):
+        (WatchListTest.test_added_match):
+        (WatchListTest.test_deleted_match):
+        (WatchListTest.test_more_and_less_match):
+        (WatchListTest.test_complex_match):
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        (LockCheckingRunner.handle_finished_list):
+        (LayoutTestRunnerTests.test_interrupt_if_at_failure_limits):
+        (LayoutTestRunnerTests.test_update_summary_with_result):
+        (LayoutTestRunnerTests.test_servers_started):
+        (SharderTests.assert_shards):
+        (SharderTests.test_shard_in_two_has_no_locked_shards):
+        (SharderTests.test_shard_in_two_has_no_unlocked_shards):
+        (NaturalCompareTest.assert_cmp):
+        (KeyCompareTest.assert_cmp):
+        * Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py:
+        (TestConfigurationTest.test_items):
+        (TestConfigurationTest.test_keys):
+        (TestConfigurationTest.test_str):
+        (TestConfigurationTest.test_repr):
+        (TestConfigurationTest.test_hash):
+        (TestConfigurationTest.test_eq):
+        (TestConfigurationTest.test_values):
+        (SpecifierSorterTest.test_init):
+        (SpecifierSorterTest.test_add_specifier):
+        (SpecifierSorterTest.test_add_macros):
+        (SpecifierSorterTest.test_category_priority):
+        (SpecifierSorterTest.test_specifier_priority):
+        (SpecifierSorterTest.test_sort_specifiers):
+        (TestConfigurationConverterTest.test_symmetric_difference):
+        (TestConfigurationConverterTest.test_to_config_set):
+        (TestConfigurationConverterTest.test_macro_expansion):
+        (TestConfigurationConverterTest.test_to_specifier_lists):
+        (TestConfigurationConverterTest.test_macro_collapsing):
+        (TestConfigurationConverterTest.test_converter_macro_collapsing):
+        (TestConfigurationConverterTest.test_specifier_converter_access):
+        * Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py:
+        (assert_exp):
+        (MiscTests.test_result_was_expected):
+        (MiscTests.test_remove_pixel_failures):
+        (MiscTests.test_suffixes_for_expectations):
+        (MiscTests.test_get_expectations_string):
+        (SkippedTests.check):
+        (ExpectationSyntaxTests.assert_tokenize_exp):
+        (SemanticTests.test_bad_bugid):
+        (SemanticTests.test_missing_bugid):
+        (TestExpectationSerializationTests.test_reconstitute_only_these):
+        * Scripts/webkitpy/layout_tests/models/test_failures_unittest.py:
+        (TestFailuresTest.test_crashes):
+        * Scripts/webkitpy/layout_tests/port/base_unittest.py:
+        (PortTest.test_nonexistant_expectations):
+        (PortTest.test_additional_expectations):
+        * Scripts/webkitpy/layout_tests/port/builders_unittest.py:
+        (BuildersTest.test_path_from_name):
+        * Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py:
+        (ChromiumAndroidPortTest.test_attributes):
+        (ChromiumAndroidPortTest.test_default_timeout_ms):
+        (ChromiumAndroidPortTest.test_get_devices_one_device):
+        (ChromiumAndroidPortTest.test_get_devices_two_devices):
+        (ChromiumAndroidPortTest.test_get_device_serial_one_device):
+        (ChromiumAndroidPortTest.test_get_device_serial_two_devices):
+        (ChromiumAndroidPortTest.test_must_require_http_server):
+        (ChromiumAndroidDriverTest.test_get_last_stacktrace):
+        (ChromiumAndroidDriverTest.test_get_crash_log):
+        (ChromiumAndroidDriverTest.test_cmd_line):
+        (ChromiumAndroidDriverTest.test_read_prompt):
+        (ChromiumAndroidDriverTest.test_command_from_driver_input):
+        (ChromiumAndroidDriverTwoDriversTest.test_two_drivers):
+        (ChromiumAndroidTwoPortsTest.test_options_with_two_ports):
+        * Scripts/webkitpy/layout_tests/port/chromium_linux_unittest.py:
+        (ChromiumLinuxPortTest.assert_architecture):
+        (ChromiumLinuxPortTest.test_determine_architecture_fails):
+        (ChromiumLinuxPortTest.test_path_to_image_diff):
+        * Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py:
+        (ChromiumMacPortTest.assert_name):
+        (ChromiumMacPortTest.test_baseline_path):
+        (ChromiumMacPortTest.test_path_to_image_diff):
+        * Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py:
+        (ChromiumPortTestCase.test_default_max_locked_shards):
+        (ChromiumPortTestCase.test_default_timeout_ms):
+        (ChromiumPortTestCase.test_default_pixel_tests):
+        (ChromiumPortTestCase.test_all_test_configurations):
+        (ChromiumPortTestCase.test_default_configuration):
+        (ChromiumPortTestCase.test_diff_image):
+        (ChromiumPortTestCase.test_diff_image_crashed):
+        (ChromiumPortTestCase.test_expectations_files):
+        * Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py:
+        (ChromiumWinTest.test_setup_environ_for_server_cygpath):
+        (ChromiumWinTest.assert_name):
+        (ChromiumWinTest.test_baseline_path):
+        (ChromiumWinTest.test_path_to_image_diff):
+        * Scripts/webkitpy/layout_tests/port/driver_unittest.py:
+        (DriverTest.test_read_block):
+        (DriverTest.test_read_binary_block):
+        (DriverTest.test_read_base64_block):
+        (DriverTest.test_no_timeout):
+        (DriverTest.test_check_for_driver_crash.assert_crash):
+        (DriverTest.test_creating_a_port_does_not_write_to_the_filesystem):
+        * Scripts/webkitpy/layout_tests/port/factory_unittest.py:
+        (FactoryTest.test_get_from_builder_name):
+        * Scripts/webkitpy/layout_tests/port/gtk_unittest.py:
+        (GtkPortTest.test_default_timeout_ms):
+        * Scripts/webkitpy/layout_tests/port/http_lock_unittest.py:
+        (HttpLockTest.test_current_lock_pid):
+        * Scripts/webkitpy/layout_tests/port/image_diff_unittest.py:
+        (TestImageDiffer.test_diff_image_failed):
+        (TestImageDiffer.test_diff_image_passed):
+        * Scripts/webkitpy/layout_tests/port/leakdetector_unittest.py:
+        (LeakDetectorTest.test_leaks_args):
+        (test_parse_leaks_output):
+        (test_leaks_files_in_directory):
+        (test_count_total_leaks):
+        * Scripts/webkitpy/layout_tests/port/mac_unittest.py:
+        (MacTest.test_default_timeout_ms):
+        (assert_name):
+        (test_setup_environ_for_server):
+        (_assert_search_path):
+        (test_32bit):
+        (test_64bit):
+        * Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py:
+        (MockTestShellTest.test_pixeltest__fails):
+        (MockTestShellTest.test_test_shell_parse_options):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (PortTestCase.test_default_max_locked_shards):
+        (PortTestCase.test_default_timeout_ms):
+        (PortTestCase.test_default_pixel_tests):
+        (PortTestCase.test_diff_image):
+        (PortTestCase.test_diff_image_crashed):
+        (PortTestCase.test_get_crash_log):
+        (PortTestCase.assert_build_path):
+        (PortTestCase.test_expectations_ordering):
+        (_assert_config_file_for_platform):
+        (test_path_to_apache_config_file):
+        (test_additional_platform_directory):
+        * Scripts/webkitpy/layout_tests/port/qt_unittest.py:
+        (QtPortTest._assert_search_path):
+        (QtPortTest._assert_expectations_files):
+        (QtPortTest.test_setup_environ_for_server):
+        * Scripts/webkitpy/layout_tests/port/server_process_unittest.py:
+        (TestServerProcess.test_basic):
+        (TestServerProcess.test_broken_pipe):
+        * Scripts/webkitpy/layout_tests/port/win_unittest.py:
+        (WinPortTest._assert_search_path):
+        (WinPortTest._assert_version):
+        (WinPortTest.test_runtime_feature_list):
+        (WinPortTest.test_expectations_files):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (LintTest.test_all_configurations):
+        (MainTest.test_all):
+        (MainTest.test_repeat_each):
+        (MainTest.test_skipped_flag):
+        (MainTest.test_iterations):
+        (MainTest.test_run_chunk):
+        (MainTest.test_run_part):
+        (MainTest.test_run_singly):
+        (MainTest.test_run_singly_actually_runs_tests):
+        (MainTest.test_single_file):
+        (MainTest.test_single_file_with_prefix):
+        (MainTest.test_single_skipped_file):
+        (MainTest.test_stderr_is_saved):
+        (MainTest.test_test_list):
+        (MainTest.test_test_list_with_prefix):
+        (MainTest.test_missing_and_unexpected_results):
+        (MainTest.test_pixel_test_directories):
+        (MainTest.test_missing_and_unexpected_results_with_custom_exit_code):
+        (MainTest.test_crash_log):
+        (MainTest.test_web_process_crash_log):
+        (MainTest.test_exit_after_n_failures_upload):
+        (MainTest.test_exit_after_n_failures):
+        (MainTest.test_exit_after_n_crashes):
+        (MainTest.test_retrying_and_flaky_tests):
+        (MainTest.test_run_order__inline):
+        (MainTest.test_reftest_run):
+        (MainTest.test_reftest_run_reftests_if_pixel_tests_are_disabled):
+        (MainTest.test_reftest_skip_reftests_if_no_ref_tests):
+        (MainTest.test_reftest_expected_html_should_be_ignored):
+        (MainTest.test_reftest_driver_should_run_expected_html):
+        (MainTest.test_reftest_driver_should_run_expected_mismatch_html):
+        (MainTest.test_output_diffs):
+        (MainTest.test_unsupported_platform):
+        (EndToEndTest.test_end_to_end):
+        (RebaselineTest.test_reset_results):
+        (RebaselineTest.test_missing_results):
+        (RebaselineTest.test_new_baseline):
+        * Scripts/webkitpy/layout_tests/servers/http_server_integrationtest.py:
+        (BaseTest.integration_test_server__normal):
+        (BaseTest.integration_test_server__fails):
+        (BaseTest.integration_test_port_and_root):
+        * Scripts/webkitpy/layout_tests/servers/http_server_unittest.py:
+        (TestHttpServer.test_start_cmd):
+        * Scripts/webkitpy/layout_tests/views/metered_stream_unittest.py:
+        (RegularTest.test_logging_not_included):
+        (RegularTest._basic):
+        (RegularTest.test_basic):
+        (RegularTest.test_log_after_update):
+        (RegularTest.test_log_args):
+        (TtyTest.test_basic):
+        (TtyTest.test_log_after_update):
+        (VerboseTest.test_basic):
+        (VerboseTest.test_log_after_update):
+        (VerboseTest.test_log_args):
+        * Scripts/webkitpy/layout_tests/views/printing_unittest.py:
+        (Testprinter.assertWritten):
+        (test_test_status_line):
+        * Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py:
+        (MainTest.assertWritten):
+        * Scripts/webkitpy/style/checker_unittest.py:
+        (GlobalVariablesTest.test_webkit_base_filter_rules):
+        (CheckerDispatcherSkipTest._assert_should_skip_without_warning):
+        (CheckerDispatcherCarriageReturnTest.test_should_check_and_strip_carriage_returns):
+        (CheckerDispatcherDispatchTest.assert_checker):
+        (CheckerDispatcherDispatchTest.test_changelog_paths):
+        (CheckerDispatcherDispatchTest.test_cpp_paths):
+        (CheckerDispatcherDispatchTest.test_json_paths):
+        (CheckerDispatcherDispatchTest.test_python_paths):
+        (CheckerDispatcherDispatchTest.test_text_paths):
+        (CheckerDispatcherDispatchTest.test_xml_paths):
+        (StyleProcessorConfigurationTest.test_init):
+        (StyleProcessorConfigurationTest.test_write_style_error_emacs):
+        (StyleProcessorConfigurationTest.test_write_style_error_vs7):
+        (StyleProcessor_EndToEndTest.test_init):
+        (StyleProcessor_EndToEndTest.test_process):
+        (StyleProcessor_CodeCoverageTest.test_process__checker_dispatched):
+        * Scripts/webkitpy/style/checkers/changelog_unittest.py:
+        (ChangeLogCheckerTest.assert_error.handle_style_error):
+        (ChangeLogCheckerTest.test_init):
+        * Scripts/webkitpy/style/checkers/common_unittest.py:
+        (CarriageReturnCheckerTest.assert_carriage_return):
+        (TabCheckerTest.assert_tab):
+        * Scripts/webkitpy/style/checkers/cpp_unittest.py:
+        (CppFunctionsTest.test_convert_to_lower_with_underscores):
+        (CppFunctionsTest.test_create_acronym):
+        (CppFunctionsTest.test_parameter):
+        (CppFunctionsTest.test_single_line_view):
+        (CppFunctionsTest.test_create_skeleton_parameters):
+        (CppFunctionsTest.test_find_parameter_name_index):
+        (CppFunctionsTest.test_parameter_list):
+        (CppFunctionsTest.test_check_parameter_against_text):
+        (CppStyleTestBase.perform_lint):
+        (CppStyleTestBase.assert_lint):
+        (CppStyleTestBase.assert_lint_one_of_many_errors_re):
+        (CppStyleTestBase.assert_multi_line_lint):
+        (CppStyleTestBase.assert_language_rules_check):
+        (CppStyleTestBase.assert_include_what_you_use):
+        (CppStyleTestBase.assert_blank_lines_check):
+        (CppStyleTestBase.assert_positions_equal):
+        (FunctionDetectionTest.perform_function_detection):
+        (CppStyleTest.test_get_line_width):
+        (CppStyleTest.test_find_next_multi_line_comment_start):
+        (CppStyleTest.test_find_next_multi_line_comment_end):
+        (CppStyleTest.test_remove_multi_line_comments_from_range):
+        (CppStyleTest.test_position):
+        (CppStyleTest.test_rfind_in_lines):
+        (CppStyleTest.test_close_expression):
+        (CppStyleTest.test_include_what_you_use_no_implementation_files):
+        (CppStyleTest.test_include_what_you_use):
+        (CppStyleTest.test_files_belong_to_same_module):
+        (CppStyleTest.test_cleanse_line):
+        (CppStyleTest.test_multiline_strings):
+        (CppStyleTest.test_newline_at_eof.do_test):
+        (CppStyleTest.test_invalid_utf8.do_test):
+        (CppStyleTest.test_is_blank_line):
+        (CppStyleTest.test_allow_blank_line_before_closing_namespace):
+        (CppStyleTest.test_allow_blank_line_before_if_else_chain):
+        (CppStyleTest.test_else_on_same_line_as_closing_braces):
+        (CppStyleTest.test_build_header_guard):
+        (CppStyleTest.test_legal_copyright):
+        (CleansedLinesTest.test_init):
+        (CleansedLinesTest.test_init_empty):
+        (CleansedLinesTest.test_collapse_strings):
+        (CheckForFunctionLengthsTest.assert_function_lengths_check):
+        (PassPtrTest.assert_pass_ptr_check):
+        (LeakyPatternTest.assert_leaky_pattern_check):
+        (WebKitStyleTest.test_parameter_names):
+        (WebKitStyleTest.test_webkit_export_check):
+        (CppCheckerTest.test_init):
+        * Scripts/webkitpy/style/checkers/jsonchecker_unittest.py:
+        (JSONCheckerTest.assert_error.handle_style_error):
+        (JSONCheckerTest.test_init):
+        * Scripts/webkitpy/style/checkers/png_unittest.py:
+        (PNGCheckerTest.test_init):
+        (PNGCheckerTest.test_check):
+        * Scripts/webkitpy/style/checkers/python_unittest.py:
+        (PythonCheckerTest.test_init):
+        (PythonCheckerTest.test_check):
+        * Scripts/webkitpy/style/checkers/test_expectations_unittest.py:
+        (TestExpectationsTestCase._expect_port_for_expectations_path):
+        (TestExpectationsTestCase.assert_lines_lint):
+        * Scripts/webkitpy/style/checkers/text_unittest.py:
+        (TextStyleTestCase.assertNoError):
+        (TextStyleTestCase.assertError.error_for_test):
+        (TextStyleTestCase.assertError):
+        (TextCheckerTest.test_init):
+        * Scripts/webkitpy/style/checkers/watchlist_unittest.py:
+        (WatchListTest.test_basic_error_message.handle_style_error):
+        (WatchListTest):
+        * Scripts/webkitpy/style/checkers/xcodeproj_unittest.py:
+        (XcodeProjectFileCheckerTest.assert_error):
+        * Scripts/webkitpy/style/checkers/xml_unittest.py:
+        (XMLCheckerTest.assert_error.handle_style_error):
+        (XMLCheckerTest.test_init):
+        * Scripts/webkitpy/style/error_handlers_unittest.py:
+        (DefaultStyleErrorHandlerTest._check_initialized):
+        (DefaultStyleErrorHandlerTest.test_non_reportable_error):
+        (DefaultStyleErrorHandlerTest.test_max_reports_per_category):
+        (DefaultStyleErrorHandlerTest.test_line_numbers):
+        * Scripts/webkitpy/style/filereader_unittest.py:
+        (TextFileReaderTest._assert_file_reader):
+        (TextFileReaderTest.test_process_file__does_not_exist):
+        (TextFileReaderTest.test_count_delete_only_file):
+        * Scripts/webkitpy/style/filter_unittest.py:
+        (CategoryFilterTest.test_init):
+        (CategoryFilterTest.test_init_default_arguments):
+        (CategoryFilterTest.test_str):
+        (FilterConfigurationTest.test_init):
+        (FilterConfigurationTest.test_default_arguments):
+        * Scripts/webkitpy/style/main_unittest.py:
+        (ChangeDirectoryTest._assert_result):
+        * Scripts/webkitpy/style/optparser_unittest.py:
+        (ArgumentPrinterTest.test_to_flag_string):
+        (ArgumentParserTest.test_parse_default_arguments):
+        (ArgumentParserTest.test_parse_explicit_arguments):
+        (ArgumentParserTest.test_parse_files):
+        (CommandOptionValuesTest.test_init):
+        * Scripts/webkitpy/style/patchreader_unittest.py:
+        (PatchReaderTest._assert_checked):
+        * Scripts/webkitpy/test/finder_unittest.py:
+        (FinderTest.test_additional_system_paths):
+        (FinderTest.test_to_module):
+        (FinderTest.check_names):
+        * Scripts/webkitpy/test/main_unittest.py:
+        (TesterTest.test_individual_names_are_not_run_twice):
+        (TesterTest.test_integration_tests_are_not_found_by_default):
+        (TesterTest.test_integration_tests_are_found):
+        (TesterTest.integration_test_coverage_works):
+        * Scripts/webkitpy/test/runner_unittest.py:
+        (RunnerTest.test_run):
+        * Scripts/webkitpy/tool/bot/commitqueuetask_unittest.py:
+        (_expect_validate):
+        * Scripts/webkitpy/tool/bot/expectedfailures_unittest.py:
+        (ExpectedFailuresTest._assert_can_trust):
+        (ExpectedFailuresTest.test_unexpected_failures_observed):
+        (ExpectedFailuresTest.test_unexpected_failures_observed_when_tree_is_hosed):
+        * Scripts/webkitpy/tool/bot/feeders_unittest.py:
+        (test_patches_with_acceptable_review_flag):
+        * Scripts/webkitpy/tool/bot/irc_command_unittest.py:
+        (IRCCommandTest.test_whois):
+        (IRCCommandTest.test_create_bug):
+        (IRCCommandTest.test_roll_chromium_deps):
+        (IRCCommandTest.test_rollout):
+        * Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py:
+        (LayoutTestResultsReaderTest.test_missing_layout_test_results):
+        (test_missing_unit_test_results_path):
+        (test_layout_test_results):
+        * Scripts/webkitpy/tool/bot/queueengine_unittest.py:
+        (LoggingDelegate.process_work_item):
+        (LoggingDelegate.handle_unexpected_error):
+        (QueueEngineTest.test_trivial):
+        (QueueEngineTest.test_unexpected_error):
+        (QueueEngineTest.test_handled_error):
+        (QueueEngineTest._test_terminating_queue):
+        * Scripts/webkitpy/tool/commands/openbugs_unittest.py:
+        (OpenBugsTest.test_find_bugs_in_string):
+        * Scripts/webkitpy/tool/commands/queries_unittest.py:
+        (FailureReasonTest.test_blame_line_for_revision):
+        (PrintExpectationsTest.run_test):
+        (PrintBaselinesTest.test_basic):
+        (PrintBaselinesTest.test_multiple):
+        (PrintBaselinesTest.test_csv):
+        * Scripts/webkitpy/tool/commands/queues_unittest.py:
+        (AbstractQueueTest.test_log_directory):
+        (AbstractPatchQueueTest.test_next_patch):
+        (test_auto_retry):
+        * Scripts/webkitpy/tool/commands/rebaseline_unittest.py:
+        (test_rebaseline_updates_expectations_file):
+        (test_rebaseline_does_not_include_overrides):
+        (test_rebaseline_test):
+        (test_rebaseline_test_with_results_directory):
+        (test_rebaseline_test_and_print_scm_changes):
+        (test_rebaseline_and_copy_test):
+        (test_rebaseline_and_copy_test_no_existing_result):
+        (test_rebaseline_and_copy_test_with_lion_result):
+        (test_rebaseline_and_copy_no_overwrite_test):
+        (test_rebaseline_test_internal_with_move_overwritten_baselines_to):
+        (TestRebaselineJson.test_rebaseline_all):
+        (TestRebaselineJson.test_rebaseline_debug):
+        (TestRebaselineJson.test_move_overwritten):
+        (TestRebaselineJson.test_no_optimize):
+        (TestRebaselineJson.test_results_directory):
+        (TestRebaseline.test_rebaseline):
+        (TestRebaselineExpectations.test_rebaseline_expectations_noop):
+        (TestRebaselineExpectations.disabled_test_overrides_are_included_correctly):
+        (TestAnalyzeBaselines.test_default):
+        (TestAnalyzeBaselines.test_missing_baselines):
+        * Scripts/webkitpy/tool/commands/roll_unittest.py:
+        (PostRollCommandsTest.test_prepare_state):
+        * Scripts/webkitpy/tool/servers/gardeningserver_unittest.py:
+        (BuildCoverageExtrapolatorTest.test_extrapolate):
+        * Scripts/webkitpy/tool/steps/addsvnmimetypeforpng_unittest.py:
+        (AddSvnMimetypeForPngTest.test_run):
+        * Scripts/webkitpy/tool/steps/preparechangelog_unittest.py:
+        (PrepareChangeLogTest.test_ensure_bug_url):
+        * Scripts/webkitpy/tool/steps/preparechangelogforrevert_unittest.py:
+        (_assert_message_for_revert_output):
+        * TestResultServer/model/jsonresults_unittest.py:
+        (JsonResultsTest._test_merge):
+        (JsonResultsTest._test_get_test_list):
+
+2012-11-14  János Badics  <jbadics@inf.u-szeged.hu>
+
+        [Qt][ARM] Fix 'nullptr' is a keyword in C++11 [-Wc++0x-compat] warning
+        https://bugs.webkit.org/show_bug.cgi?id=102083
+
+        Reviewed by Csaba Osztrogonác.
+
+        Modified compiler name regex in condition that tests if -std=c++0x, c++11,
+        gnu++0x or gnu++11 are enabled in order to match linux-arm-gnueabi-g++ too,
+        thus enabling -Wno-c++0x-compat also on ARM compiler.
+
+        * qmake/mkspecs/features/unix/default_post.prf:
+
+2012-11-14  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        REGRESSION(r133757): Causing webkitpy unit tests to fail
+        https://bugs.webkit.org/show_bug.cgi?id=101444
+
+        Reviewed by Csaba Osztrogonác.
+
+        Updated the bot name on the unit tests.
+
+        * Scripts/webkitpy/tool/commands/rebaseline_unittest.py:
+        (TestRebaselineTest.test_baseline_directory):
+
+2012-11-14  Byungwoo Lee  <bw80.lee@samsung.com>
+
+        [EFL][WK2] Rename variables, structures and functions of the MiniBrowser.
+        https://bugs.webkit.org/show_bug.cgi?id=101517
+
+        Reviewed by Gyuyoung Kim.
+
+        Rename variables, structures and functions of the MiniBrowser
+        for the naming consistency.
+
+        1) Browser_Window* {app_data|browser_window|window} -> window
+
+        2) Browser_Window::webview -> Browser_Window::ewk_view
+             The webkit API functions are ewk_view_xxx not webview_xxx.
+             So using ewk_view will be better than webview.
+
+        3) Browser_Window::window -> Browser_Window::elm_window
+             The name is changed to be distinguished with 'Browser_Window *window'
+
+        4) browser_{window|view}_find() -> window_find_with_{elm_window|ewk_view}()
+             This is changed because the name of the function can be confused.
+             Currently, browser_window_find() returns Browser_Window*. And
+             browser_view_find() also returns Browser_Window*.
+
+        5) FileSelectorData -> File_Selector_Data / AuthData -> Auth_Data
+             The type definition is moved to the top of the source file
+             and the name is changed to follow EFL style.
+
+        * MiniBrowser/efl/main.c:
+        (miniBrowserViewSmartClass):
+        (_Browser_Window):
+        (_File_Selector_Data):
+        (_Auth_Data):
+        (window_find_with_ewk_view):
+        (window_free):
+        (on_key_down):
+        (view_focus_set):
+        (on_mouse_down):
+        (title_set):
+        (on_title_changed):
+        (on_url_changed):
+        (on_back_forward_list_changed):
+        (on_new_window):
+        (on_close_window):
+        (on_progress):
+        (on_error):
+        (on_download_request):
+        (close_file_picker):
+        (on_filepicker_parent_deletion):
+        (on_filepicker_deletion):
+        (on_fileselector_done):
+        (on_file_chooser_request):
+        (on_download_finished):
+        (on_download_failed):
+        (on_favicon_received):
+        (on_view_icon_changed):
+        (on_url_bar_activated):
+        (on_url_bar_clicked):
+        (on_back_button_clicked):
+        (on_forward_button_clicked):
+        (on_refresh_button_clicked):
+        (on_javascript_alert):
+        (on_javascript_confirm):
+        (on_javascript_prompt):
+        (on_window_geometry_get):
+        (on_window_geometry_set):
+        (on_fullscreen_deny):
+        (on_fullscreen_enter):
+        (on_fullscreen_exit):
+        (auth_popup_close):
+        (on_auth_cancel):
+        (on_auth_ok):
+        (on_authentication_request):
+        (on_tooltip_text_set):
+        (on_tooltip_text_unset):
+        (on_home_button_clicked):
+        (on_window_deletion):
+        (window_create):
+
+2012-11-14  Thiago Marcos P. Santos  <thiago.santos@intel.com>
+
+        webkitpy: Update the EFL list of bots
+        https://bugs.webkit.org/show_bug.cgi?id=102121
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Update the EFL bots so we can use garden-o-matic.
+
+        * Scripts/webkitpy/layout_tests/port/builders.py:
+
+2012-11-13  Yael Aharon  <yael.aharon@intel.com>
+
+        [EFL][WK2] New window size should consult the window attributes
+        https://bugs.webkit.org/show_bug.cgi?id=102122
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Take into account the size that was specified in window.open
+        when creating a new window. This avoids ugly flashing on the screen.
+
+        * MiniBrowser/efl/main.c:
+        (on_key_down):
+        (on_new_window):
+        (window_create):
+        (elm_main):
+
+2012-11-13  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Plumb WebCompositorSupport settings through WebLayerTreeSettings as well, in preparation for removing the settings from WebCompositorSupport
+        https://bugs.webkit.org/show_bug.cgi?id=102146
+
+        Reviewed by James Robinson.
+
+        Pass settings that go through WebCompositorSupport also through
+        WebLayerTreeSettings. When the compositor starts using those instead,
+        we can remove the callers to the WebCompositorSupport setters.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        (TestShell::resetWebSettings):
+        (TestShell::setPerTilePaintingEnabled):
+        (TestShell::setAcceleratedAnimationEnabled):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+        * DumpRenderTree/chromium/WebPreferences.cpp:
+        (WebPreferences::applyTo):
+        * DumpRenderTree/chromium/WebPreferences.h:
+        (WebPreferences):
+
+2012-11-13  Kentaro Hara  <haraken@chromium.org>
+
+        Unreviewed, rolling out r134503.
+        http://trac.webkit.org/changeset/134503
+
+        Roll out a patch that was landed just to investigate svn
+        trouble
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-13  Kentaro Hara  <haraken@chromium.org>
+
+        Unreviewed. Investigating svn trouble. Test commit.
+
+        * Scripts/webkitpy/common/config/committers.py:
+
+2012-11-13  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Unreviewed, rolling out r134446.
+        http://trac.webkit.org/changeset/134446
+        https://bugs.webkit.org/show_bug.cgi?id=101968
+
+        Need to try a different strategy for landing a two-sided patch
+        (3/3).
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        (TestShell::resetWebSettings):
+        (TestShell::setPerTilePaintingEnabled):
+        (TestShell::setAcceleratedAnimationEnabled):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell):
+        * DumpRenderTree/chromium/WebPreferences.cpp:
+        (WebPreferences::applyTo):
+        * DumpRenderTree/chromium/WebPreferences.h:
+        (WebPreferences):
+
+2012-11-13  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Unreviewed, rolling out r134449.
+        http://trac.webkit.org/changeset/134449
+        https://bugs.webkit.org/show_bug.cgi?id=102076
+
+        Re-rolling in the patch, it was innocent.
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+
+2012-11-13  Dimitri Glazkov  <dglazkov@chromium.org>
+
+        Unreviewed, rolling out r134424.
+        http://trac.webkit.org/changeset/134424
+        https://bugs.webkit.org/show_bug.cgi?id=102076
+
+        Made fast/dom/Window/open-window-min-size.html crash.
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+
+2012-11-12  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Remove the WebCompositorSupport methods for changing settings, plumb everything through WebLayerTreeSettings
+        https://bugs.webkit.org/show_bug.cgi?id=101968
+
+        Reviewed by James Robinson.
+
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::TestShell):
+        (TestShell::resetWebSettings):
+        * DumpRenderTree/chromium/TestShell.h:
+        (TestShell::setPerTilePaintingEnabled):
+        (TestShell::setAcceleratedAnimationEnabled):
+        (TestShell):
+        * DumpRenderTree/chromium/WebPreferences.cpp:
+        (WebPreferences::applyTo):
+        * DumpRenderTree/chromium/WebPreferences.h:
+        (WebPreferences):
+
+2012-11-13  Dirk Pranke  <dpranke@chromium.org>
+
+        Fix webkitpy issues arising from a partially-installed pylint.
+        Unreviewed, build fix.
+
+        This patch ensures that we will re-install the pylint and logilab
+        packages if any of them are missing, not just the pylint package.
+
+        * Scripts/webkitpy/thirdparty/__init__.py:
+        (AutoinstallImportHook._install_pylint):
+
+2012-11-13  No'am Rosenthal  <noam.rosenthal@nokia.com>
+
+        Unreviewed, adding my new email address to committers.py and watchlist.
+
+        * Scripts/webkitpy/common/config/committers.py:
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-11-13  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [CMake] Incorrect dependency calculation when generating forwarding headers
+        https://bugs.webkit.org/show_bug.cgi?id=102076
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Explicitly call generate-forwarding-headers.pl on ${WEBKIT2_DIR} as
+        well, since some dependencies pulled in via the WebKit2/WebKit2_C.h
+        include in config.h are only generated from there.
+
+        This is a bit redundant since this is also done in WebKit2's
+        PlatformEfl.cmake, however the WTF and WebCore API tests do not depend
+        on WebKit2 so the script may not have been called when these tests are
+        being built.
+
+        * TestWebKitAPI/PlatformEfl.cmake:
+
+2012-11-13  Zeno Albisser  <zeno@webkit.org>
+
+        Unreviewed: Adding watchlist definition for CoordinatedGraphics.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-11-13  Hugo Parente Lima  <hugo.lima@openbossa.org>
+
+        [cmake] Do not use GLOB to add WTR IDL files to buildsystem.
+        https://bugs.webkit.org/show_bug.cgi?id=101785
+
+        Reviewed by Caio Marcelo de Oliveira Filho.
+
+        Using *.idl makes impossible to add IDL files depending on compiler flags,
+        like a possible GamepadController.idl file found on Chromium.
+
+        * WebKitTestRunner/CMakeLists.txt:
+
+2012-11-13  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] TestRunner should depend on webkit_wtf_support instead of compiling the files itself
+        https://bugs.webkit.org/show_bug.cgi?id=102075
+
+        Reviewed by Pavel Feldman.
+
+        * DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:
+
+2012-11-13  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
+
+        [EFL][DRT] Remove extra layoutFrame() call when preparing to send an event via EventSender.
+        https://bugs.webkit.org/show_bug.cgi?id=102074
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * DumpRenderTree/efl/EventSender.cpp:
+        (feedMouseEvent): Do not call DumpRenderTreeSupportEfl::layoutFrame()
+        when sending an event, as it causes additional repaints that create
+        wrong pixel results for tests such as
+        fast/repaint/overflow-auto-in-overflow-auto-scrolled.html.
+
+2012-11-13  Csaba Osztrogonác  <ossy@webkit.org>
+
+        [Qt] Enable Mutation observer
+        https://bugs.webkit.org/show_bug.cgi?id=102066
+
+        Reviewed by Pavel Feldman.
+
+        * qmake/mkspecs/features/features.pri:
+
+2012-11-13  Xiaobo Wang  <xbwang@torchmobile.com.cn>
+
+        [BlackBerry] DRT - platform/blackberry/editing/text-iterator/findString-markers.html failed
+        https://bugs.webkit.org/show_bug.cgi?id=102056
+
+        Reviewed by Rob Buis.
+
+        RIM PR 235836
+
+        TestRunner::findString() was changed to call Page::findString() instead
+        of WebPage::findNextString(). Page::findString() doesn't update
+        TextMatch markers.
+        Work-around by calling both Page::findString() and WebPage::findNextString().
+
+        * DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp:
+        (TestRunner::findString):
+
+2012-11-12  Jochen Eisinger  <jochen@chromium.org>
+
+        Add the TestRunner public API to the ChromiumPublicApi watchlist, and introduce an entry for ChromiumTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=101957
+
+        Reviewed by Adam Barth.
+
+        Chromium now also depends on the TestRunner public API, and as such, similar rules as for the Chromium WebKit API should apply.
+
+        * Scripts/webkitpy/common/config/watchlist:
+
+2012-11-13  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move tracking of damaged regions from WebViewHost to WebTestProxy
+        https://bugs.webkit.org/show_bug.cgi?id=101927
+
+        Reviewed by Adam Barth.
+
+        This will allow for sharing the code with content_shell
+
+        * DumpRenderTree/chromium/DRTTestRunner.cpp:
+        (DRTTestRunner::display):
+        * DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h:
+        (WebKit):
+        (WebTestProxyBase):
+        (WebTestRunner::WebTestProxy::didInvalidateRect):
+        (WebTestRunner::WebTestProxy::didScrollRect):
+        (WebTestRunner::WebTestProxy::scheduleComposite):
+        (WebTestRunner::WebTestProxy::scheduleAnimation):
+        (WebTestRunner::WebTestProxy::setWindowRect):
+        (WebTestRunner::WebTestProxy::show):
+        (WebTestRunner::WebTestProxy::didAutoResize):
+        (WebTestRunner::WebTestProxy::postAccessibilityNotification):
+        * DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp:
+        (WebTestRunner::WebTestProxyBase::setPaintRect):
+        (WebTestRunner):
+        (WebTestRunner::WebTestProxyBase::paintRect):
+        (WebTestRunner::WebTestProxyBase::didInvalidateRect):
+        (WebTestRunner::WebTestProxyBase::didScrollRect):
+        (WebTestRunner::WebTestProxyBase::scheduleComposite):
+        (WebTestRunner::WebTestProxyBase::scheduleAnimation):
+        (WebTestRunner::WebTestProxyBase::show):
+        (WebTestRunner::WebTestProxyBase::setWindowRect):
+        (WebTestRunner::WebTestProxyBase::didAutoResize):
+        (WebTestRunner::WebTestProxyBase::postAccessibilityNotification):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::createNewWindow):
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::scheduleAnimation):
+        (WebViewHost::show):
+        (WebViewHost::setWindowRect):
+        (WebViewHost::WebViewHost):
+        (WebViewHost::proxy):
+        (WebViewHost::setProxy):
+        (WebViewHost::reset):
+        (WebViewHost::paintInvalidatedRegion):
+        * DumpRenderTree/chromium/WebViewHost.h:
+        (WebViewHost):
+
+2012-11-12  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: clean up lint errors, part 1
+        https://bugs.webkit.org/show_bug.cgi?id=102024
+
+        Reviewed by Adam Barth.
+
+        This patch cleans up a lot of miscellaneous minor lint errors that
+        apparently aren't caught by unit tests, and suppresses a few
+        false positives.
+
+        Also, this patch removes the garden-o-matic "rollout" entry point
+        since it's no longer being used by the frontend (rather than
+        fix it to not generate lint errors).
+
+        * Scripts/webkitpy/common/system/executive_mock.py:
+        (MockExecutive2.run_command):
+        * Scripts/webkitpy/common/system/filesystem_mock.py:
+        (MockFileSystem.copyfile):
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._http_tests):
+        * Scripts/webkitpy/layout_tests/port/apple.py:
+        (ApplePort):
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.reference_files):
+        * Scripts/webkitpy/layout_tests/port/chromium.py:
+        (ChromiumPort):
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidDriver._teardown_performance):
+        * Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py:
+        (ChromiumPortTestCase.TestAndroidPort.__init__):
+        (ChromiumPortTestCase.test_default_configuration):
+        * Scripts/webkitpy/layout_tests/port/port_testcase.py:
+        (PortTestCase):
+        (PortTestCase.test_driver_cmd_line):
+        (PortTestCase.test_expectations_ordering):
+        * Scripts/webkitpy/layout_tests/servers/http_server_base.py:
+        (HttpServerBase._check_that_all_ports_are_available):
+        * Scripts/webkitpy/style/checkers/python.py:
+        (Pylinter):
+        * Scripts/webkitpy/tool/commands/gardenomatic.py:
+        (GardenOMatic.__init__):
+        * Scripts/webkitpy/tool/commands/queues.py:
+        (CommitQueue):
+        * Scripts/webkitpy/tool/servers/gardeningserver.py:
+        (GardeningHTTPRequestHandler):
+        (GardeningHTTPRequestHandler.localresult):
+
+2012-11-12  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: clean up lint errors, part 2
+        https://bugs.webkit.org/show_bug.cgi?id=102029
+
+        Reviewed by Adam Barth.
+
+        This cleans up the remaining lint errors in webkitpy with four exceptions:
+        1) we don't lint thirdparty/ autoinstalled code, obviously
+        2) there's an intentional error in the unit tests for pylint itself
+        3) the implementation of webkit-patch optimize-expectations has
+        an error but I think we can and should just remove that command as well.
+        4) I have not yet linted the test code
+
+        * Scripts/webkitpy/common/newstringio.py:
+        * Scripts/webkitpy/common/checkout/scm/scm.py:
+        (SCM.find_checkout_root):
+        (SCM.will.remote_merge_base):
+        * Scripts/webkitpy/common/checkout/scm/scm_mock.py:
+        * Scripts/webkitpy/common/checkout/scm/svn.py:
+        (SVNRepository.has_authorization_for_realm):
+        (SVN.__init__):
+        * Scripts/webkitpy/common/config/contributionareas.py:
+        (ContributionAreas.names):
+        * Scripts/webkitpy/common/config/ports.py:
+        (DeprecatedPort):
+        * Scripts/webkitpy/common/net/buildbot/buildbot.py:
+        (Builder.force_build):
+        * Scripts/webkitpy/common/net/buildbot/buildbot_mock.py:
+        * Scripts/webkitpy/style/checkers/cpp.py:
+        (check_posix_threading):
+        (check_spacing):
+        * Scripts/webkitpy/style/optparser.py:
+        (ArgumentParser._create_option_parser):
+        * Scripts/webkitpy/tool/commands/abstractlocalservercommand.py:
+        (AbstractLocalServerCommand.execute):
+        * Scripts/webkitpy/tool/commands/download.py:
+        (AbstractPatchProcessingCommand):
+        (AbstractPatchProcessingCommand._process_patch):
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (AbstractEarlyWarningSystem):
+
+2012-11-12  Dirk Pranke  <dpranke@chromium.org>
+
+        remove 'webkit-patch optimize-expectations'
+        https://bugs.webkit.org/show_bug.cgi?id=102032
+
+        Reviewed by Adam Barth.
+
+        Removing this command because it is totally broken (probably
+        broke when I added support for multiple files in a cascade)
+        and doesn't seem to do anything much useful. It certainly
+        didn't actually optimize things.
+
+        * Scripts/webkitpy/tool/commands/expectations.py: Removed.
+
+2012-11-12  Xiaobo Wang  <xbwang@torchmobile.com.cn>
+
+        [BlackBerry] DRT - Update Pixel Dump Support for OpenGL renderer
+        https://bugs.webkit.org/show_bug.cgi?id=101894
+
+        Reviewed by Rob Buis.
+
+        RIM PR 241686
+        Also remove an un-needed pixel lock, and fix a klocwork error in SKIA
+        code path.
+
+        * DumpRenderTree/blackberry/PixelDumpSupportBlackBerry.cpp:
+        (readPixelsUserInterfaceThread):
+        (createBitmapContextFromWebView):
+
+2012-11-12  Daniel Bates  <dbates@webkit.org>
+
+        Perl errors from Tools/Scripts/copy-webkitlibraries-to-product-directory
+        https://bugs.webkit.org/show_bug.cgi?id=101980
+
+        Reviewed by Mark Rowe.
+
+        Remove library libWebKitSystemInterfaceLeopard.a and libWebKitSystemInterfaceSnowLeopard.a
+        from the list of libraries to copy to the specified built products directory
+        as these libraries were removed from the repository in <http://trac.webkit.org/changeset/133670>.
+
+        * Scripts/copy-webkitlibraries-to-product-directory:
+
+2012-11-12  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: integrate pylint into check-webkit-style, part I
+        https://bugs.webkit.org/show_bug.cgi?id=101285
+
+        Reviewed by Ojan Vafai.
+
+        This patch re-works lint-webkitpy so that the logic is pushed
+        into check-webkit-style (mostly); we don't yet control which
+        messages are displayed using the rules in webkitpy/style/checker.py
+        (we're still using the pylintrc to suppress messages instead),
+        but otherwise things work. For now we will only report pylint
+        "errors", not warnings.
+
+        * Scripts/lint-webkitpy:
+        * Scripts/webkitpy/style/checker.py:
+        * Scripts/webkitpy/style/checkers/python.py:
+        (PythonChecker):
+        (PythonChecker.check):
+        (PythonChecker._check_pep8):
+        (PythonChecker._check_pylint):
+        (Pylinter):
+        (Pylinter.__init__):
+        (Pylinter.run):
+        (_FilteredStringIO):
+        (_FilteredStringIO.__init__):
+        (_FilteredStringIO.write):
+        (_FilteredStringIO._filter):
+        * Scripts/webkitpy/style/checkers/python_unittest.py:
+        (PythonCheckerTest.test_check):
+        * Scripts/webkitpy/style/checkers/python_unittest_input.py:
+
+2012-11-12  Dirk Pranke  <dpranke@chromium.org>
+
+        nrwt: remove a bunch of broken chromium-specific flags
+        https://bugs.webkit.org/show_bug.cgi?id=101979
+
+        Reviewed by Tony Chang.
+
+        There were a bunch of chromium-specific flags that used to be
+        supported by NRWT (and handled and passed on to DRT) but have
+        probably been broken for a long time and are currently ignored.
+
+        This patch removes all of those flags; the rule of thumb going forward
+        is that we should only add flags that affect how the python code functions.
+        If a flag is just passed verbatim to DRT, the user can use --additional-drt-flag
+        for that.
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (parse_args):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (MainTest.setUp):
+
+2012-11-12  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [EFL][WK2] Add --device-pixel-ratio command line option to EFL MiniBrowser
+        https://bugs.webkit.org/show_bug.cgi?id=101930
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Added --device-pixel-ratio command line option to EFL MiniBrowser which sets
+        the ratio between the CSS units and device pixels when the content is unscaled.
+        Option is applied for all the views created by mini browser.
+
+        * MiniBrowser/efl/main.c:
+        (window_create):
+        (elm_main):
+
+2012-11-12  Dirk Pranke  <dpranke@chromium.org>
+
+        remove the chromium-mac-mountainlion TestExpectations file
+        https://bugs.webkit.org/show_bug.cgi?id=101789
+
+        Reviewed by Ojan Vafai.
+
+        Nearly all of the tests have been updated for 10.8 and the remaining
+        failures have been merged into the main TestExpectations file. We
+        don't need this hook any more.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_mac.py:
+        (ChromiumMacPort.operating_system):
+        * Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py:
+        (ChromiumMacPortTest.test_path_to_image_diff):
+
+2012-11-12  Peter Beverloo  <peter@chromium.org>
+
+        [Chromium-Android] Restart the device's shell in root before pushing data
+        https://bugs.webkit.org/show_bug.cgi?id=101944
+
+        Reviewed by Adam Barth.
+
+        Setting up md5sum and pushing the executable, fonts and test resources was
+        unintentionally being done prior to executing the "adb root" command,
+        which restarts the device's shell to be root. Since test data is still
+        being pushed to /data/local/tmp, writing to which requires root access,
+        devices not running as root would throw a ScriptError.
+
+        * Scripts/webkitpy/layout_tests/port/chromium_android.py:
+        (ChromiumAndroidDriver._setup_test):
+
+2012-11-12  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Support ResourceRequest's setTimeoutInterval
+        https://bugs.webkit.org/show_bug.cgi?id=101731
+
+        Reviewed by Simon Hausmann.
+
+        Enable XHR_TIMEOUT now that we support the necessary feature.
+
+        * qmake/mkspecs/features/features.pri:
+
+2012-11-12  Gustavo Noronha Silva  <gns@gnome.org>
+
+        Unreviewed. Removing myself from the list of address to CC on EWS
+        build failure; the CC turned out to just be too noisy so I'm
+        tracking those in a different way.
+
+        * Scripts/webkitpy/tool/commands/earlywarningsystem.py:
+        (GtkEWS):
+
+2012-11-12  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Can not load MHTML documents
+        https://bugs.webkit.org/show_bug.cgi?id=101765
+
+        Reviewed by Simon Hausmann.
+
+        Enable MHTML feature.
+
+        * qmake/mkspecs/features/features.pri:
+
+2012-11-12  Tommy Widenflycht  <tommyw@google.com>
+
+        MediaStream API: Schedule the RTCDataChannel events to be triggered at idle state
+        https://bugs.webkit.org/show_bug.cgi?id=101751
+
+        Reviewed by Adam Barth.
+
+        Makes the data channel mocks to be synchronous instead of asynchronous to be able to
+        properly test RTCDataChannel event handling.
+
+        * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+        (MockWebRTCPeerConnectionHandler::sendStringData):
+        (MockWebRTCPeerConnectionHandler::sendRawData):
+
+2012-11-12  Jochen Eisinger  <jochen@chromium.org>
+
+        [chromium] move TestRunner implementation into WebTestRunner namespace
+        https://bugs.webkit.org/show_bug.cgi?id=101837
+
+        Reviewed by Adam Barth.
+
+        That way, we don't get collisions when linking e.g. against chromium's
+        net test support library.
+
+        * DumpRenderTree/chromium/DRTTestRunner.h:
+        (DRTTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/CppVariant.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/EventSender.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/GamepadController.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/GamepadController.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestDelegate.h:
+        (WebTestRunner):
+        (TestDelegate):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h:
+        (WebTestRunner):
+        (TestInterfaces):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TestRunner.h:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp:
+        (WebTestRunner):
+        * DumpRenderTree/chromium/TestRunner/src/TextInputController.h:
+        (WebTestRunner):
+
+2012-11-12  Zeno Albisser  <zeno@webkit.org>
+
+        [Qt] MiniBrowser should not strongly depend on QtTestSupport.
+        https://bugs.webkit.org/show_bug.cgi?id=101775
+
+        Introducing HAVE(QTTESTSUPPORT) to allow building
+        MiniBrowser without QtTestSupport.
+        This is necessary when using a production build.
+
+        Reviewed by Tor Arne Vestbø.
+
+        * MiniBrowser/qt/MiniBrowserApplication.cpp:
+        (MiniBrowserApplication::handleUserOptions):
+        * qmake/mkspecs/features/configure.prf:
+        * qmake/mkspecs/features/features.prf:
+
+2012-11-11  Kangil Han  <kangil.han@samsung.com>
+
+        Change build congratulation message in EFL
+        https://bugs.webkit.org/show_bug.cgi?id=101833
+
+        Reviewed by Gyuyoung Kim.
+
+        EFL port is currently supporting both WK1 and WK2.
+        But, build congratulation message still shows WK1(EWebLauncher) only.
+        Therefore, this patch adopts WK2 reference execution(MiniBrowser) in its message.
+
+        From 'To run EWebLauncher with this newly-built code, use the'
+        to 'To run EWebLauncher/MiniBrowser with this newly-built code, use the'.
+
+        * Scripts/build-webkit:
+        (writeCongrats):
+        * Scripts/webkitdirs.pm:
+        (launcherName):
+
 2012-11-09  Ryosuke Niwa  <rniwa@webkit.org>
 
         People with dichromacy can't tell crashes and passes on flakiness dashboard
diff --git a/Tools/DumpRenderTree/AccessibilityController.h b/Tools/DumpRenderTree/AccessibilityController.h
index a6cdc46..1bb066f 100644
--- a/Tools/DumpRenderTree/AccessibilityController.h
+++ b/Tools/DumpRenderTree/AccessibilityController.h
@@ -34,6 +34,9 @@
 #if PLATFORM(WIN)
 #include <windows.h>
 #endif
+#if HAVE(ACCESSIBILITY) && (PLATFORM(GTK) || PLATFORM(EFL))
+#include <atk/atk.h>
+#endif
 
 class AccessibilityController {
 public:
@@ -65,6 +68,10 @@
     void winNotificationReceived(PlatformUIElement, const std::string& eventName);
 #endif
 
+#if HAVE(ACCESSIBILITY) && (PLATFORM(GTK) || PLATFORM(EFL))
+    AtkObject* childElementById(AtkObject* parent, const char* id);
+#endif
+
 private:
     static JSClassRef getJSClass();
 
diff --git a/Tools/DumpRenderTree/AccessibilityUIElement.cpp b/Tools/DumpRenderTree/AccessibilityUIElement.cpp
index b079d9a..9dfbc6c 100644
--- a/Tools/DumpRenderTree/AccessibilityUIElement.cpp
+++ b/Tools/DumpRenderTree/AccessibilityUIElement.cpp
@@ -233,6 +233,61 @@
     return JSValueMakeNumber(context, (double)toAXElement(thisObject)->indexOfChild(childElement));
 }
 
+#if PLATFORM(IOS)
+
+static JSValueRef headerElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (argumentCount != 1)
+        return 0;
+    
+    unsigned index = JSValueToNumber(context, arguments[0], exception);
+    return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->headerElementAtIndex(index));
+}
+
+static JSValueRef linkedElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->linkedElement());
+}
+
+static JSValueRef elementsForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    if (argumentCount != 2)
+        return 0;
+    
+    unsigned location = JSValueToNumber(context, arguments[0], exception);
+    unsigned length = JSValueToNumber(context, arguments[1], exception);
+    
+    Vector<AccessibilityUIElement> elements;
+    toAXElement(thisObject)->elementsForRange(location, length, elements);
+    
+    unsigned elementsSize = elements.size();
+    JSValueRef valueElements[elementsSize];
+    for (unsigned k = 0; k < elementsSize; ++k)
+        valueElements[k] = AccessibilityUIElement::makeJSAccessibilityUIElement(context, elements[k]);
+    
+    return JSObjectMakeArray(context, elementsSize, valueElements, 0);
+}
+
+static JSValueRef increaseTextSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    toAXElement(thisObject)->increaseTextSelection();
+    return JSValueMakeUndefined(context);
+}
+
+static JSValueRef decreaseTextSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    toAXElement(thisObject)->decreaseTextSelection();
+    return JSValueMakeUndefined(context);
+}
+
+static JSValueRef assistiveTechnologySimulatedFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    toAXElement(thisObject)->assistiveTechnologySimulatedFocus();
+    return JSValueMakeUndefined(context);
+}
+
+#endif
+
 static JSValueRef childAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     int indexNumber = -1;
@@ -361,16 +416,19 @@
     return result;
 }
 
-
-static JSValueRef isActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+static JSValueRef isPressActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
-    JSStringRef action = 0;
-    if (argumentCount == 1)
-        action = JSValueToStringCopy(context, arguments[0], exception);    
-    JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isActionSupported(action));
-    if (action)
-        JSStringRelease(action);
-    return result;
+    return JSValueMakeBoolean(context, toAXElement(thisObject)->isPressActionSupported());
+}
+
+static JSValueRef isIncrementActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    return JSValueMakeBoolean(context, toAXElement(thisObject)->isIncrementActionSupported());
+}
+
+static JSValueRef isDecrementActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    return JSValueMakeBoolean(context, toAXElement(thisObject)->isDecrementActionSupported());
 }
 
 static JSValueRef boolAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
@@ -480,6 +538,12 @@
     return JSValueMakeUndefined(context);
 }
 
+static JSValueRef scrollToMakeVisibleCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    toAXElement(thisObject)->scrollToMakeVisible();
+    return JSValueMakeUndefined(context);
+}
+
 static JSValueRef takeFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     toAXElement(thisObject)->takeFocus();
@@ -940,10 +1004,74 @@
     return JSValueMakeUndefined(context);
 }
 
+#if PLATFORM(IOS)
+
+static JSValueRef stringForSelectionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    JSRetainPtr<JSStringRef> labelString(Adopt, toAXElement(thisObject)->stringForSelection());
+    return JSValueMakeString(context, labelString.get());
+}
+
+static JSValueRef getIPhoneLabelCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    JSRetainPtr<JSStringRef> labelString(Adopt, toAXElement(thisObject)->iphoneLabel());
+    return JSValueMakeString(context, labelString.get());
+}
+
+static JSValueRef getIPhoneHintCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    JSRetainPtr<JSStringRef> hintString(Adopt, toAXElement(thisObject)->iphoneHint());
+    return JSValueMakeString(context, hintString.get());
+}
+
+static JSValueRef getIPhoneValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->iphoneValue());
+    return JSValueMakeString(context, valueString.get());
+}
+
+static JSValueRef getIPhoneIdentifierCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->iphoneIdentifier());
+    return JSValueMakeString(context, valueString.get());
+}
+
+
+static JSValueRef getIPhoneTraitsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->iphoneTraits());
+    return JSValueMakeString(context, valueString.get());
+}
+
+static JSValueRef getIPhoneIsElementCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    return JSValueMakeBoolean(context, toAXElement(thisObject)->iphoneIsElement());
+}
+
+static JSValueRef getIPhoneElementTextPositionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    return JSValueMakeNumber(context, toAXElement(thisObject)->iphoneElementTextPosition());
+}
+
+static JSValueRef getIPhoneElementTextLengthCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    return JSValueMakeNumber(context, toAXElement(thisObject)->iphoneElementTextLength());
+}
+
+#endif // PLATFORM(IOS)
+
+#if PLATFORM(MAC) && !PLATFORM(IOS)
+static JSValueRef supportedActionsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->supportedActions());
+    return JSValueMakeString(context, valueString.get());
+}
+#endif
+
 // Implementation
 
 // Unsupported methods on various platforms.
-#if !PLATFORM(MAC)
+#if !PLATFORM(MAC) || PLATFORM(IOS)
 JSStringRef AccessibilityUIElement::speak() { return 0; }
 JSStringRef AccessibilityUIElement::rangeForLine(int line) { return 0; }
 JSStringRef AccessibilityUIElement::rangeForPosition(int, int) { return 0; }
@@ -958,6 +1086,8 @@
 #if !PLATFORM(WIN)
 bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement)
 {
+    if (!otherElement)
+        return false;
     return platformUIElement() == otherElement->platformUIElement();
 }
 #endif
@@ -1104,6 +1234,20 @@
         { "selectedChildrenCount", selectedChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "horizontalScrollbar", horizontalScrollbarCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "verticalScrollbar", verticalScrollbarCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+#if PLATFORM(IOS)
+        { "iphoneLabel", getIPhoneLabelCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "iphoneHint", getIPhoneHintCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "iphoneValue", getIPhoneValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "iphoneIdentifier", getIPhoneIdentifierCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "iphoneTraits", getIPhoneTraitsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "iphoneIsElement", getIPhoneIsElementCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "iphoneElementTextPosition", getIPhoneElementTextPositionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "iphoneElementTextLength", getIPhoneElementTextLengthCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "stringForSelection", stringForSelectionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+#endif // PLATFORM(IOS)
+#if PLATFORM(MAC) && !PLATFORM(IOS)
+        { "supportedActions", supportedActionsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+#endif
         { 0, 0, 0, 0 }
     };
 
@@ -1143,7 +1287,9 @@
         { "boolAttributeValue", boolAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "isAttributeSupported", isAttributeSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "isAttributeSettable", isAttributeSettableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "isActionSupported", isActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "isPressActionSupported", isPressActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "isIncrementActionSupported", isIncrementActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "isDecrementActionSupported", isDecrementActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "parentElement", parentElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "disclosedByRow", disclosedByRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "increment", incrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -1178,6 +1324,16 @@
         { "stringForTextMarkerRange", stringForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setSelectedChild", setSelectedChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "selectedChildAtIndex", selectedChildAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "scrollToMakeVisible", scrollToMakeVisibleCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+#if PLATFORM(IOS)
+        { "linkedElement", linkedElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "headerElementAtIndex", headerElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "elementsForRange", elementsForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "increaseTextSelection", increaseTextSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "decreaseTextSelection", decreaseTextSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "assistiveTechnologySimulatedFocus", assistiveTechnologySimulatedFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        
+#endif
         { 0, 0, 0 }
     };
 
diff --git a/Tools/DumpRenderTree/AccessibilityUIElement.h b/Tools/DumpRenderTree/AccessibilityUIElement.h
index b5b23d8..794a15d 100644
--- a/Tools/DumpRenderTree/AccessibilityUIElement.h
+++ b/Tools/DumpRenderTree/AccessibilityUIElement.h
@@ -45,7 +45,7 @@
 #include <oleacc.h>
 
 typedef COMPtr<IAccessible> PlatformUIElement;
-#elif PLATFORM(GTK)
+#elif HAVE(ACCESSIBILITY) && (PLATFORM(GTK) || PLATFORM(EFL))
 #include <atk/atk.h>
 typedef AtkObject* PlatformUIElement;
 #else
@@ -109,7 +109,9 @@
     bool boolAttributeValue(JSStringRef attribute);
     bool isAttributeSupported(JSStringRef attribute);
     bool isAttributeSettable(JSStringRef attribute);
-    bool isActionSupported(JSStringRef action);
+    bool isPressActionSupported();
+    bool isIncrementActionSupported();
+    bool isDecrementActionSupported();
     JSStringRef role();
     JSStringRef subrole();
     JSStringRef roleDescription();
@@ -198,7 +200,14 @@
     JSStringRef attributedStringForRange(unsigned location, unsigned length);
     bool attributedStringRangeIsMisspelled(unsigned location, unsigned length);
     AccessibilityUIElement uiElementForSearchPredicate(AccessibilityUIElement* startElement, bool isDirectionNext, JSStringRef searchKey, JSStringRef searchText);
-    
+#if PLATFORM(IOS)
+    void elementsForRange(unsigned location, unsigned length, Vector<AccessibilityUIElement>& elements);
+    JSStringRef stringForSelection();
+    void increaseTextSelection();
+    void decreaseTextSelection();
+    AccessibilityUIElement linkedElement();
+#endif
+
     // Table-specific
     AccessibilityUIElement cellForColumnAndRow(unsigned column, unsigned row);
 
@@ -232,6 +241,25 @@
     // Make sure you call remove, because you can't rely on objects being deallocated in a timely fashion.
     void removeNotificationListener();
     
+#if PLATFORM(IOS)
+    JSStringRef iphoneLabel();
+    JSStringRef iphoneValue();
+    JSStringRef iphoneTraits();
+    JSStringRef iphoneHint();
+    JSStringRef iphoneIdentifier();
+    bool iphoneIsElement();
+    int iphoneElementTextPosition();
+    int iphoneElementTextLength();
+    AccessibilityUIElement headerElementAtIndex(unsigned);
+    // This will simulate the accessibilityDidBecomeFocused API in UIKit.
+    void assistiveTechnologySimulatedFocus();
+#endif // PLATFORM(IOS)
+
+#if PLATFORM(MAC) && !PLATFORM(IOS)
+    // Returns an ordered list of supported actions for an element.
+    JSStringRef supportedActions();
+#endif
+    
 private:
     static JSClassRef getJSClass();
     PlatformUIElement m_element;
diff --git a/Tools/DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp b/Tools/DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp
index 56aeab7..c4a666c 100644
--- a/Tools/DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp
+++ b/Tools/DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp
@@ -44,6 +44,11 @@
                 # WebKit is checked out in src/chromium/third_party/WebKit
                 'chromium_src_dir': '<(tools_dir)/../../..',
             }],
+            ['OS=="linux"', {
+                'use_custom_freetype%': 1,
+            }, {
+                'use_custom_freetype%': 0,
+            }],
         ],
     },
     'includes': [
@@ -64,12 +69,12 @@
                 '<(tools_dir)/DumpRenderTree/chromium/ImageDiff.cpp',
             ],
             'conditions': [
-                ['OS=="android" and android_build_type==0', {
+                ['OS=="android" and android_webview_build==0', {
                     # The Chromium Android port will compare images on host rather
                     # than target (a device or emulator) for performance reasons.
                     'toolsets': ['host'],
                 }],
-                ['OS=="android" and android_build_type!=0', {
+                ['OS=="android" and android_webview_build==1', {
                     'type': 'none',
                 }],
             ],
@@ -84,8 +89,6 @@
                 'TestRunner_resources',
                 '<(source_dir)/WebKit/chromium/WebKit.gyp:webkit',
                 '<(source_dir)/WebKit/chromium/WebKit.gyp:webkit_test_support',
-                '<(source_dir)/WTF/WTF.gyp/WTF.gyp:wtf',
-                '<(chromium_src_dir)/webkit/support/webkit_support.gyp:webkit_support',
             ],
             'include_dirs': [
                 '<(chromium_src_dir)',
@@ -105,6 +108,41 @@
                 '<@(test_runner_files)',
             ],
             'conditions': [
+                ['inside_chromium_build == 1', {
+                    'type': '<(component)',
+                    'conditions': [
+                        ['component=="shared_library"', {
+                            'defines': [
+                                'WEBTESTRUNNER_DLL',
+                                'WEBTESTRUNNER_IMPLEMENTATION=1',
+                            ],
+                            'dependencies': [
+                                '<(chromium_src_dir)/base/base.gyp:base',
+                                '<(chromium_src_dir)/build/temp_gyp/googleurl.gyp:googleurl',
+                                '<(chromium_src_dir)/skia/skia.gyp:skia',
+                                '<(chromium_src_dir)/v8/tools/gyp/v8.gyp:v8',
+                            ],
+                            'direct_dependent_settings': {
+                                'defines': [
+                                    'WEBTESTRUNNER_DLL',
+                                ],
+                            },
+                            'export_dependent_settings': [
+                                '<(chromium_src_dir)/build/temp_gyp/googleurl.gyp:googleurl',
+                                '<(chromium_src_dir)/v8/tools/gyp/v8.gyp:v8',
+                            ],
+                            'msvs_settings': {
+                                'VCLinkerTool': {
+                                    'conditions': [
+                                        ['incremental_chrome_dll==1', {
+                                            'UseLibraryDependencyInputs': 'true',
+                                        }],
+                                    ],
+                                },
+                            },
+                        }],
+                    ],
+                }],
                 ['toolkit_uses_gtk == 1', {
                     'defines': [
                         'WTF_USE_GTK=1',
@@ -116,13 +154,14 @@
                         '<(source_dir)/WebKit/chromium/public/gtk',
                     ],
                 }],
-                ['inside_chromium_build==1 and component=="shared_library"', {
-                    'sources': [
-                        '<(source_dir)/WebKit/chromium/src/ChromiumCurrentTime.cpp',
-                        '<(source_dir)/WebKit/chromium/src/ChromiumThreading.cpp',
+                ['OS!="win"', {
+                    'sources/': [
+                        ['exclude', 'Win\\.cpp$'],
                     ],
                 }],
             ],
+            # Disable c4267 warnings until we fix size_t to int truncations. 
+            'msvs_disabled_warnings': [ 4267, ],
         },
         {
             'target_name': 'TestRunner_resources',
@@ -163,6 +202,9 @@
                     },
                 }],
                 ['use_x11 == 1', {
+                    'dependencies': [
+                        '<(chromium_src_dir)/tools/xdisplaycheck/xdisplaycheck.gyp:xdisplaycheck',
+                    ],
                     'copies': [{
                         'destination': '<(PRODUCT_DIR)',
                         'files': [
@@ -185,7 +227,7 @@
                         ]
                     }],
                 }],
-                ['OS=="android" and android_build_type==0', {
+                ['OS=="android" and android_webview_build==0', {
                     'dependencies': [
                         'ImageDiff#host',
                     ],
@@ -198,8 +240,10 @@
             'mac_bundle': 1,
             'dependencies': [
                 'TestRunner',
+                'DumpRenderTree_resources',
                 '<(source_dir)/WebKit/chromium/WebKit.gyp:inspector_resources',
                 '<(source_dir)/WebKit/chromium/WebKit.gyp:webkit',
+                '<(source_dir)/WebKit/chromium/WebKit.gyp:webkit_wtf_support',
                 '<(source_dir)/WTF/WTF.gyp/WTF.gyp:wtf',
                 '<(chromium_src_dir)/base/base.gyp:test_support_base',
                 '<(chromium_src_dir)/build/temp_gyp/googleurl.gyp:googleurl',
@@ -237,6 +281,7 @@
                     ],
                     'resource_include_dirs': ['<(SHARED_INTERMEDIATE_DIR)/webkit'],
                     'sources': [
+                        # FIXME: We should just use the resources in the .pak file.
                         '<(SHARED_INTERMEDIATE_DIR)/net/net_resources.rc',
                         '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.rc',
                         '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources.rc',
@@ -259,29 +304,6 @@
                     'sources/': [
                         ['exclude', 'Win\\.cpp$'],
                     ],
-                    'actions': [
-                        {
-                            'action_name': 'repack_locale',
-                            'variables': {
-                                'repack_path': '<(chromium_src_dir)/tools/grit/grit/format/repack.py',
-                                'pak_inputs': [
-                                    '<(SHARED_INTERMEDIATE_DIR)/net/net_resources.pak',
-                                    '<(SHARED_INTERMEDIATE_DIR)/ui/gfx/gfx_resources.pak',
-                                    '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.pak',
-                                    '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_strings_en-US.pak',
-                                    '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources_100_percent.pak',
-                            ]},
-                            'inputs': [
-                                '<(repack_path)',
-                                '<@(pak_inputs)',
-                            ],
-                            'outputs': [
-                                '<(INTERMEDIATE_DIR)/repack/DumpRenderTree.pak',
-                            ],
-                            'action': ['python', '<(repack_path)', '<@(_outputs)', '<@(pak_inputs)'],
-                            'process_outputs_as_mac_bundle_resources': 1,
-                        },
-                    ], # actions
                 }],
                 ['OS=="mac"', {
                     'dependencies': [
@@ -302,12 +324,6 @@
                     'dependencies': [
                         '<(chromium_src_dir)/build/linux/system.gyp:fontconfig',
                     ],
-                    'copies': [{
-                        'destination': '<(PRODUCT_DIR)',
-                        'files': [
-                            '<(INTERMEDIATE_DIR)/repack/DumpRenderTree.pak',
-                        ]
-                    }],
                     'variables': {
                         # FIXME: Enable warnings on other platforms.
                         'chromium_code': 1,
@@ -343,17 +359,16 @@
                         '<(chromium_src_dir)/tools/android/forwarder/forwarder.gyp:forwarder',
                         '<(chromium_src_dir)/tools/android/md5sum/md5sum.gyp:md5sum',
                     ],
-                    'copies': [{
-                        'destination': '<(PRODUCT_DIR)',
-                        'files': [
-                            '<(INTERMEDIATE_DIR)/repack/DumpRenderTree.pak',
-                        ]
-                    }],
                 }, { # OS!="android"
                     'sources/': [
                         ['exclude', 'Android\\.cpp$'],
                     ],
                 }],
+                ['use_custom_freetype==1', {
+                   'dependencies': [
+                       '<(chromium_src_dir)/third_party/freetype2/freetype2.gyp:freetype2',
+                   ],
+                }],
                 ['inside_chromium_build==0', {
                     'dependencies': [
                         '<(chromium_src_dir)/webkit/support/setup_third_party.gyp:third_party_headers',
@@ -362,6 +377,45 @@
             ],
         },
         {
+            'target_name': 'DumpRenderTree_resources',
+            'type': 'none',
+            'dependencies': [
+                '<(chromium_src_dir)/net/net.gyp:net_resources',
+                '<(chromium_src_dir)/ui/ui.gyp:ui_resources',
+                '<(chromium_src_dir)/webkit/support/webkit_support.gyp:webkit_resources',
+                '<(chromium_src_dir)/webkit/support/webkit_support.gyp:webkit_strings',
+            ],
+            'actions': [{
+                'action_name': 'repack_local',
+                'variables': {
+                    'repack_path': '<(chromium_src_dir)/tools/grit/grit/format/repack.py',
+                    'pak_inputs': [
+                        '<(SHARED_INTERMEDIATE_DIR)/net/net_resources.pak',
+                        '<(SHARED_INTERMEDIATE_DIR)/ui/gfx/gfx_resources.pak',
+                        '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.pak',
+                        '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_strings_en-US.pak',
+                        '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources_100_percent.pak',
+                ]},
+                'inputs': [
+                    '<(repack_path)',
+                    '<@(pak_inputs)',
+                ],
+                'outputs': [
+                    '<(PRODUCT_DIR)/DumpRenderTree.pak',
+                ],
+                'action': ['python', '<(repack_path)', '<@(_outputs)', '<@(pak_inputs)'],
+            }],
+            'conditions': [
+                ['OS=="mac"', {
+                    'all_dependent_settings': {
+                        'mac_bundle_resources': [
+                            '<(PRODUCT_DIR)/DumpRenderTree.pak',
+                        ],
+                    },
+                }],
+            ]
+        },
+        {
             'target_name': 'TestNetscapePlugIn',
             'type': 'loadable_module',
             'sources': [ '<@(test_plugin_files)' ],
@@ -405,6 +459,8 @@
                     ],
                     # The .rc file requires that the name of the dll is npTestNetscapePlugIn.dll.
                     'product_name': 'npTestNetscapePlugIn',
+                    # Disable c4267 warnings until we fix size_t to int truncations. 
+                    'msvs_disabled_warnings': [ 4267, ],
                 }],
             ],
         },
@@ -470,18 +526,13 @@
                 'target_name': 'DumpRenderTree_apk',
                 'type': 'none',
                 'dependencies': [
-                    '<(chromium_src_dir)/base/base.gyp:base',
+                    '<(chromium_src_dir)/base/base.gyp:base_java',
                     '<(chromium_src_dir)/media/media.gyp:media_java',
-                    '<(chromium_src_dir)/net/net.gyp:net',
+                    '<(chromium_src_dir)/net/net.gyp:net_java',
                     'DumpRenderTree',
                 ],
                 'variables': {
                     'input_shlib_path': '<(SHARED_LIB_DIR)/<(SHARED_LIB_PREFIX)DumpRenderTree<(SHARED_LIB_SUFFIX)',
-                    'input_jars_paths': [
-                        '<(PRODUCT_DIR)/lib.java/chromium_base.jar',
-                        '<(PRODUCT_DIR)/lib.java/chromium_net.jar',
-                        '<(PRODUCT_DIR)/lib.java/chromium_media.jar',
-                    ],
                     'conditions': [
                         ['inside_chromium_build==1', {
                             'ant_build_to_chromium_src': '<(ant_build_out)/../../',
@@ -500,7 +551,7 @@
                         '<(chromium_src_dir)/testing/android/AndroidManifest.xml',
                         '<(chromium_src_dir)/testing/android/generate_native_test.py',
                         '<(input_shlib_path)',
-                        '<@(input_jars_paths)',
+                        '>@(input_jars_paths)',
                     ],
                     'outputs': [
                         '<(PRODUCT_DIR)/DumpRenderTree_apk/DumpRenderTree-debug.apk',
@@ -509,12 +560,12 @@
                         '<(chromium_src_dir)/testing/android/generate_native_test.py',
                         '--native_library',
                         '<(input_shlib_path)',
-                        '--jars',
-                        '"<@(input_jars_paths)"',
                         '--output',
                         '<(PRODUCT_DIR)/DumpRenderTree_apk',
                         '--strip-binary=<(android_strip)',
                         '--ant-args',
+                        '-quiet',
+                        '--ant-args',
                         '-DANDROID_SDK=<(android_sdk)',
                         '--ant-args',
                         '-DANDROID_SDK_ROOT=<(android_sdk_root)',
@@ -530,6 +581,8 @@
                         '-DPRODUCT_DIR=<(ant_build_out)',
                         '--ant-args',
                         '-DCHROMIUM_SRC=<(ant_build_to_chromium_src)',
+                        '--ant-args',
+                        '-DINPUT_JARS_PATHS=>@(input_jars_paths)',
                         '--app_abi',
                         '<(android_app_abi)',
                     ],
diff --git a/Tools/DumpRenderTree/DumpRenderTree.gypi b/Tools/DumpRenderTree/DumpRenderTree.gypi
index ac4d2a6..32155df 100644
--- a/Tools/DumpRenderTree/DumpRenderTree.gypi
+++ b/Tools/DumpRenderTree/DumpRenderTree.gypi
@@ -8,28 +8,10 @@
             'chromium/DRTDevToolsClient.cpp',
             'chromium/DRTDevToolsClient.h',
             'chromium/DumpRenderTree.cpp',
-            'chromium/DRTTestRunner.cpp',
-            'chromium/DRTTestRunner.h',
-            'chromium/MockConstraints.cpp',
-            'chromium/MockConstraints.h',
-            'chromium/MockGrammarCheck.cpp',
-            'chromium/MockGrammarCheck.h',
-            'chromium/MockSpellCheck.cpp',
-            'chromium/MockSpellCheck.h',
-            'chromium/MockWebKitPlatformSupport.cpp',
-            'chromium/MockWebKitPlatformSupport.h',
-            'chromium/MockWebMediaStreamCenter.cpp',
-            'chromium/MockWebMediaStreamCenter.h',
+            'chromium/MockPlatform.cpp',
+            'chromium/MockPlatform.h',
             'chromium/MockWebPrerenderingSupport.cpp',
             'chromium/MockWebPrerenderingSupport.h',
-            'chromium/MockWebRTCPeerConnectionHandler.cpp',
-            'chromium/MockWebRTCPeerConnectionHandler.h',
-            'chromium/MockWebSpeechInputController.cpp',
-            'chromium/MockWebSpeechInputController.h',
-            'chromium/MockWebSpeechRecognizer.cpp',
-            'chromium/MockWebSpeechRecognizer.h',
-            'chromium/NotificationPresenter.h',
-            'chromium/NotificationPresenter.cpp',
             'chromium/Task.h',
             'chromium/Task.cpp',
             'chromium/TestEventPrinter.h',
@@ -44,34 +26,17 @@
             'chromium/TestShellStub.cpp',
             'chromium/TestShellWin.cpp',
             'chromium/TestShellX11.cpp',
-            'chromium/TestWebPlugin.cpp',
-            'chromium/TestWebPlugin.h',
-            'chromium/WebPermissions.cpp',
-            'chromium/WebPermissions.h',
-            'chromium/WebPreferences.cpp',
-            'chromium/WebPreferences.h',
-            'chromium/WebThemeControlDRTWin.cpp',
-            'chromium/WebThemeControlDRTWin.h',
-            'chromium/WebThemeEngineDRTMac.mm',
-            'chromium/WebThemeEngineDRTMac.h',
-            'chromium/WebThemeEngineDRTWin.cpp',
-            'chromium/WebThemeEngineDRTWin.h',
-            'chromium/WebUserMediaClientMock.cpp',
-            'chromium/WebUserMediaClientMock.h',
             'chromium/WebViewHost.cpp',
             'chromium/WebViewHost.h',
-            'chromium/WebViewHostOutputSurface.cpp',
-            'chromium/WebViewHostOutputSurface.h',
-            'chromium/WebViewHostSoftwareOutputDevice.cpp',
-            'chromium/WebViewHostSoftwareOutputDevice.h',
         ],
         'test_runner_files': [
-            'chromium/TestRunner/public/WebAccessibilityController.h',
             'chromium/TestRunner/public/WebTestDelegate.h',
-            'chromium/TestRunner/public/WebEventSender.h',
+            'chromium/TestRunner/public/WebPreferences.h',
             'chromium/TestRunner/public/WebTask.h',
+            'chromium/TestRunner/public/WebTestCommon.h',
             'chromium/TestRunner/public/WebTestInterfaces.h',
             'chromium/TestRunner/public/WebTestProxy.h',
+            'chromium/TestRunner/public/WebTestRunner.h',
             'chromium/TestRunner/src/AccessibilityControllerChromium.cpp',
             'chromium/TestRunner/src/AccessibilityControllerChromium.h',
             'chromium/TestRunner/src/AccessibilityUIElementChromium.cpp',
@@ -86,17 +51,52 @@
             'chromium/TestRunner/src/GamepadController.h',
             'chromium/TestRunner/src/KeyCodeMapping.cpp',
             'chromium/TestRunner/src/KeyCodeMapping.h',
+            'chromium/TestRunner/src/MockConstraints.cpp',
+            'chromium/TestRunner/src/MockConstraints.h',
+            'chromium/TestRunner/src/MockGrammarCheck.cpp',
+            'chromium/TestRunner/src/MockGrammarCheck.h',
+            'chromium/TestRunner/src/MockSpellCheck.cpp',
+            'chromium/TestRunner/src/MockSpellCheck.h',
+            'chromium/TestRunner/src/MockWebMediaStreamCenter.cpp',
+            'chromium/TestRunner/src/MockWebMediaStreamCenter.h',
+            'chromium/TestRunner/src/MockWebRTCDataChannelHandler.cpp',
+            'chromium/TestRunner/src/MockWebRTCDataChannelHandler.h',
+            'chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.cpp',
+            'chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.h',
+            'chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp',
+            'chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.h',
+            'chromium/TestRunner/src/MockWebSpeechInputController.cpp',
+            'chromium/TestRunner/src/MockWebSpeechInputController.h',
+            'chromium/TestRunner/src/MockWebSpeechRecognizer.cpp',
+            'chromium/TestRunner/src/MockWebSpeechRecognizer.h',
+            'chromium/TestRunner/src/NotificationPresenter.h',
+            'chromium/TestRunner/src/NotificationPresenter.cpp',
+            'chromium/TestRunner/src/SpellCheckClient.cpp',
+            'chromium/TestRunner/src/SpellCheckClient.h',
+            'chromium/TestRunner/src/TestCommon.cpp',
+            'chromium/TestRunner/src/TestCommon.h',
             'chromium/TestRunner/src/TestInterfaces.cpp',
             'chromium/TestRunner/src/TestInterfaces.h',
-            'chromium/TestRunner/src/TextInputController.cpp',
-            'chromium/TestRunner/src/TextInputController.h',
+            'chromium/TestRunner/src/TestPlugin.cpp',
+            'chromium/TestRunner/src/TestPlugin.h',
             'chromium/TestRunner/src/TestRunner.cpp',
             'chromium/TestRunner/src/TestRunner.h',
-            'chromium/TestRunner/src/WebAccessibilityController.cpp',
-            'chromium/TestRunner/src/WebEventSender.cpp',
+            'chromium/TestRunner/src/TextInputController.cpp',
+            'chromium/TestRunner/src/TextInputController.h',
+            'chromium/TestRunner/src/WebPermissions.cpp',
+            'chromium/TestRunner/src/WebPermissions.h',
+            'chromium/TestRunner/src/WebPreferences.cpp',
             'chromium/TestRunner/src/WebTask.cpp',
             'chromium/TestRunner/src/WebTestInterfaces.cpp',
             'chromium/TestRunner/src/WebTestProxy.cpp',
+            'chromium/TestRunner/src/WebTestThemeControlWin.cpp',
+            'chromium/TestRunner/src/WebTestThemeControlWin.h',
+            'chromium/TestRunner/src/WebTestThemeEngineMac.mm',
+            'chromium/TestRunner/src/WebTestThemeEngineMac.h',
+            'chromium/TestRunner/src/WebTestThemeEngineWin.cpp',
+            'chromium/TestRunner/src/WebTestThemeEngineWin.h',
+            'chromium/TestRunner/src/WebUserMediaClientMock.cpp',
+            'chromium/TestRunner/src/WebUserMediaClientMock.h',
         ],
         'test_plugin_files': [
             'TestNetscapePlugIn/PluginObject.cpp',
@@ -113,6 +113,7 @@
             'TestNetscapePlugIn/Tests/GetURLWithJavaScriptURL.cpp',
             'TestNetscapePlugIn/Tests/GetURLWithJavaScriptURLDestroyingPlugin.cpp',
             'TestNetscapePlugIn/Tests/GetUserAgentWithNullNPPFromNPPNew.cpp',
+            'TestNetscapePlugIn/Tests/LogNPPSetWindow.cpp',
             'TestNetscapePlugIn/Tests/NPPNewFails.cpp',
             'TestNetscapePlugIn/Tests/NPRuntimeCallsWithNullNPP.cpp',
             'TestNetscapePlugIn/Tests/NPRuntimeObjectFromDestroyedPlugin.cpp',
diff --git a/Tools/DumpRenderTree/DumpRenderTree.h b/Tools/DumpRenderTree/DumpRenderTree.h
index 4c6a472..62789b5 100644
--- a/Tools/DumpRenderTree/DumpRenderTree.h
+++ b/Tools/DumpRenderTree/DumpRenderTree.h
@@ -66,11 +66,12 @@
 void displayWebView();
 
 struct TestCommand {
-    TestCommand() : shouldDumpPixels(false) { }
+    TestCommand() : shouldDumpPixels(false), timeout(30000) { }
 
     std::string pathOrURL;
     bool shouldDumpPixels;
     std::string expectedPixelHash;
+    int timeout; // in ms
 };
 
 TestCommand parseInputLine(const std::string&);
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree.sln b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree.sln
new file mode 100644
index 0000000..285e252
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree.sln
@@ -0,0 +1,56 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestNetscapePlugin", "TestNetscapePlugin\TestNetscapePlugin.vcxproj", "{C0737398-3565-439E-A2B8-AB2BE4D5430C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageDiffLauncher", "ImageDiff\ImageDiffLauncher.vcxproj", "{DD7949B6-F2B4-47C2-9C42-E21E84CB1017}"
+	ProjectSection(ProjectDependencies) = postProject
+		{59CC0547-70AC-499C-9B19-EC01C6F61137} = {59CC0547-70AC-499C-9B19-EC01C6F61137}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageDiff", "ImageDiff\ImageDiff.vcxproj", "{59CC0547-70AC-499C-9B19-EC01C6F61137}"
+	ProjectSection(ProjectDependencies) = postProject
+		{C0737398-3565-439E-A2B8-AB2BE4D5430C} = {C0737398-3565-439E-A2B8-AB2BE4D5430C}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpRenderTree", "DumpRenderTree\DumpRenderTree.vcxproj", "{6567DFD4-D6DE-4CD5-825D-17E353D160E1}"
+	ProjectSection(ProjectDependencies) = postProject
+		{DD7949B6-F2B4-47C2-9C42-E21E84CB1017} = {DD7949B6-F2B4-47C2-9C42-E21E84CB1017}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpRenderTreeLauncher", "DumpRenderTree\DumpRenderTreeLauncher.vcxproj", "{2974EA02-840B-4995-8719-8920A61006F1}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6567DFD4-D6DE-4CD5-825D-17E353D160E1} = {6567DFD4-D6DE-4CD5-825D-17E353D160E1}
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{C0737398-3565-439E-A2B8-AB2BE4D5430C}.Debug|Win32.ActiveCfg = Debug|Win32
+		{C0737398-3565-439E-A2B8-AB2BE4D5430C}.Debug|Win32.Build.0 = Debug|Win32
+		{C0737398-3565-439E-A2B8-AB2BE4D5430C}.Release|Win32.ActiveCfg = Release|Win32
+		{C0737398-3565-439E-A2B8-AB2BE4D5430C}.Release|Win32.Build.0 = Release|Win32
+		{DD7949B6-F2B4-47C2-9C42-E21E84CB1017}.Debug|Win32.ActiveCfg = Debug|Win32
+		{DD7949B6-F2B4-47C2-9C42-E21E84CB1017}.Debug|Win32.Build.0 = Debug|Win32
+		{DD7949B6-F2B4-47C2-9C42-E21E84CB1017}.Release|Win32.ActiveCfg = Release|Win32
+		{DD7949B6-F2B4-47C2-9C42-E21E84CB1017}.Release|Win32.Build.0 = Release|Win32
+		{59CC0547-70AC-499C-9B19-EC01C6F61137}.Debug|Win32.ActiveCfg = Debug|Win32
+		{59CC0547-70AC-499C-9B19-EC01C6F61137}.Debug|Win32.Build.0 = Debug|Win32
+		{59CC0547-70AC-499C-9B19-EC01C6F61137}.Release|Win32.ActiveCfg = Release|Win32
+		{59CC0547-70AC-499C-9B19-EC01C6F61137}.Release|Win32.Build.0 = Release|Win32
+		{6567DFD4-D6DE-4CD5-825D-17E353D160E1}.Debug|Win32.ActiveCfg = Debug|Win32
+		{6567DFD4-D6DE-4CD5-825D-17E353D160E1}.Debug|Win32.Build.0 = Debug|Win32
+		{6567DFD4-D6DE-4CD5-825D-17E353D160E1}.Release|Win32.ActiveCfg = Release|Win32
+		{6567DFD4-D6DE-4CD5-825D-17E353D160E1}.Release|Win32.Build.0 = Release|Win32
+		{2974EA02-840B-4995-8719-8920A61006F1}.Debug|Win32.ActiveCfg = Debug|Win32
+		{2974EA02-840B-4995-8719-8920A61006F1}.Debug|Win32.Build.0 = Debug|Win32
+		{2974EA02-840B-4995-8719-8920A61006F1}.Release|Win32.ActiveCfg = Release|Win32
+		{2974EA02-840B-4995-8719-8920A61006F1}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj
new file mode 100644
index 0000000..5f8a752
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{6567DFD4-D6DE-4CD5-825D-17E353D160E1}</ProjectGuid>

+    <RootNamespace>DumpRenderTree</RootNamespace>

+    <Keyword>Win32Proj</Keyword>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeReleaseWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeProduction.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeDebugWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\AccessibilityController.cpp" />

+    <ClCompile Include="..\..\AccessibilityTextMarker.cpp" />

+    <ClCompile Include="..\..\AccessibilityUIElement.cpp" />

+    <ClCompile Include="..\..\cairo\PixelDumpSupportCairo.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\..\cg\PixelDumpSupportCG.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\..\CyclicRedundancyCheck.cpp" />

+    <ClCompile Include="..\..\DumpRenderTreeCommon.cpp" />

+    <ClCompile Include="..\..\GCController.cpp" />

+    <ClCompile Include="..\..\PixelDumpSupport.cpp" />

+    <ClCompile Include="..\..\TestRunner.cpp" />

+    <ClCompile Include="..\..\win\AccessibilityControllerWin.cpp" />

+    <ClCompile Include="..\..\win\AccessibilityUIElementWin.cpp" />

+    <ClCompile Include="..\..\win\DRTDataObject.cpp" />

+    <ClCompile Include="..\..\win\DRTDesktopNotificationPresenter.cpp" />

+    <ClCompile Include="..\..\win\DRTDropSource.cpp" />

+    <ClCompile Include="..\..\win\DumpRenderTree.cpp" />

+    <ClCompile Include="..\..\win\EditingDelegate.cpp" />

+    <ClCompile Include="..\..\win\EventSender.cpp" />

+    <ClCompile Include="..\..\win\FrameLoadDelegate.cpp" />

+    <ClCompile Include="..\..\win\GCControllerWin.cpp" />

+    <ClCompile Include="..\..\win\HistoryDelegate.cpp" />

+    <ClCompile Include="..\..\win\MD5.cpp" />

+    <ClCompile Include="..\..\win\PixelDumpSupportWin.cpp" />

+    <ClCompile Include="..\..\win\PolicyDelegate.cpp" />

+    <ClCompile Include="..\..\win\ResourceLoadDelegate.cpp" />

+    <ClCompile Include="..\..\win\TestRunnerWin.cpp" />

+    <ClCompile Include="..\..\win\TextInputController.cpp" />

+    <ClCompile Include="..\..\win\TextInputControllerWin.cpp" />

+    <ClCompile Include="..\..\win\UIDelegate.cpp" />

+    <ClCompile Include="..\..\win\WorkQueueItemWin.cpp" />

+    <ClCompile Include="..\..\WorkQueue.cpp" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\..\AccessibilityController.h" />

+    <ClInclude Include="..\..\AccessibilityTextMarker.h" />

+    <ClInclude Include="..\..\AccessibilityUIElement.h" />

+    <ClInclude Include="..\..\cairo\PixelDumpSupportCairo.h">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>

+    </ClInclude>

+    <ClInclude Include="..\..\cg\PixelDumpSupportCG.h">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>

+    </ClInclude>

+    <ClInclude Include="..\..\config.h" />

+    <ClInclude Include="..\..\CyclicRedundancyCheck.h" />

+    <ClInclude Include="..\..\DumpRenderTree.h" />

+    <ClInclude Include="..\..\DumpRenderTreePrefix.h" />

+    <ClInclude Include="..\..\GCController.h" />

+    <ClInclude Include="..\..\PixelDumpSupport.h" />

+    <ClInclude Include="..\..\TestRunner.h" />

+    <ClInclude Include="..\..\win\DraggingInfo.h" />

+    <ClInclude Include="..\..\win\DRTDataObject.h" />

+    <ClInclude Include="..\..\win\DRTDesktopNotificationPresenter.h" />

+    <ClInclude Include="..\..\win\DRTDropSource.h" />

+    <ClInclude Include="..\..\win\DumpRenderTreeWin.h" />

+    <ClInclude Include="..\..\win\EditingDelegate.h" />

+    <ClInclude Include="..\..\win\EventSender.h" />

+    <ClInclude Include="..\..\win\FrameLoadDelegate.h" />

+    <ClInclude Include="..\..\win\HistoryDelegate.h" />

+    <ClInclude Include="..\..\win\MD5.h" />

+    <ClInclude Include="..\..\win\PolicyDelegate.h" />

+    <ClInclude Include="..\..\win\ResourceLoadDelegate.h" />

+    <ClInclude Include="..\..\win\TextInputController.h" />

+    <ClInclude Include="..\..\win\UIDelegate.h" />

+    <ClInclude Include="..\..\WorkQueue.h" />

+    <ClInclude Include="..\..\WorkQueueItem.h" />

+    <CustomBuildStep Include="MD5.h" />

+    <CustomBuildStep Include="..\cairo\PixelDumpSupportCairo.h">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>

+    </CustomBuildStep>

+    <CustomBuildStep Include="..\cg\PixelDumpSupportCG.h" />

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="DumpRenderTreePostBuild.cmd" />

+    <None Include="DumpRenderTreePreBuild.cmd" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj.filters b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj.filters
new file mode 100644
index 0000000..92151e0
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTree.vcxproj.filters
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Controllers">

+      <UniqueIdentifier>{f76f7e03-4f6a-46fd-a3e6-3cc4d2f7e918}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Delegates">

+      <UniqueIdentifier>{964367be-8e77-444f-9b05-7c906d89e35e}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Support">

+      <UniqueIdentifier>{59309c9f-8148-4c01-a552-888c6c065f73}</UniqueIdentifier>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\AccessibilityController.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\GCController.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestRunner.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\AccessibilityControllerWin.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\DRTDataObject.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\DRTDropSource.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\EventSender.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\GCControllerWin.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\TestRunnerWin.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\TextInputController.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\TextInputControllerWin.cpp">

+      <Filter>Controllers</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\DRTDesktopNotificationPresenter.cpp">

+      <Filter>Delegates</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\HistoryDelegate.cpp">

+      <Filter>Delegates</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\PolicyDelegate.cpp">

+      <Filter>Delegates</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\ResourceLoadDelegate.cpp">

+      <Filter>Delegates</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\UIDelegate.cpp">

+      <Filter>Delegates</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\EditingDelegate.cpp">

+      <Filter>Delegates</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\FrameLoadDelegate.cpp">

+      <Filter>Delegates</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\AccessibilityTextMarker.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\AccessibilityUIElementWin.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\AccessibilityUIElement.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\CyclicRedundancyCheck.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\DumpRenderTreeCommon.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\DumpRenderTree.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\MD5.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\PixelDumpSupport.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\WorkQueueItemWin.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\cairo\PixelDumpSupportCairo.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\cg\PixelDumpSupportCG.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\win\PixelDumpSupportWin.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\WorkQueue.cpp">

+      <Filter>Support</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\..\AccessibilityController.h">

+      <Filter>Controllers</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\GCController.h">

+      <Filter>Controllers</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\TestRunner.h">

+      <Filter>Controllers</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\DRTDataObject.h">

+      <Filter>Controllers</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\DRTDropSource.h">

+      <Filter>Controllers</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\EventSender.h">

+      <Filter>Controllers</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\TextInputController.h">

+      <Filter>Controllers</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\DRTDesktopNotificationPresenter.h">

+      <Filter>Delegates</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\HistoryDelegate.h">

+      <Filter>Delegates</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\PolicyDelegate.h">

+      <Filter>Delegates</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\ResourceLoadDelegate.h">

+      <Filter>Delegates</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\UIDelegate.h">

+      <Filter>Delegates</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\EditingDelegate.h">

+      <Filter>Delegates</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\FrameLoadDelegate.h">

+      <Filter>Delegates</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\config.h" />

+    <ClInclude Include="..\..\AccessibilityTextMarker.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\AccessibilityUIElement.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\DumpRenderTreePrefix.h" />

+    <ClInclude Include="..\..\CyclicRedundancyCheck.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\DraggingInfo.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\DumpRenderTree.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\DumpRenderTreeWin.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\win\MD5.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\PixelDumpSupport.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\cairo\PixelDumpSupportCairo.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\cg\PixelDumpSupportCG.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\WorkQueue.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\WorkQueueItem.h">

+      <Filter>Support</Filter>

+    </ClInclude>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="DumpRenderTreePostBuild.cmd" />

+    <None Include="DumpRenderTreePreBuild.cmd" />

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeApple.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeApple.props
new file mode 100644
index 0000000..3aa5156
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeApple.props
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\cg;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+    </ClCompile>

+    <Link>

+      <AdditionalDependencies>CoreGraphics.lib;CoreFoundation.lib;CFNetwork.lib;%(AdditionalDependencies)</AdditionalDependencies>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeCommon.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeCommon.props
new file mode 100644
index 0000000..0ac58a1
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeCommon.props
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir)\..\..;$(ProjectDir)\..\..\win;$(ConfigurationBuildDir)\Include;$(ConfigurationBuildDir)\Include\private;$(ConfigurationBuildDir)\Include\DumpRenderTree\ForwardingHeaders;$(ConfigurationBuildDir)\Include\JavaScriptCore;$(ConfigurationBuildDir)\Include\private\JavaScriptCore;$(ConfigurationBuildDir)\Include\WebCoreTestSupport;$(ConfigurationBuildDir)\Include\WebCore;$(WebKit_Libraries)\Include;$(WebKit_Libraries)\Include\private;$(WebKit_Libraries)\include\pthreads;$(WebKit_Libraries)\Include\WebCore;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <DisableSpecificWarnings>4146;%(DisableSpecificWarnings)</DisableSpecificWarnings>

+      <ForcedIncludeFiles>DumpRenderTreePrefix.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>

+    </ClCompile>

+    <Link>

+      <AdditionalOptions>/NXCOMPAT %(AdditionalOptions)</AdditionalOptions>

+      <AdditionalDependencies>JavaScriptCore.lib;WebKitGUID.lib;WebKit.lib;WebCoreTestSupport.lib;pthreadVC2.lib;gdi32.lib;ole32.lib;oleaut32.lib;user32.lib;shlwapi.lib;oleacc.lib;comsuppw.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <SubSystem>Console</SubSystem>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebug.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebug.props
new file mode 100644
index 0000000..06bcf15
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebug.props
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="DumpRenderTreeCommon.props" />

+    <Import Project="DumpRenderTreeApple.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebugWinCairo.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebugWinCairo.props
new file mode 100644
index 0000000..8c5f6d6
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeDebugWinCairo.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefinesCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\WinCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\cURL.props" />

+    <Import Project="$(WebKit_Source)\WebKit\WebKit.vcxproj\WebKit\WebKitCFLite.props" />

+    <Import Project="DumpRenderTreeCommon.props" />

+  </ImportGroup>

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\cairo;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+    </ClCompile>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncher.vcxproj b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncher.vcxproj
new file mode 100644
index 0000000..a67ee22
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncher.vcxproj
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{2974EA02-840B-4995-8719-8920A61006F1}</ProjectGuid>

+    <RootNamespace>DumpRenderTreeLauncher</RootNamespace>

+    <Keyword>Win32Proj</Keyword>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeLauncherRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeLauncherRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeLauncherProduction.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeLauncherDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeLauncherDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="DumpRenderTreeLauncherDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>

+  </PropertyGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Link>

+      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">

+    <Link>

+      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">

+    <Link>

+      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Link>

+      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">

+    <Link>

+      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">

+    <Link>

+      <AdditionalOptions>/SAFESEH %(AdditionalOptions)</AdditionalOptions>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\..\win\DLLLauncher\DLLLauncherMain.cpp" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherCommon.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherCommon.props
new file mode 100644
index 0000000..ef4af31
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherCommon.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <TargetName>DumpRenderTree</TargetName>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <PreprocessorDefinitions>USE_CONSOLE_ENTRY_POINT;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <Link>

+      <AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <OutputFile>$(OutDir)DumpRenderTree.exe</OutputFile>

+      <SubSystem>Console</SubSystem>

+      <ProgramDatabaseFile>$(TargetDir)$(TargetName)Launcher.pdb</ProgramDatabaseFile>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherDebug.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherDebug.props
new file mode 100644
index 0000000..0faa57f
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherDebug.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="DumpRenderTreeLauncherCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherProduction.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherProduction.props
new file mode 100644
index 0000000..a7098d8
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherProduction.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="DumpRenderTreeLauncherCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherRelease.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherRelease.props
new file mode 100644
index 0000000..b02cd0d
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeLauncherRelease.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="DumpRenderTreeLauncherCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePostBuild.cmd b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePostBuild.cmd
new file mode 100644
index 0000000..3d0ff4b
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePostBuild.cmd
@@ -0,0 +1,62 @@
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" del "%CONFIGURATIONBUILDDIR%\buildfailed"
+
+if not defined ARCHIVE_BUILD (if defined PRODUCTION exit /b)
+
+mkdir 2>NUL "%CONFIGURATIONBUILDDIR%\bin"
+
+if not exist "%WEBKIT_LIBRARIES%\bin\CoreFoundation.dll" GOTO:CFLITE
+
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CoreFoundation.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CoreFoundation.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CoreVideo.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CoreVideo.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CFNetwork.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CFNetwork.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d /e /i "%WEBKIT_LIBRARIES%\bin\CFNetwork.resources" "%CONFIGURATIONBUILDDIR%\bin\CFNetwork.resources"
+xcopy /y /d /e /i "%WEBKIT_LIBRARIES%\bin\CoreFoundation.resources" "%CONFIGURATIONBUILDDIR%\bin\CoreFoundation.resources"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CoreGraphics.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CoreGraphics.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icudt40.dll" xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icudt40.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icudt40.dll"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icudt40.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuin40.dll"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuin40.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuin40.pdb"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuin40.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuuc40.dll"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuuc40.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuuc40.pdb"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuuc40.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icudt42.dll" xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icudt42.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icudt42.dll"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icudt42.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuin42.dll"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuin42.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuin42.pdb"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuin42.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuuc42.dll"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuuc42.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\icuuc42.pdb"xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icuuc42.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libxml2.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libxslt.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\pthreadVC2.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\pthreadVC2.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\SQLite3.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\SQLite3.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\zlib1.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\zlib1.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+exit /b
+
+:CFLITE
+if not exist "%WEBKIT_LIBRARIES%\bin\CFLite.dll" exit /b
+
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CFLite.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\CFLite.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d /e /i "%WEBKIT_LIBRARIES%\bin\CFLite.resources" "%CONFIGURATIONBUILDDIR%\bin\CFLite.resources"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libcurl.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libeay32.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\ssleay32.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\cairo.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\icudt46.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libicuuc.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libicuin.dll" "%CONFIGURATIONBUILDDIR%\bin"
+
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libxml2.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\libxslt.dll" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\pthreadVC2.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\pthreadVC2.pdb" xcopy /y /d "%WEBKIT_LIBRARIES%\bin\pthreadVC2.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\SQLite3.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\SQLite3.pdb" xcopy /y /d "%WEBKIT_LIBRARIES%\bin\SQLite3.pdb" "%CONFIGURATIONBUILDDIR%\bin"
+xcopy /y /d "%WEBKIT_LIBRARIES%\bin\zlib1.dll" "%CONFIGURATIONBUILDDIR%\bin"
+if exist "%WEBKIT_LIBRARIES%\bin\zlib1.pdb" xcopy /y /d "%WEBKIT_LIBRARIES%\bin\zlib1.pdb" "%CONFIGURATIONBUILDDIR%\bin"
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePreBuild.cmd b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePreBuild.cmd
new file mode 100644
index 0000000..43c41c8
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreePreBuild.cmd
@@ -0,0 +1,20 @@
+%SystemDrive%\cygwin\bin\which.exe bash
+if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH%
+cmd /c
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" grep XX%PROJECTNAME%XX "%CONFIGURATIONBUILDDIR%\buildfailed"
+if errorlevel 1 exit 1
+echo XX%PROJECTNAME%XX > "%CONFIGURATIONBUILDDIR%\buildfailed"
+
+mkdir 2>NUL "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree"
+mkdir 2>NUL "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders"
+mkdir 2>NUL "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\runtime"
+mkdir 2>NUL "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\wtf"
+
+xcopy /y /d "%PROJECTDIR%\..\..\ForwardingHeaders\wtf\*.h" "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\wtf"
+xcopy /y /d "%PROJECTDIR%\..\..\ForwardingHeaders\runtime\*.h" "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\runtime"
+
+if "%CONFIGURATIONNAME%"=="Debug_Cairo_CFLite" xcopy /y /d "%CONFIGURATIONBUILDDIR%\include\WebCore\ForwardingHeaders\wtf\MD5.h" "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\wtf"
+if "%CONFIGURATIONNAME%"=="Release_Cairo_CFLite" xcopy /y /d "%CONFIGURATIONBUILDDIR%\include\WebCore\ForwardingHeaders\wtf\MD5.h" "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\wtf"
+
+if "%CONFIGURATIONNAME%"=="Debug_Cairo" xcopy /y /d "%CONFIGURATIONBUILDDIR%\include\WebCore\ForwardingHeaders\wtf\MD5.h" "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\wtf"
+if "%CONFIGURATIONNAME%"=="Release_Cairo" xcopy /y /d "%CONFIGURATIONBUILDDIR%\include\WebCore\ForwardingHeaders\wtf\MD5.h" "%CONFIGURATIONBUILDDIR%\include\DumpRenderTree\ForwardingHeaders\wtf"
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeProduction.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeProduction.props
new file mode 100644
index 0000000..9b6aae0
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeProduction.props
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="DumpRenderTreeApple.props" />

+    <Import Project="DumpRenderTreeCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeRelease.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeRelease.props
new file mode 100644
index 0000000..610d794
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeRelease.props
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="DumpRenderTreeCommon.props" />

+    <Import Project="DumpRenderTreeApple.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeReleaseWinCairo.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeReleaseWinCairo.props
new file mode 100644
index 0000000..bf1f852
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/DumpRenderTree/DumpRenderTreeReleaseWinCairo.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefinesCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\WinCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\cURL.props" />

+    <Import Project="$(WebKit_Source)\WebKit\WebKit.vcxproj\WebKit\WebKitCFLite.props" />

+    <Import Project="DumpRenderTreeCommon.props" />

+  </ImportGroup>

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\cairo;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+    </ClCompile>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiff.vcxproj b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiff.vcxproj
new file mode 100644
index 0000000..144b6b2
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiff.vcxproj
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{59CC0547-70AC-499C-9B19-EC01C6F61137}</ProjectGuid>

+    <RootNamespace>ImageDiff</RootNamespace>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffReleaseWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffProduction.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffDebugWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\cg\ImageDiffCG.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\..\win\ImageDiffCairo.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\..\win\ImageDiffWin.cpp" />

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="ImageDiffPostBuild.cmd" />

+    <None Include="ImageDiffPreBuild.cmd" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommon.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommon.props
new file mode 100644
index 0000000..071b082
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommon.props
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ConfigurationBuildDir)\include;$(ConfigurationBuildDir)\include\private;$(ConfigurationBuildDir)\include\private\JavaScriptCore;$(WebKit_Libraries)\include;$(WebKit_Libraries)\include\private;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <Link>

+      <AdditionalOptions>/NXCOMPAT %(AdditionalOptions)</AdditionalOptions>

+      <AdditionalDependencies>JavaScriptCore.lib;CoreGraphics.lib;CoreFoundation.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <SubSystem>Console</SubSystem>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommonWinCairo.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommonWinCairo.props
new file mode 100644
index 0000000..380be3c
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffCommonWinCairo.props
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ConfigurationBuildDir)\include;$(ConfigurationBuildDir)\include\private;$(ConfigurationBuildDir)\include\private\JavaScriptCore;$(WebKit_Libraries)\include;$(WebKit_Libraries)\include\private;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <Link>

+      <AdditionalOptions>/NXCOMPAT %(AdditionalOptions)</AdditionalOptions>

+      <AdditionalDependencies>JavaScriptCore.lib;CFLite.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <SubSystem>Console</SubSystem>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>

diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebug.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebug.props
new file mode 100644
index 0000000..29ef2dd
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebug.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="ImageDiffCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebugWinCairo.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebugWinCairo.props
new file mode 100644
index 0000000..45cdc16
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffDebugWinCairo.props
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\WinCairo.props" />

+    <Import Project="ImageDiffCommonWinCairo.props" />

+  </ImportGroup>

+</Project>

diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncher.vcxproj b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncher.vcxproj
new file mode 100644
index 0000000..a89688e
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncher.vcxproj
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{DD7949B6-F2B4-47C2-9C42-E21E84CB1017}</ProjectGuid>

+    <RootNamespace>ImageDiffLauncher</RootNamespace>

+    <Keyword>Win32Proj</Keyword>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffLauncherRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffLauncherRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffLauncherProduction.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffLauncherDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffLauncherDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="ImageDiffLauncherDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\..\win\DLLLauncher\DLLLauncherMain.cpp" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherCommon.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherCommon.props
new file mode 100644
index 0000000..315f23f
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherCommon.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <TargetName>ImageDiff</TargetName>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <PreprocessorDefinitions>USE_CONSOLE_ENTRY_POINT;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <Link>

+      <AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <OutputFile>$(OutDir)ImageDiff.exe</OutputFile>

+      <SubSystem>Console</SubSystem>

+      <ProgramDatabaseFile>$(TargetDir)$(TargetName)Launcher.pdb</ProgramDatabaseFile>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherDebug.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherDebug.props
new file mode 100644
index 0000000..7fb6db6
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherDebug.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="ImageDiffLauncherCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherProduction.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherProduction.props
new file mode 100644
index 0000000..ae18695
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherProduction.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="ImageDiffLauncherCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherRelease.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherRelease.props
new file mode 100644
index 0000000..3209436
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffLauncherRelease.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="ImageDiffLauncherCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPostBuild.cmd b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPostBuild.cmd
new file mode 100644
index 0000000..26707ca
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPostBuild.cmd
@@ -0,0 +1 @@
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" del "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPreBuild.cmd b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPreBuild.cmd
new file mode 100644
index 0000000..a770776
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffPreBuild.cmd
@@ -0,0 +1,6 @@
+%SystemDrive%\cygwin\bin\which.exe bash
+if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH%
+cmd /c
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" grep XX%PROJECTNAME%XX "%CONFIGURATIONBUILDDIR%\buildfailed"
+if errorlevel 1 exit 1
+echo XX%PROJECTNAME%XX > "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffProduction.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffProduction.props
new file mode 100644
index 0000000..d9296c8
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffProduction.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="ImageDiffCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffRelease.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffRelease.props
new file mode 100644
index 0000000..f1be547
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffRelease.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="ImageDiffCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffReleaseWinCairo.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffReleaseWinCairo.props
new file mode 100644
index 0000000..b0fd860
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/ImageDiff/ImageDiffReleaseWinCairo.props
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\WinCairo.props" />

+    <Import Project="ImageDiffCommonWinCairo.props" />

+  </ImportGroup>

+</Project>

diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.def b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.def
new file mode 100644
index 0000000..ac41e7e
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.def
@@ -0,0 +1,6 @@
+LIBRARY	"npTestNetscapePlugin"

+

+EXPORTS

+        NP_GetEntryPoints   @1

+        NP_Initialize       @2

+        NP_Shutdown         @3

diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.rc b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.rc
new file mode 100644
index 0000000..c0b38ee
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.rc
@@ -0,0 +1,102 @@
+// Microsoft Visual C++ generated resource script.

+//

+#include "resource.h"

+

+#define APSTUDIO_READONLY_SYMBOLS

+/////////////////////////////////////////////////////////////////////////////

+//

+// Generated from the TEXTINCLUDE 2 resource.

+//

+#include "windows.h"

+

+/////////////////////////////////////////////////////////////////////////////

+#undef APSTUDIO_READONLY_SYMBOLS

+

+/////////////////////////////////////////////////////////////////////////////

+// English (U.S.) resources

+

+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

+#ifdef _WIN32

+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

+#pragma code_page(1252)

+#endif //_WIN32

+

+#ifdef APSTUDIO_INVOKED

+/////////////////////////////////////////////////////////////////////////////

+//

+// TEXTINCLUDE

+//

+

+1 TEXTINCLUDE 

+BEGIN

+    "resource.h\0"

+END

+

+2 TEXTINCLUDE 

+BEGIN

+    "#include ""windows.h""\r\n"

+    "\0"

+END

+

+3 TEXTINCLUDE 

+BEGIN

+    "\r\n"

+    "\0"

+END

+

+#endif    // APSTUDIO_INVOKED

+

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// Version

+//

+

+VS_VERSION_INFO VERSIONINFO

+ FILEVERSION 1,0,0,1

+ PRODUCTVERSION 1,0,0,1

+ FILEFLAGSMASK 0x17L

+#ifdef _DEBUG

+ FILEFLAGS 0x1L

+#else

+ FILEFLAGS 0x0L

+#endif

+ FILEOS 0x4L

+ FILETYPE 0x2L

+ FILESUBTYPE 0x0L

+BEGIN

+    BLOCK "StringFileInfo"

+    BEGIN

+        BLOCK "040904e4"

+        BEGIN

+            VALUE "CompanyName", "Apple Inc."

+            VALUE "FileDescription", "Simple Netscape plug-in that handles test content for WebKit"

+            VALUE "FileExtents", "testnetscape|png"

+            VALUE "FileOpenName", "test netscape content|PNG image"

+            VALUE "LegalCopyright", "Copyright Apple Inc. 2007-2009"

+            VALUE "MIMEType", "application/x-webkit-test-netscape|image/png"

+            VALUE "OriginalFilename", "npTestNetscapePlugin.dll"

+            VALUE "ProductName", "WebKit Test PlugIn"

+        END

+    END

+    BLOCK "VarFileInfo"

+    BEGIN

+        VALUE "Translation", 0x409, 1252

+    END

+END

+

+#endif    // English (U.S.) resources

+/////////////////////////////////////////////////////////////////////////////

+

+

+

+#ifndef APSTUDIO_INVOKED

+/////////////////////////////////////////////////////////////////////////////

+//

+// Generated from the TEXTINCLUDE 3 resource.

+//

+

+

+/////////////////////////////////////////////////////////////////////////////

+#endif    // not APSTUDIO_INVOKED

+

diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj
new file mode 100644
index 0000000..b955aa1
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\TestNetscapePlugIn\main.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\PluginObject.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\PluginTest.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\TestObject.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\DocumentOpenInDestroyStream.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\EvaluateJSAfterRemovingPluginElement.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\FormValue.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetURLNotifyWithURLThatFailsToLoad.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetURLWithJavaScriptURL.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetURLWithJavaScriptURLDestroyingPlugin.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetUserAgentWithNullNPPFromNPPNew.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\LogNPPSetWindow.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPDeallocateCalledBeforeNPShutdown.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPPNewFails.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPPSetWindowCalledDuringDestruction.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPRuntimeCallsWithNullNPP.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPRuntimeObjectFromDestroyedPlugin.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPRuntimeRemoveProperty.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NullNPPGetValuePointer.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PassDifferentNPPStruct.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PluginScriptableNPObjectInvokeDefault.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PluginScriptableObjectOverridesAllProperties.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PrivateBrowsing.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\CallJSThatDestroysPlugin.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\DrawsGradient.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\DumpWindowRect.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\GetValueNetscapeWindow.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\NPNInvalidateRectInvalidatesWindow.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\WindowGeometryInitializedBeforeSetWindow.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\WindowlessPaintRectCoordinates.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\WindowRegionIsSetToClipRect.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\win\WindowedPluginTest.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\win\WindowGeometryTest.cpp" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\..\TestNetscapePlugIn\PluginObject.h" />

+    <ClInclude Include="..\..\TestNetscapePlugIn\PluginTest.h" />

+    <ClInclude Include="..\..\TestNetscapePlugIn\TestObject.h" />

+    <ClInclude Include="..\..\TestNetscapePlugIn\win\WindowedPluginTest.h" />

+    <ClInclude Include="..\..\TestNetscapePlugIn\win\WindowGeometryTest.h" />

+    <ClInclude Include="resource.h" />

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="TestNetscapePlugin.def" />

+    <None Include="TestNetscapePluginPostBuild.cmd" />

+    <None Include="TestNetscapePluginPreBuild.cmd" />

+  </ItemGroup>

+  <ItemGroup>

+    <ResourceCompile Include="TestNetscapePlugin.rc" />

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{C0737398-3565-439E-A2B8-AB2BE4D5430C}</ProjectGuid>

+    <RootNamespace>TestNetscapePlugin</RootNamespace>

+    <Keyword>Win32Proj</Keyword>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestNetscapePluginRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestNetscapePluginRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestNetscapePluginProduction.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestNetscapePluginDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestNetscapePluginDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestNetscapePluginDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+  </ItemDefinitionGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters
new file mode 100644
index 0000000..45797e2
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <ClCompile Include="..\..\TestNetscapePlugIn\main.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\PluginObject.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\PluginTest.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\TestObject.cpp" />

+    <ClCompile Include="..\..\TestNetscapePlugIn\win\WindowedPluginTest.cpp">

+      <Filter>win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\win\WindowGeometryTest.cpp">

+      <Filter>win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\DocumentOpenInDestroyStream.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\EvaluateJSAfterRemovingPluginElement.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\FormValue.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetURLNotifyWithURLThatFailsToLoad.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetURLWithJavaScriptURL.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetURLWithJavaScriptURLDestroyingPlugin.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\GetUserAgentWithNullNPPFromNPPNew.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\LogNPPSetWindow.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPDeallocateCalledBeforeNPShutdown.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPPNewFails.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPPSetWindowCalledDuringDestruction.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPRuntimeCallsWithNullNPP.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPRuntimeObjectFromDestroyedPlugin.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NPRuntimeRemoveProperty.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\NullNPPGetValuePointer.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PassDifferentNPPStruct.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PluginScriptableNPObjectInvokeDefault.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PluginScriptableObjectOverridesAllProperties.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PrivateBrowsing.cpp">

+      <Filter>Tests</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\CallJSThatDestroysPlugin.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\DrawsGradient.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\DumpWindowRect.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\GetValueNetscapeWindow.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\NPNInvalidateRectInvalidatesWindow.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\WindowGeometryInitializedBeforeSetWindow.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\WindowlessPaintRectCoordinates.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\WindowRegionIsSetToClipRect.cpp">

+      <Filter>Tests\win</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\..\TestNetscapePlugIn\PluginObject.h" />

+    <ClInclude Include="..\..\TestNetscapePlugIn\PluginTest.h" />

+    <ClInclude Include="..\..\TestNetscapePlugIn\TestObject.h" />

+    <ClInclude Include="..\..\TestNetscapePlugIn\win\WindowedPluginTest.h">

+      <Filter>win</Filter>

+    </ClInclude>

+    <ClInclude Include="..\..\TestNetscapePlugIn\win\WindowGeometryTest.h">

+      <Filter>win</Filter>

+    </ClInclude>

+    <ClInclude Include="resource.h">

+      <Filter>Resources</Filter>

+    </ClInclude>

+  </ItemGroup>

+  <ItemGroup>

+    <Filter Include="win">

+      <UniqueIdentifier>{aa1f1b22-247a-4070-93ee-9c1bb139a200}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Resources">

+      <UniqueIdentifier>{a13508d3-bda2-4026-bd33-320d54d4ae5a}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Tests">

+      <UniqueIdentifier>{33b0adeb-c8af-4e7a-b827-3ea7ed8a095b}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Tests\win">

+      <UniqueIdentifier>{62e11b7d-49c8-463f-8897-fcc43d8f314c}</UniqueIdentifier>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="TestNetscapePlugin.def">

+      <Filter>Resources</Filter>

+    </None>

+    <None Include="TestNetscapePluginPostBuild.cmd" />

+    <None Include="TestNetscapePluginPreBuild.cmd" />

+  </ItemGroup>

+  <ItemGroup>

+    <ResourceCompile Include="TestNetscapePlugin.rc">

+      <Filter>Resources</Filter>

+    </ResourceCompile>

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginCommon.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginCommon.props
new file mode 100644
index 0000000..8b2461c
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginCommon.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <TargetName>np$(ProjectName)$(DebugSuffix)</TargetName>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)..\..\TestNetscapePlugIn;$(ProjectDir)..\..\TestNetscapePlugIn\win;$(ConfigurationBuildDir)\Include;$(ConfigurationBuildDir)\Include\private;$(ConfigurationBuildDir)\Include\JavaScriptCore;$(ConfigurationBuildDir)\Include\WebCore\ForwardingHeaders;$(WebKit_Libraries)\include;$(WebKit_Libraries)\include\private;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>snprintf=_snprintf;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <Link>

+      <AdditionalDependencies>Msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <OutputFile>$(OutDir)$(ProjectName)\np$(ProjectName).dll</OutputFile>

+      <ModuleDefinitionFile>TestNetscapePlugin.def</ModuleDefinitionFile>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginDebug.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginDebug.props
new file mode 100644
index 0000000..87aa3fd
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginDebug.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="TestNetscapePluginCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPostBuild.cmd b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPostBuild.cmd
new file mode 100644
index 0000000..26707ca
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPostBuild.cmd
@@ -0,0 +1 @@
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" del "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPreBuild.cmd b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPreBuild.cmd
new file mode 100644
index 0000000..a770776
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginPreBuild.cmd
@@ -0,0 +1,6 @@
+%SystemDrive%\cygwin\bin\which.exe bash
+if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH%
+cmd /c
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" grep XX%PROJECTNAME%XX "%CONFIGURATIONBUILDDIR%\buildfailed"
+if errorlevel 1 exit 1
+echo XX%PROJECTNAME%XX > "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginProduction.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginProduction.props
new file mode 100644
index 0000000..0edbb86
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginProduction.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="TestNetscapePluginCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginRelease.props b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginRelease.props
new file mode 100644
index 0000000..42c8d7d
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePluginRelease.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="TestNetscapePluginCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/resource.h b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/resource.h
new file mode 100644
index 0000000..b0ce340
--- /dev/null
+++ b/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/resource.h
@@ -0,0 +1,14 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by TestNetscapePlugin.rc
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        101
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj b/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj
index f35ebcc..49a9978 100644
--- a/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj
+++ b/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj
@@ -109,6 +109,8 @@
 		A8B91BFF0CF522B4008F91FF /* CheckedMalloc.h in Headers */ = {isa = PBXBuildFile; fileRef = A8B91BF90CF522B4008F91FF /* CheckedMalloc.h */; };
 		A8D79CEA0FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A8D79CE80FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.h */; };
 		A8D79CEB0FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A8D79CE90FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m */; };
+		AA5A15EF16E15CD000F7C561 /* AccessibilityControllerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = AA5A15ED16E15CD000F7C561 /* AccessibilityControllerIOS.mm */; };
+		AA5A15F016E15CD000F7C561 /* AccessibilityUIElementIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = AA5A15EE16E15CD000F7C561 /* AccessibilityUIElementIOS.mm */; };
 		AE8259F308D22463000507AB /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE8257EF08D22389000507AB /* Carbon.framework */; };
 		AE8259F408D22463000507AB /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE8257EF08D22389000507AB /* Carbon.framework */; };
 		B5A752A208AF5D1F00138E45 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5A752A108AF5D1F00138E45 /* QuartzCore.framework */; };
@@ -222,8 +224,8 @@
 			dstPath = DumpRenderTree.resources;
 			dstSubfolderSpec = 7;
 			files = (
-				8CCDA82A151A72D10003F937 /* SampleFont.sfont in Copy Font Files */,
 				5DB9AC970F722C3600684641 /* AHEM____.TTF in Copy Font Files */,
+				8CCDA82A151A72D10003F937 /* SampleFont.sfont in Copy Font Files */,
 				5DB9AC980F722C3600684641 /* WebKitWeightWatcher100.ttf in Copy Font Files */,
 				5DB9AC990F722C3600684641 /* WebKitWeightWatcher200.ttf in Copy Font Files */,
 				5DB9AC9A0F722C3600684641 /* WebKitWeightWatcher300.ttf in Copy Font Files */,
@@ -319,6 +321,8 @@
 		A8B91BF90CF522B4008F91FF /* CheckedMalloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CheckedMalloc.h; path = mac/CheckedMalloc.h; sourceTree = "<group>"; };
 		A8D79CE80FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DumpRenderTreeFileDraggingSource.h; sourceTree = "<group>"; };
 		A8D79CE90FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DumpRenderTreeFileDraggingSource.m; sourceTree = "<group>"; };
+		AA5A15ED16E15CD000F7C561 /* AccessibilityControllerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityControllerIOS.mm; path = ios/AccessibilityControllerIOS.mm; sourceTree = "<group>"; };
+		AA5A15EE16E15CD000F7C561 /* AccessibilityUIElementIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityUIElementIOS.mm; path = ios/AccessibilityUIElementIOS.mm; sourceTree = "<group>"; };
 		AA7F10C20CB3C1030003BDC9 /* AHEM____.TTF */ = {isa = PBXFileReference; lastKnownFileType = file; name = "AHEM____.TTF"; path = "qt/fonts/AHEM____.TTF"; sourceTree = "<group>"; };
 		AE8257EF08D22389000507AB /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
 		B5A7526708AF4A4A00138E45 /* ImageDiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ImageDiff; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -396,8 +400,8 @@
 				141BF439096A455900E0753C /* Carbon.framework in Frameworks */,
 				141BF436096A455900E0753C /* Cocoa.framework in Frameworks */,
 				141BF438096A455900E0753C /* JavaScriptCore.framework in Frameworks */,
-				141BF435096A455900E0753C /* WebKit.framework in Frameworks */,
 				0F37A4AA11E6629100275F54 /* QuartzCore.framework in Frameworks */,
+				141BF435096A455900E0753C /* WebKit.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -415,10 +419,10 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				5DE8AE4413A2C15900D6A37D /* libWebCoreTestSupport.dylib in Frameworks */,
 				AE8259F308D22463000507AB /* Carbon.framework in Frameworks */,
 				A84F608A08B136DA00E9745F /* Cocoa.framework in Frameworks */,
 				A817090408B164D300CCB9FB /* JavaScriptCore.framework in Frameworks */,
+				5DE8AE4413A2C15900D6A37D /* libWebCoreTestSupport.dylib in Frameworks */,
 				23BCB8900EA57623003C6289 /* OpenGL.framework in Frameworks */,
 				9340995108540CAE007F3BC8 /* WebKit.framework in Frameworks */,
 			);
@@ -482,8 +486,8 @@
 				141BF448096A45C800E0753C /* Info.plist */,
 				1AC6C77F0D07589B00CD3161 /* main.cpp */,
 				1AC6C7800D07589B00CD3161 /* PluginObject.cpp */,
-				0F37A4A611E6628700275F54 /* PluginObjectMac.mm */,
 				141BF447096A45C800E0753C /* PluginObject.h */,
+				0F37A4A611E6628700275F54 /* PluginObjectMac.mm */,
 				1A215A7F11F2609C008AD0F5 /* PluginTest.cpp */,
 				1A215A8011F2609C008AD0F5 /* PluginTest.h */,
 				1AC6C7810D07589B00CD3161 /* TestObject.cpp */,
@@ -495,8 +499,10 @@
 		1422A2690AF6F45200E1A883 /* Controllers */ = {
 			isa = PBXGroup;
 			children = (
+				BC0E26140E2DA4C6001B6BC3 /* AccessibilityCommonMac.mm */,
 				BCD08B390E1057EF00A7D0C1 /* AccessibilityController.cpp */,
 				BCD08A580E10496B00A7D0C1 /* AccessibilityController.h */,
+				AA5A15ED16E15CD000F7C561 /* AccessibilityControllerIOS.mm */,
 				BCD08B700E1059D200A7D0C1 /* AccessibilityControllerMac.mm */,
 				80045AEB147718E7008290A8 /* AccessibilityNotificationHandler.h */,
 				80045AEC147718E7008290A8 /* AccessibilityNotificationHandler.mm */,
@@ -505,9 +511,8 @@
 				29CFBA2D12273A1000BC30C0 /* AccessibilityTextMarkerMac.mm */,
 				BC0E24DF0E2D9451001B6BC2 /* AccessibilityUIElement.cpp */,
 				BC0E24DE0E2D9451001B6BC2 /* AccessibilityUIElement.h */,
+				AA5A15EE16E15CD000F7C561 /* AccessibilityUIElementIOS.mm */,
 				BC0E26140E2DA4C6001B6BC2 /* AccessibilityUIElementMac.mm */,
-				BC0E26140E2DA4C6001B6BC3 /* AccessibilityCommonMac.mm */,
-				BC0E26140E2DA4C6001B6BC3 /* AccessibilityCommonMac.mm */,
 				BCA18B360C9B021900114369 /* AppleScriptController.h */,
 				BCA18B370C9B021900114369 /* AppleScriptController.m */,
 				BCA18B6B0C9B08DB00114369 /* EventSendingController.h */,
@@ -515,9 +520,6 @@
 				BCF6C64F0C98E9C000AC063E /* GCController.cpp */,
 				14770FE00A22ADF7009342EE /* GCController.h */,
 				BCA18B210C9B014B00114369 /* GCControllerMac.mm */,
-				BC0131D80C9772010087317D /* TestRunner.cpp */,
-				BC0131D90C9772010087317D /* TestRunner.h */,
-				BCA18B220C9B014B00114369 /* TestRunnerMac.mm */,
 				E1B7808511AF1643007E1BC2 /* MockGeolocationProvider.h */,
 				E1B7808711AF1669007E1BC2 /* MockGeolocationProvider.mm */,
 				31117B3A15D9A56A00163BC8 /* MockWebNotificationProvider.h */,
@@ -526,6 +528,9 @@
 				BCA18B6E0C9B08DB00114369 /* NavigationController.m */,
 				BCA18B2F0C9B01B400114369 /* ObjCController.h */,
 				BCA18B300C9B01B400114369 /* ObjCController.m */,
+				BC0131D80C9772010087317D /* TestRunner.cpp */,
+				BC0131D90C9772010087317D /* TestRunner.h */,
+				BCA18B220C9B014B00114369 /* TestRunnerMac.mm */,
 				BCA18B3A0C9B024900114369 /* TextInputController.h */,
 				BCA18B480C9B02C400114369 /* TextInputController.m */,
 			);
@@ -546,10 +551,10 @@
 				BCA18B5C0C9B08C200114369 /* PolicyDelegate.mm */,
 				BCA18B5D0C9B08C200114369 /* ResourceLoadDelegate.h */,
 				BCA18B5E0C9B08C200114369 /* ResourceLoadDelegate.mm */,
-				BCA18B5F0C9B08C200114369 /* UIDelegate.h */,
-				BCA18B600C9B08C200114369 /* UIDelegate.mm */,
 				3A5626C0131C8B17002BE6D9 /* StorageTrackerDelegate.h */,
 				3A5626C1131C8B17002BE6D9 /* StorageTrackerDelegate.mm */,
+				BCA18B5F0C9B08C200114369 /* UIDelegate.h */,
+				BCA18B600C9B08C200114369 /* UIDelegate.mm */,
 			);
 			name = Delegates;
 			sourceTree = "<group>";
@@ -587,9 +592,9 @@
 		1A31EB3613466AC100017372 /* mac */ = {
 			isa = PBXGroup;
 			children = (
+				1A66C34F14576A920099A115 /* ContentsScaleFactor.cpp */,
 				1A31EB3713466AC100017372 /* ConvertPoint.cpp */,
 				1A14C8A31406DE0400B254F7 /* SupportsCarbonEventModel.cpp */,
-				1A66C34F14576A920099A115 /* ContentsScaleFactor.cpp */,
 			);
 			path = mac;
 			sourceTree = "<group>";
@@ -615,8 +620,8 @@
 			children = (
 				9340995408540CAF007F3BC8 /* DumpRenderTree */,
 				B5A7526708AF4A4A00138E45 /* ImageDiff */,
-				141BF233096A44CF00E0753C /* TestNetscapePlugIn.plugin */,
 				2D403F19150871F9005358D2 /* LayoutTestHelper */,
+				141BF233096A44CF00E0753C /* TestNetscapePlugIn.plugin */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -625,6 +630,7 @@
 			isa = PBXGroup;
 			children = (
 				AA7F10C20CB3C1030003BDC9 /* AHEM____.TTF */,
+				8CCDA81F151A56550003F937 /* SampleFont.sfont */,
 				375F09710DAC3CB600C8B4E5 /* WebKitWeightWatcher100.ttf */,
 				375F09720DAC3CB600C8B4E5 /* WebKitWeightWatcher200.ttf */,
 				375F09730DAC3CB600C8B4E5 /* WebKitWeightWatcher300.ttf */,
@@ -634,7 +640,6 @@
 				375F09770DAC3CB600C8B4E5 /* WebKitWeightWatcher700.ttf */,
 				375F09780DAC3CB600C8B4E5 /* WebKitWeightWatcher800.ttf */,
 				375F09790DAC3CB600C8B4E5 /* WebKitWeightWatcher900.ttf */,
-				8CCDA81F151A56550003F937 /* SampleFont.sfont */,
 			);
 			name = Resources;
 			sourceTree = "<group>";
@@ -642,11 +647,11 @@
 		A803FF6409CAACC1009B2A37 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				5DE8AE4313A2C15800D6A37D /* libWebCoreTestSupport.dylib */,
 				BCB284B20CFA82CB007E533E /* ApplicationServices.framework */,
 				AE8257EF08D22389000507AB /* Carbon.framework */,
 				A84F608908B136DA00E9745F /* Cocoa.framework */,
 				A817090308B164D300CCB9FB /* JavaScriptCore.framework */,
+				5DE8AE4313A2C15800D6A37D /* libWebCoreTestSupport.dylib */,
 				23BCB88F0EA57623003C6289 /* OpenGL.framework */,
 				B5A752A108AF5D1F00138E45 /* QuartzCore.framework */,
 				9335435F03D75502008635CE /* WebKit.framework */,
@@ -712,8 +717,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				141BF453096A45EB00E0753C /* PluginObject.h in Headers */,
-				1A8F02E80BB9B4EC008CFA34 /* TestObject.h in Headers */,
 				1A215A8211F2609C008AD0F5 /* PluginTest.h in Headers */,
+				1A8F02E80BB9B4EC008CFA34 /* TestObject.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -721,6 +726,8 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				80045AED147718E7008290A8 /* AccessibilityNotificationHandler.h in Headers */,
+				29CFBA10122736E600BC30C0 /* AccessibilityTextMarker.h in Headers */,
 				BC0E24E00E2D9451001B6BC2 /* AccessibilityUIElement.h in Headers */,
 				BCA18B380C9B021900114369 /* AppleScriptController.h in Headers */,
 				A8B91BFF0CF522B4008F91FF /* CheckedMalloc.h in Headers */,
@@ -735,8 +742,10 @@
 				BCA18B6F0C9B08DB00114369 /* EventSendingController.h in Headers */,
 				BCA18B630C9B08C200114369 /* FrameLoadDelegate.h in Headers */,
 				14770FE20A22ADF7009342EE /* GCController.h in Headers */,
+				5185F6B310714E12007AA393 /* HistoryDelegate.h in Headers */,
 				BC47412A0D038A4C0072B006 /* JavaScriptThreading.h in Headers */,
-				BC0131DB0C9772010087317D /* TestRunner.h in Headers */,
+				E1B7816711AF31C3007E1BC2 /* MockGeolocationProvider.h in Headers */,
+				31117B3C15D9A56A00163BC8 /* MockWebNotificationProvider.h in Headers */,
 				BCA18B710C9B08DB00114369 /* NavigationController.h in Headers */,
 				BCA18B310C9B01B400114369 /* ObjCController.h in Headers */,
 				BCA18B7D0C9B08F100114369 /* ObjCPlugin.h in Headers */,
@@ -745,18 +754,14 @@
 				BCB284D00CFA83CC007E533E /* PixelDumpSupportCG.h in Headers */,
 				BCA18B650C9B08C200114369 /* PolicyDelegate.h in Headers */,
 				BCA18B670C9B08C200114369 /* ResourceLoadDelegate.h in Headers */,
+				3A5626CC131CA036002BE6D9 /* StorageTrackerDelegate.h in Headers */,
+				BC0131DB0C9772010087317D /* TestRunner.h in Headers */,
 				BCA18B3C0C9B024900114369 /* TextInputController.h in Headers */,
 				BCA18B690C9B08C200114369 /* UIDelegate.h in Headers */,
 				4437730F125CBC4D00AAE02C /* WebArchiveDumpSupport.h in Headers */,
+				417DAA1D137B3E24007C57FB /* WebCoreTestSupport.h in Headers */,
 				BC9D90250C97472E0099A4A3 /* WorkQueue.h in Headers */,
 				BC9D90260C97472E0099A4A3 /* WorkQueueItem.h in Headers */,
-				5185F6B310714E12007AA393 /* HistoryDelegate.h in Headers */,
-				E1B7816711AF31C3007E1BC2 /* MockGeolocationProvider.h in Headers */,
-				29CFBA10122736E600BC30C0 /* AccessibilityTextMarker.h in Headers */,
-				3A5626CC131CA036002BE6D9 /* StorageTrackerDelegate.h in Headers */,
-				417DAA1D137B3E24007C57FB /* WebCoreTestSupport.h in Headers */,
-				80045AED147718E7008290A8 /* AccessibilityNotificationHandler.h in Headers */,
-				31117B3C15D9A56A00163BC8 /* MockWebNotificationProvider.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -865,6 +870,8 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+			};
 			buildConfigurationList = 149C29C308902C6D008A9EFC /* Build configuration list for PBXProject "DumpRenderTree" */;
 			compatibilityVersion = "Xcode 2.4";
 			developmentRegion = English;
@@ -905,36 +912,36 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1AC6C8490D07638600CD3161 /* main.cpp in Sources */,
-				1AC6C84A0D07638600CD3161 /* PluginObject.cpp in Sources */,
-				1AC6C84B0D07638600CD3161 /* TestObject.cpp in Sources */,
-				0F37A4A711E6628700275F54 /* PluginObjectMac.mm in Sources */,
-				1A215A8111F2609C008AD0F5 /* PluginTest.cpp in Sources */,
-				1A215BE711F27658008AD0F5 /* DocumentOpenInDestroyStream.cpp in Sources */,
-				1AD9D2FE12028409001A70D1 /* PluginScriptableNPObjectInvokeDefault.cpp in Sources */,
-				1AC77DCF120605B6005C19EF /* NPRuntimeRemoveProperty.cpp in Sources */,
-				1A24BAA9120734EE00FBB059 /* NPRuntimeObjectFromDestroyedPlugin.cpp in Sources */,
-				C06F9ABC1267A7060058E1F6 /* PassDifferentNPPStruct.cpp in Sources */,
-				C0EC3C9C12787F0500939164 /* NullNPPGetValuePointer.cpp in Sources */,
-				C0E720751281C828004EF533 /* EvaluateJSAfterRemovingPluginElement.cpp in Sources */,
-				1AD4CB2212A6D1350027A7AF /* GetUserAgentWithNullNPPFromNPPNew.cpp in Sources */,
-				1A3E28AA1311D73B00501349 /* GetURLWithJavaScriptURLDestroyingPlugin.cpp in Sources */,
-				1ACF898D132EF41C00E915D4 /* NPDeallocateCalledBeforeNPShutdown.cpp in Sources */,
-				1A31EB3813466AC100017372 /* ConvertPoint.cpp in Sources */,
-				C031182B134E4A2B00919757 /* NPPSetWindowCalledDuringDestruction.cpp in Sources */,
-				1A5CC1F5137DD2EC00A5D7E7 /* GetURLWithJavaScriptURL.cpp in Sources */,
-				1AFF66BC137DEFD200791696 /* GetURLNotifyWithURLThatFailsToLoad.cpp in Sources */,
-				4AD6A11413C8124000EA9737 /* FormValue.cpp in Sources */,
-				1A14C8A51406DE0400B254F7 /* SupportsCarbonEventModel.cpp in Sources */,
-				1A1E4298141141C400388758 /* PrivateBrowsing.cpp in Sources */,
 				1A66C35114576A920099A115 /* ContentsScaleFactor.cpp in Sources */,
-				515F429C15C07872007C8F90 /* PluginScriptableObjectOverridesAllProperties.cpp in Sources */,
-				5106803E15CC7B10001A8A23 /* SlowNPPNew.cpp in Sources */,
+				1A31EB3813466AC100017372 /* ConvertPoint.cpp in Sources */,
+				1A215BE711F27658008AD0F5 /* DocumentOpenInDestroyStream.cpp in Sources */,
+				C0E720751281C828004EF533 /* EvaluateJSAfterRemovingPluginElement.cpp in Sources */,
 				51CACBD815D96FD000EB53A2 /* EvaluateJSWithinNPP_New.cpp in Sources */,
-				515C0CD015EE785700F5A613 /* LogNPPSetWindow.cpp in Sources */,
-				5113DE6715F6CBE5005EC8B3 /* NPPNewFails.cpp in Sources */,
+				4AD6A11413C8124000EA9737 /* FormValue.cpp in Sources */,
+				1AFF66BC137DEFD200791696 /* GetURLNotifyWithURLThatFailsToLoad.cpp in Sources */,
+				1A5CC1F5137DD2EC00A5D7E7 /* GetURLWithJavaScriptURL.cpp in Sources */,
+				1A3E28AA1311D73B00501349 /* GetURLWithJavaScriptURLDestroyingPlugin.cpp in Sources */,
+				1AD4CB2212A6D1350027A7AF /* GetUserAgentWithNullNPPFromNPPNew.cpp in Sources */,
 				51134C9916014FDC001AA513 /* InvokeDestroysPluginWithinNPP_New.cpp in Sources */,
+				515C0CD015EE785700F5A613 /* LogNPPSetWindow.cpp in Sources */,
+				1AC6C8490D07638600CD3161 /* main.cpp in Sources */,
+				1ACF898D132EF41C00E915D4 /* NPDeallocateCalledBeforeNPShutdown.cpp in Sources */,
+				5113DE6715F6CBE5005EC8B3 /* NPPNewFails.cpp in Sources */,
+				C031182B134E4A2B00919757 /* NPPSetWindowCalledDuringDestruction.cpp in Sources */,
 				1AD8683F163B2FD000A28583 /* NPRuntimeCallsWithNullNPP.cpp in Sources */,
+				1A24BAA9120734EE00FBB059 /* NPRuntimeObjectFromDestroyedPlugin.cpp in Sources */,
+				1AC77DCF120605B6005C19EF /* NPRuntimeRemoveProperty.cpp in Sources */,
+				C0EC3C9C12787F0500939164 /* NullNPPGetValuePointer.cpp in Sources */,
+				C06F9ABC1267A7060058E1F6 /* PassDifferentNPPStruct.cpp in Sources */,
+				1AC6C84A0D07638600CD3161 /* PluginObject.cpp in Sources */,
+				0F37A4A711E6628700275F54 /* PluginObjectMac.mm in Sources */,
+				1AD9D2FE12028409001A70D1 /* PluginScriptableNPObjectInvokeDefault.cpp in Sources */,
+				515F429C15C07872007C8F90 /* PluginScriptableObjectOverridesAllProperties.cpp in Sources */,
+				1A215A8111F2609C008AD0F5 /* PluginTest.cpp in Sources */,
+				1A1E4298141141C400388758 /* PrivateBrowsing.cpp in Sources */,
+				5106803E15CC7B10001A8A23 /* SlowNPPNew.cpp in Sources */,
+				1A14C8A51406DE0400B254F7 /* SupportsCarbonEventModel.cpp in Sources */,
+				1AC6C84B0D07638600CD3161 /* TestObject.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -950,15 +957,19 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				BC0E26150E2DA4C6001B6BC3 /* AccessibilityCommonMac.mm in Sources */,
 				BCD08B3A0E1057EF00A7D0C1 /* AccessibilityController.cpp in Sources */,
 				BCD08B710E1059D200A7D0C1 /* AccessibilityControllerMac.mm in Sources */,
+				80045AEE147718E7008290A8 /* AccessibilityNotificationHandler.mm in Sources */,
+				29CFBA11122736E600BC30C0 /* AccessibilityTextMarker.cpp in Sources */,
+				29CFBA2E12273A1000BC30C0 /* AccessibilityTextMarkerMac.mm in Sources */,
 				BC0E24E10E2D9451001B6BC2 /* AccessibilityUIElement.cpp in Sources */,
 				BC0E26150E2DA4C6001B6BC2 /* AccessibilityUIElementMac.mm in Sources */,
-				BC0E26150E2DA4C6001B6BC3 /* AccessibilityCommonMac.mm in Sources */,
 				BCA18B390C9B021900114369 /* AppleScriptController.m in Sources */,
 				A8B91BFD0CF522B4008F91FF /* CheckedMalloc.cpp in Sources */,
 				53CBB832134E42F3001CE6A4 /* CyclicRedundancyCheck.cpp in Sources */,
 				BCA18C470C9B5B9400114369 /* DumpRenderTree.mm in Sources */,
+				9830F31F15C81181005AB206 /* DumpRenderTreeCommon.cpp in Sources */,
 				BCA18B7B0C9B08F100114369 /* DumpRenderTreeDraggingInfo.mm in Sources */,
 				A8D79CEB0FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m in Sources */,
 				A8B91ADA0CF3B32F008F91FF /* DumpRenderTreePasteboard.m in Sources */,
@@ -968,9 +979,11 @@
 				BCA18B640C9B08C200114369 /* FrameLoadDelegate.mm in Sources */,
 				BCF6C6500C98E9C000AC063E /* GCController.cpp in Sources */,
 				BCA18B230C9B014B00114369 /* GCControllerMac.mm in Sources */,
+				AA5A15EF16E15CD000F7C561 /* AccessibilityControllerIOS.mm in Sources */,
+				5185F6B210714E07007AA393 /* HistoryDelegate.mm in Sources */,
 				BC4741410D038A570072B006 /* JavaScriptThreadingPthreads.cpp in Sources */,
-				BC0131DA0C9772010087317D /* TestRunner.cpp in Sources */,
-				BCA18B240C9B014B00114369 /* TestRunnerMac.mm in Sources */,
+				E1B7816511AF31B7007E1BC2 /* MockGeolocationProvider.mm in Sources */,
+				31117B3D15D9A56A00163BC8 /* MockWebNotificationProvider.mm in Sources */,
 				BCA18B720C9B08DB00114369 /* NavigationController.m in Sources */,
 				BCA18B320C9B01B400114369 /* ObjCController.m in Sources */,
 				BCA18B7E0C9B08F100114369 /* ObjCPlugin.m in Sources */,
@@ -979,21 +992,17 @@
 				BCB284CD0CFA83C8007E533E /* PixelDumpSupportCG.cpp in Sources */,
 				BCB284D60CFA83D1007E533E /* PixelDumpSupportMac.mm in Sources */,
 				BCA18B660C9B08C200114369 /* PolicyDelegate.mm in Sources */,
+				AA5A15F016E15CD000F7C561 /* AccessibilityUIElementIOS.mm in Sources */,
 				BCA18B680C9B08C200114369 /* ResourceLoadDelegate.mm in Sources */,
+				3A5626CB131CA02A002BE6D9 /* StorageTrackerDelegate.mm in Sources */,
+				BC0131DA0C9772010087317D /* TestRunner.cpp in Sources */,
+				BCA18B240C9B014B00114369 /* TestRunnerMac.mm in Sources */,
 				BCA18B490C9B02C400114369 /* TextInputController.m in Sources */,
 				BCA18B6A0C9B08C200114369 /* UIDelegate.mm in Sources */,
 				4437730E125CBC3600AAE02C /* WebArchiveDumpSupport.cpp in Sources */,
 				440590711268453800CFD48D /* WebArchiveDumpSupportMac.mm in Sources */,
 				BC9D90240C97472E0099A4A3 /* WorkQueue.cpp in Sources */,
 				BCA18B260C9B015C00114369 /* WorkQueueItemMac.mm in Sources */,
-				5185F6B210714E07007AA393 /* HistoryDelegate.mm in Sources */,
-				E1B7816511AF31B7007E1BC2 /* MockGeolocationProvider.mm in Sources */,
-				29CFBA11122736E600BC30C0 /* AccessibilityTextMarker.cpp in Sources */,
-				29CFBA2E12273A1000BC30C0 /* AccessibilityTextMarkerMac.mm in Sources */,
-				3A5626CB131CA02A002BE6D9 /* StorageTrackerDelegate.mm in Sources */,
-				80045AEE147718E7008290A8 /* AccessibilityNotificationHandler.mm in Sources */,
-				9830F31F15C81181005AB206 /* DumpRenderTreeCommon.cpp in Sources */,
-				31117B3D15D9A56A00163BC8 /* MockWebNotificationProvider.mm in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Tools/DumpRenderTree/DumpRenderTreeCommon.cpp b/Tools/DumpRenderTree/DumpRenderTreeCommon.cpp
index 48d8322..3cb97eb 100644
--- a/Tools/DumpRenderTree/DumpRenderTreeCommon.cpp
+++ b/Tools/DumpRenderTree/DumpRenderTreeCommon.cpp
@@ -66,17 +66,20 @@
     if (!tokenizer.hasNext())
         die(inputLine);
 
-    result.pathOrURL = tokenizer.next();
-    if (!tokenizer.hasNext())
-        return result;
-
     std::string arg = tokenizer.next();
-    if (arg != std::string("-p") && arg != std::string("--pixel-test"))
-        die(inputLine);
-    result.shouldDumpPixels = true;
-
-    if (tokenizer.hasNext())
-        result.expectedPixelHash = tokenizer.next();
+    result.pathOrURL = arg;
+    while (tokenizer.hasNext()) {
+        arg = tokenizer.next();
+        if (arg == std::string("--timeout")) {
+            std::string timeoutToken = tokenizer.next();
+            result.timeout = atoi(timeoutToken.c_str());
+        } else if (arg == std::string("-p") || arg == std::string("--pixel-test")) {
+            result.shouldDumpPixels = true;
+            if (tokenizer.hasNext())
+                result.expectedPixelHash = tokenizer.next();
+        } else
+            die(inputLine);
+    }
 
     return result;
 }
diff --git a/Tools/DumpRenderTree/Makefile b/Tools/DumpRenderTree/Makefile
index 1f1dbbc..344ef48 100644
--- a/Tools/DumpRenderTree/Makefile
+++ b/Tools/DumpRenderTree/Makefile
@@ -1,2 +1,9 @@
 SCRIPTS_PATH = ../Scripts
+
+ifneq (,$(findstring iphoneos,$(SDKROOT)))
+	OTHER_OPTIONS += -target All-iOS
+else ifneq (,$(findstring iphonesimulator,$(SDKROOT)))
+	OTHER_OPTIONS += -target All-iOS
+endif
+
 include ../../Makefile.shared
diff --git a/Tools/DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt b/Tools/DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt
index 384b5bf..c180e09 100644
--- a/Tools/DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt
+++ b/Tools/DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt
@@ -1,6 +1,6 @@
-SET(WEBKIT_TESTNETSCAPEPLUGIN_DIR "${TOOLS_DIR}/DumpRenderTree/TestNetscapePlugIn")
+set(WEBKIT_TESTNETSCAPEPLUGIN_DIR "${TOOLS_DIR}/DumpRenderTree/TestNetscapePlugIn")
 
-SET(WebKitTestNetscapePlugin_SOURCES
+set(WebKitTestNetscapePlugin_SOURCES
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/PluginObject.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/PluginTest.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/TestObject.cpp
@@ -13,6 +13,7 @@
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/GetURLWithJavaScriptURL.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/GetURLWithJavaScriptURLDestroyingPlugin.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/GetUserAgentWithNullNPPFromNPPNew.cpp
+    ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/LogNPPSetWindow.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/NPDeallocateCalledBeforeNPShutdown.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/NPPNewFails.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/NPPSetWindowCalledDuringDestruction.cpp
@@ -27,12 +28,12 @@
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/x11/CallInvalidateRectWithNullNPPArgument.cpp
 )
 
-SET(WebKitTestNetscapePlugin_INCLUDE_DIRECTORIES
+set(WebKitTestNetscapePlugin_INCLUDE_DIRECTORIES
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/unix/ForwardingHeaders
     ${WEBCORE_DIR}
 )
 
-INCLUDE_DIRECTORIES(${WebKitTestNetscapePlugin_INCLUDE_DIRECTORIES})
+include_directories(${WebKitTestNetscapePlugin_INCLUDE_DIRECTORIES})
 
-ADD_LIBRARY(TestNetscapePlugin SHARED ${WebKitTestNetscapePlugin_SOURCES})
+add_library(TestNetscapePlugin SHARED ${WebKitTestNetscapePlugin_SOURCES})
diff --git a/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/PassDifferentNPPStruct.cpp b/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/PassDifferentNPPStruct.cpp
index c9af49c..d78a29b 100644
--- a/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/PassDifferentNPPStruct.cpp
+++ b/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/PassDifferentNPPStruct.cpp
@@ -58,9 +58,11 @@
 
         if (error != NPERR_NO_ERROR) {
             log("NPN_GetValue(NPNVprivateModeBool) with a different NPP struct failed with error %d", error);
+            notifyDone();
             return NPERR_GENERIC_ERROR;
         }
         log("NPN_GetValue(NPNVprivateModeBool) with a different NPP struct succeeded");
+        notifyDone();
         return NPERR_NO_ERROR;
     }
 
diff --git a/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/mac/ConvertPoint.cpp b/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/mac/ConvertPoint.cpp
index 0beb7de..1d851ea 100644
--- a/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/mac/ConvertPoint.cpp
+++ b/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/mac/ConvertPoint.cpp
@@ -69,7 +69,7 @@
         return true;
     }
 private:
-    virtual NPError NPP_SetWindow(NPWindow*)
+    NPError NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved)
     {
         if (testConvert())
             executeScript("document.getElementById('result').innerHTML = 'SUCCESS!'");
diff --git a/Tools/DumpRenderTree/TestNetscapePlugIn/win/CallJSThatDestroysPlugin.cpp b/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/win/CallJSThatDestroysPlugin.cpp
similarity index 100%
rename from Tools/DumpRenderTree/TestNetscapePlugIn/win/CallJSThatDestroysPlugin.cpp
rename to Tools/DumpRenderTree/TestNetscapePlugIn/Tests/win/CallJSThatDestroysPlugin.cpp
diff --git a/Tools/DumpRenderTree/TestNetscapePlugIn/main.cpp b/Tools/DumpRenderTree/TestNetscapePlugIn/main.cpp
index 97a4cf3..256acc0 100644
--- a/Tools/DumpRenderTree/TestNetscapePlugIn/main.cpp
+++ b/Tools/DumpRenderTree/TestNetscapePlugIn/main.cpp
@@ -351,6 +351,7 @@
         if (obj->logSetWindow) {
             pluginLog(instance, "NPP_SetWindow: %d %d", (int)window->width, (int)window->height);
             obj->logSetWindow = FALSE;
+            executeScript(obj, "testRunner.notifyDone();");
         }
 
         if (obj->onSetWindow)
diff --git a/Tools/DumpRenderTree/TestNetscapePlugIn/win/TestNetscapePlugin.vcproj b/Tools/DumpRenderTree/TestNetscapePlugIn/win/TestNetscapePlugin.vcproj
index d04acff..7908dee 100644
--- a/Tools/DumpRenderTree/TestNetscapePlugIn/win/TestNetscapePlugin.vcproj
+++ b/Tools/DumpRenderTree/TestNetscapePlugIn/win/TestNetscapePlugin.vcproj
@@ -390,10 +390,6 @@
 			Name="Tests"
 			>
 			<File
-				RelativePath=".\CallJSThatDestroysPlugin.cpp"
-				>
-			</File>
-			<File
 				RelativePath="..\Tests\DocumentOpenInDestroyStream.cpp"
 				>
 			</File>
@@ -436,7 +432,7 @@
 			<File
 				RelativePath="..\Tests\NPRuntimeCallsWithNullNPP.cpp"
 				>
-			</File>            
+			</File>
 			<File
 				RelativePath="..\Tests\NPRuntimeObjectFromDestroyedPlugin.cpp"
 				>
@@ -469,6 +465,10 @@
 				Name="win"
 				>
 				<File
+					RelativePath="..\Tests\win\CallJSThatDestroysPlugin.cpp"
+					>
+				</File>
+				<File
 					RelativePath="..\Tests\win\DrawsGradient.cpp"
 					>
 				</File>
diff --git a/Tools/DumpRenderTree/TestRunner.cpp b/Tools/DumpRenderTree/TestRunner.cpp
index fe28a29..d600452 100644
--- a/Tools/DumpRenderTree/TestRunner.cpp
+++ b/Tools/DumpRenderTree/TestRunner.cpp
@@ -548,15 +548,6 @@
     return JSValueMakeString(context, decodedHostName.get());
 }
 
-static JSValueRef disableImageLoadingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    // Has mac implementation, needs windows implementation
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->disableImageLoading();
-    
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef dispatchPendingLoadRequestsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     // Has mac implementation, needs windows implementation
@@ -689,16 +680,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef computedStyleIncludingVisitedInfoCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount != 1)
-        return JSValueMakeUndefined(context);
-    
-    // Has mac implementation
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    return controller->computedStyleIncludingVisitedInfo(context, arguments[0]);
-}
-
 static JSValueRef notifyDoneCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     // Has mac & windows implementation
@@ -875,7 +856,7 @@
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
 
     double size = JSValueToNumber(context, arguments[0], NULL);
-    if (!isnan(size))
+    if (!std::isnan(size))
         controller->setAppCacheMaximumSize(static_cast<unsigned long long>(size));
         
     return JSValueMakeUndefined(context);
@@ -890,7 +871,7 @@
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
 
     double size = JSValueToNumber(context, arguments[0], NULL);
-    if (!isnan(size))
+    if (!std::isnan(size))
         controller->setApplicationCacheOriginQuota(static_cast<unsigned long long>(size));
 
     return JSValueMakeUndefined(context);
@@ -948,17 +929,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef setAutofilledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount != 2 || !arguments[0])
-        return JSValueMakeUndefined(context);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->setAutofilled(context, arguments[0], JSValueToBoolean(context, arguments[1]));
-
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef setCacheModelCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     // Has Mac implementation.
@@ -999,7 +969,7 @@
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
 
     double quota = JSValueToNumber(context, arguments[0], NULL);
-    if (!isnan(quota))
+    if (!std::isnan(quota))
         controller->setDatabaseQuota(static_cast<unsigned long long>(quota));
         
     return JSValueMakeUndefined(context);
@@ -1308,18 +1278,6 @@
 }
 
 
-static JSValueRef setFrameFlatteningEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    // Has mac & windows implementation
-    if (argumentCount < 1)
-        return JSValueMakeUndefined(context);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->setFrameFlatteningEnabled(JSValueToBoolean(context, arguments[0]));
-
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef setAllowUniversalAccessFromFileURLsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     // Has mac & windows implementation
@@ -1548,16 +1506,6 @@
     return JSValueMakeUndefined(context);
 }    
 
-static JSValueRef setSmartInsertDeleteEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount < 1)
-        return JSValueMakeUndefined(context);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->setSmartInsertDeleteEnabled(JSValueToBoolean(context, arguments[0]));
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef setAutomaticLinkDetectionEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     if (argumentCount < 1)
@@ -1568,16 +1516,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef setSelectTrailingWhitespaceEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount < 1)
-        return JSValueMakeUndefined(context);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->setSelectTrailingWhitespaceEnabled(JSValueToBoolean(context, arguments[0]));
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef setStopProvisionalFrameLoadsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
@@ -1585,16 +1523,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef setAsynchronousSpellCheckingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount < 1)
-        return JSValueMakeUndefined(context);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->setAsynchronousSpellCheckingEnabled(JSValueToBoolean(context, arguments[0]));
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef showWebInspectorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
@@ -1645,58 +1573,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef elementDoesAutoCompleteForElementWithIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[0], exception));
-    ASSERT(!*exception);
-
-    bool autoCompletes = controller->elementDoesAutoCompleteForElementWithId(elementId.get());
-
-    return JSValueMakeBoolean(context, autoCompletes);
-}
-
-static JSValueRef pauseAnimationAtTimeOnElementWithIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount != 3)
-        return JSValueMakeUndefined(context);
-
-    JSRetainPtr<JSStringRef> animationName(Adopt, JSValueToStringCopy(context, arguments[0], exception));
-    ASSERT(!*exception);
-    double time = JSValueToNumber(context, arguments[1], exception);
-    ASSERT(!*exception);
-    JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[2], exception));
-    ASSERT(!*exception);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    return JSValueMakeBoolean(context, controller->pauseAnimationAtTimeOnElementWithId(animationName.get(), time, elementId.get()));
-}
-
-static JSValueRef pauseTransitionAtTimeOnElementWithIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount != 3)
-        return JSValueMakeUndefined(context);
-
-    JSRetainPtr<JSStringRef> propertyName(Adopt, JSValueToStringCopy(context, arguments[0], exception));
-    ASSERT(!*exception);
-    double time = JSValueToNumber(context, arguments[1], exception);
-    ASSERT(!*exception);
-    JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[2], exception));
-    ASSERT(!*exception);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    return JSValueMakeBoolean(context, controller->pauseTransitionAtTimeOnElementWithId(propertyName.get(), time, elementId.get()));
-}
-
-static JSValueRef numberOfActiveAnimationsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount != 0)
-        return JSValueMakeUndefined(context);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    return JSValueMakeNumber(context, controller->numberOfActiveAnimations());
-}
-
 static JSValueRef waitForPolicyDelegateCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*)
 {
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
@@ -1831,39 +1707,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef sendWebIntentResponseCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    JSRetainPtr<JSStringRef> response;
-    if (argumentCount == 1) {
-        response.adopt(JSValueToStringCopy(context, arguments[0], exception));
-        ASSERT(!*exception);
-    } else
-        response.adopt(JSStringCreateWithUTF8CString(0));
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->sendWebIntentResponse(response.get());
-
-    return JSValueMakeUndefined(context);
-}
-
-static JSValueRef deliverWebIntentCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount < 3)
-        return JSValueMakeUndefined(context);
-
-    JSRetainPtr<JSStringRef> action(Adopt, JSValueToStringCopy(context, arguments[0], exception));
-    ASSERT(!*exception);
-    JSRetainPtr<JSStringRef> type(Adopt, JSValueToStringCopy(context, arguments[1], exception));
-    ASSERT(!*exception);
-    JSRetainPtr<JSStringRef> data(Adopt, JSValueToStringCopy(context, arguments[2], exception));
-    ASSERT(!*exception);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->deliverWebIntent(action.get(), type.get(), data.get());
-
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef abortModalCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
@@ -1871,14 +1714,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef markerTextForListItemCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    if (argumentCount < 1)
-        return JSValueMakeUndefined(context);
-    return JSValueMakeString(context, controller->markerTextForListItem(context, arguments[0]).get());
-}
-
 static JSValueRef authenticateSessionCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     // authenticateSession(url, username, password)
@@ -1982,13 +1817,7 @@
     return JSValueMakeNumber(context, controller->webHistoryItemCount());
 }
 
-static JSValueRef getWorkerThreadCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
-{
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    return JSValueMakeNumber(context, controller->workerThreadCount());
-}
-
-#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(WIN)
+#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(EFL)
 static JSValueRef getPlatformNameCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
 {
     TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
@@ -2028,20 +1857,6 @@
     return JSValueMakeUndefined(context);
 }
 
-static JSValueRef setMinimumTimerIntervalCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
-    if (argumentCount < 1)
-        return JSValueMakeUndefined(context);
-
-    double minimum = JSValueToNumber(context, arguments[0], exception);
-    ASSERT(!*exception);
-
-    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
-    controller->setMinimumTimerInterval(minimum);
-
-    return JSValueMakeUndefined(context);
-}
-
 static JSValueRef setTextDirectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     if (argumentCount == 1) {
@@ -2079,6 +1894,14 @@
     return JSValueMakeUndefined(context);
 }
 
+static JSValueRef closeIdleLocalStorageDatabasesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    TestRunner* controller = static_cast<TestRunner*>(JSObjectGetPrivate(thisObject));
+    controller->closeIdleLocalStorageDatabases();
+
+    return JSValueMakeUndefined(context);
+}
+
 static JSValueRef grantWebNotificationPermissionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     if (argumentCount < 1)
@@ -2144,7 +1967,6 @@
 {
     JSRetainPtr<JSStringRef> testRunnerStr(Adopt, JSStringCreateWithUTF8CString("testRunner"));
     ref();
-    ref();
 
     JSClassRef classRef = getJSClass();
     JSValueRef layoutTestContollerObject = JSObjectMake(context, classRef, this);
@@ -2170,8 +1992,7 @@
     static JSStaticValue staticValues[] = {
         { "globalFlag", getGlobalFlagCallback, setGlobalFlagCallback, kJSPropertyAttributeNone },
         { "webHistoryItemCount", getWebHistoryItemCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "workerThreadCount", getWorkerThreadCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(WIN)
+#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(EFL)
         { "platformName", getPlatformNameCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
 #endif
         { "titleTextDirection", getTitleTextDirectionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2198,10 +2019,7 @@
         { "clearBackForwardList", clearBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "clearPersistentUserStyleSheet", clearPersistentUserStyleSheetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "closeWebInspector", closeWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "computedStyleIncludingVisitedInfo", computedStyleIncludingVisitedInfoCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "decodeHostName", decodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "deliverWebIntent", deliverWebIntentCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "disableImageLoading", disableImageLoadingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "disallowIncreaseForApplicationCacheQuota", disallowIncreaseForApplicationCacheQuotaCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "dispatchPendingLoadRequests", dispatchPendingLoadRequestsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "display", displayCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2225,7 +2043,6 @@
         { "dumpTitleChanges", dumpTitleChangesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "dumpIconChanges", dumpIconChangesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "dumpWillCacheResponse", dumpWillCacheResponseCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "elementDoesAutoCompleteForElementWithId", elementDoesAutoCompleteForElementWithIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "encodeHostName", encodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "evaluateInWebInspector", evaluateInWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "evaluateScriptInIsolatedWorldAndReturnValue", evaluateScriptInIsolatedWorldAndReturnValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2238,13 +2055,9 @@
         { "isCommandEnabled", isCommandEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "keepWebHistory", keepWebHistoryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "numberOfPendingGeolocationPermissionRequests", numberOfPendingGeolocationPermissionRequestsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "markerTextForListItem", markerTextForListItemCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "notifyDone", notifyDoneCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "numberOfActiveAnimations", numberOfActiveAnimationsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "overridePreference", overridePreferenceCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "pathToLocalResource", pathToLocalResourceCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "pauseAnimationAtTimeOnElementWithId", pauseAnimationAtTimeOnElementWithIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "pauseTransitionAtTimeOnElementWithId", pauseTransitionAtTimeOnElementWithIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "printToPDF", dumpAsPDFCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "queueBackNavigation", queueBackNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "queueForwardNavigation", queueForwardNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2257,7 +2070,6 @@
         { "removeOriginAccessWhitelistEntry", removeOriginAccessWhitelistEntryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "repaintSweepHorizontally", repaintSweepHorizontallyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "resetPageVisibility", resetPageVisibilityCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "sendWebIntentResponse", sendWebIntentResponseCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setAcceptsEditing", setAcceptsEditingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setAllowUniversalAccessFromFileURLs", setAllowUniversalAccessFromFileURLsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setAllowFileAccessFromFileURLs", setAllowFileAccessFromFileURLsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2268,7 +2080,6 @@
         { "setAuthenticationPassword", setAuthenticationPasswordCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setAuthenticationUsername", setAuthenticationUsernameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setAuthorAndUserStylesEnabled", setAuthorAndUserStylesEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "setAutofilled", setAutofilledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setCacheModel", setCacheModelCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setCallCloseOnWebViews", setCallCloseOnWebViewsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setCanOpenWindows", setCanOpenWindowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2279,13 +2090,11 @@
         { "setDefersLoading", setDefersLoadingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setUseDeferredFrameLoading", setUseDeferredFrameLoadingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setDomainRelaxationForbiddenForURLScheme", setDomainRelaxationForbiddenForURLSchemeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "setFrameFlatteningEnabled", setFrameFlatteningEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setGeolocationPermission", setGeolocationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setHandlesAuthenticationChallenges", setHandlesAuthenticationChallengesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setIconDatabaseEnabled", setIconDatabaseEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setAutomaticLinkDetectionEnabled", setAutomaticLinkDetectionEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setMainFrameIsFirstResponder", setMainFrameIsFirstResponderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "setMinimumTimerInterval", setMinimumTimerIntervalCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setMockDeviceOrientation", setMockDeviceOrientationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setMockGeolocationPositionUnavailableError", setMockGeolocationPositionUnavailableErrorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setMockGeolocationPosition", setMockGeolocationPositionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2299,9 +2108,7 @@
         { "setPluginsEnabled", setPluginsEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setPrinting", setPrintingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setPrivateBrowsingEnabled", setPrivateBrowsingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "setSelectTrailingWhitespaceEnabled", setSelectTrailingWhitespaceEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setSerializeHTTPLoads", setSerializeHTTPLoadsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "setSmartInsertDeleteEnabled", setSmartInsertDeleteEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setSpatialNavigationEnabled", setSpatialNavigationEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setStopProvisionalFrameLoads", setStopProvisionalFrameLoadsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setTabKeyCyclesThroughElements", setTabKeyCyclesThroughElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2317,7 +2124,6 @@
         { "setWindowIsKey", setWindowIsKeyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setJavaScriptCanAccessClipboard", setJavaScriptCanAccessClipboardCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setXSSAuditorEnabled", setXSSAuditorEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
-        { "setAsynchronousSpellCheckingEnabled", setAsynchronousSpellCheckingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "showWebInspector", showWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "simulateLegacyWebNotificationClick", simulateLegacyWebNotificationClickCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "testOnscreen", testOnscreenCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -2344,6 +2150,7 @@
         { "preciseTime", preciseTimeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setHasCustomFullScreenBehavior", setHasCustomFullScreenBehaviorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "setStorageDatabaseIdleInterval", setStorageDatabaseIdleIntervalCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "closeIdleLocalStorageDatabases", closeIdleLocalStorageDatabasesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "grantWebNotificationPermission", grantWebNotificationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "denyWebNotificationPermission", denyWebNotificationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "removeAllWebNotificationPermissions", removeAllWebNotificationPermissionsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
diff --git a/Tools/DumpRenderTree/TestRunner.h b/Tools/DumpRenderTree/TestRunner.h
index fa76c76..f0a9b6a 100644
--- a/Tools/DumpRenderTree/TestRunner.h
+++ b/Tools/DumpRenderTree/TestRunner.h
@@ -56,8 +56,6 @@
     bool callShouldCloseOnWebView();
     JSStringRef copyDecodedHostName(JSStringRef name);
     JSStringRef copyEncodedHostName(JSStringRef name);
-    void deliverWebIntent(JSStringRef action, JSStringRef type, JSStringRef data);
-    void disableImageLoading();
     void dispatchPendingLoadRequests();
     void display();
     void displayInvalidatedRegion();
@@ -68,7 +66,6 @@
     long long applicationCacheDiskUsageForOrigin(JSStringRef name);
     bool isCommandEnabled(JSStringRef name);
     void keepWebHistory();
-    JSValueRef computedStyleIncludingVisitedInfo(JSContextRef, JSValueRef);
     void notifyDone();
     int numberOfPendingGeolocationPermissionRequests();
     void overridePreference(JSStringRef key, JSStringRef value);
@@ -82,14 +79,12 @@
     void queueNonLoadingScript(JSStringRef script);
     void queueReload();
     void removeAllVisitedLinks();
-    void sendWebIntentResponse(JSStringRef response);
     void setAcceptsEditing(bool);
     void setAllowUniversalAccessFromFileURLs(bool);
     void setAllowFileAccessFromFileURLs(bool);
     void setAppCacheMaximumSize(unsigned long long quota);
     void setApplicationCacheOriginQuota(unsigned long long);
     void setAuthorAndUserStylesEnabled(bool);
-    void setAutofilled(JSContextRef, JSValueRef nodeObject, bool autofilled);
     void setCacheModel(int);
     void setCustomPolicyDelegate(bool setDelegate, bool permissive);
     void setDatabaseQuota(unsigned long long quota);
@@ -108,8 +103,6 @@
     void setPluginsEnabled(bool);
     void setPopupBlockingEnabled(bool);
     void setPrivateBrowsingEnabled(bool);
-    void setSelectTrailingWhitespaceEnabled(bool);
-    void setSmartInsertDeleteEnabled(bool);
     void setTabKeyCyclesThroughElements(bool);
     void setUseDashboardCompatibilityMode(bool flag);
     void setUserStyleSheetEnabled(bool flag);
@@ -117,7 +110,6 @@
     void setValueForUser(JSContextRef, JSValueRef nodeObject, JSStringRef value);
     void setViewModeMediaFeature(JSStringRef);
     void setXSSAuditorEnabled(bool flag);
-    void setFrameFlatteningEnabled(bool);
     void setSpatialNavigationEnabled(bool);
     void setScrollbarPolicy(JSStringRef orientation, JSStringRef policy);
     void startSpeechInput(JSContextRef inputElement);
@@ -126,10 +118,9 @@
 
     void waitForPolicyDelegate();
     size_t webHistoryItemCount();
-    unsigned workerThreadCount() const;
     int windowCount();
     
-#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(WIN)
+#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(EFL)
     JSRetainPtr<JSStringRef> platformName() const;
 #endif
 
@@ -142,8 +133,6 @@
     void removeAllWebNotificationPermissions();
     void simulateWebNotificationClick(JSValueRef notification);
 
-    bool elementDoesAutoCompleteForElementWithId(JSStringRef id);
-
     bool dumpAsAudio() const { return m_dumpAsAudio; }
     void setDumpAsAudio(bool dumpAsAudio) { m_dumpAsAudio = dumpAsAudio; }
     
@@ -288,10 +277,6 @@
 
     const std::string& encodedAudioData() const { return m_encodedAudioData; }
     void setEncodedAudioData(const std::string& encodedAudioData) { m_encodedAudioData = encodedAudioData; }
-    
-    bool pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId);
-    bool pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId);
-    unsigned numberOfActiveAnimations() const;
 
     void addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains);
     void removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains);
@@ -304,7 +289,6 @@
     bool geolocationPermission() const { return m_geolocationPermission; }
 
     void setDeveloperExtrasEnabled(bool);
-    void setAsynchronousSpellCheckingEnabled(bool);
     void showWebInspector();
     void closeWebInspector();
     void evaluateInWebInspector(long callId, JSStringRef script);
@@ -336,8 +320,6 @@
     // Simulate a request an embedding application could make, populating per-session credential storage.
     void authenticateSession(JSStringRef url, JSStringRef username, JSStringRef password);
 
-    JSRetainPtr<JSStringRef> markerTextForListItem(JSContextRef, JSValueRef nodeObject) const;
-
     JSValueRef originsWithLocalStorage(JSContextRef);
     void deleteAllLocalStorage();
     void deleteLocalStorageForOrigin(JSStringRef originIdentifier);
@@ -351,8 +333,6 @@
     static const unsigned maxViewWidth;
     static const unsigned maxViewHeight;
 
-    void setMinimumTimerInterval(double);
-
     void setTextDirection(JSStringRef);
     const std::string& titleTextDirection() const { return m_titleTextDirection; }
     void setTitleTextDirection(const std::string& direction) { m_titleTextDirection = direction; }
@@ -362,6 +342,7 @@
     bool hasCustomFullScreenBehavior() const { return m_customFullScreenBehavior; }
 
     void setStorageDatabaseIdleInterval(double);
+    void closeIdleLocalStorageDatabases();
 
     bool hasPendingWebNotificationClick() const { return m_hasPendingWebNotificationClick; }
 
diff --git a/Tools/DumpRenderTree/gtk/AccessibilityCallbacks.h b/Tools/DumpRenderTree/atk/AccessibilityCallbacks.h
similarity index 100%
rename from Tools/DumpRenderTree/gtk/AccessibilityCallbacks.h
rename to Tools/DumpRenderTree/atk/AccessibilityCallbacks.h
diff --git a/Tools/DumpRenderTree/gtk/AccessibilityCallbacks.cpp b/Tools/DumpRenderTree/atk/AccessibilityCallbacksAtk.cpp
similarity index 82%
rename from Tools/DumpRenderTree/gtk/AccessibilityCallbacks.cpp
rename to Tools/DumpRenderTree/atk/AccessibilityCallbacksAtk.cpp
index 8f2c802..1ea4f4a 100644
--- a/Tools/DumpRenderTree/gtk/AccessibilityCallbacks.cpp
+++ b/Tools/DumpRenderTree/atk/AccessibilityCallbacksAtk.cpp
@@ -29,13 +29,23 @@
 #include "config.h"
 #include "AccessibilityCallbacks.h"
 
+#if HAVE(ACCESSIBILITY)
+
 #include "AccessibilityController.h"
 #include "DumpRenderTree.h"
-#include "WebCoreSupport/DumpRenderTreeSupportGtk.h"
-#include <gtk/gtk.h>
-#include <webkit/webkit.h>
+#include <atk/atk.h>
 #include <wtf/gobject/GOwnPtr.h>
 
+#if PLATFORM(GTK)
+#include "WebCoreSupport/DumpRenderTreeSupportGtk.h"
+#include <webkit/webkit.h>
+#endif
+
+#if PLATFORM(EFL)
+#include "DumpRenderTreeChrome.h"
+#include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
+#endif
+
 static guint stateChangeListenerId = 0;
 static guint focusEventListenerId = 0;
 static guint activeDescendantChangedListenerId = 0;
@@ -61,14 +71,10 @@
         objectName = "(No name)";
 
     GOwnPtr<gchar> signalNameAndValue(signalValue ? g_strdup_printf("%s = %s", signalName, signalValue) : g_strdup(signalName));
-    printf("Accessibility object emitted \"%s\" / Name: \"%s\" / Role: %d\n",
-           signalNameAndValue.get(), objectName, objectRole);
+    printf("Accessibility object emitted \"%s\" / Name: \"%s\" / Role: %d\n", signalNameAndValue.get(), objectName, objectRole);
 }
 
-static gboolean axObjectEventListener(GSignalInvocationHint *signalHint,
-                                      guint numParamValues,
-                                      const GValue *paramValues,
-                                      gpointer data)
+static gboolean axObjectEventListener(GSignalInvocationHint *signalHint, guint numParamValues, const GValue *paramValues, gpointer data)
 {
     // At least we should receive the instance emitting the signal.
     if (numParamValues < 1)
@@ -78,25 +84,25 @@
     if (!accessible || !ATK_IS_OBJECT(accessible))
         return TRUE;
 
-    GSignalQuery signal_query;
+    GSignalQuery signalQuery;
     GOwnPtr<gchar> signalName;
     GOwnPtr<gchar> signalValue;
 
-    g_signal_query(signalHint->signal_id, &signal_query);
+    g_signal_query(signalHint->signal_id, &signalQuery);
 
-    if (!g_strcmp0(signal_query.signal_name, "state-change")) {
+    if (!g_strcmp0(signalQuery.signal_name, "state-change")) {
         signalName.set(g_strdup_printf("state-change:%s", g_value_get_string(&paramValues[1])));
         signalValue.set(g_strdup_printf("%d", g_value_get_boolean(&paramValues[2])));
-    } else if (!g_strcmp0(signal_query.signal_name, "focus-event")) {
+    } else if (!g_strcmp0(signalQuery.signal_name, "focus-event")) {
         signalName.set(g_strdup("focus-event"));
         signalValue.set(g_strdup_printf("%d", g_value_get_boolean(&paramValues[1])));
-    } else if (!g_strcmp0(signal_query.signal_name, "children-changed")) {
+    } else if (!g_strcmp0(signalQuery.signal_name, "children-changed")) {
         signalName.set(g_strdup("children-changed"));
         signalValue.set(g_strdup_printf("%d", g_value_get_uint(&paramValues[1])));
-    } else if (!g_strcmp0(signal_query.signal_name, "property-change")) {
+    } else if (!g_strcmp0(signalQuery.signal_name, "property-change"))
         signalName.set(g_strdup_printf("property-change:%s", g_quark_to_string(signalHint->detail)));
-    } else
-        signalName.set(g_strdup(signal_query.signal_name));
+    else
+        signalName.set(g_strdup(signalQuery.signal_name));
 
     printAccessibilityEvent(accessible, signalName.get(), signalValue.get());
 
@@ -110,15 +116,19 @@
 
     // Ensure that accessibility is initialized for the WebView by querying for
     // the root accessible object, which will create the full hierarchy.
+#if PLATFORM(GTK)
     DumpRenderTreeSupportGtk::getRootAccessibleElement(mainFrame);
+#elif PLATFORM(EFL)
+    DumpRenderTreeSupportEfl::rootAccessibleElement(browser->mainFrame());
+#endif
 
     // Add global listeners for AtkObject's signals.
-    stateChangeListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:state-change");
-    focusEventListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:focus-event");
-    activeDescendantChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:active-descendant-changed");
-    childrenChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:children-changed");
-    propertyChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:property-change");
-    visibleDataChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:visible-data-changed");
+    stateChangeListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:state-change");
+    focusEventListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:focus-event");
+    activeDescendantChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:active-descendant-changed");
+    childrenChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:children-changed");
+    propertyChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:property-change");
+    visibleDataChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:visible-data-changed");
 
     // Ensure the Atk interface types are registered, otherwise
     // the AtkDocument signal handlers below won't get registered.
@@ -157,3 +167,4 @@
     }
 }
 
+#endif
diff --git a/Tools/DumpRenderTree/atk/AccessibilityControllerAtk.cpp b/Tools/DumpRenderTree/atk/AccessibilityControllerAtk.cpp
new file mode 100644
index 0000000..faecfd0
--- /dev/null
+++ b/Tools/DumpRenderTree/atk/AccessibilityControllerAtk.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2008, 2009, 2010 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009 Jan Michael Alonzo
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "AccessibilityController.h"
+
+#if HAVE(ACCESSIBILITY)
+
+#include "AccessibilityCallbacks.h"
+#include "AccessibilityUIElement.h"
+#include "DumpRenderTree.h"
+
+#include <atk/atk.h>
+
+static bool loggingAccessibilityEvents = false;
+
+AccessibilityController::AccessibilityController()
+{
+}
+
+AccessibilityController::~AccessibilityController()
+{
+}
+
+AccessibilityUIElement AccessibilityController::elementAtPoint(int x, int y)
+{
+    // FIXME: implement
+    return 0;
+}
+
+
+void AccessibilityController::setLogFocusEvents(bool)
+{
+}
+
+void AccessibilityController::setLogScrollingStartEvents(bool)
+{
+}
+
+void AccessibilityController::setLogValueChangeEvents(bool)
+{
+}
+
+void AccessibilityController::setLogAccessibilityEvents(bool logAccessibilityEvents)
+{
+    if (logAccessibilityEvents == loggingAccessibilityEvents)
+        return;
+
+    if (!logAccessibilityEvents) {
+        disconnectAccessibilityCallbacks();
+        loggingAccessibilityEvents = false;
+        return;
+    }
+
+    connectAccessibilityCallbacks();
+    loggingAccessibilityEvents = true;
+}
+
+bool AccessibilityController::addNotificationListener(JSObjectRef)
+{
+    return false;
+}
+
+void AccessibilityController::removeNotificationListener()
+{
+}
+
+AtkObject* AccessibilityController::childElementById(AtkObject* parent, const char* id)
+{
+    if (!ATK_IS_OBJECT(parent))
+        return 0;
+
+    AtkAttributeSet* attributeSet = atk_object_get_attributes(parent);
+    for (GSList* attributes = attributeSet; attributes; attributes = attributes->next) {
+        AtkAttribute* attribute = static_cast<AtkAttribute*>(attributes->data);
+        if (!strcmp(attribute->name, "html-id")) {
+            if (!strcmp(attribute->value, id))
+                return parent;
+            break;
+        }
+    }
+
+    int childCount = atk_object_get_n_accessible_children(parent);
+    for (int i = 0; i < childCount; i++) {
+        AtkObject* result = childElementById(atk_object_ref_accessible_child(parent, i), id);
+        if (ATK_IS_OBJECT(result))
+            return result;
+    }
+
+    return 0;
+}
+
+#endif
diff --git a/Tools/DumpRenderTree/atk/AccessibilityUIElementAtk.cpp b/Tools/DumpRenderTree/atk/AccessibilityUIElementAtk.cpp
new file mode 100644
index 0000000..0015723
--- /dev/null
+++ b/Tools/DumpRenderTree/atk/AccessibilityUIElementAtk.cpp
@@ -0,0 +1,1063 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009 Jan Michael Alonzo
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "AccessibilityUIElement.h"
+
+#if HAVE(ACCESSIBILITY)
+
+#include <JavaScriptCore/JSStringRef.h>
+#include <atk/atk.h>
+#include <wtf/Assertions.h>
+#include <wtf/gobject/GOwnPtr.h>
+#include <wtf/gobject/GRefPtr.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/WTFString.h>
+#include <wtf/unicode/CharacterNames.h>
+
+static String coreAttributeToAtkAttribute(JSStringRef attribute)
+{
+    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(attribute);
+    GOwnPtr<gchar> buffer(static_cast<gchar*>(g_malloc(bufferSize)));
+    JSStringGetUTF8CString(attribute, buffer.get(), bufferSize);
+
+    String attributeString = String::fromUTF8(buffer.get());
+    if (attributeString == "AXPlaceholderValue")
+        return "placeholder-text";
+
+    return "";
+}
+
+static inline String roleToString(AtkRole role)
+{
+    switch (role) {
+    case ATK_ROLE_ALERT:
+        return "AXRole: AXAlert";
+    case ATK_ROLE_CANVAS:
+        return "AXRole: AXCanvas";
+    case ATK_ROLE_CHECK_BOX:
+        return "AXRole: AXCheckBox";
+    case ATK_ROLE_COLUMN_HEADER:
+        return "AXRole: AXColumnHeader";
+    case ATK_ROLE_COMBO_BOX:
+        return "AXRole: AXComboBox";
+    case ATK_ROLE_DOCUMENT_FRAME:
+        return "AXRole: AXWebArea";
+    case ATK_ROLE_ENTRY:
+        return "AXRole: AXTextField";
+    case ATK_ROLE_FOOTER:
+        return "AXRole: AXFooter";
+    case ATK_ROLE_FORM:
+        return "AXRole: AXForm";
+    case ATK_ROLE_GROUPING:
+        return "AXRole: AXGroup";
+    case ATK_ROLE_HEADING:
+        return "AXRole: AXHeading";
+    case ATK_ROLE_IMAGE:
+        return "AXRole: AXImage";
+    case ATK_ROLE_IMAGE_MAP:
+        return "AXRole: AXImageMap";
+    case ATK_ROLE_LABEL:
+        return "AXRole: AXLabel";
+    case ATK_ROLE_LINK:
+        return "AXRole: AXLink";
+    case ATK_ROLE_LIST:
+        return "AXRole: AXList";
+    case ATK_ROLE_LIST_BOX:
+        return "AXRole: AXListBox";
+    case ATK_ROLE_LIST_ITEM:
+        return "AXRole: AXListItem";
+    case ATK_ROLE_MENU:
+        return "AXRole: AXMenu";
+    case ATK_ROLE_MENU_BAR:
+        return "AXRole: AXMenuBar";
+    case ATK_ROLE_MENU_ITEM:
+        return "AXRole: AXMenuItem";
+    case ATK_ROLE_PAGE_TAB:
+        return "AXRole: AXTab";
+    case ATK_ROLE_PAGE_TAB_LIST:
+        return "AXRole: AXTabGroup";
+    case ATK_ROLE_PANEL:
+        return "AXRole: AXGroup";
+    case ATK_ROLE_PARAGRAPH:
+        return "AXRole: AXParagraph";
+    case ATK_ROLE_PASSWORD_TEXT:
+        return "AXRole: AXPasswordField";
+    case ATK_ROLE_PUSH_BUTTON:
+        return "AXRole: AXButton";
+    case ATK_ROLE_RADIO_BUTTON:
+        return "AXRole: AXRadioButton";
+    case ATK_ROLE_ROW_HEADER:
+        return "AXRole: AXRowHeader";
+    case ATK_ROLE_RULER:
+        return "AXRole: AXRuler";
+    case ATK_ROLE_SCROLL_BAR:
+        return "AXRole: AXScrollBar";
+    case ATK_ROLE_SCROLL_PANE:
+        return "AXRole: AXScrollArea";
+    case ATK_ROLE_SECTION:
+        return "AXRole: AXDiv";
+    case ATK_ROLE_SEPARATOR:
+        return "AXRole: AXHorizontalRule";
+    case ATK_ROLE_SLIDER:
+        return "AXRole: AXSlider";
+    case ATK_ROLE_SPIN_BUTTON:
+        return "AXRole: AXSpinButton";
+    case ATK_ROLE_TABLE:
+        return "AXRole: AXTable";
+    case ATK_ROLE_TABLE_CELL:
+        return "AXRole: AXCell";
+    case ATK_ROLE_TABLE_COLUMN_HEADER:
+        return "AXRole: AXColumnHeader";
+    case ATK_ROLE_TABLE_ROW:
+        return "AXRole: AXRow";
+    case ATK_ROLE_TABLE_ROW_HEADER:
+        return "AXRole: AXRowHeader";
+    case ATK_ROLE_TOGGLE_BUTTON:
+        return "AXRole: AXToggleButton";
+    case ATK_ROLE_TOOL_BAR:
+        return "AXRole: AXToolbar";
+    case ATK_ROLE_TOOL_TIP:
+        return "AXRole: AXUserInterfaceTooltip";
+    case ATK_ROLE_TREE:
+        return "AXRole: AXTree";
+    case ATK_ROLE_TREE_TABLE:
+        return "AXRole: AXTreeGrid";
+    case ATK_ROLE_TREE_ITEM:
+        return "AXRole: AXTreeItem";
+    case ATK_ROLE_WINDOW:
+        return "AXRole: AXWindow";
+    case ATK_ROLE_UNKNOWN:
+        return "AXRole: AXUnknown";
+    default:
+        // We want to distinguish ATK_ROLE_UNKNOWN from a known AtkRole which
+        // our DRT isn't properly handling.
+        return "AXRole: FIXME not identified";
+    }
+}
+
+static inline gchar* replaceCharactersForResults(gchar* str)
+{
+    String uString = String::fromUTF8(str);
+
+    // The object replacement character is passed along to ATs so we need to be
+    // able to test for their presence and do so without causing test failures.
+    uString.replace(objectReplacementCharacter, "<obj>");
+
+    // The presence of newline characters in accessible text of a single object
+    // is appropriate, but it makes test results (especially the accessible tree)
+    // harder to read.
+    uString.replace("\n", "<\\n>");
+
+    return g_strdup(uString.utf8().data());
+}
+
+static bool checkElementState(PlatformUIElement element, AtkStateType stateType)
+{
+    if (!ATK_IS_OBJECT(element))
+        return false;
+
+    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(element)));
+    return atk_state_set_contains_state(stateSet.get(), stateType);
+}
+
+AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
+    : m_element(element)
+{
+    if (m_element)
+        g_object_ref(m_element);
+}
+
+AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
+    : m_element(other.m_element)
+{
+    if (m_element)
+        g_object_ref(m_element);
+}
+
+AccessibilityUIElement::~AccessibilityUIElement()
+{
+    if (m_element)
+        g_object_unref(m_element);
+}
+
+void AccessibilityUIElement::getLinkedUIElements(Vector<AccessibilityUIElement>& elements)
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::getDocumentLinks(Vector<AccessibilityUIElement>&)
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& children)
+{
+    int count = childrenCount();
+    for (int i = 0; i < count; i++) {
+        AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
+        children.append(AccessibilityUIElement(child));
+    }
+}
+
+void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned start, unsigned end)
+{
+    for (unsigned i = start; i < end; i++) {
+        AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
+        elementVector.append(AccessibilityUIElement(child));
+    }
+}
+
+int AccessibilityUIElement::rowCount()
+{
+    if (!m_element)
+        return 0;
+
+    ASSERT(ATK_IS_TABLE(m_element));
+
+    return atk_table_get_n_rows(ATK_TABLE(m_element));
+}
+
+int AccessibilityUIElement::columnCount()
+{
+    if (!m_element)
+        return 0;
+
+    ASSERT(ATK_IS_TABLE(m_element));
+
+    return atk_table_get_n_columns(ATK_TABLE(m_element));
+}
+
+int AccessibilityUIElement::childrenCount()
+{
+    if (!m_element)
+        return 0;
+
+    ASSERT(ATK_IS_OBJECT(m_element));
+
+    return atk_object_get_n_accessible_children(ATK_OBJECT(m_element));
+}
+
+AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
+{
+    if (!m_element)
+        return 0;
+
+    return AccessibilityUIElement(atk_component_ref_accessible_at_point(ATK_COMPONENT(m_element), x, y, ATK_XY_WINDOW));
+}
+
+AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
+{
+    // FIXME: implement
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
+{
+    Vector<AccessibilityUIElement> children;
+    getChildrenWithRange(children, index, index + 1);
+
+    if (children.size() == 1)
+        return children.at(0);
+
+    return 0;
+}
+
+unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
+{ 
+    // FIXME: implement
+    return 0;
+}
+
+gchar* attributeSetToString(AtkAttributeSet* attributeSet)
+{
+    GString* str = g_string_new(0);
+    for (GSList* attributes = attributeSet; attributes; attributes = attributes->next) {
+        AtkAttribute* attribute = static_cast<AtkAttribute*>(attributes->data);
+        GOwnPtr<gchar> attributeData(g_strconcat(attribute->name, ":", attribute->value, NULL));
+        g_string_append(str, attributeData.get());
+        if (attributes->next)
+            g_string_append(str, ", ");
+    }
+
+    return g_string_free(str, FALSE);
+}
+
+JSStringRef AccessibilityUIElement::allAttributes()
+{
+    if (!m_element)
+        return JSStringCreateWithCharacters(0, 0);
+
+    ASSERT(ATK_IS_OBJECT(m_element));
+    GOwnPtr<gchar> attributeData(attributeSetToString(atk_object_get_attributes(ATK_OBJECT(m_element))));
+    return JSStringCreateWithUTF8CString(attributeData.get());
+}
+
+JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfDocumentLinks()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+AccessibilityUIElement AccessibilityUIElement::titleUIElement()
+{
+    if (!m_element)
+        return 0;
+
+    AtkRelationSet* set = atk_object_ref_relation_set(ATK_OBJECT(m_element));
+    if (!set)
+        return 0;
+
+    AtkObject* target = 0;
+    int count = atk_relation_set_get_n_relations(set);
+    for (int i = 0; i < count; i++) {
+        AtkRelation* relation = atk_relation_set_get_relation(set, i);
+        if (atk_relation_get_relation_type(relation) == ATK_RELATION_LABELLED_BY) {
+            GPtrArray* targetList = atk_relation_get_target(relation);
+            if (targetList->len)
+                target = static_cast<AtkObject*>(g_ptr_array_index(targetList, 0));
+        }
+    }
+
+    g_object_unref(set);
+    return target ? AccessibilityUIElement(target) : 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::parentElement()
+{
+    if (!m_element)
+        return 0;
+
+    ASSERT(ATK_IS_OBJECT(m_element));
+
+    AtkObject* parent =  atk_object_get_parent(ATK_OBJECT(m_element));
+    return parent ? AccessibilityUIElement(parent) : 0;
+}
+
+JSStringRef AccessibilityUIElement::attributesOfChildren()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::role()
+{
+    AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
+    if (!role)
+        return JSStringCreateWithCharacters(0, 0);
+
+    String roleString = roleToString(role);
+    return JSStringCreateWithUTF8CString(roleString.utf8().data());
+}
+
+JSStringRef AccessibilityUIElement::subrole()
+{
+    return 0;
+}
+
+JSStringRef AccessibilityUIElement::roleDescription()
+{
+    return 0;
+}
+
+JSStringRef AccessibilityUIElement::title()
+{
+    const gchar* name = atk_object_get_name(ATK_OBJECT(m_element));
+    GOwnPtr<gchar> axTitle(g_strdup_printf("AXTitle: %s", name ? name : ""));
+
+    return JSStringCreateWithUTF8CString(axTitle.get());
+}
+
+JSStringRef AccessibilityUIElement::description()
+{
+    const gchar* description = atk_object_get_description(ATK_OBJECT(m_element));
+
+    if (!description)
+        return JSStringCreateWithCharacters(0, 0);
+
+    GOwnPtr<gchar> axDesc(g_strdup_printf("AXDescription: %s", description));
+
+    return JSStringCreateWithUTF8CString(axDesc.get());
+}
+
+JSStringRef AccessibilityUIElement::stringValue()
+{
+    if (!m_element || !ATK_IS_TEXT(m_element))
+        return JSStringCreateWithCharacters(0, 0);
+
+    gchar* text = atk_text_get_text(ATK_TEXT(m_element), 0, -1);
+    GOwnPtr<gchar> axValue(g_strdup_printf("AXValue: %s", replaceCharactersForResults(text)));
+    g_free(text);
+
+    return JSStringCreateWithUTF8CString(axValue.get());
+}
+
+JSStringRef AccessibilityUIElement::language()
+{
+    if (!m_element)
+        return JSStringCreateWithCharacters(0, 0);
+
+    // In ATK, the document language is exposed as the document's locale.
+    if (atk_object_get_role(ATK_OBJECT(m_element)) == ATK_ROLE_DOCUMENT_FRAME)
+        return JSStringCreateWithUTF8CString(g_strdup_printf("AXLanguage: %s", atk_document_get_locale(ATK_DOCUMENT(m_element))));
+
+    // For all other objects, the language is exposed as an AtkText attribute.
+    if (!ATK_IS_TEXT(m_element))
+        return JSStringCreateWithCharacters(0, 0);
+
+    for (GSList* textAttributes = atk_text_get_default_attributes(ATK_TEXT(m_element)); textAttributes; textAttributes = textAttributes->next) {
+        AtkAttribute* atkAttribute = static_cast<AtkAttribute*>(textAttributes->data);
+        if (!strcmp(atkAttribute->name, atk_text_attribute_get_name(ATK_TEXT_ATTR_LANGUAGE)))
+            return JSStringCreateWithUTF8CString(g_strdup_printf("AXLanguage: %s", atkAttribute->value));
+    }
+
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+double AccessibilityUIElement::x()
+{
+    int x, y;
+
+    atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
+
+    return x;
+}
+
+double AccessibilityUIElement::y()
+{
+    int x, y;
+
+    atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
+
+    return y;
+}
+
+double AccessibilityUIElement::width()
+{
+    int width, height;
+
+    atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
+
+    return width;
+}
+
+double AccessibilityUIElement::height()
+{
+    int width, height;
+
+    atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
+
+    return height;
+}
+
+double AccessibilityUIElement::clickPointX()
+{
+    // Note: This is not something we have in ATK.
+    return 0.f;
+}
+
+double AccessibilityUIElement::clickPointY()
+{
+    // Note: This is not something we have in ATK.
+    return 0.f;
+}
+
+JSStringRef AccessibilityUIElement::orientation() const
+{
+    if (!m_element || !ATK_IS_OBJECT(m_element))
+        return JSStringCreateWithCharacters(0, 0);
+
+    const char* axOrientation = 0;
+    if (checkElementState(m_element, ATK_STATE_HORIZONTAL))
+        axOrientation = "AXOrientation: AXHorizontalOrientation";
+    else if (checkElementState(m_element, ATK_STATE_VERTICAL))
+        axOrientation = "AXOrientation: AXVerticalOrientation";
+
+    if (!axOrientation)
+        return JSStringCreateWithCharacters(0, 0);
+
+    return JSStringCreateWithUTF8CString(axOrientation);
+}
+
+double AccessibilityUIElement::intValue() const
+{
+    GValue value = { 0, { { 0 } } };
+
+    if (!ATK_IS_VALUE(m_element))
+        return 0.0f;
+
+    atk_value_get_current_value(ATK_VALUE(m_element), &value);
+    if (!G_VALUE_HOLDS_FLOAT(&value))
+        return 0.0f;
+    return g_value_get_float(&value);
+}
+
+double AccessibilityUIElement::minValue()
+{
+    GValue value = { 0, { { 0 } } };
+
+    if (!ATK_IS_VALUE(m_element))
+        return 0.0f;
+
+    atk_value_get_minimum_value(ATK_VALUE(m_element), &value);
+    if (!G_VALUE_HOLDS_FLOAT(&value))
+        return 0.0f;
+    return g_value_get_float(&value);
+}
+
+double AccessibilityUIElement::maxValue()
+{
+    GValue value = { 0, { { 0 } } };
+
+    if (!ATK_IS_VALUE(m_element))
+        return 0.0f;
+
+    atk_value_get_maximum_value(ATK_VALUE(m_element), &value);
+    if (!G_VALUE_HOLDS_FLOAT(&value))
+        return 0.0f;
+    return g_value_get_float(&value);
+}
+
+JSStringRef AccessibilityUIElement::valueDescription()
+{
+    // FIXME: implement after it has been implemented in ATK.
+    // See: https://bugzilla.gnome.org/show_bug.cgi?id=684576
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+bool AccessibilityUIElement::isEnabled()
+{
+    return checkElementState(m_element, ATK_STATE_ENABLED);
+}
+
+int AccessibilityUIElement::insertionPointLineNumber()
+{
+    // FIXME: implement
+    return 0;
+}
+
+bool AccessibilityUIElement::isPressActionSupported()
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isIncrementActionSupported()
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isDecrementActionSupported()
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isRequired() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isFocused() const
+{
+    if (!ATK_IS_OBJECT(m_element))
+        return false;
+
+    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
+    gboolean isFocused = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSED);
+
+    return isFocused;
+}
+
+bool AccessibilityUIElement::isSelected() const
+{
+    return checkElementState(m_element, ATK_STATE_SELECTED);
+}
+
+int AccessibilityUIElement::hierarchicalLevel() const
+{
+    // FIXME: implement
+    return 0;
+}
+
+bool AccessibilityUIElement::ariaIsGrabbed() const
+{
+    return false;
+}
+
+JSStringRef AccessibilityUIElement::ariaDropEffects() const
+{   
+    return 0; 
+}
+
+bool AccessibilityUIElement::isExpanded() const
+{
+    if (!ATK_IS_OBJECT(m_element))
+        return false;
+
+    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
+    gboolean isExpanded = atk_state_set_contains_state(stateSet.get(), ATK_STATE_EXPANDED);
+
+    return isExpanded;
+}
+
+bool AccessibilityUIElement::isChecked() const
+{
+    if (!ATK_IS_OBJECT(m_element))
+        return false;
+
+    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
+    gboolean isChecked = atk_state_set_contains_state(stateSet.get(), ATK_STATE_CHECKED);
+
+    return isChecked;
+}
+
+JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfColumns()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfRows()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfHeader()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+int AccessibilityUIElement::indexInTable()
+{
+    // FIXME: implement
+    return 0;
+}
+
+static JSStringRef indexRangeInTable(PlatformUIElement element, bool isRowRange)
+{
+    GOwnPtr<gchar> rangeString(g_strdup("{0, 0}"));
+
+    if (!element)
+        return JSStringCreateWithUTF8CString(rangeString.get());
+
+    ASSERT(ATK_IS_OBJECT(element));
+
+    AtkObject* axTable = atk_object_get_parent(ATK_OBJECT(element));
+    if (!axTable || !ATK_IS_TABLE(axTable))
+        return JSStringCreateWithUTF8CString(rangeString.get());
+
+    // Look for the cell in the table.
+    gint indexInParent = atk_object_get_index_in_parent(ATK_OBJECT(element));
+    if (indexInParent == -1)
+        return JSStringCreateWithUTF8CString(rangeString.get());
+
+    int row = -1;
+    int column = -1;
+    row = atk_table_get_row_at_index(ATK_TABLE(axTable), indexInParent);
+    column = atk_table_get_column_at_index(ATK_TABLE(axTable), indexInParent);
+
+    // Get the actual values, if row and columns are valid values.
+    if (row != -1 && column != -1) {
+        int base = 0;
+        int length = 0;
+        if (isRowRange) {
+            base = row;
+            length = atk_table_get_row_extent_at(ATK_TABLE(axTable), row, column);
+        } else {
+            base = column;
+            length = atk_table_get_column_extent_at(ATK_TABLE(axTable), row, column);
+        }
+        rangeString.set(g_strdup_printf("{%d, %d}", base, length));
+    }
+
+    return JSStringCreateWithUTF8CString(rangeString.get());
+}
+
+JSStringRef AccessibilityUIElement::rowIndexRange()
+{
+    // Range in table for rows.
+    return indexRangeInTable(m_element, true);
+}
+
+JSStringRef AccessibilityUIElement::columnIndexRange()
+{
+    // Range in table for columns.
+    return indexRangeInTable(m_element, false);
+}
+
+int AccessibilityUIElement::lineForIndex(int)
+{
+    // FIXME: implement
+    return 0;
+}
+
+JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::stringForRange(unsigned, unsigned) 
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+} 
+
+JSStringRef AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned location, unsigned length)
+{
+    // FIXME: implement
+    return false;
+}
+
+AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(AccessibilityUIElement* startElement, bool isDirectionNext, JSStringRef searchKey, JSStringRef searchText)
+{
+    // FIXME: implement
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned column, unsigned row)
+{
+    if (!m_element)
+        return 0;
+
+    ASSERT(ATK_IS_TABLE(m_element));
+
+    // Adopt the AtkObject representing the cell because
+    // at_table_ref_at() transfers full ownership.
+    GRefPtr<AtkObject> foundCell = adoptGRef(atk_table_ref_at(ATK_TABLE(m_element), row, column));
+    return foundCell ? AccessibilityUIElement(foundCell.get()) : 0;
+}
+
+JSStringRef AccessibilityUIElement::selectedTextRange()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
+{
+    // FIXME: implement
+}
+
+JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute)
+{
+    if (!m_element)
+        return JSStringCreateWithCharacters(0, 0);
+
+    String atkAttributeName = coreAttributeToAtkAttribute(attribute);
+    if (atkAttributeName.isEmpty())
+        return JSStringCreateWithCharacters(0, 0);
+
+    for (GSList* atkAttributes = atk_object_get_attributes(ATK_OBJECT(m_element)); atkAttributes; atkAttributes = atkAttributes->next) {
+        AtkAttribute* atkAttribute = static_cast<AtkAttribute*>(atkAttributes->data);
+        if (!strcmp(atkAttribute->name, atkAttributeName.utf8().data()))
+            return JSStringCreateWithUTF8CString(atkAttribute->value);
+    }
+
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute)
+{
+    // FIXME: implement
+    return 0.0f;
+}
+
+bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
+{
+    return false;
+}
+
+static void alterCurrentValue(PlatformUIElement element, int factor)
+{
+    if (!element)
+        return;
+
+    ASSERT(ATK_IS_VALUE(element));
+
+    GValue currentValue = G_VALUE_INIT;
+    atk_value_get_current_value(ATK_VALUE(element), &currentValue);
+
+    GValue increment = G_VALUE_INIT;
+    atk_value_get_minimum_increment(ATK_VALUE(element), &increment);
+
+    GValue newValue = G_VALUE_INIT;
+    g_value_init(&newValue, G_TYPE_FLOAT);
+
+    g_value_set_float(&newValue, g_value_get_float(&currentValue) + factor * g_value_get_float(&increment));
+    atk_value_set_current_value(ATK_VALUE(element), &newValue);
+
+    g_value_unset(&newValue);
+    g_value_unset(&increment);
+    g_value_unset(&currentValue);
+}
+
+void AccessibilityUIElement::increment()
+{
+    alterCurrentValue(m_element, 1);
+}
+
+void AccessibilityUIElement::decrement()
+{
+    alterCurrentValue(m_element, -1);
+}
+
+void AccessibilityUIElement::press()
+{
+    if (!m_element)
+        return;
+
+    ASSERT(ATK_IS_OBJECT(m_element));
+
+    if (!ATK_IS_ACTION(m_element))
+        return;
+
+    // Only one action per object is supported so far.
+    atk_action_do_action(ATK_ACTION(m_element), 0);
+}
+
+void AccessibilityUIElement::showMenu()
+{
+    // FIXME: implement
+}
+
+AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::rowAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::disclosedByRow()
+{
+    return 0;
+}
+
+JSStringRef AccessibilityUIElement::accessibilityValue() const
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::documentEncoding()
+{
+    AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
+    if (role != ATK_ROLE_DOCUMENT_FRAME)
+        return JSStringCreateWithCharacters(0, 0);
+
+    return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "Encoding"));
+}
+
+JSStringRef AccessibilityUIElement::documentURI()
+{
+    AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
+    if (role != ATK_ROLE_DOCUMENT_FRAME)
+        return JSStringCreateWithCharacters(0, 0);
+
+    return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "URI"));
+}
+
+JSStringRef AccessibilityUIElement::url()
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
+{
+    // FIXME: implement
+    return false;
+}
+
+void AccessibilityUIElement::removeNotificationListener()
+{
+    // FIXME: implement
+}
+
+bool AccessibilityUIElement::isFocusable() const
+{
+    if (!ATK_IS_OBJECT(m_element))
+        return false;
+
+    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
+    gboolean isFocusable = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSABLE);
+
+    return isFocusable;
+}
+
+bool AccessibilityUIElement::isSelectable() const
+{
+    return checkElementState(m_element, ATK_STATE_SELECTABLE);
+}
+
+bool AccessibilityUIElement::isMultiSelectable() const
+{
+    return checkElementState(m_element, ATK_STATE_MULTISELECTABLE);
+}
+
+bool AccessibilityUIElement::isSelectedOptionActive() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isVisible() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isOffScreen() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isCollapsed() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isIgnored() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::hasPopup() const
+{
+    // FIXME: implement
+    return false;
+}
+
+void AccessibilityUIElement::takeFocus()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::takeSelection()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::addSelection()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::removeSelection()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::scrollToMakeVisible()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::scrollToMakeVisibleWithSubFocus(int x, int y, int width, int height)
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::scrollToGlobalPoint(int x, int y)
+{
+    // FIXME: implement
+}
+
+#endif
diff --git a/Tools/DumpRenderTree/blackberry/AccessibilityUIElementBlackBerry.cpp b/Tools/DumpRenderTree/blackberry/AccessibilityUIElementBlackBerry.cpp
index 63fbd36..bd34782 100644
--- a/Tools/DumpRenderTree/blackberry/AccessibilityUIElementBlackBerry.cpp
+++ b/Tools/DumpRenderTree/blackberry/AccessibilityUIElementBlackBerry.cpp
@@ -235,7 +235,19 @@
     return 0;
 }
 
-bool AccessibilityUIElement::isActionSupported(JSStringRef)
+bool AccessibilityUIElement::isPressActionSupported()
+{
+    notImplemented();
+    return 0;
+}
+
+bool AccessibilityUIElement::isIncrementActionSupported()
+{
+    notImplemented();
+    return 0;
+}
+
+bool AccessibilityUIElement::isDecrementActionSupported()
 {
     notImplemented();
     return 0;
@@ -544,6 +556,21 @@
     return false;
 }
 
+void AccessibilityUIElement::scrollToMakeVisible()
+{
+    notImplemented();
+}
+
+void AccessibilityUIElement::scrollToMakeVisibleWithSubFocus(int x, int y, int width, int height)
+{
+    notImplemented();
+}
+
+void AccessibilityUIElement::scrollToGlobalPoint(int x, int y)
+{
+    notImplemented();
+}
+
 void AccessibilityUIElement::takeFocus()
 {
     notImplemented();
diff --git a/Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp b/Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp
index d674ab5..956444b 100644
--- a/Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp
+++ b/Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp
@@ -37,9 +37,13 @@
 #include "FrameLoaderTypes.h"
 #include "FrameTree.h"
 #include "FrameView.h"
+#include "HTTPParsers.h"
 #include "HistoryItem.h"
+#include "HitTestResult.h"
 #include "IntSize.h"
 #include "JSDOMBinding.h"
+#include "MouseEvent.h"
+#include "Node.h"
 #include "NotImplemented.h"
 #include "Page.h"
 #include "PageGroup.h"
@@ -138,16 +142,36 @@
     return url.contains("loading/");
 }
 
+static bool shouldDumpAsText(const String& url)
+{
+    return url.contains("dumpAsText/");
+}
+
 namespace BlackBerry {
 namespace WebKit {
 
 DumpRenderTree* DumpRenderTree::s_currentInstance = 0;
-bool DumpRenderTree::s_selectTrailingWhitespaceEnabled = false;
 
 static void createFile(const String& fileName)
 {
     FILE* fd = fopen(fileName.utf8().data(), "wb");
-    fclose(fd);
+    if (fd)
+        fclose(fd);
+}
+
+static bool isFullUrl(const String& url)
+{
+    static Vector<String> *prefixes = 0;
+    if (!prefixes)  {
+        prefixes = new Vector<String>();
+        prefixes->append("http://");
+        prefixes->append("file://");
+    }
+    for (unsigned i = 0; i < prefixes->size(); ++i) {
+        if (url.startsWith(prefixes->at(i), false))
+            return true;
+    }
+    return false;
 }
 
 DumpRenderTree::DumpRenderTree(BlackBerry::WebKit::WebPage* page)
@@ -158,6 +182,7 @@
     , m_waitToDumpWatchdogTimer(this, &DumpRenderTree::waitToDumpWatchdogTimerFired)
     , m_workTimer(this, &DumpRenderTree::processWork)
     , m_acceptsEditing(true)
+    , m_policyDelegateEnabled(false)
 {
     const char* workerNumber = getenv("WORKER_NUMBER") ? getenv("WORKER_NUMBER") : "0";
     String sdcardPath = SDCARD_PATH;
@@ -193,8 +218,10 @@
         freopen(stderrFile.utf8().data(), "wb", stderr);
     }
     FILE* current = fopen(m_currentTestFile.utf8().data(), "w");
-    fwrite(m_currentTest->utf8().data(), 1, m_currentTest->utf8().length(), current);
-    fclose(current);
+    if (current) {
+        fwrite(m_currentTest->utf8().data(), 1, m_currentTest->utf8().length(), current);
+        fclose(current);
+    }
     m_page->load(url, BlackBerry::Platform::String::emptyString(), false);
 }
 
@@ -221,7 +248,9 @@
         m_currentHttpTest = m_currentTest->utf8().data();
         m_currentHttpTest.remove(0, strlen(httpTestSyntax));
         runTest(httpPrefixURL + m_currentHttpTest, imageHash);
-    } else
+    } else if (isFullUrl(*m_currentTest))
+        runTest(*m_currentTest, imageHash);
+    else
         runTest(kSDCLayoutTestsURI + *m_currentTest, imageHash);
 }
 
@@ -255,19 +284,25 @@
 {
     gTestRunner = TestRunner::create(url.utf8().data(), imageHash.utf8().data());
 
+    if (shouldDumpAsText(url)) {
+        gTestRunner->setDumpAsText(true);
+        gTestRunner->setGeneratePixelResults(false);
+    }
     gTestRunner->setIconDatabaseEnabled(false);
 
     DumpRenderTreeSupport::resetGeolocationMock(m_page);
 
     topLoadingFrame = 0;
     m_loadFinished = false;
-    s_selectTrailingWhitespaceEnabled = false;
-
+    m_policyDelegateEnabled = false;
+    waitForPolicy = false;
     testDone = false;
     WorkQueue::shared()->clear();
     WorkQueue::shared()->setFrozen(false);
 
     WebSettings* settings = m_page->settings();
+    // Apply new settings to current page, see more in the destructor of WebSettingsTransaction.
+    WebSettingsTransaction webSettingTransaction(settings);
 
     settings->setTextReflowMode(WebSettings::TextReflowDisabled);
     settings->setJavaScriptEnabled(true);
@@ -282,11 +317,8 @@
     settings->setSansSerifFontFamily("Arial");
     settings->setStandardFontFamily("Times");
     settings->setXSSAuditorEnabled(false);
-    settings->setFrameFlatteningEnabled(false);
     settings->setMaximumPagesInCache(0);
     settings->setPluginsEnabled(true);
-    // Apply new settings to current page, see more in the destructor of WebSettingsTransaction.
-    WebSettingsTransaction webSettingTransaction(settings);
 
     BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->clearBackForwardList(false);
 
@@ -514,9 +546,6 @@
     dumpToFile(result);
 
     if (!runFromCommandLine) {
-        // signal end of text block
-        fputs("#EOF\n", stdout);
-
         // There are two scenarios for dumping pixels:
         // 1. When the test case explicitly asks for it by calling dumpAsText(true) with that extra true passed as a parameter value, from JavaScript
         bool explicitPixelResults = gTestRunner->dumpAsText() && gTestRunner->generatePixelResults();
@@ -525,8 +554,11 @@
 
         // But only if m_enablePixelTests is set, to say that the user wants to run pixel tests at all.
         bool generatePixelResults = m_enablePixelTests && (explicitPixelResults || implicitPixelResults);
-        if (generatePixelResults)
+        if (generatePixelResults) {
+            // signal end of text block
+            fputs("#EOF\n", stdout);
             dumpWebViewAsPixelsAndCompareWithExpected(gTestRunner->expectedPixelHash());
+        }
 
         String crashFile = dumpFile + ".crash";
         unlink(crashFile.utf8().data());
@@ -621,9 +653,10 @@
     if (!testDone && gTestRunner->dumpFrameLoadCallbacks())
         printf("%s - didFinishLoadForFrame\n", drtFrameDescription(frame).utf8().data());
 
-    if (frame == topLoadingFrame)
+    if (frame == topLoadingFrame) {
         m_loadFinished = true;
-    locationChangeForFrame(frame);
+        locationChangeForFrame(frame);
+    }
 }
 
 void DumpRenderTree::didFinishDocumentLoadForFrame(WebCore::Frame* frame)
@@ -822,9 +855,9 @@
     return m_acceptsEditing;
 }
 
-void DumpRenderTree::didDecidePolicyForNavigationAction(const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request)
+void DumpRenderTree::didDecidePolicyForNavigationAction(const WebCore::NavigationAction& action, const WebCore::ResourceRequest& request, WebCore::Frame* frame)
 {
-    if (!waitForPolicy)
+    if (testDone || !m_policyDelegateEnabled)
         return;
 
     const char* typeDescription;
@@ -851,10 +884,34 @@
         typeDescription = "illegal value";
     }
 
-    printf("Policy delegate: attempt to load %s with navigation type '%s'\n", request.url().string().utf8().data(), typeDescription);
-    // FIXME: do originating part.
+    bool shouldWaitForResponse = !request.url().string().startsWith("mailto:");
+    printf("Policy delegate: attempt to load %s with navigation type '%s'", request.url().string().utf8().data(), typeDescription);
+    // Originating part, borrowed from Chromium.
+    RefPtr<WebCore::Node> node;
+    for (const WebCore::Event* event = action.event(); event; event = event->underlyingEvent()) {
+        if (event->isMouseEvent()) {
+            const WebCore::MouseEvent* mouseEvent = static_cast<const WebCore::MouseEvent*>(event);
+            node = frame->eventHandler()->hitTestResultAtPoint(mouseEvent->absoluteLocation(), false).innerNonSharedNode();
+            break;
+        }
+    }
+    if (node.get())
+        printf(" originating from %s\n", drtDumpPath(node.get()).utf8().data());
+    else
+        printf("\n");
 
-    gTestRunner->notifyDone();
+    if (waitForPolicy && !shouldWaitForResponse)
+        gTestRunner->notifyDone();
+}
+
+void DumpRenderTree::didDecidePolicyForResponse(const WebCore::ResourceResponse& response)
+{
+    if (!testDone && m_policyDelegateEnabled) {
+        if (WebCore::contentDispositionType(response.httpHeaderField("Content-Disposition")) == WebCore::ContentDispositionAttachment)
+            printf("Policy delegate: resource is an attachment, suggested file name '%s'\n", response.suggestedFilename().utf8().data());
+        if (waitForPolicy)
+            gTestRunner->notifyDone();
+    }
 }
 
 void DumpRenderTree::didDispatchWillPerformClientRedirect()
@@ -889,6 +946,11 @@
     return true;
 }
 
+void DumpRenderTree::setCustomPolicyDelegate(bool setDelegate, bool permissive)
+{
+    m_policyDelegateEnabled = setDelegate;
+    UNUSED_PARAM(permissive);
+}
 }
 }
 
diff --git a/Tools/DumpRenderTree/blackberry/DumpRenderTreeBlackBerry.h b/Tools/DumpRenderTree/blackberry/DumpRenderTreeBlackBerry.h
index daca112..267c4dc 100644
--- a/Tools/DumpRenderTree/blackberry/DumpRenderTreeBlackBerry.h
+++ b/Tools/DumpRenderTree/blackberry/DumpRenderTreeBlackBerry.h
@@ -71,7 +71,8 @@
     void didFinishDocumentLoadForFrame(WebCore::Frame*);
     void didClearWindowObjectInWorld(WebCore::DOMWrapperWorld*, JSGlobalContextRef, JSObjectRef windowObject);
     void didReceiveTitleForFrame(const String& title, WebCore::Frame*);
-    void didDecidePolicyForNavigationAction(const WebCore::NavigationAction&, const WebCore::ResourceRequest&);
+    void didDecidePolicyForNavigationAction(const WebCore::NavigationAction&, const WebCore::ResourceRequest&, WebCore::Frame*);
+    void didDecidePolicyForResponse(const WebCore::ResourceResponse&);
     void didDispatchWillPerformClientRedirect();
     void didHandleOnloadEventsForFrame(WebCore::Frame*);
     void didReceiveResponseForFrame(WebCore::Frame*, const WebCore::ResourceResponse&);
@@ -101,12 +102,11 @@
     bool shouldInsertNode(WebCore::Node*, WebCore::Range*, int insertAction);
     bool shouldInsertText(const String&, WebCore::Range*, int insertAction);
 
-    bool isSelectTrailingWhitespaceEnabled() const { return s_selectTrailingWhitespaceEnabled; }
-    void setSelectTrailingWhitespaceEnabled(bool enabled) { s_selectTrailingWhitespaceEnabled = enabled; }
     bool didReceiveAuthenticationChallenge(WebCore::Credential&);
 
     // BlackBerry::Platform::BlackBerryPlatformLayoutTestClient method
     virtual void addTest(const char* testFile);
+    void setCustomPolicyDelegate(bool setDelegate, bool permissive);
 private:
     void runTest(const String& url, const String& imageHash);
     void runTests();
@@ -146,7 +146,7 @@
 
     bool m_acceptsEditing;
     bool m_loadFinished;
-    static bool s_selectTrailingWhitespaceEnabled;
+    bool m_policyDelegateEnabled;
 };
 }
 }
diff --git a/Tools/DumpRenderTree/blackberry/EventSender.cpp b/Tools/DumpRenderTree/blackberry/EventSender.cpp
index 0f76914..941a2ed 100644
--- a/Tools/DumpRenderTree/blackberry/EventSender.cpp
+++ b/Tools/DumpRenderTree/blackberry/EventSender.cpp
@@ -26,6 +26,7 @@
 #include "DumpRenderTreeSupport.h"
 #include "IntPoint.h"
 #include "NotImplemented.h"
+#include "WebKitThreadViewportAccessor.h"
 #include "WebPage.h"
 
 #include <BlackBerryPlatformKeyboardEvent.h>
@@ -70,17 +71,34 @@
     return JSValueMakeUndefined(context);
 }
 
+void setMouseEventDocumentPos(BlackBerry::Platform::MouseEvent &event, const BlackBerry::WebKit::WebPage* page)
+{
+    // We have added document viewport position and document content position as members of the mouse event, when we create the event, we should initialize them as well.
+    BlackBerry::Platform::ViewportAccessor* viewportAccessor = page->webkitThreadViewportAccessor();
+    IntPoint documentContentPos = viewportAccessor->roundToDocumentFromPixelContents(BlackBerry::Platform::FloatPoint(viewportAccessor->pixelContentsFromViewport(lastMousePosition)));
+    IntPoint documentViewportMousePos = viewportAccessor->roundToDocumentFromPixelContents(BlackBerry::Platform::FloatPoint(lastMousePosition));
+    event.populateDocumentPosition(documentViewportMousePos, documentContentPos);
+}
+
 static JSValueRef mouseDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     BlackBerry::WebKit::WebPage* page = BlackBerry::WebKit::DumpRenderTree::currentInstance()->page();
-    page->mouseEvent(BlackBerry::Platform::MouseEvent(BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, 0, lastMousePosition, IntPoint::zero(), 0, 0));
+    BlackBerry::Platform::MouseEvent event(BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, 0, lastMousePosition, IntPoint::zero(), 0, 0, 0);
+
+    setMouseEventDocumentPos(event, page);
+
+    page->mouseEvent(event);
     return JSValueMakeUndefined(context);
 }
 
 static JSValueRef mouseUpCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     BlackBerry::WebKit::WebPage* page = BlackBerry::WebKit::DumpRenderTree::currentInstance()->page();
-    page->mouseEvent(BlackBerry::Platform::MouseEvent(0, BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, lastMousePosition, IntPoint::zero(), 0, 0));
+    BlackBerry::Platform::MouseEvent event(0, BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, lastMousePosition, IntPoint::zero(), 0, 0, 0);
+
+    setMouseEventDocumentPos(event, page);
+
+    page->mouseEvent(event);
     return JSValueMakeUndefined(context);
 }
 
@@ -96,8 +114,11 @@
 
     lastMousePosition = IntPoint(x, y);
     BlackBerry::WebKit::WebPage* page = BlackBerry::WebKit::DumpRenderTree::currentInstance()->page();
-    page->mouseEvent(BlackBerry::Platform::MouseEvent(BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, lastMousePosition, IntPoint::zero(), 0, 0));
+    BlackBerry::Platform::MouseEvent event(BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, BlackBerry::Platform::MouseEvent::ScreenLeftMouseButton, lastMousePosition, IntPoint::zero(), 0, 0, 0);
 
+    setMouseEventDocumentPos(event, page);
+
+    page->mouseEvent(event);
 
     return JSValueMakeUndefined(context);
 }
@@ -121,7 +142,7 @@
 
     JSStringRef character = JSValueToStringCopy(context, arguments[0], exception);
     ASSERT(!*exception);
-    short charCode = 0;
+    unsigned charCode = 0;
     bool needsShiftKeyModifier = false;
     if (JSStringIsEqualToUTF8CString(character, "leftArrow"))
         charCode = KEYCODE_LEFT;
@@ -221,12 +242,16 @@
     int y = static_cast<int>(JSValueToNumber(context, arguments[1], exception));
     ASSERT(!exception || !*exception);
 
-    BlackBerry::Platform::TouchPoint touch;
-    touch.m_id = touches.isEmpty() ? 0 : touches.last().m_id + 1;
+    int id = touches.isEmpty() ? 0 : touches.last().id() + 1;
+
+    // pixelViewportPosition is unused in the WebKit layer, so use this for screen position
     IntPoint pos(x, y);
-    touch.m_pos = pos;
-    touch.m_screenPos = pos;
-    touch.m_state = BlackBerry::Platform::TouchPoint::TouchPressed;
+
+    BlackBerry::Platform::TouchPoint touch(id, BlackBerry::Platform::TouchPoint::TouchPressed, pos, pos, 0);
+
+    // Unfortunately we don't know the scroll position at this point, so use pos for the content position too.
+    // This assumes scroll position is 0,0
+    touch.populateDocumentPosition(pos, pos);
 
     touches.append(touch);
 
@@ -249,10 +274,15 @@
         return JSValueMakeUndefined(context);
 
     BlackBerry::Platform::TouchPoint& touch = touches[index];
+
+    // pixelViewportPosition is unused in the WebKit layer
     IntPoint pos(x, y);
-    touch.m_pos = pos;
-    touch.m_screenPos = pos;
-    touch.m_state = BlackBerry::Platform::TouchPoint::TouchMoved;
+
+    // Unfortunately we don't know the scroll position at this point, so use pos for the content position too.
+    // This assumes scroll position is 0,0
+    touch.populateDocumentPosition(pos, pos);
+    touch.setScreenPosition(pos);
+    touch.updateState(BlackBerry::Platform::TouchPoint::TouchMoved);
 
     return JSValueMakeUndefined(context);
 }
@@ -288,7 +318,7 @@
 static JSValueRef touchEndCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     for (unsigned i = 0; i < touches.size(); ++i)
-        if (touches[i].m_state != BlackBerry::Platform::TouchPoint::TouchReleased) {
+        if (touches[i].state() != BlackBerry::Platform::TouchPoint::TouchReleased) {
             sendTouchEvent(BlackBerry::Platform::TouchEvent::TouchMove);
             return JSValueMakeUndefined(context);
         }
@@ -320,7 +350,7 @@
     if (index < 0 || index >= (int)touches.size())
         return JSValueMakeUndefined(context);
 
-    touches[index].m_state = BlackBerry::Platform::TouchPoint::TouchReleased;
+    touches[index].updateState(BlackBerry::Platform::TouchPoint::TouchReleased);
     return JSValueMakeUndefined(context);
 }
 
@@ -334,8 +364,8 @@
     Vector<BlackBerry::Platform::TouchPoint> t;
 
     for (Vector<BlackBerry::Platform::TouchPoint>::iterator it = touches.begin(); it != touches.end(); ++it) {
-        if (it->m_state != BlackBerry::Platform::TouchPoint::TouchReleased) {
-            it->m_state = BlackBerry::Platform::TouchPoint::TouchStationary;
+        if (it->state() != BlackBerry::Platform::TouchPoint::TouchReleased) {
+            it->updateState(BlackBerry::Platform::TouchPoint::TouchStationary);
             t.append(*it);
         }
     }
diff --git a/Tools/DumpRenderTree/blackberry/PixelDumpSupportBlackBerry.cpp b/Tools/DumpRenderTree/blackberry/PixelDumpSupportBlackBerry.cpp
index 420cdfb..37d95ff 100644
--- a/Tools/DumpRenderTree/blackberry/PixelDumpSupportBlackBerry.cpp
+++ b/Tools/DumpRenderTree/blackberry/PixelDumpSupportBlackBerry.cpp
@@ -20,6 +20,11 @@
 #include "PixelDumpSupportBlackBerry.h"
 
 #include "BackingStore.h"
+#include "BlackBerryPlatformExecutableMessage.h"
+#include "BlackBerryPlatformGraphics.h"
+#include "BlackBerryPlatformGraphicsContext.h"
+#include "BlackBerryPlatformGraphicsImpl.h"
+#include "BlackBerryPlatformMessageClient.h"
 #include "DumpRenderTreeBlackBerry.h"
 #include "PNGImageEncoder.h"
 #include "PixelDumpSupport.h"
@@ -37,6 +42,11 @@
 using namespace BlackBerry;
 using namespace WTF;
 
+void readPixelsUserInterfaceThread(BlackBerry::Platform::Graphics::PlatformGraphicsContext* context, const BlackBerry::Platform::IntRect& srcRect, unsigned char* pixels)
+{
+    context->readPixels(srcRect, pixels, false, false);
+}
+
 PassRefPtr<BitmapContext> createBitmapContextFromWebView(bool /*onscreen*/, bool /*incrementalRepaint*/, bool /*sweepHorizontally*/, bool /*drawSelectionRect*/)
 {
     Platform::Graphics::Window* window = DumpRenderTree::currentInstance()->page()->client()->window();
@@ -52,11 +62,11 @@
     const Platform::IntSize& windowSize = window->viewportSize();
     unsigned char* data = new unsigned char[windowSize.width() * windowSize.height() * 4];
 
+#if USE(SKIA)
     // We need to force a synchronous update to the window or we may get an empty bitmap.
     // For example, running DRT with one test case that finishes before the screen is updated.
     window->post(windowRect);
 
-#if USE(SKIA)
     SkBitmap bitmap;
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, windowSize.width(), windowSize.height());
     bitmap.allocPixels();
@@ -71,14 +81,21 @@
 
     const unsigned char* windowPixels = 0;
     if (!contentsBitmap.empty()) {
-        SkAutoLockPixels lock(contentsBitmap);
         windowPixels = static_cast<const unsigned char*>(contentsBitmap.getPixels());
+        if (windowPixels)
+            memcpy(data, windowPixels, windowSize.width() * windowSize.height() * 4);
     }
 #else
-    const unsigned char* windowPixels = lockBufferBackingImage(window->buffer(), Platform::Graphics::ReadAccess);
+    BlackBerry::Platform::Graphics::Buffer* buffer = BlackBerry::Platform::Graphics::createBuffer(windowSize, BlackBerry::Platform::Graphics::AlwaysBacked);
+    BlackBerry::Platform::Graphics::Drawable* drawable = BlackBerry::Platform::Graphics::lockBufferDrawable(buffer);
+    if (drawable) {
+        backingStore->drawContents(drawable, windowRect, windowSize);
+        BlackBerry::Platform::userInterfaceThreadMessageClient()->dispatchSyncMessage(
+            BlackBerry::Platform::createFunctionCallMessage(&readPixelsUserInterfaceThread, drawable, windowRect, data));
+        BlackBerry::Platform::Graphics::releaseBufferDrawable(buffer);
+    }
+    BlackBerry::Platform::Graphics::destroyBuffer(buffer);
 #endif
-    memcpy(data, windowPixels, windowSize.width() * windowSize.height() * 4);
-    Platform::Graphics::releaseBufferBackingImage(window->buffer());
     return BitmapContext::createByAdoptingData(data, windowSize.width(), windowSize.height());
 }
 
diff --git a/Tools/DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp b/Tools/DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp
index c80a96d..0b2d58f 100644
--- a/Tools/DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp
+++ b/Tools/DumpRenderTree/blackberry/TestRunnerBlackBerry.cpp
@@ -42,7 +42,6 @@
 #include "Settings.h"
 #include "WorkQueue.h"
 #include "WorkQueueItem.h"
-#include "WorkerThread.h"
 
 #include <JavaScriptCore/APICast.h>
 #include <SharedPointer.h>
@@ -191,9 +190,7 @@
 
 void TestRunner::setCustomPolicyDelegate(bool setDelegate, bool permissive)
 {
-    UNUSED_PARAM(setDelegate);
-    UNUSED_PARAM(permissive);
-    notImplemented();
+    BlackBerry::WebKit::DumpRenderTree::currentInstance()->setCustomPolicyDelegate(setDelegate, permissive);
 }
 
 void TestRunner::clearApplicationCacheForOrigin(OpaqueJSString*)
@@ -263,17 +260,6 @@
     BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->settings()->setXSSAuditorEnabled(flag);
 }
 
-void TestRunner::setSelectTrailingWhitespaceEnabled(bool flag)
-{
-    BlackBerry::WebKit::DumpRenderTree::currentInstance()->setSelectTrailingWhitespaceEnabled(flag);
-}
-
-void TestRunner::setSmartInsertDeleteEnabled(bool flag)
-{
-    UNUSED_PARAM(flag);
-    notImplemented();
-}
-
 void TestRunner::setTabKeyCyclesThroughElements(bool cycles)
 {
     if (!mainFrame)
@@ -302,6 +288,7 @@
 
 void TestRunner::waitForPolicyDelegate()
 {
+    setCustomPolicyDelegate(true, true);
     setWaitToDump(true);
     waitForPolicy = true;
 }
@@ -319,13 +306,6 @@
     return 0;
 }
 
-bool TestRunner::elementDoesAutoCompleteForElementWithId(JSStringRef id)
-{
-    UNUSED_PARAM(id);
-    notImplemented();
-    return false;
-}
-
 void TestRunner::setWaitToDump(bool waitToDump)
 {
     // Change from 30s to 35s because some test cases in multipart need 30 seconds,
@@ -342,85 +322,11 @@
     notImplemented();
 }
 
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
-{
-    if (!mainFrame)
-        return false;
-
-    int nameLen = JSStringGetMaximumUTF8CStringSize(animationName);
-    int idLen = JSStringGetMaximumUTF8CStringSize(elementId);
-    OwnArrayPtr<char> name = adoptArrayPtr(new char[nameLen]);
-    OwnArrayPtr<char> eId = adoptArrayPtr(new char[idLen]);
-
-    JSStringGetUTF8CString(animationName, name.get(), nameLen);
-    JSStringGetUTF8CString(elementId, eId.get(), idLen);
-
-    WebCore::AnimationController* animationController = mainFrame->animation();
-    if (!animationController)
-        return false;
-
-    WebCore::Node* node = mainFrame->document()->getElementById(eId.get());
-    if (!node || !node->renderer())
-        return false;
-
-    return animationController->pauseAnimationAtTime(node->renderer(), name.get(), time);
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
-{
-    if (!mainFrame)
-        return false;
-
-    int nameLen = JSStringGetMaximumUTF8CStringSize(propertyName);
-    int idLen = JSStringGetMaximumUTF8CStringSize(elementId);
-    OwnArrayPtr<char> name = adoptArrayPtr(new char[nameLen]);
-    OwnArrayPtr<char> eId = adoptArrayPtr(new char[idLen]);
-
-    JSStringGetUTF8CString(propertyName, name.get(), nameLen);
-    JSStringGetUTF8CString(elementId, eId.get(), idLen);
-
-    WebCore::AnimationController* animationController = mainFrame->animation();
-    if (!animationController)
-        return false;
-
-    WebCore::Node* node = mainFrame->document()->getElementById(eId.get());
-    if (!node || !node->renderer())
-        return false;
-
-    return animationController->pauseTransitionAtTime(node->renderer(), name.get(), time);
-}
-
-unsigned TestRunner::numberOfActiveAnimations() const
-{
-    if (!mainFrame)
-        return false;
-
-    WebCore::AnimationController* animationController = mainFrame->animation();
-    if (!animationController)
-        return false;
-
-    return animationController->numberOfActiveAnimations(mainFrame->document());
-}
-
-unsigned int TestRunner::workerThreadCount() const
-{
-#if ENABLE_WORKERS
-    return WebCore::WorkerThread::workerThreadCount();
-#else
-    return 0;
-#endif
-}
-
 void TestRunner::removeAllVisitedLinks()
 {
     notImplemented();
 }
 
-void TestRunner::disableImageLoading()
-{
-    BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->settings()->setLoadsImagesAutomatically(false);
-}
-
 void TestRunner::overridePreference(JSStringRef key, JSStringRef value)
 {
     if (!mainFrame)
@@ -439,6 +345,10 @@
         mainFrame->page()->settings()->setHyperlinkAuditingEnabled(valueStr == "true" || valueStr == "1");
     else if (keyStr == "WebSocketsEnabled")
         BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->settings()->setWebSocketsEnabled(valueStr == "true" || valueStr == "1");
+    else if (keyStr == "WebKitDefaultTextEncodingName")
+        BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->settings()->setDefaultTextEncodingName(valueStr);
+    else if (keyStr == "WebKitDisplayImagesKey")
+        BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->settings()->setLoadsImagesAutomatically(valueStr == "true" || valueStr == "1");
 }
 
 void TestRunner::setAlwaysAcceptCookies(bool alwaysAcceptCookies)
@@ -447,15 +357,15 @@
     notImplemented();
 }
 
-void TestRunner::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
+void TestRunner::setMockGeolocationPosition(double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
 {
-    DumpRenderTreeSupport::setMockGeolocationPosition(BlackBerry::WebKit::DumpRenderTree::currentInstance()->page(), latitude, longitude, accuracy);
+    DumpRenderTreeSupport::setMockGeolocationPosition(BlackBerry::WebKit::DumpRenderTree::currentInstance()->page(), latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed);
 }
 
-void TestRunner::setMockGeolocationError(int code, JSStringRef message)
+void TestRunner::setMockGeolocationPositionUnavailableError(JSStringRef message)
 {
     String messageStr = jsStringRefToWebCoreString(message);
-    DumpRenderTreeSupport::setMockGeolocationError(BlackBerry::WebKit::DumpRenderTree::currentInstance()->page(), code, messageStr);
+    DumpRenderTreeSupport::setMockGeolocationPositionUnavailableError(BlackBerry::WebKit::DumpRenderTree::currentInstance()->page(), messageStr);
 }
 
 void TestRunner::showWebInspector()
@@ -525,11 +435,6 @@
     return false;
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool enable)
-{
-    BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->settings()->setFrameFlatteningEnabled(enable);
-}
-
 void TestRunner::setSpatialNavigationEnabled(bool enable)
 {
     notImplemented();
@@ -538,17 +443,17 @@
 void TestRunner::addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
 {
     WebCore::SecurityPolicy::addOriginAccessWhitelistEntry(*WebCore::SecurityOrigin::createFromString(jsStringRefToWebCoreString(sourceOrigin)),
-                                                  jsStringRefToWebCoreString(destinationProtocol),
-                                                  jsStringRefToWebCoreString(destinationHost),
-                                                  allowDestinationSubdomains);
+        jsStringRefToWebCoreString(destinationProtocol),
+        jsStringRefToWebCoreString(destinationHost),
+        allowDestinationSubdomains);
 }
 
 void TestRunner::removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
 {
     WebCore::SecurityPolicy::removeOriginAccessWhitelistEntry(*WebCore::SecurityOrigin::createFromString(jsStringRefToWebCoreString(sourceOrigin)),
-                                                     jsStringRefToWebCoreString(destinationProtocol),
-                                                     jsStringRefToWebCoreString(destinationHost),
-                                                     allowDestinationSubdomains);
+        jsStringRefToWebCoreString(destinationProtocol),
+        jsStringRefToWebCoreString(destinationHost),
+        allowDestinationSubdomains);
 }
 
 void TestRunner::setAllowFileAccessFromFileURLs(bool enabled)
@@ -582,27 +487,6 @@
     BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->setJavaScriptCanAccessClipboard(flag);
 }
 
-JSValueRef TestRunner::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef value)
-{
-    return DumpRenderTreeSupport::computedStyleIncludingVisitedInfo(context, value);
-}
-
-JSRetainPtr<JSStringRef> TestRunner::layerTreeAsText() const
-{
-    notImplemented();
-    return 0;
-}
-
-JSRetainPtr<JSStringRef> TestRunner::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
-{
-    WebCore::Element* element = toElement(toJS(toJS(context), nodeObject));
-    if (!element)
-        return 0;
-
-    JSRetainPtr<JSStringRef> markerText(Adopt, JSStringCreateWithUTF8CString(WebCore::markerTextForListItem(element).utf8().data()));
-    return markerText;
-}
-
 void TestRunner::setPluginsEnabled(bool flag)
 {
     notImplemented();
@@ -650,11 +534,6 @@
     notImplemented();
 }
 
-void TestRunner::setMinimumTimerInterval(double)
-{
-    notImplemented();
-}
-
 void TestRunner::setTextDirection(JSStringRef)
 {
     notImplemented();
@@ -693,24 +572,6 @@
     notImplemented();
 }
 
-void TestRunner::setAsynchronousSpellCheckingEnabled(bool)
-{
-    notImplemented();
-}
-
-void TestRunner::setAutofilled(JSContextRef context, JSValueRef nodeObject, bool autofilled)
-{
-    JSC::ExecState* exec = toJS(context);
-    WebCore::Element* element = toElement(toJS(exec, nodeObject));
-    if (!element)
-        return;
-    WebCore::HTMLInputElement* inputElement = element->toInputElement();
-    if (!inputElement)
-        return;
-
-    inputElement->setAutofilled(autofilled);
-}
-
 int TestRunner::numberOfPendingGeolocationPermissionRequests()
 {
     return DumpRenderTreeSupport::numberOfPendingGeolocationPermissionRequests(BlackBerry::WebKit::DumpRenderTree::currentInstance()->page());
@@ -752,6 +613,13 @@
             options |= WebCore::StartInSelection;
     }
 
+    // FIXME: we don't need to call WebPage::findNextString(), this is a workaround
+    // so that test platform/blackberry/editing/text-iterator/findString-markers.html can pass.
+
+    // Our layout tests assume find will wrap and highlight all matches.
+    BlackBerry::WebKit::DumpRenderTree::currentInstance()->page()->findNextString(nameStr.utf8().data(),
+        !(options & WebCore::Backwards), !(options & WebCore::CaseInsensitive), true /* wrap */, true /* highlightAllMatches */);
+
     return mainFrame->page()->findString(nameStr, options);
 }
 
@@ -834,18 +702,13 @@
     notImplemented();
 }
 
-void TestRunner::sendWebIntentResponse(JSStringRef)
-{
-    notImplemented();
-}
-
-void TestRunner::deliverWebIntent(JSStringRef, JSStringRef, JSStringRef)
-{
-    notImplemented();
-}
-
 void TestRunner::setStorageDatabaseIdleInterval(double)
 {
     // FIXME: Implement this.
     notImplemented();
 }
+
+void TestRunner::closeIdleLocalStorageDatabases()
+{
+    notImplemented();
+}
diff --git a/Tools/DumpRenderTree/blackberry/WorkQueueItemBlackBerry.cpp b/Tools/DumpRenderTree/blackberry/WorkQueueItemBlackBerry.cpp
index 394e408..5607c5e 100644
--- a/Tools/DumpRenderTree/blackberry/WorkQueueItemBlackBerry.cpp
+++ b/Tools/DumpRenderTree/blackberry/WorkQueueItemBlackBerry.cpp
@@ -21,6 +21,7 @@
 
 #include "DumpRenderTreeBlackBerry.h"
 #include "Frame.h"
+#include "FrameLoadRequest.h"
 #include "KURL.h"
 #include "WebPage.h"
 #include <wtf/OwnArrayPtr.h>
@@ -46,7 +47,7 @@
         return false;
 
     KURL kurl = KURL(KURL(), url.get());
-    frame->loader()->load(kurl, false);
+    frame->loader()->load(FrameLoadRequest(frame, ResourceRequest(kurl)));
     return true;
 }
 
diff --git a/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.cpp b/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.cpp
index eb21b2c..663f7ef 100644
--- a/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.cpp
+++ b/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.cpp
@@ -34,10 +34,10 @@
 #include "DRTDevToolsClient.h"
 
 #include "Task.h"
-#include "platform/WebCString.h"
 #include "WebDevToolsAgent.h"
 #include "WebView.h"
 #include "webkit/support/webkit_support.h"
+#include <public/WebCString.h>
 
 using namespace WebKit;
 using namespace WebTestRunner;
diff --git a/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.h b/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.h
index c13aef7..9b9b9f4 100644
--- a/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.h
+++ b/Tools/DumpRenderTree/chromium/DRTDevToolsAgent.h
@@ -33,7 +33,7 @@
 
 #include "WebDevToolsAgentClient.h"
 #include "WebTask.h"
-#include "platform/WebString.h"
+#include <public/WebString.h>
 #include <wtf/HashMap.h>
 #include <wtf/Noncopyable.h>
 
diff --git a/Tools/DumpRenderTree/chromium/DRTDevToolsClient.cpp b/Tools/DumpRenderTree/chromium/DRTDevToolsClient.cpp
index 08df1d5..f458afe 100644
--- a/Tools/DumpRenderTree/chromium/DRTDevToolsClient.cpp
+++ b/Tools/DumpRenderTree/chromium/DRTDevToolsClient.cpp
@@ -92,6 +92,11 @@
     // Not implemented.
 }
 
+bool DRTDevToolsClient::isUnderTest()
+{
+    return true;
+}
+
 void DRTDevToolsClient::asyncCall(const WebString& args)
 {
     postTask(new AsyncCallTask(this, args));
@@ -101,4 +106,3 @@
 {
     m_webDevToolsFrontend->dispatchOnInspectorFrontend(args);
 }
-
diff --git a/Tools/DumpRenderTree/chromium/DRTDevToolsClient.h b/Tools/DumpRenderTree/chromium/DRTDevToolsClient.h
index 5f486dd..702660a 100644
--- a/Tools/DumpRenderTree/chromium/DRTDevToolsClient.h
+++ b/Tools/DumpRenderTree/chromium/DRTDevToolsClient.h
@@ -33,7 +33,7 @@
 
 #include "WebDevToolsFrontendClient.h"
 #include "WebTask.h"
-#include "platform/WebString.h"
+#include <public/WebString.h>
 #include <wtf/Noncopyable.h>
 #include <wtf/OwnPtr.h>
 namespace WebKit {
@@ -60,6 +60,7 @@
     virtual void closeWindow();
     virtual void dockWindow();
     virtual void undockWindow();
+    virtual bool isUnderTest();
 
     void asyncCall(const WebKit::WebString& args);
 
diff --git a/Tools/DumpRenderTree/chromium/DRTTestRunner.cpp b/Tools/DumpRenderTree/chromium/DRTTestRunner.cpp
deleted file mode 100644
index dafafa1..0000000
--- a/Tools/DumpRenderTree/chromium/DRTTestRunner.cpp
+++ /dev/null
@@ -1,2302 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- * Copyright (C) 2010 Pawel Hajdan (phajdan.jr@chromium.org)
- * Copyright (C) 2012 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "DRTTestRunner.h"
-
-#include "DRTDevToolsAgent.h"
-#include "MockWebSpeechInputController.h"
-#include "MockWebSpeechRecognizer.h"
-#include "Task.h"
-#include "TestShell.h"
-#include "WebAnimationController.h"
-#include "WebBindings.h"
-#include "WebConsoleMessage.h"
-#include "WebDeviceOrientation.h"
-#include "WebDeviceOrientationClientMock.h"
-#include "WebDocument.h"
-#include "WebElement.h"
-#include "WebFindOptions.h"
-#include "WebFrame.h"
-#include "WebGeolocationClientMock.h"
-#include "WebIDBFactory.h"
-#include "WebInputElement.h"
-#include "WebIntent.h"
-#include "WebIntentRequest.h"
-#include "WebKit.h"
-#include "WebNotificationPresenter.h"
-#include "WebPermissions.h"
-#include "WebPrintParams.h"
-#include "WebScriptSource.h"
-#include "WebSecurityPolicy.h"
-#include "WebSettings.h"
-#include "WebSurroundingText.h"
-#include "WebView.h"
-#include "WebViewHost.h"
-#include "WebWorkerInfo.h"
-#include "platform/WebData.h"
-#include "platform/WebSerializedScriptValue.h"
-#include "platform/WebSize.h"
-#include "platform/WebURL.h"
-#include "v8/include/v8.h"
-#include "webkit/support/webkit_support.h"
-#include <algorithm>
-#include <cctype>
-#include <clocale>
-#include <cstdlib>
-#include <limits>
-#include <sstream>
-#include <wtf/OwnArrayPtr.h>
-#include <wtf/text/WTFString.h>
-
-#if OS(LINUX) || OS(ANDROID)
-#include "linux/WebFontRendering.h"
-#endif
-
-using namespace WebCore;
-using namespace WebKit;
-using namespace WebTestRunner;
-using namespace std;
-
-class EmptyWebDeliveredIntentClient : public WebKit::WebDeliveredIntentClient {
-public:
-    EmptyWebDeliveredIntentClient() { }
-    ~EmptyWebDeliveredIntentClient() { }
-
-    virtual void postResult(const WebSerializedScriptValue& data) const { }
-    virtual void postFailure(const WebSerializedScriptValue& data) const { }
-    virtual void destroy() { }
-};
-
-DRTTestRunner::DRTTestRunner(TestShell* shell)
-    : m_shell(shell)
-    , m_closeRemainingWindows(false)
-    , m_deferMainResourceDataLoad(false)
-    , m_showDebugLayerTree(false)
-    , m_workQueue(this)
-    , m_intentClient(adoptPtr(new EmptyWebDeliveredIntentClient))
-    , m_shouldStayOnPageAfterHandlingBeforeUnload(false)
-{
-
-    // Initialize the map that associates methods of this class with the names
-    // they will use when called by JavaScript. The actual binding of those
-    // names to their methods will be done by calling bindToJavaScript() (defined
-    // by CppBoundClass, the parent to DRTTestRunner).
-    bindMethod("addFileToPasteboardOnDrag", &DRTTestRunner::addFileToPasteboardOnDrag);
-#if ENABLE(INPUT_SPEECH)
-    bindMethod("addMockSpeechInputResult", &DRTTestRunner::addMockSpeechInputResult);
-    bindMethod("setMockSpeechInputDumpRect", &DRTTestRunner::setMockSpeechInputDumpRect);
-#endif
-#if ENABLE(SCRIPTED_SPEECH)
-    bindMethod("addMockSpeechRecognitionResult", &DRTTestRunner::addMockSpeechRecognitionResult);
-    bindMethod("setMockSpeechRecognitionError", &DRTTestRunner::setMockSpeechRecognitionError);
-    bindMethod("wasMockSpeechRecognitionAborted", &DRTTestRunner::wasMockSpeechRecognitionAborted);
-#endif
-    bindMethod("addOriginAccessWhitelistEntry", &DRTTestRunner::addOriginAccessWhitelistEntry);
-    bindMethod("addUserScript", &DRTTestRunner::addUserScript);
-    bindMethod("addUserStyleSheet", &DRTTestRunner::addUserStyleSheet);
-    bindMethod("clearAllDatabases", &DRTTestRunner::clearAllDatabases);
-    bindMethod("closeWebInspector", &DRTTestRunner::closeWebInspector);
-#if ENABLE(POINTER_LOCK)
-    bindMethod("didAcquirePointerLock", &DRTTestRunner::didAcquirePointerLock);
-    bindMethod("didLosePointerLock", &DRTTestRunner::didLosePointerLock);
-    bindMethod("didNotAcquirePointerLock", &DRTTestRunner::didNotAcquirePointerLock);
-#endif
-    bindMethod("disableAutoResizeMode", &DRTTestRunner::disableAutoResizeMode);
-    bindMethod("disableImageLoading", &DRTTestRunner::disableImageLoading);
-    bindMethod("display", &DRTTestRunner::display);
-    bindMethod("displayInvalidatedRegion", &DRTTestRunner::displayInvalidatedRegion);
-    bindMethod("dumpAsText", &DRTTestRunner::dumpAsText);
-    bindMethod("dumpBackForwardList", &DRTTestRunner::dumpBackForwardList);
-    bindMethod("dumpChildFramesAsText", &DRTTestRunner::dumpChildFramesAsText);
-    bindMethod("dumpChildFrameScrollPositions", &DRTTestRunner::dumpChildFrameScrollPositions);
-    bindMethod("dumpDatabaseCallbacks", &DRTTestRunner::dumpDatabaseCallbacks);
-    bindMethod("dumpEditingCallbacks", &DRTTestRunner::dumpEditingCallbacks);
-    bindMethod("dumpFrameLoadCallbacks", &DRTTestRunner::dumpFrameLoadCallbacks);
-    bindMethod("dumpProgressFinishedCallback", &DRTTestRunner::dumpProgressFinishedCallback);
-    bindMethod("dumpUserGestureInFrameLoadCallbacks", &DRTTestRunner::dumpUserGestureInFrameLoadCallbacks);
-    bindMethod("dumpResourceLoadCallbacks", &DRTTestRunner::dumpResourceLoadCallbacks);
-    bindMethod("dumpResourceResponseMIMETypes", &DRTTestRunner::dumpResourceResponseMIMETypes);
-    bindMethod("dumpSelectionRect", &DRTTestRunner::dumpSelectionRect);
-    bindMethod("dumpStatusCallbacks", &DRTTestRunner::dumpWindowStatusChanges);
-    bindMethod("dumpTitleChanges", &DRTTestRunner::dumpTitleChanges);
-    bindMethod("dumpPermissionClientCallbacks", &DRTTestRunner::dumpPermissionClientCallbacks);
-    bindMethod("dumpCreateView", &DRTTestRunner::dumpCreateView);
-    bindMethod("elementDoesAutoCompleteForElementWithId", &DRTTestRunner::elementDoesAutoCompleteForElementWithId);
-    bindMethod("enableAutoResizeMode", &DRTTestRunner::enableAutoResizeMode);
-    bindMethod("evaluateInWebInspector", &DRTTestRunner::evaluateInWebInspector);
-    bindMethod("evaluateScriptInIsolatedWorld", &DRTTestRunner::evaluateScriptInIsolatedWorld);
-    bindMethod("evaluateScriptInIsolatedWorldAndReturnValue", &DRTTestRunner::evaluateScriptInIsolatedWorldAndReturnValue);
-    bindMethod("setIsolatedWorldSecurityOrigin", &DRTTestRunner::setIsolatedWorldSecurityOrigin);
-    bindMethod("setIsolatedWorldContentSecurityPolicy", &DRTTestRunner::setIsolatedWorldContentSecurityPolicy);
-    bindMethod("execCommand", &DRTTestRunner::execCommand);
-    bindMethod("forceRedSelectionColors", &DRTTestRunner::forceRedSelectionColors);
-#if ENABLE(NOTIFICATIONS)
-    bindMethod("grantWebNotificationPermission", &DRTTestRunner::grantWebNotificationPermission);
-    bindMethod("denyWebNotificationPermission", &DRTTestRunner::denyWebNotificationPermission);
-    bindMethod("removeAllWebNotificationPermissions", &DRTTestRunner::removeAllWebNotificationPermissions);
-    bindMethod("simulateWebNotificationClick", &DRTTestRunner::simulateWebNotificationClick);
-#endif
-    bindMethod("findString", &DRTTestRunner::findString);
-    bindMethod("isCommandEnabled", &DRTTestRunner::isCommandEnabled);
-    bindMethod("hasCustomPageSizeStyle", &DRTTestRunner::hasCustomPageSizeStyle);
-    bindMethod("loseCompositorContext", &DRTTestRunner::loseCompositorContext);
-    bindMethod("markerTextForListItem", &DRTTestRunner::markerTextForListItem);
-    bindMethod("notifyDone", &DRTTestRunner::notifyDone);
-    bindMethod("numberOfActiveAnimations", &DRTTestRunner::numberOfActiveAnimations);
-    bindMethod("numberOfPendingGeolocationPermissionRequests", &DRTTestRunner:: numberOfPendingGeolocationPermissionRequests);
-    bindMethod("objCIdentityIsEqual", &DRTTestRunner::objCIdentityIsEqual);
-    bindMethod("overridePreference", &DRTTestRunner::overridePreference);
-    bindMethod("pathToLocalResource", &DRTTestRunner::pathToLocalResource);
-    bindMethod("pauseAnimationAtTimeOnElementWithId", &DRTTestRunner::pauseAnimationAtTimeOnElementWithId);
-    bindMethod("pauseTransitionAtTimeOnElementWithId", &DRTTestRunner::pauseTransitionAtTimeOnElementWithId);
-    bindMethod("queueBackNavigation", &DRTTestRunner::queueBackNavigation);
-    bindMethod("queueForwardNavigation", &DRTTestRunner::queueForwardNavigation);
-    bindMethod("queueLoadingScript", &DRTTestRunner::queueLoadingScript);
-    bindMethod("queueLoad", &DRTTestRunner::queueLoad);
-    bindMethod("queueLoadHTMLString", &DRTTestRunner::queueLoadHTMLString);
-    bindMethod("queueNonLoadingScript", &DRTTestRunner::queueNonLoadingScript);
-    bindMethod("queueReload", &DRTTestRunner::queueReload);
-    bindMethod("removeOriginAccessWhitelistEntry", &DRTTestRunner::removeOriginAccessWhitelistEntry);
-    bindMethod("repaintSweepHorizontally", &DRTTestRunner::repaintSweepHorizontally);
-    bindMethod("resetPageVisibility", &DRTTestRunner::resetPageVisibility);
-    bindMethod("setAcceptsEditing", &DRTTestRunner::setAcceptsEditing);
-    bindMethod("setAllowDisplayOfInsecureContent", &DRTTestRunner::setAllowDisplayOfInsecureContent);
-    bindMethod("setAllowFileAccessFromFileURLs", &DRTTestRunner::setAllowFileAccessFromFileURLs);
-    bindMethod("setAllowRunningOfInsecureContent", &DRTTestRunner::setAllowRunningOfInsecureContent);
-    bindMethod("setAllowUniversalAccessFromFileURLs", &DRTTestRunner::setAllowUniversalAccessFromFileURLs);
-    bindMethod("setAlwaysAcceptCookies", &DRTTestRunner::setAlwaysAcceptCookies);
-    bindMethod("setAuthorAndUserStylesEnabled", &DRTTestRunner::setAuthorAndUserStylesEnabled);
-    bindMethod("setAutofilled", &DRTTestRunner::setAutofilled);
-    bindMethod("setCanOpenWindows", &DRTTestRunner::setCanOpenWindows);
-    bindMethod("setCloseRemainingWindowsWhenComplete", &DRTTestRunner::setCloseRemainingWindowsWhenComplete);
-    bindMethod("setCustomPolicyDelegate", &DRTTestRunner::setCustomPolicyDelegate);
-    bindMethod("setDatabaseQuota", &DRTTestRunner::setDatabaseQuota);
-    bindMethod("setDeferMainResourceDataLoad", &DRTTestRunner::setDeferMainResourceDataLoad);
-    bindMethod("setDomainRelaxationForbiddenForURLScheme", &DRTTestRunner::setDomainRelaxationForbiddenForURLScheme);
-    bindMethod("setAudioData", &DRTTestRunner::setAudioData);
-    bindMethod("setGeolocationPermission", &DRTTestRunner::setGeolocationPermission);
-    bindMethod("setIconDatabaseEnabled", &DRTTestRunner::setIconDatabaseEnabled);
-    bindMethod("setJavaScriptCanAccessClipboard", &DRTTestRunner::setJavaScriptCanAccessClipboard);
-    bindMethod("setMinimumTimerInterval", &DRTTestRunner::setMinimumTimerInterval);
-    bindMethod("setMockDeviceOrientation", &DRTTestRunner::setMockDeviceOrientation);
-    bindMethod("setMockGeolocationPositionUnavailableError", &DRTTestRunner::setMockGeolocationPositionUnavailableError);
-    bindMethod("setMockGeolocationPosition", &DRTTestRunner::setMockGeolocationPosition);
-    bindMethod("setPageVisibility", &DRTTestRunner::setPageVisibility);
-    bindMethod("setPluginsEnabled", &DRTTestRunner::setPluginsEnabled);
-#if ENABLE(POINTER_LOCK)
-    bindMethod("setPointerLockWillRespondAsynchronously", &DRTTestRunner::setPointerLockWillRespondAsynchronously);
-    bindMethod("setPointerLockWillFailSynchronously", &DRTTestRunner::setPointerLockWillFailSynchronously);
-#endif
-    bindMethod("setPopupBlockingEnabled", &DRTTestRunner::setPopupBlockingEnabled);
-    bindMethod("setPOSIXLocale", &DRTTestRunner::setPOSIXLocale);
-    bindMethod("setPrinting", &DRTTestRunner::setPrinting);
-    bindMethod("setScrollbarPolicy", &DRTTestRunner::setScrollbarPolicy);
-    bindMethod("setSelectTrailingWhitespaceEnabled", &DRTTestRunner::setSelectTrailingWhitespaceEnabled);
-    bindMethod("setTextSubpixelPositioning", &DRTTestRunner::setTextSubpixelPositioning);
-    bindMethod("setBackingScaleFactor", &DRTTestRunner::setBackingScaleFactor);
-    bindMethod("setSmartInsertDeleteEnabled", &DRTTestRunner::setSmartInsertDeleteEnabled);
-    bindMethod("setStopProvisionalFrameLoads", &DRTTestRunner::setStopProvisionalFrameLoads);
-    bindMethod("setTabKeyCyclesThroughElements", &DRTTestRunner::setTabKeyCyclesThroughElements);
-    bindMethod("setUserStyleSheetEnabled", &DRTTestRunner::setUserStyleSheetEnabled);
-    bindMethod("setUserStyleSheetLocation", &DRTTestRunner::setUserStyleSheetLocation);
-    bindMethod("setValueForUser", &DRTTestRunner::setValueForUser);
-    bindMethod("setWillSendRequestClearHeader", &DRTTestRunner::setWillSendRequestClearHeader);
-    bindMethod("setWillSendRequestReturnsNull", &DRTTestRunner::setWillSendRequestReturnsNull);
-    bindMethod("setWillSendRequestReturnsNullOnRedirect", &DRTTestRunner::setWillSendRequestReturnsNullOnRedirect);
-    bindMethod("setWindowIsKey", &DRTTestRunner::setWindowIsKey);
-    bindMethod("setXSSAuditorEnabled", &DRTTestRunner::setXSSAuditorEnabled);
-    bindMethod("setAsynchronousSpellCheckingEnabled", &DRTTestRunner::setAsynchronousSpellCheckingEnabled);
-    bindMethod("showWebInspector", &DRTTestRunner::showWebInspector);
-#if ENABLE(NOTIFICATIONS)
-    bindMethod("simulateLegacyWebNotificationClick", &DRTTestRunner::simulateLegacyWebNotificationClick);
-#endif
-    bindMethod("startSpeechInput", &DRTTestRunner::startSpeechInput);
-    bindMethod("testRepaint", &DRTTestRunner::testRepaint);
-    bindMethod("waitForPolicyDelegate", &DRTTestRunner::waitForPolicyDelegate);
-    bindMethod("waitUntilDone", &DRTTestRunner::waitUntilDone);
-    bindMethod("windowCount", &DRTTestRunner::windowCount);
-    bindMethod("setTextDirection", &DRTTestRunner::setTextDirection);
-    bindMethod("setImagesAllowed", &DRTTestRunner::setImagesAllowed);
-    bindMethod("setScriptsAllowed", &DRTTestRunner::setScriptsAllowed);
-    bindMethod("setStorageAllowed", &DRTTestRunner::setStorageAllowed);
-    bindMethod("setPluginsAllowed", &DRTTestRunner::setPluginsAllowed);
-
-    // The following are stubs.
-    bindMethod("abortModal", &DRTTestRunner::abortModal);
-    bindMethod("accessStoredWebScriptObject", &DRTTestRunner::accessStoredWebScriptObject);
-    bindMethod("addDisallowedURL", &DRTTestRunner::addDisallowedURL);
-    bindMethod("applicationCacheDiskUsageForOrigin", &DRTTestRunner::applicationCacheDiskUsageForOrigin);
-    bindMethod("callShouldCloseOnWebView", &DRTTestRunner::callShouldCloseOnWebView);
-    bindMethod("clearAllApplicationCaches", &DRTTestRunner::clearAllApplicationCaches);
-    bindMethod("clearApplicationCacheForOrigin", &DRTTestRunner::clearApplicationCacheForOrigin);
-    bindMethod("clearBackForwardList", &DRTTestRunner::clearBackForwardList);
-    bindMethod("dumpAsWebArchive", &DRTTestRunner::dumpAsWebArchive);
-    bindMethod("keepWebHistory", &DRTTestRunner::keepWebHistory);
-    bindMethod("objCClassNameOf", &DRTTestRunner::objCClassNameOf);
-    bindMethod("setApplicationCacheOriginQuota", &DRTTestRunner::setApplicationCacheOriginQuota);
-    bindMethod("setCallCloseOnWebViews", &DRTTestRunner::setCallCloseOnWebViews);
-    bindMethod("setMainFrameIsFirstResponder", &DRTTestRunner::setMainFrameIsFirstResponder);
-    bindMethod("setPrivateBrowsingEnabled", &DRTTestRunner::setPrivateBrowsingEnabled);
-    bindMethod("setUseDashboardCompatibilityMode", &DRTTestRunner::setUseDashboardCompatibilityMode);
-    bindMethod("storeWebScriptObject", &DRTTestRunner::storeWebScriptObject);
-    bindMethod("deleteAllLocalStorage", &DRTTestRunner::deleteAllLocalStorage);
-    bindMethod("localStorageDiskUsageForOrigin", &DRTTestRunner::localStorageDiskUsageForOrigin);
-    bindMethod("originsWithLocalStorage", &DRTTestRunner::originsWithLocalStorage);
-    bindMethod("deleteLocalStorageForOrigin", &DRTTestRunner::deleteLocalStorageForOrigin);
-    bindMethod("observeStorageTrackerNotifications", &DRTTestRunner::observeStorageTrackerNotifications);
-    bindMethod("syncLocalStorage", &DRTTestRunner::syncLocalStorage);
-    bindMethod("setShouldStayOnPageAfterHandlingBeforeUnload", &DRTTestRunner::setShouldStayOnPageAfterHandlingBeforeUnload);
-    bindMethod("enableFixedLayoutMode", &DRTTestRunner::enableFixedLayoutMode);
-    bindMethod("setFixedLayoutSize", &DRTTestRunner::setFixedLayoutSize);
-    bindMethod("selectionAsMarkup", &DRTTestRunner::selectionAsMarkup);
-    bindMethod("setHasCustomFullScreenBehavior", &DRTTestRunner::setHasCustomFullScreenBehavior);
-    bindMethod("textSurroundingNode", &DRTTestRunner::textSurroundingNode);
-
-    // The fallback method is called when an unknown method is invoked.
-    bindFallbackMethod(&DRTTestRunner::fallbackMethod);
-
-    // Shared properties.
-    // globalFlag is used by a number of layout tests in
-    // LayoutTests\http\tests\security\dataURL.
-    bindProperty("globalFlag", &m_globalFlag);
-    // webHistoryItemCount is used by tests in LayoutTests\http\tests\history
-    bindProperty("webHistoryItemCount", &m_webHistoryItemCount);
-    bindProperty("titleTextDirection", &m_titleTextDirection);
-    bindProperty("platformName", &m_platformName);
-    bindProperty("interceptPostMessage", &m_interceptPostMessage);
-    bindProperty("workerThreadCount", &DRTTestRunner::workerThreadCount);
-    bindMethod("sendWebIntentResponse", &DRTTestRunner::sendWebIntentResponse);
-    bindMethod("deliverWebIntent", &DRTTestRunner::deliverWebIntent);
-}
-
-DRTTestRunner::~DRTTestRunner()
-{
-}
-
-DRTTestRunner::WorkQueue::~WorkQueue()
-{
-    reset();
-}
-
-void DRTTestRunner::WorkQueue::processWorkSoon()
-{
-    if (m_controller->m_shell->webViewHost()->topLoadingFrame())
-        return;
-
-    if (!m_queue.isEmpty()) {
-        // We delay processing queued work to avoid recursion problems.
-        postTask(new WorkQueueTask(this));
-    } else if (!m_controller->m_waitUntilDone)
-        m_controller->m_shell->testFinished();
-}
-
-void DRTTestRunner::WorkQueue::processWork()
-{
-    TestShell* shell = m_controller->m_shell;
-    // Quit doing work once a load is in progress.
-    while (!m_queue.isEmpty()) {
-        bool startedLoad = m_queue.first()->run(shell);
-        delete m_queue.takeFirst();
-        if (startedLoad)
-            return;
-    }
-
-    if (!m_controller->m_waitUntilDone && !shell->webViewHost()->topLoadingFrame())
-        shell->testFinished();
-}
-
-void DRTTestRunner::WorkQueue::reset()
-{
-    m_frozen = false;
-    while (!m_queue.isEmpty())
-        delete m_queue.takeFirst();
-}
-
-void DRTTestRunner::WorkQueue::addWork(WorkItem* work)
-{
-    if (m_frozen) {
-        delete work;
-        return;
-    }
-    m_queue.append(work);
-}
-
-void DRTTestRunner::dumpAsText(const CppArgumentList& arguments, CppVariant* result)
-{
-    m_dumpAsText = true;
-    m_generatePixelResults = false;
-
-    // Optional paramater, describing whether it's allowed to dump pixel results in dumpAsText mode.
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_generatePixelResults = arguments[0].value.boolValue;
-
-    result->setNull();
-}
-
-void DRTTestRunner::dumpDatabaseCallbacks(const CppArgumentList&, CppVariant* result)
-{
-    // Do nothing; we don't use this flag anywhere for now
-    result->setNull();
-}
-
-void DRTTestRunner::dumpEditingCallbacks(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpEditingCallbacks = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpBackForwardList(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpBackForwardList = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpFrameLoadCallbacks(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpFrameLoadCallbacks = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpProgressFinishedCallback(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpProgressFinishedCallback = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpUserGestureInFrameLoadCallbacks(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpUserGestureInFrameLoadCallbacks = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpResourceLoadCallbacks = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpResourceResponseMIMETypes(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpResourceResponseMIMETypes = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpChildFrameScrollPositions = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpChildFramesAsText(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpChildFramesAsText = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpWindowStatusChanges(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpWindowStatusChanges = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpTitleChanges(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpTitleChanges = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpPermissionClientCallbacks(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpPermissionClientCallbacks = true;
-    result->setNull();
-}
-
-void DRTTestRunner::dumpCreateView(const CppArgumentList&, CppVariant* result)
-{
-    m_dumpCreateView = true;
-    result->setNull();
-}
-
-void DRTTestRunner::setAcceptsEditing(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_acceptsEditing = arguments[0].value.boolValue;
-    result->setNull();
-}
-
-void DRTTestRunner::waitUntilDone(const CppArgumentList&, CppVariant* result)
-{
-    if (!webkit_support::BeingDebugged())
-        postDelayedTask(new NotifyDoneTimedOutTask(this), m_shell->layoutTestTimeout());
-    m_waitUntilDone = true;
-    result->setNull();
-}
-
-void DRTTestRunner::notifyDone(const CppArgumentList&, CppVariant* result)
-{
-    // Test didn't timeout. Kill the timeout timer.
-    m_taskList.revokeAll();
-
-    completeNotifyDone(false);
-    result->setNull();
-}
-
-void DRTTestRunner::completeNotifyDone(bool isTimeout)
-{
-    if (m_waitUntilDone && !m_shell->webViewHost()->topLoadingFrame() && m_workQueue.isEmpty()) {
-        if (isTimeout)
-            m_shell->testTimedOut();
-        else
-            m_shell->testFinished();
-    }
-    m_waitUntilDone = false;
-}
-
-class WorkItemBackForward : public DRTTestRunner::WorkItem {
-public:
-    WorkItemBackForward(int distance) : m_distance(distance) { }
-    bool run(TestShell* shell)
-    {
-        shell->goToOffset(m_distance);
-        return true; // FIXME: Did it really start a navigation?
-    }
-
-private:
-    int m_distance;
-};
-
-void DRTTestRunner::queueBackNavigation(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isNumber())
-        m_workQueue.addWork(new WorkItemBackForward(-arguments[0].toInt32()));
-    result->setNull();
-}
-
-void DRTTestRunner::queueForwardNavigation(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isNumber())
-        m_workQueue.addWork(new WorkItemBackForward(arguments[0].toInt32()));
-    result->setNull();
-}
-
-class WorkItemReload : public DRTTestRunner::WorkItem {
-public:
-    bool run(TestShell* shell)
-    {
-        shell->reload();
-        return true;
-    }
-};
-
-void DRTTestRunner::queueReload(const CppArgumentList&, CppVariant* result)
-{
-    m_workQueue.addWork(new WorkItemReload);
-    result->setNull();
-}
-
-class WorkItemLoadingScript : public DRTTestRunner::WorkItem {
-public:
-    WorkItemLoadingScript(const string& script) : m_script(script) { }
-    bool run(TestShell* shell)
-    {
-        shell->webView()->mainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(m_script)));
-        return true; // FIXME: Did it really start a navigation?
-    }
-
-private:
-    string m_script;
-};
-
-class WorkItemNonLoadingScript : public DRTTestRunner::WorkItem {
-public:
-    WorkItemNonLoadingScript(const string& script) : m_script(script) { }
-    bool run(TestShell* shell)
-    {
-        shell->webView()->mainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(m_script)));
-        return false;
-    }
-
-private:
-    string m_script;
-};
-
-void DRTTestRunner::queueLoadingScript(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isString())
-        m_workQueue.addWork(new WorkItemLoadingScript(arguments[0].toString()));
-    result->setNull();
-}
-
-void DRTTestRunner::queueNonLoadingScript(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isString())
-        m_workQueue.addWork(new WorkItemNonLoadingScript(arguments[0].toString()));
-    result->setNull();
-}
-
-class WorkItemLoad : public DRTTestRunner::WorkItem {
-public:
-    WorkItemLoad(const WebURL& url, const WebString& target)
-        : m_url(url)
-        , m_target(target) { }
-    bool run(TestShell* shell)
-    {
-        shell->webViewHost()->loadURLForFrame(m_url, m_target);
-        return true; // FIXME: Did it really start a navigation?
-    }
-
-private:
-    WebURL m_url;
-    WebString m_target;
-};
-
-void DRTTestRunner::queueLoad(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isString()) {
-        // FIXME: Implement WebURL::resolve() and avoid GURL.
-        GURL currentURL = m_shell->webView()->mainFrame()->document().url();
-        GURL fullURL = currentURL.Resolve(arguments[0].toString());
-
-        string target = "";
-        if (arguments.size() > 1 && arguments[1].isString())
-            target = arguments[1].toString();
-
-        m_workQueue.addWork(new WorkItemLoad(fullURL, WebString::fromUTF8(target)));
-    }
-    result->setNull();
-}
-
-class WorkItemLoadHTMLString : public DRTTestRunner::WorkItem  {
-public:
-    WorkItemLoadHTMLString(const std::string& html, const WebURL& baseURL)
-        : m_html(html)
-        , m_baseURL(baseURL) { }
-    WorkItemLoadHTMLString(const std::string& html, const WebURL& baseURL, const WebURL& unreachableURL)
-        : m_html(html)
-        , m_baseURL(baseURL)
-        , m_unreachableURL(unreachableURL) { }
-    bool run(TestShell* shell)
-    {
-        shell->webView()->mainFrame()->loadHTMLString(
-            WebKit::WebData(m_html.data(), m_html.length()), m_baseURL, m_unreachableURL);
-        return true;
-    }
-
-private:
-    std::string m_html;
-    WebURL m_baseURL;
-    WebURL m_unreachableURL;
-};
-
-void DRTTestRunner::queueLoadHTMLString(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isString()) {
-        string html = arguments[0].toString();
-        WebURL baseURL(GURL(""));
-        if (arguments.size() > 1 && arguments[1].isString())
-            baseURL = WebURL(GURL(arguments[1].toString()));
-        if (arguments.size() > 2 && arguments[2].isString())
-            m_workQueue.addWork(new WorkItemLoadHTMLString(html, baseURL, WebURL(GURL(arguments[2].toString()))));
-        else
-            m_workQueue.addWork(new WorkItemLoadHTMLString(html, baseURL));
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::objCIdentityIsEqual(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() < 2) {
-        // This is the best we can do to return an error.
-        result->setNull();
-        return;
-    }
-    result->set(arguments[0].isEqual(arguments[1]));
-}
-
-void DRTTestRunner::reset()
-{
-    if (m_shell) {
-        m_shell->webView()->setZoomLevel(false, 0);
-        m_shell->webView()->setTabKeyCyclesThroughElements(true);
-#if !OS(DARWIN) && !OS(WINDOWS) // Actually, TOOLKIT_GTK
-        // (Constants copied because we can't depend on the header that defined
-        // them from this file.)
-        m_shell->webView()->setSelectionColors(0xff1e90ff, 0xff000000, 0xffc8c8c8, 0xff323232);
-#endif
-        m_shell->webView()->removeAllUserContent();
-        WebKit::WebSize empty;
-        m_shell->webView()->disableAutoResizeMode();
-        m_shell->webViewHost()->setDeviceScaleFactor(1);
-    }
-    m_dumpAsText = false;
-    m_dumpAsAudio = false;
-    m_dumpCreateView = false;
-    m_dumpEditingCallbacks = false;
-    m_dumpFrameLoadCallbacks = false;
-    m_dumpProgressFinishedCallback = false;
-    m_dumpUserGestureInFrameLoadCallbacks = false;
-    m_dumpResourceLoadCallbacks = false;
-    m_dumpResourceResponseMIMETypes = false;
-    m_dumpBackForwardList = false;
-    m_dumpChildFrameScrollPositions = false;
-    m_dumpChildFramesAsText = false;
-    m_dumpWindowStatusChanges = false;
-    m_dumpSelectionRect = false;
-    m_dumpTitleChanges = false;
-    m_dumpPermissionClientCallbacks = false;
-    m_generatePixelResults = true;
-    m_acceptsEditing = true;
-    m_waitUntilDone = false;
-    m_canOpenWindows = false;
-    m_testRepaint = false;
-    m_sweepHorizontally = false;
-    m_shouldAddFileToPasteboard = false;
-    m_stopProvisionalFrameLoads = false;
-    m_deferMainResourceDataLoad = true;
-    m_globalFlag.set(false);
-    m_webHistoryItemCount.set(0);
-    m_titleTextDirection.set("ltr");
-    m_platformName.set("chromium");
-    m_interceptPostMessage.set(false);
-    m_userStyleSheetLocation = WebURL();
-    m_isPrinting = false;
-
-    webkit_support::SetAcceptAllCookies(false);
-    WebSecurityPolicy::resetOriginAccessWhitelists();
-
-    // Reset the default quota for each origin to 5MB
-    webkit_support::SetDatabaseQuota(5 * 1024 * 1024);
-
-    setlocale(LC_ALL, "");
-
-    if (m_closeRemainingWindows)
-        m_shell->closeRemainingWindows();
-    else
-        m_closeRemainingWindows = true;
-    m_workQueue.reset();
-    m_taskList.revokeAll();
-    m_shouldStayOnPageAfterHandlingBeforeUnload = false;
-    m_hasCustomFullScreenBehavior = false;
-#if OS(LINUX) || OS(ANDROID)
-    WebFontRendering::setSubpixelPositioning(false);
-#endif
-}
-
-void DRTTestRunner::locationChangeDone()
-{
-    m_webHistoryItemCount.set(m_shell->navigationEntryCount());
-
-    // No more new work after the first complete load.
-    m_workQueue.setFrozen(true);
-
-    if (!m_waitUntilDone)
-        m_workQueue.processWorkSoon();
-}
-
-void DRTTestRunner::policyDelegateDone()
-{
-    ASSERT(m_waitUntilDone);
-    m_shell->testFinished();
-    m_waitUntilDone = false;
-}
-
-void DRTTestRunner::setCanOpenWindows(const CppArgumentList&, CppVariant* result)
-{
-    m_canOpenWindows = true;
-    result->setNull();
-}
-
-void DRTTestRunner::setTabKeyCyclesThroughElements(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webView()->setTabKeyCyclesThroughElements(arguments[0].toBoolean());
-    result->setNull();
-}
-
-void DRTTestRunner::windowCount(const CppArgumentList&, CppVariant* result)
-{
-    result->set(static_cast<int>(m_shell->windowCount()));
-}
-
-void DRTTestRunner::setCloseRemainingWindowsWhenComplete(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_closeRemainingWindows = arguments[0].value.boolValue;
-    result->setNull();
-}
-
-void DRTTestRunner::setAlwaysAcceptCookies(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0)
-        webkit_support::SetAcceptAllCookies(cppVariantToBool(arguments[0]));
-    result->setNull();
-}
-
-void DRTTestRunner::setAsynchronousSpellCheckingEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webView()->settings()->setAsynchronousSpellCheckingEnabled(cppVariantToBool(arguments[0]));
-    result->setNull();
-}
-
-void DRTTestRunner::showWebInspector(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->showDevTools();
-    result->setNull();
-}
-
-void DRTTestRunner::closeWebInspector(const CppArgumentList& args, CppVariant* result)
-{
-    m_shell->closeDevTools();
-    result->setNull();
-}
-
-void DRTTestRunner::setWindowIsKey(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->setFocus(m_shell->webView(), arguments[0].value.boolValue);
-    result->setNull();
-}
-
-void DRTTestRunner::setUserStyleSheetEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        m_shell->preferences()->userStyleSheetLocation = arguments[0].value.boolValue ? m_userStyleSheetLocation : WebURL();
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setUserStyleSheetLocation(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isString()) {
-        m_userStyleSheetLocation = webkit_support::LocalFileToDataURL(
-            webkit_support::RewriteLayoutTestsURL(arguments[0].toString()));
-        m_shell->preferences()->userStyleSheetLocation = m_userStyleSheetLocation;
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setAuthorAndUserStylesEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        m_shell->preferences()->authorAndUserStylesEnabled = arguments[0].value.boolValue;
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::execCommand(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() <= 0 || !arguments[0].isString())
-        return;
-
-    std::string command = arguments[0].toString();
-    std::string value("");
-    // Ignore the second parameter (which is userInterface)
-    // since this command emulates a manual action.
-    if (arguments.size() >= 3 && arguments[2].isString())
-        value = arguments[2].toString();
-
-    // Note: webkit's version does not return the boolean, so neither do we.
-    m_shell->webView()->focusedFrame()->executeCommand(WebString::fromUTF8(command), WebString::fromUTF8(value));
-}
-
-void DRTTestRunner::isCommandEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() <= 0 || !arguments[0].isString()) {
-        result->setNull();
-        return;
-    }
-
-    std::string command = arguments[0].toString();
-    bool rv = m_shell->webView()->focusedFrame()->isCommandEnabled(WebString::fromUTF8(command));
-    result->set(rv);
-}
-
-void DRTTestRunner::setPopupBlockingEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        bool blockPopups = arguments[0].toBoolean();
-        m_shell->preferences()->javaScriptCanOpenWindowsAutomatically = !blockPopups;
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setImagesAllowed(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webPermissions()->setImagesAllowed(arguments[0].toBoolean());
-    result->setNull();
-}
-
-void DRTTestRunner::setScriptsAllowed(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webPermissions()->setScriptsAllowed(arguments[0].toBoolean());
-    result->setNull();
-}
-
-void DRTTestRunner::setStorageAllowed(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webPermissions()->setStorageAllowed(arguments[0].toBoolean());
-    result->setNull();
-}
-
-void DRTTestRunner::setPluginsAllowed(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webPermissions()->setPluginsAllowed(arguments[0].toBoolean());
-    result->setNull();
-}
-
-void DRTTestRunner::setUseDashboardCompatibilityMode(const CppArgumentList&, CppVariant* result)
-{
-    // We have no need to support Dashboard Compatibility Mode (mac-only)
-    result->setNull();
-}
-
-void DRTTestRunner::clearAllApplicationCaches(const CppArgumentList&, CppVariant* result)
-{
-    // FIXME: Implement to support application cache quotas.
-    result->setNull();
-}
-
-void DRTTestRunner::clearApplicationCacheForOrigin(const CppArgumentList&, CppVariant* result)
-{
-    // FIXME: Implement to support deleting all application cache for an origin.
-    result->setNull();
-}
-
-void DRTTestRunner::setApplicationCacheOriginQuota(const CppArgumentList&, CppVariant* result)
-{
-    // FIXME: Implement to support application cache quotas.
-    result->setNull();
-}
-
-void DRTTestRunner::originsWithApplicationCache(const CppArgumentList&, CppVariant* result)
-{
-    // FIXME: Implement to support getting origins that have application caches.
-    result->setNull();
-}
-
-void DRTTestRunner::applicationCacheDiskUsageForOrigin(const CppArgumentList&, CppVariant* result)
-{
-    // FIXME: Implement to support getting disk usage by all application cache for an origin.
-    result->setNull();
-}
-
-void DRTTestRunner::setScrollbarPolicy(const CppArgumentList&, CppVariant* result)
-{
-    // FIXME: implement.
-    // Currently only has a non-null implementation on QT.
-    result->setNull();
-}
-
-void DRTTestRunner::setCustomPolicyDelegate(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        bool enable = arguments[0].value.boolValue;
-        bool permissive = false;
-        if (arguments.size() > 1 && arguments[1].isBool())
-            permissive = arguments[1].value.boolValue;
-        m_shell->webViewHost()->setCustomPolicyDelegate(enable, permissive);
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::waitForPolicyDelegate(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->webViewHost()->waitForPolicyDelegate();
-    m_waitUntilDone = true;
-    result->setNull();
-}
-
-void DRTTestRunner::setWillSendRequestClearHeader(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isString()) {
-        string header = arguments[0].toString();
-        if (!header.empty())
-            m_shell->webViewHost()->addClearHeader(String::fromUTF8(header.c_str()));
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setWillSendRequestReturnsNullOnRedirect(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webViewHost()->setBlockRedirects(arguments[0].value.boolValue);
-    result->setNull();
-}
-
-void DRTTestRunner::setWillSendRequestReturnsNull(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webViewHost()->setRequestReturnNull(arguments[0].value.boolValue);
-    result->setNull();
-}
-
-void DRTTestRunner::pathToLocalResource(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() <= 0 || !arguments[0].isString())
-        return;
-
-    string url = arguments[0].toString();
-#if OS(WINDOWS)
-    if (!url.find("/tmp/")) {
-        // We want a temp file.
-        const unsigned tempPrefixLength = 5;
-        size_t bufferSize = MAX_PATH;
-        OwnArrayPtr<WCHAR> tempPath = adoptArrayPtr(new WCHAR[bufferSize]);
-        DWORD tempLength = ::GetTempPathW(bufferSize, tempPath.get());
-        if (tempLength + url.length() - tempPrefixLength + 1 > bufferSize) {
-            bufferSize = tempLength + url.length() - tempPrefixLength + 1;
-            tempPath = adoptArrayPtr(new WCHAR[bufferSize]);
-            tempLength = GetTempPathW(bufferSize, tempPath.get());
-            ASSERT(tempLength < bufferSize);
-        }
-        string resultPath(WebString(tempPath.get(), tempLength).utf8());
-        resultPath.append(url.substr(tempPrefixLength));
-        result->set(resultPath);
-        return;
-    }
-#endif
-
-    // Some layout tests use file://// which we resolve as a UNC path. Normalize
-    // them to just file:///.
-    string lowerUrl = url;
-    transform(lowerUrl.begin(), lowerUrl.end(), lowerUrl.begin(), ::tolower);
-    while (!lowerUrl.find("file:////")) {
-        url = url.substr(0, 8) + url.substr(9);
-        lowerUrl = lowerUrl.substr(0, 8) + lowerUrl.substr(9);
-    }
-    result->set(webkit_support::RewriteLayoutTestsURL(url).spec());
-}
-
-void DRTTestRunner::addFileToPasteboardOnDrag(const CppArgumentList&, CppVariant* result)
-{
-    result->setNull();
-    m_shouldAddFileToPasteboard = true;
-}
-
-void DRTTestRunner::setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant* result)
-{
-    result->setNull();
-    m_stopProvisionalFrameLoads = true;
-}
-
-void DRTTestRunner::setSmartInsertDeleteEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webViewHost()->setSmartInsertDeleteEnabled(arguments[0].value.boolValue);
-    result->setNull();
-}
-
-void DRTTestRunner::setSelectTrailingWhitespaceEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webViewHost()->setSelectTrailingWhitespaceEnabled(arguments[0].value.boolValue);
-    result->setNull();
-}
-
-bool DRTTestRunner::pauseAnimationAtTimeOnElementWithId(const WebString& animationName, double time, const WebString& elementId)
-{
-    WebFrame* webFrame = m_shell->webView()->mainFrame();
-    if (!webFrame)
-        return false;
-
-    WebAnimationController* controller = webFrame->animationController();
-    if (!controller)
-        return false;
-
-    WebElement element = webFrame->document().getElementById(elementId);
-    if (element.isNull())
-        return false;
-    return controller->pauseAnimationAtTime(element, animationName, time);
-}
-
-bool DRTTestRunner::pauseTransitionAtTimeOnElementWithId(const WebString& propertyName, double time, const WebString& elementId)
-{
-    WebFrame* webFrame = m_shell->webView()->mainFrame();
-    if (!webFrame)
-        return false;
-
-    WebAnimationController* controller = webFrame->animationController();
-    if (!controller)
-        return false;
-
-    WebElement element = webFrame->document().getElementById(elementId);
-    if (element.isNull())
-        return false;
-    return controller->pauseTransitionAtTime(element, propertyName, time);
-}
-
-bool DRTTestRunner::elementDoesAutoCompleteForElementWithId(const WebString& elementId)
-{
-    WebFrame* webFrame = m_shell->webView()->mainFrame();
-    if (!webFrame)
-        return false;
-
-    WebElement element = webFrame->document().getElementById(elementId);
-    if (element.isNull() || !element.hasTagName("input"))
-        return false;
-
-    WebInputElement inputElement = element.to<WebInputElement>();
-    return inputElement.autoComplete();
-}
-
-int DRTTestRunner::numberOfActiveAnimations()
-{
-    WebFrame* webFrame = m_shell->webView()->mainFrame();
-    if (!webFrame)
-        return -1;
-
-    WebAnimationController* controller = webFrame->animationController();
-    if (!controller)
-        return -1;
-
-    return controller->numberOfActiveAnimations();
-}
-
-void DRTTestRunner::pauseAnimationAtTimeOnElementWithId(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->set(false);
-    if (arguments.size() > 2 && arguments[0].isString() && arguments[1].isNumber() && arguments[2].isString()) {
-        WebString animationName = cppVariantToWebString(arguments[0]);
-        double time = arguments[1].toDouble();
-        WebString elementId = cppVariantToWebString(arguments[2]);
-        result->set(pauseAnimationAtTimeOnElementWithId(animationName, time, elementId));
-    }
-}
-
-void DRTTestRunner::pauseTransitionAtTimeOnElementWithId(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->set(false);
-    if (arguments.size() > 2 && arguments[0].isString() && arguments[1].isNumber() && arguments[2].isString()) {
-        WebString propertyName = cppVariantToWebString(arguments[0]);
-        double time = arguments[1].toDouble();
-        WebString elementId = cppVariantToWebString(arguments[2]);
-        result->set(pauseTransitionAtTimeOnElementWithId(propertyName, time, elementId));
-    }
-}
-
-void DRTTestRunner::elementDoesAutoCompleteForElementWithId(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() != 1 || !arguments[0].isString()) {
-        result->set(false);
-        return;
-    }
-    WebString elementId = cppVariantToWebString(arguments[0]);
-    result->set(elementDoesAutoCompleteForElementWithId(elementId));
-}
-
-void DRTTestRunner::enableAutoResizeMode(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() != 4) {
-        result->set(false);
-        return;
-    }
-    int minWidth = cppVariantToInt32(arguments[0]);
-    int minHeight = cppVariantToInt32(arguments[1]);
-    WebKit::WebSize minSize(minWidth, minHeight);
-
-    int maxWidth = cppVariantToInt32(arguments[2]);
-    int maxHeight = cppVariantToInt32(arguments[3]);
-    WebKit::WebSize maxSize(maxWidth, maxHeight);
-
-    m_shell->webView()->enableAutoResizeMode(minSize, maxSize);
-    result->set(true);
-}
-
-void DRTTestRunner::disableAutoResizeMode(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() !=2) {
-        result->set(false);
-        return;
-    }
-    int newWidth = cppVariantToInt32(arguments[0]);
-    int newHeight = cppVariantToInt32(arguments[1]);
-    WebKit::WebSize newSize(newWidth, newHeight);
-
-    m_shell->webViewHost()->setWindowRect(WebRect(0, 0, newSize.width, newSize.height));
-    m_shell->webView()->disableAutoResizeMode();
-    m_shell->webView()->resize(newSize);
-    result->set(true);
-}
-
-void DRTTestRunner::numberOfActiveAnimations(const CppArgumentList&, CppVariant* result)
-{
-    result->set(numberOfActiveAnimations());
-}
-
-void DRTTestRunner::disableImageLoading(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->preferences()->loadsImagesAutomatically = false;
-    m_shell->applyPreferences();
-    result->setNull();
-}
-
-void DRTTestRunner::setIconDatabaseEnabled(const CppArgumentList&, CppVariant* result)
-{
-    // We don't use the WebKit icon database.
-    result->setNull();
-}
-
-void DRTTestRunner::callShouldCloseOnWebView(const CppArgumentList&, CppVariant* result)
-{
-    result->set(m_shell->webView()->dispatchBeforeUnloadEvent());
-}
-
-#if ENABLE(NOTIFICATIONS)
-void DRTTestRunner::grantWebNotificationPermission(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() != 1 || !arguments[0].isString()) {
-        result->set(false);
-        return;
-    }
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
-    m_shell->notificationPresenter()->grantPermission(cppVariantToWebString(arguments[0]));
-#endif
-    result->set(true);
-}
-
-void DRTTestRunner::denyWebNotificationPermission(const CppArgumentList& arguments, CppVariant* result)
-{
-    // FIXME: Implement.
-    result->setNull();
-}
-
-void DRTTestRunner::removeAllWebNotificationPermissions(const CppArgumentList& arguments, CppVariant* result)
-{
-    // FIXME: Implement.
-    result->setNull();
-}
-
-void DRTTestRunner::simulateWebNotificationClick(const CppArgumentList& arguments, CppVariant* result)
-{
-    // FIXME: Implement.
-    result->setNull();
-}
-
-void DRTTestRunner::simulateLegacyWebNotificationClick(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() != 1 || !arguments[0].isString()) {
-        result->set(false);
-        return;
-    }
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
-    if (m_shell->notificationPresenter()->simulateClick(cppVariantToWebString(arguments[0])))
-        result->set(true);
-    else
-#endif
-        result->set(false);
-}
-#endif
-
-void DRTTestRunner::setDomainRelaxationForbiddenForURLScheme(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() != 2 || !arguments[0].isBool() || !arguments[1].isString())
-        return;
-    m_shell->webView()->setDomainRelaxationForbidden(cppVariantToBool(arguments[0]), cppVariantToWebString(arguments[1]));
-}
-
-void DRTTestRunner::setDeferMainResourceDataLoad(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() == 1)
-        m_deferMainResourceDataLoad = cppVariantToBool(arguments[0]);
-}
-
-//
-// Unimplemented stubs
-//
-
-void DRTTestRunner::dumpAsWebArchive(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::setMainFrameIsFirstResponder(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::dumpSelectionRect(const CppArgumentList& arguments, CppVariant* result)
-{
-    m_dumpSelectionRect = true;
-    result->setNull();
-}
-
-void DRTTestRunner::display(const CppArgumentList& arguments, CppVariant* result)
-{
-    WebViewHost* host = m_shell->webViewHost();
-    const WebKit::WebSize& size = m_shell->webView()->size();
-    WebRect rect(0, 0, size.width, size.height);
-    host->updatePaintRect(rect);
-    host->paintInvalidatedRegion();
-    host->displayRepaintMask();
-    result->setNull();
-}
-
-void DRTTestRunner::displayInvalidatedRegion(const CppArgumentList& arguments, CppVariant* result)
-{
-    WebViewHost* host = m_shell->webViewHost();
-    host->paintInvalidatedRegion();
-    host->displayRepaintMask();
-    result->setNull();
-}
-
-void DRTTestRunner::testRepaint(const CppArgumentList&, CppVariant* result)
-{
-    m_testRepaint = true;
-    result->setNull();
-}
-
-void DRTTestRunner::repaintSweepHorizontally(const CppArgumentList&, CppVariant* result)
-{
-    m_sweepHorizontally = true;
-    result->setNull();
-}
-
-void DRTTestRunner::clearBackForwardList(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::keepWebHistory(const CppArgumentList& arguments,  CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::storeWebScriptObject(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::accessStoredWebScriptObject(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::objCClassNameOf(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::addDisallowedURL(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::setCallCloseOnWebViews(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::setPrivateBrowsingEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-void DRTTestRunner::setJavaScriptCanAccessClipboard(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        m_shell->preferences()->javaScriptCanAccessClipboard = arguments[0].value.boolValue;
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setXSSAuditorEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        m_shell->preferences()->XSSAuditorEnabled = arguments[0].value.boolValue;
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::evaluateScriptInIsolatedWorldAndReturnValue(const CppArgumentList& arguments, CppVariant* result)
-{
-    v8::HandleScope scope;
-    WebVector<v8::Local<v8::Value> > values;
-    if (arguments.size() >= 2 && arguments[0].isNumber() && arguments[1].isString()) {
-        WebScriptSource source(cppVariantToWebString(arguments[1]));
-        // This relies on the iframe focusing itself when it loads. This is a bit
-        // sketchy, but it seems to be what other tests do.
-        m_shell->webView()->focusedFrame()->executeScriptInIsolatedWorld(arguments[0].toInt32(), &source, 1, 1, &values);
-    }
-    result->setNull();
-    // Since only one script was added, only one result is expected
-    if (values.size() == 1 && !values[0].IsEmpty()) {
-        v8::Local<v8::Value> scriptValue = values[0];
-        // FIXME: There are many more types that can be handled.
-        if (scriptValue->IsString()) {
-            v8::String::AsciiValue asciiV8(scriptValue);
-            result->set(std::string(*asciiV8));
-        } else if (scriptValue->IsBoolean())
-            result->set(scriptValue->ToBoolean()->Value());
-        else if (scriptValue->IsNumber()) {
-            if (scriptValue->IsInt32())
-                result->set(scriptValue->ToInt32()->Value());
-            else
-                result->set(scriptValue->ToNumber()->Value());
-        } else if (scriptValue->IsNull())
-              result->setNull();
-    }
-}
-
-void DRTTestRunner::evaluateScriptInIsolatedWorld(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() >= 2 && arguments[0].isNumber() && arguments[1].isString()) {
-        WebScriptSource source(cppVariantToWebString(arguments[1]));
-        // This relies on the iframe focusing itself when it loads. This is a bit
-        // sketchy, but it seems to be what other tests do.
-        m_shell->webView()->focusedFrame()->executeScriptInIsolatedWorld(arguments[0].toInt32(), &source, 1, 1);
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setIsolatedWorldSecurityOrigin(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-
-    if (arguments.size() != 2 || !arguments[0].isNumber() || !(arguments[1].isString() || arguments[1].isNull()))
-        return;
-
-    WebSecurityOrigin origin;
-    if (arguments[1].isString())
-        origin = WebSecurityOrigin::createFromString(cppVariantToWebString(arguments[1]));
-    m_shell->webView()->focusedFrame()->setIsolatedWorldSecurityOrigin(arguments[0].toInt32(), origin);
-}
-
-void DRTTestRunner::setIsolatedWorldContentSecurityPolicy(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-
-    if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isString())
-        return;
-
-    m_shell->webView()->focusedFrame()->setIsolatedWorldContentSecurityPolicy(arguments[0].toInt32(), cppVariantToWebString(arguments[1]));
-}
-
-void DRTTestRunner::setAllowUniversalAccessFromFileURLs(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        m_shell->preferences()->allowUniversalAccessFromFileURLs = arguments[0].value.boolValue;
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setAllowDisplayOfInsecureContent(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webPermissions()->setDisplayingInsecureContentAllowed(arguments[0].toBoolean());
-
-    result->setNull();
-}
-
-void DRTTestRunner::setAllowFileAccessFromFileURLs(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        m_shell->preferences()->allowFileAccessFromFileURLs = arguments[0].value.boolValue;
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::setAllowRunningOfInsecureContent(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool())
-        m_shell->webPermissions()->setRunningInsecureContentAllowed(arguments[0].value.boolValue);
-
-    result->setNull();
-}
-
-// Need these conversions because the format of the value for booleans
-// may vary - for example, on mac "1" and "0" are used for boolean.
-bool DRTTestRunner::cppVariantToBool(const CppVariant& value)
-{
-    if (value.isBool())
-        return value.toBoolean();
-    if (value.isNumber())
-        return value.toInt32();
-    if (value.isString()) {
-        string valueString = value.toString();
-        if (valueString == "true" || valueString == "1")
-            return true;
-        if (valueString == "false" || valueString == "0")
-            return false;
-    }
-    logErrorToConsole("Invalid value. Expected boolean value.");
-    return false;
-}
-
-int32_t DRTTestRunner::cppVariantToInt32(const CppVariant& value)
-{
-    if (value.isNumber())
-        return value.toInt32();
-    if (value.isString()) {
-        string stringSource = value.toString();
-        const char* source = stringSource.data();
-        char* end;
-        long number = strtol(source, &end, 10);
-        if (end == source + stringSource.length() && number >= numeric_limits<int32_t>::min() && number <= numeric_limits<int32_t>::max())
-            return static_cast<int32_t>(number);
-    }
-    logErrorToConsole("Invalid value for preference. Expected integer value.");
-    return 0;
-}
-
-WebString DRTTestRunner::cppVariantToWebString(const CppVariant& value)
-{
-    if (!value.isString()) {
-        logErrorToConsole("Invalid value for preference. Expected string value.");
-        return WebString();
-    }
-    return WebString::fromUTF8(value.toString());
-}
-
-Vector<WebString> DRTTestRunner::cppVariantToWebStringArray(const CppVariant& value)
-{
-    if (!value.isObject()) {
-        logErrorToConsole("Invalid value for preference. Expected object value.");
-        return Vector<WebString>();
-    }
-    Vector<WebString> resultVector;
-    Vector<string> stringVector = value.toStringVector();
-    for (size_t i = 0; i < stringVector.size(); ++i)
-        resultVector.append(WebString::fromUTF8(stringVector[i].c_str()));
-    return resultVector;
-}
-
-// Sets map based on scriptFontPairs, a collapsed vector of pairs of ISO 15924
-// four-letter script code and font such as:
-// { "Arab", "My Arabic Font", "Grek", "My Greek Font" }
-static void setFontMap(WebPreferences::ScriptFontFamilyMap& map, const Vector<WebString>& scriptFontPairs)
-{
-    map.clear();
-    size_t i = 0;
-    while (i + 1 < scriptFontPairs.size()) {
-        const WebString& script = scriptFontPairs[i++];
-        const WebString& font = scriptFontPairs[i++];
-
-        int32_t code = u_getPropertyValueEnum(UCHAR_SCRIPT, script.utf8().data());
-        if (code >= 0 && code < USCRIPT_CODE_LIMIT)
-            map.set(static_cast<int>(code), font);
-    }
-}
-
-void DRTTestRunner::overridePreference(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() != 2 || !arguments[0].isString())
-        return;
-
-    string key = arguments[0].toString();
-    CppVariant value = arguments[1];
-    WebPreferences* prefs = m_shell->preferences();
-    if (key == "WebKitStandardFont")
-        prefs->standardFontFamily = cppVariantToWebString(value);
-    else if (key == "WebKitFixedFont")
-        prefs->fixedFontFamily = cppVariantToWebString(value);
-    else if (key == "WebKitSerifFont")
-        prefs->serifFontFamily = cppVariantToWebString(value);
-    else if (key == "WebKitSansSerifFont")
-        prefs->sansSerifFontFamily = cppVariantToWebString(value);
-    else if (key == "WebKitCursiveFont")
-        prefs->cursiveFontFamily = cppVariantToWebString(value);
-    else if (key == "WebKitFantasyFont")
-        prefs->fantasyFontFamily = cppVariantToWebString(value);
-    else if (key == "WebKitStandardFontMap")
-        setFontMap(prefs->standardFontMap, cppVariantToWebStringArray(value));
-    else if (key == "WebKitFixedFontMap")
-        setFontMap(prefs->fixedFontMap, cppVariantToWebStringArray(value));
-    else if (key == "WebKitSerifFontMap")
-        setFontMap(prefs->serifFontMap, cppVariantToWebStringArray(value));
-    else if (key == "WebKitSansSerifFontMap")
-        setFontMap(prefs->sansSerifFontMap, cppVariantToWebStringArray(value));
-    else if (key == "WebKitCursiveFontMap")
-        setFontMap(prefs->cursiveFontMap, cppVariantToWebStringArray(value));
-    else if (key == "WebKitFantasyFontMap")
-        setFontMap(prefs->fantasyFontMap, cppVariantToWebStringArray(value));
-    else if (key == "WebKitDefaultFontSize")
-        prefs->defaultFontSize = cppVariantToInt32(value);
-    else if (key == "WebKitDefaultFixedFontSize")
-        prefs->defaultFixedFontSize = cppVariantToInt32(value);
-    else if (key == "WebKitMinimumFontSize")
-        prefs->minimumFontSize = cppVariantToInt32(value);
-    else if (key == "WebKitMinimumLogicalFontSize")
-        prefs->minimumLogicalFontSize = cppVariantToInt32(value);
-    else if (key == "WebKitDefaultTextEncodingName")
-        prefs->defaultTextEncodingName = cppVariantToWebString(value);
-    else if (key == "WebKitJavaScriptEnabled")
-        prefs->javaScriptEnabled = cppVariantToBool(value);
-    else if (key == "WebKitWebSecurityEnabled")
-        prefs->webSecurityEnabled = cppVariantToBool(value);
-    else if (key == "WebKitJavaScriptCanOpenWindowsAutomatically")
-        prefs->javaScriptCanOpenWindowsAutomatically = cppVariantToBool(value);
-    else if (key == "WebKitSupportsMultipleWindows")
-        prefs->supportsMultipleWindows = cppVariantToBool(value);
-    else if (key == "WebKitDisplayImagesKey")
-        prefs->loadsImagesAutomatically = cppVariantToBool(value);
-    else if (key == "WebKitPluginsEnabled")
-        prefs->pluginsEnabled = cppVariantToBool(value);
-    else if (key == "WebKitDOMPasteAllowedPreferenceKey")
-        prefs->DOMPasteAllowed = cppVariantToBool(value);
-    else if (key == "WebKitDeveloperExtrasEnabledPreferenceKey")
-        prefs->developerExtrasEnabled = cppVariantToBool(value);
-    else if (key == "WebKitShrinksStandaloneImagesToFit")
-        prefs->shrinksStandaloneImagesToFit = cppVariantToBool(value);
-    else if (key == "WebKitTextAreasAreResizable")
-        prefs->textAreasAreResizable = cppVariantToBool(value);
-    else if (key == "WebKitJavaEnabled")
-        prefs->javaEnabled = cppVariantToBool(value);
-    else if (key == "WebKitUsesPageCachePreferenceKey")
-        prefs->usesPageCache = cppVariantToBool(value);
-    else if (key == "WebKitPageCacheSupportsPluginsPreferenceKey")
-        prefs->pageCacheSupportsPlugins = cppVariantToBool(value);
-    else if (key == "WebKitJavaScriptCanAccessClipboard")
-        prefs->javaScriptCanAccessClipboard = cppVariantToBool(value);
-    else if (key == "WebKitXSSAuditorEnabled")
-        prefs->XSSAuditorEnabled = cppVariantToBool(value);
-    else if (key == "WebKitLocalStorageEnabledPreferenceKey")
-        prefs->localStorageEnabled = cppVariantToBool(value);
-    else if (key == "WebKitOfflineWebApplicationCacheEnabled")
-        prefs->offlineWebApplicationCacheEnabled = cppVariantToBool(value);
-    else if (key == "WebKitTabToLinksPreferenceKey")
-        prefs->tabsToLinks = cppVariantToBool(value);
-    else if (key == "WebKitWebGLEnabled")
-        prefs->experimentalWebGLEnabled = cppVariantToBool(value);
-    else if (key == "WebKitCSSRegionsEnabled")
-        prefs->experimentalCSSRegionsEnabled = cppVariantToBool(value);
-    else if (key == "WebKitCSSGridLayoutEnabled")
-        prefs->experimentalCSSGridLayoutEnabled = cppVariantToBool(value);
-    else if (key == "WebKitHyperlinkAuditingEnabled")
-        prefs->hyperlinkAuditingEnabled = cppVariantToBool(value);
-    else if (key == "WebKitEnableCaretBrowsing")
-        prefs->caretBrowsingEnabled = cppVariantToBool(value);
-    else if (key == "WebKitAllowDisplayingInsecureContent")
-        prefs->allowDisplayOfInsecureContent = cppVariantToBool(value);
-    else if (key == "WebKitAllowRunningInsecureContent")
-        prefs->allowRunningOfInsecureContent = cppVariantToBool(value);
-    else if (key == "WebKitCSSCustomFilterEnabled")
-        prefs->cssCustomFilterEnabled = cppVariantToBool(value);
-    else if (key == "WebKitShouldRespectImageOrientation")
-        prefs->shouldRespectImageOrientation = cppVariantToBool(value);
-    else if (key == "WebKitWebAudioEnabled") {
-        ASSERT(cppVariantToBool(value));
-    } else {
-        string message("Invalid name for preference: ");
-        message.append(key);
-        logErrorToConsole(message);
-    }
-    m_shell->applyPreferences();
-}
-
-void DRTTestRunner::fallbackMethod(const CppArgumentList&, CppVariant* result)
-{
-    printf("CONSOLE MESSAGE: JavaScript ERROR: unknown method called on DRTTestRunner\n");
-    result->setNull();
-}
-
-void DRTTestRunner::addOriginAccessWhitelistEntry(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-
-    if (arguments.size() != 4 || !arguments[0].isString() || !arguments[1].isString()
-        || !arguments[2].isString() || !arguments[3].isBool())
-        return;
-
-    WebKit::WebURL url(GURL(arguments[0].toString()));
-    if (!url.isValid())
-        return;
-
-    WebSecurityPolicy::addOriginAccessWhitelistEntry(
-        url,
-        cppVariantToWebString(arguments[1]),
-        cppVariantToWebString(arguments[2]),
-        arguments[3].toBoolean());
-}
-
-void DRTTestRunner::removeOriginAccessWhitelistEntry(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-
-    if (arguments.size() != 4 || !arguments[0].isString() || !arguments[1].isString()
-        || !arguments[2].isString() || !arguments[3].isBool())
-        return;
-
-    WebKit::WebURL url(GURL(arguments[0].toString()));
-    if (!url.isValid())
-        return;
-
-    WebSecurityPolicy::removeOriginAccessWhitelistEntry(
-        url,
-        cppVariantToWebString(arguments[1]),
-        cppVariantToWebString(arguments[2]),
-        arguments[3].toBoolean());
-}
-
-void DRTTestRunner::clearAllDatabases(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    webkit_support::ClearAllDatabases();
-}
-
-void DRTTestRunner::setDatabaseQuota(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if ((arguments.size() >= 1) && arguments[0].isNumber())
-        webkit_support::SetDatabaseQuota(arguments[0].toInt32());
-}
-
-void DRTTestRunner::setPOSIXLocale(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() == 1 && arguments[0].isString())
-        setlocale(LC_ALL, arguments[0].toString().c_str());
-}
-
-// Parse a single argument. The method returns true if there is an argument that
-// is a number or if there is no argument at all. It returns false only if there
-// is some argument that is not a number. The value parameter is filled with the
-// parsed number, or given the default if there is no argument.
-static bool parseCppArgumentInt32(const CppArgumentList& arguments, int argIndex, int* value, int defaultValue)
-{
-    if (static_cast<int>(arguments.size()) > argIndex) {
-        if (!arguments[argIndex].isNumber())
-            return false;
-        *value = arguments[argIndex].toInt32();
-        return true;
-    }
-    *value = defaultValue;
-    return true;
-}
-
-static bool parsePageNumber(const CppArgumentList& arguments, int argOffset, int* pageNumber)
-{
-    if (static_cast<int>(arguments.size()) > argOffset + 1)
-        return false;
-    if (!parseCppArgumentInt32(arguments, argOffset, pageNumber, 0))
-        return false;
-    return true;
-}
-
-void DRTTestRunner::setPrinting(const CppArgumentList& arguments, CppVariant* result)
-{
-    setIsPrinting(true);
-    result->setNull();
-}
-
-void DRTTestRunner::hasCustomPageSizeStyle(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->set(false);
-    int pageIndex = 0;
-    if (!parsePageNumber(arguments, 0, &pageIndex))
-        return;
-    WebFrame* frame = m_shell->webView()->mainFrame();
-    if (!frame)
-        return;
-    result->set(frame->hasCustomPageSizeStyle(pageIndex));
-}
-
-void DRTTestRunner::numberOfPendingGeolocationPermissionRequests(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    Vector<WebViewHost*> windowList = m_shell->windowList();
-    int numberOfRequests = 0;
-    for (size_t i = 0; i < windowList.size(); i++)
-        numberOfRequests += windowList[i]->geolocationClientMock()->numberOfPendingPermissionRequests();
-    result->set(numberOfRequests);
-}
-
-void DRTTestRunner::logErrorToConsole(const std::string& text)
-{
-    m_shell->webViewHost()->didAddMessageToConsole(
-        WebConsoleMessage(WebConsoleMessage::LevelError, WebString::fromUTF8(text)),
-        WebString(), 0);
-}
-
-void DRTTestRunner::evaluateInWebInspector(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 2 || !arguments[0].isNumber() || !arguments[1].isString())
-        return;
-    m_shell->drtDevToolsAgent()->evaluateInWebInspector(arguments[0].toInt32(), arguments[1].toString());
-}
-
-void DRTTestRunner::forceRedSelectionColors(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    m_shell->webView()->setSelectionColors(0xffee0000, 0xff00ee00, 0xff000000, 0xffc0c0c0);
-}
-
-void DRTTestRunner::addUserScript(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 3 || !arguments[0].isString() || !arguments[1].isBool() || !arguments[2].isBool())
-        return;
-    WebView::addUserScript(
-        cppVariantToWebString(arguments[0]), WebVector<WebString>(),
-        arguments[1].toBoolean() ? WebView::UserScriptInjectAtDocumentStart : WebView::UserScriptInjectAtDocumentEnd,
-        arguments[2].toBoolean() ? WebView::UserContentInjectInAllFrames : WebView::UserContentInjectInTopFrameOnly);
-}
-
-void DRTTestRunner::addUserStyleSheet(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 2 || !arguments[0].isString() || !arguments[1].isBool())
-        return;
-    WebView::addUserStyleSheet(
-        cppVariantToWebString(arguments[0]), WebVector<WebString>(),
-        arguments[1].toBoolean() ? WebView::UserContentInjectInAllFrames : WebView::UserContentInjectInTopFrameOnly,
-        // Chromium defaults to InjectInSubsequentDocuments, but for compatibility
-        // with the other ports' DRTs, we use UserStyleInjectInExistingDocuments.
-        WebView::UserStyleInjectInExistingDocuments);
-}
-
-void DRTTestRunner::setMockDeviceOrientation(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 6 || !arguments[0].isBool() || !arguments[1].isNumber() || !arguments[2].isBool() || !arguments[3].isNumber() || !arguments[4].isBool() || !arguments[5].isNumber())
-        return;
-
-    WebDeviceOrientation orientation;
-    orientation.setNull(false);
-    if (arguments[0].toBoolean())
-        orientation.setAlpha(arguments[1].toDouble());
-    if (arguments[2].toBoolean())
-        orientation.setBeta(arguments[3].toDouble());
-    if (arguments[4].toBoolean())
-        orientation.setGamma(arguments[5].toDouble());
-
-    // Note that we only call setOrientation on the main page's mock since this is all that the
-    // tests require. If necessary, we could get a list of WebViewHosts from the TestShell and
-    // call setOrientation on each DeviceOrientationClientMock.
-    m_shell->webViewHost()->deviceOrientationClientMock()->setOrientation(orientation);
-}
-
-// FIXME: For greater test flexibility, we should be able to set each page's geolocation mock individually.
-// https://bugs.webkit.org/show_bug.cgi?id=52368
-void DRTTestRunner::setGeolocationPermission(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 1 || !arguments[0].isBool())
-        return;
-    Vector<WebViewHost*> windowList = m_shell->windowList();
-    for (size_t i = 0; i < windowList.size(); i++)
-        windowList[i]->geolocationClientMock()->setPermission(arguments[0].toBoolean());
-}
-
-void DRTTestRunner::setMockGeolocationPosition(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 3 || !arguments[0].isNumber() || !arguments[1].isNumber() || !arguments[2].isNumber())
-        return;
-    Vector<WebViewHost*> windowList = m_shell->windowList();
-    for (size_t i = 0; i < windowList.size(); i++)
-        windowList[i]->geolocationClientMock()->setPosition(arguments[0].toDouble(), arguments[1].toDouble(), arguments[2].toDouble());
-}
-
-void DRTTestRunner::setMockGeolocationPositionUnavailableError(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() != 1 || !arguments[0].isString())
-        return;
-    Vector<WebViewHost*> windowList = m_shell->windowList();
-    // FIXME: Benjamin
-    for (size_t i = 0; i < windowList.size(); i++)
-        windowList[i]->geolocationClientMock()->setPositionUnavailableError(cppVariantToWebString(arguments[0]));
-}
-
-void DRTTestRunner::abortModal(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-}
-
-#if ENABLE(INPUT_SPEECH)
-void DRTTestRunner::addMockSpeechInputResult(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 3 || !arguments[0].isString() || !arguments[1].isNumber() || !arguments[2].isString())
-        return;
-
-    if (MockWebSpeechInputController* controller = m_shell->webViewHost()->speechInputControllerMock())
-        controller->addMockRecognitionResult(cppVariantToWebString(arguments[0]), arguments[1].toDouble(), cppVariantToWebString(arguments[2]));
-}
-
-void DRTTestRunner::setMockSpeechInputDumpRect(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 1 || !arguments[0].isBool())
-        return;
-
-    if (MockWebSpeechInputController* controller = m_shell->webViewHost()->speechInputControllerMock())
-        controller->setDumpRect(arguments[0].value.boolValue);
-}
-#endif
-
-#if ENABLE(SCRIPTED_SPEECH)
-void DRTTestRunner::addMockSpeechRecognitionResult(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 2 || !arguments[0].isString() || !arguments[1].isNumber())
-        return;
-
-    if (MockWebSpeechRecognizer* recognizer = m_shell->webViewHost()->mockSpeechRecognizer())
-        recognizer->addMockResult(cppVariantToWebString(arguments[0]), arguments[1].toDouble());
-}
-
-void DRTTestRunner::setMockSpeechRecognitionError(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 2 || !arguments[0].isNumber() || !arguments[1].isString())
-        return;
-
-    if (MockWebSpeechRecognizer* recognizer = m_shell->webViewHost()->mockSpeechRecognizer())
-        recognizer->setError(arguments[0].toInt32(), cppVariantToWebString(arguments[1]));
-}
-
-void DRTTestRunner::wasMockSpeechRecognitionAborted(const CppArgumentList&, CppVariant* result)
-{
-    result->set(false);
-    if (MockWebSpeechRecognizer* recognizer = m_shell->webViewHost()->mockSpeechRecognizer())
-        result->set(recognizer->wasAborted());
-}
-#endif
-
-void DRTTestRunner::startSpeechInput(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() != 1)
-        return;
-
-    WebElement element;
-    if (!WebBindings::getElement(arguments[0].value.objectValue, &element))
-        return;
-
-    WebInputElement* input = toWebInputElement(&element);
-    if (!input)
-        return;
-
-    if (!input->isSpeechInputEnabled())
-        return;
-
-    input->startSpeechInput();
-}
-
-void DRTTestRunner::loseCompositorContext(const CppArgumentList& args, CppVariant*)
-{
-    int numTimes;
-    if (args.size() == 1 || !args[0].isNumber())
-        numTimes = 1;
-    else
-        numTimes = args[0].toInt32();
-    m_shell->webView()->loseCompositorContext(numTimes);
-}
-
-void DRTTestRunner::markerTextForListItem(const CppArgumentList& args, CppVariant* result)
-{
-    WebElement element;
-    if (!WebBindings::getElement(args[0].value.objectValue, &element))
-        result->setNull();
-    else
-        result->set(element.document().frame()->markerTextForListItem(element).utf8());
-}
-
-void DRTTestRunner::findString(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() < 1 || !arguments[0].isString())
-        return;
-
-    WebFindOptions findOptions;
-    bool wrapAround = false;
-    if (arguments.size() >= 2) {
-        Vector<std::string> optionsArray = arguments[1].toStringVector();
-        findOptions.matchCase = true;
-
-        for (size_t i = 0; i < optionsArray.size(); ++i) {
-            const std::string& option = optionsArray[i];
-            // FIXME: Support all the options, so we can run findString.html too.
-            if (option == "CaseInsensitive")
-                findOptions.matchCase = false;
-            else if (option == "Backwards")
-                findOptions.forward = false;
-            else if (option == "WrapAround")
-                wrapAround = true;
-        }
-    }
-
-    WebFrame* frame = m_shell->webView()->mainFrame();
-    const bool findResult = frame->find(0, cppVariantToWebString(arguments[0]), findOptions, wrapAround, 0);
-    result->set(findResult);
-}
-
-void DRTTestRunner::setMinimumTimerInterval(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 1 || !arguments[0].isNumber())
-        return;
-    m_shell->webView()->settings()->setMinimumTimerInterval(arguments[0].toDouble());
-}
-
-void DRTTestRunner::setAutofilled(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() != 2 || !arguments[1].isBool())
-        return;
-
-    WebElement element;
-    if (!WebBindings::getElement(arguments[0].value.objectValue, &element))
-        return;
-
-    WebInputElement* input = toWebInputElement(&element);
-    if (!input)
-        return;
-
-    input->setAutofilled(arguments[1].value.boolValue);
-}
-
-void DRTTestRunner::setValueForUser(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() != 2)
-        return;
-
-    WebElement element;
-    if (!WebBindings::getElement(arguments[0].value.objectValue, &element))
-        return;
-
-    WebInputElement* input = toWebInputElement(&element);
-    if (!input)
-        return;
-
-    input->setValue(cppVariantToWebString(arguments[1]), true);
-}
-
-void DRTTestRunner::deleteAllLocalStorage(const CppArgumentList& arguments, CppVariant*)
-{
-    // Not Implemented
-}
-
-void DRTTestRunner::localStorageDiskUsageForOrigin(const CppArgumentList& arguments, CppVariant*)
-{
-    // Not Implemented
-}
-
-void DRTTestRunner::originsWithLocalStorage(const CppArgumentList& arguments, CppVariant*)
-{
-    // Not Implemented
-}
-
-void DRTTestRunner::deleteLocalStorageForOrigin(const CppArgumentList& arguments, CppVariant*)
-{
-    // Not Implemented
-}
-
-void DRTTestRunner::observeStorageTrackerNotifications(const CppArgumentList&, CppVariant*)
-{
-    // Not Implemented
-}
-
-void DRTTestRunner::syncLocalStorage(const CppArgumentList&, CppVariant*)
-{
-    // Not Implemented
-}
-
-void DRTTestRunner::setShouldStayOnPageAfterHandlingBeforeUnload(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() == 1 && arguments[0].isBool())
-        m_shouldStayOnPageAfterHandlingBeforeUnload = arguments[0].toBoolean();
-
-    result->setNull();
-}
-
-void DRTTestRunner::enableFixedLayoutMode(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() <  1 || !arguments[0].isBool())
-        return;
-    bool enableFixedLayout = arguments[0].toBoolean();
-    m_shell->webView()->enableFixedLayoutMode(enableFixedLayout);
-}
-
-void DRTTestRunner::setFixedLayoutSize(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() <  2 || !arguments[0].isNumber() || !arguments[1].isNumber())
-        return;
-    int width = arguments[0].toInt32();
-    int height = arguments[1].toInt32();
-    m_shell->webView()->setFixedLayoutSize(WebSize(width, height));
-}
-
-void DRTTestRunner::selectionAsMarkup(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->set(m_shell->webView()->mainFrame()->selectionAsMarkup().utf8());
-}
-
-void DRTTestRunner::workerThreadCount(CppVariant* result)
-{
-    result->set(static_cast<int>(WebWorkerInfo::dedicatedWorkerCount()));
-}
-
-void DRTTestRunner::sendWebIntentResponse(const CppArgumentList& arguments, CppVariant* result)
-{
-    v8::HandleScope scope;
-    v8::Local<v8::Context> ctx = m_shell->webView()->mainFrame()->mainWorldScriptContext();
-    result->set(m_shell->webView()->mainFrame()->selectionAsMarkup().utf8());
-    v8::Context::Scope cscope(ctx);
-
-    WebKit::WebIntentRequest* request = m_shell->webViewHost()->currentIntentRequest();
-    if (request->isNull())
-        return;
-
-    if (arguments.size() == 1) {
-        WebKit::WebCString reply = cppVariantToWebString(arguments[0]).utf8();
-        v8::Handle<v8::Value> v8value = v8::String::New(reply.data(), reply.length());
-        request->postResult(WebKit::WebSerializedScriptValue::serialize(v8value));
-    } else {
-        v8::Handle<v8::Value> v8value = v8::String::New("ERROR");
-        request->postFailure(WebKit::WebSerializedScriptValue::serialize(v8value));
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::deliverWebIntent(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() <  3)
-        return;
-
-    v8::HandleScope scope;
-    v8::Local<v8::Context> ctx = m_shell->webView()->mainFrame()->mainWorldScriptContext();
-    result->set(m_shell->webView()->mainFrame()->selectionAsMarkup().utf8());
-    v8::Context::Scope cscope(ctx);
-
-    WebString action = cppVariantToWebString(arguments[0]);
-    WebString type = cppVariantToWebString(arguments[1]);
-    WebKit::WebCString data = cppVariantToWebString(arguments[2]).utf8();
-    WebSerializedScriptValue serializedData = WebSerializedScriptValue::serialize(
-        v8::String::New(data.data(), data.length()));
-
-    WebIntent intent = WebIntent::create(action, type, serializedData.toString(), WebVector<WebString>(), WebVector<WebString>());
-
-    m_shell->webView()->mainFrame()->deliverIntent(intent, 0, m_intentClient.get());
-}
-
-void DRTTestRunner::setTextSubpixelPositioning(const CppArgumentList& arguments, CppVariant* result)
-{
-#if OS(LINUX) || OS(ANDROID)
-    // Since FontConfig doesn't provide a variable to control subpixel positioning, we'll fall back
-    // to setting it globally for all fonts.
-    if (arguments.size() > 0 && arguments[0].isBool())
-        WebFontRendering::setSubpixelPositioning(arguments[0].value.boolValue);
-#endif
-    result->setNull();
-}
-
-class InvokeCallbackTask : public WebMethodTask<DRTTestRunner> {
-public:
-    InvokeCallbackTask(DRTTestRunner* object, PassOwnArrayPtr<CppVariant> callbackArguments, uint32_t numberOfArguments)
-        : WebMethodTask<DRTTestRunner>(object)
-        , m_callbackArguments(callbackArguments)
-        , m_numberOfArguments(numberOfArguments)
-    {
-    }
-
-    virtual void runIfValid()
-    {
-        CppVariant invokeResult;
-        m_callbackArguments[0].invokeDefault(m_callbackArguments.get(), m_numberOfArguments, invokeResult);
-    }
-
-private:
-    OwnArrayPtr<CppVariant> m_callbackArguments;
-    uint32_t m_numberOfArguments;
-};
-
-void DRTTestRunner::setBackingScaleFactor(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() < 2 || !arguments[0].isNumber() || !arguments[1].isObject())
-        return;
-    
-    float value = arguments[0].value.doubleValue;
-    m_shell->webViewHost()->setDeviceScaleFactor(value);
-
-    OwnArrayPtr<CppVariant> callbackArguments = adoptArrayPtr(new CppVariant[1]);
-    callbackArguments[0].set(arguments[1]);
-    result->setNull();
-    postTask(new InvokeCallbackTask(this, callbackArguments.release(), 1));
-}
-
-void DRTTestRunner::setPluginsEnabled(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isBool()) {
-        m_shell->preferences()->pluginsEnabled = arguments[0].toBoolean();
-        m_shell->applyPreferences();
-    }
-    result->setNull();
-}
-
-void DRTTestRunner::resetPageVisibility(const CppArgumentList& arguments, CppVariant* result)
-{
-    m_shell->webView()->setVisibilityState(WebPageVisibilityStateVisible, true);
-}
-
-void DRTTestRunner::setPageVisibility(const CppArgumentList& arguments, CppVariant* result)
-{
-    if (arguments.size() > 0 && arguments[0].isString()) {
-        string newVisibility = arguments[0].toString();
-        if (newVisibility == "visible")
-            m_shell->webView()->setVisibilityState(WebPageVisibilityStateVisible, false);
-        else if (newVisibility == "hidden")
-            m_shell->webView()->setVisibilityState(WebPageVisibilityStateHidden, false);
-        else if (newVisibility == "prerender")
-            m_shell->webView()->setVisibilityState(WebPageVisibilityStatePrerender, false);
-        else if (newVisibility == "preview")
-            m_shell->webView()->setVisibilityState(WebPageVisibilityStatePreview, false);
-    }
-}
-
-void DRTTestRunner::setAutomaticLinkDetectionEnabled(bool)
-{
-    // Not Implemented
-}
-
-void DRTTestRunner::setTextDirection(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() != 1 || !arguments[0].isString())
-        return;
-
-    // Map a direction name to a WebTextDirection value.
-    std::string directionName = arguments[0].toString();
-    WebKit::WebTextDirection direction;
-    if (directionName == "auto")
-        direction = WebKit::WebTextDirectionDefault;
-    else if (directionName == "rtl")
-        direction = WebKit::WebTextDirectionRightToLeft;
-    else if (directionName == "ltr")
-        direction = WebKit::WebTextDirectionLeftToRight;
-    else
-        return;
-
-    m_shell->webView()->setTextDirection(direction);
-}
-
-void DRTTestRunner::setAudioData(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-
-    if (arguments.size() < 1 || !arguments[0].isObject())
-        return;
-
-    // Check that passed-in object is, in fact, an ArrayBufferView.
-    NPObject* npobject = NPVARIANT_TO_OBJECT(arguments[0]);
-    if (!npobject)
-        return;
-    if (!WebBindings::getArrayBufferView(npobject, &m_audioData))
-        return;
-
-    setShouldDumpAsAudio(true);
-}
-
-void DRTTestRunner::setHasCustomFullScreenBehavior(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() <  1 || !arguments[0].isBool())
-        return;
-    m_hasCustomFullScreenBehavior = arguments[0].toBoolean();
-}
-
-#if ENABLE(POINTER_LOCK)
-void DRTTestRunner::didAcquirePointerLock(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->webViewHost()->didAcquirePointerLock();
-    result->setNull();
-}
-
-void DRTTestRunner::didNotAcquirePointerLock(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->webViewHost()->didNotAcquirePointerLock();
-    result->setNull();
-}
-
-void DRTTestRunner::didLosePointerLock(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->webViewHost()->didLosePointerLock();
-    result->setNull();
-}
-
-void DRTTestRunner::setPointerLockWillRespondAsynchronously(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->webViewHost()->setPointerLockWillRespondAsynchronously();
-    result->setNull();
-}
-
-void DRTTestRunner::setPointerLockWillFailSynchronously(const CppArgumentList&, CppVariant* result)
-{
-    m_shell->webViewHost()->setPointerLockWillFailSynchronously();
-    result->setNull();
-}
-#endif
-
-void DRTTestRunner::textSurroundingNode(const CppArgumentList& arguments, CppVariant* result)
-{
-    result->setNull();
-    if (arguments.size() < 4 || !arguments[0].isObject() || !arguments[1].isNumber() || !arguments[2].isNumber() || !arguments[3].isNumber())
-        return;
-
-    WebNode node;
-    if (!WebBindings::getNode(arguments[0].value.objectValue, &node))
-        return;
-
-    if (node.isNull() || !node.isTextNode())
-        return;
-
-    WebPoint point(arguments[1].toInt32(), arguments[2].toInt32());
-    unsigned maxLength = arguments[3].toInt32();
-
-    WebSurroundingText surroundingText;
-    surroundingText.initialize(node, point, maxLength);
-    if (surroundingText.isNull())
-        return;
-
-    result->set(surroundingText.textContent().utf8());
-}
diff --git a/Tools/DumpRenderTree/chromium/DRTTestRunner.h b/Tools/DumpRenderTree/chromium/DRTTestRunner.h
deleted file mode 100644
index c4cb7ac..0000000
--- a/Tools/DumpRenderTree/chromium/DRTTestRunner.h
+++ /dev/null
@@ -1,733 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- * Copyright (C) 2010 Pawel Hajdan (phajdan.jr@chromium.org)
- * Copyright (C) 2012 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
-  DRTTestRunner class:
-  Bound to a JavaScript window.testRunner object using the
-  CppBoundClass::bindToJavascript(), this allows layout tests that are run in
-  the test_shell (or, in principle, any web page loaded into a client app built
-  with this class) to control various aspects of how the tests are run and what
-  sort of output they produce.
-*/
-
-#ifndef DRTTestRunner_h
-#define DRTTestRunner_h
-
-#include "TestRunner/src/TestRunner.h"
-#include "WebDeliveredIntentClient.h"
-#include "WebTask.h"
-#include "WebTextDirection.h"
-#include "platform/WebArrayBufferView.h"
-#include "platform/WebString.h"
-#include "platform/WebURL.h"
-#include <wtf/Deque.h>
-#include <wtf/OwnPtr.h>
-
-namespace WebKit {
-class WebGeolocationClientMock;
-}
-
-namespace webkit_support {
-class ScopedTempDirectory;
-}
-
-
-class TestShell;
-
-class DRTTestRunner : public TestRunner {
-public:
-    // Builds the property and method lists needed to bind this class to a JS
-    // object.
-    DRTTestRunner(TestShell*);
-
-    ~DRTTestRunner();
-
-    // This function sets a flag that tells the test_shell to dump pages as
-    // plain text, rather than as a text representation of the renderer's state.
-    // It takes an optional argument, whether to dump pixels results or not.
-    void dumpAsText(const CppArgumentList&, CppVariant*);
-
-    // This function should set a flag that tells the test_shell to print a line
-    // of descriptive text for each database command. It should take no
-    // arguments, and ignore any that may be present. However, at the moment, we
-    // don't have any DB function that prints messages, so for now this function
-    // doesn't do anything.
-    void dumpDatabaseCallbacks(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to print a line of
-    // descriptive text for each editing command. It takes no arguments, and
-    // ignores any that may be present.
-    void dumpEditingCallbacks(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to print a line of
-    // descriptive text for each frame load callback. It takes no arguments, and
-    // ignores any that may be present.
-    void dumpFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to print a line of
-    // descriptive text for the progress finished callback. It takes no
-    // arguments, and ignores any that may be present.
-    void dumpProgressFinishedCallback(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to print a line of
-    // user gesture status text for some frame load callbacks. It takes no
-    // arguments, and ignores any that may be present.
-    void dumpUserGestureInFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to print out a text
-    // representation of the back/forward list. It ignores all arguments.
-    void dumpBackForwardList(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to print out the
-    // scroll offsets of the child frames. It ignores all.
-    void dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to recursively
-    // dump all frames as plain text if the dumpAsText flag is set.
-    // It takes no arguments, and ignores any that may be present.
-    void dumpChildFramesAsText(const CppArgumentList&, CppVariant*);
-    
-    // This function sets a flag that tells the test_shell to dump a descriptive
-    // line for each resource load callback. It takes no arguments, and ignores
-    // any that may be present.
-    void dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant*);    
-    
-    // This function sets a flag that tells the test_shell to dump the MIME type
-    // for each resource that was loaded. It takes no arguments, and ignores any
-    // that may be present.
-    void dumpResourceResponseMIMETypes(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to dump all calls
-    // to window.status().
-    // It takes no arguments, and ignores any that may be present.
-    void dumpWindowStatusChanges(const CppArgumentList&, CppVariant*);
-
-    // This function sets a flag that tells the test_shell to dump all calls to
-    // WebViewClient::createView().
-    // It takes no arguments, and ignores any that may be present.
-    void dumpCreateView(const CppArgumentList&, CppVariant*);
-
-    // When called with a boolean argument, this sets a flag that controls
-    // whether content-editable elements accept editing focus when an editing
-    // attempt is made. It ignores any additional arguments.
-    void setAcceptsEditing(const CppArgumentList&, CppVariant*);
-
-    // Functions for dealing with windows. By default we block all new windows.
-    void windowCount(const CppArgumentList&, CppVariant*);
-    void setCanOpenWindows(const CppArgumentList&, CppVariant*);
-    void setCloseRemainingWindowsWhenComplete(const CppArgumentList&, CppVariant*);
-
-    // By default, tests end when page load is complete. These methods are used
-    // to delay the completion of the test until notifyDone is called.
-    void waitUntilDone(const CppArgumentList&, CppVariant*);
-    void notifyDone(const CppArgumentList&, CppVariant*);
-
-    // Methods for adding actions to the work queue. Used in conjunction with
-    // waitUntilDone/notifyDone above.
-    void queueBackNavigation(const CppArgumentList&, CppVariant*);
-    void queueForwardNavigation(const CppArgumentList&, CppVariant*);
-    void queueReload(const CppArgumentList&, CppVariant*);
-    void queueLoadingScript(const CppArgumentList&, CppVariant*);
-    void queueNonLoadingScript(const CppArgumentList&, CppVariant*);
-    void queueLoad(const CppArgumentList&, CppVariant*);
-    void queueLoadHTMLString(const CppArgumentList&, CppVariant*);
-
-    // Although this is named "objC" to match the Mac version, it actually tests
-    // the identity of its two arguments in C++.
-    void objCIdentityIsEqual(const CppArgumentList&, CppVariant*);
-
-    // Changes the cookie policy from the default to allow all cookies.
-    void setAlwaysAcceptCookies(const CppArgumentList&, CppVariant*);
-
-    // Changes asynchronous spellchecking flag on the settings.
-    void setAsynchronousSpellCheckingEnabled(const CppArgumentList&, CppVariant*);
-
-    // Shows DevTools window.
-    void showWebInspector(const CppArgumentList&, CppVariant*);
-    void closeWebInspector(const CppArgumentList&, CppVariant*);
-
-    // Gives focus to the window.
-    void setWindowIsKey(const CppArgumentList&, CppVariant*);
-
-    // Method that controls whether pressing Tab key cycles through page elements
-    // or inserts a '\t' char in text area
-    void setTabKeyCyclesThroughElements(const CppArgumentList&, CppVariant*);
-
-    // Passes through to WebPreferences which allows the user to have a custom
-    // style sheet.
-    void setUserStyleSheetEnabled(const CppArgumentList&, CppVariant*);
-    void setUserStyleSheetLocation(const CppArgumentList&, CppVariant*);
-
-    // Passes this preference through to WebSettings.
-    void setAuthorAndUserStylesEnabled(const CppArgumentList&, CppVariant*);
-
-    // Puts Webkit in "dashboard compatibility mode", which is used in obscure
-    // Mac-only circumstances. It's not really necessary, and will most likely
-    // never be used by Chrome, but some layout tests depend on its presence.
-    void setUseDashboardCompatibilityMode(const CppArgumentList&, CppVariant*);
-
-    void setScrollbarPolicy(const CppArgumentList&, CppVariant*);
-
-    // Causes navigation actions just printout the intended navigation instead
-    // of taking you to the page. This is used for cases like mailto, where you
-    // don't actually want to open the mail program.
-    void setCustomPolicyDelegate(const CppArgumentList&, CppVariant*);
-
-    // Delays completion of the test until the policy delegate runs.
-    void waitForPolicyDelegate(const CppArgumentList&, CppVariant*);
-
-    // Causes WillSendRequest to clear certain headers.
-    void setWillSendRequestClearHeader(const CppArgumentList&, CppVariant*);
-
-    // Causes WillSendRequest to block redirects.
-    void setWillSendRequestReturnsNullOnRedirect(const CppArgumentList&, CppVariant*);
-
-    // Causes WillSendRequest to return an empty request.
-    void setWillSendRequestReturnsNull(const CppArgumentList&, CppVariant*);
-
-    // Converts a URL starting with file:///tmp/ to the local mapping.
-    void pathToLocalResource(const CppArgumentList&, CppVariant*);
-
-    // Sets a bool such that when a drag is started, we fill the drag clipboard
-    // with a fake file object.
-    void addFileToPasteboardOnDrag(const CppArgumentList&, CppVariant*);
-
-    // Executes an internal command (superset of document.execCommand() commands).
-    void execCommand(const CppArgumentList&, CppVariant*);
-
-    // Checks if an internal command is currently available.
-    void isCommandEnabled(const CppArgumentList&, CppVariant*);
-
-    // Set the WebPreference that controls webkit's popup blocking.
-    void setPopupBlockingEnabled(const CppArgumentList&, CppVariant*);
-
-    // If true, causes provisional frame loads to be stopped for the remainder of
-    // the test.
-    void setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant*);
-
-    // Enable or disable smart insert/delete. This is enabled by default.
-    void setSmartInsertDeleteEnabled(const CppArgumentList&, CppVariant*);
-
-    // Enable or disable trailing whitespace selection on double click.
-    void setSelectTrailingWhitespaceEnabled(const CppArgumentList&, CppVariant*);
-
-    void pauseAnimationAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
-    void pauseTransitionAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
-    void elementDoesAutoCompleteForElementWithId(const CppArgumentList&, CppVariant*);
-    void enableAutoResizeMode(const CppArgumentList&, CppVariant*);
-    void disableAutoResizeMode(const CppArgumentList&, CppVariant*);
-    void numberOfActiveAnimations(const CppArgumentList&, CppVariant*);
-    void disableImageLoading(const CppArgumentList&, CppVariant*);
-    void setIconDatabaseEnabled(const CppArgumentList&, CppVariant*);
-    void dumpSelectionRect(const CppArgumentList&, CppVariant*);
-
-#if ENABLE(NOTIFICATIONS)
-    // Grants permission for desktop notifications to an origin
-    void grantWebNotificationPermission(const CppArgumentList&, CppVariant*);
-    void denyWebNotificationPermission(const CppArgumentList&, CppVariant*);
-    void removeAllWebNotificationPermissions(const CppArgumentList&, CppVariant*);
-    void simulateWebNotificationClick(const CppArgumentList&, CppVariant*);
-    // Simulates a click on a desktop notification.
-    void simulateLegacyWebNotificationClick(const CppArgumentList&, CppVariant*);
-#endif
-
-    void setDomainRelaxationForbiddenForURLScheme(const CppArgumentList&, CppVariant*);
-    void setDeferMainResourceDataLoad(const CppArgumentList&, CppVariant*);
-
-    // Deals with Web Audio WAV file data.
-    void setAudioData(const CppArgumentList&, CppVariant*);
-    const WebKit::WebArrayBufferView& audioData() const { return m_audioData; } 
-
-    // The following are only stubs.
-    // FIXME: Implement any of these that are needed to pass the layout tests.
-    void dumpAsWebArchive(const CppArgumentList&, CppVariant*);
-    void dumpTitleChanges(const CppArgumentList&, CppVariant*);
-    void setMainFrameIsFirstResponder(const CppArgumentList&, CppVariant*);
-    void display(const CppArgumentList&, CppVariant*);
-    void displayInvalidatedRegion(const CppArgumentList&, CppVariant*);
-    void testRepaint(const CppArgumentList&, CppVariant*);
-    void repaintSweepHorizontally(const CppArgumentList&, CppVariant*);
-    void clearBackForwardList(const CppArgumentList&, CppVariant*);
-    void keepWebHistory(const CppArgumentList&, CppVariant*);
-    void storeWebScriptObject(const CppArgumentList&, CppVariant*);
-    void accessStoredWebScriptObject(const CppArgumentList&, CppVariant*);
-    void objCClassNameOf(const CppArgumentList&, CppVariant*);
-    void addDisallowedURL(const CppArgumentList&, CppVariant*);
-    void callShouldCloseOnWebView(const CppArgumentList&, CppVariant*);
-    void setCallCloseOnWebViews(const CppArgumentList&, CppVariant*);
-    void setPrivateBrowsingEnabled(const CppArgumentList&, CppVariant*);
-
-    void setJavaScriptCanAccessClipboard(const CppArgumentList&, CppVariant*);
-    void setXSSAuditorEnabled(const CppArgumentList&, CppVariant*);
-    void overridePreference(const CppArgumentList&, CppVariant*);
-    void setAllowUniversalAccessFromFileURLs(const CppArgumentList&, CppVariant*);
-    void setAllowDisplayOfInsecureContent(const CppArgumentList&, CppVariant*);
-    void setAllowFileAccessFromFileURLs(const CppArgumentList&, CppVariant*);
-    void setAllowRunningOfInsecureContent(const CppArgumentList&, CppVariant*);
-
-    void evaluateScriptInIsolatedWorldAndReturnValue(const CppArgumentList&, CppVariant*);
-    void evaluateScriptInIsolatedWorld(const CppArgumentList&, CppVariant*);
-    void setIsolatedWorldSecurityOrigin(const CppArgumentList&, CppVariant*);
-    void setIsolatedWorldContentSecurityPolicy(const CppArgumentList&, CppVariant*);
-
-    // The fallback method is called when a nonexistent method is called on
-    // the layout test controller object.
-    // It is usefull to catch typos in the JavaScript code (a few layout tests
-    // do have typos in them) and it allows the script to continue running in
-    // that case (as the Mac does).
-    void fallbackMethod(const CppArgumentList&, CppVariant*);
-
-    // Allows layout tests to manage origins' whitelisting.
-    void addOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
-    void removeOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
-
-    // Clears all application caches.
-    void clearAllApplicationCaches(const CppArgumentList&, CppVariant*);
-    // Clears an application cache for an origin.
-    void clearApplicationCacheForOrigin(const CppArgumentList&, CppVariant*);
-    // Returns origins that have application caches.
-    void originsWithApplicationCache(const CppArgumentList&, CppVariant*);
-    // Sets the application cache quota for the localhost origin.
-    void setApplicationCacheOriginQuota(const CppArgumentList&, CppVariant*);
-    // Returns disk usage by all application caches for an origin.
-    void applicationCacheDiskUsageForOrigin(const CppArgumentList&, CppVariant*);
-
-    // Clears all databases.
-    void clearAllDatabases(const CppArgumentList&, CppVariant*);
-    // Sets the default quota for all origins
-    void setDatabaseQuota(const CppArgumentList&, CppVariant*);
-
-    // Calls setlocale(LC_ALL, ...) for a specified locale.
-    // Resets between tests.
-    void setPOSIXLocale(const CppArgumentList&, CppVariant*);
-
-    // Causes layout to happen as if targetted to printed pages.
-    void setPrinting(const CppArgumentList&, CppVariant*);
-
-    // Returns true if the current page box has custom page size style for
-    // printing.
-    void hasCustomPageSizeStyle(const CppArgumentList&, CppVariant*);
-
-    // Gets the number of geolocation permissions requests pending.
-    void numberOfPendingGeolocationPermissionRequests(const CppArgumentList&, CppVariant*);
-
-    // Allows layout tests to exec scripts at WebInspector side.
-    void evaluateInWebInspector(const CppArgumentList&, CppVariant*);
-
-    // Forces the selection colors for testing under Linux.
-    void forceRedSelectionColors(const CppArgumentList&, CppVariant*);
-
-    // Adds a user script or user style sheet to be injected into new documents.
-    void addUserScript(const CppArgumentList&, CppVariant*);
-    void addUserStyleSheet(const CppArgumentList&, CppVariant*);
-
-    // DeviceOrientation related functions
-    void setMockDeviceOrientation(const CppArgumentList&, CppVariant*);
-
-    // Geolocation related functions.
-    void setGeolocationPermission(const CppArgumentList&, CppVariant*);
-    void setMockGeolocationPosition(const CppArgumentList&, CppVariant*);
-    void setMockGeolocationPositionUnavailableError(const CppArgumentList&, CppVariant*);
-
-    // Empty stub method to keep parity with object model exposed by global DRTTestRunner.
-    void abortModal(const CppArgumentList&, CppVariant*);
-
-    // Speech input related functions.
-#if ENABLE(INPUT_SPEECH)
-    void addMockSpeechInputResult(const CppArgumentList&, CppVariant*);
-    void setMockSpeechInputDumpRect(const CppArgumentList&, CppVariant*);
-#endif
-#if ENABLE(SCRIPTED_SPEECH)
-    void addMockSpeechRecognitionResult(const CppArgumentList&, CppVariant*);
-    void setMockSpeechRecognitionError(const CppArgumentList&, CppVariant*);
-    void wasMockSpeechRecognitionAborted(const CppArgumentList&, CppVariant*);
-#endif
-    void startSpeechInput(const CppArgumentList&, CppVariant*);
-
-    void loseCompositorContext(const CppArgumentList& args, CppVariant* result);
-
-    void markerTextForListItem(const CppArgumentList&, CppVariant*);
-    void findString(const CppArgumentList&, CppVariant*);
-
-    void setMinimumTimerInterval(const CppArgumentList&, CppVariant*);
-
-    // Expects the first argument to be an input element and the second argument to be a boolean.
-    // Forwards the setAutofilled() call to the element.
-    void setAutofilled(const CppArgumentList&, CppVariant*);
-
-    // Expects the first argument to be an input element and the second argument to be a string value.
-    // Forwards the setValueForUser() call to the element.
-    void setValueForUser(const CppArgumentList&, CppVariant*);
-
-    // LocalStorage origin-related
-    void deleteAllLocalStorage(const CppArgumentList&, CppVariant*);
-    void originsWithLocalStorage(const CppArgumentList&, CppVariant*);
-    void deleteLocalStorageForOrigin(const CppArgumentList&, CppVariant*);
-    void localStorageDiskUsageForOrigin(const CppArgumentList&, CppVariant*);
-    void observeStorageTrackerNotifications(const CppArgumentList&, CppVariant*);
-    void syncLocalStorage(const CppArgumentList&, CppVariant*);
-
-    // WebPermissionClient related.
-    void setImagesAllowed(const CppArgumentList&, CppVariant*);
-    void setScriptsAllowed(const CppArgumentList&, CppVariant*);
-    void setStorageAllowed(const CppArgumentList&, CppVariant*);
-    void setPluginsAllowed(const CppArgumentList&, CppVariant*);
-    void dumpPermissionClientCallbacks(const CppArgumentList&, CppVariant*);
-
-    // Enable or disable plugins.
-    void setPluginsEnabled(const CppArgumentList&, CppVariant*);
-
-    // Switch the visibility of the page.
-    void setPageVisibility(const CppArgumentList&, CppVariant*);
-    void resetPageVisibility(const CppArgumentList&, CppVariant*);
-
-    // Changes the direction of the focused element.
-    void setTextDirection(const CppArgumentList&, CppVariant*);
-
-    void setShouldStayOnPageAfterHandlingBeforeUnload(const CppArgumentList&, CppVariant*);
-
-    void enableFixedLayoutMode(const CppArgumentList&, CppVariant*);
-    void setFixedLayoutSize(const CppArgumentList&, CppVariant*);
-
-    void selectionAsMarkup(const CppArgumentList&, CppVariant*);
-
-    // Switch the link detection.
-    void setAutomaticLinkDetectionEnabled(bool);
-
-#if ENABLE(POINTER_LOCK)
-    void didAcquirePointerLock(const CppArgumentList&, CppVariant*);
-    void didNotAcquirePointerLock(const CppArgumentList&, CppVariant*);
-    void didLosePointerLock(const CppArgumentList&, CppVariant*);
-    void setPointerLockWillFailSynchronously(const CppArgumentList&, CppVariant*);
-    void setPointerLockWillRespondAsynchronously(const CppArgumentList&, CppVariant*);
-#endif
-
-    void workerThreadCount(CppVariant*);
-
-    // Expects one string argument for sending successful result, zero
-    // arguments for sending a failure result.
-    void sendWebIntentResponse(const CppArgumentList&, CppVariant*);
-
-    // Cause the web intent to be delivered to this context.
-    void deliverWebIntent(const CppArgumentList&, CppVariant*);
-
-    // Enables or disables subpixel positioning (i.e. fractional X positions for
-    // glyphs) in text rendering on Linux. Since this method changes global
-    // settings, tests that call it must use their own custom font family for
-    // all text that they render. If not, an already-cached style will be used,
-    // resulting in the changed setting being ignored.
-    void setTextSubpixelPositioning(const CppArgumentList&, CppVariant*);
-
-    // Used to set the device scale factor.
-    void setBackingScaleFactor(const CppArgumentList&, CppVariant*);
-
-    // Retrieves the text surrounding a position in a text node.
-    // Expects the first argument to be a text node, the second and third to be
-    // point coordinates relative to the node and the fourth the maximum text
-    // length to retrieve.
-    void textSurroundingNode(const CppArgumentList&, CppVariant*);
-
-public:
-    // The following methods are not exposed to JavaScript.
-    void setWorkQueueFrozen(bool frozen) { m_workQueue.setFrozen(frozen); }
-
-    bool shouldDumpAsAudio() const { return m_dumpAsAudio; } 
-    void setShouldDumpAsAudio(bool dumpAsAudio) { m_dumpAsAudio = dumpAsAudio; } 
-    bool shouldDumpAsText() { return m_dumpAsText; }
-    void setShouldDumpAsText(bool value) { m_dumpAsText = value; }
-    bool shouldDumpEditingCallbacks() { return m_dumpEditingCallbacks; }
-    bool shouldDumpFrameLoadCallbacks() { return m_dumpFrameLoadCallbacks; }
-    void setShouldDumpFrameLoadCallbacks(bool value) { m_dumpFrameLoadCallbacks = value; }
-    bool shouldDumpProgressFinishedCallback() { return m_dumpProgressFinishedCallback; }
-    void setShouldDumpProgressFinishedCallback(bool value) { m_dumpProgressFinishedCallback = value; }
-    bool shouldDumpUserGestureInFrameLoadCallbacks() { return m_dumpUserGestureInFrameLoadCallbacks; }
-    void setShouldDumpUserGestureInFrameLoadCallbacks(bool value) { m_dumpUserGestureInFrameLoadCallbacks = value; }
-    bool shouldDumpResourceLoadCallbacks() {return m_dumpResourceLoadCallbacks; }
-    void setShouldDumpResourceResponseMIMETypes(bool value) { m_dumpResourceResponseMIMETypes = value; }
-    bool shouldDumpResourceResponseMIMETypes() {return m_dumpResourceResponseMIMETypes; }
-    bool shouldDumpStatusCallbacks() { return m_dumpWindowStatusChanges; }
-    bool shouldDumpSelectionRect() { return m_dumpSelectionRect; }
-    bool shouldDumpBackForwardList() { return m_dumpBackForwardList; }
-    bool shouldDumpTitleChanges() { return m_dumpTitleChanges; }
-    bool shouldDumpPermissionClientCallbacks() { return m_dumpPermissionClientCallbacks; }
-    bool shouldDumpChildFrameScrollPositions() { return m_dumpChildFrameScrollPositions; }
-    bool shouldDumpChildFramesAsText() { return m_dumpChildFramesAsText; }
-    bool shouldGeneratePixelResults() { return m_generatePixelResults; }
-    void setShouldGeneratePixelResults(bool value) { m_generatePixelResults = value; }
-    bool shouldDumpCreateView() { return m_dumpCreateView; }
-    bool acceptsEditing() { return m_acceptsEditing; }
-    bool canOpenWindows() { return m_canOpenWindows; }
-    bool shouldAddFileToPasteboard() { return m_shouldAddFileToPasteboard; }
-    bool stopProvisionalFrameLoads() { return m_stopProvisionalFrameLoads; }
-    bool deferMainResourceDataLoad() { return m_deferMainResourceDataLoad; }
-    void setShowDebugLayerTree(bool value) { m_showDebugLayerTree = value; }
-    void setTitleTextDirection(WebKit::WebTextDirection dir)
-    {
-        m_titleTextDirection.set(dir == WebKit::WebTextDirectionLeftToRight ? "ltr" : "rtl");
-    }
-
-    bool shouldInterceptPostMessage()
-    {
-        return m_interceptPostMessage.isBool() && m_interceptPostMessage.toBoolean();
-    }
-
-    void setIsPrinting(bool value) { m_isPrinting = value; }
-    bool isPrinting() { return m_isPrinting; }
-
-    bool testRepaint() const { return m_testRepaint; }
-    bool sweepHorizontally() const { return m_sweepHorizontally; }
-
-    void setHasCustomFullScreenBehavior(const CppArgumentList&, CppVariant*);
-    bool hasCustomFullScreenBehavior() const { return m_hasCustomFullScreenBehavior; }
-
-    // Called by the webview delegate when the toplevel frame load is done.
-    void locationChangeDone();
-
-    // Called by the webview delegate when the policy delegate runs if the
-    // waitForPolicyDelegate was called.
-    void policyDelegateDone();
-
-    // Reinitializes all static values. The reset() method should be called
-    // before the start of each test (currently from TestShell::runFileTest).
-    void reset();
-
-    // A single item in the work queue.
-    class WorkItem {
-    public:
-        virtual ~WorkItem() { }
-
-        // Returns true if this started a load.
-        virtual bool run(TestShell*) = 0;
-    };
-
-    WebTestRunner::WebTaskList* taskList() { return &m_taskList; }
-
-    bool shouldStayOnPageAfterHandlingBeforeUnload() const { return m_shouldStayOnPageAfterHandlingBeforeUnload; }
-
-private:
-    friend class WorkItem;
-    friend class WorkQueue;
-
-    // Helper class for managing events queued by methods like queueLoad or
-    // queueScript.
-    class WorkQueue {
-    public:
-        WorkQueue(DRTTestRunner* controller) : m_frozen(false), m_controller(controller) { }
-        virtual ~WorkQueue();
-        void processWorkSoon();
-
-        // Reset the state of the class between tests.
-        void reset();
-
-        void addWork(WorkItem*);
-
-        void setFrozen(bool frozen) { m_frozen = frozen; }
-        bool isEmpty() { return m_queue.isEmpty(); }
-        WebTestRunner::WebTaskList* taskList() { return &m_taskList; }
-
-    private:
-        void processWork();
-        class WorkQueueTask: public WebTestRunner::WebMethodTask<WorkQueue> {
-        public:
-            WorkQueueTask(WorkQueue* object): WebTestRunner::WebMethodTask<WorkQueue>(object) { }
-            virtual void runIfValid() { m_object->processWork(); }
-        };
-
-        WebTestRunner::WebTaskList m_taskList;
-        Deque<WorkItem*> m_queue;
-        bool m_frozen;
-        DRTTestRunner* m_controller;
-    };
-
-    // Support for overridePreference.
-    bool cppVariantToBool(const CppVariant&);
-    int32_t cppVariantToInt32(const CppVariant&);
-    WebKit::WebString cppVariantToWebString(const CppVariant&);
-    Vector<WebKit::WebString> cppVariantToWebStringArray(const CppVariant&);
-
-    void logErrorToConsole(const std::string&);
-    void completeNotifyDone(bool isTimeout);
-    class NotifyDoneTimedOutTask: public WebTestRunner::WebMethodTask<DRTTestRunner> {
-    public:
-        NotifyDoneTimedOutTask(DRTTestRunner* object): WebTestRunner::WebMethodTask<DRTTestRunner>(object) { }
-        virtual void runIfValid() { m_object->completeNotifyDone(true); }
-    };
-
-
-    bool pauseAnimationAtTimeOnElementWithId(const WebKit::WebString& animationName, double time, const WebKit::WebString& elementId);
-    bool pauseTransitionAtTimeOnElementWithId(const WebKit::WebString& propertyName, double time, const WebKit::WebString& elementId);
-    bool elementDoesAutoCompleteForElementWithId(const WebKit::WebString&);
-    int numberOfActiveAnimations();
-
-    // Used for test timeouts.
-    WebTestRunner::WebTaskList m_taskList;
-
-    // Non-owning pointer. The DRTTestRunner is owned by the host.
-    TestShell* m_shell;
-
-    // If true, the test_shell will produce a plain text dump rather than a
-    // text representation of the renderer.
-    bool m_dumpAsText;
-
-    // If true, the test_shell will output a base64 encoded WAVE file.
-    bool m_dumpAsAudio;
-
-    // If true, the test_shell will write a descriptive line for each editing
-    // command.
-    bool m_dumpEditingCallbacks;
-
-    // If true, the test_shell will draw the bounds of the current selection rect
-    // taking possible transforms of the selection rect into account.
-    bool m_dumpSelectionRect;
-
-    // If true, the test_shell will output a descriptive line for each frame
-    // load callback.
-    bool m_dumpFrameLoadCallbacks;
-
-    // If true, the test_shell will output a descriptive line for the progress
-    // finished callback.
-    bool m_dumpProgressFinishedCallback;
-
-    // If true, the test_shell will output a line of the user gesture status
-    // text for some frame load callbacks.
-    bool m_dumpUserGestureInFrameLoadCallbacks;
-
-    // If true, the test_shell will output a descriptive line for each resource
-    // load callback.
-    bool m_dumpResourceLoadCallbacks;
-    
-    // If true, the test_shell will output the MIME type for each resource that 
-    // was loaded.
-    bool m_dumpResourceResponseMIMETypes;
-
-    // If true, the test_shell will produce a dump of the back forward list as
-    // well.
-    bool m_dumpBackForwardList;
-
-    // If true, the test_shell will print out the child frame scroll offsets as
-    // well.
-    bool m_dumpChildFrameScrollPositions;
-
-    // If true and if dump_as_text_ is true, the test_shell will recursively
-    // dump all frames as plain text.
-    bool m_dumpChildFramesAsText;
-
-    // If true, the test_shell will dump all changes to window.status.
-    bool m_dumpWindowStatusChanges;
-
-    // If true, output a message when the page title is changed.
-    bool m_dumpTitleChanges;
-
-    // If true, output a descriptive line each time a permission client
-    // callback is invoked. Currently only implemented for allowImage.
-    bool m_dumpPermissionClientCallbacks;
-
-    // If true, the test_shell will generate pixel results in dumpAsText mode
-    bool m_generatePixelResults;
-
-    // If true, output a descriptive line each time WebViewClient::createView
-    // is invoked.
-    bool m_dumpCreateView;
-
-    // If true, the element will be treated as editable. This value is returned
-    // from various editing callbacks that are called just before edit operations
-    // are allowed.
-    bool m_acceptsEditing;
-
-    // If true, new windows can be opened via javascript or by plugins. By
-    // default, set to false and can be toggled to true using
-    // setCanOpenWindows().
-    bool m_canOpenWindows;
-
-    // When reset is called, go through and close all but the main test shell
-    // window. By default, set to true but toggled to false using
-    // setCloseRemainingWindowsWhenComplete().
-    bool m_closeRemainingWindows;
-
-    // If true, pixel dump will be produced as a series of 1px-tall, view-wide
-    // individual paints over the height of the view.
-    bool m_testRepaint;
-    // If true and test_repaint_ is true as well, pixel dump will be produced as
-    // a series of 1px-wide, view-tall paints across the width of the view.
-    bool m_sweepHorizontally;
-
-    // If true and a drag starts, adds a file to the drag&drop clipboard.
-    bool m_shouldAddFileToPasteboard;
-
-    // If true, stops provisional frame loads during the
-    // DidStartProvisionalLoadForFrame callback.
-    bool m_stopProvisionalFrameLoads;
-
-    // If true, don't dump output until notifyDone is called.
-    bool m_waitUntilDone;
-
-    // If false, all new requests will not defer the main resource data load.
-    bool m_deferMainResourceDataLoad;
-
-    // If true, we will show extended information in the graphics layer tree.
-    bool m_showDebugLayerTree;
-
-    // If true, layout is to target printed pages.
-    bool m_isPrinting;
-
-    WorkQueue m_workQueue;
-
-    CppVariant m_globalFlag;
-
-    // Bound variable counting the number of top URLs visited.
-    CppVariant m_webHistoryItemCount;
-
-    // Bound variable tracking the directionality of the <title> tag.
-    CppVariant m_titleTextDirection;
-
-    // Bound variable to return the name of this platform (chromium).
-    CppVariant m_platformName;
-
-    // Bound variable to set whether postMessages should be intercepted or not
-    CppVariant m_interceptPostMessage;
-
-    WebKit::WebURL m_userStyleSheetLocation;
-
-    // WAV audio data is stored here.
-    WebKit::WebArrayBufferView m_audioData;
-
-    // Mock object for testing delivering web intents.
-    OwnPtr<WebKit::WebDeliveredIntentClient> m_intentClient;
-
-    bool m_shouldStayOnPageAfterHandlingBeforeUnload;
-
-    // If true, calls to WebViewHost::enter/exitFullScreenNow will not result in 
-    // calls to Document::will/did/Enter/ExitFullScreen.
-    bool m_hasCustomFullScreenBehavior;
-};
-
-#endif // DRTTestRunner_h
diff --git a/Tools/DumpRenderTree/chromium/DumpRenderTree.cpp b/Tools/DumpRenderTree/chromium/DumpRenderTree.cpp
index bbd16af..8038040 100644
--- a/Tools/DumpRenderTree/chromium/DumpRenderTree.cpp
+++ b/Tools/DumpRenderTree/chromium/DumpRenderTree.cpp
@@ -31,7 +31,7 @@
 #include "config.h"
 #include "DumpRenderTree.h"
 
-#include "MockWebKitPlatformSupport.h"
+#include "MockPlatform.h"
 #include "TestShell.h"
 #include "webkit/support/webkit_support.h"
 #include <public/WebCompositorSupport.h>
@@ -59,13 +59,12 @@
 static const char optionEnableThreadedCompositing[] = "--enable-threaded-compositing";
 static const char optionForceCompositingMode[] = "--force-compositing-mode";
 static const char optionEnableAccelerated2DCanvas[] = "--enable-accelerated-2d-canvas";
-static const char optionEnableDeferred2DCanvas[] = "--enable-deferred-2d-canvas";
-static const char optionEnableAcceleratedPainting[] = "--enable-accelerated-painting";
 static const char optionEnableAcceleratedCompositingForVideo[] = "--enable-accelerated-video";
 static const char optionEnableAcceleratedFixedPosition[] = "--enable-accelerated-fixed-position";
-static const char optionUseGraphicsContext3DImplementation[] = "--use-graphics-context-3d-implementation=";
+static const char optionEnableAcceleratedOverflowScroll[] = "--enable-accelerated-overflow-scroll";
 static const char optionEnablePerTilePainting[] = "--enable-per-tile-painting";
 static const char optionEnableDeferredImageDecoding[] = "--enable-deferred-image-decoding";
+static const char optionDisableThreadedHTMLParser[] = "--disable-threaded-html-parser";
 
 static const char optionStressOpt[] = "--stress-opt";
 static const char optionStressDeopt[] = "--stress-deopt";
@@ -78,15 +77,18 @@
 public:
     WebKitSupportTestEnvironment()
     {
-        m_mockPlatform = MockWebKitPlatformSupport::create();
+        m_mockPlatform = MockPlatform::create();
         webkit_support::SetUpTestEnvironment(m_mockPlatform.get());
     }
     ~WebKitSupportTestEnvironment()
     {
         webkit_support::TearDownTestEnvironment();
     }
+
+    MockPlatform* mockPlatform() { return m_mockPlatform.get(); }
+
 private:
-    OwnPtr<MockWebKitPlatformSupport> m_mockPlatform;
+    OwnPtr<MockPlatform> m_mockPlatform;
 };
 
 static void runTest(TestShell& shell, TestParams& params, const string& inputLine, const bool forceDumpPixels)
@@ -129,12 +131,12 @@
     bool startupDialog = false;
     bool acceleratedCompositingForVideoEnabled = false;
     bool acceleratedCompositingForFixedPositionEnabled = false;
+    bool acceleratedCompositingForOverflowScrollEnabled = false;
     bool softwareCompositingEnabled = false;
     bool threadedCompositingEnabled = false;
     bool forceCompositingMode = false;
+    bool threadedHTMLParser = true;
     bool accelerated2DCanvasEnabled = false;
-    bool deferred2DCanvasEnabled = false;
-    bool acceleratedPaintingEnabled = false;
     bool perTilePaintingEnabled = false;
     bool deferredImageDecodingEnabled = false;
     bool stressOpt = false;
@@ -143,7 +145,6 @@
     string javaScriptFlags;
     bool encodeBinary = false;
     bool noTimeout = false;
-    bool acceleratedAnimationEnabled = false;
     for (int i = 1; i < argc; ++i) {
         string argument(argv[i]);
         if (argument == "-")
@@ -168,27 +169,19 @@
             acceleratedCompositingForVideoEnabled = true;
         else if (argument == optionEnableAcceleratedFixedPosition)
             acceleratedCompositingForFixedPositionEnabled = true;
+        else if (argument == optionEnableAcceleratedOverflowScroll)
+            acceleratedCompositingForOverflowScrollEnabled = true;
         else if (argument == optionEnableSoftwareCompositing)
             softwareCompositingEnabled = true;
         else if (argument == optionEnableThreadedCompositing)
             threadedCompositingEnabled = true;
         else if (argument == optionForceCompositingMode)
             forceCompositingMode = true;
+        else if (argument == optionDisableThreadedHTMLParser)
+            threadedHTMLParser = false;
         else if (argument == optionEnableAccelerated2DCanvas)
             accelerated2DCanvasEnabled = true;
-        else if (argument == optionEnableDeferred2DCanvas)
-            deferred2DCanvasEnabled = true;
-        else if (argument == optionEnableAcceleratedPainting)
-            acceleratedPaintingEnabled = true;
-        else if (!argument.find(optionUseGraphicsContext3DImplementation)) {
-            string implementation = argument.substr(strlen(optionUseGraphicsContext3DImplementation));
-            if (!implementation.compare("IN_PROCESS")) 
-              webkit_support::SetGraphicsContext3DImplementation(webkit_support::IN_PROCESS);
-            else if (!implementation.compare("IN_PROCESS_COMMAND_BUFFER")) 
-              webkit_support::SetGraphicsContext3DImplementation(webkit_support::IN_PROCESS_COMMAND_BUFFER);
-            else 
-              fprintf(stderr, "Unknown GraphicContext3D implementation %s\n", implementation.c_str());
-        } else if (argument == optionEnablePerTilePainting)
+        else if (argument == optionEnablePerTilePainting)
             perTilePaintingEnabled = true;
         else if (argument == optionEnableDeferredImageDecoding)
             deferredImageDecodingEnabled = true;
@@ -225,13 +218,12 @@
         shell.setAllowExternalPages(allowExternalPages);
         shell.setAcceleratedCompositingForVideoEnabled(acceleratedCompositingForVideoEnabled);
         shell.setAcceleratedCompositingForFixedPositionEnabled(acceleratedCompositingForFixedPositionEnabled);
+        shell.setAcceleratedCompositingForOverflowScrollEnabled(acceleratedCompositingForOverflowScrollEnabled);
         shell.setSoftwareCompositingEnabled(softwareCompositingEnabled);
         shell.setThreadedCompositingEnabled(threadedCompositingEnabled);
         shell.setForceCompositingMode(forceCompositingMode);
+        shell.setThreadedHTMLParser(threadedHTMLParser);
         shell.setAccelerated2dCanvasEnabled(accelerated2DCanvasEnabled);
-        shell.setDeferred2dCanvasEnabled(deferred2DCanvasEnabled);
-        shell.setAcceleratedPaintingEnabled(acceleratedPaintingEnabled);
-        shell.setAcceleratedAnimationEnabled(acceleratedAnimationEnabled);
         shell.setPerTilePaintingEnabled(perTilePaintingEnabled);
         shell.setDeferredImageDecodingEnabled(deferredImageDecodingEnabled);
         shell.setJavaScriptFlags(javaScriptFlags);
@@ -242,7 +234,7 @@
             // 0x20000000ms is big enough for the purpose to avoid timeout in debugging.
             shell.setLayoutTestTimeout(0x20000000);
         }
-        shell.initialize();
+        shell.initialize(testEnvironment.mockPlatform());
         if (serverMode && !tests.size()) {
 #if OS(ANDROID)
             // Send a signal to host to indicate DRT is ready to process commands.
@@ -279,8 +271,5 @@
         shell.resetTestController();
     }
 
-    // Shutdown WebCompositor after TestShell is destructed properly.
-    WebKit::Platform::current()->compositorSupport()->shutdown();
-
     return EXIT_SUCCESS;
 }
diff --git a/Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.cpp b/Tools/DumpRenderTree/chromium/MockPlatform.cpp
similarity index 67%
rename from Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.cpp
rename to Tools/DumpRenderTree/chromium/MockPlatform.cpp
index 79ae9f2..3e79b78 100644
--- a/Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.cpp
+++ b/Tools/DumpRenderTree/chromium/MockPlatform.cpp
@@ -29,44 +29,54 @@
  */
 
 #include "config.h"
-#include "MockWebKitPlatformSupport.h"
+#include "MockPlatform.h"
 
-#include "MockWebMediaStreamCenter.h"
-#include "MockWebRTCPeerConnectionHandler.h"
+#include "WebTestInterfaces.h"
+#include <public/WebMediaStreamCenter.h>
 #include <wtf/Assertions.h>
 #include <wtf/PassOwnPtr.h>
 
 using namespace WebKit;
+using namespace WebTestRunner;
 
-PassOwnPtr<MockWebKitPlatformSupport> MockWebKitPlatformSupport::create()
+PassOwnPtr<MockPlatform> MockPlatform::create()
 {
-    return adoptPtr(new MockWebKitPlatformSupport());
+    return adoptPtr(new MockPlatform());
 }
 
-MockWebKitPlatformSupport::MockWebKitPlatformSupport()
+MockPlatform::MockPlatform()
 {
 }
 
-MockWebKitPlatformSupport::~MockWebKitPlatformSupport()
+MockPlatform::~MockPlatform()
 {
 }
 
-void MockWebKitPlatformSupport::cryptographicallyRandomValues(unsigned char*, size_t)
+void MockPlatform::setInterfaces(WebTestInterfaces* interfaces)
+{
+    m_interfaces = interfaces;
+}
+
+void MockPlatform::cryptographicallyRandomValues(unsigned char*, size_t)
 {
     CRASH();
 }
 
 #if ENABLE(MEDIA_STREAM)
-WebMediaStreamCenter* MockWebKitPlatformSupport::createMediaStreamCenter(WebMediaStreamCenterClient* client)
+WebMediaStreamCenter* MockPlatform::createMediaStreamCenter(WebMediaStreamCenterClient* client)
 {
+    ASSERT(m_interfaces);
+
     if (!m_mockMediaStreamCenter)
-        m_mockMediaStreamCenter = adoptPtr(new MockWebMediaStreamCenter(client));
+        m_mockMediaStreamCenter = adoptPtr(m_interfaces->createMediaStreamCenter(client));
 
     return m_mockMediaStreamCenter.get();
 }
 
-WebRTCPeerConnectionHandler* MockWebKitPlatformSupport::createRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client)
+WebRTCPeerConnectionHandler* MockPlatform::createRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client)
 {
-    return new MockWebRTCPeerConnectionHandler(client);
+    ASSERT(m_interfaces);
+
+    return m_interfaces->createWebRTCPeerConnectionHandler(client);
 }
 #endif // ENABLE(MEDIA_STREAM)
diff --git a/Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.h b/Tools/DumpRenderTree/chromium/MockPlatform.h
similarity index 85%
rename from Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.h
rename to Tools/DumpRenderTree/chromium/MockPlatform.h
index 1e54438..68b87d2 100644
--- a/Tools/DumpRenderTree/chromium/MockWebKitPlatformSupport.h
+++ b/Tools/DumpRenderTree/chromium/MockPlatform.h
@@ -28,18 +28,23 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef MockWebKitPlatformSupport_h
-#define MockWebKitPlatformSupport_h
+#ifndef MockPlatform_h
+#define MockPlatform_h
 
 #include <public/Platform.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
 
-class MockWebKitPlatformSupport : public WebKit::Platform {
-public:
-    static PassOwnPtr<MockWebKitPlatformSupport> create();
-    ~MockWebKitPlatformSupport();
+namespace WebTestRunner {
+class WebTestInterfaces;
+}
 
+class MockPlatform : public WebKit::Platform {
+public:
+    static PassOwnPtr<MockPlatform> create();
+    ~MockPlatform();
+
+    void setInterfaces(WebTestRunner::WebTestInterfaces*);
     virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length) OVERRIDE;
 
 #if ENABLE(MEDIA_STREAM)
@@ -48,11 +53,13 @@
 #endif // ENABLE(MEDIA_STREAM)
 
 private:
-    MockWebKitPlatformSupport();
+    MockPlatform();
+
+    WebTestRunner::WebTestInterfaces* m_interfaces;
 
 #if ENABLE(MEDIA_STREAM)
     OwnPtr<WebKit::WebMediaStreamCenter> m_mockMediaStreamCenter;
 #endif // ENABLE(MEDIA_STREAM)
 };
 
-#endif // MockWebKitPlatformSupport_h
+#endif // MockPlatform_h
diff --git a/Tools/DumpRenderTree/chromium/MockWebPrerenderingSupport.h b/Tools/DumpRenderTree/chromium/MockWebPrerenderingSupport.h
index b5d4af5..570230c 100644
--- a/Tools/DumpRenderTree/chromium/MockWebPrerenderingSupport.h
+++ b/Tools/DumpRenderTree/chromium/MockWebPrerenderingSupport.h
@@ -31,7 +31,7 @@
 #ifndef MockWebPrerenderingSupport_h
 #define MockWebPrerenderingSupport_h
 
-#include "third_party/WebKit/Source/Platform/chromium/public/WebPrerenderingSupport.h"
+#include <public/WebPrerenderingSupport.h>
 
 class MockWebPrerenderingSupport : public WebKit::WebPrerenderingSupport {
 public:
diff --git a/Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp b/Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp
deleted file mode 100644
index 88143c0..0000000
--- a/Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "MockWebSpeechRecognizer.h"
-
-#if ENABLE(SCRIPTED_SPEECH)
-
-#include "Task.h"
-#include "WebSpeechRecognitionResult.h"
-#include "WebSpeechRecognizerClient.h"
-
-using namespace WebKit;
-using namespace WebTestRunner;
-
-namespace {
-
-// Task class for calling a client function that does not take any parameters.
-typedef void (WebSpeechRecognizerClient::*ClientFunctionPointer)(const WebSpeechRecognitionHandle&);
-class ClientCallTask : public MockWebSpeechRecognizer::Task {
-public:
-    ClientCallTask(MockWebSpeechRecognizer* mock, ClientFunctionPointer function)
-        : MockWebSpeechRecognizer::Task(mock)
-        , m_function(function)
-    {
-    }
-
-    virtual void run() OVERRIDE { (m_recognizer->client()->*m_function)(m_recognizer->handle()); }
-
-private:
-    ClientFunctionPointer m_function;
-};
-
-// Task for delivering a result event.
-class ResultTask : public MockWebSpeechRecognizer::Task {
-public:
-    ResultTask(MockWebSpeechRecognizer* mock, const WebString transcript, float confidence)
-        : MockWebSpeechRecognizer::Task(mock)
-        , m_transcript(transcript)
-        , m_confidence(confidence)
-    {
-    }
-
-    virtual void run() OVERRIDE
-    {
-        WebVector<WebString> transcripts(static_cast<size_t>(1));
-        WebVector<float> confidences(static_cast<size_t>(1));
-        transcripts[0] = m_transcript;
-        confidences[0] = m_confidence;
-        WebSpeechRecognitionResult res;
-        res.assign(transcripts, confidences, true);
-
-        m_recognizer->client()->didReceiveResult(m_recognizer->handle(), res, 0, WebVector<WebSpeechRecognitionResult>());
-    }
-
-private:
-    WebString m_transcript;
-    float m_confidence;
-};
-
-// Task for delivering a nomatch event.
-class NoMatchTask : public MockWebSpeechRecognizer::Task {
-public:
-    NoMatchTask(MockWebSpeechRecognizer* mock) : MockWebSpeechRecognizer::Task(mock) { }
-    virtual void run() OVERRIDE { m_recognizer->client()->didReceiveNoMatch(m_recognizer->handle(), WebSpeechRecognitionResult()); }
-};
-
-// Task for delivering an error event.
-class ErrorTask : public MockWebSpeechRecognizer::Task {
-public:
-    ErrorTask(MockWebSpeechRecognizer* mock, int code, const WebString& message)
-        : MockWebSpeechRecognizer::Task(mock)
-        , m_code(code)
-        , m_message(message)
-    {
-    }
-
-    virtual void run() OVERRIDE { m_recognizer->client()->didReceiveError(m_recognizer->handle(), m_message, static_cast<WebSpeechRecognizerClient::ErrorCode>(m_code)); }
-
-private:
-    int m_code;
-    WebString m_message;
-};
-
-} // namespace
-
-PassOwnPtr<MockWebSpeechRecognizer> MockWebSpeechRecognizer::create()
-{
-    return adoptPtr(new MockWebSpeechRecognizer());
-}
-
-void MockWebSpeechRecognizer::start(const WebSpeechRecognitionHandle& handle, const WebSpeechRecognitionParams& params, WebSpeechRecognizerClient* client)
-{
-    m_wasAborted = false;
-    m_handle = handle;
-    m_client = client;
-
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didStart)));
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartAudio)));
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartSound)));
-
-    if (!m_mockTranscripts.isEmpty()) {
-        ASSERT(m_mockTranscripts.size() == m_mockConfidences.size());
-
-        for (size_t i = 0; i < m_mockTranscripts.size(); ++i)
-            m_taskQueue.append(adoptPtr(new ResultTask(this, m_mockTranscripts[i], m_mockConfidences[i])));
-
-        m_mockTranscripts.clear();
-        m_mockConfidences.clear();
-    } else
-        m_taskQueue.append(adoptPtr(new NoMatchTask(this)));
-
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndSound)));
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndAudio)));
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd)));
-
-    startTaskQueue();
-}
-
-void MockWebSpeechRecognizer::stop(const WebSpeechRecognitionHandle& handle, WebSpeechRecognizerClient* client)
-{
-    m_handle = handle;
-    m_client = client;
-
-    // FIXME: Implement.
-    ASSERT_NOT_REACHED();
-}
-
-void MockWebSpeechRecognizer::abort(const WebSpeechRecognitionHandle& handle, WebSpeechRecognizerClient* client)
-{
-    m_handle = handle;
-    m_client = client;
-
-    clearTaskQueue();
-    m_wasAborted = true;
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd)));
-    startTaskQueue();
-}
-
-void MockWebSpeechRecognizer::addMockResult(const WebString& transcript, float confidence)
-{
-    m_mockTranscripts.append(transcript);
-    m_mockConfidences.append(confidence);
-}
-
-void MockWebSpeechRecognizer::setError(int code, const WebString& message)
-{
-    clearTaskQueue();
-    m_taskQueue.append(adoptPtr(new ErrorTask(this, code, message)));
-    m_taskQueue.append(adoptPtr(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd)));
-    startTaskQueue();
-}
-
-MockWebSpeechRecognizer::MockWebSpeechRecognizer()
-    : m_wasAborted(false)
-    , m_taskQueueRunning(false)
-{
-}
-
-MockWebSpeechRecognizer::~MockWebSpeechRecognizer()
-{
-}
-
-void MockWebSpeechRecognizer::startTaskQueue()
-{
-    if (m_taskQueueRunning)
-        return;
-    postTask(new StepTask(this));
-    m_taskQueueRunning = true;
-}
-
-void MockWebSpeechRecognizer::clearTaskQueue()
-{
-    m_taskQueue.clear();
-    m_taskQueueRunning = false;
-}
-
-void MockWebSpeechRecognizer::StepTask::runIfValid()
-{
-    if (m_object->m_taskQueue.isEmpty()) {
-        m_object->m_taskQueueRunning = false;
-        return;
-    }
-
-    OwnPtr<Task> task = m_object->m_taskQueue[0].release();
-    m_object->m_taskQueue.remove(0);
-    task->run();
-
-    if (m_object->m_taskQueue.isEmpty()) {
-        m_object->m_taskQueueRunning = false;
-        return;
-    }
-
-    postTask(new StepTask(m_object));
-}
-
-#endif // ENABLE(SCRIPTED_SPEECH)
diff --git a/Tools/DumpRenderTree/chromium/Task.cpp b/Tools/DumpRenderTree/chromium/Task.cpp
index a619017..4d5144f 100644
--- a/Tools/DumpRenderTree/chromium/Task.cpp
+++ b/Tools/DumpRenderTree/chromium/Task.cpp
@@ -33,8 +33,8 @@
 
 #include "WebKit.h"
 #include "WebTask.h"
-#include "platform/WebKitPlatformSupport.h"
 #include "webkit/support/webkit_support.h"
+#include <public/Platform.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
 
@@ -70,7 +70,7 @@
 
 void postTask(WebTask* task)
 {
-    webKitPlatformSupport()->callOnMainThread(invokeTask, static_cast<void*>(task));
+    Platform::current()->callOnMainThread(invokeTask, static_cast<void*>(task));
 }
 
 void postDelayedTask(WebTask* task, long long ms)
diff --git a/Tools/DumpRenderTree/chromium/TestNavigationController.h b/Tools/DumpRenderTree/chromium/TestNavigationController.h
index f23a2ae..145fc52 100644
--- a/Tools/DumpRenderTree/chromium/TestNavigationController.h
+++ b/Tools/DumpRenderTree/chromium/TestNavigationController.h
@@ -33,9 +33,9 @@
 
 #include "WebDataSource.h"
 #include "WebHistoryItem.h"
-#include "platform/WebString.h"
-#include "platform/WebURL.h"
 #include "webkit/support/webkit_support.h"
+#include <public/WebString.h>
+#include <public/WebURL.h>
 #include <string>
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebAccessibilityController.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebAccessibilityController.h
deleted file mode 100644
index f2ec508..0000000
--- a/Tools/DumpRenderTree/chromium/TestRunner/public/WebAccessibilityController.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebAccessibilityController_h
-#define WebAccessibilityController_h
-
-namespace WebKit {
-class WebAccessibilityObject;
-}
-
-namespace WebTestRunner {
-
-class AccessibilityController;
-
-class WebAccessibilityController {
-public:
-#if WEBTESTRUNNER_IMPLEMENTATION
-    explicit WebAccessibilityController(AccessibilityController*);
-#endif
-
-    void setFocusedElement(const WebKit::WebAccessibilityObject&);
-    void notificationReceived(const WebKit::WebAccessibilityObject& target, const char* notificationName);
-    bool shouldLogAccessibilityEvents();
-
-private:
-    AccessibilityController* m_private;
-};
-
-}
-
-#endif // WebAccessibilityController_h
diff --git a/Tools/DumpRenderTree/chromium/WebPreferences.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebPreferences.h
similarity index 76%
rename from Tools/DumpRenderTree/chromium/WebPreferences.h
rename to Tools/DumpRenderTree/chromium/TestRunner/public/WebPreferences.h
index 36fcd19..bfce5af 100644
--- a/Tools/DumpRenderTree/chromium/WebPreferences.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/public/WebPreferences.h
@@ -31,16 +31,18 @@
 #ifndef WebPreferences_h
 #define WebPreferences_h
 
-#include "WebSettings.h"
-#include "platform/WebString.h"
-#include "platform/WebURL.h"
-#include <wtf/HashMap.h>
+#include "Platform/chromium/public/WebString.h"
+#include "Platform/chromium/public/WebURL.h"
+#include "WebKit/chromium/public/WebSettings.h"
+#include "WebTestCommon.h"
 
 namespace WebKit {
 class WebView;
 }
 
-struct WebPreferences {
+namespace WebTestRunner {
+
+struct WEBTESTRUNNER_EXPORT WebPreferences {
     WebKit::WebString standardFontFamily;
     WebKit::WebString fixedFontFamily;
     WebKit::WebString serifFontFamily;
@@ -48,25 +50,6 @@
     WebKit::WebString cursiveFontFamily;
     WebKit::WebString fantasyFontFamily;
 
-    // UScriptCode uses -1 and 0 for UScriptInvalidCode and UScriptCommon.
-    // We need to use -2 and -3 for empty value and deleted value.
-    // (See WebCore::ScriptFontFamilyMap)
-    struct UScriptCodeHashTraits : WTF::GenericHashTraits<int> {
-        static const bool emptyValueIsZero = false;
-        static int emptyValue() { return -2; }
-        static void constructDeletedValue(int& slot) { slot = -3; }
-        static bool isDeletedValue(int value) { return value == -3; }
-    };
-
-    // Map of UScriptCode to font such as USCRIPT_ARABIC to "My Arabic Font".
-    typedef HashMap<int, WebKit::WebString, DefaultHash<int>::Hash, UScriptCodeHashTraits> ScriptFontFamilyMap;
-    ScriptFontFamilyMap standardFontMap;
-    ScriptFontFamilyMap fixedFontMap;
-    ScriptFontFamilyMap serifFontMap;
-    ScriptFontFamilyMap sansSerifFontMap;
-    ScriptFontFamilyMap cursiveFontMap;
-    ScriptFontFamilyMap fantasyFontMap;
-
     int defaultFontSize;
     int defaultFixedFontSize;
     int minimumFontSize;
@@ -106,20 +89,26 @@
     bool caretBrowsingEnabled;
     bool acceleratedCompositingForVideoEnabled;
     bool acceleratedCompositingForFixedPositionEnabled;
+    bool acceleratedCompositingForOverflowScrollEnabled;
     bool acceleratedCompositingEnabled;
     bool forceCompositingMode;
+    bool threadedHTMLParser;
     bool accelerated2dCanvasEnabled;
-    bool deferred2dCanvasEnabled;
-    bool acceleratedPaintingEnabled;
+    bool perTilePaintingEnabled;
+    bool acceleratedAnimationEnabled;
     bool deferredImageDecodingEnabled;
     bool mediaPlaybackRequiresUserGesture;
     bool mockScrollbarsEnabled;
     bool cssCustomFilterEnabled;
     bool shouldRespectImageOrientation;
+    bool asynchronousSpellCheckingEnabled;
+    bool touchDragDropEnabled;
 
     WebPreferences() { reset(); }
     void reset();
     void applyTo(WebKit::WebView*);
 };
 
+}
+
 #endif // WebPreferences_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTask.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTask.h
index ef73e17..c3bc09c 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTask.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTask.h
@@ -31,13 +31,16 @@
 #ifndef WebTask_h
 #define WebTask_h
 
+#include "WebTestCommon.h"
+#include <vector>
+
 namespace WebTestRunner {
 
 class WebTaskList;
 
 // WebTask represents a task which can run by WebTestDelegate::postTask() or
 // WebTestDelegate::postDelayedTask().
-class WebTask {
+class WEBTESTRUNNER_EXPORT WebTask {
 public:
     explicit WebTask(WebTaskList*);
     virtual ~WebTask();
@@ -51,7 +54,7 @@
     WebTaskList* m_taskList;
 };
 
-class WebTaskList {
+class WEBTESTRUNNER_EXPORT WebTaskList {
 public:
     WebTaskList();
     ~WebTaskList();
@@ -60,8 +63,7 @@
     void revokeAll();
 
 private:
-    class Private;
-    Private* m_private;
+    std::vector<WebTask*> m_tasks;
 };
 
 // A task containing an object pointer of class T. Derived classes should
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebEventSender.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h
similarity index 63%
copy from Tools/DumpRenderTree/chromium/TestRunner/public/WebEventSender.h
copy to Tools/DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h
index 47c59ef..a3442c6 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/public/WebEventSender.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestCommon.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Google Inc. All rights reserved.
+ * Copyright (C) 2013 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -28,32 +28,42 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebEventSender_h
-#define WebEventSender_h
+#ifndef WebTestCommon_h
+#define WebTestCommon_h
 
-#include "WebKit/chromium/public/WebDragOperation.h"
+// -----------------------------------------------------------------------------
+// Default configuration
 
-namespace WebKit {
-class WebDragData;
-}
-
-namespace WebTestRunner {
-
-class EventSender;
-
-class WebEventSender {
-public:
-#if WEBTESTRUNNER_IMPLEMENTATION
-    explicit WebEventSender(EventSender*);
+#if !defined(WEBTESTRUNNER_IMPLEMENTATION)
+#define WEBTESTRUNNER_IMPLEMENTATION 0
 #endif
 
-    // Simulate drag&drop system call.
-    void doDragDrop(const WebKit::WebDragData&, WebKit::WebDragOperationsMask);
+// -----------------------------------------------------------------------------
+// Exported symbols need to be annotated with WEBTESTRUNNER_EXPORT
 
-private:
-    EventSender* m_private;
-};
+#if defined(WEBTESTRUNNER_DLL)
 
-}
+#if defined(WIN32)
+#if WEBTESTRUNNER_IMPLEMENTATION
+#define WEBTESTRUNNER_EXPORT __declspec(dllexport)
+#else
+#define WEBTESTRUNNER_EXPORT __declspec(dllimport)
+#endif
 
-#endif // WebEventSender_h
+#else // defined(WIN32)
+
+#if WEBTESTRUNNER_IMPLEMENTATION
+#define WEBTESTRUNNER_EXPORT __attribute__((visibility("default")))
+#else
+#define WEBTESTRUNNER_EXPORT
+#endif
+
+#endif
+
+#else // defined(WEBTESTRUNNER_DLL)
+
+#define WEBTESTRUNNER_EXPORT
+
+#endif
+
+#endif // WebTestCommon_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h
index ab47d4f..f797972 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestDelegate.h
@@ -32,25 +32,36 @@
 #define WebTestDelegate_h
 
 #include "Platform/chromium/public/WebString.h"
+#include "Platform/chromium/public/WebURL.h"
 #include "Platform/chromium/public/WebVector.h"
+#include <string>
+
+#define WEBTESTRUNNER_NEW_HISTORY_CAPTURE
 
 namespace WebKit {
-struct WebContextMenuData;
 class WebGamepads;
+class WebHistoryItem;
+struct WebRect;
+struct WebURLError;
 }
 
 namespace WebTestRunner {
 
+struct WebPreferences;
 class WebTask;
+class WebTestProxyBase;
 
 class WebTestDelegate {
 public:
-    virtual void clearContextMenuData() = 0;
+    // Set and clear the edit command to execute on the next call to
+    // WebViewClient::handleCurrentKeyboardEvent().
     virtual void clearEditCommand() = 0;
-    virtual void fillSpellingSuggestionList(const WebKit::WebString& word, WebKit::WebVector<WebKit::WebString>* suggestions) = 0;
     virtual void setEditCommand(const std::string& name, const std::string& value) = 0;
-    virtual WebKit::WebContextMenuData* lastContextMenuData() const = 0;
+
+    // Set the gamepads to return from Platform::sampleGamepads().
     virtual void setGamepadData(const WebKit::WebGamepads&) = 0;
+
+    // Add a message to the text dump for the layout test.
     virtual void printMessage(const std::string& message) = 0;
 
     // The delegate takes ownership of the WebTask objects and is responsible
@@ -58,9 +69,91 @@
     virtual void postTask(WebTask*) = 0;
     virtual void postDelayedTask(WebTask*, long long ms) = 0;
 
+    // Register a new isolated filesystem with the given files, and return the
+    // new filesystem id.
     virtual WebKit::WebString registerIsolatedFileSystem(const WebKit::WebVector<WebKit::WebString>& absoluteFilenames) = 0;
+
+    // Gets the current time in milliseconds since the UNIX epoch.
     virtual long long getCurrentTimeInMillisecond() = 0;
+
+    // Convert the provided relative path into an absolute path.
     virtual WebKit::WebString getAbsoluteWebStringFromUTF8Path(const std::string& path) = 0;
+
+    // Reads in the given file and returns its contents as data URL.
+    virtual WebKit::WebURL localFileToDataURL(const WebKit::WebURL&) = 0;
+
+    // Replaces file:///tmp/LayoutTests/ with the actual path to the
+    // LayoutTests directory.
+    virtual WebKit::WebURL rewriteLayoutTestsURL(const std::string& utf8URL) = 0;
+
+    // Manages the settings to used for layout tests.
+    virtual WebPreferences* preferences() = 0;
+    virtual void applyPreferences() = 0;
+
+    // Returns a textual description of given error.
+    virtual std::string makeURLErrorDescription(const WebKit::WebURLError&) = 0;
+
+    // Resizes the WebView to the given size.
+    virtual void setClientWindowRect(const WebKit::WebRect&) = 0;
+
+    // Opens and closes the inspector.
+    virtual void showDevTools() = 0;
+    virtual void closeDevTools() = 0;
+
+    // Evaluate the given script in the DevTools agent.
+    virtual void evaluateInWebInspector(long callID, const std::string& script) = 0;
+
+    // Controls WebSQL databases.
+    virtual void clearAllDatabases() = 0;
+    virtual void setDatabaseQuota(int) = 0;
+
+    // Controls the device scale factor of the main WebView for hidpi tests.
+    virtual void setDeviceScaleFactor(float) = 0;
+
+    // Controls which WebView should be focused.
+    virtual void setFocus(WebTestProxyBase*, bool) = 0;
+
+    // Controls whether all cookies should be accepted or writing cookies in a
+    // third-party context is blocked.
+    virtual void setAcceptAllCookies(bool) = 0;
+
+    // The same as rewriteLayoutTestsURL unless the resource is a path starting
+    // with /tmp/, then return a file URL to a temporary file.
+    virtual std::string pathToLocalResource(const std::string& resource) = 0;
+
+    // Sets the POSIX locale of the current process.
+    virtual void setLocale(const std::string&) = 0;
+
+    // Invoked when the test finished.
+    virtual void testFinished() = 0;
+
+    // Invoked if the test timed out.
+    virtual void testTimedOut() = 0;
+
+    // If true, never abort a test because of a timeout.
+    virtual bool isBeingDebugged() = 0;
+
+    // The time in milliseconds after which a test is considered to have timed
+    // out.
+    virtual int layoutTestTimeout() = 0;
+
+    // Invoked when the embedder should close all but the main WebView.
+    virtual void closeRemainingWindows() = 0;
+
+    // Returns the length of the back/forward history of the main WebView.
+    virtual int navigationEntryCount() = 0;
+
+    // The following trigger navigations on the main WebViwe.
+    virtual void goToOffset(int offset) = 0;
+    virtual void reload() = 0;
+    virtual void loadURLForFrame(const WebKit::WebURL&, const std::string& frameName) = 0;
+
+    // Returns true if resource requests to external URLs should be permitted.
+    virtual bool allowExternalPages() = 0;
+
+    // Returns the back/forward history for the WebView associated with the
+    // given WebTestProxyBase as well as the index of the current entry.
+    virtual void captureHistoryForWindow(WebTestProxyBase*, WebKit::WebVector<WebKit::WebHistoryItem>*, size_t* currentEntryIndex) = 0;
 };
 
 }
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h
index 52520a6..a8bff80 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestInterfaces.h
@@ -31,33 +31,51 @@
 #ifndef WebTestInterfaces_h
 #define WebTestInterfaces_h
 
+#include "WebTestCommon.h"
+#include <memory>
+
 namespace WebKit {
 class WebFrame;
+class WebMediaStreamCenter;
+class WebMediaStreamCenterClient;
+class WebRTCPeerConnectionHandler;
+class WebRTCPeerConnectionHandlerClient;
+class WebThemeEngine;
+class WebURL;
 class WebView;
 }
 
 namespace WebTestRunner {
 
-class WebAccessibilityController;
-class WebEventSender;
+class TestInterfaces;
 class WebTestDelegate;
+class WebTestProxyBase;
+class WebTestRunner;
 
-class WebTestInterfaces {
+class WEBTESTRUNNER_EXPORT WebTestInterfaces {
 public:
     WebTestInterfaces();
     ~WebTestInterfaces();
 
-    void setWebView(WebKit::WebView*);
+    void setWebView(WebKit::WebView*, WebTestProxyBase*);
     void setDelegate(WebTestDelegate*);
     void bindTo(WebKit::WebFrame*);
     void resetAll();
+    void setTestIsRunning(bool);
+    void configureForTestWithURL(const WebKit::WebURL&, bool generatePixels);
 
-    WebAccessibilityController* accessibilityController();
-    WebEventSender* eventSender();
+    WebTestRunner* testRunner();
+    WebKit::WebThemeEngine* themeEngine();
+
+    WebKit::WebMediaStreamCenter* createMediaStreamCenter(WebKit::WebMediaStreamCenterClient*);
+    WebKit::WebRTCPeerConnectionHandler* createWebRTCPeerConnectionHandler(WebKit::WebRTCPeerConnectionHandlerClient*);
+
+#if WEBTESTRUNNER_IMPLEMENTATION
+    TestInterfaces* testInterfaces();
+#endif
 
 private:
-    class Internal;
-    Internal* m_internal;
+    std::auto_ptr<TestInterfaces> m_interfaces;
 };
 
 }
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h
index 50b8ff3..e5e1d60 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestProxy.h
@@ -31,49 +31,571 @@
 #ifndef WebTestProxy_h
 #define WebTestProxy_h
 
+#include "Platform/chromium/public/WebRect.h"
+#include "Platform/chromium/public/WebURLError.h"
+#include "Platform/chromium/public/WebURLRequest.h"
 #include "WebKit/chromium/public/WebAccessibilityNotification.h"
+#include "WebKit/chromium/public/WebDOMMessageEvent.h"
+#include "WebKit/chromium/public/WebDragOperation.h"
+#include "WebKit/chromium/public/WebEditingAction.h"
+#include "WebKit/chromium/public/WebIconURL.h"
+#include "WebKit/chromium/public/WebNavigationPolicy.h"
+#include "WebKit/chromium/public/WebNavigationType.h"
+#include "WebKit/chromium/public/WebSecurityOrigin.h"
+#include "WebKit/chromium/public/WebTextAffinity.h"
+#include "WebKit/chromium/public/WebTextDirection.h"
+#include "WebTestCommon.h"
+#include <map>
+#include <memory>
+#include <string>
 
 namespace WebKit {
 class WebAccessibilityObject;
+class WebCachedURLRequest;
+class WebDataSource;
+class WebDeviceOrientationClient;
+class WebDeviceOrientationClientMock;
+class WebDragData;
+class WebFrame;
+class WebGeolocationClient;
+class WebGeolocationClientMock;
+class WebImage;
+class WebNode;
+class WebNotificationPresenter;
+class WebPlugin;
+class WebRange;
+class WebSerializedScriptValue;
+class WebSpeechInputController;
+class WebSpeechInputListener;
+class WebSpeechRecognizer;
+class WebSpellCheckClient;
+class WebString;
+class WebURL;
+class WebURLResponse;
+class WebUserMediaClient;
+class WebView;
+struct WebConsoleMessage;
+struct WebContextMenuData;
+struct WebPluginParams;
+struct WebPoint;
+struct WebSize;
+struct WebWindowFeatures;
 }
 
+class SkCanvas;
+
 namespace WebTestRunner {
 
+class MockWebSpeechInputController;
+class MockWebSpeechRecognizer;
+class SpellCheckClient;
+class TestInterfaces;
 class WebTestDelegate;
 class WebTestInterfaces;
+class WebTestRunner;
+class WebUserMediaClientMock;
 
-class WebTestProxyBase {
+class WEBTESTRUNNER_EXPORT WebTestProxyBase {
 public:
     void setInterfaces(WebTestInterfaces*);
     void setDelegate(WebTestDelegate*);
 
+    void reset();
+
+    WebKit::WebSpellCheckClient *spellCheckClient() const;
+
+    std::string captureTree(bool debugRenderTree);
+    SkCanvas* capturePixels();
+
+    void setLogConsoleOutput(bool enabled);
+
+    // FIXME: Make this private again.
+    void scheduleComposite();
+
+#if WEBTESTRUNNER_IMPLEMENTATION
+    void display();
+    void displayInvalidatedRegion();
+    void discardBackingStore();
+
+    WebKit::WebDeviceOrientationClientMock* deviceOrientationClientMock();
+    WebKit::WebGeolocationClientMock* geolocationClientMock();
+    MockWebSpeechInputController* speechInputControllerMock();
+    MockWebSpeechRecognizer* speechRecognizerMock();
+#endif
+
 protected:
     WebTestProxyBase();
     ~WebTestProxyBase();
 
-    void doPostAccessibilityNotification(const WebKit::WebAccessibilityObject&, WebKit::WebAccessibilityNotification);
+    void didInvalidateRect(const WebKit::WebRect&);
+    void didScrollRect(int, int, const WebKit::WebRect&);
+    void scheduleAnimation();
+    void setWindowRect(const WebKit::WebRect&);
+    void show(WebKit::WebNavigationPolicy);
+    void didAutoResize(const WebKit::WebSize&);
+    void postAccessibilityNotification(const WebKit::WebAccessibilityObject&, WebKit::WebAccessibilityNotification);
+    void startDragging(WebKit::WebFrame*, const WebKit::WebDragData&, WebKit::WebDragOperationsMask, const WebKit::WebImage&, const WebKit::WebPoint&);
+    bool shouldBeginEditing(const WebKit::WebRange&);
+    bool shouldEndEditing(const WebKit::WebRange&);
+    bool shouldInsertNode(const WebKit::WebNode&, const WebKit::WebRange&, WebKit::WebEditingAction);
+    bool shouldInsertText(const WebKit::WebString& text, const WebKit::WebRange&, WebKit::WebEditingAction);
+    bool shouldChangeSelectedRange(const WebKit::WebRange& fromRange, const WebKit::WebRange& toRange, WebKit::WebTextAffinity, bool stillSelecting);
+    bool shouldDeleteRange(const WebKit::WebRange&);
+    bool shouldApplyStyle(const WebKit::WebString& style, const WebKit::WebRange&);
+    void didBeginEditing();
+    void didChangeSelection(bool isEmptySelection);
+    void didChangeContents();
+    void didEndEditing();
+    bool createView(WebKit::WebFrame* creator, const WebKit::WebURLRequest&, const WebKit::WebWindowFeatures&, const WebKit::WebString& frameName, WebKit::WebNavigationPolicy);
+    WebKit::WebPlugin* createPlugin(WebKit::WebFrame*, const WebKit::WebPluginParams&);
+    void setStatusText(const WebKit::WebString&);
+    void didStopLoading();
+    void showContextMenu(WebKit::WebFrame*, const WebKit::WebContextMenuData&);
+    WebKit::WebUserMediaClient* userMediaClient();
+    void printPage(WebKit::WebFrame*);
+    WebKit::WebNotificationPresenter* notificationPresenter();
+    WebKit::WebGeolocationClient* geolocationClient();
+    WebKit::WebSpeechInputController* speechInputController(WebKit::WebSpeechInputListener*);
+    WebKit::WebSpeechRecognizer* speechRecognizer();
+    WebKit::WebDeviceOrientationClient* deviceOrientationClient();
+    bool requestPointerLock();
+    void requestPointerUnlock();
+    bool isPointerLocked();
+    void didFocus();
+    void didBlur();
+
+    void willPerformClientRedirect(WebKit::WebFrame*, const WebKit::WebURL& from, const WebKit::WebURL& to, double interval, double fire_time);
+    void didCancelClientRedirect(WebKit::WebFrame*);
+    void didStartProvisionalLoad(WebKit::WebFrame*);
+    void didReceiveServerRedirectForProvisionalLoad(WebKit::WebFrame*);
+    void didFailProvisionalLoad(WebKit::WebFrame*, const WebKit::WebURLError&);
+    void didCommitProvisionalLoad(WebKit::WebFrame*, bool isNewNavigation);
+    void didReceiveTitle(WebKit::WebFrame*, const WebKit::WebString& title, WebKit::WebTextDirection);
+    void didChangeIcon(WebKit::WebFrame*, WebKit::WebIconURL::Type);
+    void didFinishDocumentLoad(WebKit::WebFrame*);
+    void didHandleOnloadEvents(WebKit::WebFrame*);
+    void didFailLoad(WebKit::WebFrame*, const WebKit::WebURLError&);
+    void didFinishLoad(WebKit::WebFrame*);
+    void didChangeLocationWithinPage(WebKit::WebFrame*);
+    void didDisplayInsecureContent(WebKit::WebFrame*);
+    void didRunInsecureContent(WebKit::WebFrame*, const WebKit::WebSecurityOrigin&, const WebKit::WebURL& insecureURL);
+    void didDetectXSS(WebKit::WebFrame*, const WebKit::WebURL& insecureURL, bool didBlockEntirePage);
+    void assignIdentifierToRequest(WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLRequest&);
+    void willRequestResource(WebKit::WebFrame*, const WebKit::WebCachedURLRequest&);
+    bool canHandleRequest(WebKit::WebFrame*, const WebKit::WebURLRequest&);
+    WebKit::WebURLError cannotHandleRequestError(WebKit::WebFrame*, const WebKit::WebURLRequest&);
+    void didCreateDataSource(WebKit::WebFrame*, WebKit::WebDataSource*);
+    void willSendRequest(WebKit::WebFrame*, unsigned identifier, WebKit::WebURLRequest&, const WebKit::WebURLResponse& redirectResponse);
+    void didReceiveResponse(WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLResponse&);
+    void didChangeResourcePriority(WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLRequest::Priority&);
+    void didFinishResourceLoad(WebKit::WebFrame*, unsigned identifier);
+    void didFailResourceLoad(WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLError&);
+    void unableToImplementPolicyWithError(WebKit::WebFrame*, const WebKit::WebURLError&);
+    void didAddMessageToConsole(const WebKit::WebConsoleMessage&, const WebKit::WebString& sourceName, unsigned sourceLine);
+    void runModalAlertDialog(WebKit::WebFrame*, const WebKit::WebString&);
+    bool runModalConfirmDialog(WebKit::WebFrame*, const WebKit::WebString&);
+    bool runModalPromptDialog(WebKit::WebFrame*, const WebKit::WebString& message, const WebKit::WebString& defaultValue, WebKit::WebString* actualValue);
+    bool runModalBeforeUnloadDialog(WebKit::WebFrame*, const WebKit::WebString&);
+    WebKit::WebNavigationPolicy decidePolicyForNavigation(WebKit::WebFrame*, const WebKit::WebURLRequest&, WebKit::WebNavigationType, const WebKit::WebNode& originatingNode, WebKit::WebNavigationPolicy defaultPolicy, bool isRedirect);
+    bool willCheckAndDispatchMessageEvent(WebKit::WebFrame* sourceFrame, WebKit::WebFrame* targetFrame, WebKit::WebSecurityOrigin target, WebKit::WebDOMMessageEvent);
 
 private:
-    WebTestInterfaces* m_testInterfaces;
+    void locationChangeDone(WebKit::WebFrame*);
+    void paintRect(const WebKit::WebRect&);
+    void paintInvalidatedRegion();
+    void paintPagesWithBoundaries();
+    SkCanvas* canvas();
+    void displayRepaintMask();
+
+    TestInterfaces* m_testInterfaces;
     WebTestDelegate* m_delegate;
+
+    std::auto_ptr<SpellCheckClient> m_spellcheck;
+    std::auto_ptr<WebUserMediaClientMock> m_userMediaClient;
+
+    // Painting.
+    std::auto_ptr<SkCanvas> m_canvas;
+    WebKit::WebRect m_paintRect;
+    bool m_isPainting;
+    std::map<unsigned, std::string> m_resourceIdentifierMap;
+    std::map<unsigned, WebKit::WebURLRequest> m_requestMap;
+
+    bool m_logConsoleOutput;
+
+    std::auto_ptr<WebKit::WebGeolocationClientMock> m_geolocationClient;
+    std::auto_ptr<WebKit::WebDeviceOrientationClientMock> m_deviceOrientationClient;
+    std::auto_ptr<MockWebSpeechRecognizer> m_speechRecognizer;
+    std::auto_ptr<MockWebSpeechInputController> m_speechInputController;
+
+private:
+    WebTestProxyBase(WebTestProxyBase&);
+    WebTestProxyBase& operator=(const WebTestProxyBase&);
 };
 
-// Use this template to inject methods into your WebViewClient implementation
-// required for the running layout tests.
-template<class WebViewClientImpl, typename T>
-class WebTestProxy : public WebViewClientImpl, public WebTestProxyBase {
+// Use this template to inject methods into your WebViewClient/WebFrameClient
+// implementation required for the running layout tests.
+template<class Base, typename T>
+class WebTestProxy : public Base, public WebTestProxyBase {
 public:
     explicit WebTestProxy(T t)
-        : WebViewClientImpl(t)
+        : Base(t)
     {
     }
 
     virtual ~WebTestProxy() { }
 
+    // WebViewClient implementation.
+    virtual void didInvalidateRect(const WebKit::WebRect& rect)
+    {
+        WebTestProxyBase::didInvalidateRect(rect);
+        Base::didInvalidateRect(rect);
+    }
+    virtual void didScrollRect(int dx, int dy, const WebKit::WebRect& clipRect)
+    {
+        WebTestProxyBase::didScrollRect(dx, dy, clipRect);
+        Base::didScrollRect(dx, dy, clipRect);
+    }
+    virtual void scheduleComposite()
+    {
+        WebTestProxyBase::scheduleComposite();
+        Base::scheduleComposite();
+    }
+    virtual void scheduleAnimation()
+    {
+        WebTestProxyBase::scheduleAnimation();
+        Base::scheduleAnimation();
+    }
+    virtual void setWindowRect(const WebKit::WebRect& rect)
+    {
+        WebTestProxyBase::setWindowRect(rect);
+        Base::setWindowRect(rect);
+    }
+    virtual void show(WebKit::WebNavigationPolicy policy)
+    {
+        WebTestProxyBase::show(policy);
+        Base::show(policy);
+    }
+    virtual void didAutoResize(const WebKit::WebSize& newSize)
+    {
+        WebTestProxyBase::didAutoResize(newSize);
+        Base::didAutoResize(newSize);
+    }
     virtual void postAccessibilityNotification(const WebKit::WebAccessibilityObject& object, WebKit::WebAccessibilityNotification notification)
     {
-        WebTestProxyBase::doPostAccessibilityNotification(object, notification);
-        WebViewClientImpl::postAccessibilityNotification(object, notification);
+        WebTestProxyBase::postAccessibilityNotification(object, notification);
+        Base::postAccessibilityNotification(object, notification);
+    }
+    virtual void startDragging(WebKit::WebFrame* frame, const WebKit::WebDragData& data, WebKit::WebDragOperationsMask mask, const WebKit::WebImage& image, const WebKit::WebPoint& point)
+    {
+        WebTestProxyBase::startDragging(frame, data, mask, image, point);
+        Base::startDragging(frame, data, mask, image, point);
+    }
+    virtual bool shouldBeginEditing(const WebKit::WebRange& range)
+    {
+        WebTestProxyBase::shouldBeginEditing(range);
+        return Base::shouldBeginEditing(range);
+    }
+    virtual bool shouldEndEditing(const WebKit::WebRange& range)
+    {
+        WebTestProxyBase::shouldEndEditing(range);
+        return Base::shouldEndEditing(range);
+    }
+    virtual bool shouldInsertNode(const WebKit::WebNode& node, const WebKit::WebRange& range, WebKit::WebEditingAction action)
+    {
+        WebTestProxyBase::shouldInsertNode(node, range, action);
+        return Base::shouldInsertNode(node, range, action);
+    }
+    virtual bool shouldInsertText(const WebKit::WebString& text, const WebKit::WebRange& range, WebKit::WebEditingAction action)
+    {
+        WebTestProxyBase::shouldInsertText(text, range, action);
+        return Base::shouldInsertText(text, range, action);
+    }
+    virtual bool shouldChangeSelectedRange(const WebKit::WebRange& fromRange, const WebKit::WebRange& toRange, WebKit::WebTextAffinity affinity, bool stillSelecting)
+    {
+        WebTestProxyBase::shouldChangeSelectedRange(fromRange, toRange, affinity, stillSelecting);
+        return Base::shouldChangeSelectedRange(fromRange, toRange, affinity, stillSelecting);
+    }
+    virtual bool shouldDeleteRange(const WebKit::WebRange& range)
+    {
+        WebTestProxyBase::shouldDeleteRange(range);
+        return Base::shouldDeleteRange(range);
+    }
+    virtual bool shouldApplyStyle(const WebKit::WebString& style, const WebKit::WebRange& range)
+    {
+        WebTestProxyBase::shouldApplyStyle(style, range);
+        return Base::shouldApplyStyle(style, range);
+    }
+    virtual void didBeginEditing()
+    {
+        WebTestProxyBase::didBeginEditing();
+        Base::didBeginEditing();
+    }
+    virtual void didChangeSelection(bool isEmptySelection)
+    {
+        WebTestProxyBase::didChangeSelection(isEmptySelection);
+        Base::didChangeSelection(isEmptySelection);
+    }
+    virtual void didChangeContents()
+    {
+        WebTestProxyBase::didChangeContents();
+        Base::didChangeContents();
+    }
+    virtual void didEndEditing()
+    {
+        WebTestProxyBase::didEndEditing();
+        Base::didEndEditing();
+    }
+    virtual WebKit::WebView* createView(WebKit::WebFrame* creator, const WebKit::WebURLRequest& request, const WebKit::WebWindowFeatures& features, const WebKit::WebString& frameName, WebKit::WebNavigationPolicy policy)
+    {
+        if (!WebTestProxyBase::createView(creator, request, features, frameName, policy))
+            return 0;
+        return Base::createView(creator, request, features, frameName, policy);
+    }
+    WebKit::WebPlugin* createPlugin(WebKit::WebFrame* frame, const WebKit::WebPluginParams& params)
+    {
+        WebKit::WebPlugin* plugin = WebTestProxyBase::createPlugin(frame, params);
+        if (plugin)
+            return plugin;
+        return Base::createPlugin(frame, params);
+    }
+    virtual void setStatusText(const WebKit::WebString& text)
+    {
+        WebTestProxyBase::setStatusText(text);
+        Base::setStatusText(text);
+    }
+    virtual void didStopLoading()
+    {
+        WebTestProxyBase::didStopLoading();
+        Base::didStopLoading();
+    }
+    virtual void showContextMenu(WebKit::WebFrame* frame, const WebKit::WebContextMenuData& contextMenuData)
+    {
+        WebTestProxyBase::showContextMenu(frame, contextMenuData);
+        Base::showContextMenu(frame, contextMenuData);
+    }
+    virtual WebKit::WebUserMediaClient* userMediaClient()
+    {
+        return WebTestProxyBase::userMediaClient();
+    }
+    virtual void printPage(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::printPage(frame);
+    }
+    virtual WebKit::WebNotificationPresenter* notificationPresenter()
+    {
+        return WebTestProxyBase::notificationPresenter();
+    }
+    virtual WebKit::WebGeolocationClient* geolocationClient()
+    {
+        return WebTestProxyBase::geolocationClient();
+    }
+    virtual WebKit::WebSpeechInputController* speechInputController(WebKit::WebSpeechInputListener* listener)
+    {
+        return WebTestProxyBase::speechInputController(listener);
+    }
+    virtual WebKit::WebSpeechRecognizer* speechRecognizer()
+    {
+        return WebTestProxyBase::speechRecognizer();
+    }
+    virtual WebKit::WebDeviceOrientationClient* deviceOrientationClient()
+    {
+        return WebTestProxyBase::deviceOrientationClient();
+    }
+    virtual bool requestPointerLock()
+    {
+        return WebTestProxyBase::requestPointerLock();
+    }
+    virtual void requestPointerUnlock()
+    {
+        WebTestProxyBase::requestPointerUnlock();
+    }
+    virtual bool isPointerLocked()
+    {
+        return WebTestProxyBase::isPointerLocked();
+    }
+    virtual void didFocus()
+    {
+        WebTestProxyBase::didFocus();
+        Base::didFocus();
+    }
+    virtual void didBlur()
+    {
+        WebTestProxyBase::didBlur();
+        Base::didBlur();
+    }
+
+    // WebFrameClient implementation.
+    virtual void willPerformClientRedirect(WebKit::WebFrame* frame, const WebKit::WebURL& from, const WebKit::WebURL& to, double interval, double fireTime)
+    {
+        WebTestProxyBase::willPerformClientRedirect(frame, from, to, interval, fireTime);
+        Base::willPerformClientRedirect(frame, from, to, interval, fireTime);
+    }
+    virtual void didCancelClientRedirect(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didCancelClientRedirect(frame);
+        Base::didCancelClientRedirect(frame);
+    }
+    virtual void didStartProvisionalLoad(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didStartProvisionalLoad(frame);
+        Base::didStartProvisionalLoad(frame);
+    }
+    virtual void didReceiveServerRedirectForProvisionalLoad(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didReceiveServerRedirectForProvisionalLoad(frame);
+        Base::didReceiveServerRedirectForProvisionalLoad(frame);
+    }
+    virtual void didFailProvisionalLoad(WebKit::WebFrame* frame, const WebKit::WebURLError& error)
+    {
+        WebTestProxyBase::didFailProvisionalLoad(frame, error);
+        Base::didFailProvisionalLoad(frame, error);
+    }
+    virtual void didCommitProvisionalLoad(WebKit::WebFrame* frame, bool isNewNavigation)
+    {
+        WebTestProxyBase::didCommitProvisionalLoad(frame, isNewNavigation);
+        Base::didCommitProvisionalLoad(frame, isNewNavigation);
+    }
+    virtual void didReceiveTitle(WebKit::WebFrame* frame, const WebKit::WebString& title, WebKit::WebTextDirection direction)
+    {
+        WebTestProxyBase::didReceiveTitle(frame, title, direction);
+        Base::didReceiveTitle(frame, title, direction);
+    }
+    virtual void didChangeIcon(WebKit::WebFrame* frame, WebKit::WebIconURL::Type iconType)
+    {
+        WebTestProxyBase::didChangeIcon(frame, iconType);
+        Base::didChangeIcon(frame, iconType);
+    }
+    virtual void didFinishDocumentLoad(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didFinishDocumentLoad(frame);
+        Base::didFinishDocumentLoad(frame);
+    }
+    virtual void didHandleOnloadEvents(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didHandleOnloadEvents(frame);
+        Base::didHandleOnloadEvents(frame);
+    }
+    virtual void didFailLoad(WebKit::WebFrame* frame, const WebKit::WebURLError& error)
+    {
+        WebTestProxyBase::didFailLoad(frame, error);
+        Base::didFailLoad(frame, error);
+    }
+    virtual void didFinishLoad(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didFinishLoad(frame);
+        Base::didFinishLoad(frame);
+    }
+    virtual void didChangeLocationWithinPage(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didChangeLocationWithinPage(frame);
+        Base::didChangeLocationWithinPage(frame);
+    }
+    virtual void didDisplayInsecureContent(WebKit::WebFrame* frame)
+    {
+        WebTestProxyBase::didDisplayInsecureContent(frame);
+        Base::didDisplayInsecureContent(frame);
+    }
+    virtual void didRunInsecureContent(WebKit::WebFrame* frame, const WebKit::WebSecurityOrigin& origin, const WebKit::WebURL& insecureURL)
+    {
+        WebTestProxyBase::didRunInsecureContent(frame, origin, insecureURL);
+        Base::didRunInsecureContent(frame, origin, insecureURL);
+    }
+    virtual void didDetectXSS(WebKit::WebFrame* frame, const WebKit::WebURL& insecureURL, bool didBlockEntirePage)
+    {
+        WebTestProxyBase::didDetectXSS(frame, insecureURL, didBlockEntirePage);
+        Base::didDetectXSS(frame, insecureURL, didBlockEntirePage);
+    }
+    virtual void assignIdentifierToRequest(WebKit::WebFrame* frame, unsigned identifier, const WebKit::WebURLRequest& request)
+    {
+        WebTestProxyBase::assignIdentifierToRequest(frame, identifier, request);
+        Base::assignIdentifierToRequest(frame, identifier, request);
+    }
+    virtual void willRequestResource(WebKit::WebFrame* frame, const WebKit::WebCachedURLRequest& request)
+    {
+        WebTestProxyBase::willRequestResource(frame, request);
+        Base::willRequestResource(frame, request);
+    }
+    virtual bool canHandleRequest(WebKit::WebFrame* frame, const WebKit::WebURLRequest& request)
+    {
+        if (!WebTestProxyBase::canHandleRequest(frame, request))
+            return false;
+        return Base::canHandleRequest(frame, request);
+    }
+    virtual WebKit::WebURLError cannotHandleRequestError(WebKit::WebFrame* frame, const WebKit::WebURLRequest& request)
+    {
+        return WebTestProxyBase::cannotHandleRequestError(frame, request);
+    }
+    virtual void didCreateDataSource(WebKit::WebFrame* frame, WebKit::WebDataSource* ds)
+    {
+        WebTestProxyBase::didCreateDataSource(frame, ds);
+        Base::didCreateDataSource(frame, ds);
+    }
+    virtual void willSendRequest(WebKit::WebFrame* frame, unsigned identifier, WebKit::WebURLRequest& request, const WebKit::WebURLResponse& redirectResponse)
+    {
+        WebTestProxyBase::willSendRequest(frame, identifier, request, redirectResponse);
+        Base::willSendRequest(frame, identifier, request, redirectResponse);
+    }
+    virtual void didReceiveResponse(WebKit::WebFrame* frame, unsigned identifier, const WebKit::WebURLResponse& response)
+    {
+        WebTestProxyBase::didReceiveResponse(frame, identifier, response);
+        Base::didReceiveResponse(frame, identifier, response);
+    }
+    virtual void didChangeResourcePriority(WebKit::WebFrame* frame, unsigned identifier, const WebKit::WebURLRequest::Priority& priority)
+    {
+        WebTestProxyBase::didChangeResourcePriority(frame, identifier, priority);
+        Base::didChangeResourcePriority(frame, identifier, priority);
+    }
+    virtual void didFinishResourceLoad(WebKit::WebFrame* frame, unsigned identifier)
+    {
+        WebTestProxyBase::didFinishResourceLoad(frame, identifier);
+        Base::didFinishResourceLoad(frame, identifier);
+    }
+    virtual void didFailResourceLoad(WebKit::WebFrame* frame, unsigned identifier, const WebKit::WebURLError& error)
+    {
+        WebTestProxyBase::didFailResourceLoad(frame, identifier, error);
+        Base::didFailResourceLoad(frame, identifier, error);
+    }
+    virtual void unableToImplementPolicyWithError(WebKit::WebFrame* frame, const WebKit::WebURLError& error)
+    {
+        WebTestProxyBase::unableToImplementPolicyWithError(frame, error);
+        Base::unableToImplementPolicyWithError(frame, error);
+    }
+    virtual void didAddMessageToConsole(const WebKit::WebConsoleMessage& message, const WebKit::WebString& sourceName, unsigned sourceLine)
+    {
+        WebTestProxyBase::didAddMessageToConsole(message, sourceName, sourceLine);
+        Base::didAddMessageToConsole(message, sourceName, sourceLine);
+    }
+    virtual void runModalAlertDialog(WebKit::WebFrame* frame, const WebKit::WebString& message)
+    {
+        WebTestProxyBase::runModalAlertDialog(frame, message);
+        Base::runModalAlertDialog(frame, message);
+    }
+    virtual bool runModalConfirmDialog(WebKit::WebFrame* frame, const WebKit::WebString& message)
+    {
+        WebTestProxyBase::runModalConfirmDialog(frame, message);
+        return Base::runModalConfirmDialog(frame, message);
+    }
+    virtual bool runModalPromptDialog(WebKit::WebFrame* frame, const WebKit::WebString& message, const WebKit::WebString& defaultValue, WebKit::WebString* actualValue)
+    {
+        WebTestProxyBase::runModalPromptDialog(frame, message, defaultValue, actualValue);
+        return Base::runModalPromptDialog(frame, message, defaultValue, actualValue);
+    }
+    virtual bool runModalBeforeUnloadDialog(WebKit::WebFrame* frame, const WebKit::WebString& message)
+    {
+        return WebTestProxyBase::runModalBeforeUnloadDialog(frame, message);
+    }
+    virtual WebKit::WebNavigationPolicy decidePolicyForNavigation(WebKit::WebFrame* frame, const WebKit::WebURLRequest& request, WebKit::WebNavigationType type, const WebKit::WebNode& originatingNode, WebKit::WebNavigationPolicy defaultPolicy, bool isRedirect)
+    {
+        WebKit::WebNavigationPolicy policy = WebTestProxyBase::decidePolicyForNavigation(frame, request, type, originatingNode, defaultPolicy, isRedirect);
+        if (policy == WebKit::WebNavigationPolicyIgnore)
+            return policy;
+        return Base::decidePolicyForNavigation(frame, request, type, originatingNode, defaultPolicy, isRedirect);
+    }
+    virtual bool willCheckAndDispatchMessageEvent(WebKit::WebFrame* sourceFrame, WebKit::WebFrame* targetFrame, WebKit::WebSecurityOrigin target, WebKit::WebDOMMessageEvent event)
+    {
+        if (WebTestProxyBase::willCheckAndDispatchMessageEvent(sourceFrame, targetFrame, target, event))
+            return true;
+        return Base::willCheckAndDispatchMessageEvent(sourceFrame, targetFrame, target, event);
     }
 };
 
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h
new file mode 100644
index 0000000..738cc3e
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/public/WebTestRunner.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebTestRunner_h
+#define WebTestRunner_h
+
+namespace WebKit {
+class WebArrayBufferView;
+class WebPermissionClient;
+}
+
+namespace WebTestRunner {
+
+class WebTestRunner {
+public:
+    // Returns a mock WebPermissionClient that is used for layout tests. An
+    // embedder should use this for all WebViews it creates.
+    virtual WebKit::WebPermissionClient* webPermissions() const = 0;
+
+    // After WebTestDelegate::testFinished was invoked, the following methods
+    // can be used to determine what kind of dump the main WebTestProxy can
+    // provide.
+
+    // If true, WebTestDelegate::audioData returns an audio dump and no text
+    // or pixel results are available.
+    virtual bool shouldDumpAsAudio() const = 0;
+    virtual const WebKit::WebArrayBufferView* audioData() const = 0;
+
+    // Returns true if the call to WebTestProxy::captureTree will invoke
+    // WebTestDelegate::captureHistoryForWindow.
+    virtual bool shouldDumpBackForwardList() const = 0;
+
+    // Returns true if WebTestProxy::capturePixels should be invoked after
+    // capturing text results.
+    virtual bool shouldGeneratePixelResults() = 0;
+};
+
+}
+
+#endif // WebTestRunner_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.cpp
index 5f1b4f9..903d29c 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.cpp
@@ -31,13 +31,13 @@
 #include "config.h"
 #include "AccessibilityControllerChromium.h"
 
-#include "TestDelegate.h"
 #include "WebAccessibilityObject.h"
 #include "WebElement.h"
 #include "WebFrame.h"
 #include "WebNode.h"
+#include "WebTestDelegate.h"
 #include "WebView.h"
-#include "platform/WebCString.h"
+#include <public/WebCString.h>
 
 using namespace WebKit;
 
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.h b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.h
index 35bf06c..9130058 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityControllerChromium.h
@@ -40,10 +40,10 @@
 class WebView;
 }
 
-class TestDelegate;
-
 namespace WebTestRunner {
 
+class WebTestDelegate;
+
 class AccessibilityController : public CppBoundClass {
 public:
     AccessibilityController();
@@ -61,7 +61,7 @@
 
     void notificationReceived(const WebKit::WebAccessibilityObject& target, const char* notificationName);
 
-    void setDelegate(TestDelegate* delegate) { m_delegate = delegate; }
+    void setDelegate(WebTestDelegate* delegate) { m_delegate = delegate; }
     void setWebView(WebKit::WebView* webView) { m_webView = webView; }
 
 private:
@@ -87,7 +87,7 @@
 
     std::vector<CppVariant> m_notificationCallbacks;
 
-    TestDelegate* m_delegate;
+    WebTestDelegate* m_delegate;
     WebKit::WebView* m_webView;
 };
 
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp
index 2157ddb..6dcc406 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.cpp
@@ -31,20 +31,23 @@
 #include "config.h"
 #include "AccessibilityUIElementChromium.h"
 
+#include "TestCommon.h"
 #include "WebAccessibilityObject.h"
-#include "platform/WebCString.h"
-#include "platform/WebPoint.h"
-#include "platform/WebRect.h"
-#include "platform/WebString.h"
-#include <wtf/Assertions.h>
-#include <wtf/StringExtras.h>
+#include <public/WebCString.h>
+#include <public/WebPoint.h>
+#include <public/WebRect.h>
+#include <public/WebString.h>
 
 using namespace WebKit;
 using namespace std;
 
+namespace WebTestRunner {
+
+namespace {
+
 // Map role value to string, matching Safari/Mac platform implementation to
 // avoid rebaselining layout tests.
-static string roleToString(WebAccessibilityRole role)
+string roleToString(WebAccessibilityRole role)
 {
     string result = "AXRole: AX";
     switch (role) {
@@ -165,10 +168,12 @@
         return result.append("ListBoxOption");
     case WebAccessibilityRoleTableHeaderContainer:
         return result.append("TableHeaderContainer");
-    case WebAccessibilityRoleDefinitionListTerm:
-        return result.append("DefinitionListTerm");
-    case WebAccessibilityRoleDefinitionListDefinition:
-        return result.append("DefinitionListDefinition");
+    case WebAccessibilityRoleDefinition:
+        return result.append("Definition");
+    case WebAccessibilityRoleDescriptionListTerm:
+        return result.append("DescriptionListTerm");
+    case WebAccessibilityRoleDescriptionListDetail:
+        return result.append("DescriptionListDetail");
     case WebAccessibilityRoleAnnotation:
         return result.append("Annotation");
     case WebAccessibilityRoleSliderThumb:
@@ -281,7 +286,15 @@
 
 string getStringValue(const WebAccessibilityObject& object)
 {
-    string value = object.stringValue().utf8();
+    string value;
+    if (object.roleValue() == WebAccessibilityRoleColorWell) {
+        int r, g, b;
+        char buffer[100];
+        object.colorValue(r, g, b);
+        snprintf(buffer, sizeof(buffer), "rgb %7.5f %7.5f %7.5f 1", r / 255., g / 255., b / 255.);
+        value = buffer;
+    } else
+        value = object.stringValue().utf8();
     return value.insert(0, "AXValue: ");
 }
 
@@ -347,12 +360,14 @@
     string m_attributes;
 };
 
+}
+
 AccessibilityUIElement::AccessibilityUIElement(const WebAccessibilityObject& object, Factory* factory)
     : m_accessibilityObject(object)
     , m_factory(factory)
 {
 
-    ASSERT(factory);
+    WEBKIT_ASSERT(factory);
 
     //
     // Properties
@@ -391,6 +406,8 @@
     bindProperty("isValid", &AccessibilityUIElement::isValidGetterCallback);
     bindProperty("isReadOnly", &AccessibilityUIElement::isReadOnlyGetterCallback);
     bindProperty("orientation", &AccessibilityUIElement::orientationGetterCallback);
+    bindProperty("clickPointX", &AccessibilityUIElement::clickPointXGetterCallback);
+    bindProperty("clickPointY", &AccessibilityUIElement::clickPointYGetterCallback);
 
     //
     // Methods
@@ -419,7 +436,9 @@
     bindMethod("setSelectedTextRange", &AccessibilityUIElement::setSelectedTextRangeCallback);
     bindMethod("attributeValue", &AccessibilityUIElement::attributeValueCallback);
     bindMethod("isAttributeSettable", &AccessibilityUIElement::isAttributeSettableCallback);
-    bindMethod("isActionSupported", &AccessibilityUIElement::isActionSupportedCallback);
+    bindMethod("isPressActionSupported", &AccessibilityUIElement::isPressActionSupportedCallback);
+    bindMethod("isIncrementActionSupported", &AccessibilityUIElement::isIncrementActionSupportedCallback);
+    bindMethod("isDecrementActionSupported", &AccessibilityUIElement::isDecrementActionSupportedCallback);
     bindMethod("parentElement", &AccessibilityUIElement::parentElementCallback);
     bindMethod("increment", &AccessibilityUIElement::incrementCallback);
     bindMethod("decrement", &AccessibilityUIElement::decrementCallback);
@@ -508,7 +527,12 @@
 
 void AccessibilityUIElement::intValueGetterCallback(CppVariant* result)
 {
-    result->set(accessibilityObject().valueForRange());
+    if (accessibilityObject().supportsRangeValue())
+        result->set(accessibilityObject().valueForRange());
+    else if (accessibilityObject().roleValue() == WebAccessibilityRoleHeading)
+        result->set(accessibilityObject().headingLevel());
+    else
+        result->set(atoi(accessibilityObject().stringValue().utf8().data()));
 }
 
 void AccessibilityUIElement::minValueGetterCallback(CppVariant* result)
@@ -640,6 +664,16 @@
     result->set(getOrientation(accessibilityObject()));
 }
 
+void AccessibilityUIElement::clickPointXGetterCallback(CppVariant* result)
+{
+    result->set(accessibilityObject().clickPoint().x);
+}
+
+void AccessibilityUIElement::clickPointYGetterCallback(CppVariant* result)
+{
+    result->set(accessibilityObject().clickPoint().y);
+}
+
 //
 // Methods
 //
@@ -717,9 +751,21 @@
     result->set(*(child->getAsCppVariant()));
 }
 
-void AccessibilityUIElement::elementAtPointCallback(const CppArgumentList&, CppVariant* result)
+void AccessibilityUIElement::elementAtPointCallback(const CppArgumentList& arguments, CppVariant* result)
 {
     result->setNull();
+
+    if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNumber())
+        return;
+
+    int x = arguments[0].toInt32();
+    int y = arguments[1].toInt32();
+    WebPoint point(x, y);
+    WebAccessibilityObject obj = accessibilityObject().hitTest(point);
+    if (obj.isNull())
+        return;
+
+    result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant()));
 }
 
 void AccessibilityUIElement::attributesOfColumnHeadersCallback(const CppArgumentList&, CppVariant* result)
@@ -813,25 +859,41 @@
     result->set(settable);
 }
 
-void AccessibilityUIElement::isActionSupportedCallback(const CppArgumentList&, CppVariant* result)
+void AccessibilityUIElement::isPressActionSupportedCallback(const CppArgumentList&, CppVariant* result)
 {
-    // This one may be really hard to implement.
-    // Not exposed by AccessibilityObject.
-    result->setNull();
+    result->set(accessibilityObject().canPress());
+}
+
+void AccessibilityUIElement::isIncrementActionSupportedCallback(const CppArgumentList&, CppVariant* result)
+{
+    result->set(accessibilityObject().canIncrement());
+}
+
+void AccessibilityUIElement::isDecrementActionSupportedCallback(const CppArgumentList&, CppVariant* result)
+{
+    result->set(accessibilityObject().canDecrement());
 }
 
 void AccessibilityUIElement::parentElementCallback(const CppArgumentList&, CppVariant* result)
 {
-    result->setNull();
+    AccessibilityUIElement* parent = m_factory->getOrCreate(accessibilityObject().parentObject());
+    if (!parent) {
+        result->setNull();
+        return;
+    }
+
+    result->set(*(parent->getAsCppVariant()));
 }
 
 void AccessibilityUIElement::incrementCallback(const CppArgumentList&, CppVariant* result)
 {
+    accessibilityObject().increment();
     result->setNull();
 }
 
 void AccessibilityUIElement::decrementCallback(const CppArgumentList&, CppVariant* result)
 {
+    accessibilityObject().decrement();
     result->setNull();
 }
 
@@ -842,7 +904,7 @@
 
 void AccessibilityUIElement::pressCallback(const CppArgumentList&, CppVariant* result)
 {
-    accessibilityObject().performDefaultAction();
+    accessibilityObject().press();
     result->setNull();
 }
 
@@ -962,13 +1024,15 @@
     }
 
     AccessibilityUIElement* element = new AccessibilityUIElement(object, this);
-    m_elements.append(element);
+    m_elements.push_back(element);
     return element;
 }
 
 AccessibilityUIElement* AccessibilityUIElementList::createRoot(const WebAccessibilityObject& object)
 {
     AccessibilityUIElement* element = new RootAccessibilityUIElement(object, this);
-    m_elements.append(element);
+    m_elements.push_back(element);
     return element;
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h
index d9e73e5..c6cb1a2 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/AccessibilityUIElementChromium.h
@@ -34,7 +34,8 @@
 #include "CppBoundClass.h"
 #include "WebAccessibilityObject.h"
 #include <vector>
-#include <wtf/Vector.h>
+
+namespace WebTestRunner {
 
 class AccessibilityUIElement : public CppBoundClass {
 public:
@@ -92,6 +93,8 @@
     void isValidGetterCallback(CppVariant*);
     void isReadOnlyGetterCallback(CppVariant*);
     void orientationGetterCallback(CppVariant*);
+    void clickPointXGetterCallback(CppVariant*);
+    void clickPointYGetterCallback(CppVariant*);
 
     // Bound methods.
     void allAttributesCallback(const CppArgumentList&, CppVariant*);
@@ -118,7 +121,9 @@
     void setSelectedTextRangeCallback(const CppArgumentList&, CppVariant*);
     void attributeValueCallback(const CppArgumentList&, CppVariant*);
     void isAttributeSettableCallback(const CppArgumentList&, CppVariant*);
-    void isActionSupportedCallback(const CppArgumentList&, CppVariant*);
+    void isPressActionSupportedCallback(const CppArgumentList&, CppVariant*);
+    void isIncrementActionSupportedCallback(const CppArgumentList&, CppVariant*);
+    void isDecrementActionSupportedCallback(const CppArgumentList&, CppVariant*);
     void parentElementCallback(const CppArgumentList&, CppVariant*);
     void incrementCallback(const CppArgumentList&, CppVariant*);
     void decrementCallback(const CppArgumentList&, CppVariant*);
@@ -162,8 +167,10 @@
     AccessibilityUIElement* createRoot(const WebKit::WebAccessibilityObject&);
 
 private:
-    typedef Vector<AccessibilityUIElement*> ElementList;
+    typedef std::vector<AccessibilityUIElement*> ElementList;
     ElementList m_elements;
 };
 
+}
+
 #endif // AccessibilityUIElementChromium_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp
index 1b29d2b..49e6149 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.cpp
@@ -42,15 +42,19 @@
 #include "config.h"
 #include "CppBoundClass.h"
 
+#include "TestCommon.h"
 #include "WebBindings.h"
 #include "WebFrame.h"
-#include "platform/WebString.h"
-#include <wtf/Assertions.h>
-#include <wtf/OwnPtr.h>
+#include <memory>
+#include <public/WebString.h>
 
 using namespace WebKit;
 using namespace std;
 
+namespace WebTestRunner {
+
+namespace {
+
 class CppVariantPropertyCallback : public CppBoundClass::PropertyCallback {
 public:
     CppVariantPropertyCallback(CppVariant* value) : m_value(value) { }
@@ -73,7 +77,7 @@
 
 class GetterPropertyCallback : public CppBoundClass::PropertyCallback {
 public:
-    GetterPropertyCallback(PassOwnPtr<CppBoundClass::GetterCallback> callback)
+    GetterPropertyCallback(auto_ptr<CppBoundClass::GetterCallback> callback)
         : m_callback(callback)
     {
     }
@@ -87,9 +91,11 @@
     virtual bool setValue(const CppVariant& value) { return false; }
 
 private:
-    OwnPtr<CppBoundClass::GetterCallback> m_callback;
+    auto_ptr<CppBoundClass::GetterCallback> m_callback;
 };
 
+}
+
 // Our special NPObject type. We extend an NPObject with a pointer to a
 // CppBoundClass, which is just a C++ interface that we forward all NPObject
 // callbacks to.
@@ -203,10 +209,10 @@
 CppBoundClass::~CppBoundClass()
 {
     for (MethodList::iterator i = m_methods.begin(); i != m_methods.end(); ++i)
-        delete i->value;
+        delete i->second;
 
     for (PropertyList::iterator i = m_properties.begin(); i != m_properties.end(); ++i)
-        delete i->value;
+        delete i->second;
 
     // Unregister ourselves if we were bound to a frame.
     if (m_boundToFrame)
@@ -237,7 +243,7 @@
         }
         callback = m_fallbackCallback.get();
     } else
-        callback = (*method).value;
+        callback = (*method).second;
 
     // Build a CppArgumentList argument vector from the NPVariants coming in.
     CppArgumentList cppArguments(argumentCount);
@@ -260,7 +266,7 @@
     }
 
     CppVariant cppValue;
-    if (!callback->value->getValue(&cppValue))
+    if (!callback->second->getValue(&cppValue))
         return false;
     cppValue.copyToNPVariant(result);
     return true;
@@ -274,7 +280,7 @@
 
     CppVariant cppValue;
     cppValue.set(*value);
-    return (*callback).value->setValue(cppValue);
+    return (*callback).second->setValue(cppValue);
 }
 
 void CppBoundClass::bindCallback(const string& name, Callback* callback)
@@ -282,19 +288,19 @@
     NPIdentifier ident = WebBindings::getStringIdentifier(name.c_str());
     MethodList::iterator oldCallback = m_methods.find(ident);
     if (oldCallback != m_methods.end()) {
-        delete oldCallback->value;
+        delete oldCallback->second;
         if (!callback) {
-            m_methods.remove(oldCallback);
+            m_methods.erase(oldCallback);
             return;
         }
     }
 
-    m_methods.set(ident, callback);
+    m_methods[ident] = callback;
 }
 
-void CppBoundClass::bindGetterCallback(const string& name, PassOwnPtr<GetterCallback> callback)
+void CppBoundClass::bindGetterCallback(const string& name, auto_ptr<GetterCallback> callback)
 {
-    PropertyCallback* propertyCallback = callback ? new GetterPropertyCallback(callback) : 0;
+    PropertyCallback* propertyCallback = callback.get() ? new GetterPropertyCallback(callback) : 0;
     bindProperty(name, propertyCallback);
 }
 
@@ -309,14 +315,14 @@
     NPIdentifier ident = WebBindings::getStringIdentifier(name.c_str());
     PropertyList::iterator oldCallback = m_properties.find(ident);
     if (oldCallback != m_properties.end()) {
-        delete oldCallback->value;
+        delete oldCallback->second;
         if (!callback) {
-            m_properties.remove(oldCallback);
+            m_properties.erase(oldCallback);
             return;
         }
     }
 
-    m_properties.set(ident, callback);
+    m_properties[ident] = callback;
 }
 
 bool CppBoundClass::isMethodRegistered(const string& name) const
@@ -338,7 +344,7 @@
         m_selfVariant.set(npObj);
         WebBindings::releaseObject(npObj); // CppVariant takes the reference.
     }
-    ASSERT(m_selfVariant.isObject());
+    WEBKIT_ASSERT(m_selfVariant.isObject());
     return &m_selfVariant;
 }
 
@@ -350,3 +356,5 @@
     frame->bindToWindowObject(classname, NPVARIANT_TO_OBJECT(*getAsCppVariant()));
     m_boundToFrame = true;
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h b/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h
index 4fb5361..952a41c 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/CppBoundClass.h
@@ -44,23 +44,22 @@
 #define CppBoundClass_h
 
 #include "CppVariant.h"
-#include <wtf/HashMap.h>
-#include <wtf/Noncopyable.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
-#include <wtf/Vector.h>
+#include <map>
+#include <memory>
+#include <vector>
 
 namespace WebKit {
 class WebFrame;
 class WebString;
 }
 
-typedef Vector<CppVariant> CppArgumentList;
+namespace WebTestRunner {
+
+typedef std::vector<CppVariant> CppArgumentList;
 
 // CppBoundClass lets you map Javascript method calls and property accesses
 // directly to C++ method calls and CppVariant* variable access.
 class CppBoundClass {
-    WTF_MAKE_NONCOPYABLE(CppBoundClass);
 public:
     class PropertyCallback {
     public:
@@ -162,7 +161,7 @@
 
     // Bind Javascript property |name| to the C++ getter callback |callback|.
     // This can be used to create read-only properties.
-    void bindGetterCallback(const std::string&, PassOwnPtr<GetterCallback>);
+    void bindGetterCallback(const std::string&, std::auto_ptr<GetterCallback>);
 
     // A wrapper for BindGetterCallback, to simplify the common case of binding a
     // property on the current object. Though not verified here, the method parameter
@@ -170,8 +169,8 @@
     template<class T>
     void bindProperty(const std::string& name, void (T::*method)(CppVariant*))
     {
-        OwnPtr<GetterCallback> callback = adoptPtr(new MemberGetterCallback<T>(static_cast<T*>(this), method));
-        bindGetterCallback(name, callback.release());
+        std::auto_ptr<GetterCallback> callback(new MemberGetterCallback<T>(static_cast<T*>(this), method));
+        bindGetterCallback(name, callback);
     }
 
     // Bind the Javascript property called |name| to a CppVariant.
@@ -191,7 +190,7 @@
     // as it may cause unexpected behaviors (a JavaScript object with a
     // fallback always returns true when checked for a method's
     // existence).
-    void bindFallbackCallback(PassOwnPtr<Callback> fallbackCallback)
+    void bindFallbackCallback(std::auto_ptr<Callback> fallbackCallback)
     {
         m_fallbackCallback = fallbackCallback;
     }
@@ -203,25 +202,24 @@
     template<class T>
     void bindFallbackMethod(void (T::*method)(const CppArgumentList&, CppVariant*))
     {
-        if (method) {
-            OwnPtr<Callback> callback = adoptPtr(new MemberCallback<T>(static_cast<T*>(this), method));
-            bindFallbackCallback(callback.release());
-        } else
-            bindFallbackCallback(nullptr);
+        if (method)
+            bindFallbackCallback(std::auto_ptr<Callback>(new MemberCallback<T>(static_cast<T*>(this), method)));
+        else
+            bindFallbackCallback(std::auto_ptr<Callback>());
     }
 
     // Some fields are protected because some tests depend on accessing them,
     // but otherwise they should be considered private.
 
-    typedef HashMap<NPIdentifier, PropertyCallback*> PropertyList;
-    typedef HashMap<NPIdentifier, Callback*> MethodList;
+    typedef std::map<NPIdentifier, PropertyCallback*> PropertyList;
+    typedef std::map<NPIdentifier, Callback*> MethodList;
     // These maps associate names with property and method pointers to be
     // exposed to JavaScript.
     PropertyList m_properties;
     MethodList m_methods;
 
     // The callback gets invoked when a call is made to an nonexistent method.
-    OwnPtr<Callback> m_fallbackCallback;
+    std::auto_ptr<Callback> m_fallbackCallback;
 
 private:
     // NPObject callbacks.
@@ -240,6 +238,12 @@
     // True if our np_object has been bound to a WebFrame, in which case it must
     // be unregistered with V8 when we delete it.
     bool m_boundToFrame;
+
+private:
+    CppBoundClass(CppBoundClass&);
+    CppBoundClass& operator=(const CppBoundClass&);
 };
 
+}
+
 #endif // CppBoundClass_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp
index b587d75..ef2e92a 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.cpp
@@ -31,14 +31,15 @@
 #include "config.h"
 #include "CppVariant.h"
 
+#include "TestCommon.h"
 #include "WebBindings.h"
 #include <limits>
-#include <wtf/Assertions.h>
-#include <wtf/StringExtras.h>
 
 using namespace WebKit;
 using namespace std;
 
+namespace WebTestRunner {
+
 CppVariant::CppVariant()
 {
     type = NPVariantType_Null;
@@ -218,7 +219,7 @@
 
 string CppVariant::toString() const
 {
-    ASSERT(isString());
+    WEBKIT_ASSERT(isString());
     return string(value.stringValue.UTF8Characters,
                   value.stringValue.UTF8Length);
 }
@@ -229,7 +230,7 @@
         return value.intValue;
     if (isDouble())
         return static_cast<int32_t>(value.doubleValue);
-    ASSERT_NOT_REACHED();
+    WEBKIT_ASSERT_NOT_REACHED();
     return 0;
 }
 
@@ -239,21 +240,21 @@
         return static_cast<double>(value.intValue);
     if (isDouble())
         return value.doubleValue;
-    ASSERT_NOT_REACHED();
+    WEBKIT_ASSERT_NOT_REACHED();
     return 0;
 }
 
 bool CppVariant::toBoolean() const
 {
-    ASSERT(isBool());
+    WEBKIT_ASSERT(isBool());
     return value.boolValue;
 }
 
-Vector<string> CppVariant::toStringVector() const
+vector<string> CppVariant::toStringVector() const
 {
 
-    ASSERT(isObject());
-    Vector<string> stringVector;
+    WEBKIT_ASSERT(isObject());
+    vector<string> stringVector;
     NPObject* npValue = value.objectValue;
     NPIdentifier lengthId = WebBindings::getStringIdentifier("length");
 
@@ -288,7 +289,7 @@
         if (NPVARIANT_IS_STRING(indexValue)) {
             string item(NPVARIANT_TO_STRING(indexValue).UTF8Characters,
                         NPVARIANT_TO_STRING(indexValue).UTF8Length);
-            stringVector.append(item);
+            stringVector.push_back(item);
         }
         WebBindings::releaseVariantValue(&indexValue);
     }
@@ -298,7 +299,7 @@
 bool CppVariant::invoke(const string& method, const CppVariant* arguments,
                         uint32_t argumentCount, CppVariant& result) const
 {
-    ASSERT(isObject());
+    WEBKIT_ASSERT(isObject());
     NPIdentifier methodName = WebBindings::getStringIdentifier(method.c_str());
     NPObject* npObject = value.objectValue;
     if (!WebBindings::hasMethod(0, npObject, methodName))
@@ -312,10 +313,12 @@
 bool CppVariant::invokeDefault(const CppVariant* arguments, uint32_t argumentCount,
                                CppVariant& result) const
 {
-    ASSERT(isObject());
+    WEBKIT_ASSERT(isObject());
     NPObject* npObject = value.objectValue;
     NPVariant r;
     bool status = WebBindings::invokeDefault(0, npObject, arguments, argumentCount, &r);
     result.set(r);
     return status;
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.h b/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.h
index 47fd466..e9295a3 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/CppVariant.h
@@ -44,7 +44,9 @@
 
 #include "WebBindings.h"
 #include <string>
-#include <wtf/Vector.h>
+#include <vector>
+
+namespace WebTestRunner {
 
 class CppVariant : public NPVariant {
 public:
@@ -118,7 +120,7 @@
     bool toBoolean() const;
     // Returns a vector of strings for the specified argument. This is useful
     // for converting a JavaScript array of strings into a vector of strings.
-    Vector<std::string> toStringVector() const;
+    std::vector<std::string> toStringVector() const;
 
     // Invoke method of the given name on an object with the supplied arguments.
     // The first argument should be the object on which the method is to be
@@ -137,4 +139,6 @@
                        uint32_t argumentCount, CppVariant& result) const;
 };
 
+}
+
 #endif // CppVariant_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.cpp
index 77fcb76..008a010 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.cpp
@@ -44,20 +44,20 @@
 #include "EventSender.h"
 
 #include "KeyCodeMapping.h"
-#include "TestDelegate.h"
+#include "MockSpellCheck.h"
+#include "TestCommon.h"
 #include "WebContextMenuData.h"
 #include "WebDragOperation.h"
-#include "WebEventSender.h"
+#include "WebTestDelegate.h"
 #include "WebTouchPoint.h"
 #include "WebView.h"
-#include "platform/WebDragData.h"
-#include "platform/WebPoint.h"
-#include "platform/WebString.h"
-#include "platform/WebVector.h"
-#include <wtf/Deque.h>
-#include <wtf/StringExtras.h>
+#include <deque>
+#include <public/WebDragData.h>
+#include <public/WebPoint.h>
+#include <public/WebString.h>
+#include <public/WebVector.h>
 
-#if OS(WINDOWS)
+#ifdef WIN32
 #include "win/WebInputEventFactory.h"
 #endif
 
@@ -97,9 +97,9 @@
 WebDragOperation currentDragEffect;
 WebDragOperationsMask currentDragEffectsAllowed;
 bool replayingSavedEvents = false;
-Deque<SavedEvent> mouseEventQueue;
+deque<SavedEvent> mouseEventQueue;
 int touchModifiers;
-Vector<WebTouchPoint> touchPoints;
+vector<WebTouchPoint> touchPoints;
 
 // Time and place of the last mouse up event.
 double lastClickTimeSec = 0;
@@ -126,7 +126,7 @@
 // dependent (e.g., dragging has a timeout vs selection).
 uint32 timeOffsetMs = 0;
 
-double getCurrentEventTimeSec(TestDelegate* delegate)
+double getCurrentEventTimeSec(WebTestDelegate* delegate)
 {
     return (delegate->getCurrentTimeInMillisecond() + timeOffsetMs) / 1000.0;
 }
@@ -155,7 +155,7 @@
     bool isSystemKey = false;
     const char* characters = modifierName.c_str();
     if (!strcmp(characters, "ctrlKey")
-#if !OS(MAC_OS_X)
+#ifndef __APPLE__
         || !strcmp(characters, "addSelectionKey")
 #endif
         ) {
@@ -164,7 +164,7 @@
         event->modifiers |= WebInputEvent::ShiftKey;
     else if (!strcmp(characters, "altKey")) {
         event->modifiers |= WebInputEvent::AltKey;
-#if !OS(MAC_OS_X)
+#ifndef __APPLE__
         // On Windows all keys with Alt modifier will be marked as system key.
         // We keep the same behavior on Linux and everywhere non-Mac, see:
         // WebKit/chromium/src/gtk/WebInputEventFactory.cpp
@@ -172,7 +172,7 @@
         // kept in sync with the related code in above file.
         isSystemKey = true;
 #endif
-#if OS(MAC_OS_X)
+#ifdef __APPLE__
     } else if (!strcmp(characters, "metaKey") || !strcmp(characters, "addSelectionKey")) {
         event->modifiers |= WebInputEvent::MetaKey;
         // On Mac only command key presses are marked as system key.
@@ -191,8 +191,8 @@
 {
     bool isSystemKey = false;
     if (argument->isObject()) {
-        Vector<string> modifiers = argument->toStringVector();
-        for (Vector<string>::const_iterator i = modifiers.begin(); i != modifiers.end(); ++i)
+        vector<string> modifiers = argument->toStringVector();
+        for (vector<string>::const_iterator i = modifiers.begin(); i != modifiers.end(); ++i)
             isSystemKey |= applyKeyModifier(*i, event);
     } else if (argument->isString())
         isSystemKey = applyKeyModifier(argument->toString(), event);
@@ -204,7 +204,7 @@
 // of the edit command will be stored in |*name|.
 bool getEditCommand(const WebKeyboardEvent& event, string* name)
 {
-#if OS(MAC_OS_X)
+#ifdef __APPLE__
     // We only cares about Left,Right,Up,Down keys with Command or Command+Shift
     // modifiers. These key events correspond to some special movement and
     // selection editor commands, and was supposed to be handled in
@@ -275,6 +275,7 @@
     bindMethod("mouseMoveTo", &EventSender::mouseMoveTo);
     bindMethod("mouseScrollBy", &EventSender::mouseScrollBy);
     bindMethod("mouseUp", &EventSender::mouseUp);
+    bindMethod("mouseDragBegin", &EventSender::mouseDragBegin);
     bindMethod("releaseTouchPoint", &EventSender::releaseTouchPoint);
     bindMethod("scheduleAsynchronousClick", &EventSender::scheduleAsynchronousClick);
     bindMethod("scheduleAsynchronousKeyDown", &EventSender::scheduleAsynchronousKeyDown);
@@ -292,10 +293,12 @@
     bindMethod("gestureScrollEnd", &EventSender::gestureScrollEnd);
     bindMethod("gestureScrollFirstPoint", &EventSender::gestureScrollFirstPoint);
     bindMethod("gestureScrollUpdate", &EventSender::gestureScrollUpdate);
+    bindMethod("gestureScrollUpdateWithoutPropagation", &EventSender::gestureScrollUpdateWithoutPropagation);
     bindMethod("gestureTap", &EventSender::gestureTap);
     bindMethod("gestureTapDown", &EventSender::gestureTapDown);
     bindMethod("gestureTapCancel", &EventSender::gestureTapCancel);
     bindMethod("gestureLongPress", &EventSender::gestureLongPress);
+    bindMethod("gestureLongTap", &EventSender::gestureLongTap);
     bindMethod("gestureTwoFingerTap", &EventSender::gestureTwoFingerTap);
     bindMethod("zoomPageIn", &EventSender::zoomPageIn);
     bindMethod("zoomPageOut", &EventSender::zoomPageOut);
@@ -304,7 +307,7 @@
     // When set to true (the default value), we batch mouse move and mouse up
     // events so we can simulate drag & drop.
     bindProperty("dragMode", &dragMode);
-#if OS(WINDOWS)
+#ifdef WIN32
     bindProperty("WM_KEYDOWN", &wmKeyDown);
     bindProperty("WM_KEYUP", &wmKeyUp);
     bindProperty("WM_CHAR", &wmChar);
@@ -316,16 +319,25 @@
 #endif
 }
 
+EventSender::~EventSender()
+{
+}
+
+void EventSender::setContextMenuData(const WebContextMenuData& contextMenuData)
+{
+    m_lastContextMenuData = auto_ptr<WebContextMenuData>(new WebContextMenuData(contextMenuData));
+}
+
 void EventSender::reset()
 {
     // The test should have finished a drag and the mouse button state.
-    ASSERT(currentDragData.isNull());
+    WEBKIT_ASSERT(currentDragData.isNull());
     currentDragData.reset();
     currentDragEffect = WebKit::WebDragOperationNone;
     currentDragEffectsAllowed = WebKit::WebDragOperationNone;
     pressedButton = WebMouseEvent::ButtonNone;
     dragMode.set(true);
-#if OS(WINDOWS)
+#ifdef WIN32
     wmKeyDown.set(WM_KEYDOWN);
     wmKeyUp.set(WM_KEYUP);
     wmChar.set(WM_CHAR);
@@ -415,7 +427,7 @@
     webview()->layout();
 
     int buttonNumber = getButtonNumberFromSingleArg(arguments);
-    ASSERT(buttonNumber != -1);
+    WEBKIT_ASSERT(buttonNumber != -1);
 
     WebMouseEvent::Button buttonType = getButtonTypeFromButtonNumber(buttonNumber);
 
@@ -437,7 +449,7 @@
     webview()->layout();
 
     int buttonNumber = getButtonNumberFromSingleArg(arguments);
-    ASSERT(buttonNumber != -1);
+    WEBKIT_ASSERT(buttonNumber != -1);
 
     WebMouseEvent::Button buttonType = getButtonTypeFromButtonNumber(buttonNumber);
 
@@ -445,7 +457,7 @@
         SavedEvent savedEvent;
         savedEvent.type = SavedEvent::MouseUp;
         savedEvent.buttonType = buttonType;
-        mouseEventQueue.append(savedEvent);
+        mouseEventQueue.push_back(savedEvent);
         replaySavedEvents();
     } else {
         WebMouseEvent event;
@@ -467,10 +479,17 @@
     // If we're in a drag operation, complete it.
     if (currentDragData.isNull())
         return;
+
     WebPoint clientPoint(e.x, e.y);
     WebPoint screenPoint(e.globalX, e.globalY);
+    finishDragAndDrop(e, webview()->dragTargetDragOver(clientPoint, screenPoint, currentDragEffectsAllowed, 0));
+}
 
-    currentDragEffect = webview()->dragTargetDragOver(clientPoint, screenPoint, currentDragEffectsAllowed, 0);
+void EventSender::finishDragAndDrop(const WebMouseEvent& e, WebKit::WebDragOperation dragEffect)
+{
+    WebPoint clientPoint(e.x, e.y);
+    WebPoint screenPoint(e.globalX, e.globalY);
+    currentDragEffect = dragEffect;
     if (currentDragEffect)
         webview()->dragTargetDrop(clientPoint, screenPoint, 0);
     else
@@ -495,7 +514,7 @@
         SavedEvent savedEvent;
         savedEvent.type = SavedEvent::MouseMove;
         savedEvent.pos = mousePos;
-        mouseEventQueue.append(savedEvent);
+        mouseEventQueue.push_back(savedEvent);
     } else {
         WebMouseEvent event;
         initMouseEvent(WebInputEvent::MouseMove, pressedButton, mousePos, &event, getCurrentEventTimeSec(m_delegate));
@@ -588,13 +607,18 @@
         }
         if (!code) {
             WebString webCodeStr = WebString::fromUTF8(codeStr.data(), codeStr.size());
-            ASSERT(webCodeStr.length() == 1);
+            WEBKIT_ASSERT(webCodeStr.length() == 1);
             text = code = webCodeStr.data()[0];
             needsShiftKeyModifier = needsShiftModifier(code);
             if ((code & 0xFF) >= 'a' && (code & 0xFF) <= 'z')
                 code -= 'a' - 'A';
             generateChar = true;
         }
+
+        if ("(" == codeStr) {
+            code = '9';
+            needsShiftKeyModifier = true;
+        }
     }
 
     // For one generated keyboard event, we need to generate a keyDown/keyUp
@@ -606,7 +630,7 @@
     eventDown.type = WebInputEvent::RawKeyDown;
     eventDown.modifiers = 0;
     eventDown.windowsKeyCode = code;
-#if OS(LINUX) && USE(GTK)
+#if defined(__linux__) && USE(GTK)
     eventDown.nativeKeyCode = NativeKeyCodeForWindowsKeyCode(code);
 #endif
 
@@ -647,6 +671,12 @@
 
     webview()->handleInputEvent(eventDown);
 
+    if (code == VKEY_ESCAPE && !currentDragData.isNull()) {
+        WebMouseEvent event;
+        initMouseEvent(WebInputEvent::MouseDown, pressedButton, lastMousePos, &event, getCurrentEventTimeSec(m_delegate));
+        finishDragAndDrop(event, WebKit::WebDragOperationNone);
+    }
+
     m_delegate->clearEditCommand();
 
     if (generateChar) {
@@ -662,7 +692,7 @@
 {
     result->setNull();
 
-#if OS(WINDOWS)
+#ifdef WIN32
     if (arguments.size() == 3) {
         // Grab the message id to see if we need to dispatch it.
         int msg = arguments[0].toInt32();
@@ -678,7 +708,7 @@
         unsigned long lparam = static_cast<unsigned long>(arguments[2].toDouble());
         webview()->handleInputEvent(WebInputEventFactory::keyboardEvent(0, msg, arguments[1].toInt32(), lparam));
     } else
-        ASSERT_NOT_REACHED();
+        WEBKIT_ASSERT_NOT_REACHED();
 #endif
 }
 
@@ -702,7 +732,7 @@
         SavedEvent savedEvent;
         savedEvent.type = SavedEvent::LeapForward;
         savedEvent.milliseconds = milliseconds;
-        mouseEventQueue.append(savedEvent);
+        mouseEventQueue.push_back(savedEvent);
     } else
         doLeapForward(milliseconds);
 }
@@ -763,8 +793,9 @@
 void EventSender::replaySavedEvents()
 {
     replayingSavedEvents = true;
-    while (!mouseEventQueue.isEmpty()) {
-        SavedEvent e = mouseEventQueue.takeFirst();
+    while (!mouseEventQueue.empty()) {
+        SavedEvent e = mouseEventQueue.front();
+        mouseEventQueue.pop_front();
 
         switch (e.type) {
         case SavedEvent::MouseMove: {
@@ -783,7 +814,7 @@
             break;
         }
         default:
-            ASSERT_NOT_REACHED();
+            WEBKIT_ASSERT_NOT_REACHED();
         }
     }
 
@@ -797,7 +828,7 @@
 //   also makes sense. This function is doing such for some flags.
 // - Some test even checks actual string content. So providing it would be also helpful.
 //
-static Vector<WebString> makeMenuItemStringsFor(WebContextMenuData* contextMenu, TestDelegate* delegate)
+static vector<WebString> makeMenuItemStringsFor(WebContextMenuData* contextMenu, WebTestDelegate* delegate)
 {
     // These constants are based on Safari's context menu because tests are made for it.
     static const char* nonEditableMenuStrings[] = { "Back", "Reload Page", "Open in Dashbaord", "<separator>", "View Source", "Save Page As", "Print Page", "Inspect Element", 0 };
@@ -805,20 +836,20 @@
 
     // This is possible because mouse events are cancelleable.
     if (!contextMenu)
-        return Vector<WebString>();
+        return vector<WebString>();
 
-    Vector<WebString> strings;
+    vector<WebString> strings;
 
     if (contextMenu->isEditable) {
         for (const char** item = editableMenuStrings; *item; ++item) 
-            strings.append(WebString::fromUTF8(*item));
+            strings.push_back(WebString::fromUTF8(*item));
         WebVector<WebString> suggestions;
-        delegate->fillSpellingSuggestionList(contextMenu->misspelledWord, &suggestions);
+        MockSpellCheck::fillSuggestionList(contextMenu->misspelledWord, &suggestions);
         for (size_t i = 0; i < suggestions.size(); ++i) 
-            strings.append(suggestions[i]);
+            strings.push_back(suggestions[i]);
     } else {
         for (const char** item = nonEditableMenuStrings; *item; ++item) 
-            strings.append(WebString::fromUTF8(*item));
+            strings.push_back(WebString::fromUTF8(*item));
     }
 
     return strings;
@@ -832,21 +863,25 @@
 
     // Clears last context menu data because we need to know if the context menu be requested 
     // after following mouse events.
-    m_delegate->clearContextMenuData();
+    m_lastContextMenuData.reset();
 
     // Generate right mouse down and up.
     WebMouseEvent event;
-    pressedButton = WebMouseEvent::ButtonRight;
+    // This is a hack to work around only allowing a single pressed button since we want to
+    // test the case where both the left and right mouse buttons are pressed.
+    if (pressedButton == WebMouseEvent::ButtonNone)
+        pressedButton = WebMouseEvent::ButtonRight;
     initMouseEvent(WebInputEvent::MouseDown, WebMouseEvent::ButtonRight, lastMousePos, &event, getCurrentEventTimeSec(m_delegate));
     webview()->handleInputEvent(event);
 
+#ifdef WIN32
     initMouseEvent(WebInputEvent::MouseUp, WebMouseEvent::ButtonRight, lastMousePos, &event, getCurrentEventTimeSec(m_delegate));
     webview()->handleInputEvent(event);
 
     pressedButton = WebMouseEvent::ButtonNone;
+#endif
 
-    WebContextMenuData* lastContextMenu = m_delegate->lastContextMenuData();
-    result->set(WebBindings::makeStringArray(makeMenuItemStringsFor(lastContextMenu, m_delegate)));
+    result->set(WebBindings::makeStringArray(makeMenuItemStringsFor(m_lastContextMenuData.get(), m_delegate)));
 }
 
 class MouseDownTask: public WebMethodTask<EventSender> {
@@ -895,7 +930,7 @@
 void EventSender::beginDragWithFiles(const CppArgumentList& arguments, CppVariant* result)
 {
     currentDragData.initialize();
-    Vector<string> files = arguments[0].toStringVector();
+    vector<string> files = arguments[0].toStringVector();
     WebVector<WebString> absoluteFilenames(files.size());
     for (size_t i = 0; i < files.size(); ++i) {
         WebDragData::Item item;
@@ -934,7 +969,7 @@
             lowestId++;
     }
     touchPoint.id = lowestId;
-    touchPoints.append(touchPoint);
+    touchPoints.push_back(touchPoint);
 }
 
 void EventSender::clearTouchPoints(const CppArgumentList&, CppVariant* result)
@@ -948,7 +983,7 @@
     result->setNull();
 
     const unsigned index = arguments[0].toInt32();
-    ASSERT(index < touchPoints.size());
+    WEBKIT_ASSERT(index < touchPoints.size());
 
     WebTouchPoint* touchPoint = &touchPoints[index];
     touchPoint->state = WebTouchPoint::StateReleased;
@@ -980,7 +1015,7 @@
     result->setNull();
 
     const unsigned index = arguments[0].toInt32();
-    ASSERT(index < touchPoints.size());
+    WEBKIT_ASSERT(index < touchPoints.size());
 
     WebPoint position(arguments[1].toInt32(), arguments[2].toInt32());
     WebTouchPoint* touchPoint = &touchPoints[index];
@@ -994,7 +1029,7 @@
     result->setNull();
 
     const unsigned index = arguments[0].toInt32();
-    ASSERT(index < touchPoints.size());
+    WEBKIT_ASSERT(index < touchPoints.size());
 
     WebTouchPoint* touchPoint = &touchPoints[index];
     touchPoint->state = WebTouchPoint::StateCancelled;
@@ -1002,7 +1037,7 @@
 
 void EventSender::sendCurrentTouchEvent(const WebInputEvent::Type type)
 {
-    ASSERT(static_cast<unsigned>(WebTouchEvent::touchesLengthCap) > touchPoints.size());
+    WEBKIT_ASSERT(static_cast<unsigned>(WebTouchEvent::touchesLengthCap) > touchPoints.size());
     webview()->layout();
 
     WebTouchEvent touchEvent;
@@ -1017,13 +1052,22 @@
     for (unsigned i = 0; i < touchPoints.size(); ++i) {
         WebTouchPoint* touchPoint = &touchPoints[i];
         if (touchPoint->state == WebTouchPoint::StateReleased) {
-            touchPoints.remove(i);
+            touchPoints.erase(touchPoints.begin() + i);
             --i;
         } else
             touchPoint->state = WebTouchPoint::StateStationary;
     }
 }
 
+void EventSender::mouseDragBegin(const CppArgumentList& arguments, CppVariant* result)
+{
+    WebMouseWheelEvent event;
+    initMouseEvent(WebInputEvent::MouseWheel, WebMouseEvent::ButtonNone, lastMousePos, &event, getCurrentEventTimeSec(m_delegate));
+    event.phase = WebMouseWheelEvent::PhaseBegan;
+    event.hasPreciseScrollingDeltas = true;
+    webview()->handleInputEvent(event);
+}
+
 void EventSender::handleMouseWheel(const CppArgumentList& arguments, CppVariant* result, bool continuous)
 {
     result->setNull();
@@ -1108,6 +1152,12 @@
     gestureEvent(WebInputEvent::GestureScrollUpdate, arguments);
 }
 
+void EventSender::gestureScrollUpdateWithoutPropagation(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    gestureEvent(WebInputEvent::GestureScrollUpdateWithoutPropagation, arguments);
+}
+
 void EventSender::gestureTap(const CppArgumentList& arguments, CppVariant* result)
 {
     result->setNull();
@@ -1132,6 +1182,12 @@
     gestureEvent(WebInputEvent::GestureLongPress, arguments);
 }
 
+void EventSender::gestureLongTap(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    gestureEvent(WebInputEvent::GestureLongTap, arguments);
+}
+
 void EventSender::gestureTwoFingerTap(const CppArgumentList& arguments, CppVariant* result)
 {
     result->setNull();
@@ -1160,6 +1216,7 @@
 
     switch (type) {
     case WebInputEvent::GestureScrollUpdate:
+    case WebInputEvent::GestureScrollUpdateWithoutPropagation:
         event.data.scrollUpdate.deltaX = static_cast<float>(arguments[0].toDouble());
         event.data.scrollUpdate.deltaY = static_cast<float>(arguments[1].toDouble());
         event.x = m_currentGestureLocation.x;
@@ -1201,8 +1258,16 @@
         event.x = point.x;
         event.y = point.y;
         if (arguments.size() >= 4) {
-            event.data.tapDown.width = static_cast<float>(arguments[2].toDouble());
-            event.data.tapDown.height = static_cast<float>(arguments[3].toDouble());
+            event.data.longPress.width = static_cast<float>(arguments[2].toDouble());
+            event.data.longPress.height = static_cast<float>(arguments[3].toDouble());
+        }
+        break;
+    case WebInputEvent::GestureLongTap:
+        event.x = point.x;
+        event.y = point.y;
+        if (arguments.size() >= 4) {
+            event.data.longPress.width = static_cast<float>(arguments[2].toDouble());
+            event.data.longPress.height = static_cast<float>(arguments[3].toDouble());
         }
         break;
     case WebInputEvent::GestureTwoFingerTap:
@@ -1214,7 +1279,7 @@
         }
         break;
     default:
-        ASSERT_NOT_REACHED();
+        WEBKIT_ASSERT_NOT_REACHED();
     }
 
     event.globalX = event.x;
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.h b/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.h
index d07e14c..9b36b5f 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/EventSender.h
@@ -41,24 +41,29 @@
 #include "WebDragOperation.h"
 #include "WebInputEvent.h"
 #include "WebTask.h"
-#include "platform/WebPoint.h"
+#include <memory>
+#include <public/WebPoint.h>
 
 namespace WebKit {
 class WebDragData;
 class WebView;
+struct WebContextMenuData;
 }
 
-class TestDelegate;
-
 namespace WebTestRunner {
 
+class WebTestDelegate;
+
 class EventSender : public CppBoundClass {
 public:
     EventSender();
+    ~EventSender();
 
-    void setDelegate(TestDelegate* delegate) { m_delegate = delegate; }
+    void setDelegate(WebTestDelegate* delegate) { m_delegate = delegate; }
     void setWebView(WebKit::WebView* webView) { m_webView = webView; }
 
+    void setContextMenuData(const WebKit::WebContextMenuData&);
+
     // Resets some static variable state.
     void reset();
 
@@ -69,6 +74,7 @@
     void dumpFilenameBeingDragged(const CppArgumentList&, CppVariant*);
 
     // JS callback methods.
+    void contextClick(const CppArgumentList&, CppVariant*);
     void mouseDown(const CppArgumentList&, CppVariant*);
     void mouseUp(const CppArgumentList&, CppVariant*);
     void mouseMoveTo(const CppArgumentList&, CppVariant*);
@@ -82,6 +88,7 @@
     void zoomPageOut(const CppArgumentList&, CppVariant*);
     void scalePageBy(const CppArgumentList&, CppVariant*);
 
+    void mouseDragBegin(const CppArgumentList&, CppVariant*);
     void mouseScrollBy(const CppArgumentList&, CppVariant*);
     void continuousMouseScrollBy(const CppArgumentList&, CppVariant*);
     void scheduleAsynchronousClick(const CppArgumentList&, CppVariant*);
@@ -106,15 +113,16 @@
     void gestureScrollEnd(const CppArgumentList&, CppVariant*);
     void gestureScrollFirstPoint(const CppArgumentList&, CppVariant*);
     void gestureScrollUpdate(const CppArgumentList&, CppVariant*);
+    void gestureScrollUpdateWithoutPropagation(const CppArgumentList&, CppVariant*);
     void gestureTap(const CppArgumentList&, CppVariant*);
     void gestureTapDown(const CppArgumentList&, CppVariant*);
     void gestureTapCancel(const CppArgumentList&, CppVariant*);
     void gestureLongPress(const CppArgumentList&, CppVariant*);
+    void gestureLongTap(const CppArgumentList&, CppVariant*);
     void gestureTwoFingerTap(const CppArgumentList&, CppVariant*);
     void gestureEvent(WebKit::WebInputEvent::Type, const CppArgumentList&);
 
     // Unimplemented stubs
-    void contextClick(const CppArgumentList&, CppVariant*);
     void enableDOMUIEventLogging(const CppArgumentList&, CppVariant*);
     void fireKeyboardEventsToElement(const CppArgumentList&, CppVariant*);
     void clearKillRing(const CppArgumentList&, CppVariant*);
@@ -157,6 +165,7 @@
     // modifier to be passed into the generated event.
     bool needsShiftModifier(int);
 
+    void finishDragAndDrop(const WebKit::WebMouseEvent&, WebKit::WebDragOperation);
     void updateClickCountForButton(WebKit::WebMouseEvent::Button);
 
     // Compose a touch event from the current touch points and send it.
@@ -167,9 +176,11 @@
 
     WebTaskList m_taskList;
 
-    TestDelegate* m_delegate;
+    WebTestDelegate* m_delegate;
     WebKit::WebView* m_webView;
 
+    std::auto_ptr<WebKit::WebContextMenuData> m_lastContextMenuData;
+
     // Location of the touch point that initiated a gesture.
     WebKit::WebPoint m_currentGestureLocation;
 
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.cpp
index 282ce44..2654400 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.cpp
@@ -30,10 +30,12 @@
 
 #include "config.h"
 #include "GamepadController.h"
-#include "TestDelegate.h"
+#include "WebTestDelegate.h"
 
 using namespace WebKit;
 
+namespace WebTestRunner {
+
 GamepadController::GamepadController()
 {
     bindMethod("connect", &GamepadController::connect);
@@ -54,7 +56,7 @@
     CppBoundClass::bindToJavascript(frame, classname);
 }
 
-void GamepadController::setDelegate(TestDelegate* delegate)
+void GamepadController::setDelegate(WebTestDelegate* delegate)
 {
     m_delegate = delegate;
 }
@@ -193,3 +195,5 @@
     m_delegate->printMessage("CONSOLE MESSAGE: JavaScript ERROR: unknown method called on GamepadController\n");
     result->setNull();
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.h b/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.h
index 4e65e92..5dcab6c 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/GamepadController.h
@@ -32,21 +32,23 @@
 #define GamepadController_h
 
 #include "CppBoundClass.h"
-#include "platform/WebGamepads.h"
-
-class TestDelegate;
+#include <public/WebGamepads.h>
 
 namespace WebKit {
 class WebGamepads;
 class WebFrame;
 }
 
+namespace WebTestRunner {
+
+class WebTestDelegate;
+
 class GamepadController : public CppBoundClass {
 public:
     GamepadController();
 
     void bindToJavascript(WebKit::WebFrame*, const WebKit::WebString& classname);
-    void setDelegate(TestDelegate*);
+    void setDelegate(WebTestDelegate*);
     void reset();
 
 private:
@@ -62,7 +64,9 @@
 
     WebKit::WebGamepads m_gamepads;
 
-    TestDelegate* m_delegate;
+    WebTestDelegate* m_delegate;
 };
 
+}
+
 #endif // GamepadController_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp
index c339f2f..211586e 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.cpp
@@ -31,13 +31,11 @@
 #include "config.h"
 #include "KeyCodeMapping.h"
 
-#include <wtf/UnusedParam.h>
-
 namespace WebTestRunner {
 
 int NativeKeyCodeForWindowsKeyCode(int keysym)
 {
-#if OS(LINUX) && USE(GTK)
+#if defined(__linux__) && USE(GTK)
     // See /usr/share/X11/xkb/keycodes/*
     static const int asciiToKeyCode[] = {
         0,
@@ -240,8 +238,7 @@
         return 0;
     }
 #else
-    UNUSED_PARAM(keysym);
-    return 0;
+    return keysym - keysym;
 #endif
 }
 
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.h b/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.h
index 87469fa..023e595 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/KeyCodeMapping.h
@@ -36,6 +36,7 @@
 // The keycodes match the values of the virtual keycodes found here http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
 enum {
     VKEY_RETURN   = 0x0D,
+    VKEY_ESCAPE   = 0x1B,
     VKEY_PRIOR    = 0x21,
     VKEY_NEXT     = 0x22,
     VKEY_END      = 0x23,
diff --git a/Tools/DumpRenderTree/chromium/MockConstraints.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockConstraints.cpp
similarity index 90%
rename from Tools/DumpRenderTree/chromium/MockConstraints.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockConstraints.cpp
index a4f1584..1436550 100644
--- a/Tools/DumpRenderTree/chromium/MockConstraints.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockConstraints.cpp
@@ -29,27 +29,31 @@
  */
 
 #include "config.h"
-#if ENABLE(MEDIA_STREAM)
 
+#if ENABLE_WEBRTC
 #include "MockConstraints.h"
 
 #include <public/WebMediaConstraints.h>
 
 using namespace WebKit;
 
-namespace MockConstraints {
+namespace WebTestRunner {
 
-static bool isSupported(const WebString& constraint)
+namespace {
+
+bool isSupported(const WebString& constraint)
 {
     return constraint == "valid_and_supported_1" || constraint == "valid_and_supported_2";
 }
 
-static bool isValid(const WebString& constraint)
+bool isValid(const WebString& constraint)
 {
     return isSupported(constraint) || constraint == "valid_but_unsupported_1" || constraint == "valid_but_unsupported_2";
 }
 
-bool verifyConstraints(const WebMediaConstraints& constraints)
+}
+
+bool MockConstraints::verifyConstraints(const WebMediaConstraints& constraints)
 {
     WebVector<WebMediaConstraint> mandatoryConstraints;
     constraints.getMandatoryConstraints(mandatoryConstraints);
@@ -74,6 +78,6 @@
     return true;
 }
 
-} // namespace MockConstraints
+}
 
-#endif // ENABLE(MEDIA_STREAM)
+#endif // ENABLE_WEBRTC
diff --git a/Tools/DumpRenderTree/chromium/MockConstraints.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockConstraints.h
similarity index 90%
rename from Tools/DumpRenderTree/chromium/MockConstraints.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockConstraints.h
index 6bf0da9..27101c4 100644
--- a/Tools/DumpRenderTree/chromium/MockConstraints.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockConstraints.h
@@ -31,19 +31,18 @@
 #ifndef MockConstraints_h
 #define MockConstraints_h
 
-#if ENABLE(MEDIA_STREAM)
-
 namespace WebKit {
 class WebMediaConstraints;
 }
 
-namespace MockConstraints {
+namespace WebTestRunner {
 
-bool verifyConstraints(const WebKit::WebMediaConstraints&);
+class MockConstraints {
+public:
+    static bool verifyConstraints(const WebKit::WebMediaConstraints&);
+};
 
-} // namespace MockConstraints
-
-#endif // ENABLE(MEDIA_STREAM)
+}
 
 #endif // MockConstraints_h
 
diff --git a/Tools/DumpRenderTree/chromium/MockGrammarCheck.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp
similarity index 79%
rename from Tools/DumpRenderTree/chromium/MockGrammarCheck.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp
index e004476..61eee0c 100644
--- a/Tools/DumpRenderTree/chromium/MockGrammarCheck.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.cpp
@@ -31,20 +31,22 @@
 #include "config.h"
 #include "MockGrammarCheck.h"
 
+#include "Platform/chromium/public/WebCString.h"
+#include "Platform/chromium/public/WebString.h"
+#include "TestCommon.h"
 #include "WebTextCheckingResult.h"
-#include "platform/WebString.h"
-
-#include <wtf/ASCIICType.h>
-#include <wtf/Assertions.h>
-#include <wtf/text/WTFString.h>
+#include <algorithm>
 
 using namespace WebKit;
+using namespace std;
 
-bool MockGrammarCheck::checkGrammarOfString(const WebString& text, Vector<WebTextCheckingResult>* results)
+namespace WebTestRunner {
+
+bool MockGrammarCheck::checkGrammarOfString(const WebString& text, vector<WebTextCheckingResult>* results)
 {
-    ASSERT(results);
-    WTF::String stringText(text.data(), text.length());
-    if (stringText.find(isASCIIAlpha) == static_cast<size_t>(-1))
+    WEBKIT_ASSERT(results);
+    string16 stringText = text;
+    if (find_if(stringText.begin(), stringText.end(), isASCIIAlpha) == stringText.end())
         return true;
 
     // Find matching grammatical errors from known ones. This function has to
@@ -69,10 +71,13 @@
     };
     for (size_t i = 0; i < ARRAYSIZE_UNSAFE(grammarErrors); ++i) {
         int offset = 0;
-        while ((offset = stringText.find(grammarErrors[i].text, offset)) != -1) {
-            results->append(WebTextCheckingResult(WebTextCheckingTypeGrammar, offset + grammarErrors[i].location, grammarErrors[i].length));
+        string16 error(grammarErrors[i].text, grammarErrors[i].text + strlen(grammarErrors[i].text));
+        while ((offset = stringText.find(error, offset)) != string16::npos) {
+            results->push_back(WebTextCheckingResult(WebTextCheckingTypeGrammar, offset + grammarErrors[i].location, grammarErrors[i].length));
             offset += grammarErrors[i].length;
         }
     }
     return false;
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/MockGrammarCheck.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h
similarity index 92%
rename from Tools/DumpRenderTree/chromium/MockGrammarCheck.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h
index 64271b3..a183dcc 100644
--- a/Tools/DumpRenderTree/chromium/MockGrammarCheck.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockGrammarCheck.h
@@ -31,8 +31,7 @@
 #ifndef MockGrammarCheck_h
 #define MockGrammarCheck_h
 
-#include <wtf/Vector.h>
-#include <wtf/text/WTFString.h>
+#include <vector>
 
 namespace WebKit {
 
@@ -41,6 +40,8 @@
 
 }
 
+namespace WebTestRunner {
+
 // A mock implementation of a grammar-checker used for WebKit tests. This class
 // only implements the minimal functionarities required by WebKit tests, i.e.
 // this class just compares the given string with known grammar mistakes in
@@ -48,7 +49,9 @@
 // for webkit tests, this class is not suitable for any other usages.
 class MockGrammarCheck {
 public:
-    static bool checkGrammarOfString(const WebKit::WebString&, Vector<WebKit::WebTextCheckingResult>*);
+    static bool checkGrammarOfString(const WebKit::WebString&, std::vector<WebKit::WebTextCheckingResult>*);
 };
 
+}
+
 #endif // MockSpellCheck_h
diff --git a/Tools/DumpRenderTree/chromium/MockSpellCheck.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp
similarity index 64%
rename from Tools/DumpRenderTree/chromium/MockSpellCheck.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp
index 7593c71..cbe6879 100644
--- a/Tools/DumpRenderTree/chromium/MockSpellCheck.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.cpp
@@ -31,23 +31,36 @@
 #include "config.h"
 #include "MockSpellCheck.h"
 
-#include <wtf/ASCIICType.h>
-#include <wtf/Assertions.h>
-#include <wtf/text/WTFString.h>
+#include "TestCommon.h"
+#include <public/WebCString.h>
 
 using namespace WebKit;
+using namespace std;
+
+namespace WebTestRunner {
+
+namespace {
+
+void append(WebVector<WebString>* data, const WebString& item)
+{
+    WebVector<WebString> result(data->size() + 1);
+    for (size_t i = 0; i < data->size(); ++i)
+        result[i] = (*data)[i];
+    result[data->size()] = item;
+    data->swap(result);
+}
+
+}
 
 MockSpellCheck::MockSpellCheck()
     : m_initialized(false) { }
 
 MockSpellCheck::~MockSpellCheck() { }
 
-static bool isNotASCIIAlpha(UChar ch) { return !isASCIIAlpha(ch); }
-
 bool MockSpellCheck::spellCheckWord(const WebString& text, int* misspelledOffset, int* misspelledLength)
 {
-    ASSERT(misspelledOffset);
-    ASSERT(misspelledLength);
+    WEBKIT_ASSERT(misspelledOffset);
+    WEBKIT_ASSERT(misspelledLength);
 
     // Initialize this spellchecker.
     initializeIfNeeded();
@@ -56,12 +69,12 @@
     *misspelledOffset = 0;
     *misspelledLength = 0;
 
-    // Convert to a String because we store String instances in
+    // Convert to a string16 because we store string16 instances in
     // m_misspelledWords and WebString has no find().
-    WTF::String stringText(text.data(), text.length());
+    string16 stringText = text;
     int skippedLength = 0;
 
-    while (!stringText.isEmpty()) {
+    while (!stringText.empty()) {
         // Extract the first possible English word from the given string.
         // The given string may include non-ASCII characters or numbers. So, we
         // should filter out such characters before start looking up our
@@ -69,44 +82,57 @@
         // (This is a simple version of our SpellCheckWordIterator class.)
         // If the given string doesn't include any ASCII characters, we can treat the
         // string as valid one.
-        // Unfortunately, This implementation splits a contraction, i.e. "isn't" is
-        // split into two pieces "isn" and "t". This is OK because webkit tests
-        // don't have misspelled contractions.
-        int wordOffset = stringText.find(isASCIIAlpha);
-        if (wordOffset == -1)
+        string16::iterator firstChar = find_if(stringText.begin(), stringText.end(), isASCIIAlpha);
+        if (firstChar == stringText.end())
             return true;
-        int wordEnd = stringText.find(isNotASCIIAlpha, wordOffset);
-        int wordLength = wordEnd == -1 ? static_cast<int>(stringText.length()) - wordOffset : wordEnd - wordOffset;
+        int wordOffset = distance(stringText.begin(), firstChar);
+        int maxWordLength = static_cast<int>(stringText.length()) - wordOffset;
+        int wordLength;
+        string16 word;
 
         // Look up our misspelled-word table to check if the extracted word is a
         // known misspelled word, and return the offset and the length of the
         // extracted word if this word is a known misspelled word.
         // (See the comment in MockSpellCheck::initializeIfNeeded() why we use a
         // misspelled-word table.)
-        WTF::String word = stringText.substring(wordOffset, wordLength);
-        if (m_misspelledWords.contains(word)) {
-            *misspelledOffset = wordOffset + skippedLength;
-            *misspelledLength = wordLength;
-            break;
+        for (size_t i = 0; i < m_misspelledWords.size(); ++i) {
+            wordLength = static_cast<int>(m_misspelledWords.at(i).length()) > maxWordLength ? maxWordLength : static_cast<int>(m_misspelledWords.at(i).length());
+            word = stringText.substr(wordOffset, wordLength);
+            if (word == m_misspelledWords.at(i) && (static_cast<int>(stringText.length()) == wordOffset + wordLength || isNotASCIIAlpha(stringText[wordOffset + wordLength]))) {
+                *misspelledOffset = wordOffset + skippedLength;
+                *misspelledLength = wordLength;
+                break;
+            }
         }
 
-        ASSERT(0 < wordOffset + wordLength);
-        stringText = stringText.substring(wordOffset + wordLength);
+        if (*misspelledLength > 0)
+            break;
+
+        string16::iterator lastChar = find_if(stringText.begin() + wordOffset, stringText.end(), isNotASCIIAlpha);
+        if (lastChar == stringText.end())
+            wordLength = static_cast<int>(stringText.length()) - wordOffset;
+        else
+            wordLength = distance(firstChar, lastChar);
+
+        WEBKIT_ASSERT(0 < wordOffset + wordLength);
+        stringText = stringText.substr(wordOffset + wordLength);
         skippedLength += wordOffset + wordLength;
     }
 
     return false;
 }
 
+bool MockSpellCheck::hasInCache(const WebString& word)
+{
+    return word == WebString::fromUTF8("Spell wellcome. Is it broken?") || word == WebString::fromUTF8("Spell wellcome.\x007F");
+}
+
 void MockSpellCheck::fillSuggestionList(const WebString& word, WebVector<WebString>* suggestions)
 {
-    if (word == WebString::fromUTF8("wellcome")) {
-        WebVector<WebString> result(suggestions->size() + 1);
-        for (size_t i = 0; i < suggestions->size(); ++i)
-            result[i] = (*suggestions)[i];
-        result[suggestions->size()] = WebString::fromUTF8("welcome");
-        suggestions->swap(result);
-    }
+    if (word == WebString::fromUTF8("wellcome"))
+        append(suggestions, WebString::fromUTF8("welcome"));
+    else if (word == WebString::fromUTF8("upper case"))
+        append(suggestions, WebString::fromUTF8("uppercase"));
 }
 
 bool MockSpellCheck::initializeIfNeeded()
@@ -151,12 +177,13 @@
         "ifmmp",
         "qwertyuiopasd",
         "qwertyuiopasdf",
+        "upper case",
         "wellcome"
     };
 
     m_misspelledWords.clear();
     for (size_t i = 0; i < arraysize(misspelledWords); ++i)
-        m_misspelledWords.add(WTF::String::fromUTF8(misspelledWords[i]), false);
+        m_misspelledWords.push_back(string16(misspelledWords[i], misspelledWords[i] + strlen(misspelledWords[i])));
 
     // Mark as initialized to prevent this object from being initialized twice
     // or more.
@@ -166,3 +193,5 @@
     // function always returns false.
     return false;
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/MockSpellCheck.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h
similarity index 84%
rename from Tools/DumpRenderTree/chromium/MockSpellCheck.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h
index b7d0787..849fb19 100644
--- a/Tools/DumpRenderTree/chromium/MockSpellCheck.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockSpellCheck.h
@@ -31,11 +31,11 @@
 #ifndef MockSpellCheck_h
 #define MockSpellCheck_h
 
-#include "platform/WebString.h"
-#include "platform/WebVector.h"
-#include <wtf/HashMap.h>
-#include <wtf/text/StringHash.h>
-#include <wtf/text/WTFString.h>
+#include "Platform/chromium/public/WebString.h"
+#include "Platform/chromium/public/WebVector.h"
+#include <vector>
+
+namespace WebTestRunner {
 
 // A mock implementation of a spell-checker used for WebKit tests.
 // This class only implements the minimal functionarities required by WebKit
@@ -45,6 +45,8 @@
 // for any other usages.
 class MockSpellCheck {
 public:
+    static void fillSuggestionList(const WebKit::WebString& word, WebKit::WebVector<WebKit::WebString>* suggestions);
+
     MockSpellCheck();
     ~MockSpellCheck();
 
@@ -56,11 +58,11 @@
     // the first invalid word to misspelledLength, respectively.
     // For example, when the given text is "   zz zz", this function sets 3 to
     // misspelledOffset and 2 to misspelledLength, respectively.
-    bool spellCheckWord(const WebKit::WebString& text,
-                        int* misspelledOffset,
-                        int* misspelledLength);
+    bool spellCheckWord(const WebKit::WebString& text, int* misspelledOffset, int* misspelledLength);
 
-    void fillSuggestionList(const WebKit::WebString& word, WebKit::WebVector<WebKit::WebString>* suggestions);
+    // Checks whether the specified text can be spell checked immediately using
+    // the spell checker cache.
+    bool hasInCache(const WebKit::WebString& text);
 
 private:
     // Initialize the internal resources if we need to initialize it.
@@ -73,10 +75,12 @@
     bool initializeIfNeeded();
 
     // A table that consists of misspelled words.
-    HashMap<WTF::String, bool> m_misspelledWords;
+    std::vector<string16> m_misspelledWords;
 
     // A flag representing whether or not this object is initialized.
     bool m_initialized;
 };
 
+}
+
 #endif // MockSpellCheck_h
diff --git a/Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.cpp
similarity index 69%
rename from Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.cpp
index b7178f0..6cea70f 100644
--- a/Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.cpp
@@ -29,19 +29,22 @@
  */
 
 #include "config.h"
-#if ENABLE(MEDIA_STREAM)
 
+#if ENABLE_WEBRTC
 #include "MockWebMediaStreamCenter.h"
 
+#include <public/WebAudioDestinationConsumer.h>
+#include <public/WebMediaStream.h>
 #include <public/WebMediaStreamCenterClient.h>
-#include <public/WebMediaStreamComponent.h>
-#include <public/WebMediaStreamDescriptor.h>
 #include <public/WebMediaStreamSource.h>
 #include <public/WebMediaStreamSourcesRequest.h>
+#include <public/WebMediaStreamTrack.h>
 #include <public/WebVector.h>
 
 using namespace WebKit;
 
+namespace WebTestRunner {
+
 MockWebMediaStreamCenter::MockWebMediaStreamCenter(WebMediaStreamCenterClient* client)
 {
 }
@@ -52,41 +55,52 @@
     request.didCompleteQuery(audioSources, videoSources);
 }
 
-void MockWebMediaStreamCenter::didEnableMediaStreamTrack(const WebMediaStreamDescriptor&, const WebMediaStreamComponent& component)
+void MockWebMediaStreamCenter::didEnableMediaStreamTrack(const WebMediaStream&, const WebMediaStreamTrack& component)
 {
     component.source().setReadyState(WebMediaStreamSource::ReadyStateLive);
 }
 
-void MockWebMediaStreamCenter::didDisableMediaStreamTrack(const WebMediaStreamDescriptor&, const WebMediaStreamComponent& component)
+void MockWebMediaStreamCenter::didDisableMediaStreamTrack(const WebMediaStream&, const WebMediaStreamTrack& component)
 {
     component.source().setReadyState(WebMediaStreamSource::ReadyStateMuted);
 }
 
-bool MockWebMediaStreamCenter::didAddMediaStreamTrack(const WebMediaStreamDescriptor&, const WebMediaStreamComponent&)
+bool MockWebMediaStreamCenter::didAddMediaStreamTrack(const WebMediaStream&, const WebMediaStreamTrack&)
 {
     return true;
-};
+}
 
-bool MockWebMediaStreamCenter::didRemoveMediaStreamTrack(const WebMediaStreamDescriptor&, const WebMediaStreamComponent&)
+bool MockWebMediaStreamCenter::didRemoveMediaStreamTrack(const WebMediaStream&, const WebMediaStreamTrack&)
 {
     return true;
+}
+
+void MockWebMediaStreamCenter::didStopLocalMediaStream(const WebMediaStream& stream)
+{
+}
+
+class MockWebAudioDestinationConsumer : public WebAudioDestinationConsumer {
+public:
+    virtual ~MockWebAudioDestinationConsumer() { }
+    virtual void setFormat(size_t numberOfChannels, float sampleRate) OVERRIDE { }
+    virtual void consumeAudio(const WebVector<const float*>&, size_t number_of_frames) OVERRIDE { }
 };
 
-void MockWebMediaStreamCenter::didStopLocalMediaStream(const WebMediaStreamDescriptor& stream)
+void MockWebMediaStreamCenter::didCreateMediaStream(WebMediaStream& stream)
 {
-    WebVector<WebMediaStreamComponent> audioComponents;
+    WebVector<WebMediaStreamTrack> audioComponents;
     stream.audioSources(audioComponents);
-    for (size_t i = 0; i < audioComponents.size(); ++i)
-        audioComponents[i].source().setReadyState(WebMediaStreamSource::ReadyStateEnded);
-
-    WebVector<WebMediaStreamComponent> videoComponents;
-    stream.videoSources(videoComponents);
-    for (size_t i = 0; i < videoComponents.size(); ++i)
-        videoComponents[i].source().setReadyState(WebMediaStreamSource::ReadyStateEnded);
+    for (size_t i = 0; i < audioComponents.size(); ++i) {
+        WebMediaStreamSource source = audioComponents[i].source();
+        if (source.requiresAudioConsumer()) {
+            MockWebAudioDestinationConsumer* consumer = new MockWebAudioDestinationConsumer();
+            source.addAudioConsumer(consumer);
+            source.removeAudioConsumer(consumer);
+            delete consumer;
+        }
+    }
 }
 
-void MockWebMediaStreamCenter::didCreateMediaStream(WebMediaStreamDescriptor&)
-{
 }
 
-#endif // ENABLE(MEDIA_STREAM)
+#endif // ENABLE_WEBRTC
diff --git a/Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.h
similarity index 84%
rename from Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.h
index 7d532e7..1c028a2 100644
--- a/Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebMediaStreamCenter.h
@@ -31,29 +31,32 @@
 #ifndef MockWebMediaStreamCenter_h
 #define MockWebMediaStreamCenter_h
 
-#if ENABLE(MEDIA_STREAM)
+#include "TestCommon.h"
 #include <public/WebMediaStreamCenter.h>
 
 namespace WebKit {
 class WebMediaStreamCenterClient;
 };
 
+namespace WebTestRunner {
+
 class MockWebMediaStreamCenter : public WebKit::WebMediaStreamCenter {
 public:
     explicit MockWebMediaStreamCenter(WebKit::WebMediaStreamCenterClient*);
 
     virtual void queryMediaStreamSources(const WebKit::WebMediaStreamSourcesRequest&) OVERRIDE;
-    virtual void didEnableMediaStreamTrack(const WebKit::WebMediaStreamDescriptor&, const WebKit::WebMediaStreamComponent&) OVERRIDE;
-    virtual void didDisableMediaStreamTrack(const WebKit::WebMediaStreamDescriptor&, const WebKit::WebMediaStreamComponent&) OVERRIDE;
-    virtual bool didAddMediaStreamTrack(const WebKit::WebMediaStreamDescriptor&, const WebKit::WebMediaStreamComponent&) OVERRIDE;
-    virtual bool didRemoveMediaStreamTrack(const WebKit::WebMediaStreamDescriptor&, const WebKit::WebMediaStreamComponent&) OVERRIDE;
-    virtual void didStopLocalMediaStream(const WebKit::WebMediaStreamDescriptor&) OVERRIDE;
-    virtual void didCreateMediaStream(WebKit::WebMediaStreamDescriptor&) OVERRIDE;
+    virtual void didEnableMediaStreamTrack(const WebKit::WebMediaStream&, const WebKit::WebMediaStreamTrack&) OVERRIDE;
+    virtual void didDisableMediaStreamTrack(const WebKit::WebMediaStream&, const WebKit::WebMediaStreamTrack&) OVERRIDE;
+    virtual bool didAddMediaStreamTrack(const WebKit::WebMediaStream&, const WebKit::WebMediaStreamTrack&) OVERRIDE;
+    virtual bool didRemoveMediaStreamTrack(const WebKit::WebMediaStream&, const WebKit::WebMediaStreamTrack&) OVERRIDE;
+    virtual void didStopLocalMediaStream(const WebKit::WebMediaStream&) OVERRIDE;
+    virtual void didCreateMediaStream(WebKit::WebMediaStream&) OVERRIDE;
 
 private:
     MockWebMediaStreamCenter() { }
 };
 
-#endif // ENABLE(MEDIA_STREAM)
+}
+
 #endif // MockWebMediaStreamCenter_h
 
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.cpp
new file mode 100644
index 0000000..16db432
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.cpp
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2013 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE_WEBRTC
+#include "MockWebRTCDTMFSenderHandler.h"
+
+#include "WebTestDelegate.h"
+#include <assert.h>
+#include <public/WebMediaStreamSource.h>
+#include <public/WebRTCDTMFSenderHandlerClient.h>
+
+using namespace WebKit;
+
+namespace WebTestRunner {
+
+class DTMFSenderToneTask : public WebMethodTask<MockWebRTCDTMFSenderHandler> {
+public:
+    DTMFSenderToneTask(MockWebRTCDTMFSenderHandler* object, WebRTCDTMFSenderHandlerClient* client)
+        : WebMethodTask<MockWebRTCDTMFSenderHandler>(object)
+        , m_client(client)
+    {
+    }
+
+    virtual void runIfValid() OVERRIDE
+    {
+        WebString tones = m_object->currentToneBuffer();
+        m_object->clearToneBuffer();
+        m_client->didPlayTone(tones);
+    }
+
+private:
+    WebRTCDTMFSenderHandlerClient* m_client;
+};
+
+/////////////////////
+
+MockWebRTCDTMFSenderHandler::MockWebRTCDTMFSenderHandler(const WebMediaStreamTrack& track, WebTestDelegate* delegate)
+    : m_client(0)
+    , m_track(track)
+    , m_delegate(delegate)
+{
+}
+
+void MockWebRTCDTMFSenderHandler::setClient(WebRTCDTMFSenderHandlerClient* client)
+{
+    m_client = client;
+}
+
+WebString MockWebRTCDTMFSenderHandler::currentToneBuffer()
+{
+    return m_toneBuffer;
+}
+
+bool MockWebRTCDTMFSenderHandler::canInsertDTMF()
+{
+    assert(m_client && !m_track.isNull());
+    return m_track.source().type() == WebMediaStreamSource::TypeAudio && m_track.isEnabled() && m_track.source().readyState() == WebMediaStreamSource::ReadyStateLive;
+}
+
+bool MockWebRTCDTMFSenderHandler::insertDTMF(const WebString& tones, long duration, long interToneGap)
+{
+    assert(m_client);
+    if (!canInsertDTMF())
+        return false;
+
+    m_toneBuffer = tones;
+    m_delegate->postTask(new DTMFSenderToneTask(this, m_client));
+    m_delegate->postTask(new DTMFSenderToneTask(this, m_client));
+    return true;
+}
+
+}
+
+#endif // ENABLE_WEBRTC
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.h
new file mode 100644
index 0000000..f90dab8
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDTMFSenderHandler.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2013 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MockWebRTCDTMFSenderHandler_h
+#define MockWebRTCDTMFSenderHandler_h
+
+#include "TestCommon.h"
+#include "WebTask.h"
+#include <public/WebMediaStreamTrack.h>
+#include <public/WebRTCDTMFSenderHandler.h>
+#include <public/WebString.h>
+
+namespace WebTestRunner {
+
+class WebTestDelegate;
+
+class MockWebRTCDTMFSenderHandler : public WebKit::WebRTCDTMFSenderHandler {
+public:
+    MockWebRTCDTMFSenderHandler(const WebKit::WebMediaStreamTrack&, WebTestDelegate*);
+
+    virtual void setClient(WebKit::WebRTCDTMFSenderHandlerClient*) OVERRIDE;
+
+    virtual WebKit::WebString currentToneBuffer() OVERRIDE;
+
+    virtual bool canInsertDTMF() OVERRIDE;
+    virtual bool insertDTMF(const WebKit::WebString& tones, long duration, long interToneGap) OVERRIDE;
+
+    // WebTask related methods
+    WebTaskList* taskList() { return &m_taskList; }
+    void clearToneBuffer() { m_toneBuffer.reset(); }
+
+private:
+    MockWebRTCDTMFSenderHandler();
+
+    WebKit::WebRTCDTMFSenderHandlerClient* m_client;
+    WebKit::WebMediaStreamTrack m_track;
+    WebKit::WebString m_toneBuffer;
+    WebTaskList m_taskList;
+    WebTestDelegate* m_delegate;
+};
+
+}
+
+#endif // MockWebRTCDTMFSenderHandler_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.cpp
new file mode 100644
index 0000000..ac4d252
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE_WEBRTC
+#include "MockWebRTCDataChannelHandler.h"
+
+#include "WebTestDelegate.h"
+#include <assert.h>
+#include <public/WebRTCDataChannelHandlerClient.h>
+
+using namespace WebKit;
+
+namespace WebTestRunner {
+
+class DataChannelReadyStateTask : public WebMethodTask<MockWebRTCDataChannelHandler> {
+public:
+    DataChannelReadyStateTask(MockWebRTCDataChannelHandler* object, WebRTCDataChannelHandlerClient* dataChannelClient, WebRTCDataChannelHandlerClient::ReadyState state)
+        : WebMethodTask<MockWebRTCDataChannelHandler>(object)
+        , m_dataChannelClient(dataChannelClient)
+        , m_state(state)
+    {
+    }
+
+    virtual void runIfValid() OVERRIDE
+    {
+        m_dataChannelClient->didChangeReadyState(m_state);
+    }
+
+private:
+    WebRTCDataChannelHandlerClient* m_dataChannelClient;
+    WebRTCDataChannelHandlerClient::ReadyState m_state;
+};
+
+/////////////////////
+
+MockWebRTCDataChannelHandler::MockWebRTCDataChannelHandler(WebString label, bool reliable, WebTestDelegate* delegate)
+    : m_client(0)
+    , m_label(label)
+    , m_reliable(reliable)
+    , m_delegate(delegate)
+{
+}
+
+void MockWebRTCDataChannelHandler::setClient(WebRTCDataChannelHandlerClient* client)
+{
+    m_client = client;
+    if (m_client)
+        m_delegate->postTask(new DataChannelReadyStateTask(this, m_client, WebRTCDataChannelHandlerClient::ReadyStateOpen));
+}
+
+unsigned long MockWebRTCDataChannelHandler::bufferedAmount()
+{
+    return 0;
+}
+
+bool MockWebRTCDataChannelHandler::sendStringData(const WebString& data)
+{
+    assert(m_client);
+    m_client->didReceiveStringData(data);
+    return true;
+}
+
+bool MockWebRTCDataChannelHandler::sendRawData(const char* data, size_t size)
+{
+    assert(m_client);
+    m_client->didReceiveRawData(data, size);
+    return true;
+}
+
+void MockWebRTCDataChannelHandler::close()
+{
+    assert(m_client);
+    m_delegate->postTask(new DataChannelReadyStateTask(this, m_client, WebRTCDataChannelHandlerClient::ReadyStateClosed));
+}
+
+}
+
+#endif // ENABLE_WEBRTC
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.h
new file mode 100644
index 0000000..3c93811
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCDataChannelHandler.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MockWebRTCDataChannelHandler_h
+#define MockWebRTCDataChannelHandler_h
+
+#include "TestCommon.h"
+#include "WebTask.h"
+#include <public/WebRTCDataChannelHandler.h>
+#include <public/WebString.h>
+
+namespace WebTestRunner {
+
+class WebTestDelegate;
+
+class MockWebRTCDataChannelHandler : public WebKit::WebRTCDataChannelHandler {
+public:
+    MockWebRTCDataChannelHandler(WebKit::WebString label, bool reliable, WebTestDelegate*);
+
+    virtual void setClient(WebKit::WebRTCDataChannelHandlerClient*) OVERRIDE;
+    virtual WebKit::WebString label() OVERRIDE { return m_label; }
+    virtual bool isReliable() OVERRIDE { return m_reliable; }
+    virtual unsigned long bufferedAmount() OVERRIDE;
+    virtual bool sendStringData(const WebKit::WebString&) OVERRIDE;
+    virtual bool sendRawData(const char*, size_t) OVERRIDE;
+    virtual void close() OVERRIDE;
+
+    // WebTask related methods
+    WebTaskList* taskList() { return &m_taskList; }
+
+private:
+    MockWebRTCDataChannelHandler();
+
+    WebKit::WebRTCDataChannelHandlerClient* m_client;
+    WebKit::WebString m_label;
+    bool m_reliable;
+    WebTaskList m_taskList;
+    WebTestDelegate* m_delegate;
+};
+
+}
+
+#endif // MockWebRTCDataChannelHandler_h
diff --git a/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp
similarity index 60%
rename from Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp
index ca1e604..084ead6 100644
--- a/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.cpp
@@ -29,15 +29,18 @@
  */
 
 #include "config.h"
-#if ENABLE(MEDIA_STREAM)
 
+#if ENABLE_WEBRTC
 #include "MockWebRTCPeerConnectionHandler.h"
 
 #include "MockConstraints.h"
-#include "Task.h"
+#include "MockWebRTCDTMFSenderHandler.h"
+#include "MockWebRTCDataChannelHandler.h"
+#include "TestInterfaces.h"
+#include "WebTestDelegate.h"
 #include <public/WebMediaConstraints.h>
-#include <public/WebMediaStreamComponent.h>
-#include <public/WebMediaStreamDescriptor.h>
+#include <public/WebMediaStream.h>
+#include <public/WebMediaStreamTrack.h>
 #include <public/WebRTCPeerConnectionHandlerClient.h>
 #include <public/WebRTCSessionDescription.h>
 #include <public/WebRTCSessionDescriptionRequest.h>
@@ -46,10 +49,10 @@
 #include <public/WebRTCVoidRequest.h>
 #include <public/WebString.h>
 #include <public/WebVector.h>
-#include <wtf/DateMath.h>
 
 using namespace WebKit;
-using namespace WebTestRunner;
+
+namespace WebTestRunner {
 
 class RTCSessionDescriptionRequestSuccededTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
 public:
@@ -128,99 +131,62 @@
     bool m_succeeded;
 };
 
-class StringDataTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
+class RTCPeerConnectionStateTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
 public:
-    StringDataTask(MockWebRTCPeerConnectionHandler* object, const WebRTCDataChannel& dataChannel, const WebString& data)
-        : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
-        , m_dataChannel(dataChannel)
-        , m_data(data)
-    {
-    }
-
-    virtual void runIfValid() OVERRIDE
-    {
-        m_dataChannel.dataArrived(m_data);
-    }
-
-private:
-    WebRTCDataChannel m_dataChannel;
-    WebString m_data;
-};
-
-class CharPtrDataTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
-public:
-    CharPtrDataTask(MockWebRTCPeerConnectionHandler* object, const WebRTCDataChannel& dataChannel, const char* data, size_t length)
-        : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
-        , m_dataChannel(dataChannel)
-        , m_length(length)
-    {
-        m_data = new char[m_length];
-        memcpy(m_data, data, m_length);
-    }
-
-    virtual void runIfValid() OVERRIDE
-    {
-        m_dataChannel.dataArrived(m_data, m_length);
-        delete [] m_data;
-    }
-
-private:
-    WebRTCDataChannel m_dataChannel;
-    char* m_data;
-    size_t m_length;
-};
-
-class DataChannelReadyStateTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
-public:
-    DataChannelReadyStateTask(MockWebRTCPeerConnectionHandler* object, const WebRTCDataChannel& dataChannel, WebRTCDataChannel::ReadyState state)
-        : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
-        , m_dataChannel(dataChannel)
-        , m_state(state)
-    {
-    }
-
-    virtual void runIfValid() OVERRIDE
-    {
-        m_dataChannel.readyStateChanged(m_state);
-    }
-
-private:
-    WebRTCDataChannel m_dataChannel;
-    WebRTCDataChannel::ReadyState m_state;
-};
-
-class RTCPeerConnectionReadyStateTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
-public:
-    RTCPeerConnectionReadyStateTask(MockWebRTCPeerConnectionHandler* object, WebRTCPeerConnectionHandlerClient* client, WebRTCPeerConnectionHandlerClient::ReadyState state)
+    RTCPeerConnectionStateTask(MockWebRTCPeerConnectionHandler* object, WebRTCPeerConnectionHandlerClient* client, WebRTCPeerConnectionHandlerClient::ICEConnectionState connectionState, WebRTCPeerConnectionHandlerClient::ICEGatheringState gatheringState)
         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
         , m_client(client)
-        , m_state(state)
+        , m_connectionState(connectionState)
+        , m_gatheringState(gatheringState)
     {
     }
 
     virtual void runIfValid() OVERRIDE
     {
-        m_client->didChangeReadyState(m_state);
+        m_client->didChangeICEGatheringState(m_gatheringState);
+        m_client->didChangeICEConnectionState(m_connectionState);
     }
 
 private:
     WebRTCPeerConnectionHandlerClient* m_client;
-    WebRTCPeerConnectionHandlerClient::ReadyState m_state;
+    WebRTCPeerConnectionHandlerClient::ICEConnectionState m_connectionState;
+    WebRTCPeerConnectionHandlerClient::ICEGatheringState m_gatheringState;
+};
+
+class RemoteDataChannelTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
+public:
+    RemoteDataChannelTask(MockWebRTCPeerConnectionHandler* object, WebRTCPeerConnectionHandlerClient* client, WebTestDelegate* delegate)
+        : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
+        , m_client(client)
+        , m_delegate(delegate)
+    {
+    }
+
+    virtual void runIfValid() OVERRIDE
+    {
+        WebRTCDataChannelHandler* remoteDataChannel = new MockWebRTCDataChannelHandler("MockRemoteDataChannel", true, m_delegate);
+        m_client->didAddRemoteDataChannel(remoteDataChannel);
+    }
+
+private:
+    WebRTCPeerConnectionHandlerClient* m_client;
+    WebTestDelegate* m_delegate;
 };
 
 /////////////////////
 
-MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client)
+MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client, TestInterfaces* interfaces)
     : m_client(client)
     , m_stopped(false)
     , m_streamCount(0)
+    , m_interfaces(interfaces)
 {
 }
 
 bool MockWebRTCPeerConnectionHandler::initialize(const WebRTCConfiguration&, const WebMediaConstraints& constraints)
 {
     if (MockConstraints::verifyConstraints(constraints)) {
-        postTask(new RTCPeerConnectionReadyStateTask(this, m_client, WebRTCPeerConnectionHandlerClient::ReadyStateActive));
+        m_interfaces->delegate()->postTask(new RTCPeerConnectionStateTask(this, m_client, WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted, WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
         return true;
     }
 
@@ -233,9 +199,9 @@
     if (constraints.getMandatoryConstraintValue("succeed", shouldSucceed) && shouldSucceed == "true") {
         WebRTCSessionDescription sessionDescription;
         sessionDescription.initialize("offer", "local");
-        postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
+        m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
     } else
-        postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
+        m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
 }
 
 void MockWebRTCPeerConnectionHandler::createAnswer(const WebRTCSessionDescriptionRequest& request, const WebMediaConstraints&)
@@ -243,27 +209,27 @@
     if (!m_remoteDescription.isNull()) {
         WebRTCSessionDescription sessionDescription;
         sessionDescription.initialize("answer", "local");
-        postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
+        m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
     } else
-        postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
+        m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
 }
 
 void MockWebRTCPeerConnectionHandler::setLocalDescription(const WebRTCVoidRequest& request, const WebRTCSessionDescription& localDescription)
 {
     if (!localDescription.isNull() && localDescription.sdp() == "local") {
         m_localDescription = localDescription;
-        postTask(new RTCVoidRequestTask(this, request, true));
+        m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, true));
     } else
-        postTask(new RTCVoidRequestTask(this, request, false));
+        m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, false));
 }
 
 void MockWebRTCPeerConnectionHandler::setRemoteDescription(const WebRTCVoidRequest& request, const WebRTCSessionDescription& remoteDescription)
 {
     if (!remoteDescription.isNull() && remoteDescription.sdp() == "remote") {
         m_remoteDescription = remoteDescription;
-        postTask(new RTCVoidRequestTask(this, request, true));
+        m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, true));
     } else
-        postTask(new RTCVoidRequestTask(this, request, false));
+        m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, false));
 }
 
 WebRTCSessionDescription MockWebRTCPeerConnectionHandler::localDescription()
@@ -278,7 +244,6 @@
 
 bool MockWebRTCPeerConnectionHandler::updateICE(const WebRTCConfiguration&, const WebMediaConstraints&)
 {
-    m_client->didChangeICEState(WebRTCPeerConnectionHandlerClient::ICEStateGathering);
     return true;
 }
 
@@ -288,43 +253,49 @@
     return true;
 }
 
-bool MockWebRTCPeerConnectionHandler::addStream(const WebMediaStreamDescriptor& stream, const WebMediaConstraints&)
+bool MockWebRTCPeerConnectionHandler::addStream(const WebMediaStream& stream, const WebMediaConstraints&)
 {
-    m_streamCount += 1;
-    m_client->didAddRemoteStream(stream);
+    ++m_streamCount;
     m_client->negotiationNeeded();
     return true;
 }
 
-void MockWebRTCPeerConnectionHandler::removeStream(const WebMediaStreamDescriptor& stream)
+void MockWebRTCPeerConnectionHandler::removeStream(const WebMediaStream& stream)
 {
-    m_streamCount -= 1;
-    m_client->didRemoveRemoteStream(stream);
+    --m_streamCount;
     m_client->negotiationNeeded();
 }
 
 void MockWebRTCPeerConnectionHandler::getStats(const WebRTCStatsRequest& request)
 {
     WebRTCStatsResponse response = request.createResponse();
-    double currentDate = WTF::jsCurrentTime();
+    double currentDate = m_interfaces->delegate()->getCurrentTimeInMillisecond();
     if (request.hasSelector()) {
-        WebMediaStreamDescriptor stream = request.stream();
-        WebMediaStreamComponent component = request.component();
+        WebMediaStream stream = request.stream();
         // FIXME: There is no check that the fetched values are valid.
-        size_t reportIndex = response.addReport();
-        response.addElement(reportIndex, true, currentDate);
-        response.addStatistic(reportIndex, true, "type", "video");
+        size_t reportIndex = response.addReport("Mock video", "ssrc", currentDate);
+        response.addStatistic(reportIndex, "type", "video");
     } else {
         for (int i = 0; i < m_streamCount; ++i) {
-            size_t reportIndex = response.addReport();
-            response.addElement(reportIndex, true, currentDate);
-            response.addStatistic(reportIndex, true, "type", "audio");
-            reportIndex = response.addReport();
-            response.addElement(reportIndex, true, currentDate);
-            response.addStatistic(reportIndex, true, "type", "video");
+            size_t reportIndex = response.addReport("Mock audio", "ssrc", currentDate);
+            response.addStatistic(reportIndex, "type", "audio");
+            reportIndex = response.addReport("Mock video", "ssrc", currentDate);
+            response.addStatistic(reportIndex, "type", "video");
         }
     }
-    postTask(new RTCStatsRequestSucceededTask(this, request, response));
+    m_interfaces->delegate()->postTask(new RTCStatsRequestSucceededTask(this, request, response));
+}
+
+WebRTCDataChannelHandler* MockWebRTCPeerConnectionHandler::createDataChannel(const WebString& label, bool reliable)
+{
+    m_interfaces->delegate()->postTask(new RemoteDataChannelTask(this, m_client, m_interfaces->delegate()));
+
+    return new MockWebRTCDataChannelHandler(label, reliable, m_interfaces->delegate());
+}
+
+WebRTCDTMFSenderHandler* MockWebRTCPeerConnectionHandler::createDTMFSender(const WebMediaStreamTrack& track)
+{
+    return new MockWebRTCDTMFSenderHandler(track, m_interfaces->delegate());
 }
 
 void MockWebRTCPeerConnectionHandler::stop()
@@ -332,36 +303,6 @@
     m_stopped = true;
 }
 
-bool MockWebRTCPeerConnectionHandler::openDataChannel(const WebRTCDataChannel& dataChannel)
-{
-    if (m_stopped)
-        return false;
-
-    postTask(new DataChannelReadyStateTask(this, dataChannel, WebRTCDataChannel::ReadyStateOpen));
-    return true;
 }
 
-void MockWebRTCPeerConnectionHandler::closeDataChannel(const WebRTCDataChannel& dataChannel)
-{
-    postTask(new DataChannelReadyStateTask(this, dataChannel, WebRTCDataChannel::ReadyStateClosed));
-}
-
-bool MockWebRTCPeerConnectionHandler::sendStringData(const WebRTCDataChannel& dataChannel, const WebString& data)
-{
-    if (m_stopped)
-        return false;
-
-    postTask(new StringDataTask(this, dataChannel, data));
-    return true;
-}
-
-bool MockWebRTCPeerConnectionHandler::sendRawData(const WebRTCDataChannel& dataChannel, const char* data, size_t length)
-{
-    if (m_stopped)
-        return false;
-
-    postTask(new CharPtrDataTask(this, dataChannel, data, length));
-    return true;
-}
-
-#endif // ENABLE(MEDIA_STREAM)
+#endif // ENABLE_WEBRTC
diff --git a/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.h
similarity index 80%
rename from Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.h
index a1522f4..965a208 100644
--- a/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebRTCPeerConnectionHandler.h
@@ -31,10 +31,8 @@
 #ifndef MockWebRTCPeerConnectionHandler_h
 #define MockWebRTCPeerConnectionHandler_h
 
-#if ENABLE(MEDIA_STREAM)
-
+#include "TestCommon.h"
 #include "WebTask.h"
-#include <public/WebRTCDataChannel.h>
 #include <public/WebRTCPeerConnectionHandler.h>
 #include <public/WebRTCSessionDescription.h>
 #include <public/WebRTCSessionDescriptionRequest.h>
@@ -44,9 +42,13 @@
 class WebRTCPeerConnectionHandlerClient;
 };
 
+namespace WebTestRunner {
+
+class TestInterfaces;
+
 class MockWebRTCPeerConnectionHandler : public WebKit::WebRTCPeerConnectionHandler {
 public:
-    explicit MockWebRTCPeerConnectionHandler(WebKit::WebRTCPeerConnectionHandlerClient*);
+    MockWebRTCPeerConnectionHandler(WebKit::WebRTCPeerConnectionHandlerClient*, TestInterfaces*);
 
     virtual bool initialize(const WebKit::WebRTCConfiguration&, const WebKit::WebMediaConstraints&) OVERRIDE;
 
@@ -58,31 +60,29 @@
     virtual WebKit::WebRTCSessionDescription remoteDescription() OVERRIDE;
     virtual bool updateICE(const WebKit::WebRTCConfiguration&, const WebKit::WebMediaConstraints&) OVERRIDE;
     virtual bool addICECandidate(const WebKit::WebRTCICECandidate&) OVERRIDE;
-    virtual bool addStream(const WebKit::WebMediaStreamDescriptor&, const WebKit::WebMediaConstraints&) OVERRIDE;
-    virtual void removeStream(const WebKit::WebMediaStreamDescriptor&) OVERRIDE;
+    virtual bool addStream(const WebKit::WebMediaStream&, const WebKit::WebMediaConstraints&) OVERRIDE;
+    virtual void removeStream(const WebKit::WebMediaStream&) OVERRIDE;
     virtual void getStats(const WebKit::WebRTCStatsRequest&) OVERRIDE;
+    virtual WebKit::WebRTCDataChannelHandler* createDataChannel(const WebKit::WebString& label, bool reliable) OVERRIDE;
+    virtual WebKit::WebRTCDTMFSenderHandler* createDTMFSender(const WebKit::WebMediaStreamTrack&) OVERRIDE;
     virtual void stop() OVERRIDE;
 
-    virtual bool openDataChannel(const WebKit::WebRTCDataChannel&) OVERRIDE;
-    virtual bool sendStringData(const WebKit::WebRTCDataChannel&, const WebKit::WebString&) OVERRIDE;
-    virtual bool sendRawData(const WebKit::WebRTCDataChannel&, const char*, size_t) OVERRIDE;
-    virtual void closeDataChannel(const WebKit::WebRTCDataChannel&) OVERRIDE;
-
     // WebTask related methods
-    WebTestRunner::WebTaskList* taskList() { return &m_taskList; }
+    WebTaskList* taskList() { return &m_taskList; }
 
 private:
     MockWebRTCPeerConnectionHandler() { }
 
     WebKit::WebRTCPeerConnectionHandlerClient* m_client;
     bool m_stopped;
-    WebTestRunner::WebTaskList m_taskList;
+    WebTaskList m_taskList;
     WebKit::WebRTCSessionDescription m_localDescription;
     WebKit::WebRTCSessionDescription m_remoteDescription;
     int m_streamCount;
+    TestInterfaces* m_interfaces;
 };
 
-#endif // ENABLE(MEDIA_STREAM)
+}
 
 #endif // MockWebRTCPeerConnectionHandler_h
 
diff --git a/Tools/DumpRenderTree/chromium/MockWebSpeechInputController.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.cpp
similarity index 74%
rename from Tools/DumpRenderTree/chromium/MockWebSpeechInputController.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.cpp
index 528455b..c4df32a 100644
--- a/Tools/DumpRenderTree/chromium/MockWebSpeechInputController.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.cpp
@@ -26,21 +26,52 @@
 #include "config.h"
 #include "MockWebSpeechInputController.h"
 
-#include "Task.h"
 #include "WebSpeechInputListener.h"
-#include "platform/WebCString.h"
-#include "platform/WebVector.h"
-#include <wtf/text/CString.h>
-#include <wtf/text/StringBuilder.h>
+#include "WebTestDelegate.h"
+#include <public/WebCString.h>
+#include <public/WebVector.h>
 
-#if ENABLE(INPUT_SPEECH)
+#if ENABLE_INPUT_SPEECH
 
 using namespace WebKit;
-using namespace WebTestRunner;
+using namespace std;
 
-PassOwnPtr<MockWebSpeechInputController> MockWebSpeechInputController::create(WebSpeechInputListener* listener)
+namespace WebTestRunner {
+
+namespace {
+
+WebSpeechInputResultArray makeRectResult(const WebRect& rect)
 {
-    return adoptPtr(new MockWebSpeechInputController(listener));
+    char buffer[100];
+    snprintf(buffer, sizeof(buffer), "%d,%d,%d,%d", rect.x, rect.y, rect.width, rect.height);
+
+    WebSpeechInputResult res;
+    res.assign(WebString::fromUTF8(static_cast<const char*>(buffer)), 1.0);
+
+    WebSpeechInputResultArray results;
+    results.assign(&res, 1);
+    return results;
+}
+
+}
+
+MockWebSpeechInputController::MockWebSpeechInputController(WebSpeechInputListener* listener)
+    : m_listener(listener)
+    , m_speechTask(0)
+    , m_recording(false)
+    , m_requestId(-1)
+    , m_dumpRect(false)
+    , m_delegate(0)
+{
+}
+
+MockWebSpeechInputController::~MockWebSpeechInputController()
+{
+}
+
+void MockWebSpeechInputController::setDelegate(WebTestDelegate* delegate)
+{
+    m_delegate = delegate;
 }
 
 void MockWebSpeechInputController::addMockRecognitionResult(const WebString& result, double confidence, const WebString& language)
@@ -49,12 +80,12 @@
     res.assign(result, confidence);
 
     if (language.isEmpty())
-        m_resultsForEmptyLanguage.append(res);
+        m_resultsForEmptyLanguage.push_back(res);
     else {
-        String langString = String::fromUTF8(language.utf8().data());
-        if (!m_recognitionResults.contains(langString))
-            m_recognitionResults.set(langString, Vector<WebSpeechInputResult>());
-        m_recognitionResults.find(langString)->value.append(res);
+        string langString = language.utf8();
+        if (m_recognitionResults.find(langString) == m_recognitionResults.end())
+            m_recognitionResults[langString] = vector<WebSpeechInputResult>();
+        m_recognitionResults[langString].push_back(res);
     }
 }
 
@@ -78,10 +109,10 @@
     m_requestId = requestId;
     m_requestRect = elementRect;
     m_recording = true;
-    m_language = String::fromUTF8(language.utf8().data());
+    m_language = language.utf8();
 
     m_speechTask = new SpeechTask(this);
-    postTask(m_speechTask);
+    m_delegate->postTask(m_speechTask);
 
     return true;
 }
@@ -89,7 +120,7 @@
 void MockWebSpeechInputController::cancelRecognition(int requestId)
 {
     if (m_speechTask) {
-        ASSERT(requestId == m_requestId);
+        WEBKIT_ASSERT(requestId == m_requestId);
 
         m_speechTask->stop();
         m_recording = false;
@@ -100,41 +131,13 @@
 
 void MockWebSpeechInputController::stopRecording(int requestId)
 {
-    ASSERT(requestId == m_requestId);
+    WEBKIT_ASSERT(requestId == m_requestId);
     if (m_speechTask && m_recording) {
         m_speechTask->stop();
         speechTaskFired();
     }
 }
 
-MockWebSpeechInputController::MockWebSpeechInputController(WebSpeechInputListener* listener)
-    : m_listener(listener)
-    , m_speechTask(0)
-    , m_recording(false)
-    , m_requestId(-1)
-    , m_dumpRect(false)
-{
-}
-
-static WebSpeechInputResultArray makeRectResult(const WebRect& rect)
-{
-    StringBuilder sb;
-    sb.append(String::number(rect.x));
-    sb.append(",");
-    sb.append(String::number(rect.y));
-    sb.append(",");
-    sb.append(String::number(rect.width));
-    sb.append(",");
-    sb.append(String::number(rect.height));
-
-    WebSpeechInputResult res;
-    res.assign(WebString(sb.characters(), sb.length()), 1.0);
-
-    WebSpeechInputResultArray results;
-    results.assign(&res, 1);
-    return results;
-}
-
 void MockWebSpeechInputController::speechTaskFired()
 {
     if (m_recording) {
@@ -142,7 +145,7 @@
         m_listener->didCompleteRecording(m_requestId);
 
         m_speechTask = new SpeechTask(this);
-        postTask(m_speechTask);
+        m_delegate->postTask(m_speechTask);
     } else {
         bool noResultsFound = false;
         // We take a copy of the requestId here so that if scripts destroyed the input element
@@ -152,15 +155,15 @@
 
         if (m_dumpRect) {
             m_listener->setRecognitionResult(requestId, makeRectResult(m_requestRect));
-        } else if (m_language.isEmpty()) {
+        } else if (m_language.empty()) {
             // Empty language case must be handled separately to avoid problems with HashMap and empty keys.
-            if (!m_resultsForEmptyLanguage.isEmpty())
+            if (!m_resultsForEmptyLanguage.empty())
                 m_listener->setRecognitionResult(requestId, m_resultsForEmptyLanguage);
             else
                 noResultsFound = true;
         } else {
-            if (m_recognitionResults.contains(m_language))
-                m_listener->setRecognitionResult(requestId, m_recognitionResults.get(m_language));
+            if (m_recognitionResults.find(m_language) != m_recognitionResults.end())
+                m_listener->setRecognitionResult(requestId, m_recognitionResults[m_language]);
             else
                 noResultsFound = true;
         }
@@ -168,15 +171,15 @@
         if (noResultsFound) {
             // Can't avoid setting a result even if no result was set for the given language.
             // This would avoid generating the events used to check the results and the test would timeout.
-            String error("error: no result found for language '");
+            string error("error: no result found for language '");
             error.append(m_language);
             error.append("'");
 
             WebSpeechInputResult res;
-            res.assign(WebString::fromUTF8(error.utf8().data()), 1.0);
+            res.assign(WebString::fromUTF8(error), 1.0);
 
-            Vector<WebSpeechInputResult> results;
-            results.append(res);
+            vector<WebSpeechInputResult> results;
+            results.push_back(res);
 
             m_listener->setRecognitionResult(requestId, results);
         }
@@ -192,7 +195,7 @@
 {
     m_object->m_speechTask = 0;
     cancel();
-    delete(this);
+    delete this;
 }
 
 void MockWebSpeechInputController::SpeechTask::runIfValid()
@@ -201,4 +204,6 @@
     m_object->speechTaskFired();
 }
 
+}
+
 #endif
diff --git a/Tools/DumpRenderTree/chromium/MockWebSpeechInputController.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.h
similarity index 76%
rename from Tools/DumpRenderTree/chromium/MockWebSpeechInputController.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.h
index 075f254..84034e3 100644
--- a/Tools/DumpRenderTree/chromium/MockWebSpeechInputController.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechInputController.h
@@ -26,18 +26,14 @@
 #ifndef MockWebSpeechInputController_h
 #define MockWebSpeechInputController_h
 
-#if ENABLE(INPUT_SPEECH)
-
-#include "WebTask.h"
-#include "platform/WebRect.h"
+#include "TestCommon.h"
 #include "WebSpeechInputController.h"
 #include "WebSpeechInputResult.h"
-#include <wtf/Compiler.h>
-#include <wtf/HashMap.h>
-#include <wtf/PassOwnPtr.h>
-#include <wtf/Vector.h>
-#include <wtf/text/AtomicString.h>
-#include <wtf/text/StringHash.h>
+#include "WebTask.h"
+#include <map>
+#include <public/WebRect.h>
+#include <string>
+#include <vector>
 
 namespace WebKit {
 class WebSecurityOrigin;
@@ -45,26 +41,31 @@
 class WebString;
 }
 
+namespace WebTestRunner {
+
+class WebTestDelegate;
+
 class MockWebSpeechInputController : public WebKit::WebSpeechInputController {
 public:
-    static PassOwnPtr<MockWebSpeechInputController> create(WebKit::WebSpeechInputListener*);
+    explicit MockWebSpeechInputController(WebKit::WebSpeechInputListener*);
+    ~MockWebSpeechInputController();
 
     void addMockRecognitionResult(const WebKit::WebString& result, double confidence, const WebKit::WebString& language);
     void setDumpRect(bool);
     void clearResults();
+    void setDelegate(WebTestDelegate*);
 
     // WebSpeechInputController implementation:
     virtual bool startRecognition(int requestId, const WebKit::WebRect& elementRect, const WebKit::WebString& language, const WebKit::WebString& grammar, const WebKit::WebSecurityOrigin&) OVERRIDE;
     virtual void cancelRecognition(int requestId) OVERRIDE;
     virtual void stopRecording(int requestId) OVERRIDE;
 
-    WebTestRunner::WebTaskList* taskList() { return &m_taskList; }
+    WebTaskList* taskList() { return &m_taskList; }
 
 private:
-    MockWebSpeechInputController(WebKit::WebSpeechInputListener*);
     void speechTaskFired();
 
-    class SpeechTask : public WebTestRunner::WebMethodTask<MockWebSpeechInputController> {
+    class SpeechTask : public WebMethodTask<MockWebSpeechInputController> {
     public:
         SpeechTask(MockWebSpeechInputController*);
         void stop();
@@ -75,19 +76,21 @@
 
     WebKit::WebSpeechInputListener* m_listener;
 
-    WebTestRunner::WebTaskList m_taskList;
+    WebTaskList m_taskList;
     SpeechTask* m_speechTask;
 
     bool m_recording;
     int m_requestId;
     WebKit::WebRect m_requestRect;
-    String m_language;
+    std::string m_language;
 
-    HashMap<String, Vector<WebKit::WebSpeechInputResult> > m_recognitionResults;
-    Vector<WebKit::WebSpeechInputResult> m_resultsForEmptyLanguage;
+    std::map<std::string, std::vector<WebKit::WebSpeechInputResult> > m_recognitionResults;
+    std::vector<WebKit::WebSpeechInputResult> m_resultsForEmptyLanguage;
     bool m_dumpRect;
+
+    WebTestDelegate* m_delegate;
 };
 
-#endif // ENABLE(INPUT_SPEECH)
+}
 
 #endif // MockWebSpeechInputController_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.cpp
new file mode 100644
index 0000000..8660812
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.cpp
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "MockWebSpeechRecognizer.h"
+
+#include "WebSpeechRecognitionResult.h"
+#include "WebSpeechRecognizerClient.h"
+#include "WebTestDelegate.h"
+
+using namespace WebKit;
+using namespace std;
+
+namespace WebTestRunner {
+
+namespace {
+
+// Task class for calling a client function that does not take any parameters.
+typedef void (WebSpeechRecognizerClient::*ClientFunctionPointer)(const WebSpeechRecognitionHandle&);
+class ClientCallTask : public MockWebSpeechRecognizer::Task {
+public:
+    ClientCallTask(MockWebSpeechRecognizer* mock, ClientFunctionPointer function)
+        : MockWebSpeechRecognizer::Task(mock)
+        , m_function(function)
+    {
+    }
+
+    virtual void run() OVERRIDE { (m_recognizer->client()->*m_function)(m_recognizer->handle()); }
+
+private:
+    ClientFunctionPointer m_function;
+};
+
+// Task for delivering a result event.
+class ResultTask : public MockWebSpeechRecognizer::Task {
+public:
+    ResultTask(MockWebSpeechRecognizer* mock, const WebString transcript, float confidence)
+        : MockWebSpeechRecognizer::Task(mock)
+        , m_transcript(transcript)
+        , m_confidence(confidence)
+    {
+    }
+
+    virtual void run() OVERRIDE
+    {
+        WebVector<WebString> transcripts(static_cast<size_t>(1));
+        WebVector<float> confidences(static_cast<size_t>(1));
+        transcripts[0] = m_transcript;
+        confidences[0] = m_confidence;
+        WebVector<WebSpeechRecognitionResult> finalResults(static_cast<size_t>(1));
+        WebVector<WebSpeechRecognitionResult> interimResults;
+        finalResults[0].assign(transcripts, confidences, true);
+
+        m_recognizer->client()->didReceiveResults(m_recognizer->handle(), finalResults, interimResults);
+    }
+
+private:
+    WebString m_transcript;
+    float m_confidence;
+};
+
+// Task for delivering a nomatch event.
+class NoMatchTask : public MockWebSpeechRecognizer::Task {
+public:
+    NoMatchTask(MockWebSpeechRecognizer* mock) : MockWebSpeechRecognizer::Task(mock) { }
+    virtual void run() OVERRIDE { m_recognizer->client()->didReceiveNoMatch(m_recognizer->handle(), WebSpeechRecognitionResult()); }
+};
+
+// Task for delivering an error event.
+class ErrorTask : public MockWebSpeechRecognizer::Task {
+public:
+    ErrorTask(MockWebSpeechRecognizer* mock, WebSpeechRecognizerClient::ErrorCode code, const WebString& message)
+        : MockWebSpeechRecognizer::Task(mock)
+        , m_code(code)
+        , m_message(message)
+    {
+    }
+
+    virtual void run() OVERRIDE { m_recognizer->client()->didReceiveError(m_recognizer->handle(), m_message, m_code); }
+
+private:
+    WebSpeechRecognizerClient::ErrorCode m_code;
+    WebString m_message;
+};
+
+} // namespace
+
+MockWebSpeechRecognizer::MockWebSpeechRecognizer()
+    : m_wasAborted(false)
+    , m_taskQueueRunning(false)
+    , m_delegate(0)
+{
+}
+
+MockWebSpeechRecognizer::~MockWebSpeechRecognizer()
+{
+    clearTaskQueue();
+}
+
+void MockWebSpeechRecognizer::setDelegate(WebTestDelegate* delegate)
+{
+    m_delegate = delegate;
+}
+
+void MockWebSpeechRecognizer::start(const WebSpeechRecognitionHandle& handle, const WebSpeechRecognitionParams& params, WebSpeechRecognizerClient* client)
+{
+    m_wasAborted = false;
+    m_handle = handle;
+    m_client = client;
+
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStart));
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartAudio));
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartSound));
+
+    if (!m_mockTranscripts.empty()) {
+        WEBKIT_ASSERT(m_mockTranscripts.size() == m_mockConfidences.size());
+
+        for (size_t i = 0; i < m_mockTranscripts.size(); ++i)
+            m_taskQueue.push_back(new ResultTask(this, m_mockTranscripts[i], m_mockConfidences[i]));
+
+        m_mockTranscripts.clear();
+        m_mockConfidences.clear();
+    } else
+        m_taskQueue.push_back(new NoMatchTask(this));
+
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndSound));
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndAudio));
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd));
+
+    startTaskQueue();
+}
+
+void MockWebSpeechRecognizer::stop(const WebSpeechRecognitionHandle& handle, WebSpeechRecognizerClient* client)
+{
+    m_handle = handle;
+    m_client = client;
+
+    // FIXME: Implement.
+    WEBKIT_ASSERT_NOT_REACHED();
+}
+
+void MockWebSpeechRecognizer::abort(const WebSpeechRecognitionHandle& handle, WebSpeechRecognizerClient* client)
+{
+    m_handle = handle;
+    m_client = client;
+
+    clearTaskQueue();
+    m_wasAborted = true;
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd));
+    startTaskQueue();
+}
+
+void MockWebSpeechRecognizer::addMockResult(const WebString& transcript, float confidence)
+{
+    m_mockTranscripts.push_back(transcript);
+    m_mockConfidences.push_back(confidence);
+}
+
+void MockWebSpeechRecognizer::setError(const WebString& error, const WebString& message)
+{
+    WebSpeechRecognizerClient::ErrorCode code;
+    if (error == "OtherError")
+        code = WebSpeechRecognizerClient::OtherError;
+    else if (error == "NoSpeechError")
+        code = WebSpeechRecognizerClient::NoSpeechError;
+    else if (error == "AbortedError")
+        code = WebSpeechRecognizerClient::AbortedError;
+    else if (error == "AudioCaptureError")
+        code = WebSpeechRecognizerClient::AudioCaptureError;
+    else if (error == "NetworkError")
+        code = WebSpeechRecognizerClient::NetworkError;
+    else if (error == "NotAllowedError")
+        code = WebSpeechRecognizerClient::NotAllowedError;
+    else if (error == "ServiceNotAllowedError")
+        code = WebSpeechRecognizerClient::ServiceNotAllowedError;
+    else if (error == "BadGrammarError")
+        code = WebSpeechRecognizerClient::BadGrammarError;
+    else if (error == "LanguageNotSupportedError")
+        code = WebSpeechRecognizerClient::LanguageNotSupportedError;
+    else
+        return;
+
+    clearTaskQueue();
+    m_taskQueue.push_back(new ErrorTask(this, code, message));
+    m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd));
+    startTaskQueue();
+}
+
+void MockWebSpeechRecognizer::startTaskQueue()
+{
+    if (m_taskQueueRunning)
+        return;
+    m_delegate->postTask(new StepTask(this));
+    m_taskQueueRunning = true;
+}
+
+void MockWebSpeechRecognizer::clearTaskQueue()
+{
+    while (!m_taskQueue.empty()) {
+        delete m_taskQueue.front();
+        m_taskQueue.pop_front();
+    }
+    m_taskQueueRunning = false;
+}
+
+void MockWebSpeechRecognizer::StepTask::runIfValid()
+{
+    if (m_object->m_taskQueue.empty()) {
+        m_object->m_taskQueueRunning = false;
+        return;
+    }
+
+    Task* task = m_object->m_taskQueue.front();
+    m_object->m_taskQueue.pop_front();
+    task->run();
+    delete task;
+
+    if (m_object->m_taskQueue.empty()) {
+        m_object->m_taskQueueRunning = false;
+        return;
+    }
+
+    m_object->m_delegate->postTask(new StepTask(m_object));
+}
+
+}
diff --git a/Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.h b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.h
similarity index 81%
rename from Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.h
index 419c5e5..689bc26 100644
--- a/Tools/DumpRenderTree/chromium/MockWebSpeechRecognizer.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/MockWebSpeechRecognizer.h
@@ -26,13 +26,11 @@
 #ifndef MockWebSpeechRecognizer_h
 #define MockWebSpeechRecognizer_h
 
-#if ENABLE(SCRIPTED_SPEECH)
-
+#include "TestCommon.h"
 #include "WebSpeechRecognizer.h"
 #include "WebTask.h"
-#include <wtf/Compiler.h>
-#include <wtf/PassOwnPtr.h>
-#include <wtf/Vector.h>
+#include <deque>
+#include <vector>
 
 namespace WebKit {
 class WebSpeechRecognitionHandle;
@@ -40,11 +38,17 @@
 class WebSpeechRecognizerClient;
 }
 
+namespace WebTestRunner {
+
+class WebTestDelegate;
+
 class MockWebSpeechRecognizer : public WebKit::WebSpeechRecognizer {
 public:
-    static PassOwnPtr<MockWebSpeechRecognizer> create();
+    MockWebSpeechRecognizer();
     ~MockWebSpeechRecognizer();
 
+    void setDelegate(WebTestDelegate*);
+
     // WebSpeechRecognizer implementation:
     virtual void start(const WebKit::WebSpeechRecognitionHandle&, const WebKit::WebSpeechRecognitionParams&, WebKit::WebSpeechRecognizerClient*) OVERRIDE;
     virtual void stop(const WebKit::WebSpeechRecognitionHandle&, WebKit::WebSpeechRecognizerClient*) OVERRIDE;
@@ -52,13 +56,13 @@
 
     // Methods accessed by layout tests:
     void addMockResult(const WebKit::WebString& transcript, float confidence);
-    void setError(int code, const WebKit::WebString& message);
+    void setError(const WebKit::WebString& error, const WebKit::WebString& message);
     bool wasAborted() const { return m_wasAborted; }
 
     // Methods accessed from Task objects:
     WebKit::WebSpeechRecognizerClient* client() { return m_client; }
     WebKit::WebSpeechRecognitionHandle& handle() { return m_handle; }
-    WebTestRunner::WebTaskList* taskList() { return &m_taskList; }
+    WebTaskList* taskList() { return &m_taskList; }
 
     class Task {
     public:
@@ -70,29 +74,30 @@
     };
 
 private:
-    MockWebSpeechRecognizer();
     void startTaskQueue();
     void clearTaskQueue();
 
-    WebTestRunner::WebTaskList m_taskList;
+    WebTaskList m_taskList;
     WebKit::WebSpeechRecognitionHandle m_handle;
     WebKit::WebSpeechRecognizerClient* m_client;
-    Vector<WebKit::WebString> m_mockTranscripts;
-    Vector<float> m_mockConfidences;
+    std::vector<WebKit::WebString> m_mockTranscripts;
+    std::vector<float> m_mockConfidences;
     bool m_wasAborted;
 
     // Queue of tasks to be run.
-    Vector<OwnPtr<Task> > m_taskQueue;
+    std::deque<Task*> m_taskQueue;
     bool m_taskQueueRunning;
 
+    WebTestDelegate* m_delegate;
+
     // Task for stepping the queue.
-    class StepTask : public WebTestRunner::WebMethodTask<MockWebSpeechRecognizer> {
+    class StepTask : public WebMethodTask<MockWebSpeechRecognizer> {
     public:
-        StepTask(MockWebSpeechRecognizer* object) : WebTestRunner::WebMethodTask<MockWebSpeechRecognizer>(object) { }
+        StepTask(MockWebSpeechRecognizer* object) : WebMethodTask<MockWebSpeechRecognizer>(object) { }
         virtual void runIfValid() OVERRIDE;
     };
 };
 
-#endif // ENABLE(SCRIPTED_SPEECH)
+}
 
 #endif // MockWebSpeechRecognizer_h
diff --git a/Tools/DumpRenderTree/chromium/NotificationPresenter.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.cpp
similarity index 63%
rename from Tools/DumpRenderTree/chromium/NotificationPresenter.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.cpp
index a21588f..80c2726 100644
--- a/Tools/DumpRenderTree/chromium/NotificationPresenter.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.cpp
@@ -29,53 +29,64 @@
  */
 
 #include "config.h"
+
+#if ENABLE_NOTIFICATIONS
 #include "NotificationPresenter.h"
 
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
-
 #include "WebKit.h"
-#include "platform/WebKitPlatformSupport.h"
 #include "WebNotification.h"
 #include "WebNotificationPermissionCallback.h"
 #include "WebSecurityOrigin.h"
-#include "platform/WebString.h"
-#include "platform/WebURL.h"
+#include "WebTestDelegate.h"
 #include "googleurl/src/gurl.h"
-#include <wtf/text/CString.h>
-#include <wtf/text/WTFString.h>
+#include <public/Platform.h>
+#include <public/WebString.h>
+#include <public/WebURL.h>
 
 using namespace WebKit;
+using namespace std;
 
-static WebString identifierForNotification(const WebNotification& notification)
+namespace WebTestRunner {
+
+namespace {
+
+WebString identifierForNotification(const WebNotification& notification)
 {
     if (notification.isHTML())
         return notification.url().spec().utf16();
     return notification.title();
 }
 
-static void deferredDisplayDispatch(void* context)
+void deferredDisplayDispatch(void* context)
 {
     WebNotification* notification = static_cast<WebNotification*>(context);
     notification->dispatchDisplayEvent();
     delete notification;
 }
 
+}
+
+NotificationPresenter::NotificationPresenter()
+    : m_delegate(0)
+{
+}
+
 NotificationPresenter::~NotificationPresenter()
 {
 }
 
 void NotificationPresenter::grantPermission(const WebString& origin)
 {
-    m_allowedOrigins.add(WTF::String(origin.data(), origin.length()));
+    m_allowedOrigins.insert(origin.utf8());
 }
 
 bool NotificationPresenter::simulateClick(const WebString& title)
 {
-    WTF::String id(title.data(), title.length());
+    string id(title.utf8());
     if (m_activeNotifications.find(id) == m_activeNotifications.end())
         return false;
-    
-    const WebNotification& notification = m_activeNotifications.find(id)->value;
+
+    const WebNotification& notification = m_activeNotifications.find(id)->second;
     WebNotification eventTarget(notification);
     eventTarget.dispatchClickEvent();
     return true;
@@ -86,58 +97,57 @@
 {
     WebString identifier = identifierForNotification(notification);
     if (!notification.replaceId().isEmpty()) {
-        WTF::String replaceId(notification.replaceId().data(), notification.replaceId().length());
+        string replaceId(notification.replaceId().utf8());
         if (m_replacements.find(replaceId) != m_replacements.end())
-            printf("REPLACING NOTIFICATION %s\n",
-                   m_replacements.find(replaceId)->value.utf8().data());
+            m_delegate->printMessage(string("REPLACING NOTIFICATION ") + m_replacements.find(replaceId)->second + "\n");
 
-        m_replacements.set(replaceId, WTF::String(identifier.data(), identifier.length()));
+        m_replacements[replaceId] = identifier.utf8();
     }
 
-    if (notification.isHTML()) {
-        printf("DESKTOP NOTIFICATION: contents at %s\n",
-               notification.url().spec().data());
-    } else {
-        printf("DESKTOP NOTIFICATION:%s icon %s, title %s, text %s\n",
-               notification.direction() == WebTextDirectionRightToLeft ? "(RTL)" : "",
-               notification.iconURL().isEmpty() ? "" :
-               notification.iconURL().spec().data(),
-               notification.title().isEmpty() ? "" :
-               notification.title().utf8().data(),
-               notification.body().isEmpty() ? "" :
-               notification.body().utf8().data());
+    if (notification.isHTML())
+        m_delegate->printMessage(string("DESKTOP NOTIFICATION: contents at ") + string(notification.url().spec()) + "\n");
+    else {
+        m_delegate->printMessage("DESKTOP NOTIFICATION:");
+        m_delegate->printMessage(notification.direction() == WebTextDirectionRightToLeft ? "(RTL)" : "");
+        m_delegate->printMessage(" icon ");
+        m_delegate->printMessage(notification.iconURL().isEmpty() ? "" : notification.iconURL().spec().data());
+        m_delegate->printMessage(", title ");
+        m_delegate->printMessage(notification.title().isEmpty() ? "" : notification.title().utf8().data());
+        m_delegate->printMessage(", text ");
+        m_delegate->printMessage(notification.body().isEmpty() ? "" : notification.body().utf8().data());
+        m_delegate->printMessage("\n");
     }
 
-    WTF::String id(identifier.data(), identifier.length());
-    m_activeNotifications.set(id, notification);
+    string id(identifier.utf8());
+    m_activeNotifications[id] = notification;
 
-    webKitPlatformSupport()->callOnMainThread(deferredDisplayDispatch, new WebNotification(notification));
+    Platform::current()->callOnMainThread(deferredDisplayDispatch, new WebNotification(notification));
     return true;
 }
 
 void NotificationPresenter::cancel(const WebNotification& notification)
 {
     WebString identifier = identifierForNotification(notification);
-    printf("DESKTOP NOTIFICATION CLOSED: %s\n", identifier.utf8().data());
+    m_delegate->printMessage(string("DESKTOP NOTIFICATION CLOSED: ") + string(identifier.utf8()) + "\n");
     WebNotification eventTarget(notification);
     eventTarget.dispatchCloseEvent(false);
 
-    WTF::String id(identifier.data(), identifier.length());
-    m_activeNotifications.remove(id);
+    string id(identifier.utf8());
+    m_activeNotifications.erase(id);
 }
 
 void NotificationPresenter::objectDestroyed(const WebKit::WebNotification& notification)
 {
     WebString identifier = identifierForNotification(notification);
-    WTF::String id(identifier.data(), identifier.length());
-    m_activeNotifications.remove(id);
+    string id(identifier.utf8());
+    m_activeNotifications.erase(id);
 }
 
 WebNotificationPresenter::Permission NotificationPresenter::checkPermission(const WebSecurityOrigin& origin)
 {
     // Check with the layout test controller
     WebString originString = origin.toString();
-    bool allowed = m_allowedOrigins.find(WTF::String(originString.data(), originString.length())) != m_allowedOrigins.end();
+    bool allowed = m_allowedOrigins.find(string(originString.utf8())) != m_allowedOrigins.end();
     return allowed ? WebNotificationPresenter::PermissionAllowed
         : WebNotificationPresenter::PermissionDenied;
 }
@@ -146,9 +156,10 @@
     const WebSecurityOrigin& origin,
     WebNotificationPermissionCallback* callback)
 {
-    printf("DESKTOP NOTIFICATION PERMISSION REQUESTED: %s\n",
-           origin.toString().utf8().data());
+    m_delegate->printMessage("DESKTOP NOTIFICATION PERMISSION REQUESTED: " + string(origin.toString().utf8()) + "\n");
     callback->permissionRequestComplete();
 }
 
-#endif // ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
+}
+
+#endif // ENABLE_NOTIFICATIONS
diff --git a/Tools/DumpRenderTree/chromium/NotificationPresenter.h b/Tools/DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.h
similarity index 80%
rename from Tools/DumpRenderTree/chromium/NotificationPresenter.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.h
index e98cc72..ffd7d5c 100644
--- a/Tools/DumpRenderTree/chromium/NotificationPresenter.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/NotificationPresenter.h
@@ -33,23 +33,26 @@
 
 #include "WebNotification.h"
 #include "WebNotificationPresenter.h"
-#include <wtf/HashMap.h>
-#include <wtf/HashSet.h>
-#include <wtf/text/StringHash.h>
-#include <wtf/text/WTFString.h>
+#include <map>
+#include <set>
+#include <string>
 
-class TestShell;
+namespace WebTestRunner {
 
-// A class that implements WebNotificationPresenter for DRT.
+class WebTestDelegate;
+
+// A class that implements WebNotificationPresenter for the TestRunner library.
 class NotificationPresenter : public WebKit::WebNotificationPresenter {
 public:
-    explicit NotificationPresenter(TestShell*) { }
+    NotificationPresenter();
     virtual ~NotificationPresenter();
 
-    // Called by the DRTTestRunner to simulate a user granting permission.
+    void setDelegate(WebTestDelegate* delegate) { m_delegate = delegate; }
+
+    // Called by the TestRunner to simulate a user granting permission.
     void grantPermission(const WebKit::WebString& origin);
 
-    // Called by the DRTTestRunner to simulate a user clicking on a notification.
+    // Called by the TestRunner to simulate a user clicking on a notification.
     bool simulateClick(const WebKit::WebString& notificationIdentifier);
 
     // WebKit::WebNotificationPresenter interface
@@ -62,14 +65,18 @@
     void reset() { m_allowedOrigins.clear(); }
 
 private:
+    WebTestDelegate* m_delegate;
+
     // Set of allowed origins.
-    HashSet<WTF::String> m_allowedOrigins;
+    std::set<std::string> m_allowedOrigins;
 
     // Map of active notifications.
-    HashMap<WTF::String, WebKit::WebNotification> m_activeNotifications;
+    std::map<std::string, WebKit::WebNotification> m_activeNotifications;
 
     // Map of active replacement IDs to the titles of those notifications
-    HashMap<WTF::String, WTF::String> m_replacements;
+    std::map<std::string, std::string> m_replacements;
 };
 
+}
+
 #endif // NotificationPresenter_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp
new file mode 100644
index 0000000..f457f7a
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.cpp
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2013 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "SpellCheckClient.h"
+
+#include "MockGrammarCheck.h"
+#include "WebTestDelegate.h"
+#include "WebTextCheckingCompletion.h"
+#include "WebTextCheckingResult.h"
+
+using namespace WebKit;
+using namespace std;
+
+namespace WebTestRunner {
+
+namespace {
+
+class HostMethodTask : public WebMethodTask<SpellCheckClient> {
+public:
+    typedef void (SpellCheckClient::*CallbackMethodType)();
+    HostMethodTask(SpellCheckClient* object, CallbackMethodType callback)
+        : WebMethodTask<SpellCheckClient>(object)
+        , m_callback(callback)
+    { }
+
+    virtual void runIfValid() { (m_object->*m_callback)(); }
+
+private:
+    CallbackMethodType m_callback;
+};
+
+}
+
+SpellCheckClient::SpellCheckClient()
+    : m_lastRequestedTextCheckingCompletion(0)
+{
+}
+
+SpellCheckClient::~SpellCheckClient()
+{
+}
+
+void SpellCheckClient::setDelegate(WebTestDelegate* delegate)
+{
+    m_delegate = delegate;
+}
+
+// WebKit::WebSpellCheckClient
+void SpellCheckClient::spellCheck(const WebString& text, int& misspelledOffset, int& misspelledLength, WebVector<WebString>* optionalSuggestions)
+{
+    // Check the spelling of the given text.
+    m_spellcheck.spellCheckWord(text, &misspelledOffset, &misspelledLength);
+}
+
+void SpellCheckClient::checkTextOfParagraph(const WebString& text, WebTextCheckingTypeMask mask, WebVector<WebTextCheckingResult>* webResults)
+{
+    vector<WebTextCheckingResult> results;
+    if (mask & WebTextCheckingTypeSpelling) {
+        size_t offset = 0;
+        size_t length = text.length();
+        const WebUChar* data = text.data();
+        while (offset < length) {
+            int misspelledPosition = 0;
+            int misspelledLength = 0;
+            m_spellcheck.spellCheckWord(WebString(&data[offset], length - offset), &misspelledPosition, &misspelledLength);
+            if (!misspelledLength)
+                break;
+            WebTextCheckingResult result;
+            result.type = WebTextCheckingTypeSpelling;
+            result.location = offset + misspelledPosition;
+            result.length = misspelledLength;
+            results.push_back(result);
+            offset += misspelledPosition + misspelledLength;
+        }
+    }
+    if (mask & WebTextCheckingTypeGrammar)
+        MockGrammarCheck::checkGrammarOfString(text, &results);
+    webResults->assign(results);
+}
+
+void SpellCheckClient::requestCheckingOfText(const WebString& text, WebTextCheckingCompletion* completion)
+{
+    if (text.isEmpty()) {
+        if (completion)
+            completion->didCancelCheckingText();
+        return;
+    }
+
+    m_lastRequestedTextCheckingCompletion = completion;
+    m_lastRequestedTextCheckString = text;
+    if (m_spellcheck.hasInCache(text))
+        finishLastTextCheck();
+    else
+        m_delegate->postDelayedTask(new HostMethodTask(this, &SpellCheckClient::finishLastTextCheck), 0);
+}
+
+void SpellCheckClient::finishLastTextCheck()
+{
+    vector<WebTextCheckingResult> results;
+    int offset = 0;
+    string16 text = m_lastRequestedTextCheckString;
+    while (text.length()) {
+        int misspelledPosition = 0;
+        int misspelledLength = 0;
+        m_spellcheck.spellCheckWord(WebString(text), &misspelledPosition, &misspelledLength);
+        if (!misspelledLength)
+            break;
+        WebVector<WebString> suggestions;
+        m_spellcheck.fillSuggestionList(WebString(text.substr(misspelledPosition, misspelledLength)), &suggestions);
+        results.push_back(WebTextCheckingResult(WebTextCheckingTypeSpelling, offset + misspelledPosition, misspelledLength, suggestions.isEmpty() ? WebString() : suggestions[0]));
+        text = text.substr(misspelledPosition + misspelledLength);
+        offset += misspelledPosition + misspelledLength;
+    }
+    MockGrammarCheck::checkGrammarOfString(m_lastRequestedTextCheckString, &results);
+    m_lastRequestedTextCheckingCompletion->didFinishCheckingText(results);
+    m_lastRequestedTextCheckingCompletion = 0;
+}
+
+WebString SpellCheckClient::autoCorrectWord(const WebString&)
+{
+    // Returns an empty string as Mac WebKit ('WebKitSupport/WebEditorClient.mm')
+    // does. (If this function returns a non-empty string, WebKit replaces the
+    // given misspelled string with the result one. This process executes some
+    // editor commands and causes layout-test failures.)
+    return WebString();
+}
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.h b/Tools/DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.h
new file mode 100644
index 0000000..a20e32f
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/SpellCheckClient.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2013 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SpellCheckClient_h
+#define SpellCheckClient_h
+
+#include "MockSpellCheck.h"
+#include "WebSpellCheckClient.h"
+#include "WebTask.h"
+
+namespace WebTestRunner {
+
+class WebTestDelegate;
+
+class SpellCheckClient : public WebKit::WebSpellCheckClient {
+public:
+    SpellCheckClient();
+    virtual ~SpellCheckClient();
+
+    void setDelegate(WebTestDelegate*);
+
+    WebTaskList* taskList() { return &m_taskList; }
+    MockSpellCheck* mockSpellCheck() { return &m_spellcheck; }
+
+    // WebKit::WebSpellCheckClient implementation.
+    virtual void spellCheck(const WebKit::WebString&, int& offset, int& length, WebKit::WebVector<WebKit::WebString>* optionalSuggestions);
+    virtual void checkTextOfParagraph(const WebKit::WebString&, WebKit::WebTextCheckingTypeMask, WebKit::WebVector<WebKit::WebTextCheckingResult>*);
+    virtual void requestCheckingOfText(const WebKit::WebString&, WebKit::WebTextCheckingCompletion*);
+    virtual WebKit::WebString autoCorrectWord(const WebKit::WebString&);
+
+private:
+    void finishLastTextCheck();
+
+    // The mock spellchecker used in spellCheck().
+    MockSpellCheck m_spellcheck;
+
+    WebKit::WebString m_lastRequestedTextCheckString;
+    WebKit::WebTextCheckingCompletion* m_lastRequestedTextCheckingCompletion;
+
+    WebTaskList m_taskList;
+
+    WebTestDelegate* m_delegate;
+};
+
+}
+
+#endif // SpellCheckClient_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/WebAccessibilityController.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/TestCommon.cpp
similarity index 61%
rename from Tools/DumpRenderTree/chromium/TestRunner/src/WebAccessibilityController.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/TestCommon.cpp
index 3fbe309..78a1a1c 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/WebAccessibilityController.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestCommon.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Google Inc. All rights reserved.
+ * Copyright (C) 2013 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -29,32 +29,36 @@
  */
 
 #include "config.h"
-#include "WebAccessibilityController.h"
+#include "TestCommon.h"
 
-#include "AccessibilityControllerChromium.h"
-
-using WebKit::WebAccessibilityObject;
+using namespace std;
 
 namespace WebTestRunner {
 
-WebAccessibilityController::WebAccessibilityController(AccessibilityController* controller)
-    : m_private(controller)
-{
+namespace {
+
+const char layoutTestsPattern[] = "/LayoutTests/";
+const string::size_type layoutTestsPatternSize = sizeof(layoutTestsPattern) - 1;
+const char fileUrlPattern[] = "file:/";
+const char fileTestPrefix[] = "(file test):";
+const char dataUrlPattern[] = "data:";
+const string::size_type dataUrlPatternSize = sizeof(dataUrlPattern) - 1;
+
 }
 
-void WebAccessibilityController::setFocusedElement(const WebAccessibilityObject& object)
+string normalizeLayoutTestURL(const string& url)
 {
-    m_private->setFocusedElement(object);
-}
-
-void WebAccessibilityController::notificationReceived(const WebAccessibilityObject& target, const char* notificationName)
-{
-    m_private->notificationReceived(target, notificationName);
-}
-
-bool WebAccessibilityController::shouldLogAccessibilityEvents()
-{
-    return m_private->shouldLogAccessibilityEvents();
+    string result = url;
+    size_t pos;
+    if (!url.find(fileUrlPattern) && ((pos = url.find(layoutTestsPattern)) != string::npos)) {
+        // adjust file URLs to match upstream results.
+        result.replace(0, pos + layoutTestsPatternSize, fileTestPrefix);
+    } else if (!url.find(dataUrlPattern)) {
+        // URL-escape data URLs to match results upstream.
+        string path = url.substr(dataUrlPatternSize);
+        result.replace(dataUrlPatternSize, url.length(), path);
+    }
+    return result;
 }
 
 }
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/public/WebEventSender.h b/Tools/DumpRenderTree/chromium/TestRunner/src/TestCommon.h
similarity index 74%
rename from Tools/DumpRenderTree/chromium/TestRunner/public/WebEventSender.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/TestCommon.h
index 47c59ef..f5f00f2 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/public/WebEventSender.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestCommon.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Google Inc. All rights reserved.
+ * Copyright (C) 2013 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -28,32 +28,26 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebEventSender_h
-#define WebEventSender_h
+#ifndef TestCommon_h
+#define TestCommon_h
 
-#include "WebKit/chromium/public/WebDragOperation.h"
+#include <base/compiler_specific.h>
+#include <public/WebCommon.h>
+#include <stdio.h>
+#include <string>
 
-namespace WebKit {
-class WebDragData;
-}
+#if defined(WIN32)
+#define snprintf(str, size, ...) _snprintf_s(str, size, size, __VA_ARGS__)
+#endif
 
 namespace WebTestRunner {
 
-class EventSender;
+inline bool isASCIIAlpha(char ch) { return (ch | 0x20) >= 'a' && (ch | 0x20) <= 'z'; }
 
-class WebEventSender {
-public:
-#if WEBTESTRUNNER_IMPLEMENTATION
-    explicit WebEventSender(EventSender*);
-#endif
+inline bool isNotASCIIAlpha(char ch) { return !isASCIIAlpha(ch); }
 
-    // Simulate drag&drop system call.
-    void doDragDrop(const WebKit::WebDragData&, WebKit::WebDragOperationsMask);
-
-private:
-    EventSender* m_private;
-};
+std::string normalizeLayoutTestURL(const std::string& url);
 
 }
 
-#endif // WebEventSender_h
+#endif // TestCommon_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TestDelegate.h b/Tools/DumpRenderTree/chromium/TestRunner/src/TestDelegate.h
deleted file mode 100644
index 0498fcb..0000000
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/TestDelegate.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TestDelegate_h
-#define TestDelegate_h
-
-#include "platform/WebString.h"
-#include "platform/WebVector.h"
-
-namespace WebKit {
-struct WebContextMenuData;
-class WebGamepads;
-}
-
-namespace WebTestRunner {
-class WebTask;
-}
-
-class TestDelegate {
-public:
-    virtual void clearContextMenuData() = 0;
-    virtual void clearEditCommand() = 0;
-    virtual void fillSpellingSuggestionList(const WebKit::WebString& word, WebKit::WebVector<WebKit::WebString>* suggestions) = 0;
-    virtual void setEditCommand(const std::string& name, const std::string& value) = 0;
-    virtual WebKit::WebContextMenuData* lastContextMenuData() const = 0;
-    virtual void setGamepadData(const WebKit::WebGamepads&) = 0;
-    virtual void printMessage(const std::string& message) = 0;
-    virtual void postTask(WebTestRunner::WebTask*) = 0;
-    virtual void postDelayedTask(WebTestRunner::WebTask*, long long ms) = 0;
-    virtual WebKit::WebString registerIsolatedFileSystem(const WebKit::WebVector<WebKit::WebString>& absoluteFilenames) = 0;
-    virtual long long getCurrentTimeInMillisecond() = 0;
-    virtual WebKit::WebString getAbsoluteWebStringFromUTF8Path(const std::string& path) = 0;
-};
-
-#endif // TestDelegate_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp
index 8959bb1..afd65d8 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp
@@ -34,21 +34,60 @@
 #include "AccessibilityControllerChromium.h"
 #include "EventSender.h"
 #include "GamepadController.h"
+#include "TestRunner.h"
 #include "TextInputController.h"
-#include "platform/WebString.h"
+#include "WebCache.h"
+#include "WebKit.h"
+#include "WebRuntimeFeatures.h"
+#include <public/WebString.h>
+#include <public/WebURL.h>
+#include <string>
 
-using WebTestRunner::AccessibilityController;
-using WebTestRunner::EventSender;
-using WebKit::WebFrame;
-using WebKit::WebString;
-using WebKit::WebView;
+using namespace WebKit;
+using namespace std;
+
+namespace WebTestRunner {
 
 TestInterfaces::TestInterfaces()
+    : m_accessibilityController(new AccessibilityController())
+    , m_eventSender(new EventSender())
+    , m_gamepadController(new GamepadController())
+    , m_textInputController(new TextInputController())
+    , m_testRunner(new TestRunner(this))
+    , m_webView(0)
+    , m_delegate(0)
 {
-    m_accessibilityController = adoptPtr(new AccessibilityController());
-    m_eventSender = adoptPtr(new EventSender());
-    m_gamepadController = adoptPtr(new GamepadController());
-    m_textInputController = adoptPtr(new TextInputController());
+    WebKit::setLayoutTestMode(true);
+
+    WebRuntimeFeatures::enableDataTransferItems(true);
+    WebRuntimeFeatures::enableDeviceMotion(false);
+    WebRuntimeFeatures::enableGeolocation(true);
+    WebRuntimeFeatures::enableIndexedDatabase(true);
+    WebRuntimeFeatures::enableInputTypeDateTime(true);
+    WebRuntimeFeatures::enableInputTypeDateTimeLocal(true);
+    WebRuntimeFeatures::enableInputTypeMonth(true);
+    WebRuntimeFeatures::enableInputTypeTime(true);
+    WebRuntimeFeatures::enableInputTypeWeek(true);
+    WebRuntimeFeatures::enableFileSystem(true);
+    WebRuntimeFeatures::enableFontLoadEvents(true);
+    WebRuntimeFeatures::enableJavaScriptI18NAPI(true);
+    WebRuntimeFeatures::enableMediaSource(true);
+    WebRuntimeFeatures::enableEncryptedMedia(true);
+    WebRuntimeFeatures::enableMediaStream(true);
+    WebRuntimeFeatures::enablePeerConnection(true);
+    WebRuntimeFeatures::enableWebAudio(true);
+    WebRuntimeFeatures::enableVideoTrack(true);
+    WebRuntimeFeatures::enableGamepad(true);
+    WebRuntimeFeatures::enableShadowDOM(true);
+    WebRuntimeFeatures::enableCustomDOMElements(true);
+    WebRuntimeFeatures::enableStyleScoped(true);
+    WebRuntimeFeatures::enableScriptedSpeech(true);
+    WebRuntimeFeatures::enableRequestAutocomplete(true);
+    WebRuntimeFeatures::enableExperimentalContentSecurityPolicyFeatures(true);
+    WebRuntimeFeatures::enableSeamlessIFrames(true);
+    WebRuntimeFeatures::enableCanvasPath(true);
+
+    resetAll();
 }
 
 TestInterfaces::~TestInterfaces()
@@ -57,27 +96,34 @@
     m_eventSender->setWebView(0);
     // m_gamepadController doesn't depend on WebView.
     m_textInputController->setWebView(0);
+    m_testRunner->setWebView(0, 0);
 
     m_accessibilityController->setDelegate(0);
     m_eventSender->setDelegate(0);
     m_gamepadController->setDelegate(0);
-    // m_textInputController doesn't depend on TestDelegate.
+    // m_textInputController doesn't depend on WebTestDelegate.
+    m_testRunner->setDelegate(0);
 }
 
-void TestInterfaces::setWebView(WebView* webView)
+void TestInterfaces::setWebView(WebView* webView, WebTestProxyBase* proxy)
 {
+    m_webView = webView;
+    m_proxy = proxy;
     m_accessibilityController->setWebView(webView);
     m_eventSender->setWebView(webView);
     // m_gamepadController doesn't depend on WebView.
     m_textInputController->setWebView(webView);
+    m_testRunner->setWebView(webView, proxy);
 }
 
-void TestInterfaces::setDelegate(TestDelegate* delegate)
+void TestInterfaces::setDelegate(WebTestDelegate* delegate)
 {
     m_accessibilityController->setDelegate(delegate);
     m_eventSender->setDelegate(delegate);
     m_gamepadController->setDelegate(delegate);
-    // m_textInputController doesn't depend on TestDelegate.
+    // m_textInputController doesn't depend on WebTestDelegate.
+    m_testRunner->setDelegate(delegate);
+    m_delegate = delegate;
 }
 
 void TestInterfaces::bindTo(WebFrame* frame)
@@ -86,6 +132,8 @@
     m_eventSender->bindToJavascript(frame, WebString::fromUTF8("eventSender"));
     m_gamepadController->bindToJavascript(frame, WebString::fromUTF8("gamepadController"));
     m_textInputController->bindToJavascript(frame, WebString::fromUTF8("textInputController"));
+    m_testRunner->bindToJavascript(frame, WebString::fromUTF8("testRunner"));
+    m_testRunner->bindToJavascript(frame, WebString::fromUTF8("layoutTestController"));
 }
 
 void TestInterfaces::resetAll()
@@ -94,6 +142,42 @@
     m_eventSender->reset();
     m_gamepadController->reset();
     // m_textInputController doesn't have any state to reset.
+    m_testRunner->reset();
+    WebCache::clear();
+}
+
+void TestInterfaces::setTestIsRunning(bool running)
+{
+    m_testRunner->setTestIsRunning(running);
+}
+
+void TestInterfaces::configureForTestWithURL(const WebURL& testURL, bool generatePixels)
+{
+    string spec = GURL(testURL).spec();
+    m_testRunner->setShouldGeneratePixelResults(generatePixels);
+    if (spec.find("loading/") != string::npos)
+        m_testRunner->setShouldDumpFrameLoadCallbacks(true);
+    if (spec.find("/dumpAsText/") != string::npos) {
+        m_testRunner->setShouldDumpAsText(true);
+        m_testRunner->setShouldGeneratePixelResults(false);
+    }
+    if (spec.find("/inspector/") != string::npos)
+        m_testRunner->showDevTools();
+}
+
+void TestInterfaces::windowOpened(WebTestProxyBase* proxy)
+{
+    m_windowList.push_back(proxy);
+}
+
+void TestInterfaces::windowClosed(WebTestProxyBase* proxy)
+{
+    vector<WebTestProxyBase*>::iterator pos = find(m_windowList.begin(), m_windowList.end(), proxy);
+    if (pos == m_windowList.end()) {
+        WEBKIT_ASSERT_NOT_REACHED();
+        return;
+    }
+    m_windowList.erase(pos);
 }
 
 AccessibilityController* TestInterfaces::accessibilityController()
@@ -105,3 +189,45 @@
 {
     return m_eventSender.get();
 }
+
+TestRunner* TestInterfaces::testRunner()
+{
+    return m_testRunner.get();
+}
+
+WebView* TestInterfaces::webView()
+{
+    return m_webView;
+}
+
+WebTestDelegate* TestInterfaces::delegate()
+{
+    return m_delegate;
+}
+
+WebTestProxyBase* TestInterfaces::proxy()
+{
+    return m_proxy;
+}
+
+const vector<WebTestProxyBase*>& TestInterfaces::windowList()
+{
+    return m_windowList;
+}
+
+WebThemeEngine* TestInterfaces::themeEngine()
+{
+#if defined(USE_DEFAULT_RENDER_THEME) || !(defined(WIN32) || defined(__APPLE__))
+    return 0;
+#elif defined(WIN32)
+    if (!m_themeEngine.get())
+        m_themeEngine.reset(new WebTestThemeEngineWin());
+    return m_themeEngine.get();
+#elif defined(__APPLE__)
+    if (!m_themeEngine.get())
+        m_themeEngine.reset(new WebTestThemeEngineMac());
+    return m_themeEngine.get();
+#endif
+}
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h b/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h
index 228658c..05dc8d1 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestInterfaces.h
@@ -31,40 +31,76 @@
 #ifndef TestInterfaces_h
 #define TestInterfaces_h
 
-#include <wtf/OwnPtr.h>
+#include <memory>
+#include <vector>
+
+#if defined(WIN32)
+#include "WebTestThemeEngineWin.h"
+#elif defined(__APPLE__)
+#include "WebTestThemeEngineMac.h"
+#endif
 
 namespace WebKit {
 class WebFrame;
+class WebThemeEngine;
+class WebURL;
 class WebView;
 }
 
 namespace WebTestRunner {
+
 class AccessibilityController;
 class EventSender;
-}
-
 class GamepadController;
-class TestDelegate;
+class TestRunner;
 class TextInputController;
+class WebTestDelegate;
+class WebTestProxyBase;
 
 class TestInterfaces {
 public:
     TestInterfaces();
     ~TestInterfaces();
 
-    void setWebView(WebKit::WebView*);
-    void setDelegate(TestDelegate*);
+    void setWebView(WebKit::WebView*, WebTestProxyBase*);
+    void setDelegate(WebTestDelegate*);
     void bindTo(WebKit::WebFrame*);
     void resetAll();
+    void setTestIsRunning(bool);
+    void configureForTestWithURL(const WebKit::WebURL&, bool generatePixels);
 
-    WebTestRunner::AccessibilityController* accessibilityController();
-    WebTestRunner::EventSender* eventSender();
+    void windowOpened(WebTestProxyBase*);
+    void windowClosed(WebTestProxyBase*);
+
+    AccessibilityController* accessibilityController();
+    EventSender* eventSender();
+    TestRunner* testRunner();
+    WebKit::WebView* webView();
+    WebTestDelegate* delegate();
+    WebTestProxyBase* proxy();
+    const std::vector<WebTestProxyBase*>& windowList();
+    WebKit::WebThemeEngine* themeEngine();
 
 private:
-    OwnPtr<WebTestRunner::AccessibilityController> m_accessibilityController;
-    OwnPtr<WebTestRunner::EventSender> m_eventSender;
-    OwnPtr<GamepadController> m_gamepadController;
-    OwnPtr<TextInputController> m_textInputController;
+    std::auto_ptr<AccessibilityController> m_accessibilityController;
+    std::auto_ptr<EventSender> m_eventSender;
+    std::auto_ptr<GamepadController> m_gamepadController;
+    std::auto_ptr<TextInputController> m_textInputController;
+    std::auto_ptr<TestRunner> m_testRunner;
+    WebKit::WebView* m_webView;
+    WebTestDelegate* m_delegate;
+    WebTestProxyBase* m_proxy;
+
+    std::vector<WebTestProxyBase*> m_windowList;
+#if !defined(USE_DEFAULT_RENDER_THEME)
+#if defined(WIN32)
+    std::auto_ptr<WebTestThemeEngineWin> m_themeEngine;
+#elif defined(__APPLE__)
+    std::auto_ptr<WebTestThemeEngineMac> m_themeEngine;
+#endif
+#endif
 };
 
+}
+
 #endif // TestInterfaces_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp
new file mode 100644
index 0000000..754f1d3
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestPlugin.cpp
@@ -0,0 +1,557 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "TestPlugin.h"
+
+#include "TestCommon.h"
+#include "WebFrame.h"
+#include "WebInputEvent.h"
+#include "WebKit.h"
+#include "WebPluginParams.h"
+#include "WebTestDelegate.h"
+#include "WebTouchPoint.h"
+#include "WebUserGestureIndicator.h"
+#include <public/Platform.h>
+#include <public/WebCompositorSupport.h>
+#include <public/WebGraphicsContext3D.h>
+
+using namespace WebKit;
+using namespace std;
+
+namespace WebTestRunner {
+
+namespace {
+
+// GLenum values copied from gl2.h.
+#define GL_FALSE                  0
+#define GL_TRUE                   1
+#define GL_ONE                    1
+#define GL_TRIANGLES              0x0004
+#define GL_ONE_MINUS_SRC_ALPHA    0x0303
+#define GL_DEPTH_TEST             0x0B71
+#define GL_BLEND                  0x0BE2
+#define GL_SCISSOR_TEST           0x0B90
+#define GL_TEXTURE_2D             0x0DE1
+#define GL_FLOAT                  0x1406
+#define GL_RGBA                   0x1908
+#define GL_UNSIGNED_BYTE          0x1401
+#define GL_TEXTURE_MAG_FILTER     0x2800
+#define GL_TEXTURE_MIN_FILTER     0x2801
+#define GL_TEXTURE_WRAP_S         0x2802
+#define GL_TEXTURE_WRAP_T         0x2803
+#define GL_NEAREST                0x2600
+#define GL_COLOR_BUFFER_BIT       0x4000
+#define GL_CLAMP_TO_EDGE          0x812F
+#define GL_ARRAY_BUFFER           0x8892
+#define GL_STATIC_DRAW            0x88E4
+#define GL_FRAGMENT_SHADER        0x8B30
+#define GL_VERTEX_SHADER          0x8B31
+#define GL_COMPILE_STATUS         0x8B81
+#define GL_LINK_STATUS            0x8B82
+#define GL_COLOR_ATTACHMENT0      0x8CE0
+#define GL_FRAMEBUFFER_COMPLETE   0x8CD5
+#define GL_FRAMEBUFFER            0x8D40
+
+void premultiplyAlpha(const unsigned colorIn[3], float alpha, float colorOut[4])
+{
+    for (int i = 0; i < 3; ++i)
+        colorOut[i] = (colorIn[i] / 255.0f) * alpha;
+
+    colorOut[3] = alpha;
+}
+
+const char* pointState(WebTouchPoint::State state)
+{
+    switch (state) {
+    case WebTouchPoint::StateReleased:
+        return "Released";
+    case WebTouchPoint::StatePressed:
+        return "Pressed";
+    case WebTouchPoint::StateMoved:
+        return "Moved";
+    case WebTouchPoint::StateCancelled:
+        return "Cancelled";
+    default:
+        return "Unknown";
+    }
+
+    WEBKIT_ASSERT_NOT_REACHED();
+    return 0;
+}
+
+void printTouchList(WebTestDelegate* delegate, const WebTouchPoint* points, int length)
+{
+    for (int i = 0; i < length; ++i) {
+        char buffer[100];
+        snprintf(buffer, sizeof(buffer), "* %d, %d: %s\n", points[i].position.x, points[i].position.y, pointState(points[i].state));
+        delegate->printMessage(buffer);
+    }
+}
+
+void printEventDetails(WebTestDelegate* delegate, const WebInputEvent& event)
+{
+    if (WebInputEvent::isTouchEventType(event.type)) {
+        const WebTouchEvent& touch = static_cast<const WebTouchEvent&>(event);
+        printTouchList(delegate, touch.touches, touch.touchesLength);
+        printTouchList(delegate, touch.changedTouches, touch.changedTouchesLength);
+        printTouchList(delegate, touch.targetTouches, touch.targetTouchesLength);
+    } else if (WebInputEvent::isMouseEventType(event.type) || event.type == WebInputEvent::MouseWheel) {
+        const WebMouseEvent& mouse = static_cast<const WebMouseEvent&>(event);
+        char buffer[100];
+        snprintf(buffer, sizeof(buffer), "* %d, %d\n", mouse.x, mouse.y);
+        delegate->printMessage(buffer);
+    } else if (WebInputEvent::isGestureEventType(event.type)) {
+        const WebGestureEvent& gesture = static_cast<const WebGestureEvent&>(event);
+        char buffer[100];
+        snprintf(buffer, sizeof(buffer), "* %d, %d\n", gesture.x, gesture.y);
+        delegate->printMessage(buffer);
+    }
+}
+
+WebPluginContainer::TouchEventRequestType parseTouchEventRequestType(const WebString& string)
+{
+    if (string == WebString::fromUTF8("raw"))
+        return WebPluginContainer::TouchEventRequestTypeRaw;
+    if (string == WebString::fromUTF8("synthetic"))
+        return WebPluginContainer::TouchEventRequestTypeSynthesizedMouse;
+    return WebPluginContainer::TouchEventRequestTypeNone;
+}
+
+void deferredDelete(void* context)
+{
+    TestPlugin* plugin = static_cast<TestPlugin*>(context);
+    delete plugin;
+}
+
+}
+
+
+TestPlugin::TestPlugin(WebFrame* frame, const WebPluginParams& params, WebTestDelegate* delegate)
+    : m_frame(frame)
+    , m_delegate(delegate)
+    , m_container(0)
+    , m_context(0)
+    , m_touchEventRequest(WebPluginContainer::TouchEventRequestTypeNone)
+    , m_reRequestTouchEvents(false)
+    , m_printEventDetails(false)
+    , m_printUserGestureStatus(false)
+    , m_canProcessDrag(false)
+{
+    static const WebString kAttributePrimitive = WebString::fromUTF8("primitive");
+    static const WebString kAttributeBackgroundColor = WebString::fromUTF8("background-color");
+    static const WebString kAttributePrimitiveColor = WebString::fromUTF8("primitive-color");
+    static const WebString kAttributeOpacity = WebString::fromUTF8("opacity");
+    static const WebString kAttributeAcceptsTouch = WebString::fromUTF8("accepts-touch");
+    static const WebString kAttributeReRequestTouchEvents = WebString::fromUTF8("re-request-touch");
+    static const WebString kAttributePrintEventDetails = WebString::fromUTF8("print-event-details");
+    static const WebString kAttributeCanProcessDrag = WebString::fromUTF8("can-process-drag");
+    static const WebString kAttributePrintUserGestureStatus = WebString::fromUTF8("print-user-gesture-status");
+
+    WEBKIT_ASSERT(params.attributeNames.size() == params.attributeValues.size());
+    size_t size = params.attributeNames.size();
+    for (size_t i = 0; i < size; ++i) {
+        const WebString& attributeName = params.attributeNames[i];
+        const WebString& attributeValue = params.attributeValues[i];
+
+        if (attributeName == kAttributePrimitive)
+            m_scene.primitive = parsePrimitive(attributeValue);
+        else if (attributeName == kAttributeBackgroundColor)
+            parseColor(attributeValue, m_scene.backgroundColor);
+        else if (attributeName == kAttributePrimitiveColor)
+            parseColor(attributeValue, m_scene.primitiveColor);
+        else if (attributeName == kAttributeOpacity)
+            m_scene.opacity = parseOpacity(attributeValue);
+        else if (attributeName == kAttributeAcceptsTouch)
+            m_touchEventRequest = parseTouchEventRequestType(attributeValue);
+        else if (attributeName == kAttributeReRequestTouchEvents)
+            m_reRequestTouchEvents = parseBoolean(attributeValue);
+        else if (attributeName == kAttributePrintEventDetails)
+            m_printEventDetails = parseBoolean(attributeValue);
+        else if (attributeName == kAttributeCanProcessDrag)
+            m_canProcessDrag = parseBoolean(attributeValue);
+        else if (attributeName == kAttributePrintUserGestureStatus)
+            m_printUserGestureStatus = parseBoolean(attributeValue);
+    }
+}
+
+TestPlugin::~TestPlugin()
+{
+}
+
+bool TestPlugin::initialize(WebPluginContainer* container)
+{
+    WebGraphicsContext3D::Attributes attrs;
+    m_context = Platform::current()->createOffscreenGraphicsContext3D(attrs);
+    if (!m_context)
+        return false;
+
+    if (!m_context->makeContextCurrent())
+        return false;
+
+    if (!initScene())
+        return false;
+
+    m_layer = auto_ptr<WebExternalTextureLayer>(Platform::current()->compositorSupport()->createExternalTextureLayer(this));
+    m_container = container;
+    m_container->setWebLayer(m_layer->layer());
+    if (m_reRequestTouchEvents) {
+        m_container->requestTouchEventType(WebPluginContainer::TouchEventRequestTypeSynthesizedMouse);
+        m_container->requestTouchEventType(WebPluginContainer::TouchEventRequestTypeRaw);
+    }
+    m_container->requestTouchEventType(m_touchEventRequest);
+    m_container->setWantsWheelEvents(true);
+    return true;
+}
+
+void TestPlugin::destroy()
+{
+    if (m_container)
+        m_container->setWebLayer(0);
+    m_layer.reset();
+    destroyScene();
+
+    delete m_context;
+    m_context = 0;
+
+    m_container = 0;
+    m_frame = 0;
+
+    Platform::current()->callOnMainThread(deferredDelete, this);
+}
+
+void TestPlugin::updateGeometry(const WebRect& frameRect, const WebRect& clipRect, const WebVector<WebRect>& cutOutsRects, bool isVisible)
+{
+    if (clipRect == m_rect)
+        return;
+    m_rect = clipRect;
+    if (m_rect.isEmpty())
+        return;
+
+    m_context->reshape(m_rect.width, m_rect.height);
+    m_context->viewport(0, 0, m_rect.width, m_rect.height);
+
+    m_context->bindTexture(GL_TEXTURE_2D, m_colorTexture);
+    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+    m_context->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_rect.width, m_rect.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+    m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
+    m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorTexture, 0);
+
+    drawScene();
+
+    m_context->flush();
+    m_layer->layer()->invalidate();
+}
+
+TestPlugin::Primitive TestPlugin::parsePrimitive(const WebString& string)
+{
+    static const WebString kPrimitiveNone = WebString::fromUTF8("none");
+    static const WebString kPrimitiveTriangle = WebString::fromUTF8("triangle");
+
+    Primitive primitive = PrimitiveNone;
+    if (string == kPrimitiveNone)
+        primitive = PrimitiveNone;
+    else if (string == kPrimitiveTriangle)
+        primitive = PrimitiveTriangle;
+    else
+        WEBKIT_ASSERT_NOT_REACHED();
+    return primitive;
+}
+
+// FIXME: This method should already exist. Use it.
+// For now just parse primary colors.
+void TestPlugin::parseColor(const WebString& string, unsigned color[3])
+{
+    color[0] = color[1] = color[2] = 0;
+    if (string == "black")
+        return;
+
+    if (string == "red")
+        color[0] = 255;
+    else if (string == "green")
+        color[1] = 255;
+    else if (string == "blue")
+        color[2] = 255;
+    else
+        WEBKIT_ASSERT_NOT_REACHED();
+}
+
+float TestPlugin::parseOpacity(const WebString& string)
+{
+    return static_cast<float>(atof(string.utf8().data()));
+}
+
+bool TestPlugin::parseBoolean(const WebString& string)
+{
+    static const WebString kPrimitiveTrue = WebString::fromUTF8("true");
+    return string == kPrimitiveTrue;
+}
+
+bool TestPlugin::initScene()
+{
+    float color[4];
+    premultiplyAlpha(m_scene.backgroundColor, m_scene.opacity, color);
+
+    m_colorTexture = m_context->createTexture();
+    m_framebuffer = m_context->createFramebuffer();
+
+    m_context->viewport(0, 0, m_rect.width, m_rect.height);
+    m_context->disable(GL_DEPTH_TEST);
+    m_context->disable(GL_SCISSOR_TEST);
+
+    m_context->clearColor(color[0], color[1], color[2], color[3]);
+
+    m_context->enable(GL_BLEND);
+    m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+
+    return m_scene.primitive != PrimitiveNone ? initProgram() && initPrimitive() : true;
+}
+
+void TestPlugin::drawScene()
+{
+    m_context->viewport(0, 0, m_rect.width, m_rect.height);
+    m_context->clear(GL_COLOR_BUFFER_BIT);
+
+    if (m_scene.primitive != PrimitiveNone)
+        drawPrimitive();
+}
+
+void TestPlugin::destroyScene()
+{
+    if (m_scene.program) {
+        m_context->deleteProgram(m_scene.program);
+        m_scene.program = 0;
+    }
+    if (m_scene.vbo) {
+        m_context->deleteBuffer(m_scene.vbo);
+        m_scene.vbo = 0;
+    }
+
+    if (m_framebuffer) {
+        m_context->deleteFramebuffer(m_framebuffer);
+        m_framebuffer = 0;
+    }
+
+    if (m_colorTexture) {
+        m_context->deleteTexture(m_colorTexture);
+        m_colorTexture = 0;
+    }
+}
+
+bool TestPlugin::initProgram()
+{
+    const string vertexSource(
+        "attribute vec4 position;  \n"
+        "void main() {             \n"
+        "  gl_Position = position; \n"
+        "}                         \n"
+    );
+
+    const string fragmentSource(
+        "precision mediump float; \n"
+        "uniform vec4 color;      \n"
+        "void main() {            \n"
+        "  gl_FragColor = color;  \n"
+        "}                        \n"
+    );
+
+    m_scene.program = loadProgram(vertexSource, fragmentSource);
+    if (!m_scene.program)
+        return false;
+
+    m_scene.colorLocation = m_context->getUniformLocation(m_scene.program, "color");
+    m_scene.positionLocation = m_context->getAttribLocation(m_scene.program, "position");
+    return true;
+}
+
+bool TestPlugin::initPrimitive()
+{
+    WEBKIT_ASSERT(m_scene.primitive == PrimitiveTriangle);
+
+    m_scene.vbo = m_context->createBuffer();
+    if (!m_scene.vbo)
+        return false;
+
+    const float vertices[] = {
+        0.0f,  0.8f, 0.0f,
+        -0.8f, -0.8f, 0.0f,
+        0.8f, -0.8f, 0.0f };
+    m_context->bindBuffer(GL_ARRAY_BUFFER, m_scene.vbo);
+    m_context->bufferData(GL_ARRAY_BUFFER, sizeof(vertices), 0, GL_STATIC_DRAW);
+    m_context->bufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
+    return true;
+}
+
+void TestPlugin::drawPrimitive()
+{
+    WEBKIT_ASSERT(m_scene.primitive == PrimitiveTriangle);
+    WEBKIT_ASSERT(m_scene.vbo);
+    WEBKIT_ASSERT(m_scene.program);
+
+    m_context->useProgram(m_scene.program);
+
+    // Bind primitive color.
+    float color[4];
+    premultiplyAlpha(m_scene.primitiveColor, m_scene.opacity, color);
+    m_context->uniform4f(m_scene.colorLocation, color[0], color[1], color[2], color[3]);
+
+    // Bind primitive vertices.
+    m_context->bindBuffer(GL_ARRAY_BUFFER, m_scene.vbo);
+    m_context->enableVertexAttribArray(m_scene.positionLocation);
+    m_context->vertexAttribPointer(m_scene.positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
+    m_context->drawArrays(GL_TRIANGLES, 0, 3);
+}
+
+unsigned TestPlugin::loadShader(unsigned type, const string& source)
+{
+    unsigned shader = m_context->createShader(type);
+    if (shader) {
+        m_context->shaderSource(shader, source.data());
+        m_context->compileShader(shader);
+
+        int compiled = 0;
+        m_context->getShaderiv(shader, GL_COMPILE_STATUS, &compiled);
+        if (!compiled) {
+            m_context->deleteShader(shader);
+            shader = 0;
+        }
+    }
+    return shader;
+}
+
+unsigned TestPlugin::loadProgram(const string& vertexSource, const string& fragmentSource)
+{
+    unsigned vertexShader = loadShader(GL_VERTEX_SHADER, vertexSource);
+    unsigned fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentSource);
+    unsigned program = m_context->createProgram();
+    if (vertexShader && fragmentShader && program) {
+        m_context->attachShader(program, vertexShader);
+        m_context->attachShader(program, fragmentShader);
+        m_context->linkProgram(program);
+
+        int linked = 0;
+        m_context->getProgramiv(program, GL_LINK_STATUS, &linked);
+        if (!linked) {
+            m_context->deleteProgram(program);
+            program = 0;
+        }
+    }
+    if (vertexShader)
+        m_context->deleteShader(vertexShader);
+    if (fragmentShader)
+        m_context->deleteShader(fragmentShader);
+
+    return program;
+}
+
+bool TestPlugin::handleInputEvent(const WebInputEvent& event, WebCursorInfo& info)
+{
+    const char* eventName = 0;
+    switch (event.type) {
+    case WebInputEvent::Undefined:           eventName = "unknown"; break;
+
+    case WebInputEvent::MouseDown:           eventName = "MouseDown"; break;
+    case WebInputEvent::MouseUp:             eventName = "MouseUp"; break;
+    case WebInputEvent::MouseMove:           eventName = "MouseMove"; break;
+    case WebInputEvent::MouseEnter:          eventName = "MouseEnter"; break;
+    case WebInputEvent::MouseLeave:          eventName = "MouseLeave"; break;
+    case WebInputEvent::ContextMenu:         eventName = "ContextMenu"; break;
+
+    case WebInputEvent::MouseWheel:          eventName = "MouseWheel"; break;
+
+    case WebInputEvent::RawKeyDown:          eventName = "RawKeyDown"; break;
+    case WebInputEvent::KeyDown:             eventName = "KeyDown"; break;
+    case WebInputEvent::KeyUp:               eventName = "KeyUp"; break;
+    case WebInputEvent::Char:                eventName = "Char"; break;
+
+    case WebInputEvent::GestureScrollBegin:  eventName = "GestureScrollBegin"; break;
+    case WebInputEvent::GestureScrollEnd:    eventName = "GestureScrollEnd"; break;
+    case WebInputEvent::GestureScrollUpdateWithoutPropagation: 
+    case WebInputEvent::GestureScrollUpdate: eventName = "GestureScrollUpdate"; break;
+    case WebInputEvent::GestureFlingStart:   eventName = "GestureFlingStart"; break;
+    case WebInputEvent::GestureFlingCancel:  eventName = "GestureFlingCancel"; break;
+    case WebInputEvent::GestureTap:          eventName = "GestureTap"; break;
+    case WebInputEvent::GestureTapDown:      eventName = "GestureTapDown"; break;
+    case WebInputEvent::GestureTapCancel:    eventName = "GestureTapCancel"; break;
+    case WebInputEvent::GestureDoubleTap:    eventName = "GestureDoubleTap"; break;
+    case WebInputEvent::GestureTwoFingerTap: eventName = "GestureTwoFingerTap"; break;
+    case WebInputEvent::GestureLongPress:    eventName = "GestureLongPress"; break;
+    case WebInputEvent::GestureLongTap:      eventName = "GestureLongTap"; break;
+    case WebInputEvent::GesturePinchBegin:   eventName = "GesturePinchBegin"; break;
+    case WebInputEvent::GesturePinchEnd:     eventName = "GesturePinchEnd"; break;
+    case WebInputEvent::GesturePinchUpdate:  eventName = "GesturePinchUpdate"; break;
+
+    case WebInputEvent::TouchStart:          eventName = "TouchStart"; break;
+    case WebInputEvent::TouchMove:           eventName = "TouchMove"; break;
+    case WebInputEvent::TouchEnd:            eventName = "TouchEnd"; break;
+    case WebInputEvent::TouchCancel:         eventName = "TouchCancel"; break;
+    }
+
+    m_delegate->printMessage(std::string("Plugin received event: ") + (eventName ? eventName : "unknown") + "\n");
+    if (m_printEventDetails)
+        printEventDetails(m_delegate, event);
+    if (m_printUserGestureStatus)
+        m_delegate->printMessage(std::string("* ") + (WebUserGestureIndicator::isProcessingUserGesture() ? "" : "not ") + "handling user gesture\n");
+    return false;
+}
+
+bool TestPlugin::handleDragStatusUpdate(WebDragStatus dragStatus, const WebDragData&, WebDragOperationsMask, const WebPoint& position, const WebPoint& screenPosition)
+{
+    const char* dragStatusName = 0;
+    switch (dragStatus) {
+    case WebDragStatusEnter:
+        dragStatusName = "DragEnter";
+        break;
+    case WebDragStatusOver:
+        dragStatusName = "DragOver";
+        break;
+    case WebDragStatusLeave:
+        dragStatusName = "DragLeave";
+        break;
+    case WebDragStatusDrop:
+        dragStatusName = "DragDrop";
+        break;
+    case WebDragStatusUnknown:
+        WEBKIT_ASSERT_NOT_REACHED();
+    }
+    m_delegate->printMessage(std::string("Plugin received event: ") + dragStatusName + "\n");
+    return false;
+}
+
+TestPlugin* TestPlugin::create(WebFrame* frame, const WebPluginParams& params, WebTestDelegate* delegate)
+{
+    return new TestPlugin(frame, params, delegate);
+}
+
+const WebString& TestPlugin::mimeType()
+{
+    static const WebString kMimeType = WebString::fromUTF8("application/x-webkit-test-webplugin");
+    return kMimeType;
+}
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestWebPlugin.h b/Tools/DumpRenderTree/chromium/TestRunner/src/TestPlugin.h
similarity index 77%
rename from Tools/DumpRenderTree/chromium/TestWebPlugin.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/TestPlugin.h
index 49fde85..53b22e1 100644
--- a/Tools/DumpRenderTree/chromium/TestWebPlugin.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestPlugin.h
@@ -23,15 +23,19 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef TestWebPlugin_h
-#define TestWebPlugin_h
+#ifndef TestPlugin_h
+#define TestPlugin_h
 
 #include "WebPlugin.h"
-#include "platform/WebRect.h"
+#include "WebPluginContainer.h"
+#include <memory>
+#include <public/WebExternalTextureLayer.h>
+#include <public/WebExternalTextureLayerClient.h>
+#include <string>
 
-namespace WebKit {
-class WebGraphicsContext3D;
-}
+namespace WebTestRunner {
+
+class WebTestDelegate;
 
 // A fake implemention of WebKit::WebPlugin for testing purposes.
 //
@@ -45,10 +49,10 @@
 //
 // Whether the plugin accepts touch events or not can be customized using the
 // 'accepts-touch' plugin parameter (defaults to false).
-class TestWebPlugin : public WebKit::WebPlugin {
+class TestPlugin : public WebKit::WebPlugin, public WebKit::WebExternalTextureLayerClient {
 public:
-    TestWebPlugin(WebKit::WebFrame*, const WebKit::WebPluginParams&);
-    virtual ~TestWebPlugin();
+    static TestPlugin* create(WebKit::WebFrame*, const WebKit::WebPluginParams&, WebTestDelegate*);
+    virtual ~TestPlugin();
 
     static const WebKit::WebString& mimeType();
 
@@ -58,10 +62,7 @@
     virtual NPObject* scriptableObject() { return 0; }
     virtual bool canProcessDrag() const { return m_canProcessDrag; }
     virtual void paint(WebKit::WebCanvas*, const WebKit::WebRect&) { }
-    virtual void updateGeometry(const WebKit::WebRect& frameRect,
-                                const WebKit::WebRect& clipRect,
-                                const WebKit::WebVector<WebKit::WebRect>& cutOutsRects,
-                                bool isVisible);
+    virtual void updateGeometry(const WebKit::WebRect& frameRect, const WebKit::WebRect& clipRect, const WebKit::WebVector<WebKit::WebRect>& cutOutsRects, bool isVisible);
     virtual void updateFocus(bool) { }
     virtual void updateVisibility(bool) { }
     virtual bool acceptsInputEvents() { return true; }
@@ -75,7 +76,13 @@
     virtual void didFailLoadingFrameRequest(const WebKit::WebURL&, void* notifyData, const WebKit::WebURLError&) { }
     virtual bool isPlaceholder() { return false; }
 
+    // WebExternalTextureLayerClient methods:
+    virtual unsigned prepareTexture(WebKit::WebTextureUpdater&) { return m_colorTexture; }
+    virtual WebKit::WebGraphicsContext3D* context() { return m_context; }
+
 private:
+    TestPlugin(WebKit::WebFrame*, const WebKit::WebPluginParams&, WebTestDelegate*);
+
     enum Primitive {
         PrimitiveNone,
         PrimitiveTriangle
@@ -118,11 +125,11 @@
     bool initProgram();
     bool initPrimitive();
     void drawPrimitive();
-    unsigned loadShader(unsigned type, const WTF::CString& source);
-    unsigned loadProgram(const WTF::CString& vertexSource,
-                         const WTF::CString& fragmentSource);
+    unsigned loadShader(unsigned type, const std::string& source);
+    unsigned loadProgram(const std::string& vertexSource, const std::string& fragmentSource);
 
     WebKit::WebFrame* m_frame;
+    WebTestDelegate* m_delegate;
     WebKit::WebPluginContainer* m_container;
 
     WebKit::WebRect m_rect;
@@ -130,10 +137,16 @@
     unsigned m_colorTexture;
     unsigned m_framebuffer;
     Scene m_scene;
+    std::auto_ptr<WebKit::WebExternalTextureLayer> m_layer;
 
-    bool m_acceptsTouchEvent;
+    WebKit::WebPluginContainer::TouchEventRequestType m_touchEventRequest;
+    // Requests touch events from the WebPluginContainerImpl multiple times to tickle webkit.org/b/108381
+    bool m_reRequestTouchEvents;
     bool m_printEventDetails;
+    bool m_printUserGestureStatus;
     bool m_canProcessDrag;
 };
 
-#endif // TestPepperPlugin_h
+}
+
+#endif // TestPlugin_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp
index f0da798..69e692e 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2010 Google Inc. All rights reserved.
  * Copyright (C) 2010 Pawel Hajdan (phajdan.jr@chromium.org)
+ * Copyright (C) 2012 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -32,6 +33,2020 @@
 #include "config.h"
 #include "TestRunner.h"
 
-TestRunner::TestRunner()
+#include "MockWebSpeechInputController.h"
+#include "MockWebSpeechRecognizer.h"
+#include "NotificationPresenter.h"
+#include "TestInterfaces.h"
+#include "WebBindings.h"
+#include "WebDataSource.h"
+#include "WebDeviceOrientation.h"
+#include "WebDeviceOrientationClientMock.h"
+#include "WebDocument.h"
+#include "WebElement.h"
+#include "WebFindOptions.h"
+#include "WebFrame.h"
+#include "WebGeolocationClientMock.h"
+#include "WebInputElement.h"
+#include "WebPermissions.h"
+#include "WebPreferences.h"
+#include "WebScriptSource.h"
+#include "WebSecurityPolicy.h"
+#include "WebSerializedScriptValue.h"
+#include "WebSettings.h"
+#include "WebSurroundingText.h"
+#include "WebTask.h"
+#include "WebTestDelegate.h"
+#include "WebTestProxy.h"
+#include "WebView.h"
+#include "v8/include/v8.h"
+#include <limits>
+#include <memory>
+#include <public/WebData.h>
+#include <public/WebPoint.h>
+#include <public/WebURLResponse.h>
+
+#if defined(__linux__) || defined(ANDROID)
+#include "linux/WebFontRendering.h"
+#endif
+
+using namespace WebKit;
+using namespace std;
+
+namespace WebTestRunner {
+
+namespace {
+
+class InvokeCallbackTask : public WebMethodTask<TestRunner> {
+public:
+    InvokeCallbackTask(TestRunner* object, auto_ptr<CppVariant> callbackArguments)
+        : WebMethodTask<TestRunner>(object)
+        , m_callbackArguments(callbackArguments)
+    {
+    }
+
+    virtual void runIfValid()
+    {
+        CppVariant invokeResult;
+        m_callbackArguments->invokeDefault(m_callbackArguments.get(), 1, invokeResult);
+    }
+
+private:
+    auto_ptr<CppVariant> m_callbackArguments;
+};
+
+}
+
+TestRunner::WorkQueue::~WorkQueue()
 {
+    reset();
+}
+
+void TestRunner::WorkQueue::processWorkSoon()
+{
+    if (m_controller->topLoadingFrame())
+        return;
+
+    if (!m_queue.empty()) {
+        // We delay processing queued work to avoid recursion problems.
+        m_controller->m_delegate->postTask(new WorkQueueTask(this));
+    } else if (!m_controller->m_waitUntilDone)
+        m_controller->m_delegate->testFinished();
+}
+
+void TestRunner::WorkQueue::processWork()
+{
+    // Quit doing work once a load is in progress.
+    while (!m_queue.empty()) {
+        bool startedLoad = m_queue.front()->run(m_controller->m_delegate, m_controller->m_webView);
+        delete m_queue.front();
+        m_queue.pop_front();
+        if (startedLoad)
+            return;
+    }
+
+    if (!m_controller->m_waitUntilDone && !m_controller->topLoadingFrame())
+        m_controller->m_delegate->testFinished();
+}
+
+void TestRunner::WorkQueue::reset()
+{
+    m_frozen = false;
+    while (!m_queue.empty()) {
+        delete m_queue.front();
+        m_queue.pop_front();
+    }
+}
+
+void TestRunner::WorkQueue::addWork(WorkItem* work)
+{
+    if (m_frozen) {
+        delete work;
+        return;
+    }
+    m_queue.push_back(work);
+}
+
+
+TestRunner::TestRunner(TestInterfaces* interfaces)
+    : m_testIsRunning(false)
+    , m_closeRemainingWindows(false)
+    , m_workQueue(this)
+    , m_testInterfaces(interfaces)
+    , m_delegate(0)
+    , m_webView(0)
+    , m_webPermissions(new WebPermissions)
+#if ENABLE_NOTIFICATIONS
+    , m_notificationPresenter(new NotificationPresenter)
+#endif
+{
+    // Initialize the map that associates methods of this class with the names
+    // they will use when called by JavaScript. The actual binding of those
+    // names to their methods will be done by calling bindToJavaScript() (defined
+    // by CppBoundClass, the parent to TestRunner).
+
+    // Methods controlling test execution.
+    bindMethod("notifyDone", &TestRunner::notifyDone);
+    bindMethod("queueBackNavigation", &TestRunner::queueBackNavigation);
+    bindMethod("queueForwardNavigation", &TestRunner::queueForwardNavigation);
+    bindMethod("queueLoadingScript", &TestRunner::queueLoadingScript);
+    bindMethod("queueLoad", &TestRunner::queueLoad);
+    bindMethod("queueLoadHTMLString", &TestRunner::queueLoadHTMLString);
+    bindMethod("queueNonLoadingScript", &TestRunner::queueNonLoadingScript);
+    bindMethod("queueReload", &TestRunner::queueReload);
+    bindMethod("setCloseRemainingWindowsWhenComplete", &TestRunner::setCloseRemainingWindowsWhenComplete);
+    bindMethod("setCustomPolicyDelegate", &TestRunner::setCustomPolicyDelegate);
+    bindMethod("waitForPolicyDelegate", &TestRunner::waitForPolicyDelegate);
+    bindMethod("waitUntilDone", &TestRunner::waitUntilDone);
+    bindMethod("windowCount", &TestRunner::windowCount);
+    // Methods implemented in terms of chromium's public WebKit API.
+    bindMethod("setTabKeyCyclesThroughElements", &TestRunner::setTabKeyCyclesThroughElements);
+    bindMethod("execCommand", &TestRunner::execCommand);
+    bindMethod("isCommandEnabled", &TestRunner::isCommandEnabled);
+    bindMethod("callShouldCloseOnWebView", &TestRunner::callShouldCloseOnWebView);
+    bindMethod("setDomainRelaxationForbiddenForURLScheme", &TestRunner::setDomainRelaxationForbiddenForURLScheme);
+    bindMethod("evaluateScriptInIsolatedWorldAndReturnValue", &TestRunner::evaluateScriptInIsolatedWorldAndReturnValue);
+    bindMethod("evaluateScriptInIsolatedWorld", &TestRunner::evaluateScriptInIsolatedWorld);
+    bindMethod("setIsolatedWorldSecurityOrigin", &TestRunner::setIsolatedWorldSecurityOrigin);
+    bindMethod("setIsolatedWorldContentSecurityPolicy", &TestRunner::setIsolatedWorldContentSecurityPolicy);
+    bindMethod("addOriginAccessWhitelistEntry", &TestRunner::addOriginAccessWhitelistEntry);
+    bindMethod("removeOriginAccessWhitelistEntry", &TestRunner::removeOriginAccessWhitelistEntry);
+    bindMethod("hasCustomPageSizeStyle", &TestRunner::hasCustomPageSizeStyle);
+    bindMethod("forceRedSelectionColors", &TestRunner::forceRedSelectionColors);
+    bindMethod("addUserScript", &TestRunner::addUserScript);
+    bindMethod("addUserStyleSheet", &TestRunner::addUserStyleSheet);
+    bindMethod("startSpeechInput", &TestRunner::startSpeechInput);
+    bindMethod("findString", &TestRunner::findString);
+    bindMethod("setValueForUser", &TestRunner::setValueForUser);
+    bindMethod("enableFixedLayoutMode", &TestRunner::enableFixedLayoutMode);
+    bindMethod("setFixedLayoutSize", &TestRunner::setFixedLayoutSize);
+    bindMethod("selectionAsMarkup", &TestRunner::selectionAsMarkup);
+    bindMethod("setTextSubpixelPositioning", &TestRunner::setTextSubpixelPositioning);
+    bindMethod("resetPageVisibility", &TestRunner::resetPageVisibility);
+    bindMethod("setPageVisibility", &TestRunner::setPageVisibility);
+    bindMethod("setTextDirection", &TestRunner::setTextDirection);
+    bindMethod("textSurroundingNode", &TestRunner::textSurroundingNode);
+    bindMethod("disableAutoResizeMode", &TestRunner::disableAutoResizeMode);
+    bindMethod("enableAutoResizeMode", &TestRunner::enableAutoResizeMode);
+    bindMethod("setMockDeviceOrientation", &TestRunner::setMockDeviceOrientation);
+    bindMethod("didAcquirePointerLock", &TestRunner::didAcquirePointerLock);
+    bindMethod("didLosePointerLock", &TestRunner::didLosePointerLock);
+    bindMethod("didNotAcquirePointerLock", &TestRunner::didNotAcquirePointerLock);
+    bindMethod("setPointerLockWillRespondAsynchronously", &TestRunner::setPointerLockWillRespondAsynchronously);
+    bindMethod("setPointerLockWillFailSynchronously", &TestRunner::setPointerLockWillFailSynchronously);
+
+    // The following modify WebPreferences.
+    bindMethod("setUserStyleSheetEnabled", &TestRunner::setUserStyleSheetEnabled);
+    bindMethod("setUserStyleSheetLocation", &TestRunner::setUserStyleSheetLocation);
+    bindMethod("setAuthorAndUserStylesEnabled", &TestRunner::setAuthorAndUserStylesEnabled);
+    bindMethod("setPopupBlockingEnabled", &TestRunner::setPopupBlockingEnabled);
+    bindMethod("setJavaScriptCanAccessClipboard", &TestRunner::setJavaScriptCanAccessClipboard);
+    bindMethod("setXSSAuditorEnabled", &TestRunner::setXSSAuditorEnabled);
+    bindMethod("setAllowUniversalAccessFromFileURLs", &TestRunner::setAllowUniversalAccessFromFileURLs);
+    bindMethod("setAllowFileAccessFromFileURLs", &TestRunner::setAllowFileAccessFromFileURLs);
+    bindMethod("overridePreference", &TestRunner::overridePreference);
+    bindMethod("setPluginsEnabled", &TestRunner::setPluginsEnabled);
+
+    // The following modify the state of the TestRunner.
+    bindMethod("dumpEditingCallbacks", &TestRunner::dumpEditingCallbacks);
+    bindMethod("dumpAsText", &TestRunner::dumpAsText);
+    bindMethod("dumpChildFramesAsText", &TestRunner::dumpChildFramesAsText);
+    bindMethod("dumpChildFrameScrollPositions", &TestRunner::dumpChildFrameScrollPositions);
+    bindMethod("dumpIconChanges", &TestRunner::dumpIconChanges);
+    bindMethod("setAudioData", &TestRunner::setAudioData);
+    bindMethod("dumpFrameLoadCallbacks", &TestRunner::dumpFrameLoadCallbacks);
+    bindMethod("dumpUserGestureInFrameLoadCallbacks", &TestRunner::dumpUserGestureInFrameLoadCallbacks);
+    bindMethod("setStopProvisionalFrameLoads", &TestRunner::setStopProvisionalFrameLoads);
+    bindMethod("dumpTitleChanges", &TestRunner::dumpTitleChanges);
+    bindMethod("dumpCreateView", &TestRunner::dumpCreateView);
+    bindMethod("setCanOpenWindows", &TestRunner::setCanOpenWindows);
+    bindMethod("dumpResourceLoadCallbacks", &TestRunner::dumpResourceLoadCallbacks);
+    bindMethod("dumpResourceRequestCallbacks", &TestRunner::dumpResourceRequestCallbacks);
+    bindMethod("dumpResourceResponseMIMETypes", &TestRunner::dumpResourceResponseMIMETypes);
+    bindMethod("dumpPermissionClientCallbacks", &TestRunner::dumpPermissionClientCallbacks);
+    bindMethod("setImagesAllowed", &TestRunner::setImagesAllowed);
+    bindMethod("setScriptsAllowed", &TestRunner::setScriptsAllowed);
+    bindMethod("setStorageAllowed", &TestRunner::setStorageAllowed);
+    bindMethod("setPluginsAllowed", &TestRunner::setPluginsAllowed);
+    bindMethod("setAllowDisplayOfInsecureContent", &TestRunner::setAllowDisplayOfInsecureContent);
+    bindMethod("setAllowRunningOfInsecureContent", &TestRunner::setAllowRunningOfInsecureContent);
+    bindMethod("dumpStatusCallbacks", &TestRunner::dumpWindowStatusChanges);
+    bindMethod("dumpProgressFinishedCallback", &TestRunner::dumpProgressFinishedCallback);
+    bindMethod("dumpBackForwardList", &TestRunner::dumpBackForwardList);
+    bindMethod("setDeferMainResourceDataLoad", &TestRunner::setDeferMainResourceDataLoad);
+    bindMethod("dumpSelectionRect", &TestRunner::dumpSelectionRect);
+    bindMethod("testRepaint", &TestRunner::testRepaint);
+    bindMethod("repaintSweepHorizontally", &TestRunner::repaintSweepHorizontally);
+    bindMethod("setPrinting", &TestRunner::setPrinting);
+    bindMethod("setShouldStayOnPageAfterHandlingBeforeUnload", &TestRunner::setShouldStayOnPageAfterHandlingBeforeUnload);
+    bindMethod("setWillSendRequestClearHeader", &TestRunner::setWillSendRequestClearHeader);
+    bindMethod("setWillSendRequestReturnsNull", &TestRunner::setWillSendRequestReturnsNull);
+    bindMethod("setWillSendRequestReturnsNullOnRedirect", &TestRunner::setWillSendRequestReturnsNullOnRedirect);
+    bindMethod("dumpResourceRequestPriorities", &TestRunner::dumpResourceRequestPriorities);
+
+    // The following methods interact with the WebTestProxy.
+    // The following methods interact with the WebTestDelegate.
+    bindMethod("showWebInspector", &TestRunner::showWebInspector);
+    bindMethod("closeWebInspector", &TestRunner::closeWebInspector);
+    bindMethod("evaluateInWebInspector", &TestRunner::evaluateInWebInspector);
+    bindMethod("clearAllDatabases", &TestRunner::clearAllDatabases);
+    bindMethod("setDatabaseQuota", &TestRunner::setDatabaseQuota);
+    bindMethod("setAlwaysAcceptCookies", &TestRunner::setAlwaysAcceptCookies);
+    bindMethod("setWindowIsKey", &TestRunner::setWindowIsKey);
+    bindMethod("pathToLocalResource", &TestRunner::pathToLocalResource);
+    bindMethod("setBackingScaleFactor", &TestRunner::setBackingScaleFactor);
+    bindMethod("setPOSIXLocale", &TestRunner::setPOSIXLocale);
+    bindMethod("numberOfPendingGeolocationPermissionRequests", &TestRunner:: numberOfPendingGeolocationPermissionRequests);
+    bindMethod("setGeolocationPermission", &TestRunner::setGeolocationPermission);
+    bindMethod("setMockGeolocationPositionUnavailableError", &TestRunner::setMockGeolocationPositionUnavailableError);
+    bindMethod("setMockGeolocationPosition", &TestRunner::setMockGeolocationPosition);
+#if ENABLE_NOTIFICATIONS
+    bindMethod("grantWebNotificationPermission", &TestRunner::grantWebNotificationPermission);
+    bindMethod("simulateLegacyWebNotificationClick", &TestRunner::simulateLegacyWebNotificationClick);
+#endif
+    bindMethod("addMockSpeechInputResult", &TestRunner::addMockSpeechInputResult);
+    bindMethod("setMockSpeechInputDumpRect", &TestRunner::setMockSpeechInputDumpRect);
+    bindMethod("addMockSpeechRecognitionResult", &TestRunner::addMockSpeechRecognitionResult);
+    bindMethod("setMockSpeechRecognitionError", &TestRunner::setMockSpeechRecognitionError);
+    bindMethod("wasMockSpeechRecognitionAborted", &TestRunner::wasMockSpeechRecognitionAborted);
+    bindMethod("display", &TestRunner::display);
+    bindMethod("displayInvalidatedRegion", &TestRunner::displayInvalidatedRegion);
+
+    // Properties.
+    bindProperty("globalFlag", &m_globalFlag);
+    bindProperty("titleTextDirection", &m_titleTextDirection);
+    bindProperty("platformName", &m_platformName);
+    // webHistoryItemCount is used by tests in LayoutTests\http\tests\history
+    bindProperty("webHistoryItemCount", &m_webHistoryItemCount);
+    bindProperty("interceptPostMessage", &m_interceptPostMessage);
+
+    // The following are stubs.
+    bindMethod("dumpDatabaseCallbacks", &TestRunner::notImplemented);
+    bindMethod("denyWebNotificationPermission", &TestRunner::notImplemented);
+    bindMethod("removeAllWebNotificationPermissions", &TestRunner::notImplemented);
+    bindMethod("simulateWebNotificationClick", &TestRunner::notImplemented);
+    bindMethod("setIconDatabaseEnabled", &TestRunner::notImplemented);
+    bindMethod("setScrollbarPolicy", &TestRunner::notImplemented);
+    bindMethod("clearAllApplicationCaches", &TestRunner::notImplemented);
+    bindMethod("clearApplicationCacheForOrigin", &TestRunner::notImplemented);
+    bindMethod("clearBackForwardList", &TestRunner::notImplemented);
+    bindMethod("keepWebHistory", &TestRunner::notImplemented);
+    bindMethod("setApplicationCacheOriginQuota", &TestRunner::notImplemented);
+    bindMethod("setCallCloseOnWebViews", &TestRunner::notImplemented);
+    bindMethod("setMainFrameIsFirstResponder", &TestRunner::notImplemented);
+    bindMethod("setPrivateBrowsingEnabled", &TestRunner::notImplemented);
+    bindMethod("setUseDashboardCompatibilityMode", &TestRunner::notImplemented);
+    bindMethod("deleteAllLocalStorage", &TestRunner::notImplemented);
+    bindMethod("localStorageDiskUsageForOrigin", &TestRunner::notImplemented);
+    bindMethod("originsWithLocalStorage", &TestRunner::notImplemented);
+    bindMethod("deleteLocalStorageForOrigin", &TestRunner::notImplemented);
+    bindMethod("observeStorageTrackerNotifications", &TestRunner::notImplemented);
+    bindMethod("syncLocalStorage", &TestRunner::notImplemented);
+    bindMethod("addDisallowedURL", &TestRunner::notImplemented);
+    bindMethod("applicationCacheDiskUsageForOrigin", &TestRunner::notImplemented);
+    bindMethod("abortModal", &TestRunner::notImplemented);
+
+    // The fallback method is called when an unknown method is invoked.
+    bindFallbackMethod(&TestRunner::fallbackMethod);
+}
+
+TestRunner::~TestRunner()
+{
+}
+
+void TestRunner::setDelegate(WebTestDelegate* delegate)
+{
+    m_delegate = delegate;
+    m_webPermissions->setDelegate(delegate);
+#if ENABLE_NOTIFICATIONS
+    m_notificationPresenter->setDelegate(delegate);
+#endif
+}
+
+void TestRunner::setWebView(WebView* webView, WebTestProxyBase* proxy)
+{
+    m_webView = webView;
+    m_proxy = proxy;
+}
+
+void TestRunner::reset()
+{
+    if (m_webView) {
+        m_webView->setZoomLevel(false, 0);
+        m_webView->setTabKeyCyclesThroughElements(true);
+#if !defined(__APPLE__) && !defined(WIN32) // Actually, TOOLKIT_GTK
+        // (Constants copied because we can't depend on the header that defined
+        // them from this file.)
+        m_webView->setSelectionColors(0xff1e90ff, 0xff000000, 0xffc8c8c8, 0xff323232);
+#endif
+        m_webView->removeAllUserContent();
+        m_webView->disableAutoResizeMode();
+    }
+    m_topLoadingFrame = 0;
+    m_waitUntilDone = false;
+    m_policyDelegateEnabled = false;
+    m_policyDelegateIsPermissive = false;
+    m_policyDelegateShouldNotifyDone = false;
+
+    WebSecurityPolicy::resetOriginAccessWhitelists();
+#if defined(__linux__) || defined(ANDROID)
+    WebFontRendering::setSubpixelPositioning(false);
+#endif
+
+    if (m_delegate) {
+        // Reset the default quota for each origin to 5MB
+        m_delegate->setDatabaseQuota(5 * 1024 * 1024);
+        m_delegate->setDeviceScaleFactor(1);
+        m_delegate->setAcceptAllCookies(false);
+        m_delegate->setLocale("");
+    }
+
+    m_dumpEditingCallbacks = false;
+    m_dumpAsText = false;
+    m_generatePixelResults = true;
+    m_dumpChildFrameScrollPositions = false;
+    m_dumpChildFramesAsText = false;
+    m_dumpIconChanges = false;
+    m_dumpAsAudio = false;
+    m_dumpFrameLoadCallbacks = false;
+    m_dumpUserGestureInFrameLoadCallbacks = false;
+    m_stopProvisionalFrameLoads = false;
+    m_dumpTitleChanges = false;
+    m_dumpCreateView = false;
+    m_canOpenWindows = false;
+    m_dumpResourceLoadCallbacks = false;
+    m_dumpResourceRequestCallbacks = false;
+    m_dumpResourceResponseMIMETypes = false;
+    m_dumpWindowStatusChanges = false;
+    m_dumpProgressFinishedCallback = false;
+    m_dumpBackForwardList = false;
+    m_deferMainResourceDataLoad = true;
+    m_dumpSelectionRect = false;
+    m_testRepaint = false;
+    m_sweepHorizontally = false;
+    m_isPrinting = false;
+    m_shouldStayOnPageAfterHandlingBeforeUnload = false;
+    m_shouldBlockRedirects = false;
+    m_willSendRequestShouldReturnNull = false;
+    m_shouldDumpResourcePriorities = false;
+
+    m_httpHeadersToClear.clear();
+
+    m_globalFlag.set(false);
+    m_titleTextDirection.set("ltr");
+    m_webHistoryItemCount.set(0);
+    m_interceptPostMessage.set(false);
+    m_platformName.set("chromium");
+
+    m_userStyleSheetLocation = WebURL();
+
+    m_webPermissions->reset();
+
+#if ENABLE_NOTIFICATIONS
+    m_notificationPresenter->reset();
+#endif
+    m_pointerLocked = false;
+    m_pointerLockPlannedResult = PointerLockWillSucceed;
+
+    m_taskList.revokeAll();
+    m_workQueue.reset();
+
+    if (m_closeRemainingWindows && m_delegate)
+        m_delegate->closeRemainingWindows();
+    else
+        m_closeRemainingWindows = true;
+}
+
+
+void TestRunner::setTestIsRunning(bool running)
+{
+    m_testIsRunning = running;
+}
+
+bool TestRunner::shouldDumpEditingCallbacks() const
+{
+    return m_dumpEditingCallbacks;
+}
+
+void TestRunner::checkResponseMimeType()
+{
+    // Text output: the test page can request different types of output
+    // which we handle here.
+    if (!m_dumpAsText) {
+        string mimeType = m_webView->mainFrame()->dataSource()->response().mimeType().utf8();
+        if (mimeType == "text/plain") {
+            m_dumpAsText = true;
+            m_generatePixelResults = false;
+        }
+    }
+}
+
+bool TestRunner::shouldDumpAsText()
+{
+    checkResponseMimeType();
+    return m_dumpAsText;
+}
+
+void TestRunner::setShouldDumpAsText(bool value)
+{
+    m_dumpAsText = value;
+}
+
+bool TestRunner::shouldGeneratePixelResults()
+{
+    checkResponseMimeType();
+    return m_generatePixelResults;
+}
+
+void TestRunner::setShouldGeneratePixelResults(bool value)
+{
+    m_generatePixelResults = value;
+}
+
+bool TestRunner::shouldDumpChildFrameScrollPositions() const
+{
+    return m_dumpChildFrameScrollPositions;
+}
+
+bool TestRunner::shouldDumpChildFramesAsText() const
+{
+    return m_dumpChildFramesAsText;
+}
+
+bool TestRunner::shouldDumpAsAudio() const
+{
+    return m_dumpAsAudio;
+}
+
+const WebArrayBufferView* TestRunner::audioData() const
+{
+    return &m_audioData;
+}
+
+bool TestRunner::shouldDumpFrameLoadCallbacks() const
+{
+    return m_testIsRunning && m_dumpFrameLoadCallbacks;
+}
+
+void TestRunner::setShouldDumpFrameLoadCallbacks(bool value)
+{
+    m_dumpFrameLoadCallbacks = value;
+}
+
+bool TestRunner::shouldDumpUserGestureInFrameLoadCallbacks() const
+{
+    return m_testIsRunning && m_dumpUserGestureInFrameLoadCallbacks;
+}
+
+bool TestRunner::stopProvisionalFrameLoads() const
+{
+    return m_stopProvisionalFrameLoads;
+}
+
+bool TestRunner::shouldDumpTitleChanges() const
+{
+    return m_dumpTitleChanges;
+}
+
+bool TestRunner::shouldDumpIconChanges() const
+{
+    return m_dumpIconChanges;
+}
+
+bool TestRunner::shouldDumpCreateView() const
+{
+    return m_dumpCreateView;
+}
+
+bool TestRunner::canOpenWindows() const
+{
+    return m_canOpenWindows;
+}
+
+bool TestRunner::shouldDumpResourceLoadCallbacks() const
+{
+    return m_testIsRunning && m_dumpResourceLoadCallbacks;
+}
+
+bool TestRunner::shouldDumpResourceRequestCallbacks() const
+{
+    return m_testIsRunning && m_dumpResourceRequestCallbacks;
+}
+
+bool TestRunner::shouldDumpResourceResponseMIMETypes() const
+{
+    return m_testIsRunning && m_dumpResourceResponseMIMETypes;
+}
+
+WebPermissionClient* TestRunner::webPermissions() const
+{
+    return m_webPermissions.get();
+}
+
+bool TestRunner::shouldDumpStatusCallbacks() const
+{
+    return m_dumpWindowStatusChanges;
+}
+
+bool TestRunner::shouldDumpProgressFinishedCallback() const
+{
+    return m_dumpProgressFinishedCallback;
+}
+
+bool TestRunner::shouldDumpBackForwardList() const
+{
+    return m_dumpBackForwardList;
+}
+
+bool TestRunner::deferMainResourceDataLoad() const
+{
+    return m_deferMainResourceDataLoad;
+}
+
+bool TestRunner::shouldDumpSelectionRect() const
+{
+    return m_dumpSelectionRect;
+}
+
+bool TestRunner::testRepaint() const
+{
+    return m_testRepaint;
+}
+
+bool TestRunner::sweepHorizontally() const
+{
+    return m_sweepHorizontally;
+}
+
+bool TestRunner::isPrinting() const
+{
+    return m_isPrinting;
+}
+
+bool TestRunner::shouldStayOnPageAfterHandlingBeforeUnload() const
+{
+    return m_shouldStayOnPageAfterHandlingBeforeUnload;
+}
+
+void TestRunner::setTitleTextDirection(WebKit::WebTextDirection dir)
+{
+    m_titleTextDirection.set(dir == WebKit::WebTextDirectionLeftToRight ? "ltr" : "rtl");
+}
+
+const std::set<std::string>* TestRunner::httpHeadersToClear() const
+{
+    return &m_httpHeadersToClear;
+}
+
+bool TestRunner::shouldBlockRedirects() const
+{
+    return m_shouldBlockRedirects;
+}
+
+bool TestRunner::willSendRequestShouldReturnNull() const
+{
+    return m_willSendRequestShouldReturnNull;
+}
+
+void TestRunner::setTopLoadingFrame(WebFrame* frame, bool clear)
+{
+    if (frame->top()->view() != m_webView)
+        return;
+    if (!m_testIsRunning)
+        return;
+    if (clear) {
+        m_topLoadingFrame = 0;
+        locationChangeDone();
+    } else if (!m_topLoadingFrame)
+        m_topLoadingFrame = frame;
+}
+
+WebFrame* TestRunner::topLoadingFrame() const
+{
+    return m_topLoadingFrame;
+}
+
+void TestRunner::policyDelegateDone()
+{
+    WEBKIT_ASSERT(m_waitUntilDone);
+    m_delegate->testFinished();
+    m_waitUntilDone = false;
+}
+
+bool TestRunner::policyDelegateEnabled() const
+{
+    return m_policyDelegateEnabled;
+}
+
+bool TestRunner::policyDelegateIsPermissive() const
+{
+    return m_policyDelegateIsPermissive;
+}
+
+bool TestRunner::policyDelegateShouldNotifyDone() const
+{
+    return m_policyDelegateShouldNotifyDone;
+}
+
+bool TestRunner::shouldInterceptPostMessage() const
+{
+    return m_interceptPostMessage.isBool() && m_interceptPostMessage.toBoolean();
+}
+
+bool TestRunner::shouldDumpResourcePriorities() const
+{
+    return m_shouldDumpResourcePriorities;
+}
+
+#if ENABLE_NOTIFICATIONS
+WebNotificationPresenter* TestRunner::notificationPresenter() const
+{
+    return m_notificationPresenter.get();
+}
+#endif
+
+bool TestRunner::requestPointerLock()
+{
+    switch (m_pointerLockPlannedResult) {
+    case PointerLockWillSucceed:
+        m_delegate->postDelayedTask(new HostMethodTask(this, &TestRunner::didAcquirePointerLockInternal), 0);
+        return true;
+    case PointerLockWillRespondAsync:
+        WEBKIT_ASSERT(!m_pointerLocked);
+        return true;
+    case PointerLockWillFailSync:
+        WEBKIT_ASSERT(!m_pointerLocked);
+        return false;
+    default:
+        WEBKIT_ASSERT_NOT_REACHED();
+        return false;
+    }
+}
+
+void TestRunner::requestPointerUnlock()
+{
+    m_delegate->postDelayedTask(new HostMethodTask(this, &TestRunner::didLosePointerLockInternal), 0);
+}
+
+bool TestRunner::isPointerLocked()
+{
+    return m_pointerLocked;
+}
+
+void TestRunner::didAcquirePointerLockInternal()
+{
+    m_pointerLocked = true;
+    m_webView->didAcquirePointerLock();
+
+    // Reset planned result to default.
+    m_pointerLockPlannedResult = PointerLockWillSucceed;
+}
+
+void TestRunner::didNotAcquirePointerLockInternal()
+{
+    WEBKIT_ASSERT(!m_pointerLocked);
+    m_pointerLocked = false;
+    m_webView->didNotAcquirePointerLock();
+
+    // Reset planned result to default.
+    m_pointerLockPlannedResult = PointerLockWillSucceed;
+}
+
+void TestRunner::didLosePointerLockInternal()
+{
+    bool wasLocked = m_pointerLocked;
+    m_pointerLocked = false;
+    if (wasLocked)
+        m_webView->didLosePointerLock();
+}
+
+void TestRunner::showDevTools()
+{
+    m_delegate->showDevTools();
+}
+
+void TestRunner::waitUntilDone(const CppArgumentList&, CppVariant* result)
+{
+    if (!m_delegate->isBeingDebugged())
+        m_delegate->postDelayedTask(new NotifyDoneTimedOutTask(this), m_delegate->layoutTestTimeout());
+    m_waitUntilDone = true;
+    result->setNull();
+}
+
+void TestRunner::notifyDone(const CppArgumentList&, CppVariant* result)
+{
+    // Test didn't timeout. Kill the timeout timer.
+    taskList()->revokeAll();
+
+    completeNotifyDone(false);
+    result->setNull();
+}
+
+void TestRunner::completeNotifyDone(bool isTimeout)
+{
+    if (m_waitUntilDone && !topLoadingFrame() && m_workQueue.isEmpty()) {
+        if (isTimeout)
+            m_delegate->testTimedOut();
+        else
+            m_delegate->testFinished();
+    }
+    m_waitUntilDone = false;
+}
+
+class WorkItemBackForward : public TestRunner::WorkItem {
+public:
+    WorkItemBackForward(int distance) : m_distance(distance) { }
+    bool run(WebTestDelegate* delegate, WebView*)
+    {
+        delegate->goToOffset(m_distance);
+        return true; // FIXME: Did it really start a navigation?
+    }
+
+private:
+    int m_distance;
+};
+
+void TestRunner::queueBackNavigation(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isNumber())
+        m_workQueue.addWork(new WorkItemBackForward(-arguments[0].toInt32()));
+    result->setNull();
+}
+
+void TestRunner::queueForwardNavigation(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isNumber())
+        m_workQueue.addWork(new WorkItemBackForward(arguments[0].toInt32()));
+    result->setNull();
+}
+
+class WorkItemReload : public TestRunner::WorkItem {
+public:
+    bool run(WebTestDelegate* delegate, WebView*)
+    {
+        delegate->reload();
+        return true;
+    }
+};
+
+void TestRunner::queueReload(const CppArgumentList&, CppVariant* result)
+{
+    m_workQueue.addWork(new WorkItemReload);
+    result->setNull();
+}
+
+class WorkItemLoadingScript : public TestRunner::WorkItem {
+public:
+    WorkItemLoadingScript(const string& script) : m_script(script) { }
+    bool run(WebTestDelegate*, WebView* webView)
+    {
+        webView->mainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(m_script)));
+        return true; // FIXME: Did it really start a navigation?
+    }
+
+private:
+    string m_script;
+};
+
+class WorkItemNonLoadingScript : public TestRunner::WorkItem {
+public:
+    WorkItemNonLoadingScript(const string& script) : m_script(script) { }
+    bool run(WebTestDelegate*, WebView* webView)
+    {
+        webView->mainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(m_script)));
+        return false;
+    }
+
+private:
+    string m_script;
+};
+
+void TestRunner::queueLoadingScript(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isString())
+        m_workQueue.addWork(new WorkItemLoadingScript(arguments[0].toString()));
+    result->setNull();
+}
+
+void TestRunner::queueNonLoadingScript(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isString())
+        m_workQueue.addWork(new WorkItemNonLoadingScript(arguments[0].toString()));
+    result->setNull();
+}
+
+class WorkItemLoad : public TestRunner::WorkItem {
+public:
+    WorkItemLoad(const WebURL& url, const string& target)
+        : m_url(url)
+        , m_target(target) { }
+    bool run(WebTestDelegate* delegate, WebView*)
+    {
+        delegate->loadURLForFrame(m_url, m_target);
+        return true; // FIXME: Did it really start a navigation?
+    }
+
+private:
+    WebURL m_url;
+    string m_target;
+};
+
+void TestRunner::queueLoad(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isString()) {
+        // FIXME: Implement WebURL::resolve() and avoid GURL.
+        GURL currentURL = m_webView->mainFrame()->document().url();
+        GURL fullURL = currentURL.Resolve(arguments[0].toString());
+
+        string target = "";
+        if (arguments.size() > 1 && arguments[1].isString())
+            target = arguments[1].toString();
+
+        m_workQueue.addWork(new WorkItemLoad(fullURL, target));
+    }
+    result->setNull();
+}
+
+class WorkItemLoadHTMLString : public TestRunner::WorkItem  {
+public:
+    WorkItemLoadHTMLString(const std::string& html, const WebURL& baseURL)
+        : m_html(html)
+        , m_baseURL(baseURL) { }
+    WorkItemLoadHTMLString(const std::string& html, const WebURL& baseURL, const WebURL& unreachableURL)
+        : m_html(html)
+        , m_baseURL(baseURL)
+        , m_unreachableURL(unreachableURL) { }
+    bool run(WebTestDelegate*, WebView* webView)
+    {
+        webView->mainFrame()->loadHTMLString(
+            WebKit::WebData(m_html.data(), m_html.length()), m_baseURL, m_unreachableURL);
+        return true;
+    }
+
+private:
+    std::string m_html;
+    WebURL m_baseURL;
+    WebURL m_unreachableURL;
+};
+
+void TestRunner::queueLoadHTMLString(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isString()) {
+        string html = arguments[0].toString();
+        WebURL baseURL(GURL(""));
+        if (arguments.size() > 1 && arguments[1].isString())
+            baseURL = WebURL(GURL(arguments[1].toString()));
+        if (arguments.size() > 2 && arguments[2].isString())
+            m_workQueue.addWork(new WorkItemLoadHTMLString(html, baseURL, WebURL(GURL(arguments[2].toString()))));
+        else
+            m_workQueue.addWork(new WorkItemLoadHTMLString(html, baseURL));
+    }
+    result->setNull();
+}
+
+void TestRunner::locationChangeDone()
+{
+    m_webHistoryItemCount.set(m_delegate->navigationEntryCount());
+
+    // No more new work after the first complete load.
+    m_workQueue.setFrozen(true);
+
+    if (!m_waitUntilDone)
+        m_workQueue.processWorkSoon();
+}
+
+void TestRunner::windowCount(const CppArgumentList&, CppVariant* result)
+{
+    result->set(static_cast<int>(m_testInterfaces->windowList().size()));
+}
+
+void TestRunner::setCloseRemainingWindowsWhenComplete(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_closeRemainingWindows = arguments[0].value.boolValue;
+    result->setNull();
+}
+
+void TestRunner::setCustomPolicyDelegate(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_policyDelegateEnabled = arguments[0].value.boolValue;
+        m_policyDelegateIsPermissive = false;
+        if (arguments.size() > 1 && arguments[1].isBool())
+            m_policyDelegateIsPermissive = arguments[1].value.boolValue;
+    }
+    result->setNull();
+}
+
+void TestRunner::waitForPolicyDelegate(const CppArgumentList&, CppVariant* result)
+{
+    m_policyDelegateEnabled = true;
+    m_policyDelegateShouldNotifyDone = true;
+    m_waitUntilDone = true;
+    result->setNull();
+}
+
+void TestRunner::dumpPermissionClientCallbacks(const CppArgumentList&, CppVariant* result)
+{
+    m_webPermissions->setDumpCallbacks(true);
+    result->setNull();
+}
+
+void TestRunner::setImagesAllowed(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_webPermissions->setImagesAllowed(arguments[0].toBoolean());
+    result->setNull();
+}
+
+void TestRunner::setScriptsAllowed(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_webPermissions->setScriptsAllowed(arguments[0].toBoolean());
+    result->setNull();
+}
+
+void TestRunner::setStorageAllowed(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_webPermissions->setStorageAllowed(arguments[0].toBoolean());
+    result->setNull();
+}
+
+void TestRunner::setPluginsAllowed(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_webPermissions->setPluginsAllowed(arguments[0].toBoolean());
+    result->setNull();
+}
+
+void TestRunner::setAllowDisplayOfInsecureContent(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_webPermissions->setDisplayingInsecureContentAllowed(arguments[0].toBoolean());
+
+    result->setNull();
+}
+
+void TestRunner::setAllowRunningOfInsecureContent(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_webPermissions->setRunningInsecureContentAllowed(arguments[0].value.boolValue);
+
+    result->setNull();
+}
+
+void TestRunner::dumpWindowStatusChanges(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpWindowStatusChanges = true;
+    result->setNull();
+}
+
+void TestRunner::dumpProgressFinishedCallback(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpProgressFinishedCallback = true;
+    result->setNull();
+}
+
+void TestRunner::dumpBackForwardList(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpBackForwardList = true;
+    result->setNull();
+}
+
+void TestRunner::setDeferMainResourceDataLoad(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() == 1)
+        m_deferMainResourceDataLoad = cppVariantToBool(arguments[0]);
+}
+
+void TestRunner::dumpSelectionRect(const CppArgumentList& arguments, CppVariant* result)
+{
+    m_dumpSelectionRect = true;
+    result->setNull();
+}
+
+void TestRunner::testRepaint(const CppArgumentList&, CppVariant* result)
+{
+    m_testRepaint = true;
+    result->setNull();
+}
+
+void TestRunner::repaintSweepHorizontally(const CppArgumentList&, CppVariant* result)
+{
+    m_sweepHorizontally = true;
+    result->setNull();
+}
+
+void TestRunner::setPrinting(const CppArgumentList& arguments, CppVariant* result)
+{
+    m_isPrinting = true;
+    result->setNull();
+}
+
+void TestRunner::setShouldStayOnPageAfterHandlingBeforeUnload(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() == 1 && arguments[0].isBool())
+        m_shouldStayOnPageAfterHandlingBeforeUnload = arguments[0].toBoolean();
+
+    result->setNull();
+}
+
+void TestRunner::setWillSendRequestClearHeader(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isString()) {
+        string header = arguments[0].toString();
+        if (!header.empty())
+            m_httpHeadersToClear.insert(header);
+    }
+    result->setNull();
+}
+
+void TestRunner::setWillSendRequestReturnsNullOnRedirect(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_shouldBlockRedirects = arguments[0].toBoolean();
+    result->setNull();
+}
+
+void TestRunner::setWillSendRequestReturnsNull(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_willSendRequestShouldReturnNull = arguments[0].toBoolean();
+    result->setNull();
+}
+
+void TestRunner::setTabKeyCyclesThroughElements(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_webView->setTabKeyCyclesThroughElements(arguments[0].toBoolean());
+    result->setNull();
+}
+
+void TestRunner::execCommand(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() <= 0 || !arguments[0].isString())
+        return;
+
+    std::string command = arguments[0].toString();
+    std::string value("");
+    // Ignore the second parameter (which is userInterface)
+    // since this command emulates a manual action.
+    if (arguments.size() >= 3 && arguments[2].isString())
+        value = arguments[2].toString();
+
+    // Note: webkit's version does not return the boolean, so neither do we.
+    m_webView->focusedFrame()->executeCommand(WebString::fromUTF8(command), WebString::fromUTF8(value));
+}
+
+void TestRunner::isCommandEnabled(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() <= 0 || !arguments[0].isString()) {
+        result->setNull();
+        return;
+    }
+
+    std::string command = arguments[0].toString();
+    bool rv = m_webView->focusedFrame()->isCommandEnabled(WebString::fromUTF8(command));
+    result->set(rv);
+}
+
+void TestRunner::callShouldCloseOnWebView(const CppArgumentList&, CppVariant* result)
+{
+    result->set(m_webView->dispatchBeforeUnloadEvent());
+}
+
+void TestRunner::setDomainRelaxationForbiddenForURLScheme(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() != 2 || !arguments[0].isBool() || !arguments[1].isString())
+        return;
+    m_webView->setDomainRelaxationForbidden(cppVariantToBool(arguments[0]), cppVariantToWebString(arguments[1]));
+}
+
+void TestRunner::evaluateScriptInIsolatedWorldAndReturnValue(const CppArgumentList& arguments, CppVariant* result)
+{
+    v8::HandleScope scope;
+    WebVector<v8::Local<v8::Value> > values;
+    if (arguments.size() >= 2 && arguments[0].isNumber() && arguments[1].isString()) {
+        WebScriptSource source(cppVariantToWebString(arguments[1]));
+        // This relies on the iframe focusing itself when it loads. This is a bit
+        // sketchy, but it seems to be what other tests do.
+        m_webView->focusedFrame()->executeScriptInIsolatedWorld(arguments[0].toInt32(), &source, 1, 1, &values);
+    }
+    result->setNull();
+    // Since only one script was added, only one result is expected
+    if (values.size() == 1 && !values[0].IsEmpty()) {
+        v8::Local<v8::Value> scriptValue = values[0];
+        // FIXME: There are many more types that can be handled.
+        if (scriptValue->IsString()) {
+            v8::String::AsciiValue asciiV8(scriptValue);
+            result->set(std::string(*asciiV8));
+        } else if (scriptValue->IsBoolean())
+            result->set(scriptValue->ToBoolean()->Value());
+        else if (scriptValue->IsNumber()) {
+            if (scriptValue->IsInt32())
+                result->set(scriptValue->ToInt32()->Value());
+            else
+                result->set(scriptValue->ToNumber()->Value());
+        } else if (scriptValue->IsNull())
+            result->setNull();
+    }
+}
+
+void TestRunner::evaluateScriptInIsolatedWorld(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() >= 2 && arguments[0].isNumber() && arguments[1].isString()) {
+        WebScriptSource source(cppVariantToWebString(arguments[1]));
+        // This relies on the iframe focusing itself when it loads. This is a bit
+        // sketchy, but it seems to be what other tests do.
+        m_webView->focusedFrame()->executeScriptInIsolatedWorld(arguments[0].toInt32(), &source, 1, 1);
+    }
+    result->setNull();
+}
+
+void TestRunner::setIsolatedWorldSecurityOrigin(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+
+    if (arguments.size() != 2 || !arguments[0].isNumber() || !(arguments[1].isString() || arguments[1].isNull()))
+        return;
+
+    WebSecurityOrigin origin;
+    if (arguments[1].isString())
+        origin = WebSecurityOrigin::createFromString(cppVariantToWebString(arguments[1]));
+    m_webView->focusedFrame()->setIsolatedWorldSecurityOrigin(arguments[0].toInt32(), origin);
+}
+
+void TestRunner::setIsolatedWorldContentSecurityPolicy(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+
+    if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isString())
+        return;
+
+    m_webView->focusedFrame()->setIsolatedWorldContentSecurityPolicy(arguments[0].toInt32(), cppVariantToWebString(arguments[1]));
+}
+
+void TestRunner::addOriginAccessWhitelistEntry(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+
+    if (arguments.size() != 4 || !arguments[0].isString() || !arguments[1].isString()
+        || !arguments[2].isString() || !arguments[3].isBool())
+        return;
+
+    WebKit::WebURL url(GURL(arguments[0].toString()));
+    if (!url.isValid())
+        return;
+
+    WebSecurityPolicy::addOriginAccessWhitelistEntry(
+        url,
+        cppVariantToWebString(arguments[1]),
+        cppVariantToWebString(arguments[2]),
+        arguments[3].toBoolean());
+}
+
+void TestRunner::removeOriginAccessWhitelistEntry(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+
+    if (arguments.size() != 4 || !arguments[0].isString() || !arguments[1].isString()
+        || !arguments[2].isString() || !arguments[3].isBool())
+        return;
+
+    WebKit::WebURL url(GURL(arguments[0].toString()));
+    if (!url.isValid())
+        return;
+
+    WebSecurityPolicy::removeOriginAccessWhitelistEntry(
+        url,
+        cppVariantToWebString(arguments[1]),
+        cppVariantToWebString(arguments[2]),
+        arguments[3].toBoolean());
+}
+
+void TestRunner::hasCustomPageSizeStyle(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->set(false);
+    int pageIndex = 0;
+    if (arguments.size() > 1)
+        return;
+    if (arguments.size() == 1)
+        pageIndex = cppVariantToInt32(arguments[0]);
+    WebFrame* frame = m_webView->mainFrame();
+    if (!frame)
+        return;
+    result->set(frame->hasCustomPageSizeStyle(pageIndex));
+}
+
+void TestRunner::forceRedSelectionColors(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    m_webView->setSelectionColors(0xffee0000, 0xff00ee00, 0xff000000, 0xffc0c0c0);
+}
+
+void TestRunner::addUserScript(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 3 || !arguments[0].isString() || !arguments[1].isBool() || !arguments[2].isBool())
+        return;
+    WebView::addUserScript(
+        cppVariantToWebString(arguments[0]), WebVector<WebString>(),
+        arguments[1].toBoolean() ? WebView::UserScriptInjectAtDocumentStart : WebView::UserScriptInjectAtDocumentEnd,
+        arguments[2].toBoolean() ? WebView::UserContentInjectInAllFrames : WebView::UserContentInjectInTopFrameOnly);
+}
+
+void TestRunner::addUserStyleSheet(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 2 || !arguments[0].isString() || !arguments[1].isBool())
+        return;
+    WebView::addUserStyleSheet(
+        cppVariantToWebString(arguments[0]), WebVector<WebString>(),
+        arguments[1].toBoolean() ? WebView::UserContentInjectInAllFrames : WebView::UserContentInjectInTopFrameOnly,
+        // Chromium defaults to InjectInSubsequentDocuments, but for compatibility
+        // with the other ports' DRTs, we use UserStyleInjectInExistingDocuments.
+        WebView::UserStyleInjectInExistingDocuments);
+}
+
+void TestRunner::startSpeechInput(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() != 1)
+        return;
+
+    WebElement element;
+    if (!WebBindings::getElement(arguments[0].value.objectValue, &element))
+        return;
+
+    WebInputElement* input = toWebInputElement(&element);
+    if (!input)
+        return;
+
+    if (!input->isSpeechInputEnabled())
+        return;
+
+    input->startSpeechInput();
+}
+
+void TestRunner::findString(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() < 1 || !arguments[0].isString())
+        return;
+
+    WebFindOptions findOptions;
+    bool wrapAround = false;
+    if (arguments.size() >= 2) {
+        vector<string> optionsArray = arguments[1].toStringVector();
+        findOptions.matchCase = true;
+
+        for (size_t i = 0; i < optionsArray.size(); ++i) {
+            const std::string& option = optionsArray[i];
+            // FIXME: Support all the options, so we can run findString.html too.
+            if (option == "CaseInsensitive")
+                findOptions.matchCase = false;
+            else if (option == "Backwards")
+                findOptions.forward = false;
+            else if (option == "WrapAround")
+                wrapAround = true;
+        }
+    }
+
+    WebFrame* frame = m_webView->mainFrame();
+    const bool findResult = frame->find(0, cppVariantToWebString(arguments[0]), findOptions, wrapAround, 0);
+    result->set(findResult);
+}
+
+void TestRunner::setValueForUser(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() != 2)
+        return;
+
+    WebElement element;
+    if (!WebBindings::getElement(arguments[0].value.objectValue, &element))
+        return;
+
+    WebInputElement* input = toWebInputElement(&element);
+    if (!input)
+        return;
+
+    input->setValue(cppVariantToWebString(arguments[1]), true);
+}
+
+void TestRunner::enableFixedLayoutMode(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() <  1 || !arguments[0].isBool())
+        return;
+    bool enableFixedLayout = arguments[0].toBoolean();
+    m_webView->enableFixedLayoutMode(enableFixedLayout);
+}
+
+void TestRunner::setFixedLayoutSize(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() <  2 || !arguments[0].isNumber() || !arguments[1].isNumber())
+        return;
+    int width = arguments[0].toInt32();
+    int height = arguments[1].toInt32();
+    m_webView->setFixedLayoutSize(WebSize(width, height));
+}
+
+void TestRunner::selectionAsMarkup(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->set(m_webView->mainFrame()->selectionAsMarkup().utf8());
+}
+
+void TestRunner::setTextSubpixelPositioning(const CppArgumentList& arguments, CppVariant* result)
+{
+#if defined(__linux__) || defined(ANDROID)
+    // Since FontConfig doesn't provide a variable to control subpixel positioning, we'll fall back
+    // to setting it globally for all fonts.
+    if (arguments.size() > 0 && arguments[0].isBool())
+        WebFontRendering::setSubpixelPositioning(arguments[0].value.boolValue);
+#endif
+    result->setNull();
+}
+
+void TestRunner::resetPageVisibility(const CppArgumentList& arguments, CppVariant* result)
+{
+    m_webView->setVisibilityState(WebPageVisibilityStateVisible, true);
+}
+
+void TestRunner::setPageVisibility(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isString()) {
+        string newVisibility = arguments[0].toString();
+        if (newVisibility == "visible")
+            m_webView->setVisibilityState(WebPageVisibilityStateVisible, false);
+        else if (newVisibility == "hidden")
+            m_webView->setVisibilityState(WebPageVisibilityStateHidden, false);
+        else if (newVisibility == "prerender")
+            m_webView->setVisibilityState(WebPageVisibilityStatePrerender, false);
+        else if (newVisibility == "preview")
+            m_webView->setVisibilityState(WebPageVisibilityStatePreview, false);
+    }
+}
+
+void TestRunner::setTextDirection(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() != 1 || !arguments[0].isString())
+        return;
+
+    // Map a direction name to a WebTextDirection value.
+    std::string directionName = arguments[0].toString();
+    WebKit::WebTextDirection direction;
+    if (directionName == "auto")
+        direction = WebKit::WebTextDirectionDefault;
+    else if (directionName == "rtl")
+        direction = WebKit::WebTextDirectionRightToLeft;
+    else if (directionName == "ltr")
+        direction = WebKit::WebTextDirectionLeftToRight;
+    else
+        return;
+
+    m_webView->setTextDirection(direction);
+}
+
+void TestRunner::textSurroundingNode(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 4 || !arguments[0].isObject() || !arguments[1].isNumber() || !arguments[2].isNumber() || !arguments[3].isNumber())
+        return;
+
+    WebNode node;
+    if (!WebBindings::getNode(arguments[0].value.objectValue, &node))
+        return;
+
+    if (node.isNull() || !node.isTextNode())
+        return;
+
+    WebPoint point(arguments[1].toInt32(), arguments[2].toInt32());
+    unsigned maxLength = arguments[3].toInt32();
+
+    WebSurroundingText surroundingText;
+    surroundingText.initialize(node, point, maxLength);
+    if (surroundingText.isNull())
+        return;
+
+    result->set(surroundingText.textContent().utf8());
+}
+
+void TestRunner::dumpResourceRequestPriorities(const CppArgumentList& arguments, CppVariant* result)
+{
+    m_shouldDumpResourcePriorities = true;
+    result->setNull();
+}
+
+void TestRunner::enableAutoResizeMode(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() != 4) {
+        result->set(false);
+        return;
+    }
+    int minWidth = cppVariantToInt32(arguments[0]);
+    int minHeight = cppVariantToInt32(arguments[1]);
+    WebKit::WebSize minSize(minWidth, minHeight);
+
+    int maxWidth = cppVariantToInt32(arguments[2]);
+    int maxHeight = cppVariantToInt32(arguments[3]);
+    WebKit::WebSize maxSize(maxWidth, maxHeight);
+
+    m_webView->enableAutoResizeMode(minSize, maxSize);
+    result->set(true);
+}
+
+void TestRunner::disableAutoResizeMode(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() !=2) {
+        result->set(false);
+        return;
+    }
+    int newWidth = cppVariantToInt32(arguments[0]);
+    int newHeight = cppVariantToInt32(arguments[1]);
+    WebKit::WebSize newSize(newWidth, newHeight);
+
+    m_delegate->setClientWindowRect(WebRect(0, 0, newSize.width, newSize.height));
+    m_webView->disableAutoResizeMode();
+    m_webView->resize(newSize);
+    result->set(true);
+}
+
+void TestRunner::setMockDeviceOrientation(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 6 || !arguments[0].isBool() || !arguments[1].isNumber() || !arguments[2].isBool() || !arguments[3].isNumber() || !arguments[4].isBool() || !arguments[5].isNumber())
+        return;
+
+    WebDeviceOrientation orientation;
+    orientation.setNull(false);
+    if (arguments[0].toBoolean())
+        orientation.setAlpha(arguments[1].toDouble());
+    if (arguments[2].toBoolean())
+        orientation.setBeta(arguments[3].toDouble());
+    if (arguments[4].toBoolean())
+        orientation.setGamma(arguments[5].toDouble());
+
+    // Note that we only call setOrientation on the main page's mock since this
+    // tests require. If necessary, we could get a list of WebViewHosts from th
+    // call setOrientation on each DeviceOrientationClientMock.
+    m_proxy->deviceOrientationClientMock()->setOrientation(orientation);
+}
+
+void TestRunner::setUserStyleSheetEnabled(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_delegate->preferences()->userStyleSheetLocation = arguments[0].value.boolValue ? m_userStyleSheetLocation : WebURL();
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::setUserStyleSheetLocation(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isString()) {
+        m_userStyleSheetLocation = m_delegate->localFileToDataURL(m_delegate->rewriteLayoutTestsURL(arguments[0].toString()));
+        m_delegate->preferences()->userStyleSheetLocation = m_userStyleSheetLocation;
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::setAuthorAndUserStylesEnabled(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_delegate->preferences()->authorAndUserStylesEnabled = arguments[0].value.boolValue;
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::setPopupBlockingEnabled(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        bool blockPopups = arguments[0].toBoolean();
+        m_delegate->preferences()->javaScriptCanOpenWindowsAutomatically = !blockPopups;
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::setJavaScriptCanAccessClipboard(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_delegate->preferences()->javaScriptCanAccessClipboard = arguments[0].value.boolValue;
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::setXSSAuditorEnabled(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_delegate->preferences()->XSSAuditorEnabled = arguments[0].value.boolValue;
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::setAllowUniversalAccessFromFileURLs(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_delegate->preferences()->allowUniversalAccessFromFileURLs = arguments[0].value.boolValue;
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::setAllowFileAccessFromFileURLs(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_delegate->preferences()->allowFileAccessFromFileURLs = arguments[0].value.boolValue;
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::overridePreference(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() != 2 || !arguments[0].isString())
+        return;
+
+    string key = arguments[0].toString();
+    CppVariant value = arguments[1];
+    WebPreferences* prefs = m_delegate->preferences();
+    if (key == "WebKitDefaultFontSize")
+        prefs->defaultFontSize = cppVariantToInt32(value);
+    else if (key == "WebKitMinimumFontSize")
+        prefs->minimumFontSize = cppVariantToInt32(value);
+    else if (key == "WebKitDefaultTextEncodingName")
+        prefs->defaultTextEncodingName = cppVariantToWebString(value);
+    else if (key == "WebKitJavaScriptEnabled")
+        prefs->javaScriptEnabled = cppVariantToBool(value);
+    else if (key == "WebKitSupportsMultipleWindows")
+        prefs->supportsMultipleWindows = cppVariantToBool(value);
+    else if (key == "WebKitDisplayImagesKey")
+        prefs->loadsImagesAutomatically = cppVariantToBool(value);
+    else if (key == "WebKitPluginsEnabled")
+        prefs->pluginsEnabled = cppVariantToBool(value);
+    else if (key == "WebKitJavaEnabled")
+        prefs->javaEnabled = cppVariantToBool(value);
+    else if (key == "WebKitUsesPageCachePreferenceKey")
+        prefs->usesPageCache = cppVariantToBool(value);
+    else if (key == "WebKitPageCacheSupportsPluginsPreferenceKey")
+        prefs->pageCacheSupportsPlugins = cppVariantToBool(value);
+    else if (key == "WebKitOfflineWebApplicationCacheEnabled")
+        prefs->offlineWebApplicationCacheEnabled = cppVariantToBool(value);
+    else if (key == "WebKitTabToLinksPreferenceKey")
+        prefs->tabsToLinks = cppVariantToBool(value);
+    else if (key == "WebKitWebGLEnabled")
+        prefs->experimentalWebGLEnabled = cppVariantToBool(value);
+    else if (key == "WebKitCSSRegionsEnabled")
+        prefs->experimentalCSSRegionsEnabled = cppVariantToBool(value);
+    else if (key == "WebKitCSSGridLayoutEnabled")
+        prefs->experimentalCSSGridLayoutEnabled = cppVariantToBool(value);
+    else if (key == "WebKitHyperlinkAuditingEnabled")
+        prefs->hyperlinkAuditingEnabled = cppVariantToBool(value);
+    else if (key == "WebKitEnableCaretBrowsing")
+        prefs->caretBrowsingEnabled = cppVariantToBool(value);
+    else if (key == "WebKitAllowDisplayingInsecureContent")
+        prefs->allowDisplayOfInsecureContent = cppVariantToBool(value);
+    else if (key == "WebKitAllowRunningInsecureContent")
+        prefs->allowRunningOfInsecureContent = cppVariantToBool(value);
+    else if (key == "WebKitCSSCustomFilterEnabled")
+        prefs->cssCustomFilterEnabled = cppVariantToBool(value);
+    else if (key == "WebKitShouldRespectImageOrientation")
+        prefs->shouldRespectImageOrientation = cppVariantToBool(value);
+    else if (key == "WebKitWebAudioEnabled")
+        WEBKIT_ASSERT(cppVariantToBool(value));
+    else {
+        string message("Invalid name for preference: ");
+        message.append(key);
+        printErrorMessage(message);
+    }
+    m_delegate->applyPreferences();
+}
+
+void TestRunner::setPluginsEnabled(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool()) {
+        m_delegate->preferences()->pluginsEnabled = arguments[0].toBoolean();
+        m_delegate->applyPreferences();
+    }
+    result->setNull();
+}
+
+void TestRunner::showWebInspector(const CppArgumentList&, CppVariant* result)
+{
+    showDevTools();
+    result->setNull();
+}
+
+void TestRunner::closeWebInspector(const CppArgumentList& args, CppVariant* result)
+{
+    m_delegate->closeDevTools();
+    result->setNull();
+}
+
+void TestRunner::evaluateInWebInspector(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 2 || !arguments[0].isNumber() || !arguments[1].isString())
+        return;
+    m_delegate->evaluateInWebInspector(arguments[0].toInt32(), arguments[1].toString());
+}
+
+void TestRunner::clearAllDatabases(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    m_delegate->clearAllDatabases();
+}
+
+void TestRunner::setDatabaseQuota(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if ((arguments.size() >= 1) && arguments[0].isNumber())
+        m_delegate->setDatabaseQuota(arguments[0].toInt32());
+}
+
+void TestRunner::setAlwaysAcceptCookies(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0)
+        m_delegate->setAcceptAllCookies(cppVariantToBool(arguments[0]));
+    result->setNull();
+}
+
+void TestRunner::setWindowIsKey(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_delegate->setFocus(m_proxy, arguments[0].value.boolValue);
+    result->setNull();
+}
+
+void TestRunner::pathToLocalResource(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() <= 0 || !arguments[0].isString())
+        return;
+
+    result->set(m_delegate->pathToLocalResource(arguments[0].toString()));
+}
+
+void TestRunner::setBackingScaleFactor(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() < 2 || !arguments[0].isNumber() || !arguments[1].isObject())
+        return;
+
+    float value = arguments[0].value.doubleValue;
+    m_delegate->setDeviceScaleFactor(value);
+    m_proxy->discardBackingStore();
+
+    auto_ptr<CppVariant> callbackArguments(new CppVariant());
+    callbackArguments->set(arguments[1]);
+    result->setNull();
+    m_delegate->postTask(new InvokeCallbackTask(this, callbackArguments));
+}
+
+void TestRunner::setPOSIXLocale(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() == 1 && arguments[0].isString())
+        m_delegate->setLocale(arguments[0].toString());
+}
+
+void TestRunner::numberOfPendingGeolocationPermissionRequests(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->set(m_proxy->geolocationClientMock()->numberOfPendingPermissionRequests());
+}
+
+// FIXME: For greater test flexibility, we should be able to set each page's geolocation mock individually.
+// https://bugs.webkit.org/show_bug.cgi?id=52368
+void TestRunner::setGeolocationPermission(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 1 || !arguments[0].isBool())
+        return;
+    const vector<WebTestProxyBase*>& windowList = m_testInterfaces->windowList();
+    for (unsigned i = 0; i < windowList.size(); ++i)
+        windowList.at(i)->geolocationClientMock()->setPermission(arguments[0].toBoolean());
+}
+
+void TestRunner::setMockGeolocationPosition(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 3 || !arguments[0].isNumber() || !arguments[1].isNumber() || !arguments[2].isNumber())
+        return;
+    const vector<WebTestProxyBase*>& windowList = m_testInterfaces->windowList();
+    for (unsigned i = 0; i < windowList.size(); ++i)
+        windowList.at(i)->geolocationClientMock()->setPosition(arguments[0].toDouble(), arguments[1].toDouble(), arguments[2].toDouble());
+}
+
+void TestRunner::setMockGeolocationPositionUnavailableError(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() != 1 || !arguments[0].isString())
+        return;
+    const vector<WebTestProxyBase*>& windowList = m_testInterfaces->windowList();
+    for (unsigned i = 0; i < windowList.size(); ++i)
+        windowList.at(i)->geolocationClientMock()->setPositionUnavailableError(WebString::fromUTF8(arguments[0].toString()));
+}
+
+#if ENABLE_NOTIFICATIONS
+void TestRunner::grantWebNotificationPermission(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() != 1 || !arguments[0].isString()) {
+        result->set(false);
+        return;
+    }
+    m_notificationPresenter->grantPermission(WebString::fromUTF8(arguments[0].toString()));
+    result->set(true);
+}
+
+void TestRunner::simulateLegacyWebNotificationClick(const CppArgumentList& arguments, CppVariant* result)
+{
+    if (arguments.size() != 1 || !arguments[0].isString()) {
+        result->set(false);
+        return;
+    }
+    result->set(m_notificationPresenter->simulateClick(WebString::fromUTF8(arguments[0].toString())));
+}
+#endif
+
+void TestRunner::addMockSpeechInputResult(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 3 || !arguments[0].isString() || !arguments[1].isNumber() || !arguments[2].isString())
+        return;
+
+#if ENABLE_INPUT_SPEECH
+    m_proxy->speechInputControllerMock()->addMockRecognitionResult(WebString::fromUTF8(arguments[0].toString()), arguments[1].toDouble(), WebString::fromUTF8(arguments[2].toString()));
+#endif
+}
+
+void TestRunner::setMockSpeechInputDumpRect(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 1 || !arguments[0].isBool())
+        return;
+
+#if ENABLE_INPUT_SPEECH
+    m_proxy->speechInputControllerMock()->setDumpRect(arguments[0].toBoolean());
+#endif
+}
+
+void TestRunner::addMockSpeechRecognitionResult(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() < 2 || !arguments[0].isString() || !arguments[1].isNumber())
+        return;
+
+    m_proxy->speechRecognizerMock()->addMockResult(WebString::fromUTF8(arguments[0].toString()), arguments[1].toDouble());
+}
+
+void TestRunner::setMockSpeechRecognitionError(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+    if (arguments.size() != 2 || !arguments[0].isString() || !arguments[1].isString())
+        return;
+
+    m_proxy->speechRecognizerMock()->setError(WebString::fromUTF8(arguments[0].toString()), WebString::fromUTF8(arguments[1].toString()));
+}
+
+void TestRunner::wasMockSpeechRecognitionAborted(const CppArgumentList&, CppVariant* result)
+{
+    result->set(m_proxy->speechRecognizerMock()->wasAborted());
+}
+
+void TestRunner::display(const CppArgumentList& arguments, CppVariant* result)
+{
+    m_proxy->display();
+    result->setNull();
+}
+
+void TestRunner::displayInvalidatedRegion(const CppArgumentList& arguments, CppVariant* result)
+{
+    m_proxy->displayInvalidatedRegion();
+    result->setNull();
+}
+
+void TestRunner::dumpEditingCallbacks(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpEditingCallbacks = true;
+    result->setNull();
+}
+
+void TestRunner::dumpAsText(const CppArgumentList& arguments, CppVariant* result)
+{
+    m_dumpAsText = true;
+    m_generatePixelResults = false;
+
+    // Optional paramater, describing whether it's allowed to dump pixel results in dumpAsText mode.
+    if (arguments.size() > 0 && arguments[0].isBool())
+        m_generatePixelResults = arguments[0].value.boolValue;
+
+    result->setNull();
+}
+
+void TestRunner::dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpChildFrameScrollPositions = true;
+    result->setNull();
+}
+
+void TestRunner::dumpChildFramesAsText(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpChildFramesAsText = true;
+    result->setNull();
+}
+
+void TestRunner::dumpIconChanges(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpIconChanges = true;
+    result->setNull();
+}
+
+void TestRunner::setAudioData(const CppArgumentList& arguments, CppVariant* result)
+{
+    result->setNull();
+
+    if (arguments.size() < 1 || !arguments[0].isObject())
+        return;
+
+    // Check that passed-in object is, in fact, an ArrayBufferView.
+    NPObject* npobject = NPVARIANT_TO_OBJECT(arguments[0]);
+    if (!npobject)
+        return;
+    if (!WebBindings::getArrayBufferView(npobject, &m_audioData))
+        return;
+
+    m_dumpAsAudio = true;
+}
+
+void TestRunner::dumpFrameLoadCallbacks(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpFrameLoadCallbacks = true;
+    result->setNull();
+}
+
+void TestRunner::dumpUserGestureInFrameLoadCallbacks(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpUserGestureInFrameLoadCallbacks = true;
+    result->setNull();
+}
+
+void TestRunner::setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant* result)
+{
+    result->setNull();
+    m_stopProvisionalFrameLoads = true;
+}
+
+void TestRunner::dumpTitleChanges(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpTitleChanges = true;
+    result->setNull();
+}
+
+void TestRunner::dumpCreateView(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpCreateView = true;
+    result->setNull();
+}
+
+void TestRunner::setCanOpenWindows(const CppArgumentList&, CppVariant* result)
+{
+    m_canOpenWindows = true;
+    result->setNull();
+}
+
+void TestRunner::dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpResourceLoadCallbacks = true;
+    result->setNull();
+}
+
+void TestRunner::dumpResourceRequestCallbacks(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpResourceRequestCallbacks = true;
+    result->setNull();
+}
+
+void TestRunner::dumpResourceResponseMIMETypes(const CppArgumentList&, CppVariant* result)
+{
+    m_dumpResourceResponseMIMETypes = true;
+    result->setNull();
+}
+
+// Need these conversions because the format of the value for booleans
+// may vary - for example, on mac "1" and "0" are used for boolean.
+bool TestRunner::cppVariantToBool(const CppVariant& value)
+{
+    if (value.isBool())
+        return value.toBoolean();
+    if (value.isNumber())
+        return value.toInt32();
+    if (value.isString()) {
+        string valueString = value.toString();
+        if (valueString == "true" || valueString == "1")
+            return true;
+        if (valueString == "false" || valueString == "0")
+            return false;
+    }
+    printErrorMessage("Invalid value. Expected boolean value.");
+    return false;
+}
+
+int32_t TestRunner::cppVariantToInt32(const CppVariant& value)
+{
+    if (value.isNumber())
+        return value.toInt32();
+    if (value.isString()) {
+        string stringSource = value.toString();
+        const char* source = stringSource.data();
+        char* end;
+        long number = strtol(source, &end, 10);
+        if (end == source + stringSource.length() && number >= numeric_limits<int32_t>::min() && number <= numeric_limits<int32_t>::max())
+            return static_cast<int32_t>(number);
+    }
+    printErrorMessage("Invalid value for preference. Expected integer value.");
+    return 0;
+}
+
+WebString TestRunner::cppVariantToWebString(const CppVariant& value)
+{
+    if (!value.isString()) {
+        printErrorMessage("Invalid value for preference. Expected string value.");
+        return WebString();
+    }
+    return WebString::fromUTF8(value.toString());
+}
+
+void TestRunner::printErrorMessage(const string& text)
+{
+    m_delegate->printMessage(string("CONSOLE MESSAGE: ") + text + "\n");
+}
+
+void TestRunner::fallbackMethod(const CppArgumentList&, CppVariant* result)
+{
+    printErrorMessage("JavaScript ERROR: unknown method called on TestRunner");
+    result->setNull();
+}
+
+void TestRunner::notImplemented(const CppArgumentList&, CppVariant* result)
+{
+    result->setNull();
+}
+
+void TestRunner::didAcquirePointerLock(const CppArgumentList&, CppVariant* result)
+{
+    didAcquirePointerLockInternal();
+    result->setNull();
+}
+
+void TestRunner::didNotAcquirePointerLock(const CppArgumentList&, CppVariant* result)
+{
+    didNotAcquirePointerLockInternal();
+    result->setNull();
+}
+
+void TestRunner::didLosePointerLock(const CppArgumentList&, CppVariant* result)
+{
+    didLosePointerLockInternal();
+    result->setNull();
+}
+
+void TestRunner::setPointerLockWillRespondAsynchronously(const CppArgumentList&, CppVariant* result)
+{
+    m_pointerLockPlannedResult = PointerLockWillRespondAsync;
+    result->setNull();
+}
+
+void TestRunner::setPointerLockWillFailSynchronously(const CppArgumentList&, CppVariant* result)
+{
+    m_pointerLockPlannedResult = PointerLockWillFailSync;
+    result->setNull();
+}
+
 }
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.h b/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.h
index 503271b..c1aa7d2 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TestRunner.h
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2010 Google Inc. All rights reserved.
  * Copyright (C) 2010 Pawel Hajdan (phajdan.jr@chromium.org)
+ * Copyright (C) 2012 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -33,10 +34,669 @@
 #define TestRunner_h
 
 #include "CppBoundClass.h"
+#include "TestCommon.h"
+#include "WebArrayBufferView.h"
+#include "WebTask.h"
+#include "WebTestRunner.h"
+#include "WebTextDirection.h"
+#include <deque>
+#include <memory>
+#include <public/WebURL.h>
+#include <set>
+#include <string>
 
-class TestRunner : public CppBoundClass {
+namespace WebKit {
+class WebArrayBufferView;
+class WebNotificationPresenter;
+class WebPermissionClient;
+class WebView;
+}
+
+namespace WebTestRunner {
+
+class NotificationPresenter;
+class TestInterfaces;
+class WebPermissions;
+class WebTestDelegate;
+class WebTestProxyBase;
+
+class TestRunner : public WebTestRunner, public CppBoundClass {
 public:
-    TestRunner();
+    explicit TestRunner(TestInterfaces*);
+    virtual ~TestRunner();
+
+    void setDelegate(WebTestDelegate*);
+    void setWebView(WebKit::WebView*, WebTestProxyBase*);
+
+    void reset();
+
+    WebTaskList* taskList() { return &m_taskList; }
+
+    void setTestIsRunning(bool);
+
+    // WebTestRunner implementation.
+    virtual bool shouldGeneratePixelResults() OVERRIDE;
+    virtual bool shouldDumpAsAudio() const OVERRIDE;
+    virtual const WebKit::WebArrayBufferView* audioData() const OVERRIDE;
+    virtual bool shouldDumpBackForwardList() const OVERRIDE;
+    virtual WebKit::WebPermissionClient* webPermissions() const OVERRIDE;
+
+    // Methods used by WebTestProxyBase.
+    bool shouldDumpSelectionRect() const;
+    bool testRepaint() const;
+    bool sweepHorizontally() const;
+    bool isPrinting() const;
+    bool shouldDumpAsText();
+    bool shouldDumpChildFrameScrollPositions() const;
+    bool shouldDumpChildFramesAsText() const;
+    void showDevTools();
+    void setShouldDumpAsText(bool);
+    void setShouldGeneratePixelResults(bool);
+    void setShouldDumpFrameLoadCallbacks(bool);
+    bool shouldDumpEditingCallbacks() const;
+    bool shouldDumpFrameLoadCallbacks() const;
+    bool shouldDumpUserGestureInFrameLoadCallbacks() const;
+    bool stopProvisionalFrameLoads() const;
+    bool shouldDumpTitleChanges() const;
+    bool shouldDumpIconChanges() const;
+    bool shouldDumpCreateView() const;
+    bool canOpenWindows() const;
+    bool shouldDumpResourceLoadCallbacks() const;
+    bool shouldDumpResourceRequestCallbacks() const;
+    bool shouldDumpResourceResponseMIMETypes() const;
+    bool shouldDumpStatusCallbacks() const;
+    bool shouldDumpProgressFinishedCallback() const;
+    bool deferMainResourceDataLoad() const;
+    bool shouldStayOnPageAfterHandlingBeforeUnload() const;
+    void setTitleTextDirection(WebKit::WebTextDirection);
+    const std::set<std::string>* httpHeadersToClear() const;
+    bool shouldBlockRedirects() const;
+    bool willSendRequestShouldReturnNull() const;
+    void setTopLoadingFrame(WebKit::WebFrame*, bool);
+    WebKit::WebFrame* topLoadingFrame() const;
+    void policyDelegateDone();
+    bool policyDelegateEnabled() const;
+    bool policyDelegateIsPermissive() const;
+    bool policyDelegateShouldNotifyDone() const;
+    bool shouldInterceptPostMessage() const;
+    bool shouldDumpResourcePriorities() const;
+#if ENABLE_NOTIFICATIONS
+    WebKit::WebNotificationPresenter* notificationPresenter() const;
+#endif
+    bool requestPointerLock();
+    void requestPointerUnlock();
+    bool isPointerLocked();
+
+    // A single item in the work queue.
+    class WorkItem {
+    public:
+        virtual ~WorkItem() { }
+
+        // Returns true if this started a load.
+        virtual bool run(WebTestDelegate*, WebKit::WebView*) = 0;
+    };
+
+private:
+    friend class WorkQueue;
+
+    // Helper class for managing events queued by methods like queueLoad or
+    // queueScript.
+    class WorkQueue {
+    public:
+        WorkQueue(TestRunner* controller) : m_frozen(false), m_controller(controller) { }
+        virtual ~WorkQueue();
+        void processWorkSoon();
+
+        // Reset the state of the class between tests.
+        void reset();
+
+        void addWork(WorkItem*);
+
+        void setFrozen(bool frozen) { m_frozen = frozen; }
+        bool isEmpty() { return m_queue.empty(); }
+        WebTaskList* taskList() { return &m_taskList; }
+
+    private:
+        void processWork();
+        class WorkQueueTask: public WebMethodTask<WorkQueue> {
+        public:
+            WorkQueueTask(WorkQueue* object): WebMethodTask<WorkQueue>(object) { }
+            virtual void runIfValid() { m_object->processWork(); }
+        };
+
+        WebTaskList m_taskList;
+        std::deque<WorkItem*> m_queue;
+        bool m_frozen;
+        TestRunner* m_controller;
+    };
+    ///////////////////////////////////////////////////////////////////////////
+    // Methods dealing with the test logic
+
+    // By default, tests end when page load is complete. These methods are used
+    // to delay the completion of the test until notifyDone is called.
+    void waitUntilDone(const CppArgumentList&, CppVariant*);
+    void notifyDone(const CppArgumentList&, CppVariant*);
+
+    // Methods for adding actions to the work queue. Used in conjunction with
+    // waitUntilDone/notifyDone above.
+    void queueBackNavigation(const CppArgumentList&, CppVariant*);
+    void queueForwardNavigation(const CppArgumentList&, CppVariant*);
+    void queueReload(const CppArgumentList&, CppVariant*);
+    void queueLoadingScript(const CppArgumentList&, CppVariant*);
+    void queueNonLoadingScript(const CppArgumentList&, CppVariant*);
+    void queueLoad(const CppArgumentList&, CppVariant*);
+    void queueLoadHTMLString(const CppArgumentList&, CppVariant*);
+
+
+    // Causes navigation actions just printout the intended navigation instead
+    // of taking you to the page. This is used for cases like mailto, where you
+    // don't actually want to open the mail program.
+    void setCustomPolicyDelegate(const CppArgumentList&, CppVariant*);
+
+    // Delays completion of the test until the policy delegate runs.
+    void waitForPolicyDelegate(const CppArgumentList&, CppVariant*);
+
+    // Functions for dealing with windows. By default we block all new windows.
+    void windowCount(const CppArgumentList&, CppVariant*);
+    void setCloseRemainingWindowsWhenComplete(const CppArgumentList&, CppVariant*);
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Methods implemented entirely in terms of chromium's public WebKit API
+
+    // Method that controls whether pressing Tab key cycles through page elements
+    // or inserts a '\t' char in text area
+    void setTabKeyCyclesThroughElements(const CppArgumentList&, CppVariant*);
+
+    // Executes an internal command (superset of document.execCommand() commands).
+    void execCommand(const CppArgumentList&, CppVariant*);
+
+    // Checks if an internal command is currently available.
+    void isCommandEnabled(const CppArgumentList&, CppVariant*);
+
+    void callShouldCloseOnWebView(const CppArgumentList&, CppVariant*);
+    void setDomainRelaxationForbiddenForURLScheme(const CppArgumentList&, CppVariant*);
+    void evaluateScriptInIsolatedWorldAndReturnValue(const CppArgumentList&, CppVariant*);
+    void evaluateScriptInIsolatedWorld(const CppArgumentList&, CppVariant*);
+    void setIsolatedWorldSecurityOrigin(const CppArgumentList&, CppVariant*);
+    void setIsolatedWorldContentSecurityPolicy(const CppArgumentList&, CppVariant*);
+
+    // Allows layout tests to manage origins' whitelisting.
+    void addOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
+    void removeOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
+
+    // Returns true if the current page box has custom page size style for
+    // printing.
+    void hasCustomPageSizeStyle(const CppArgumentList&, CppVariant*);
+
+    // Forces the selection colors for testing under Linux.
+    void forceRedSelectionColors(const CppArgumentList&, CppVariant*);
+
+    // Adds a user script or user style sheet to be injected into new documents.
+    void addUserScript(const CppArgumentList&, CppVariant*);
+    void addUserStyleSheet(const CppArgumentList&, CppVariant*);
+
+    void startSpeechInput(const CppArgumentList&, CppVariant*);
+
+    void findString(const CppArgumentList&, CppVariant*);
+
+    // Expects the first argument to be an input element and the second argument to be a string value.
+    // Forwards the setValueForUser() call to the element.
+    void setValueForUser(const CppArgumentList&, CppVariant*);
+
+    void enableFixedLayoutMode(const CppArgumentList&, CppVariant*);
+    void setFixedLayoutSize(const CppArgumentList&, CppVariant*);
+
+    void selectionAsMarkup(const CppArgumentList&, CppVariant*);
+
+    // Enables or disables subpixel positioning (i.e. fractional X positions for
+    // glyphs) in text rendering on Linux. Since this method changes global
+    // settings, tests that call it must use their own custom font family for
+    // all text that they render. If not, an already-cached style will be used,
+    // resulting in the changed setting being ignored.
+    void setTextSubpixelPositioning(const CppArgumentList&, CppVariant*);
+
+    // Switch the visibility of the page.
+    void setPageVisibility(const CppArgumentList&, CppVariant*);
+    void resetPageVisibility(const CppArgumentList&, CppVariant*);
+
+    // Changes the direction of the focused element.
+    void setTextDirection(const CppArgumentList&, CppVariant*);
+
+    // Retrieves the text surrounding a position in a text node.
+    // Expects the first argument to be a text node, the second and third to be
+    // point coordinates relative to the node and the fourth the maximum text
+    // length to retrieve.
+    void textSurroundingNode(const CppArgumentList&, CppVariant*);
+
+    void enableAutoResizeMode(const CppArgumentList&, CppVariant*);
+    void disableAutoResizeMode(const CppArgumentList&, CppVariant*);
+
+    // DeviceOrientation related functions
+    void setMockDeviceOrientation(const CppArgumentList&, CppVariant*);
+
+    void didAcquirePointerLock(const CppArgumentList&, CppVariant*);
+    void didNotAcquirePointerLock(const CppArgumentList&, CppVariant*);
+    void didLosePointerLock(const CppArgumentList&, CppVariant*);
+    void setPointerLockWillFailSynchronously(const CppArgumentList&, CppVariant*);
+    void setPointerLockWillRespondAsynchronously(const CppArgumentList&, CppVariant*);
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Methods modifying WebPreferences.
+
+    // Passes through to WebPreferences which allows the user to have a custom
+    // style sheet.
+    void setUserStyleSheetEnabled(const CppArgumentList&, CppVariant*);
+    void setUserStyleSheetLocation(const CppArgumentList&, CppVariant*);
+
+    // Passes this preference through to WebSettings.
+    void setAuthorAndUserStylesEnabled(const CppArgumentList&, CppVariant*);
+
+    // Set the WebPreference that controls webkit's popup blocking.
+    void setPopupBlockingEnabled(const CppArgumentList&, CppVariant*);
+
+    void setJavaScriptCanAccessClipboard(const CppArgumentList&, CppVariant*);
+    void setXSSAuditorEnabled(const CppArgumentList&, CppVariant*);
+    void setAllowUniversalAccessFromFileURLs(const CppArgumentList&, CppVariant*);
+    void setAllowFileAccessFromFileURLs(const CppArgumentList&, CppVariant*);
+    void overridePreference(const CppArgumentList&, CppVariant*);
+
+    // Enable or disable plugins.
+    void setPluginsEnabled(const CppArgumentList&, CppVariant*);
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Methods that modify the state of TestRunner
+
+    // This function sets a flag that tells the test_shell to print a line of
+    // descriptive text for each editing command. It takes no arguments, and
+    // ignores any that may be present.
+    void dumpEditingCallbacks(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to dump pages as
+    // plain text, rather than as a text representation of the renderer's state.
+    // It takes an optional argument, whether to dump pixels results or not.
+    void dumpAsText(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to print out the
+    // scroll offsets of the child frames. It ignores all.
+    void dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to recursively
+    // dump all frames as plain text if the dumpAsText flag is set.
+    // It takes no arguments, and ignores any that may be present.
+    void dumpChildFramesAsText(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to print out the
+    // information about icon changes notifications from WebKit.
+    void dumpIconChanges(const CppArgumentList&, CppVariant*);
+
+    // Deals with Web Audio WAV file data.
+    void setAudioData(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to print a line of
+    // descriptive text for each frame load callback. It takes no arguments, and
+    // ignores any that may be present.
+    void dumpFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to print a line of
+    // user gesture status text for some frame load callbacks. It takes no
+    // arguments, and ignores any that may be present.
+    void dumpUserGestureInFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
+
+    // If true, causes provisional frame loads to be stopped for the remainder of
+    // the test.
+    void setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant*);
+
+    void dumpTitleChanges(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to dump all calls to
+    // WebViewClient::createView().
+    // It takes no arguments, and ignores any that may be present.
+    void dumpCreateView(const CppArgumentList&, CppVariant*);
+
+    void setCanOpenWindows(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to dump a descriptive
+    // line for each resource load callback. It takes no arguments, and ignores
+    // any that may be present.
+    void dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to print a line of
+    // descriptive text for each element that requested a resource. It takes no
+    // arguments, and ignores any that may be present.
+    void dumpResourceRequestCallbacks(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to dump the MIME type
+    // for each resource that was loaded. It takes no arguments, and ignores any
+    // that may be present.
+    void dumpResourceResponseMIMETypes(const CppArgumentList&, CppVariant*);
+
+    // WebPermissionClient related.
+    void setImagesAllowed(const CppArgumentList&, CppVariant*);
+    void setScriptsAllowed(const CppArgumentList&, CppVariant*);
+    void setStorageAllowed(const CppArgumentList&, CppVariant*);
+    void setPluginsAllowed(const CppArgumentList&, CppVariant*);
+    void setAllowDisplayOfInsecureContent(const CppArgumentList&, CppVariant*);
+    void setAllowRunningOfInsecureContent(const CppArgumentList&, CppVariant*);
+    void dumpPermissionClientCallbacks(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to dump all calls
+    // to window.status().
+    // It takes no arguments, and ignores any that may be present.
+    void dumpWindowStatusChanges(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to print a line of
+    // descriptive text for the progress finished callback. It takes no
+    // arguments, and ignores any that may be present.
+    void dumpProgressFinishedCallback(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to print out a text
+    // representation of the back/forward list. It ignores all arguments.
+    void dumpBackForwardList(const CppArgumentList&, CppVariant*);
+
+    void setDeferMainResourceDataLoad(const CppArgumentList&, CppVariant*);
+    void dumpSelectionRect(const CppArgumentList&, CppVariant*);
+    void testRepaint(const CppArgumentList&, CppVariant*);
+    void repaintSweepHorizontally(const CppArgumentList&, CppVariant*);
+
+    // Causes layout to happen as if targetted to printed pages.
+    void setPrinting(const CppArgumentList&, CppVariant*);
+
+    void setShouldStayOnPageAfterHandlingBeforeUnload(const CppArgumentList&, CppVariant*);
+
+    // Causes WillSendRequest to clear certain headers.
+    void setWillSendRequestClearHeader(const CppArgumentList&, CppVariant*);
+
+    // Causes WillSendRequest to block redirects.
+    void setWillSendRequestReturnsNullOnRedirect(const CppArgumentList&, CppVariant*);
+
+    // Causes WillSendRequest to return an empty request.
+    void setWillSendRequestReturnsNull(const CppArgumentList&, CppVariant*);
+
+    // This function sets a flag that tells the test_shell to dump a descriptive
+    // line for each resource load's priority and any time that priority
+    // changes. It takes no arguments, and ignores any that may be present.
+    void dumpResourceRequestPriorities(const CppArgumentList&, CppVariant*);
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Methods interacting with the WebTestProxy
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Methods forwarding to the WebTestDelegate
+
+    // Shows DevTools window.
+    void showWebInspector(const CppArgumentList&, CppVariant*);
+    void closeWebInspector(const CppArgumentList&, CppVariant*);
+
+    // Allows layout tests to exec scripts at WebInspector side.
+    void evaluateInWebInspector(const CppArgumentList&, CppVariant*);
+
+    // Clears all databases.
+    void clearAllDatabases(const CppArgumentList&, CppVariant*);
+    // Sets the default quota for all origins
+    void setDatabaseQuota(const CppArgumentList&, CppVariant*);
+
+    // Changes the cookie policy from the default to allow all cookies.
+    void setAlwaysAcceptCookies(const CppArgumentList&, CppVariant*);
+
+    // Gives focus to the window.
+    void setWindowIsKey(const CppArgumentList&, CppVariant*);
+
+    // Converts a URL starting with file:///tmp/ to the local mapping.
+    void pathToLocalResource(const CppArgumentList&, CppVariant*);
+
+    // Used to set the device scale factor.
+    void setBackingScaleFactor(const CppArgumentList&, CppVariant*);
+
+    // Calls setlocale(LC_ALL, ...) for a specified locale.
+    // Resets between tests.
+    void setPOSIXLocale(const CppArgumentList&, CppVariant*);
+
+    // Gets the number of geolocation permissions requests pending.
+    void numberOfPendingGeolocationPermissionRequests(const CppArgumentList&, CppVariant*);
+
+    // Geolocation related functions.
+    void setGeolocationPermission(const CppArgumentList&, CppVariant*);
+    void setMockGeolocationPosition(const CppArgumentList&, CppVariant*);
+    void setMockGeolocationPositionUnavailableError(const CppArgumentList&, CppVariant*);
+
+#if ENABLE_NOTIFICATIONS
+    // Grants permission for desktop notifications to an origin
+    void grantWebNotificationPermission(const CppArgumentList&, CppVariant*);
+    // Simulates a click on a desktop notification.
+    void simulateLegacyWebNotificationClick(const CppArgumentList&, CppVariant*);
+#endif
+
+    // Speech input related functions.
+    void addMockSpeechInputResult(const CppArgumentList&, CppVariant*);
+    void setMockSpeechInputDumpRect(const CppArgumentList&, CppVariant*);
+    void addMockSpeechRecognitionResult(const CppArgumentList&, CppVariant*);
+    void setMockSpeechRecognitionError(const CppArgumentList&, CppVariant*);
+    void wasMockSpeechRecognitionAborted(const CppArgumentList&, CppVariant*);
+
+    void display(const CppArgumentList&, CppVariant*);
+    void displayInvalidatedRegion(const CppArgumentList&, CppVariant*);
+
+    //////////////////////////////////////////////////////////////////////////
+    // Fallback and stub methods
+
+    // The fallback method is called when a nonexistent method is called on
+    // the layout test controller object.
+    // It is usefull to catch typos in the JavaScript code (a few layout tests
+    // do have typos in them) and it allows the script to continue running in
+    // that case (as the Mac does).
+    void fallbackMethod(const CppArgumentList&, CppVariant*);
+
+    // Stub for not implemented methods.
+    void notImplemented(const CppArgumentList&, CppVariant*);
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Internal helpers
+    void checkResponseMimeType();
+    void completeNotifyDone(bool isTimeout);
+    class NotifyDoneTimedOutTask: public WebMethodTask<TestRunner> {
+    public:
+        NotifyDoneTimedOutTask(TestRunner* object): WebMethodTask<TestRunner>(object) { }
+        virtual void runIfValid() { m_object->completeNotifyDone(true); }
+    };
+
+    class HostMethodTask : public WebMethodTask<TestRunner> {
+    public:
+        typedef void (TestRunner::*CallbackMethodType)();
+        HostMethodTask(TestRunner* object, CallbackMethodType callback)
+            : WebMethodTask<TestRunner>(object)
+            , m_callback(callback)
+        { }
+
+        virtual void runIfValid() { (m_object->*m_callback)(); }
+
+    private:
+        CallbackMethodType m_callback;
+    };
+    void didAcquirePointerLockInternal();
+    void didNotAcquirePointerLockInternal();
+    void didLosePointerLockInternal();
+
+    bool cppVariantToBool(const CppVariant&);
+    int32_t cppVariantToInt32(const CppVariant&);
+    WebKit::WebString cppVariantToWebString(const CppVariant&);
+
+    void printErrorMessage(const std::string&);
+
+    // In the Mac code, this is called to trigger the end of a test after the
+    // page has finished loading. From here, we can generate the dump for the
+    // test.
+    void locationChangeDone();
+
+    bool m_testIsRunning;
+
+    // When reset is called, go through and close all but the main test shell
+    // window. By default, set to true but toggled to false using
+    // setCloseRemainingWindowsWhenComplete().
+    bool m_closeRemainingWindows;
+
+    // If true, don't dump output until notifyDone is called.
+    bool m_waitUntilDone;
+
+    // Causes navigation actions just printout the intended navigation instead
+    // of taking you to the page. This is used for cases like mailto, where you
+    // don't actually want to open the mail program.
+    bool m_policyDelegateEnabled;
+
+    // Toggles the behavior of the policy delegate. If true, then navigations
+    // will be allowed. Otherwise, they will be ignored (dropped).
+    bool m_policyDelegateIsPermissive;
+
+    // If true, the policy delegate will signal layout test completion.
+    bool m_policyDelegateShouldNotifyDone;
+
+    WorkQueue m_workQueue;
+
+    WebKit::WebURL m_userStyleSheetLocation;
+
+    // globalFlag is used by a number of layout tests in http/tests/security/dataURL.
+    CppVariant m_globalFlag;
+
+    // Bound variable to return the name of this platform (chromium).
+    CppVariant m_platformName;
+
+    // Bound variable tracking the directionality of the <title> tag.
+    CppVariant m_titleTextDirection;
+
+    // Bound variable counting the number of top URLs visited.
+    CppVariant m_webHistoryItemCount;
+
+    // Bound variable to set whether postMessages should be intercepted or not
+    CppVariant m_interceptPostMessage;
+
+    // If true, the test_shell will write a descriptive line for each editing
+    // command.
+    bool m_dumpEditingCallbacks;
+
+    // If true, the test_shell will generate pixel results in dumpAsText mode
+    bool m_generatePixelResults;
+
+    // If true, the test_shell will produce a plain text dump rather than a
+    // text representation of the renderer.
+    bool m_dumpAsText;
+
+    // If true and if dump_as_text_ is true, the test_shell will recursively
+    // dump all frames as plain text.
+    bool m_dumpChildFramesAsText;
+
+    // If true, the test_shell will print out the child frame scroll offsets as
+    // well.
+    bool m_dumpChildFrameScrollPositions;
+
+    // If true, the test_shell will print out the icon change notifications.
+    bool m_dumpIconChanges;
+
+    // If true, the test_shell will output a base64 encoded WAVE file.
+    bool m_dumpAsAudio;
+
+    // If true, the test_shell will output a descriptive line for each frame
+    // load callback.
+    bool m_dumpFrameLoadCallbacks;
+
+    // If true, the test_shell will output a line of the user gesture status
+    // text for some frame load callbacks.
+    bool m_dumpUserGestureInFrameLoadCallbacks;
+
+    // If true, stops provisional frame loads during the
+    // DidStartProvisionalLoadForFrame callback.
+    bool m_stopProvisionalFrameLoads;
+
+    // If true, output a message when the page title is changed.
+    bool m_dumpTitleChanges;
+
+    // If true, output a descriptive line each time WebViewClient::createView
+    // is invoked.
+    bool m_dumpCreateView;
+
+    // If true, new windows can be opened via javascript or by plugins. By
+    // default, set to false and can be toggled to true using
+    // setCanOpenWindows().
+    bool m_canOpenWindows;
+
+    // If true, the test_shell will output a descriptive line for each resource
+    // load callback.
+    bool m_dumpResourceLoadCallbacks;
+
+    // If true, the test_shell will output a descriptive line for each resource
+    // request callback.
+    bool m_dumpResourceRequestCallbacks;
+
+    // If true, the test_shell will output the MIME type for each resource that 
+    // was loaded.
+    bool m_dumpResourceResponseMIMETypes;
+
+    // If true, the test_shell will dump all changes to window.status.
+    bool m_dumpWindowStatusChanges;
+
+    // If true, the test_shell will output a descriptive line for the progress
+    // finished callback.
+    bool m_dumpProgressFinishedCallback;
+
+    // If true, the test_shell will produce a dump of the back forward list as
+    // well.
+    bool m_dumpBackForwardList;
+
+    // If false, all new requests will not defer the main resource data load.
+    bool m_deferMainResourceDataLoad;
+
+    // If true, the test_shell will draw the bounds of the current selection rect
+    // taking possible transforms of the selection rect into account.
+    bool m_dumpSelectionRect;
+
+    // If true, pixel dump will be produced as a series of 1px-tall, view-wide
+    // individual paints over the height of the view.
+    bool m_testRepaint;
+
+    // If true and test_repaint_ is true as well, pixel dump will be produced as
+    // a series of 1px-wide, view-tall paints across the width of the view.
+    bool m_sweepHorizontally;
+
+    // If true, layout is to target printed pages.
+    bool m_isPrinting;
+
+    bool m_shouldStayOnPageAfterHandlingBeforeUnload;
+
+    bool m_shouldBlockRedirects;
+
+    bool m_willSendRequestShouldReturnNull;
+
+    bool m_shouldDumpResourcePriorities;
+
+    std::set<std::string> m_httpHeadersToClear;
+
+    // WAV audio data is stored here.
+    WebKit::WebArrayBufferView m_audioData;
+
+    // Used for test timeouts.
+    WebTaskList m_taskList;
+
+    TestInterfaces* m_testInterfaces;
+    WebTestDelegate* m_delegate;
+    WebKit::WebView* m_webView;
+    WebTestProxyBase* m_proxy;
+
+    // This is non-0 IFF a load is in progress.
+    WebKit::WebFrame* m_topLoadingFrame;
+
+    // WebPermissionClient mock object.
+    std::auto_ptr<WebPermissions> m_webPermissions;
+
+#if ENABLE_NOTIFICATIONS
+    std::auto_ptr<NotificationPresenter> m_notificationPresenter;
+#endif
+
+    bool m_pointerLocked;
+    enum {
+        PointerLockWillSucceed,
+        PointerLockWillRespondAsync,
+        PointerLockWillFailSync,
+    } m_pointerLockPlannedResult;
 };
 
+}
+
 #endif // TestRunner_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp
index b72a208..f5f9b2a 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.cpp
@@ -31,18 +31,21 @@
 #include "config.h"
 #include "TextInputController.h"
 
+#include "TestCommon.h"
 #include "WebBindings.h"
 #include "WebCompositionUnderline.h"
 #include "WebFrame.h"
 #include "WebInputEvent.h"
 #include "WebRange.h"
 #include "WebView.h"
-#include "platform/WebString.h"
-#include "platform/WebVector.h"
+#include <public/WebString.h>
+#include <public/WebVector.h>
 #include <string>
-#include <wtf/StringExtras.h>
 
 using namespace WebKit;
+using namespace std;
+
+namespace WebTestRunner {
 
 TextInputController::TextInputController()
 {
@@ -144,7 +147,7 @@
         return;
 
     WebRange range = mainFrame->markedRange();
-    Vector<int> intArray(2);
+    vector<int> intArray(2);
     intArray[0] = range.startOffset();
     intArray[1] = range.endOffset();
     result->set(WebBindings::makeIntArray(intArray));
@@ -159,7 +162,7 @@
         return;
 
     WebRange range = mainFrame->selectionRange();
-    Vector<int> intArray(2);
+    vector<int> intArray(2);
     intArray[0] = range.startOffset();
     intArray[1] = range.endOffset();
     result->set(WebBindings::makeIntArray(intArray));
@@ -180,7 +183,7 @@
     if (!frame->firstRectForCharacterRange(arguments[0].toInt32(), arguments[1].toInt32(), rect))
         return;
 
-    Vector<int> intArray(4);
+    vector<int> intArray(4);
     intArray[0] = rect.x;
     intArray[1] = rect.y;
     intArray[2] = rect.width;
@@ -231,3 +234,5 @@
     WebString text(WebString::fromUTF8(arguments[0].toString()));
     m_webView->setComposition(text, underlines, 0, text.length());
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.h b/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.h
index a959aa8..286d833 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/TextInputController.h
@@ -41,6 +41,8 @@
 class WebView;
 }
 
+namespace WebTestRunner {
+
 class TextInputController : public CppBoundClass {
 public:
     TextInputController();
@@ -67,4 +69,6 @@
     WebKit::WebView* m_webView;
 };
 
+}
+
 #endif // TextInputController_h
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/WebEventSender.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebEventSender.cpp
deleted file mode 100644
index 93c0bba..0000000
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/WebEventSender.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "WebEventSender.h"
-
-#include "EventSender.h"
-
-using WebKit::WebDragData;
-using WebKit::WebDragOperationsMask;
-
-namespace WebTestRunner {
-
-WebEventSender::WebEventSender(EventSender* eventSender)
-    : m_private(eventSender)
-{
-}
-
-void WebEventSender::doDragDrop(const WebDragData& data, WebDragOperationsMask mask)
-{
-    m_private->doDragDrop(data, mask);
-}
-
-}
diff --git a/Tools/DumpRenderTree/chromium/WebPermissions.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebPermissions.cpp
similarity index 76%
rename from Tools/DumpRenderTree/chromium/WebPermissions.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebPermissions.cpp
index 2c7c9ee..161cbc7 100644
--- a/Tools/DumpRenderTree/chromium/WebPermissions.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebPermissions.cpp
@@ -31,13 +31,17 @@
 #include "config.h"
 #include "WebPermissions.h"
 
-#include "DRTTestRunner.h"
-#include "TestShell.h"
-#include "platform/WebCString.h"
-#include "platform/WebURL.h"
+#include "TestCommon.h"
+#include "WebTestDelegate.h"
+#include <public/WebCString.h>
+#include <public/WebURL.h>
 
-WebPermissions::WebPermissions(TestShell* shell)
-    : m_shell(shell)
+using namespace std;
+
+namespace WebTestRunner {
+
+WebPermissions::WebPermissions()
+    : m_delegate(0)
 {
     reset();
 }
@@ -49,16 +53,16 @@
 bool WebPermissions::allowImage(WebKit::WebFrame*, bool enabledPerSettings, const WebKit::WebURL& imageURL)
 {
     bool allowed = enabledPerSettings && m_imagesAllowed;
-    if (testRunner()->shouldDumpPermissionClientCallbacks())
-        fprintf(stdout, "PERMISSION CLIENT: allowImage(%s): %s\n", m_shell->normalizeLayoutTestURL(imageURL.spec()).c_str(), allowed ? "true" : "false");
+    if (m_dumpCallbacks && m_delegate)
+        m_delegate->printMessage(std::string("PERMISSION CLIENT: allowImage(") + normalizeLayoutTestURL(imageURL.spec()) + "): " + (allowed ? "true" : "false") + "\n");
     return allowed;
 }
 
 bool WebPermissions::allowScriptFromSource(WebKit::WebFrame*, bool enabledPerSettings, const WebKit::WebURL& scriptURL)
 {
     bool allowed = enabledPerSettings && m_scriptsAllowed;
-    if (testRunner()->shouldDumpPermissionClientCallbacks())
-        fprintf(stdout, "PERMISSION CLIENT: allowScriptFromSource(%s): %s\n", m_shell->normalizeLayoutTestURL(scriptURL.spec()).c_str(), allowed ? "true" : "false");
+    if (m_dumpCallbacks && m_delegate)
+        m_delegate->printMessage(std::string("PERMISSION CLIENT: allowScriptFromSource(") + normalizeLayoutTestURL(scriptURL.spec()) + "): " + (allowed ? "true" : "false") + "\n");
     return allowed;
 }
 
@@ -72,14 +76,12 @@
     return enabledPerSettings && m_pluginsAllowed;
 }
 
-bool WebPermissions::allowDisplayingInsecureContent(WebKit::WebFrame*, bool enabledPerSettings,
-                                                    const WebKit::WebSecurityOrigin&, const WebKit::WebURL&)
+bool WebPermissions::allowDisplayingInsecureContent(WebKit::WebFrame*, bool enabledPerSettings, const WebKit::WebSecurityOrigin&, const WebKit::WebURL&)
 {
     return enabledPerSettings || m_displayingInsecureContentAllowed;
 }
 
-bool WebPermissions::allowRunningInsecureContent(WebKit::WebFrame*, bool enabledPerSettings,
-                                                 const WebKit::WebSecurityOrigin&, const WebKit::WebURL&)
+bool WebPermissions::allowRunningInsecureContent(WebKit::WebFrame*, bool enabledPerSettings, const WebKit::WebSecurityOrigin&, const WebKit::WebURL&)
 {
     return enabledPerSettings || m_runningInsecureContentAllowed;
 }
@@ -114,8 +116,19 @@
     m_runningInsecureContentAllowed = allowed;
 }
 
+void WebPermissions::setDelegate(WebTestDelegate* delegate)
+{
+    m_delegate = delegate;
+}
+
+void WebPermissions::setDumpCallbacks(bool dumpCallbacks)
+{
+    m_dumpCallbacks = dumpCallbacks;
+}
+
 void WebPermissions::reset()
 {
+    m_dumpCallbacks = false;
     m_imagesAllowed = true;
     m_scriptsAllowed = true;
     m_storageAllowed = true;
@@ -124,9 +137,4 @@
     m_runningInsecureContentAllowed = false;
 }
 
-// Private functions ----------------------------------------------------------
-
-DRTTestRunner* WebPermissions::testRunner() const
-{
-    return m_shell->testRunner();
 }
diff --git a/Tools/DumpRenderTree/chromium/WebPermissions.h b/Tools/DumpRenderTree/chromium/TestRunner/src/WebPermissions.h
similarity index 85%
rename from Tools/DumpRenderTree/chromium/WebPermissions.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebPermissions.h
index c625077..8adef4c 100644
--- a/Tools/DumpRenderTree/chromium/WebPermissions.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebPermissions.h
@@ -33,12 +33,13 @@
 
 #include "WebPermissionClient.h"
 
-class DRTTestRunner;
-class TestShell;
+namespace WebTestRunner {
+
+class WebTestDelegate;
 
 class WebPermissions : public WebKit::WebPermissionClient {
 public:
-    WebPermissions(TestShell*);
+    WebPermissions();
     virtual ~WebPermissions();
 
     // Override WebPermissionClient methods.
@@ -46,10 +47,8 @@
     virtual bool allowScriptFromSource(WebKit::WebFrame*, bool enabledPerSettings, const WebKit::WebURL& scriptURL);
     virtual bool allowStorage(WebKit::WebFrame*, bool local);
     virtual bool allowPlugins(WebKit::WebFrame*, bool enabledPerSettings);
-    virtual bool allowDisplayingInsecureContent(WebKit::WebFrame*, bool enabledPerSettings,
-                                                const WebKit::WebSecurityOrigin&, const WebKit::WebURL&);
-    virtual bool allowRunningInsecureContent(WebKit::WebFrame*, bool enabledPerSettings,
-                                             const WebKit::WebSecurityOrigin&, const WebKit::WebURL&);
+    virtual bool allowDisplayingInsecureContent(WebKit::WebFrame*, bool enabledPerSettings, const WebKit::WebSecurityOrigin&, const WebKit::WebURL&);
+    virtual bool allowRunningInsecureContent(WebKit::WebFrame*, bool enabledPerSettings, const WebKit::WebSecurityOrigin&, const WebKit::WebURL&);
 
     // Hooks to set the different policies.
     void setImagesAllowed(bool);
@@ -62,11 +61,12 @@
     // Resets the policy to allow everything, except for running insecure content.
     void reset();
 
-private:
-    DRTTestRunner* testRunner() const;
+    void setDelegate(WebTestDelegate*);
+    void setDumpCallbacks(bool);
 
-    // Non-owning pointer. The WebPermissions instance is owned by this TestShell instance.
-    TestShell* m_shell;
+private:
+    WebTestDelegate* m_delegate;
+    bool m_dumpCallbacks;
 
     bool m_imagesAllowed;
     bool m_scriptsAllowed;
@@ -76,4 +76,6 @@
     bool m_runningInsecureContentAllowed;
 };
 
+}
+
 #endif
diff --git a/Tools/DumpRenderTree/chromium/WebPreferences.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp
similarity index 79%
rename from Tools/DumpRenderTree/chromium/WebPreferences.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp
index 46afbbd..5d882ae 100644
--- a/Tools/DumpRenderTree/chromium/WebPreferences.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebPreferences.cpp
@@ -31,13 +31,16 @@
 #include "config.h"
 #include "WebPreferences.h"
 
+#include "WebRuntimeFeatures.h"
 #include "WebView.h"
 
 using namespace WebKit;
 
+namespace WebTestRunner {
+
 void WebPreferences::reset()
 {
-#if OS(MAC_OS_X)
+#ifdef __APPLE__
     cursiveFontFamily = WebString::fromUTF8("Apple Chancery");
     fantasyFontFamily = WebString::fromUTF8("Papyrus");
     WebString serif = WebString::fromUTF8("Times");
@@ -92,7 +95,7 @@
     offlineWebApplicationCacheEnabled = true;
     pluginsEnabled = true;
     shrinksStandaloneImagesToFit = false;
-    textAreasAreResizable = false;
+    textAreasAreResizable = true;
     userStyleSheetLocation = WebURL();
     usesPageCache = false;
     pageCacheSupportsPlugins = false;
@@ -103,7 +106,7 @@
     // LayoutTests/http/tests/local, to access http server.
     allowUniversalAccessFromFileURLs = true;
 
-#if OS(DARWIN)
+#ifdef __APPLE__
     editingBehavior = WebSettings::EditingBehaviorMac;
 #else
     editingBehavior = WebSettings::EditingBehaviorWin;
@@ -113,57 +116,18 @@
     hyperlinkAuditingEnabled = false;
     acceleratedCompositingForVideoEnabled = false;
     acceleratedCompositingForFixedPositionEnabled = false;
+    acceleratedCompositingForOverflowScrollEnabled = false;
     acceleratedCompositingEnabled = false;
     accelerated2dCanvasEnabled = false;
-    deferred2dCanvasEnabled = false;
-    acceleratedPaintingEnabled = false;
     forceCompositingMode = false;
+    threadedHTMLParser = true;
+    perTilePaintingEnabled = false;
     deferredImageDecodingEnabled = false;
     mediaPlaybackRequiresUserGesture = false;
     mockScrollbarsEnabled = false;
     cssCustomFilterEnabled = false;
     shouldRespectImageOrientation = false;
-}
-
-static void setStandardFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
-{
-    settings->setStandardFontFamily(font, script);
-}
-
-static void setFixedFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
-{
-    settings->setFixedFontFamily(font, script);
-}
-
-static void setSerifFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
-{
-    settings->setSerifFontFamily(font, script);
-}
-
-static void setSansSerifFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
-{
-    settings->setSansSerifFontFamily(font, script);
-}
-
-static void setCursiveFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
-{
-    settings->setCursiveFontFamily(font, script);
-}
-
-static void setFantasyFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
-{
-    settings->setFantasyFontFamily(font, script);
-}
-
-typedef void (*SetFontFamilyWrapper)(WebSettings*, const WebString&, UScriptCode);
-
-static void applyFontMap(WebSettings* settings, const WebPreferences::ScriptFontFamilyMap& map, SetFontFamilyWrapper setter)
-{
-    for (WebPreferences::ScriptFontFamilyMap::const_iterator iter = map.begin(); iter != map.end(); ++iter) {
-        const WebString& font = iter->value;
-        if (!font.isNull() && !font.isEmpty())
-            (*setter)(settings, font, static_cast<UScriptCode>(iter->key));
-    }
+    asynchronousSpellCheckingEnabled = false;
 }
 
 void WebPreferences::applyTo(WebView* webView)
@@ -176,13 +140,6 @@
     settings->setCursiveFontFamily(cursiveFontFamily);
     settings->setFantasyFontFamily(fantasyFontFamily);
 
-    applyFontMap(settings, standardFontMap, setStandardFontFamilyWrapper);
-    applyFontMap(settings, fixedFontMap, setFixedFontFamilyWrapper);
-    applyFontMap(settings, serifFontMap, setSerifFontFamilyWrapper);
-    applyFontMap(settings, sansSerifFontMap, setSansSerifFontFamilyWrapper);
-    applyFontMap(settings, cursiveFontMap, setCursiveFontFamilyWrapper);
-    applyFontMap(settings, fantasyFontMap, setFantasyFontFamilyWrapper);
-
     settings->setDefaultFontSize(defaultFontSize);
     settings->setDefaultFixedFontSize(defaultFixedFontSize);
     settings->setMinimumFontSize(minimumFontSize);
@@ -198,7 +155,7 @@
     settings->setDefaultTextEncodingName(defaultTextEncodingName);
     settings->setDeveloperExtrasEnabled(developerExtrasEnabled);
     settings->setExperimentalWebGLEnabled(experimentalWebGLEnabled);
-    settings->setExperimentalCSSRegionsEnabled(experimentalCSSRegionsEnabled);
+    WebRuntimeFeatures::enableCSSRegions(experimentalCSSRegionsEnabled);
     settings->setExperimentalCSSGridLayoutEnabled(experimentalCSSGridLayoutEnabled);
     settings->setExperimentalCSSCustomFilterEnabled(cssCustomFilterEnabled);
     settings->setJavaEnabled(javaEnabled);
@@ -226,18 +183,20 @@
     settings->setAcceleratedCompositingEnabled(acceleratedCompositingEnabled);
     settings->setAcceleratedCompositingForVideoEnabled(acceleratedCompositingForVideoEnabled);
     settings->setAcceleratedCompositingForFixedPositionEnabled(acceleratedCompositingForFixedPositionEnabled);
+    settings->setAcceleratedCompositingForOverflowScrollEnabled(acceleratedCompositingForOverflowScrollEnabled);
     settings->setFixedPositionCreatesStackingContext(acceleratedCompositingForFixedPositionEnabled);
     settings->setForceCompositingMode(forceCompositingMode);
+    settings->setThreadedHTMLParser(threadedHTMLParser);
     settings->setAccelerated2dCanvasEnabled(accelerated2dCanvasEnabled);
-    settings->setDeferred2dCanvasEnabled(deferred2dCanvasEnabled);
-    settings->setAcceleratedPaintingEnabled(acceleratedPaintingEnabled);
+    settings->setPerTilePaintingEnabled(perTilePaintingEnabled);
     settings->setDeferredImageDecodingEnabled(deferredImageDecodingEnabled);
     settings->setMediaPlaybackRequiresUserGesture(mediaPlaybackRequiresUserGesture);
     settings->setMockScrollbarsEnabled(mockScrollbarsEnabled);
-    settings->setApplyDefaultDeviceScaleFactorInCompositor(forceCompositingMode);
     settings->setShouldRespectImageOrientation(shouldRespectImageOrientation);
+    settings->setAsynchronousSpellCheckingEnabled(asynchronousSpellCheckingEnabled);
 
     // Fixed values.
+    settings->setTouchDragDropEnabled(false);
     settings->setTextDirectionSubmenuInclusionBehaviorNeverIncluded();
     settings->setDownloadableBinaryFontsEnabled(true);
     settings->setAllowScriptsToCloseWindows(false);
@@ -254,4 +213,13 @@
     settings->setValidationMessageTimerMagnification(-1);
     settings->setVisualWordMovementEnabled(false);
     settings->setPasswordEchoEnabled(false);
+    settings->setApplyDeviceScaleFactorInCompositor(true);
+    settings->setSmartInsertDeleteEnabled(true);
+#ifdef WIN32
+    settings->setSelectTrailingWhitespaceEnabled(true);
+#else
+    settings->setSelectTrailingWhitespaceEnabled(false);
+#endif
+}
+
 }
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/WebTask.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTask.cpp
index 97531c8..779f53e 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/WebTask.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTask.cpp
@@ -32,7 +32,9 @@
 #include "WebTask.h"
 
 #include "WebKit.h"
-#include <wtf/Vector.h>
+#include <algorithm>
+
+using namespace std;
 
 namespace WebTestRunner {
 
@@ -48,36 +50,31 @@
         m_taskList->unregisterTask(this);
 }
 
-class WebTaskList::Private : public Vector<WebTask*> {
-};
-
 WebTaskList::WebTaskList()
-    : m_private(new Private)
 {
 }
 
 WebTaskList::~WebTaskList()
 {
     revokeAll();
-    delete m_private;
 }
 
 void WebTaskList::registerTask(WebTask* task)
 {
-    m_private->append(task);
+    m_tasks.push_back(task);
 }
 
 void WebTaskList::unregisterTask(WebTask* task)
 {
-    size_t index = m_private->find(task);
-    if (index != notFound)
-        m_private->remove(index);
+    vector<WebTask*>::iterator iter = find(m_tasks.begin(), m_tasks.end(), task);
+    if (iter != m_tasks.end())
+        m_tasks.erase(iter);
 }
 
 void WebTaskList::revokeAll()
 {
-    while (!m_private->isEmpty())
-        (*m_private)[0]->cancel();
+    while (!m_tasks.empty())
+        m_tasks[0]->cancel();
 }
 
 }
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp
index 9a86953..c2dbd16 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestInterfaces.cpp
@@ -31,172 +31,79 @@
 #include "config.h"
 #include "WebTestInterfaces.h"
 
-#include "TestDelegate.h"
+#include "MockWebMediaStreamCenter.h"
+#include "MockWebRTCPeerConnectionHandler.h"
 #include "TestInterfaces.h"
-#include "WebAccessibilityController.h"
-#include "WebEventSender.h"
-#include "WebTestDelegate.h"
+#include "TestRunner.h"
 
-using WebKit::WebContextMenuData;
-using WebKit::WebFrame;
-using WebKit::WebGamepads;
-using WebKit::WebString;
-using WebKit::WebVector;
-using WebKit::WebView;
+using namespace WebKit;
 
 namespace WebTestRunner {
 
-class WebTestInterfaces::Internal : public TestDelegate {
-public:
-    Internal();
-    virtual ~Internal();
-
-    TestInterfaces* testInterfaces() { return &m_interfaces; }
-    void setDelegate(WebTestDelegate*);
-    WebAccessibilityController* accessibilityController() { return &m_accessibilityController; }
-    WebEventSender* eventSender() { return &m_eventSender; }
-
-    // TestDelegate implementation.
-    virtual void clearContextMenuData();
-    virtual void clearEditCommand();
-    virtual void fillSpellingSuggestionList(const WebString& word, WebVector<WebString>* suggestions);
-    virtual void setEditCommand(const std::string& name, const std::string& value);
-    virtual WebContextMenuData* lastContextMenuData() const;
-    virtual void setGamepadData(const WebGamepads&);
-    virtual void printMessage(const std::string& message);
-    virtual void postTask(WebTask*);
-    virtual void postDelayedTask(WebTask*, long long ms);
-    virtual WebString registerIsolatedFileSystem(const WebVector<WebString>& absoluteFilenames);
-    virtual long long getCurrentTimeInMillisecond();
-    virtual WebKit::WebString getAbsoluteWebStringFromUTF8Path(const std::string& path);
-
-private:
-    TestInterfaces m_interfaces;
-    WebAccessibilityController m_accessibilityController;
-    WebEventSender m_eventSender;
-    WebTestDelegate* m_delegate;
-};
-
-WebTestInterfaces::Internal::Internal()
-    : m_accessibilityController(m_interfaces.accessibilityController())
-    , m_eventSender(m_interfaces.eventSender())
-    , m_delegate(0)
-{
-}
-
-WebTestInterfaces::Internal::~Internal()
-{
-}
-
-void WebTestInterfaces::Internal::setDelegate(WebTestDelegate* delegate)
-{
-    if (delegate) {
-        m_delegate = delegate;
-        m_interfaces.setDelegate(this);
-    } else {
-        m_delegate = 0;
-        m_interfaces.setDelegate(0);
-    }
-}
-
-void WebTestInterfaces::Internal::clearContextMenuData()
-{
-    m_delegate->clearContextMenuData();
-}
-
-void WebTestInterfaces::Internal::clearEditCommand()
-{
-    m_delegate->clearEditCommand();
-}
-
-void WebTestInterfaces::Internal::fillSpellingSuggestionList(const WebString& word, WebVector<WebString>* suggestions)
-{
-    m_delegate->fillSpellingSuggestionList(word, suggestions);
-}
-
-void WebTestInterfaces::Internal::setEditCommand(const std::string& name, const std::string& value)
-{
-    m_delegate->setEditCommand(name, value);
-}
-
-WebContextMenuData* WebTestInterfaces::Internal::lastContextMenuData() const
-{
-    return m_delegate->lastContextMenuData();
-}
-
-void WebTestInterfaces::Internal::setGamepadData(const WebGamepads& pads)
-{
-    m_delegate->setGamepadData(pads);
-}
-
-void WebTestInterfaces::Internal::printMessage(const std::string& message)
-{
-    m_delegate->printMessage(message);
-}
-
-void WebTestInterfaces::Internal::postTask(WebTask* task)
-{
-    m_delegate->postTask(task);
-}
-
-void WebTestInterfaces::Internal::postDelayedTask(WebTask* task, long long ms)
-{
-    m_delegate->postDelayedTask(task, ms);
-}
-
-WebString WebTestInterfaces::Internal::registerIsolatedFileSystem(const WebVector<WebString>& absoluteFilenames)
-{
-    return m_delegate->registerIsolatedFileSystem(absoluteFilenames);
-}
-
-long long WebTestInterfaces::Internal::getCurrentTimeInMillisecond()
-{
-    return m_delegate->getCurrentTimeInMillisecond();
-}
-
-WebKit::WebString WebTestInterfaces::Internal::getAbsoluteWebStringFromUTF8Path(const std::string& path)
-{
-    return m_delegate->getAbsoluteWebStringFromUTF8Path(path);
-}
-
 WebTestInterfaces::WebTestInterfaces()
+    : m_interfaces(new TestInterfaces())
 {
-    m_internal = new Internal;
 }
 
 WebTestInterfaces::~WebTestInterfaces()
 {
-    delete m_internal;
 }
 
-void WebTestInterfaces::setWebView(WebView* webView)
+void WebTestInterfaces::setWebView(WebView* webView, WebTestProxyBase* proxy)
 {
-    m_internal->testInterfaces()->setWebView(webView);
+    m_interfaces->setWebView(webView, proxy);
 }
 
 void WebTestInterfaces::setDelegate(WebTestDelegate* delegate)
 {
-    m_internal->setDelegate(delegate);
+    m_interfaces->setDelegate(delegate);
 }
 
 void WebTestInterfaces::bindTo(WebFrame* frame)
 {
-    m_internal->testInterfaces()->bindTo(frame);
+    m_interfaces->bindTo(frame);
 }
 
 void WebTestInterfaces::resetAll()
 {
-    m_internal->testInterfaces()->resetAll();
+    m_interfaces->resetAll();
 }
 
-WebAccessibilityController* WebTestInterfaces::accessibilityController()
+void WebTestInterfaces::setTestIsRunning(bool running)
 {
-    return m_internal->accessibilityController();
+    m_interfaces->setTestIsRunning(running);
 }
 
-WebEventSender* WebTestInterfaces::eventSender()
+void WebTestInterfaces::configureForTestWithURL(const WebURL& testURL, bool generatePixels)
 {
-    return m_internal->eventSender();
+    m_interfaces->configureForTestWithURL(testURL, generatePixels);
 }
 
+WebTestRunner* WebTestInterfaces::testRunner()
+{
+    return m_interfaces->testRunner();
+}
+
+WebThemeEngine* WebTestInterfaces::themeEngine()
+{
+    return m_interfaces->themeEngine();
+}
+
+TestInterfaces* WebTestInterfaces::testInterfaces()
+{
+    return m_interfaces.get();
+}
+
+#if ENABLE_WEBRTC
+WebMediaStreamCenter* WebTestInterfaces::createMediaStreamCenter(WebMediaStreamCenterClient* client)
+{
+    return new MockWebMediaStreamCenter(client);
+}
+
+WebRTCPeerConnectionHandler* WebTestInterfaces::createWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client)
+{
+    return new MockWebRTCPeerConnectionHandler(client, m_interfaces.get());
+}
+#endif // ENABLE_WEBRTC
+
 }
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp
index 60661c4..ac3ebb7 100644
--- a/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestProxy.cpp
@@ -31,40 +31,726 @@
 #include "config.h"
 #include "WebTestProxy.h"
 
-#include "WebAccessibilityController.h"
+#include "AccessibilityControllerChromium.h"
+#include "EventSender.h"
+#include "MockWebSpeechInputController.h"
+#include "MockWebSpeechRecognizer.h"
+#include "SpellCheckClient.h"
+#include "TestCommon.h"
+#include "TestInterfaces.h"
+#include "TestPlugin.h"
+#include "TestRunner.h"
 #include "WebAccessibilityNotification.h"
 #include "WebAccessibilityObject.h"
+#include "WebCachedURLRequest.h"
+#include "WebConsoleMessage.h"
+#include "WebDataSource.h"
+#include "WebDeviceOrientationClientMock.h"
+#include "WebDocument.h"
 #include "WebElement.h"
+#include "WebFrame.h"
+#include "WebGeolocationClientMock.h"
+#include "WebHistoryItem.h"
 #include "WebNode.h"
+#include "WebPluginParams.h"
+#include "WebPrintParams.h"
+#include "WebRange.h"
+#include "WebScriptController.h"
 #include "WebTestDelegate.h"
 #include "WebTestInterfaces.h"
-#include "platform/WebCString.h"
+#include "WebTestRunner.h"
+#include "WebUserGestureIndicator.h"
+#include "WebUserMediaClientMock.h"
+#include "WebView.h"
+// FIXME: Including platform_canvas.h here is a layering violation.
+#include "skia/ext/platform_canvas.h"
+#include <cctype>
+#include <public/WebCString.h>
+#include <public/WebURLError.h>
+#include <public/WebURLRequest.h>
+#include <public/WebURLResponse.h>
 
 using namespace WebKit;
+using namespace std;
 
 namespace WebTestRunner {
 
+namespace {
+
+void printNodeDescription(WebTestDelegate* delegate, const WebNode& node, int exception)
+{
+    if (exception) {
+        delegate->printMessage("ERROR");
+        return;
+    }
+    if (node.isNull()) {
+        delegate->printMessage("(null)");
+        return;
+    }
+    delegate->printMessage(node.nodeName().utf8().data());
+    const WebNode& parent = node.parentNode();
+    if (!parent.isNull()) {
+        delegate->printMessage(" > ");
+        printNodeDescription(delegate, parent, 0);
+    }
+}
+
+void printRangeDescription(WebTestDelegate* delegate, const WebRange& range)
+{
+    if (range.isNull()) {
+        delegate->printMessage("(null)");
+        return;
+    }
+    char buffer[100];
+    snprintf(buffer, sizeof(buffer), "range from %d of ", range.startOffset());
+    delegate->printMessage(buffer);
+    int exception = 0;
+    WebNode startNode = range.startContainer(exception);
+    printNodeDescription(delegate, startNode, exception);
+    snprintf(buffer, sizeof(buffer), " to %d of ", range.endOffset());
+    delegate->printMessage(buffer);
+    WebNode endNode = range.endContainer(exception);
+    printNodeDescription(delegate, endNode, exception);
+}
+
+string editingActionDescription(WebEditingAction action)
+{
+    switch (action) {
+    case WebKit::WebEditingActionTyped:
+        return "WebViewInsertActionTyped";
+    case WebKit::WebEditingActionPasted:
+        return "WebViewInsertActionPasted";
+    case WebKit::WebEditingActionDropped:
+        return "WebViewInsertActionDropped";
+    }
+    return "(UNKNOWN ACTION)";
+}
+
+string textAffinityDescription(WebTextAffinity affinity)
+{
+    switch (affinity) {
+    case WebKit::WebTextAffinityUpstream:
+        return "NSSelectionAffinityUpstream";
+    case WebKit::WebTextAffinityDownstream:
+        return "NSSelectionAffinityDownstream";
+    }
+    return "(UNKNOWN AFFINITY)";
+}
+
+void printFrameDescription(WebTestDelegate* delegate, WebFrame* frame)
+{
+    string name8 = frame->uniqueName().utf8();
+    if (frame == frame->view()->mainFrame()) {
+        if (!name8.length()) {
+            delegate->printMessage("main frame");
+            return;
+        }
+        delegate->printMessage(string("main frame \"") + name8 + "\"");
+        return;
+    }
+    if (!name8.length()) {
+        delegate->printMessage("frame (anonymous)");
+        return;
+    }
+    delegate->printMessage(string("frame \"") + name8 + "\"");
+}
+
+void printFrameUserGestureStatus(WebTestDelegate* delegate, WebFrame* frame, const char* msg)
+{
+    bool isUserGesture = WebUserGestureIndicator::isProcessingUserGesture();
+    delegate->printMessage(string("Frame with user gesture \"") + (isUserGesture ? "true" : "false") + "\"" + msg);
+}
+
+// Used to write a platform neutral file:/// URL by taking the
+// filename and its directory. (e.g., converts
+// "file:///tmp/foo/bar.txt" to just "bar.txt").
+string descriptionSuitableForTestResult(const string& url)
+{
+    if (url.empty() || string::npos == url.find("file://"))
+        return url;
+
+    size_t pos = url.rfind('/');
+    if (pos == string::npos || !pos)
+        return "ERROR:" + url;
+    pos = url.rfind('/', pos - 1);
+    if (pos == string::npos)
+        return "ERROR:" + url;
+
+    return url.substr(pos + 1);
+}
+
+void printResponseDescription(WebTestDelegate* delegate, const WebURLResponse& response)
+{
+    if (response.isNull()) {
+        delegate->printMessage("(null)");
+        return;
+    }
+    string url = response.url().spec();
+    char data[100];
+    snprintf(data, sizeof(data), "%d", response. httpStatusCode());
+    delegate->printMessage(string("<NSURLResponse ") + descriptionSuitableForTestResult(url) + ", http status code " + data + ">");
+}
+
+string URLDescription(const GURL& url)
+{
+    if (url.SchemeIs("file"))
+        return url.ExtractFileName();
+    return url.possibly_invalid_spec();
+}
+
+string PriorityDescription(const WebURLRequest::Priority& priority)
+{
+    switch (priority) {
+    case WebURLRequest::PriorityVeryLow:
+        return "VeryLow";
+    case WebURLRequest::PriorityLow:
+        return "Low";
+    case WebURLRequest::PriorityMedium:
+        return "Medium";
+    case WebURLRequest::PriorityHigh:
+        return "High";
+    case WebURLRequest::PriorityVeryHigh:
+        return "VeryHigh";
+    case WebURLRequest::PriorityUnresolved:
+    default:
+        return "Unresolved";
+    }
+}
+
+void blockRequest(WebURLRequest& request)
+{
+    request.setURL(WebURL());
+}
+
+bool isLocalhost(const string& host)
+{
+    return host == "127.0.0.1" || host == "localhost";
+}
+
+bool hostIsUsedBySomeTestsToGenerateError(const string& host)
+{
+    return host == "255.255.255.255";
+}
+
+// Used to write a platform neutral file:/// URL by only taking the filename
+// (e.g., converts "file:///tmp/foo.txt" to just "foo.txt").
+string urlSuitableForTestResult(const string& url)
+{
+    if (url.empty() || string::npos == url.find("file://"))
+        return url;
+
+    size_t pos = url.rfind('/');
+    if (pos == string::npos) {
+#ifdef WIN32
+        pos = url.rfind('\\');
+        if (pos == string::npos)
+            pos = 0;
+#else
+        pos = 0;
+#endif
+    }
+    string filename = url.substr(pos + 1);
+    if (filename.empty())
+        return "file:"; // A WebKit test has this in its expected output.
+    return filename;
+}
+
+// WebNavigationType debugging strings taken from PolicyDelegate.mm.
+const char* linkClickedString = "link clicked";
+const char* formSubmittedString = "form submitted";
+const char* backForwardString = "back/forward";
+const char* reloadString = "reload";
+const char* formResubmittedString = "form resubmitted";
+const char* otherString = "other";
+const char* illegalString = "illegal value";
+
+// Get a debugging string from a WebNavigationType.
+const char* webNavigationTypeToString(WebNavigationType type)
+{
+    switch (type) {
+    case WebKit::WebNavigationTypeLinkClicked:
+        return linkClickedString;
+    case WebKit::WebNavigationTypeFormSubmitted:
+        return formSubmittedString;
+    case WebKit::WebNavigationTypeBackForward:
+        return backForwardString;
+    case WebKit::WebNavigationTypeReload:
+        return reloadString;
+    case WebKit::WebNavigationTypeFormResubmitted:
+        return formResubmittedString;
+    case WebKit::WebNavigationTypeOther:
+        return otherString;
+    }
+    return illegalString;
+}
+
+string dumpDocumentText(WebFrame* frame)
+{
+    // We use the document element's text instead of the body text here because
+    // not all documents have a body, such as XML documents.
+    WebElement documentElement = frame->document().documentElement();
+    if (documentElement.isNull())
+        return string();
+    return documentElement.innerText().utf8();
+}
+
+string dumpFramesAsText(WebFrame* frame, bool recursive)
+{
+    string result;
+
+    // Add header for all but the main frame. Skip empty frames.
+    if (frame->parent() && !frame->document().documentElement().isNull()) {
+        result.append("\n--------\nFrame: '");
+        result.append(frame->uniqueName().utf8().data());
+        result.append("'\n--------\n");
+    }
+
+    result.append(dumpDocumentText(frame));
+    result.append("\n");
+
+    if (recursive) {
+        for (WebFrame* child = frame->firstChild(); child; child = child->nextSibling())
+            result.append(dumpFramesAsText(child, recursive));
+    }
+
+    return result;
+}
+
+string dumpFramesAsPrintedText(WebFrame* frame, bool recursive)
+{
+    string result;
+
+    // Cannot do printed format for anything other than HTML
+    if (!frame->document().isHTMLDocument())
+        return string();
+
+    // Add header for all but the main frame. Skip empty frames.
+    if (frame->parent() && !frame->document().documentElement().isNull()) {
+        result.append("\n--------\nFrame: '");
+        result.append(frame->uniqueName().utf8().data());
+        result.append("'\n--------\n");
+    }
+
+    result.append(frame->renderTreeAsText(WebFrame::RenderAsTextPrinting).utf8());
+    result.append("\n");
+
+    if (recursive) {
+        for (WebFrame* child = frame->firstChild(); child; child = child->nextSibling())
+            result.append(dumpFramesAsPrintedText(child, recursive));
+    }
+
+    return result;
+}
+
+string dumpFrameScrollPosition(WebFrame* frame, bool recursive)
+{
+    string result;
+    WebSize offset = frame->scrollOffset();
+    if (offset.width > 0 || offset.height > 0) {
+        if (frame->parent())
+            result = string("frame '") + frame->uniqueName().utf8().data() + "' ";
+        char data[100];
+        snprintf(data, sizeof(data), "scrolled to %d,%d\n", offset.width, offset.height);
+        result += data;
+    }
+
+    if (!recursive)
+        return result;
+    for (WebFrame* child = frame->firstChild(); child; child = child->nextSibling())
+        result += dumpFrameScrollPosition(child, recursive);
+    return result;
+}
+
+struct ToLower {
+    char16 operator()(char16 c) { return tolower(c); }
+};
+
+// Returns True if item1 < item2.
+bool HistoryItemCompareLess(const WebHistoryItem& item1, const WebHistoryItem& item2)
+{
+    string16 target1 = item1.target();
+    string16 target2 = item2.target();
+    std::transform(target1.begin(), target1.end(), target1.begin(), ToLower());
+    std::transform(target2.begin(), target2.end(), target2.begin(), ToLower());
+    return target1 < target2;
+}
+
+string dumpHistoryItem(const WebHistoryItem& item, int indent, bool isCurrent)
+{
+    string result;
+
+    if (isCurrent) {
+        result.append("curr->");
+        result.append(indent - 6, ' '); // 6 == "curr->".length()
+    } else
+        result.append(indent, ' ');
+
+    string url = normalizeLayoutTestURL(item.urlString().utf8());
+    result.append(url);
+    if (!item.target().isEmpty()) {
+        result.append(" (in frame \"");
+        result.append(item.target().utf8());
+        result.append("\")");
+    }
+    if (item.isTargetItem())
+        result.append("  **nav target**");
+    result.append("\n");
+
+    const WebVector<WebHistoryItem>& children = item.children();
+    if (!children.isEmpty()) {
+        // Must sort to eliminate arbitrary result ordering which defeats
+        // reproducible testing.
+        // FIXME: WebVector should probably just be a std::vector!!
+        std::vector<WebHistoryItem> sortedChildren;
+        for (size_t i = 0; i < children.size(); ++i)
+            sortedChildren.push_back(children[i]);
+        std::sort(sortedChildren.begin(), sortedChildren.end(), HistoryItemCompareLess);
+        for (size_t i = 0; i < sortedChildren.size(); ++i)
+            result += dumpHistoryItem(sortedChildren[i], indent + 4, false);
+    }
+
+    return result;
+}
+
+void dumpBackForwardList(const WebVector<WebHistoryItem>& history, size_t currentEntryIndex, string& result)
+{
+    result.append("\n============== Back Forward List ==============\n");
+    for (size_t index = 0; index < history.size(); ++index)
+        result.append(dumpHistoryItem(history[index], 8, index == currentEntryIndex));
+    result.append("===============================================\n");
+}
+
+string dumpAllBackForwardLists(TestInterfaces* interfaces, WebTestDelegate* delegate)
+{
+    string result;
+    const vector<WebTestProxyBase*>& windowList = interfaces->windowList();
+    for (unsigned i = 0; i < windowList.size(); ++i) {
+        size_t currentEntryIndex = 0;
+        WebVector<WebHistoryItem> history;
+        delegate->captureHistoryForWindow(windowList.at(i), &history, &currentEntryIndex);
+        dumpBackForwardList(history, currentEntryIndex, result);
+    }
+    return result;
+}
+
+}
+
 WebTestProxyBase::WebTestProxyBase()
     : m_testInterfaces(0)
     , m_delegate(0)
+    , m_spellcheck(new SpellCheckClient)
 {
+    reset();
 }
 
 WebTestProxyBase::~WebTestProxyBase()
 {
+    m_testInterfaces->windowClosed(this);
 }
 
 void WebTestProxyBase::setInterfaces(WebTestInterfaces* interfaces)
 {
-    m_testInterfaces = interfaces;
+    m_testInterfaces = interfaces->testInterfaces();
+    m_testInterfaces->windowOpened(this);
 }
 
 void WebTestProxyBase::setDelegate(WebTestDelegate* delegate)
 {
     m_delegate = delegate;
+    m_spellcheck->setDelegate(delegate);
+#if ENABLE_INPUT_SPEECH
+    if (m_speechInputController.get())
+        m_speechInputController->setDelegate(delegate);
+#endif
+    if (m_speechRecognizer.get())
+        m_speechRecognizer->setDelegate(delegate);
 }
 
-void WebTestProxyBase::doPostAccessibilityNotification(const WebKit::WebAccessibilityObject& obj, WebKit::WebAccessibilityNotification notification)
+void WebTestProxyBase::reset()
+{
+    m_paintRect = WebRect();
+    m_canvas.reset();
+    m_isPainting = false;
+    m_resourceIdentifierMap.clear();
+    m_logConsoleOutput = true;
+    if (m_geolocationClient.get())
+        m_geolocationClient->resetMock();
+#if ENABLE_INPUT_SPEECH
+    if (m_speechInputController.get())
+        m_speechInputController->clearResults();
+#endif
+}
+
+WebSpellCheckClient* WebTestProxyBase::spellCheckClient() const
+{
+    return m_spellcheck.get();
+}
+
+string WebTestProxyBase::captureTree(bool debugRenderTree)
+{
+    WebScriptController::flushConsoleMessages();
+
+    bool shouldDumpAsText = m_testInterfaces->testRunner()->shouldDumpAsText();
+    bool shouldDumpAsPrinted = m_testInterfaces->testRunner()->isPrinting();
+    WebFrame* frame = m_testInterfaces->webView()->mainFrame();
+    string dataUtf8;
+    if (shouldDumpAsText) {
+        bool recursive = m_testInterfaces->testRunner()->shouldDumpChildFramesAsText();
+        dataUtf8 = shouldDumpAsPrinted ? dumpFramesAsPrintedText(frame, recursive) : dumpFramesAsText(frame, recursive);
+    } else {
+        bool recursive = m_testInterfaces->testRunner()->shouldDumpChildFrameScrollPositions();
+        WebFrame::RenderAsTextControls renderTextBehavior = WebFrame::RenderAsTextNormal;
+        if (shouldDumpAsPrinted)
+            renderTextBehavior |= WebFrame::RenderAsTextPrinting;
+        if (debugRenderTree)
+            renderTextBehavior |= WebFrame::RenderAsTextDebug;
+        dataUtf8 = frame->renderTreeAsText(renderTextBehavior).utf8();
+        dataUtf8 += dumpFrameScrollPosition(frame, recursive);
+    }
+
+    if (m_testInterfaces->testRunner()->shouldDumpBackForwardList())
+        dataUtf8 += dumpAllBackForwardLists(m_testInterfaces, m_delegate);
+
+    return dataUtf8;
+}
+
+SkCanvas* WebTestProxyBase::capturePixels()
+{
+    m_testInterfaces->webView()->layout();
+    if (m_testInterfaces->testRunner()->testRepaint()) {
+        WebSize viewSize = m_testInterfaces->webView()->size();
+        int width = viewSize.width;
+        int height = viewSize.height;
+        if (m_testInterfaces->testRunner()->sweepHorizontally()) {
+            for (WebRect column(0, 0, 1, height); column.x < width; column.x++)
+                paintRect(column);
+        } else {
+            for (WebRect line(0, 0, width, 1); line.y < height; line.y++)
+                paintRect(line);
+        }
+    } else if (m_testInterfaces->testRunner()->isPrinting())
+        paintPagesWithBoundaries();
+    else
+        paintInvalidatedRegion();
+
+    // See if we need to draw the selection bounds rect. Selection bounds
+    // rect is the rect enclosing the (possibly transformed) selection.
+    // The rect should be drawn after everything is laid out and painted.
+    if (m_testInterfaces->testRunner()->shouldDumpSelectionRect()) {
+        // If there is a selection rect - draw a red 1px border enclosing rect
+        WebRect wr = m_testInterfaces->webView()->mainFrame()->selectionBoundsRect();
+        if (!wr.isEmpty()) {
+            // Render a red rectangle bounding selection rect
+            SkPaint paint;
+            paint.setColor(0xFFFF0000); // Fully opaque red
+            paint.setStyle(SkPaint::kStroke_Style);
+            paint.setFlags(SkPaint::kAntiAlias_Flag);
+            paint.setStrokeWidth(1.0f);
+            SkIRect rect; // Bounding rect
+            rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height);
+            canvas()->drawIRect(rect, paint);
+        }
+    }
+
+    return canvas();
+}
+
+void WebTestProxyBase::setLogConsoleOutput(bool enabled)
+{
+    m_logConsoleOutput = enabled;
+}
+
+void WebTestProxyBase::paintRect(const WebRect& rect)
+{
+    WEBKIT_ASSERT(!m_isPainting);
+    WEBKIT_ASSERT(canvas());
+    m_isPainting = true;
+    float deviceScaleFactor = m_testInterfaces->webView()->deviceScaleFactor();
+    int scaledX = static_cast<int>(static_cast<float>(rect.x) * deviceScaleFactor);
+    int scaledY = static_cast<int>(static_cast<float>(rect.y) * deviceScaleFactor);
+    int scaledWidth = static_cast<int>(ceil(static_cast<float>(rect.width) * deviceScaleFactor));
+    int scaledHeight = static_cast<int>(ceil(static_cast<float>(rect.height) * deviceScaleFactor));
+    WebRect deviceRect(scaledX, scaledY, scaledWidth, scaledHeight);
+    m_testInterfaces->webView()->paint(canvas(), deviceRect);
+    m_isPainting = false;
+}
+
+void WebTestProxyBase::paintInvalidatedRegion()
+{
+    m_testInterfaces->webView()->animate(0.0);
+    m_testInterfaces->webView()->layout();
+    WebSize widgetSize = m_testInterfaces->webView()->size();
+    WebRect clientRect(0, 0, widgetSize.width, widgetSize.height);
+
+    // Paint the canvas if necessary. Allow painting to generate extra rects
+    // for the first two calls. This is necessary because some WebCore rendering
+    // objects update their layout only when painted.
+    // Store the total area painted in total_paint. Then tell the gdk window
+    // to update that area after we're done painting it.
+    for (int i = 0; i < 3; ++i) {
+        // rect = intersect(m_paintRect , clientRect)
+        WebRect damageRect = m_paintRect;
+        int left = max(damageRect.x, clientRect.x);
+        int top = max(damageRect.y, clientRect.y);
+        int right = min(damageRect.x + damageRect.width, clientRect.x + clientRect.width);
+        int bottom = min(damageRect.y + damageRect.height, clientRect.y + clientRect.height);
+        WebRect rect;
+        if (left < right && top < bottom)
+            rect = WebRect(left, top, right - left, bottom - top);
+
+        m_paintRect = WebRect();
+        if (rect.isEmpty())
+            continue;
+        paintRect(rect);
+    }
+    WEBKIT_ASSERT(m_paintRect.isEmpty());
+}
+
+void WebTestProxyBase::paintPagesWithBoundaries()
+{
+    WEBKIT_ASSERT(!m_isPainting);
+    WEBKIT_ASSERT(canvas());
+    m_isPainting = true;
+
+    WebSize pageSizeInPixels = m_testInterfaces->webView()->size();
+    WebFrame* webFrame = m_testInterfaces->webView()->mainFrame();
+
+    int pageCount = webFrame->printBegin(pageSizeInPixels);
+    int totalHeight = pageCount * (pageSizeInPixels.height + 1) - 1;
+
+    SkCanvas* testCanvas = skia::TryCreateBitmapCanvas(pageSizeInPixels.width, totalHeight, true);
+    if (testCanvas) {
+        discardBackingStore();
+        m_canvas.reset(testCanvas);
+    } else {
+        webFrame->printEnd();
+        return;
+    }
+
+    webFrame->printPagesWithBoundaries(canvas(), pageSizeInPixels);
+    webFrame->printEnd();
+
+    m_isPainting = false;
+}
+
+SkCanvas* WebTestProxyBase::canvas()
+{
+    if (m_canvas.get())
+        return m_canvas.get();
+    WebSize widgetSize = m_testInterfaces->webView()->size();
+    float deviceScaleFactor = m_testInterfaces->webView()->deviceScaleFactor();
+    int scaledWidth = static_cast<int>(ceil(static_cast<float>(widgetSize.width) * deviceScaleFactor));
+    int scaledHeight = static_cast<int>(ceil(static_cast<float>(widgetSize.height) * deviceScaleFactor));
+    m_canvas.reset(skia::CreateBitmapCanvas(scaledWidth, scaledHeight, true));
+    return m_canvas.get();
+}
+
+// Paints the entire canvas a semi-transparent black (grayish). This is used
+// by the layout tests in fast/repaint. The alpha value matches upstream.
+void WebTestProxyBase::displayRepaintMask()
+{
+    canvas()->drawARGB(167, 0, 0, 0);
+}
+
+void WebTestProxyBase::display()
+{
+    const WebKit::WebSize& size = m_testInterfaces->webView()->size();
+    WebRect rect(0, 0, size.width, size.height);
+    m_paintRect = rect;
+    paintInvalidatedRegion();
+    displayRepaintMask();
+}
+
+void WebTestProxyBase::displayInvalidatedRegion()
+{
+    paintInvalidatedRegion();
+    displayRepaintMask();
+}
+
+void WebTestProxyBase::discardBackingStore()
+{
+    m_canvas.reset();
+}
+
+WebGeolocationClientMock* WebTestProxyBase::geolocationClientMock()
+{
+    if (!m_geolocationClient.get())
+        m_geolocationClient.reset(WebGeolocationClientMock::create());
+    return m_geolocationClient.get();
+}
+
+WebDeviceOrientationClientMock* WebTestProxyBase::deviceOrientationClientMock()
+{
+    if (!m_deviceOrientationClient.get())
+        m_deviceOrientationClient.reset(WebDeviceOrientationClientMock::create());
+    return m_deviceOrientationClient.get();
+}
+
+#if ENABLE_INPUT_SPEECH
+MockWebSpeechInputController* WebTestProxyBase::speechInputControllerMock()
+{
+    WEBKIT_ASSERT(m_speechInputController.get());
+    return m_speechInputController.get();
+}
+#endif
+
+MockWebSpeechRecognizer* WebTestProxyBase::speechRecognizerMock()
+{
+    if (!m_speechRecognizer.get()) {
+        m_speechRecognizer.reset(new MockWebSpeechRecognizer());
+        m_speechRecognizer->setDelegate(m_delegate);
+    }
+    return m_speechRecognizer.get();
+}
+
+void WebTestProxyBase::didInvalidateRect(const WebRect& rect)
+{
+    // m_paintRect = m_paintRect U rect
+    if (rect.isEmpty())
+        return;
+    if (m_paintRect.isEmpty()) {
+        m_paintRect = rect;
+        return;
+    }
+    int left = min(m_paintRect.x, rect.x);
+    int top = min(m_paintRect.y, rect.y);
+    int right = max(m_paintRect.x + m_paintRect.width, rect.x + rect.width);
+    int bottom = max(m_paintRect.y + m_paintRect.height, rect.y + rect.height);
+    m_paintRect = WebRect(left, top, right - left, bottom - top);
+}
+
+void WebTestProxyBase::didScrollRect(int, int, const WebRect& clipRect)
+{
+    didInvalidateRect(clipRect);
+}
+
+void WebTestProxyBase::scheduleComposite()
+{
+    m_paintRect = WebRect(0, 0, INT_MAX, INT_MAX);
+}
+
+void WebTestProxyBase::scheduleAnimation()
+{
+    scheduleComposite();
+}
+
+void WebTestProxyBase::show(WebNavigationPolicy)
+{
+    scheduleComposite();
+}
+
+void WebTestProxyBase::setWindowRect(const WebRect& rect)
+{
+    scheduleComposite();
+    discardBackingStore();
+}
+
+void WebTestProxyBase::didAutoResize(const WebSize&)
+{
+    scheduleComposite();
+}
+
+void WebTestProxyBase::postAccessibilityNotification(const WebKit::WebAccessibilityObject& obj, WebKit::WebAccessibilityNotification notification)
 {
     if (notification == WebKit::WebAccessibilityNotificationFocusedUIElementChanged)
         m_testInterfaces->accessibilityController()->setFocusedElement(obj);
@@ -139,7 +825,7 @@
     m_testInterfaces->accessibilityController()->notificationReceived(obj, notificationName);
 
     if (m_testInterfaces->accessibilityController()->shouldLogAccessibilityEvents()) {
-        std::string message("AccessibilityNotification - ");
+        string message("AccessibilityNotification - ");
         message += notificationName;
 
         WebKit::WebNode node = obj.node();
@@ -155,4 +841,654 @@
     }
 }
 
+void WebTestProxyBase::startDragging(WebFrame*, const WebDragData& data, WebDragOperationsMask mask, const WebImage&, const WebPoint&)
+{
+    // When running a test, we need to fake a drag drop operation otherwise
+    // Windows waits for real mouse events to know when the drag is over.
+    m_testInterfaces->eventSender()->doDragDrop(data, mask);
+}
+
+// The output from these methods in layout test mode should match that
+// expected by the layout tests. See EditingDelegate.m in DumpRenderTree.
+
+bool WebTestProxyBase::shouldBeginEditing(const WebRange& range)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks()) {
+        m_delegate->printMessage("EDITING DELEGATE: shouldBeginEditingInDOMRange:");
+        printRangeDescription(m_delegate, range);
+        m_delegate->printMessage("\n");
+    }
+    return true;
+}
+
+bool WebTestProxyBase::shouldEndEditing(const WebRange& range)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks()) {
+        m_delegate->printMessage("EDITING DELEGATE: shouldEndEditingInDOMRange:");
+        printRangeDescription(m_delegate, range);
+        m_delegate->printMessage("\n");
+    }
+    return true;
+}
+
+bool WebTestProxyBase::shouldInsertNode(const WebNode& node, const WebRange& range, WebEditingAction action)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks()) {
+        m_delegate->printMessage("EDITING DELEGATE: shouldInsertNode:");
+        printNodeDescription(m_delegate, node, 0);
+        m_delegate->printMessage(" replacingDOMRange:");
+        printRangeDescription(m_delegate, range);
+        m_delegate->printMessage(string(" givenAction:") + editingActionDescription(action) + "\n");
+    }
+    return true;
+}
+
+bool WebTestProxyBase::shouldInsertText(const WebString& text, const WebRange& range, WebEditingAction action)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks()) {
+        m_delegate->printMessage(string("EDITING DELEGATE: shouldInsertText:") + text.utf8().data() + " replacingDOMRange:");
+        printRangeDescription(m_delegate, range);
+        m_delegate->printMessage(string(" givenAction:") + editingActionDescription(action) + "\n");
+    }
+    return true;
+}
+
+bool WebTestProxyBase::shouldChangeSelectedRange(
+    const WebRange& fromRange, const WebRange& toRange, WebTextAffinity affinity, bool stillSelecting)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks()) {
+        m_delegate->printMessage("EDITING DELEGATE: shouldChangeSelectedDOMRange:");
+        printRangeDescription(m_delegate, fromRange);
+        m_delegate->printMessage(" toDOMRange:");
+        printRangeDescription(m_delegate, toRange);
+        m_delegate->printMessage(string(" affinity:") + textAffinityDescription(affinity) + " stillSelecting:" + (stillSelecting ? "TRUE" : "FALSE") + "\n");
+    }
+    return true;
+}
+
+bool WebTestProxyBase::shouldDeleteRange(const WebRange& range)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks()) {
+        m_delegate->printMessage("EDITING DELEGATE: shouldDeleteDOMRange:");
+        printRangeDescription(m_delegate, range);
+        m_delegate->printMessage("\n");
+    }
+    return true;
+}
+
+bool WebTestProxyBase::shouldApplyStyle(const WebString& style, const WebRange& range)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks()) {
+        m_delegate->printMessage(string("EDITING DELEGATE: shouldApplyStyle:") + style.utf8().data() + " toElementsInDOMRange:");
+        printRangeDescription(m_delegate, range);
+        m_delegate->printMessage("\n");
+    }
+    return true;
+}
+
+void WebTestProxyBase::didBeginEditing()
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks())
+        m_delegate->printMessage("EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification\n");
+}
+
+void WebTestProxyBase::didChangeSelection(bool isEmptySelection)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks())
+        m_delegate->printMessage("EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification\n");
+}
+
+void WebTestProxyBase::didChangeContents()
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks())
+        m_delegate->printMessage("EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification\n");
+}
+
+void WebTestProxyBase::didEndEditing()
+{
+    if (m_testInterfaces->testRunner()->shouldDumpEditingCallbacks())
+        m_delegate->printMessage("EDITING DELEGATE: webViewDidEndEditing:WebViewDidEndEditingNotification\n");
+}
+
+bool WebTestProxyBase::createView(WebFrame*, const WebURLRequest& request, const WebWindowFeatures&, const WebString&, WebNavigationPolicy)
+{
+    if (!m_testInterfaces->testRunner()->canOpenWindows())
+        return false;
+    if (m_testInterfaces->testRunner()->shouldDumpCreateView())
+        m_delegate->printMessage(string("createView(") + URLDescription(request.url()) + ")\n");
+    return true;
+}
+
+WebPlugin* WebTestProxyBase::createPlugin(WebFrame* frame, const WebPluginParams& params)
+{
+    if (params.mimeType == TestPlugin::mimeType())
+        return TestPlugin::create(frame, params, m_delegate);
+    return 0;
+}
+
+void WebTestProxyBase::setStatusText(const WebString& text)
+{
+    if (!m_testInterfaces->testRunner()->shouldDumpStatusCallbacks())
+        return;
+    m_delegate->printMessage(string("UI DELEGATE STATUS CALLBACK: setStatusText:") + text.utf8().data() + "\n");
+}
+
+void WebTestProxyBase::didStopLoading()
+{
+    if (m_testInterfaces->testRunner()->shouldDumpProgressFinishedCallback())
+        m_delegate->printMessage("postProgressFinishedNotification\n");
+}
+
+void WebTestProxyBase::showContextMenu(WebFrame*, const WebContextMenuData& contextMenuData)
+{
+    m_testInterfaces->eventSender()->setContextMenuData(contextMenuData);
+}
+
+WebUserMediaClient* WebTestProxyBase::userMediaClient()
+{
+#if ENABLE_WEBRTC
+    if (!m_userMediaClient.get())
+        m_userMediaClient.reset(new WebUserMediaClientMock(m_delegate));
+    return m_userMediaClient.get();
+#else
+    return 0;
+#endif // ENABLE_WEBRTC
+}
+
+// Simulate a print by going into print mode and then exit straight away.
+void WebTestProxyBase::printPage(WebFrame* frame)
+{
+    WebSize pageSizeInPixels = m_testInterfaces->webView()->size();
+    WebPrintParams printParams(pageSizeInPixels);
+    frame->printBegin(printParams);
+    frame->printEnd();
+}
+
+WebNotificationPresenter* WebTestProxyBase::notificationPresenter()
+{
+#if ENABLE_NOTIFICATIONS
+    return m_testInterfaces->testRunner()->notificationPresenter();
+#else
+    return 0;
+#endif
+}
+
+WebGeolocationClient* WebTestProxyBase::geolocationClient()
+{
+    return geolocationClientMock();
+}
+
+WebSpeechInputController* WebTestProxyBase::speechInputController(WebSpeechInputListener* listener)
+{
+#if ENABLE_INPUT_SPEECH
+    if (!m_speechInputController.get()) {
+        m_speechInputController.reset(new MockWebSpeechInputController(listener));
+        m_speechInputController->setDelegate(m_delegate);
+    }
+    return m_speechInputController.get();
+#else
+    WEBKIT_ASSERT(listener);
+    return 0;
+#endif
+}
+
+WebSpeechRecognizer* WebTestProxyBase::speechRecognizer()
+{
+    return speechRecognizerMock();
+}
+
+WebDeviceOrientationClient* WebTestProxyBase::deviceOrientationClient()
+{
+    return deviceOrientationClientMock();
+}
+
+bool WebTestProxyBase::requestPointerLock()
+{
+    return m_testInterfaces->testRunner()->requestPointerLock();
+}
+
+void WebTestProxyBase::requestPointerUnlock()
+{
+    m_testInterfaces->testRunner()->requestPointerUnlock();
+}
+
+bool WebTestProxyBase::isPointerLocked()
+{
+    return m_testInterfaces->testRunner()->isPointerLocked();
+}
+
+void WebTestProxyBase::didFocus()
+{
+    m_delegate->setFocus(this, true);
+}
+
+void WebTestProxyBase::didBlur()
+{
+    m_delegate->setFocus(this, false);
+}
+
+void WebTestProxyBase::willPerformClientRedirect(WebFrame* frame, const WebURL&, const WebURL& to, double, double)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(string(" - willPerformClientRedirectToURL: ") + to.spec().data() + " \n");
+    }
+
+    if (m_testInterfaces->testRunner()->shouldDumpUserGestureInFrameLoadCallbacks())
+        printFrameUserGestureStatus(m_delegate, frame, " - in willPerformClientRedirect\n");
+}
+
+void WebTestProxyBase::didCancelClientRedirect(WebFrame* frame)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didCancelClientRedirectForFrame\n");
+    }
+}
+
+void WebTestProxyBase::didStartProvisionalLoad(WebFrame* frame)
+{
+    if (!m_testInterfaces->testRunner()->topLoadingFrame())
+        m_testInterfaces->testRunner()->setTopLoadingFrame(frame, false);
+
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didStartProvisionalLoadForFrame\n");
+    }
+
+    if (m_testInterfaces->testRunner()->shouldDumpUserGestureInFrameLoadCallbacks())
+        printFrameUserGestureStatus(m_delegate, frame, " - in didStartProvisionalLoadForFrame\n");
+
+    if (m_testInterfaces->testRunner()->stopProvisionalFrameLoads()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - stopping load in didStartProvisionalLoadForFrame callback\n");
+        frame->stopLoading();
+    }
+}
+
+void WebTestProxyBase::didReceiveServerRedirectForProvisionalLoad(WebFrame* frame)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didReceiveServerRedirectForProvisionalLoadForFrame\n");
+    }
+}
+
+void WebTestProxyBase::didFailProvisionalLoad(WebFrame* frame, const WebURLError&)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didFailProvisionalLoadWithError\n");
+    }
+    locationChangeDone(frame);
+}
+
+void WebTestProxyBase::didCommitProvisionalLoad(WebFrame* frame, bool)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didCommitLoadForFrame\n");
+    }
+}
+
+void WebTestProxyBase::didReceiveTitle(WebFrame* frame, const WebString& title, WebTextDirection direction)
+{
+    WebCString title8 = title.utf8();
+
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(string(" - didReceiveTitle: ") + title8.data() + "\n");
+    }
+
+    if (m_testInterfaces->testRunner()->shouldDumpTitleChanges())
+        m_delegate->printMessage(string("TITLE CHANGED: '") + title8.data() + "'\n");
+
+    m_testInterfaces->testRunner()->setTitleTextDirection(direction);
+}
+
+void WebTestProxyBase::didChangeIcon(WebFrame* frame, WebIconURL::Type)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpIconChanges()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(string(" - didChangeIcons\n"));
+    }
+}
+
+void WebTestProxyBase::didFinishDocumentLoad(WebFrame* frame)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didFinishDocumentLoadForFrame\n");
+    } else {
+        unsigned pendingUnloadEvents = frame->unloadListenerCount();
+        if (pendingUnloadEvents) {
+            printFrameDescription(m_delegate, frame);
+            char buffer[100];
+            snprintf(buffer, sizeof(buffer), " - has %u onunload handler(s)\n", pendingUnloadEvents);
+            m_delegate->printMessage(buffer);
+        }
+    }
+}
+
+void WebTestProxyBase::didHandleOnloadEvents(WebFrame* frame)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didHandleOnloadEventsForFrame\n");
+    }
+}
+
+void WebTestProxyBase::didFailLoad(WebFrame* frame, const WebURLError&)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didFailLoadWithError\n");
+    }
+    locationChangeDone(frame);
+}
+
+void WebTestProxyBase::didFinishLoad(WebFrame* frame)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didFinishLoadForFrame\n");
+    }
+    locationChangeDone(frame);
+}
+
+void WebTestProxyBase::didChangeLocationWithinPage(WebFrame* frame)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        m_delegate->printMessage(" - didChangeLocationWithinPageForFrame\n");
+    }
+}
+
+void WebTestProxyBase::didDisplayInsecureContent(WebFrame*)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks())
+        m_delegate->printMessage("didDisplayInsecureContent\n");
+}
+
+void WebTestProxyBase::didRunInsecureContent(WebFrame*, const WebSecurityOrigin&, const WebURL&)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks())
+        m_delegate->printMessage("didRunInsecureContent\n");
+}
+
+void WebTestProxyBase::didDetectXSS(WebFrame*, const WebURL&, bool)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpFrameLoadCallbacks())
+        m_delegate->printMessage("didDetectXSS\n");
+}
+
+void WebTestProxyBase::assignIdentifierToRequest(WebFrame*, unsigned identifier, const WebKit::WebURLRequest& request)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpResourceLoadCallbacks() || m_testInterfaces->testRunner()->shouldDumpResourcePriorities()) {
+        WEBKIT_ASSERT(m_resourceIdentifierMap.find(identifier) == m_resourceIdentifierMap.end());
+        m_resourceIdentifierMap[identifier] = descriptionSuitableForTestResult(request.url().spec());
+    }
+}
+
+void WebTestProxyBase::willRequestResource(WebFrame* frame, const WebKit::WebCachedURLRequest& request)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpResourceRequestCallbacks()) {
+        printFrameDescription(m_delegate, frame);
+        WebElement element = request.initiatorElement();
+        if (!element.isNull()) {
+            m_delegate->printMessage(" - element with ");
+            if (element.hasAttribute("id"))
+                m_delegate->printMessage(string("id '") + element.getAttribute("id").utf8().data() + "'");
+            else
+                m_delegate->printMessage("no id");
+        } else
+            m_delegate->printMessage(string(" - ") + request.initiatorName().utf8().data());
+        m_delegate->printMessage(string(" requested '") + URLDescription(request.urlRequest().url()).c_str() + "'\n");
+    }
+}
+
+bool WebTestProxyBase::canHandleRequest(WebFrame*, const WebURLRequest& request)
+{
+    GURL url = request.url();
+    // Just reject the scheme used in
+    // LayoutTests/http/tests/misc/redirect-to-external-url.html
+    return !url.SchemeIs("spaceballs");
+}
+
+WebURLError WebTestProxyBase::cannotHandleRequestError(WebFrame*, const WebURLRequest& request)
+{
+    WebURLError error;
+    // A WebKit layout test expects the following values.
+    // unableToImplementPolicyWithError() below prints them.
+    error.domain = WebString::fromUTF8("WebKitErrorDomain");
+    error.reason = 101;
+    error.unreachableURL = request.url();
+    return error;
+}
+
+void WebTestProxyBase::didCreateDataSource(WebFrame*, WebDataSource* ds)
+{
+    if (!m_testInterfaces->testRunner()->deferMainResourceDataLoad())
+        ds->setDeferMainResourceDataLoad(false);
+}
+
+void WebTestProxyBase::willSendRequest(WebFrame*, unsigned identifier, WebKit::WebURLRequest& request, const WebKit::WebURLResponse& redirectResponse)
+{
+    // Need to use GURL for host() and SchemeIs()
+    GURL url = request.url();
+    string requestURL = url.possibly_invalid_spec();
+
+    GURL mainDocumentURL = request.firstPartyForCookies();
+
+    if (m_testInterfaces->testRunner()->shouldDumpResourceLoadCallbacks()) {
+        if (m_resourceIdentifierMap.find(identifier) == m_resourceIdentifierMap.end())
+            m_delegate->printMessage("<unknown>");
+        else
+            m_delegate->printMessage(m_resourceIdentifierMap[identifier]);
+        m_delegate->printMessage(" - willSendRequest <NSURLRequest URL ");
+        m_delegate->printMessage(descriptionSuitableForTestResult(requestURL).c_str());
+        m_delegate->printMessage(", main document URL ");
+        m_delegate->printMessage(URLDescription(mainDocumentURL).c_str());
+        m_delegate->printMessage(", http method ");
+        m_delegate->printMessage(request.httpMethod().utf8().data());
+        m_delegate->printMessage("> redirectResponse ");
+        printResponseDescription(m_delegate, redirectResponse);
+        m_delegate->printMessage("\n");
+    }
+
+    if (m_testInterfaces->testRunner()->shouldDumpResourcePriorities()) {
+        m_delegate->printMessage(descriptionSuitableForTestResult(requestURL).c_str());
+        m_delegate->printMessage(" has priority ");
+        m_delegate->printMessage(PriorityDescription(request.priority()));
+        m_delegate->printMessage("\n");
+    }
+
+    if (!redirectResponse.isNull() && m_testInterfaces->testRunner()->shouldBlockRedirects()) {
+        m_delegate->printMessage("Returning null for this redirect\n");
+        blockRequest(request);
+        return;
+    }
+
+    if (m_testInterfaces->testRunner()->willSendRequestShouldReturnNull()) {
+        blockRequest(request);
+        return;
+    }
+
+    if (m_testInterfaces->testRunner()->httpHeadersToClear()) {
+        const set<string> *clearHeaders = m_testInterfaces->testRunner()->httpHeadersToClear();
+        for (set<string>::const_iterator header = clearHeaders->begin(); header != clearHeaders->end(); ++header)
+            request.clearHTTPHeaderField(WebString::fromUTF8(*header));
+    }
+
+    string host = url.host();
+    if (!host.empty() && (url.SchemeIs("http") || url.SchemeIs("https"))) {
+        if (!isLocalhost(host) && !hostIsUsedBySomeTestsToGenerateError(host)
+            && ((!mainDocumentURL.SchemeIs("http") && !mainDocumentURL.SchemeIs("https")) || isLocalhost(mainDocumentURL.host()))
+            && !m_delegate->allowExternalPages()) {
+            m_delegate->printMessage(string("Blocked access to external URL ") + requestURL + "\n");
+            blockRequest(request);
+            return;
+        }
+    }
+
+    // Set the new substituted URL.
+    request.setURL(m_delegate->rewriteLayoutTestsURL(request.url().spec()));
+}
+
+void WebTestProxyBase::didReceiveResponse(WebFrame*, unsigned identifier, const WebKit::WebURLResponse& response)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpResourceLoadCallbacks()) {
+        if (m_resourceIdentifierMap.find(identifier) == m_resourceIdentifierMap.end())
+            m_delegate->printMessage("<unknown>");
+        else
+            m_delegate->printMessage(m_resourceIdentifierMap[identifier]);
+        m_delegate->printMessage(" - didReceiveResponse ");
+        printResponseDescription(m_delegate, response);
+        m_delegate->printMessage("\n");
+    }
+    if (m_testInterfaces->testRunner()->shouldDumpResourceResponseMIMETypes()) {
+        GURL url = response.url();
+        WebString mimeType = response.mimeType();
+        m_delegate->printMessage(url.ExtractFileName());
+        m_delegate->printMessage(" has MIME type ");
+        // Simulate NSURLResponse's mapping of empty/unknown MIME types to application/octet-stream
+        m_delegate->printMessage(mimeType.isEmpty() ? "application/octet-stream" : mimeType.utf8().data());
+        m_delegate->printMessage("\n");
+    }
+}
+
+void WebTestProxyBase::didChangeResourcePriority(WebFrame*, unsigned identifier, const WebKit::WebURLRequest::Priority& priority)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpResourcePriorities()) {
+        if (m_resourceIdentifierMap.find(identifier) == m_resourceIdentifierMap.end())
+            m_delegate->printMessage("<unknown>");
+        else
+            m_delegate->printMessage(m_resourceIdentifierMap[identifier]);
+        m_delegate->printMessage(" changed priority to ");
+        m_delegate->printMessage(PriorityDescription(priority));
+        m_delegate->printMessage("\n");
+    }
+}
+
+void WebTestProxyBase::didFinishResourceLoad(WebFrame*, unsigned identifier)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpResourceLoadCallbacks()) {
+        if (m_resourceIdentifierMap.find(identifier) == m_resourceIdentifierMap.end())
+            m_delegate->printMessage("<unknown>");
+        else
+            m_delegate->printMessage(m_resourceIdentifierMap[identifier]);
+        m_delegate->printMessage(" - didFinishLoading\n");
+    }
+    m_resourceIdentifierMap.erase(identifier);
+}
+
+void WebTestProxyBase::didFailResourceLoad(WebFrame*, unsigned identifier, const WebKit::WebURLError& error)
+{
+    if (m_testInterfaces->testRunner()->shouldDumpResourceLoadCallbacks()) {
+        if (m_resourceIdentifierMap.find(identifier) == m_resourceIdentifierMap.end())
+            m_delegate->printMessage("<unknown>");
+        else
+            m_delegate->printMessage(m_resourceIdentifierMap[identifier]);
+        m_delegate->printMessage(" - didFailLoadingWithError: ");
+        m_delegate->printMessage(m_delegate->makeURLErrorDescription(error));
+        m_delegate->printMessage("\n");
+    }
+    m_resourceIdentifierMap.erase(identifier);
+}
+
+void WebTestProxyBase::unableToImplementPolicyWithError(WebKit::WebFrame* frame, const WebKit::WebURLError& error)
+{
+    char errorBuffer[40];
+    snprintf(errorBuffer, sizeof(errorBuffer), "%d", error.reason);
+    m_delegate->printMessage(string("Policy delegate: unable to implement policy with error domain '") + error.domain.utf8().data() +
+        "', error code " +  errorBuffer +
+        ", in frame '" + frame->uniqueName().utf8().data() + "'\n");
+}
+
+void WebTestProxyBase::didAddMessageToConsole(const WebConsoleMessage& message, const WebString& sourceName, unsigned sourceLine)
+{
+    // This matches win DumpRenderTree's UIDelegate.cpp.
+    if (!m_logConsoleOutput)
+        return;
+    m_delegate->printMessage(string("CONSOLE MESSAGE: "));
+    if (sourceLine) {
+        char buffer[40];
+        snprintf(buffer, sizeof(buffer), "line %d: ", sourceLine);
+        m_delegate->printMessage(buffer);
+    }
+    if (!message.text.isEmpty()) {
+        string newMessage;
+        newMessage = message.text.utf8();
+        size_t fileProtocol = newMessage.find("file://");
+        if (fileProtocol != string::npos) {
+            newMessage = newMessage.substr(0, fileProtocol)
+                + urlSuitableForTestResult(newMessage.substr(fileProtocol));
+        }
+        m_delegate->printMessage(newMessage);
+    }
+    m_delegate->printMessage(string("\n"));
+}
+
+void WebTestProxyBase::runModalAlertDialog(WebFrame*, const WebString& message)
+{
+    m_delegate->printMessage(string("ALERT: ") + message.utf8().data() + "\n");
+}
+
+bool WebTestProxyBase::runModalConfirmDialog(WebFrame*, const WebString& message)
+{
+    m_delegate->printMessage(string("CONFIRM: ") + message.utf8().data() + "\n");
+    return true;
+}
+
+bool WebTestProxyBase::runModalPromptDialog(WebFrame* frame, const WebString& message, const WebString& defaultValue, WebString*)
+{
+    m_delegate->printMessage(string("PROMPT: ") + message.utf8().data() + ", default text: " + defaultValue.utf8().data() + "\n");
+    return true;
+}
+
+bool WebTestProxyBase::runModalBeforeUnloadDialog(WebFrame*, const WebString& message)
+{
+    m_delegate->printMessage(string("CONFIRM NAVIGATION: ") + message.utf8().data() + "\n");
+    return !m_testInterfaces->testRunner()->shouldStayOnPageAfterHandlingBeforeUnload();
+}
+
+void WebTestProxyBase::locationChangeDone(WebFrame* frame)
+{
+    if (frame != m_testInterfaces->testRunner()->topLoadingFrame())
+        return;
+    m_testInterfaces->testRunner()->setTopLoadingFrame(frame, true);
+}
+
+WebNavigationPolicy WebTestProxyBase::decidePolicyForNavigation(WebFrame*, const WebURLRequest& request, WebNavigationType type, const WebNode& originatingNode, WebNavigationPolicy defaultPolicy, bool isRedirect)
+{
+    WebNavigationPolicy result;
+    if (!m_testInterfaces->testRunner()->policyDelegateEnabled())
+        return defaultPolicy;
+
+    m_delegate->printMessage(string("Policy delegate: attempt to load ") + URLDescription(request.url()) + " with navigation type '" + webNavigationTypeToString(type) + "'");
+    if (!originatingNode.isNull()) {
+        m_delegate->printMessage(" originating from ");
+        printNodeDescription(m_delegate, originatingNode, 0);
+    }
+    m_delegate->printMessage("\n");
+    if (m_testInterfaces->testRunner()->policyDelegateIsPermissive())
+        result = WebKit::WebNavigationPolicyCurrentTab;
+    else
+        result = WebKit::WebNavigationPolicyIgnore;
+
+    if (m_testInterfaces->testRunner()->policyDelegateShouldNotifyDone())
+        m_testInterfaces->testRunner()->policyDelegateDone();
+    return result;
+}
+
+bool WebTestProxyBase::willCheckAndDispatchMessageEvent(WebFrame*, WebFrame*, WebSecurityOrigin, WebDOMMessageEvent)
+{
+    if (m_testInterfaces->testRunner()->shouldInterceptPostMessage()) {
+        m_delegate->printMessage("intercepted postMessage\n");
+        return true;
+    }
+
+    return false;
+}
+
 }
diff --git a/Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp
old mode 100755
new mode 100644
similarity index 70%
rename from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp
index 065df4f..adab858
--- a/Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.cpp
@@ -35,8 +35,9 @@
 //
 
 #include "config.h"
-#include "WebThemeControlDRTWin.h"
+#include "WebTestThemeControlWin.h"
 
+#include "TestCommon.h"
 #include "skia/ext/skia_utils_win.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkPaint.h"
@@ -44,15 +45,19 @@
 #include "third_party/skia/include/core/SkRect.h"
 
 #include <algorithm>
-#include <wtf/Assertions.h>
 
+using namespace WebKit;
 using namespace std;
 
-static const SkColor edgeColor     = SK_ColorBLACK;
-static const SkColor readOnlyColor = SkColorSetRGB(0xe9, 0xc2, 0xa6);
-static const SkColor fgColor       = SK_ColorBLACK;
-static const SkColor bgColors[]    = {
-    SK_ColorBLACK,                   // Unknown
+namespace WebTestRunner {
+
+namespace {
+
+const SkColor edgeColor     = SK_ColorBLACK;
+const SkColor readOnlyColor = SkColorSetRGB(0xe9, 0xc2, 0xa6);
+const SkColor fgColor       = SK_ColorBLACK;
+const SkColor bgColors[]    = {
+    SK_ColorBLACK, // Unknown
     SkColorSetRGB(0xc9, 0xc9, 0xc9), // Disabled
     SkColorSetRGB(0xf3, 0xe0, 0xd0), // Readonly
     SkColorSetRGB(0x89, 0xc4, 0xff), // Normal
@@ -60,16 +65,16 @@
     SkColorSetRGB(0x20, 0xf6, 0xcc), // Focused
     SkColorSetRGB(0x00, 0xf3, 0xac), // Hover
     SkColorSetRGB(0xa9, 0xff, 0x12), // Pressed
-    SkColorSetRGB(0xcc, 0xcc, 0xcc)  // Indeterminate
+    SkColorSetRGB(0xcc, 0xcc, 0xcc) // Indeterminate
 };
 
-static SkIRect validate(const SkIRect& rect, WebThemeControlDRTWin::Type ctype)
+SkIRect validate(const SkIRect& rect, WebTestThemeControlWin::Type ctype)
 {
     switch (ctype) {
-    case WebThemeControlDRTWin::UncheckedBoxType:
-    case WebThemeControlDRTWin::CheckedBoxType:
-    case WebThemeControlDRTWin::UncheckedRadioType:
-    case WebThemeControlDRTWin::CheckedRadioType: {
+    case WebTestThemeControlWin::UncheckedBoxType:
+    case WebTestThemeControlWin::CheckedBoxType:
+    case WebTestThemeControlWin::UncheckedRadioType:
+    case WebTestThemeControlWin::CheckedRadioType: {
         SkIRect retval = rect;
 
         // The maximum width and height is 13.
@@ -91,12 +96,9 @@
     }
 }
 
-// WebThemeControlDRTWin
+}
 
-WebThemeControlDRTWin::WebThemeControlDRTWin(SkCanvas* canvas,
-                                             const SkIRect& irect,
-                                             Type ctype,
-                                             State cstate)
+WebTestThemeControlWin::WebTestThemeControlWin(SkCanvas* canvas, const SkIRect& irect, Type ctype, State cstate)
     : m_canvas(canvas)
     , m_irect(validate(irect, ctype))
     , m_type(ctype)
@@ -113,11 +115,11 @@
 {
 }
 
-WebThemeControlDRTWin::~WebThemeControlDRTWin()
+WebTestThemeControlWin::~WebTestThemeControlWin()
 {
 }
 
-void WebThemeControlDRTWin::box(const SkIRect& rect, SkColor fillColor)
+void WebTestThemeControlWin::box(const SkIRect& rect, SkColor fillColor)
 {
     SkPaint paint;
 
@@ -130,19 +132,14 @@
     m_canvas->drawIRect(rect, paint);
 }
 
-void WebThemeControlDRTWin::line(int x0, int y0, int x1, int y1, SkColor color)
+void WebTestThemeControlWin::line(int x0, int y0, int x1, int y1, SkColor color)
 {
     SkPaint paint;
     paint.setColor(color);
-    m_canvas->drawLine(SkIntToScalar(x0), SkIntToScalar(y0),
-                       SkIntToScalar(x1), SkIntToScalar(y1),
-                       paint);
+    m_canvas->drawLine(SkIntToScalar(x0), SkIntToScalar(y0), SkIntToScalar(x1), SkIntToScalar(y1), paint);
 }
 
-void WebThemeControlDRTWin::triangle(int x0, int y0,
-                                     int x1, int y1,
-                                     int x2, int y2,
-                                     SkColor color)
+void WebTestThemeControlWin::triangle(int x0, int y0, int x1, int y1, int x2, int y2, SkColor color)
 {
     SkPath path;
     SkPaint paint;
@@ -161,7 +158,7 @@
     m_canvas->drawPath(path, paint);
 }
 
-void WebThemeControlDRTWin::roundRect(SkColor color)
+void WebTestThemeControlWin::roundRect(SkColor color)
 {
     SkRect rect;
     SkScalar radius = SkIntToScalar(5);
@@ -177,7 +174,7 @@
     m_canvas->drawRoundRect(rect, radius, radius, paint);
 }
 
-void WebThemeControlDRTWin::oval(SkColor color)
+void WebTestThemeControlWin::oval(SkColor color)
 {
     SkRect rect;
     SkPaint paint;
@@ -192,7 +189,7 @@
     m_canvas->drawOval(rect, paint);
 }
 
-void WebThemeControlDRTWin::circle(SkScalar radius, SkColor color)
+void WebTestThemeControlWin::circle(SkScalar radius, SkColor color)
 {
     SkScalar cy = SkIntToScalar(m_top  + m_height / 2);
     SkScalar cx = SkIntToScalar(m_left + m_width / 2);
@@ -207,23 +204,15 @@
     m_canvas->drawCircle(cx, cy, radius, paint);
 }
 
-void WebThemeControlDRTWin::nestedBoxes(int indentLeft,
-                                        int indentTop,
-                                        int indentRight,
-                                        int indentBottom,
-                                        SkColor outerColor,
-                                        SkColor innerColor)
+void WebTestThemeControlWin::nestedBoxes(int indentLeft, int indentTop, int indentRight, int indentBottom, SkColor outerColor, SkColor innerColor)
 {
     SkIRect lirect;
     box(m_irect, outerColor);
-    lirect.set(m_irect.fLeft + indentLeft,
-               m_irect.fTop + indentTop,
-               m_irect.fRight - indentRight,
-               m_irect.fBottom - indentBottom);
+    lirect.set(m_irect.fLeft + indentLeft, m_irect.fTop + indentTop, m_irect.fRight - indentRight, m_irect.fBottom - indentBottom);
     box(lirect, innerColor);
 }
 
-void WebThemeControlDRTWin::markState()
+void WebTestThemeControlWin::markState()
 {
     // The horizontal lines in a read only control are spaced by this amount.
     const int readOnlyLineOffset = 5;
@@ -235,6 +224,7 @@
     case UnknownState:
     case DisabledState:
     case NormalState:
+    case IndeterminateState:
         // Don't visually mark these states (color is enough).
         break;
     case ReadOnlyState:
@@ -245,40 +235,31 @@
 
     case HotState:
         // Draw a triangle in the upper left corner of the control.
-        triangle(m_left,                 m_top,
-                 m_left + triangleSize,  m_top,
-                 m_left,                 m_top + triangleSize,    m_edgeColor);
+        triangle(m_left, m_top, m_left + triangleSize, m_top, m_left, m_top + triangleSize, m_edgeColor);
         break;
 
     case HoverState:
         // Draw a triangle in the upper right corner of the control.
-        triangle(m_right,                m_top,
-                 m_right,                m_top + triangleSize,
-                 m_right - triangleSize, m_top,                   m_edgeColor);
+        triangle(m_right, m_top, m_right, m_top + triangleSize, m_right - triangleSize, m_top, m_edgeColor);
         break;
 
     case FocusedState:
         // Draw a triangle in the bottom right corner of the control.
-        triangle(m_right,                m_bottom,
-                 m_right - triangleSize, m_bottom,
-                 m_right,                m_bottom - triangleSize, m_edgeColor);
+        triangle(m_right, m_bottom, m_right - triangleSize, m_bottom, m_right, m_bottom - triangleSize, m_edgeColor);
         break;
 
     case PressedState:
         // Draw a triangle in the bottom left corner of the control.
-        triangle(m_left,                 m_bottom,
-                 m_left,                 m_bottom - triangleSize,
-                 m_left + triangleSize,  m_bottom,                m_edgeColor);
+        triangle(m_left, m_bottom, m_left, m_bottom - triangleSize, m_left + triangleSize, m_bottom, m_edgeColor);
         break;
 
     default:
-        ASSERT_NOT_REACHED();
-        CRASH();
+        WEBKIT_ASSERT_NOT_REACHED();
         break;
     }
 }
 
-void WebThemeControlDRTWin::draw()
+void WebTestThemeControlWin::draw()
 {
     int halfWidth = m_width / 2;
     int halfHeight = m_height / 2;
@@ -306,14 +287,12 @@
 
     switch (m_type) {
     case UnknownType:
-        ASSERT_NOT_REACHED();
-        CRASH();
+        WEBKIT_ASSERT_NOT_REACHED();
         break;
 
     case TextFieldType:
         // We render this by hand outside of this function.
-        ASSERT_NOT_REACHED();
-        CRASH();
+        WEBKIT_ASSERT_NOT_REACHED();
         break;
 
     case PushButtonType:
@@ -395,57 +374,43 @@
     case HorizontalScrollGripType: {
         // Draw a horizontal crosshatch for the grip.
         int longOffset = halfWidth - gripLongIndent;
-        line(m_left  + gripLongIndent, m_top    + halfHeight,
-             m_right - gripLongIndent, m_top    + halfHeight,      m_fgColor);
-        line(m_left  + longOffset,     m_top    + gripShortIndent,
-             m_left  + longOffset,     m_bottom - gripShortIndent, m_fgColor);
-        line(m_right - longOffset,     m_top    + gripShortIndent,
-             m_right - longOffset,     m_bottom - gripShortIndent, m_fgColor);
+        line(m_left + gripLongIndent, m_top + halfHeight, m_right - gripLongIndent, m_top + halfHeight, m_fgColor);
+        line(m_left + longOffset, m_top + gripShortIndent, m_left + longOffset, m_bottom - gripShortIndent, m_fgColor);
+        line(m_right - longOffset, m_top + gripShortIndent, m_right - longOffset, m_bottom - gripShortIndent, m_fgColor);
         break;
     }
 
     case VerticalScrollGripType: {
         // Draw a vertical crosshatch for the grip.
         int longOffset = halfHeight - gripLongIndent;
-        line(m_left  + halfWidth,       m_top    + gripLongIndent,
-             m_left  + halfWidth,       m_bottom - gripLongIndent, m_fgColor);
-        line(m_left  + gripShortIndent, m_top    + longOffset,
-             m_right - gripShortIndent, m_top    + longOffset,     m_fgColor);
-        line(m_left  + gripShortIndent, m_bottom - longOffset,
-             m_right - gripShortIndent, m_bottom - longOffset,     m_fgColor);
+        line(m_left + halfWidth, m_top + gripLongIndent, m_left + halfWidth, m_bottom - gripLongIndent, m_fgColor);
+        line(m_left + gripShortIndent, m_top + longOffset, m_right - gripShortIndent, m_top + longOffset, m_fgColor);
+        line(m_left + gripShortIndent, m_bottom - longOffset, m_right - gripShortIndent, m_bottom - longOffset, m_fgColor);
         break;
     }
 
     case LeftArrowType:
         // Draw a left arrow inside a box.
         box(m_irect, m_bgColor);
-        triangle(m_right - quarterWidth, m_top    + quarterHeight,
-                 m_right - quarterWidth, m_bottom - quarterHeight,
-                 m_left  + quarterWidth, m_top    + halfHeight,    m_fgColor);
+        triangle(m_right - quarterWidth, m_top + quarterHeight, m_right - quarterWidth, m_bottom - quarterHeight, m_left + quarterWidth, m_top + halfHeight, m_fgColor);
         break;
 
     case RightArrowType:
         // Draw a left arrow inside a box.
         box(m_irect, m_bgColor);
-        triangle(m_left  + quarterWidth, m_top    + quarterHeight,
-                 m_right - quarterWidth, m_top    + halfHeight,
-                 m_left  + quarterWidth, m_bottom - quarterHeight, m_fgColor);
+        triangle(m_left + quarterWidth, m_top + quarterHeight, m_right - quarterWidth, m_top + halfHeight, m_left + quarterWidth, m_bottom - quarterHeight, m_fgColor);
         break;
 
     case UpArrowType:
         // Draw an up arrow inside a box.
         box(m_irect, m_bgColor);
-        triangle(m_left  + quarterWidth, m_bottom - quarterHeight,
-                 m_left  + halfWidth,    m_top    + quarterHeight,
-                 m_right - quarterWidth, m_bottom - quarterHeight, m_fgColor);
+        triangle(m_left + quarterWidth, m_bottom - quarterHeight, m_left + halfWidth, m_top + quarterHeight, m_right - quarterWidth, m_bottom - quarterHeight, m_fgColor);
         break;
 
     case DownArrowType:
         // Draw a down arrow inside a box.
         box(m_irect, m_bgColor);
-        triangle(m_left  + quarterWidth, m_top    + quarterHeight,
-                 m_right - quarterWidth, m_top    + quarterHeight,
-                 m_left  + halfWidth,    m_bottom - quarterHeight, m_fgColor);
+        triangle(m_left + quarterWidth, m_top + quarterHeight, m_right - quarterWidth, m_top + quarterHeight, m_left + halfWidth, m_bottom - quarterHeight, m_fgColor);
         break;
 
     case HorizontalSliderTrackType: {
@@ -473,14 +438,11 @@
     case DropDownButtonType:
         // Draw a box with a big down arrow on top.
         box(m_irect, m_bgColor);
-        triangle(m_left  + quarterWidth, m_top,
-                 m_right - quarterWidth, m_top,
-                 m_left  + halfWidth,    m_bottom, m_fgColor);
+        triangle(m_left + quarterWidth, m_top, m_right - quarterWidth, m_top, m_left + halfWidth, m_bottom, m_fgColor);
         break;
 
     default:
-        ASSERT_NOT_REACHED();
-        CRASH();
+        WEBKIT_ASSERT_NOT_REACHED();
         break;
     }
 
@@ -490,7 +452,7 @@
 // Because rendering a text field is dependent on input
 // parameters the other controls don't have, we render it directly
 // rather than trying to overcomplicate draw() further.
-void WebThemeControlDRTWin::drawTextField(bool drawEdges, bool fillContentArea, SkColor color)
+void WebTestThemeControlWin::drawTextField(bool drawEdges, bool fillContentArea, SkColor color)
 {
     SkPaint paint;
 
@@ -508,7 +470,7 @@
     markState();
 }
 
-void WebThemeControlDRTWin::drawProgressBar(const SkIRect& fillRect)
+void WebTestThemeControlWin::drawProgressBar(const SkIRect& fillRect)
 {
     SkPaint paint;
 
@@ -526,3 +488,4 @@
     markState();
 }
 
+}
diff --git a/Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.h b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h
similarity index 91%
rename from Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h
index ef731ab..7bad18e 100644
--- a/Tools/DumpRenderTree/chromium/WebThemeControlDRTWin.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeControlWin.h
@@ -28,7 +28,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-// WebThemeControlDRTWin implements the generic rendering of controls
+// WebTestThemeControlWin implements the generic rendering of controls
 // needed by WebThemeEngineDRTWin. See the comments in that class
 // header file for why this class is needed and used.
 //
@@ -36,18 +36,18 @@
 // are optimized for testability, not a pleasing appearance.
 //
 
-#ifndef WebThemeControlDRTWin_h
-#define WebThemeControlDRTWin_h
+#ifndef WebTestThemeControlWin_h
+#define WebTestThemeControlWin_h
 
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkRect.h"
-#include <wtf/Noncopyable.h>
 
 // Skia forward declarations
 class SkCanvas;
 
-class WebThemeControlDRTWin {
-    WTF_MAKE_NONCOPYABLE(WebThemeControlDRTWin);
+namespace WebTestRunner {
+
+class WebTestThemeControlWin {
 public:
     // This list of states mostly mirrors the list in WebCore/platform/ThemeTypes.h
     // but is maintained separately since that isn't public and also to minimize
@@ -124,8 +124,8 @@
 
     // Constructs a control of the given size, type and state to draw
     // on to the given canvas.
-    WebThemeControlDRTWin(SkCanvas*, const SkIRect&, Type, State);
-    ~WebThemeControlDRTWin();
+    WebTestThemeControlWin(SkCanvas*, const SkIRect&, Type, State);
+    ~WebTestThemeControlWin();
 
     // Draws the control.
     void draw();
@@ -168,12 +168,7 @@
     // with a border in the default edge color, and then draws another box
     // indented on all four sides by the specified amounts, filled with the
     // inner color and with a border in the default edge color.
-    void nestedBoxes(int indentLeft,
-                     int indentTop,
-                     int indentRight,
-                     int indentBottom,
-                     SkColor outerColor,
-                     SkColor innerColor);
+    void nestedBoxes(int indentLeft, int indentTop, int indentRight, int indentBottom, SkColor outerColor, SkColor innerColor);
 
     // Draws a line between the two points in the given color.
     void line(int x0, int y0, int x1, int y1, SkColor);
@@ -200,4 +195,6 @@
     const int m_height;
 };
 
-#endif // WebThemeControlDRTWin_h
+}
+
+#endif // WebTestThemeControlWin_h
diff --git a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.h b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h
similarity index 89%
rename from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h
index 2398be3..f0b5232 100644
--- a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.h
@@ -27,12 +27,14 @@
 // port rendering more than usual Chromium path, thus allowing us to share
 // more pixel baselines.
 
-#ifndef WebThemeEngineDRTMac_h
-#define WebThemeEngineDRTMac_h
+#ifndef WebTestThemeEngineMac_h
+#define WebTestThemeEngineMac_h
 
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/mac/WebThemeEngine.h"
+#include <public/mac/WebThemeEngine.h>
 
-class WebThemeEngineDRTMac : public WebKit::WebThemeEngine {
+namespace WebTestRunner {
+
+class WebTestThemeEngineMac : public WebKit::WebThemeEngine {
 public:
     virtual void paintScrollbarThumb(
         WebKit::WebCanvas*,
@@ -56,4 +58,6 @@
         const WebKit::WebThemeEngine::ScrollbarInfo&);
 };
 
-#endif // WebThemeEngineDRTMac_h
+}
+
+#endif // WebTestThemeEngineMac_h
diff --git a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.mm b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm
similarity index 93%
rename from Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.mm
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm
index 6f9c4b6..f39fd53 100644
--- a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTMac.mm
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineMac.mm
@@ -28,11 +28,11 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "WebThemeEngineDRTMac.h"
+#include "WebTestThemeEngineMac.h"
 
+#include <public/WebCanvas.h>
+#include <public/WebRect.h>
 #include "skia/ext/skia_utils_mac.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCanvas.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h"
 #import <AppKit/NSAffineTransform.h>
 #import <AppKit/NSGraphicsContext.h>
 #import <AppKit/NSScroller.h>
@@ -89,7 +89,25 @@
 
 @end
 
-void WebThemeEngineDRTMac::paintScrollbarThumb(
+namespace WebTestRunner {
+
+namespace {
+
+ThemeTrackEnableState stateToHIEnableState(WebThemeEngine::State state)
+{
+    switch (state) {
+    case WebThemeEngine::StateDisabled:
+        return kThemeTrackDisabled;
+    case WebThemeEngine::StateInactive:
+        return kThemeTrackInactive;
+    default:
+        return kThemeTrackActive;
+    }
+}
+
+}
+
+void WebTestThemeEngineMac::paintScrollbarThumb(
     WebCanvas* canvas,
     WebThemeEngine::State state,
     WebThemeEngine::Size size,
@@ -103,21 +121,9 @@
         paintNSScrollerScrollbarThumb(canvas, state, size, rect, scrollbarInfo);
 }
 
-static ThemeTrackEnableState stateToHIEnableState(WebThemeEngine::State state)
-{
-    switch (state) {
-    case WebThemeEngine::StateDisabled:
-        return kThemeTrackDisabled;
-    case WebThemeEngine::StateInactive:
-        return kThemeTrackInactive;
-    default:
-        return kThemeTrackActive;
-    }
-}
-
 // Duplicated from webkit/glue/webthemeengine_impl_mac.cc in the downstream
 // Chromium WebThemeEngine implementation.
-void WebThemeEngineDRTMac::paintHIThemeScrollbarThumb(
+void WebTestThemeEngineMac::paintHIThemeScrollbarThumb(
     WebCanvas* canvas,
     WebThemeEngine::State state,
     WebThemeEngine::Size size,
@@ -146,7 +152,7 @@
     HIThemeDrawTrack(&trackInfo, 0, cgContext, kHIThemeOrientationNormal);
 }
 
-void WebThemeEngineDRTMac::paintNSScrollerScrollbarThumb(
+void WebTestThemeEngineMac::paintNSScrollerScrollbarThumb(
     WebCanvas* canvas,
     WebThemeEngine::State state,
     WebThemeEngine::Size size,
@@ -189,3 +195,5 @@
 
     [NSGraphicsContext restoreGraphicsState];
 }
+
+}
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp
new file mode 100644
index 0000000..50339f5
--- /dev/null
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.cpp
@@ -0,0 +1,743 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebTestThemeEngineWin.h"
+
+#include "TestCommon.h"
+#include "WebTestThemeControlWin.h"
+#include "third_party/skia/include/core/SkRect.h"
+#include <public/WebRect.h>
+
+// Although all this code is generic, we include these headers
+// to pull in the Windows #defines for the parts and states of
+// the controls.
+#include <vsstyle.h>
+#include <windows.h>
+
+using namespace WebKit;
+
+namespace WebTestRunner {
+
+namespace {
+
+// We define this for clarity, although there really should be a DFCS_NORMAL in winuser.h.
+const int dfcsNormal = 0x0000;
+
+SkIRect webRectToSkIRect(const WebRect& webRect)
+{
+    SkIRect irect;
+    irect.set(webRect.x, webRect.y, webRect.x + webRect.width - 1, webRect.y + webRect.height - 1);
+    return irect;
+}
+
+void drawControl(WebCanvas* canvas, const WebRect& rect, WebTestThemeControlWin::Type ctype, WebTestThemeControlWin::State cstate)
+{
+    WebTestThemeControlWin control(canvas, webRectToSkIRect(rect), ctype, cstate);
+    control.draw();
+}
+
+void drawTextField(WebCanvas* canvas, const WebRect& rect, WebTestThemeControlWin::Type ctype, WebTestThemeControlWin::State cstate, bool drawEdges, bool fillContentArea, WebColor color)
+{
+    WebTestThemeControlWin control(canvas, webRectToSkIRect(rect), ctype, cstate);
+    control.drawTextField(drawEdges, fillContentArea, color);
+}
+
+void drawProgressBar(WebCanvas* canvas, WebTestThemeControlWin::Type ctype, WebTestThemeControlWin::State cstate, const WebRect& barRect, const WebRect& fillRect)
+{
+    WebTestThemeControlWin control(canvas, webRectToSkIRect(barRect), ctype, cstate);
+    control.drawProgressBar(webRectToSkIRect(fillRect));
+}
+
+}
+
+void WebTestThemeEngineWin::paintButton(WebCanvas* canvas, int part, int state, int classicState, const WebRect& rect)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    if (part == BP_CHECKBOX) {
+        switch (state) {
+        case CBS_UNCHECKEDNORMAL:
+            WEBKIT_ASSERT(classicState == dfcsNormal);
+            ctype = WebTestThemeControlWin::UncheckedBoxType;
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case CBS_UNCHECKEDHOT:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_HOT));
+            ctype = WebTestThemeControlWin::UncheckedBoxType;
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case CBS_UNCHECKEDPRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_PUSHED));
+            ctype = WebTestThemeControlWin::UncheckedBoxType;
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        case CBS_UNCHECKEDDISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_INACTIVE));
+            ctype = WebTestThemeControlWin::UncheckedBoxType;
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        case CBS_CHECKEDNORMAL:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED));
+            ctype = WebTestThemeControlWin::CheckedBoxType;
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case CBS_CHECKEDHOT:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_HOT));
+            ctype = WebTestThemeControlWin::CheckedBoxType;
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case CBS_CHECKEDPRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_PUSHED));
+            ctype = WebTestThemeControlWin::CheckedBoxType;
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        case CBS_CHECKEDDISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_INACTIVE));
+            ctype = WebTestThemeControlWin::CheckedBoxType;
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        case CBS_MIXEDNORMAL:
+            // Classic theme can't represent mixed state checkbox. We assume
+            // it's equivalent to unchecked.
+            WEBKIT_ASSERT(classicState == DFCS_BUTTONCHECK);
+            ctype = WebTestThemeControlWin::IndeterminateCheckboxType;
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case CBS_MIXEDHOT:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_HOT));
+            ctype = WebTestThemeControlWin::IndeterminateCheckboxType;
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case CBS_MIXEDPRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_PUSHED));
+            ctype = WebTestThemeControlWin::IndeterminateCheckboxType;
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        case CBS_MIXEDDISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_INACTIVE));
+            ctype = WebTestThemeControlWin::IndeterminateCheckboxType;
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+            break;
+        }
+    } else if (BP_RADIOBUTTON == part) {
+        switch (state) {
+        case RBS_UNCHECKEDNORMAL:
+            WEBKIT_ASSERT(classicState == DFCS_BUTTONRADIO);
+            ctype = WebTestThemeControlWin::UncheckedRadioType;
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case RBS_UNCHECKEDHOT:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_HOT));
+            ctype = WebTestThemeControlWin::UncheckedRadioType;
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case RBS_UNCHECKEDPRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_PUSHED));
+            ctype = WebTestThemeControlWin::UncheckedRadioType;
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        case RBS_UNCHECKEDDISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_INACTIVE));
+            ctype = WebTestThemeControlWin::UncheckedRadioType;
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        case RBS_CHECKEDNORMAL:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED));
+            ctype = WebTestThemeControlWin::CheckedRadioType;
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case RBS_CHECKEDHOT:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_HOT));
+            ctype = WebTestThemeControlWin::CheckedRadioType;
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case RBS_CHECKEDPRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_PUSHED));
+            ctype = WebTestThemeControlWin::CheckedRadioType;
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        case RBS_CHECKEDDISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_INACTIVE));
+            ctype = WebTestThemeControlWin::CheckedRadioType;
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+            break;
+        }
+    } else if (BP_PUSHBUTTON == part) {
+        switch (state) {
+        case PBS_NORMAL:
+            WEBKIT_ASSERT(classicState == DFCS_BUTTONPUSH);
+            ctype = WebTestThemeControlWin::PushButtonType;
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case PBS_HOT:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONPUSH | DFCS_HOT));
+            ctype = WebTestThemeControlWin::PushButtonType;
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case PBS_PRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONPUSH | DFCS_PUSHED));
+            ctype = WebTestThemeControlWin::PushButtonType;
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        case PBS_DISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_BUTTONPUSH | DFCS_INACTIVE));
+            ctype = WebTestThemeControlWin::PushButtonType;
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        case PBS_DEFAULTED:
+            WEBKIT_ASSERT(classicState == DFCS_BUTTONPUSH);
+            ctype = WebTestThemeControlWin::PushButtonType;
+            cstate = WebTestThemeControlWin::FocusedState;
+            break;
+
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+            break;
+        }
+    } else
+        WEBKIT_ASSERT_NOT_REACHED();
+
+    drawControl(canvas, rect, ctype, cstate);
+}
+
+void WebTestThemeEngineWin::paintMenuList(WebCanvas* canvas, int part, int state, int classicState, const WebRect& rect)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    if (CP_DROPDOWNBUTTON == part) {
+        ctype = WebTestThemeControlWin::DropDownButtonType;
+        switch (state) {
+        case CBXS_NORMAL:
+            WEBKIT_ASSERT(classicState == DFCS_MENUARROW);
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case CBXS_HOT:
+            WEBKIT_ASSERT(classicState == (DFCS_MENUARROW | DFCS_HOT));
+            cstate = WebTestThemeControlWin::HoverState;
+            break;
+
+        case CBXS_PRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_MENUARROW | DFCS_PUSHED));
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        case CBXS_DISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_MENUARROW | DFCS_INACTIVE));
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+            break;
+        }
+    } else
+        WEBKIT_ASSERT_NOT_REACHED();
+
+    drawControl(canvas, rect, ctype, cstate);
+}
+
+void WebTestThemeEngineWin::paintScrollbarArrow(WebCanvas* canvas, int state, int classicState, const WebRect& rect)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    switch (state) {
+    case ABS_UPNORMAL:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLUP);
+        ctype = WebTestThemeControlWin::UpArrowType;
+        cstate = WebTestThemeControlWin::NormalState;
+        break;
+
+    case ABS_DOWNNORMAL:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLDOWN);
+        ctype = WebTestThemeControlWin::DownArrowType;
+        cstate = WebTestThemeControlWin::NormalState;
+        break;
+
+    case ABS_LEFTNORMAL:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLLEFT);
+        ctype = WebTestThemeControlWin::LeftArrowType;
+        cstate = WebTestThemeControlWin::NormalState;
+        break;
+
+    case ABS_RIGHTNORMAL:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLRIGHT);
+        ctype = WebTestThemeControlWin::RightArrowType;
+        cstate = WebTestThemeControlWin::NormalState;
+        break;
+
+    case ABS_UPHOT:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLUP | DFCS_HOT));
+        ctype = WebTestThemeControlWin::UpArrowType;
+        cstate = WebTestThemeControlWin::HotState;
+        break;
+
+    case ABS_DOWNHOT:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_HOT));
+        ctype = WebTestThemeControlWin::DownArrowType;
+        cstate = WebTestThemeControlWin::HotState;
+        break;
+
+    case ABS_LEFTHOT:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLLEFT | DFCS_HOT));
+        ctype = WebTestThemeControlWin::LeftArrowType;
+        cstate = WebTestThemeControlWin::HotState;
+        break;
+
+    case ABS_RIGHTHOT:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLRIGHT | DFCS_HOT));
+        ctype = WebTestThemeControlWin::RightArrowType;
+        cstate = WebTestThemeControlWin::HotState;
+        break;
+
+    case ABS_UPHOVER:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLUP);
+        ctype = WebTestThemeControlWin::UpArrowType;
+        cstate = WebTestThemeControlWin::HoverState;
+        break;
+
+    case ABS_DOWNHOVER:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLDOWN);
+        ctype = WebTestThemeControlWin::DownArrowType;
+        cstate = WebTestThemeControlWin::HoverState;
+        break;
+
+    case ABS_LEFTHOVER:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLLEFT);
+        ctype = WebTestThemeControlWin::LeftArrowType;
+        cstate = WebTestThemeControlWin::HoverState;
+        break;
+
+    case ABS_RIGHTHOVER:
+        WEBKIT_ASSERT(classicState == DFCS_SCROLLRIGHT);
+        ctype = WebTestThemeControlWin::RightArrowType;
+        cstate = WebTestThemeControlWin::HoverState;
+        break;
+
+    case ABS_UPPRESSED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLUP | DFCS_PUSHED | DFCS_FLAT));
+        ctype = WebTestThemeControlWin::UpArrowType;
+        cstate = WebTestThemeControlWin::PressedState;
+        break;
+
+    case ABS_DOWNPRESSED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_PUSHED | DFCS_FLAT));
+        ctype = WebTestThemeControlWin::DownArrowType;
+        cstate = WebTestThemeControlWin::PressedState;
+        break;
+
+    case ABS_LEFTPRESSED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLLEFT | DFCS_PUSHED | DFCS_FLAT));
+        ctype = WebTestThemeControlWin::LeftArrowType;
+        cstate = WebTestThemeControlWin::PressedState;
+        break;
+
+    case ABS_RIGHTPRESSED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLRIGHT | DFCS_PUSHED | DFCS_FLAT));
+        ctype = WebTestThemeControlWin::RightArrowType;
+        cstate = WebTestThemeControlWin::PressedState;
+        break;
+
+    case ABS_UPDISABLED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLUP | DFCS_INACTIVE));
+        ctype = WebTestThemeControlWin::UpArrowType;
+        cstate = WebTestThemeControlWin::DisabledState;
+        break;
+
+    case ABS_DOWNDISABLED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_INACTIVE));
+        ctype = WebTestThemeControlWin::DownArrowType;
+        cstate = WebTestThemeControlWin::DisabledState;
+        break;
+
+    case ABS_LEFTDISABLED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLLEFT | DFCS_INACTIVE));
+        ctype = WebTestThemeControlWin::LeftArrowType;
+        cstate = WebTestThemeControlWin::DisabledState;
+        break;
+
+    case ABS_RIGHTDISABLED:
+        WEBKIT_ASSERT(classicState == (DFCS_SCROLLRIGHT | DFCS_INACTIVE));
+        ctype = WebTestThemeControlWin::RightArrowType;
+        cstate = WebTestThemeControlWin::DisabledState;
+        break;
+
+    default:
+        WEBKIT_ASSERT_NOT_REACHED();
+        break;
+    }
+
+    drawControl(canvas, rect, ctype, cstate);
+}
+
+void WebTestThemeEngineWin::paintScrollbarThumb(WebCanvas* canvas, int part, int state, int classicState, const WebRect& rect)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    switch (part) {
+    case SBP_THUMBBTNHORZ:
+        ctype = WebTestThemeControlWin::HorizontalScrollThumbType;
+        break;
+
+    case SBP_THUMBBTNVERT:
+        ctype = WebTestThemeControlWin::VerticalScrollThumbType;
+        break;
+
+    case SBP_GRIPPERHORZ:
+        ctype = WebTestThemeControlWin::HorizontalScrollGripType;
+        break;
+
+    case SBP_GRIPPERVERT:
+        ctype = WebTestThemeControlWin::VerticalScrollGripType;
+        break;
+
+    default:
+        WEBKIT_ASSERT_NOT_REACHED();
+        break;
+    }
+
+    switch (state) {
+    case SCRBS_NORMAL:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::NormalState;
+        break;
+
+    case SCRBS_HOT:
+        WEBKIT_ASSERT(classicState == DFCS_HOT);
+        cstate = WebTestThemeControlWin::HotState;
+        break;
+
+    case SCRBS_HOVER:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::HoverState;
+        break;
+
+    case SCRBS_PRESSED:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::PressedState;
+        break;
+
+    case SCRBS_DISABLED:
+        WEBKIT_ASSERT_NOT_REACHED(); // This should never happen in practice.
+        break;
+
+    default:
+        WEBKIT_ASSERT_NOT_REACHED();
+        break;
+    }
+
+    drawControl(canvas, rect, ctype, cstate);
+}
+
+void WebTestThemeEngineWin::paintScrollbarTrack(WebCanvas* canvas, int part, int state, int classicState, const WebRect& rect, const WebRect& alignRect)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    switch (part) {
+    case SBP_UPPERTRACKHORZ:
+        ctype = WebTestThemeControlWin::HorizontalScrollTrackBackType;
+        break;
+
+    case SBP_LOWERTRACKHORZ:
+        ctype = WebTestThemeControlWin::HorizontalScrollTrackForwardType;
+        break;
+
+    case SBP_UPPERTRACKVERT:
+        ctype = WebTestThemeControlWin::VerticalScrollTrackBackType;
+        break;
+
+    case SBP_LOWERTRACKVERT:
+        ctype = WebTestThemeControlWin::VerticalScrollTrackForwardType;
+        break;
+
+    default:
+        WEBKIT_ASSERT_NOT_REACHED();
+        break;
+    }
+
+    switch (state) {
+    case SCRBS_NORMAL:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::NormalState;
+        break;
+
+    case SCRBS_HOT:
+        WEBKIT_ASSERT_NOT_REACHED(); // This should never happen in practice.
+        break;
+
+    case SCRBS_HOVER:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::HoverState;
+        break;
+
+    case SCRBS_PRESSED:
+        WEBKIT_ASSERT_NOT_REACHED(); // This should never happen in practice.
+        break;
+
+    case SCRBS_DISABLED:
+        WEBKIT_ASSERT(classicState == DFCS_INACTIVE);
+        cstate = WebTestThemeControlWin::DisabledState;
+        break;
+
+    default:
+        WEBKIT_ASSERT_NOT_REACHED();
+        break;
+    }
+
+    drawControl(canvas, rect, ctype, cstate);
+}
+
+void WebTestThemeEngineWin::paintSpinButton(WebCanvas* canvas, int part, int state, int classicState, const WebRect& rect)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    if (part == SPNP_UP) {
+        ctype = WebTestThemeControlWin::UpArrowType;
+        switch (state) {
+        case UPS_NORMAL:
+            WEBKIT_ASSERT(classicState == DFCS_SCROLLUP);
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+        case UPS_DISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_SCROLLUP | DFCS_INACTIVE));
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+        case UPS_PRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_SCROLLUP | DFCS_PUSHED));
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+        case UPS_HOT:
+            WEBKIT_ASSERT(classicState == (DFCS_SCROLLUP | DFCS_HOT));
+            cstate = WebTestThemeControlWin::HoverState;
+            break;
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+        }
+    } else if (part == SPNP_DOWN) {
+        ctype = WebTestThemeControlWin::DownArrowType;
+        switch (state) {
+        case DNS_NORMAL:
+            WEBKIT_ASSERT(classicState == DFCS_SCROLLDOWN);
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+        case DNS_DISABLED:
+            WEBKIT_ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_INACTIVE));
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+        case DNS_PRESSED:
+            WEBKIT_ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_PUSHED));
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+        case DNS_HOT:
+            WEBKIT_ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_HOT));
+            cstate = WebTestThemeControlWin::HoverState;
+            break;
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+        }
+    } else
+        WEBKIT_ASSERT_NOT_REACHED();
+    drawControl(canvas, rect, ctype, cstate);
+}
+
+void WebTestThemeEngineWin::paintTextField(WebCanvas* canvas, int part, int state, int classicState, const WebRect& rect, WebColor color, bool fillContentArea, bool drawEdges)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    WEBKIT_ASSERT(EP_EDITTEXT == part);
+    ctype = WebTestThemeControlWin::TextFieldType;
+
+    switch (state) {
+    case ETS_NORMAL:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::NormalState;
+        break;
+
+    case ETS_HOT:
+        WEBKIT_ASSERT(classicState == DFCS_HOT);
+        cstate = WebTestThemeControlWin::HotState;
+        break;
+
+    case ETS_DISABLED:
+        WEBKIT_ASSERT(classicState == DFCS_INACTIVE);
+        cstate = WebTestThemeControlWin::DisabledState;
+        break;
+
+    case ETS_SELECTED:
+        WEBKIT_ASSERT(classicState == DFCS_PUSHED);
+        cstate = WebTestThemeControlWin::PressedState;
+        break;
+
+    case ETS_FOCUSED:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::FocusedState;
+        break;
+
+    case ETS_READONLY:
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::ReadOnlyState;
+        break;
+
+    default:
+        WEBKIT_ASSERT_NOT_REACHED();
+        break;
+    }
+
+    drawTextField(canvas, rect, ctype, cstate, drawEdges, fillContentArea, color);
+}
+
+void WebTestThemeEngineWin::paintTrackbar(WebCanvas* canvas, int part, int state, int classicState, const WebRect& rect)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::UnknownType;
+    WebTestThemeControlWin::State cstate = WebTestThemeControlWin::UnknownState;
+
+    if (TKP_THUMBBOTTOM == part) {
+        ctype = WebTestThemeControlWin::HorizontalSliderThumbType;
+        switch (state) {
+        case TUS_NORMAL:
+            WEBKIT_ASSERT(classicState == dfcsNormal);
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case TUS_HOT:
+            WEBKIT_ASSERT(classicState == DFCS_HOT);
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case TUS_DISABLED:
+            WEBKIT_ASSERT(classicState == DFCS_INACTIVE);
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        case TUS_PRESSED:
+            WEBKIT_ASSERT(classicState == DFCS_PUSHED);
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+            break;
+        }
+    } else if (TKP_THUMBVERT == part) {
+        ctype = WebTestThemeControlWin::VerticalSliderThumbType;
+        switch (state) {
+        case TUS_NORMAL:
+            WEBKIT_ASSERT(classicState == dfcsNormal);
+            cstate = WebTestThemeControlWin::NormalState;
+            break;
+
+        case TUS_HOT:
+            WEBKIT_ASSERT(classicState == DFCS_HOT);
+            cstate = WebTestThemeControlWin::HotState;
+            break;
+
+        case TUS_DISABLED:
+            WEBKIT_ASSERT(classicState == DFCS_INACTIVE);
+            cstate = WebTestThemeControlWin::DisabledState;
+            break;
+
+        case TUS_PRESSED:
+            WEBKIT_ASSERT(classicState == DFCS_PUSHED);
+            cstate = WebTestThemeControlWin::PressedState;
+            break;
+
+        default:
+            WEBKIT_ASSERT_NOT_REACHED();
+            break;
+        }
+    } else if (TKP_TRACK == part) {
+        ctype = WebTestThemeControlWin::HorizontalSliderTrackType;
+        WEBKIT_ASSERT(state == TRS_NORMAL);
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::NormalState;
+    } else if (TKP_TRACKVERT == part) {
+        ctype = WebTestThemeControlWin::VerticalSliderTrackType;
+        WEBKIT_ASSERT(state == TRVS_NORMAL);
+        WEBKIT_ASSERT(classicState == dfcsNormal);
+        cstate = WebTestThemeControlWin::NormalState;
+    } else
+        WEBKIT_ASSERT_NOT_REACHED();
+
+    drawControl(canvas, rect, ctype, cstate);
+}
+
+
+void WebTestThemeEngineWin::paintProgressBar(WebKit::WebCanvas* canvas, const WebKit::WebRect& barRect, const WebKit::WebRect& valueRect, bool determinate, double)
+{
+    WebTestThemeControlWin::Type ctype = WebTestThemeControlWin::ProgressBarType;
+    WebTestThemeControlWin::State cstate = determinate ? WebTestThemeControlWin::NormalState : WebTestThemeControlWin::IndeterminateState;
+    drawProgressBar(canvas, ctype, cstate, barRect, valueRect);
+}
+
+
+WebKit::WebSize WebTestThemeEngineWin::getSize(int part)
+{
+    return WebKit::WebSize();
+}
+
+}
diff --git a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.h b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h
similarity index 91%
rename from Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h
index 33fd612..84a3ec4 100644
--- a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebTestThemeEngineWin.h
@@ -44,16 +44,16 @@
 // choose to do so at some point.
 //
 
-#ifndef WebThemeEngineDRTWin_h
-#define WebThemeEngineDRTWin_h
+#ifndef WebTestThemeEngineWin_h
+#define WebTestThemeEngineWin_h
 
-#include "platform/win/WebThemeEngine.h"
-#include <wtf/Noncopyable.h>
+#include <public/win/WebThemeEngine.h>
 
-class WebThemeEngineDRTWin : public WebKit::WebThemeEngine {
-    WTF_MAKE_NONCOPYABLE(WebThemeEngineDRTWin);
+namespace WebTestRunner {
+
+class WebTestThemeEngineWin : public WebKit::WebThemeEngine {
 public:
-    WebThemeEngineDRTWin() { }
+    WebTestThemeEngineWin() { }
 
     // WebThemeEngine methods:
     virtual void paintButton(
@@ -97,4 +97,6 @@
     virtual WebKit::WebSize getSize(int part);
 };
 
-#endif // WebThemeEngineDRTWin_h
+}
+
+#endif // WebTestThemeEngineWin_h
diff --git a/Tools/DumpRenderTree/chromium/WebUserMediaClientMock.cpp b/Tools/DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.cpp
similarity index 69%
rename from Tools/DumpRenderTree/chromium/WebUserMediaClientMock.cpp
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.cpp
index 3878ff1..1813e18 100644
--- a/Tools/DumpRenderTree/chromium/WebUserMediaClientMock.cpp
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.cpp
@@ -29,27 +29,28 @@
  */
 
 #include "config.h"
-#if ENABLE(MEDIA_STREAM)
 
+#if ENABLE_WEBRTC
 #include "WebUserMediaClientMock.h"
 
 #include "MockConstraints.h"
-#include "Task.h"
 #include "WebDocument.h"
 #include "WebMediaStreamRegistry.h"
+#include "WebTestDelegate.h"
 #include "WebUserMediaRequest.h"
 #include <public/WebMediaConstraints.h>
-#include <public/WebMediaStreamDescriptor.h>
+#include <public/WebMediaStream.h>
 #include <public/WebMediaStreamSource.h>
+#include <public/WebMediaStreamTrack.h>
 #include <public/WebVector.h>
-#include <wtf/Assertions.h>
 
 using namespace WebKit;
-using namespace WebTestRunner;
+
+namespace WebTestRunner {
 
 class UserMediaRequestTask : public WebMethodTask<WebUserMediaClientMock> {
 public:
-    UserMediaRequestTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebMediaStreamDescriptor result)
+    UserMediaRequestTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebMediaStream result)
         : WebMethodTask<WebUserMediaClientMock>(object)
         , m_request(request)
         , m_result(result)
@@ -66,63 +67,71 @@
 
 private:
     WebUserMediaRequest m_request;
-    WebMediaStreamDescriptor m_result;
+    WebMediaStream m_result;
 };
 
 ////////////////////////////////
 
-class MockExtraData : public WebMediaStreamDescriptor::ExtraData {
+class MockExtraData : public WebMediaStream::ExtraData {
 public:
     int foo;
 };
 
-PassOwnPtr<WebUserMediaClientMock> WebUserMediaClientMock::create()
+WebUserMediaClientMock::WebUserMediaClientMock(WebTestDelegate* delegate)
+    : m_delegate(delegate)
 {
-    return adoptPtr(new WebUserMediaClientMock());
 }
 
 void WebUserMediaClientMock::requestUserMedia(const WebUserMediaRequest& streamRequest, const WebVector<WebMediaStreamSource>& audioSourcesVector, const WebVector<WebMediaStreamSource>& videoSourcesVector)
 {
-    ASSERT(!streamRequest.isNull());
+    WEBKIT_ASSERT(!streamRequest.isNull());
     WebUserMediaRequest request = streamRequest;
 
     if (request.ownerDocument().isNull() || !request.ownerDocument().frame()) {
-        postTask(new UserMediaRequestTask(this, request, WebMediaStreamDescriptor()));
+        m_delegate->postTask(new UserMediaRequestTask(this, request, WebMediaStream()));
         return;
     }
 
     WebMediaConstraints constraints = request.audioConstraints();
     if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints)) {
-        postTask(new UserMediaRequestTask(this, request, WebMediaStreamDescriptor()));
+        m_delegate->postTask(new UserMediaRequestTask(this, request, WebMediaStream()));
         return;
     }
     constraints = request.videoConstraints();
     if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints)) {
-        postTask(new UserMediaRequestTask(this, request, WebMediaStreamDescriptor()));
+        m_delegate->postTask(new UserMediaRequestTask(this, request, WebMediaStream()));
         return;
     }
 
     const size_t zero = 0;
     const size_t one = 1;
-    WebVector<WebMediaStreamSource> audioSources(request.audio() ? one : zero);
-    WebVector<WebMediaStreamSource> videoSources(request.video() ? one : zero);
+    WebVector<WebMediaStreamTrack> audioTracks(request.audio() ? one : zero);
+    WebVector<WebMediaStreamTrack> videoTracks(request.video() ? one : zero);
 
-    if (request.audio())
-        audioSources[0].initialize("MockAudioDevice#1", WebMediaStreamSource::TypeAudio, "Mock audio device");
+    if (request.audio()) {
+        WebMediaStreamSource source;
+        source.initialize("MockAudioDevice#1", WebMediaStreamSource::TypeAudio, "Mock audio device");
+        audioTracks[0].initialize(source);
+    }
 
-    if (request.video())
-        videoSources[0].initialize("MockVideoDevice#1", WebMediaStreamSource::TypeVideo, "Mock video device");
+    if (request.video()) {
+        WebMediaStreamSource source;
+        source.initialize("MockVideoDevice#1", WebMediaStreamSource::TypeVideo, "Mock video device");
+        videoTracks[0].initialize(source);
+    }
 
-    WebMediaStreamDescriptor stream;
-    stream.initialize("foobar", audioSources, videoSources);
+    WebMediaStream stream;
+    stream.initialize(audioTracks, videoTracks);
 
     stream.setExtraData(new MockExtraData());
 
-    postTask(new UserMediaRequestTask(this, request, stream));
+    m_delegate->postTask(new UserMediaRequestTask(this, request, stream));
 }
 
 void WebUserMediaClientMock::cancelUserMediaRequest(const WebUserMediaRequest&)
 {
 }
 
-#endif // ENABLE(MEDIA_STREAM)
+}
+
+#endif // ENABLE_WEBRTC
diff --git a/Tools/DumpRenderTree/chromium/WebUserMediaClientMock.h b/Tools/DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.h
similarity index 86%
rename from Tools/DumpRenderTree/chromium/WebUserMediaClientMock.h
rename to Tools/DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.h
index ef4cb51..ec992a0 100644
--- a/Tools/DumpRenderTree/chromium/WebUserMediaClientMock.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/WebUserMediaClientMock.h
@@ -31,33 +31,33 @@
 #ifndef WebUserMediaClientMock_h
 #define WebUserMediaClientMock_h
 
-#if ENABLE(MEDIA_STREAM)
-
+#include "TestCommon.h"
 #include "WebTask.h"
 #include "WebUserMediaClient.h"
-#include "webkit/support/test_media_stream_client.h"
 #include <public/WebCommon.h>
 #include <public/WebString.h>
 #include <public/WebURL.h>
-#include <wtf/PassOwnPtr.h>
+
+namespace WebTestRunner {
+
+class WebTestDelegate;
 
 class WebUserMediaClientMock : public WebKit::WebUserMediaClient {
 public:
-    static PassOwnPtr<WebUserMediaClientMock> create();
+    explicit WebUserMediaClientMock(WebTestDelegate*);
     ~WebUserMediaClientMock() { }
 
     virtual void requestUserMedia(const WebKit::WebUserMediaRequest&, const WebKit::WebVector<WebKit::WebMediaStreamSource>&, const WebKit::WebVector<WebKit::WebMediaStreamSource>&) OVERRIDE;
     virtual void cancelUserMediaRequest(const WebKit::WebUserMediaRequest&);
 
     // Task related methods
-    WebTestRunner::WebTaskList* taskList() { return &m_taskList; }
+    WebTaskList* taskList() { return &m_taskList; }
 
 private:
-    WebUserMediaClientMock() { }
-
-    WebTestRunner::WebTaskList m_taskList;
+    WebTaskList m_taskList;
+    WebTestDelegate* m_delegate;
 };
 
-#endif // ENABLE(MEDIA_STREAM)
+}
 
 #endif // WebUserMediaClientMock_h
diff --git a/Tools/DumpRenderTree/chromium/MockConstraints.h b/Tools/DumpRenderTree/chromium/TestRunner/src/config.h
similarity index 79%
copy from Tools/DumpRenderTree/chromium/MockConstraints.h
copy to Tools/DumpRenderTree/chromium/TestRunner/src/config.h
index 6bf0da9..a2fc6f4 100644
--- a/Tools/DumpRenderTree/chromium/MockConstraints.h
+++ b/Tools/DumpRenderTree/chromium/TestRunner/src/config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Google Inc. All rights reserved.
+ * Copyright (C) 2013 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -28,22 +28,9 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef MockConstraints_h
-#define MockConstraints_h
+#ifndef config_h
+#define config_h
 
-#if ENABLE(MEDIA_STREAM)
+#define USE(feature) (defined WTF_USE_##feature && WTF_USE_##feature)
 
-namespace WebKit {
-class WebMediaConstraints;
-}
-
-namespace MockConstraints {
-
-bool verifyConstraints(const WebKit::WebMediaConstraints&);
-
-} // namespace MockConstraints
-
-#endif // ENABLE(MEDIA_STREAM)
-
-#endif // MockConstraints_h
-
+#endif // config_h
diff --git a/Tools/DumpRenderTree/chromium/TestShell.cpp b/Tools/DumpRenderTree/chromium/TestShell.cpp
index 4db1e32..942ec1d 100644
--- a/Tools/DumpRenderTree/chromium/TestShell.cpp
+++ b/Tools/DumpRenderTree/chromium/TestShell.cpp
@@ -33,9 +33,9 @@
 
 #include "DRTDevToolsAgent.h"
 #include "DRTDevToolsClient.h"
-#include "DRTTestRunner.h"
+#include "MockPlatform.h"
 #include "MockWebPrerenderingSupport.h"
-#include "WebCache.h"
+#include "WebArrayBufferView.h"
 #include "WebDataSource.h"
 #include "WebDocument.h"
 #include "WebElement.h"
@@ -43,14 +43,11 @@
 #include "WebHistoryItem.h"
 #include "WebIDBFactory.h"
 #include "WebTestingSupport.h"
-#include "WebPermissions.h"
-#include "WebRuntimeFeatures.h"
-#include "WebScriptController.h"
 #include "WebSettings.h"
 #include "WebTestProxy.h"
+#include "WebTestRunner.h"
 #include "WebView.h"
 #include "WebViewHost.h"
-#include "platform/WebArrayBufferView.h"
 #include "skia/ext/platform_canvas.h"
 #include "webkit/support/webkit_support.h"
 #include "webkit/support/webkit_support_gfx.h"
@@ -112,42 +109,19 @@
     , m_allowExternalPages(false)
     , m_acceleratedCompositingForVideoEnabled(false)
     , m_acceleratedCompositingForFixedPositionEnabled(false)
+    , m_acceleratedCompositingForOverflowScrollEnabled(false)
     , m_softwareCompositingEnabled(false)
     , m_threadedCompositingEnabled(false)
     , m_forceCompositingMode(false)
+    , m_threadedHTMLParser(true)
     , m_accelerated2dCanvasEnabled(false)
-    , m_deferred2dCanvasEnabled(false)
-    , m_acceleratedPaintingEnabled(false)
+    , m_perTilePaintingEnabled(false)
     , m_deferredImageDecodingEnabled(false)
     , m_stressOpt(false)
     , m_stressDeopt(false)
     , m_dumpWhenFinished(true)
     , m_isDisplayingModalDialog(false)
 {
-    WebRuntimeFeatures::enableDataTransferItems(true);
-    WebRuntimeFeatures::enableDeviceMotion(false);
-    WebRuntimeFeatures::enableGeolocation(true);
-    WebRuntimeFeatures::enablePointerLock(true);
-    WebRuntimeFeatures::enableIndexedDatabase(true);
-    WebRuntimeFeatures::enableInputTypeDateTime(true);
-    WebRuntimeFeatures::enableInputTypeDateTimeLocal(true);
-    WebRuntimeFeatures::enableInputTypeMonth(true);
-    WebRuntimeFeatures::enableInputTypeTime(true);
-    WebRuntimeFeatures::enableInputTypeWeek(true);
-    WebRuntimeFeatures::enableFileSystem(true);
-    WebRuntimeFeatures::enableJavaScriptI18NAPI(true);
-    WebRuntimeFeatures::enableMediaSource(true);
-    WebRuntimeFeatures::enableEncryptedMedia(true);
-    WebRuntimeFeatures::enableMediaStream(true);
-    WebRuntimeFeatures::enablePeerConnection(true);
-    WebRuntimeFeatures::enableWebAudio(true);
-    WebRuntimeFeatures::enableVideoTrack(true);
-    WebRuntimeFeatures::enableGamepad(true);
-    WebRuntimeFeatures::enableShadowDOM(true);
-    WebRuntimeFeatures::enableStyleScoped(true);
-    WebRuntimeFeatures::enableScriptedSpeech(true);
-    WebRuntimeFeatures::enableRequestAutocomplete(true);
-
     // 30 second is the same as the value in Mac DRT.
     // If we use a value smaller than the timeout value of
     // (new-)run-webkit-tests, (new-)run-webkit-tests misunderstands that a
@@ -155,23 +129,25 @@
     m_timeout = 30 * 1000;
 }
 
-void TestShell::initialize()
+void TestShell::initialize(MockPlatform* platformSupport)
 {
-    m_webPermissions = adoptPtr(new WebPermissions(this));
     m_testInterfaces = adoptPtr(new WebTestInterfaces());
-    m_testRunner = adoptPtr(new DRTTestRunner(this));
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
-    m_notificationPresenter = adoptPtr(new NotificationPresenter(this));
-#endif
+    platformSupport->setInterfaces(m_testInterfaces.get());
+    m_devToolsTestInterfaces = adoptPtr(new WebTestInterfaces());
 #if ENABLE(LINK_PRERENDER)
     m_prerenderingSupport = adoptPtr(new MockWebPrerenderingSupport());
 #endif
+#if !defined(USE_DEFAULT_RENDER_THEME) && (OS(WINDOWS) || OS(MAC_OS_X))
+    // Set theme engine.
+    webkit_support::SetThemeEngine(m_testInterfaces->themeEngine());
+#endif
+
 
     WTF::initializeThreading();
 
     if (m_threadedCompositingEnabled)
         m_webCompositorThread = adoptPtr(WebKit::Platform::current()->createThread("Compositor"));
-    WebKit::Platform::current()->compositorSupport()->initialize(m_webCompositorThread.get());
+    webkit_support::SetThreadedCompositorEnabled(m_threadedCompositingEnabled);
 
     createMainWindow();
 }
@@ -179,17 +155,21 @@
 void TestShell::createMainWindow()
 {
     m_drtDevToolsAgent = adoptPtr(new DRTDevToolsAgent);
-    m_webViewHost = adoptPtr(createNewWindow(WebURL(), m_drtDevToolsAgent.get()));
+    m_webViewHost = adoptPtr(createNewWindow(WebURL(), m_drtDevToolsAgent.get(), m_testInterfaces.get()));
     m_webView = m_webViewHost->webView();
     m_testInterfaces->setDelegate(m_webViewHost.get());
-    m_testInterfaces->setWebView(m_webView);
+    m_testInterfaces->setWebView(m_webView, m_webViewHost->proxy());
     m_drtDevToolsAgent->setWebView(m_webView);
 }
 
 TestShell::~TestShell()
 {
+    if (m_webViewHost)
+        m_webViewHost->shutdown();
     m_testInterfaces->setDelegate(0);
-    m_testInterfaces->setWebView(0);
+    m_testInterfaces->setWebView(0, 0);
+    m_devToolsTestInterfaces->setDelegate(0);
+    m_devToolsTestInterfaces->setWebView(0, 0);
     m_drtDevToolsAgent->setWebView(0);
 }
 
@@ -206,9 +186,11 @@
             ASSERT(false);
             return;
         }
-        m_devTools = createNewWindow(url);
+        m_devTools = createNewWindow(url, 0, m_devToolsTestInterfaces.get());
         m_devTools->webView()->settings()->setMemoryInfoEnabled(true);
-        m_devTools->setLogConsoleOutput(false);
+        m_devTools->proxy()->setLogConsoleOutput(false);
+        m_devToolsTestInterfaces->setDelegate(m_devTools);
+        m_devToolsTestInterfaces->setWebView(m_devTools->webView(), m_devTools->proxy());
         ASSERT(m_devTools);
         createDRTDevToolsClient(m_drtDevToolsAgent.get());
     }
@@ -221,6 +203,8 @@
         m_devTools->webView()->settings()->setMemoryInfoEnabled(false);
         m_drtDevToolsAgent->reset();
         m_drtDevToolsClient.clear();
+        m_devToolsTestInterfaces->setDelegate(0);
+        m_devToolsTestInterfaces->setWebView(0, 0);
         closeWindow(m_devTools);
         m_devTools = 0;
     }
@@ -232,11 +216,12 @@
     m_prefs.acceleratedCompositingEnabled = true;
     m_prefs.acceleratedCompositingForVideoEnabled = m_acceleratedCompositingForVideoEnabled;
     m_prefs.acceleratedCompositingForFixedPositionEnabled = m_acceleratedCompositingForFixedPositionEnabled;
+    m_prefs.acceleratedCompositingForOverflowScrollEnabled = m_acceleratedCompositingForOverflowScrollEnabled;
     m_prefs.forceCompositingMode = m_forceCompositingMode;
     m_prefs.accelerated2dCanvasEnabled = m_accelerated2dCanvasEnabled;
-    m_prefs.deferred2dCanvasEnabled = m_deferred2dCanvasEnabled;
-    m_prefs.acceleratedPaintingEnabled = m_acceleratedPaintingEnabled;
+    m_prefs.perTilePaintingEnabled = m_perTilePaintingEnabled;
     m_prefs.deferredImageDecodingEnabled = m_deferredImageDecodingEnabled;
+    m_prefs.threadedHTMLParser = m_threadedHTMLParser;
     m_prefs.applyTo(&webView);
 }
 
@@ -245,41 +230,26 @@
     ASSERT(params.testUrl.isValid());
     m_dumpPixelsForCurrentTest = shouldDumpPixels;
     m_testIsPreparing = true;
+    m_testInterfaces->setTestIsRunning(true);
     m_params = params;
     string testUrl = m_params.testUrl.spec();
-
-    m_testRunner->setShouldGeneratePixelResults(shouldDumpPixels);
-
-    if (testUrl.find("loading/") != string::npos
-        || testUrl.find("loading\\") != string::npos)
-        m_testRunner->setShouldDumpFrameLoadCallbacks(true);
+    m_testInterfaces->configureForTestWithURL(m_params.testUrl, shouldDumpPixels);
 
     if (testUrl.find("compositing/") != string::npos || testUrl.find("compositing\\") != string::npos) {
         if (!m_softwareCompositingEnabled)
             m_prefs.accelerated2dCanvasEnabled = true;
         m_prefs.acceleratedCompositingForVideoEnabled = true;
-        m_prefs.deferred2dCanvasEnabled = true;
         m_prefs.mockScrollbarsEnabled = true;
         m_prefs.applyTo(m_webView);
     }
 
-    if (testUrl.find("/dumpAsText/") != string::npos
-        || testUrl.find("\\dumpAsText\\") != string::npos) {
-        m_testRunner->setShouldDumpAsText(true);
-        m_testRunner->setShouldGeneratePixelResults(false);
-    }
-
-    if (testUrl.find("/inspector/") != string::npos
-        || testUrl.find("\\inspector\\") != string::npos)
-        showDevTools();
-
-    if (m_params.debugLayerTree)
-        m_testRunner->setShowDebugLayerTree(true);
-
     if (m_dumpWhenFinished)
         m_printer.handleTestHeader(testUrl.c_str());
     loadURL(m_params.testUrl);
 
+    if (m_devTools)
+        this->setFocus(m_devTools->webView(), true);
+
     m_testIsPreparing = false;
     waitTestFinished();
 }
@@ -305,16 +275,9 @@
 void TestShell::resetTestController()
 {
     resetWebSettings(*webView());
-    m_webPermissions->reset();
     m_testInterfaces->resetAll();
-    m_testRunner->reset();
+    m_devToolsTestInterfaces->resetAll();
     m_webViewHost->reset();
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
-    m_notificationPresenter->reset();
-#endif
-#if OS(ANDROID)
-    webkit_support::ReleaseMediaResources();
-#endif
     m_drtDevToolsAgent->reset();
     if (m_drtDevToolsClient)
         m_drtDevToolsClient->reset();
@@ -323,12 +286,11 @@
     webView()->setFixedLayoutSize(WebSize(0, 0));
     webView()->mainFrame()->clearOpener();
     WebTestingSupport::resetInternalsObject(webView()->mainFrame());
-    WebCache::clear();
 }
 
 void TestShell::loadURL(const WebURL& url)
 {
-    m_webViewHost->loadURLForFrame(url, WebString());
+    m_webViewHost->loadURLForFrame(url, string());
 }
 
 void TestShell::reload()
@@ -372,11 +334,15 @@
     }
 }
 
-void TestShell::testFinished()
+void TestShell::testFinished(WebViewHost* host)
 {
+    if (host == m_devTools)
+        return;
+
     if (!m_testIsPending)
         return;
     m_testIsPending = false;
+    m_testInterfaces->setTestIsRunning(false);
     if (m_dumpWhenFinished)
         dump();
     webkit_support::QuitMessageLoop();
@@ -385,200 +351,22 @@
 void TestShell::testTimedOut()
 {
     m_printer.handleTimedOut();
-    testFinished();
-}
-
-void TestShell::setPerTilePaintingEnabled(bool enabled)
-{
-    Platform::current()->compositorSupport()->setPerTilePaintingEnabled(enabled);
-}
-
-void TestShell::setAcceleratedAnimationEnabled(bool enabled)
-{
-    Platform::current()->compositorSupport()->setAcceleratedAnimationEnabled(enabled);
-}
-
-static string dumpDocumentText(WebFrame* frame)
-{
-    // We use the document element's text instead of the body text here because
-    // not all documents have a body, such as XML documents.
-    WebElement documentElement = frame->document().documentElement();
-    if (documentElement.isNull())
-        return string();
-    return documentElement.innerText().utf8();
-}
-
-static string dumpFramesAsText(WebFrame* frame, bool recursive)
-{
-    string result;
-
-    // Add header for all but the main frame. Skip empty frames.
-    if (frame->parent() && !frame->document().documentElement().isNull()) {
-        result.append("\n--------\nFrame: '");
-        result.append(frame->uniqueName().utf8().data());
-        result.append("'\n--------\n");
-    }
-
-    result.append(dumpDocumentText(frame));
-    result.append("\n");
-
-    if (recursive) {
-        for (WebFrame* child = frame->firstChild(); child; child = child->nextSibling())
-            result.append(dumpFramesAsText(child, recursive));
-    }
-
-    return result;
-}
-
-static string dumpFramesAsPrintedText(WebFrame* frame, bool recursive)
-{
-    string result;
-
-    // Cannot do printed format for anything other than HTML
-    if (!frame->document().isHTMLDocument())
-        return string();
-
-    // Add header for all but the main frame. Skip empty frames.
-    if (frame->parent() && !frame->document().documentElement().isNull()) {
-        result.append("\n--------\nFrame: '");
-        result.append(frame->uniqueName().utf8().data());
-        result.append("'\n--------\n");
-    }
-
-    result.append(frame->renderTreeAsText(WebFrame::RenderAsTextPrinting).utf8());
-    result.append("\n");
-
-    if (recursive) {
-        for (WebFrame* child = frame->firstChild(); child; child = child->nextSibling())
-            result.append(dumpFramesAsPrintedText(child, recursive));
-    }
-
-    return result;
-}
-
-static void dumpFrameScrollPosition(WebFrame* frame, bool recursive)
-{
-    WebSize offset = frame->scrollOffset();
-    if (offset.width > 0 || offset.height > 0) {
-        if (frame->parent())
-            printf("frame '%s' ", frame->uniqueName().utf8().data());
-        printf("scrolled to %d,%d\n", offset.width, offset.height);
-    }
-
-    if (!recursive)
-        return;
-    for (WebFrame* child = frame->firstChild(); child; child = child->nextSibling())
-        dumpFrameScrollPosition(child, recursive);
-}
-
-struct ToLower {
-    char16 operator()(char16 c) { return tolower(c); }
-};
-
-// FIXME: Eliminate std::transform(), std::vector, and std::sort().
-
-// Returns True if item1 < item2.
-static bool HistoryItemCompareLess(const WebHistoryItem& item1, const WebHistoryItem& item2)
-{
-    string16 target1 = item1.target();
-    string16 target2 = item2.target();
-    std::transform(target1.begin(), target1.end(), target1.begin(), ToLower());
-    std::transform(target2.begin(), target2.end(), target2.begin(), ToLower());
-    return target1 < target2;
-}
-
-static string normalizeLayoutTestURLInternal(const string& url)
-{
-    string result = url;
-    size_t pos;
-    if (!url.find(fileUrlPattern) && ((pos = url.find(layoutTestsPattern)) != string::npos)) {
-        // adjust file URLs to match upstream results.
-        result.replace(0, pos + layoutTestsPatternSize, fileTestPrefix);
-    } else if (!url.find(dataUrlPattern)) {
-        // URL-escape data URLs to match results upstream.
-        string path = url.substr(dataUrlPatternSize);
-        result.replace(dataUrlPatternSize, url.length(), path);
-    }
-    return result;
-}
-
-static string dumpHistoryItem(const WebHistoryItem& item, int indent, bool isCurrent)
-{
-    string result;
-
-    if (isCurrent) {
-        result.append("curr->");
-        result.append(indent - 6, ' '); // 6 == "curr->".length()
-    } else
-        result.append(indent, ' ');
-
-    string url = normalizeLayoutTestURLInternal(item.urlString().utf8());
-    result.append(url);
-    if (!item.target().isEmpty()) {
-        result.append(" (in frame \"");
-        result.append(item.target().utf8());
-        result.append("\")");
-    }
-    if (item.isTargetItem())
-        result.append("  **nav target**");
-    result.append("\n");
-
-    const WebVector<WebHistoryItem>& children = item.children();
-    if (!children.isEmpty()) {
-        // Must sort to eliminate arbitrary result ordering which defeats
-        // reproducible testing.
-        // FIXME: WebVector should probably just be a std::vector!!
-        std::vector<WebHistoryItem> sortedChildren;
-        for (size_t i = 0; i < children.size(); ++i)
-            sortedChildren.push_back(children[i]);
-        std::sort(sortedChildren.begin(), sortedChildren.end(), HistoryItemCompareLess);
-        for (size_t i = 0; i < sortedChildren.size(); ++i)
-            result += dumpHistoryItem(sortedChildren[i], indent + 4, false);
-    }
-
-    return result;
-}
-
-static void dumpBackForwardList(const TestNavigationController& navigationController, string& result)
-{
-    result.append("\n============== Back Forward List ==============\n");
-    for (int index = 0; index < navigationController.entryCount(); ++index) {
-        int currentIndex = navigationController.lastCommittedEntryIndex();
-        WebHistoryItem historyItem = navigationController.entryAtIndex(index)->contentState();
-        if (historyItem.isNull()) {
-            historyItem.initialize();
-            historyItem.setURLString(navigationController.entryAtIndex(index)->URL().spec().utf16());
-        }
-        result.append(dumpHistoryItem(historyItem, 8, index == currentIndex));
-    }
-    result.append("===============================================\n");
-}
-
-string TestShell::dumpAllBackForwardLists()
-{
-    string result;
-    for (unsigned i = 0; i < m_windowList.size(); ++i)
-        dumpBackForwardList(*m_windowList[i]->navigationController(), result);
-    return result;
+    testFinished(webViewHost());
 }
 
 void TestShell::dump()
 {
-    WebScriptController::flushConsoleMessages();
-
     // Dump the requested representation.
     WebFrame* frame = m_webView->mainFrame();
     if (!frame)
         return;
-    bool shouldDumpAsText = m_testRunner->shouldDumpAsText();
-    bool shouldDumpAsAudio = m_testRunner->shouldDumpAsAudio();
-    bool shouldGeneratePixelResults = m_testRunner->shouldGeneratePixelResults();
-    bool shouldDumpAsPrinted = m_testRunner->isPrinting();
+    bool shouldDumpAsAudio = m_testInterfaces->testRunner()->shouldDumpAsAudio();
+    bool shouldGeneratePixelResults = m_testInterfaces->testRunner()->shouldGeneratePixelResults();
     bool dumpedAnything = false;
 
     if (shouldDumpAsAudio) {
-        const WebKit::WebArrayBufferView& webArrayBufferView = m_testRunner->audioData();
-        m_printer.handleAudio(webArrayBufferView.baseAddress(), webArrayBufferView.byteLength());
+        const WebKit::WebArrayBufferView* webArrayBufferView = m_testInterfaces->testRunner()->audioData();
+        m_printer.handleAudio(webArrayBufferView->baseAddress(), webArrayBufferView->byteLength());
         m_printer.handleAudioFooter();
         m_printer.handleTestFooter(true);
 
@@ -590,33 +378,9 @@
     if (m_params.dumpTree) {
         dumpedAnything = true;
         m_printer.handleTextHeader();
-        // Text output: the test page can request different types of output
-        // which we handle here.
-        if (!shouldDumpAsText) {
-            // Plain text pages should be dumped as text
-            string mimeType = frame->dataSource()->response().mimeType().utf8();
-            if (mimeType == "text/plain") {
-                shouldDumpAsText = true;
-                shouldGeneratePixelResults = false;
-            }
-        }
-        if (shouldDumpAsText) {
-            bool recursive = m_testRunner->shouldDumpChildFramesAsText();
-            string dataUtf8 = shouldDumpAsPrinted ? dumpFramesAsPrintedText(frame, recursive) : dumpFramesAsText(frame, recursive);
-            if (fwrite(dataUtf8.c_str(), 1, dataUtf8.size(), stdout) != dataUtf8.size())
-                FATAL("Short write to stdout, disk full?\n");
-        } else {
-          WebFrame::RenderAsTextControls renderTextBehavior = WebFrame::RenderAsTextNormal;
-            if (shouldDumpAsPrinted)
-                renderTextBehavior |= WebFrame::RenderAsTextPrinting;
-            if (m_params.debugRenderTree)
-                renderTextBehavior |= WebFrame::RenderAsTextDebug;
-            printf("%s", frame->renderTreeAsText(renderTextBehavior).utf8().data());
-            bool recursive = m_testRunner->shouldDumpChildFrameScrollPositions();
-            dumpFrameScrollPosition(frame, recursive);
-        }
-        if (m_testRunner->shouldDumpBackForwardList())
-            printf("%s", dumpAllBackForwardLists().c_str());
+        string dataUtf8 = m_webViewHost->proxy()->captureTree(m_params.debugRenderTree);
+        if (fwrite(dataUtf8.c_str(), 1, dataUtf8.size(), stdout) != dataUtf8.size())
+            FATAL("Short write to stdout, disk full?\n");
     }
     if (dumpedAnything && m_params.printSeparators)
         m_printer.handleTextFooter();
@@ -626,43 +390,7 @@
         // command line (for the dump pixels argument), and the MD5 sum to
         // stdout.
         dumpedAnything = true;
-        m_webView->layout();
-        if (m_testRunner->testRepaint()) {
-            WebSize viewSize = m_webView->size();
-            int width = viewSize.width;
-            int height = viewSize.height;
-            if (m_testRunner->sweepHorizontally()) {
-                for (WebRect column(0, 0, 1, height); column.x < width; column.x++)
-                    m_webViewHost->paintRect(column);
-            } else {
-                for (WebRect line(0, 0, width, 1); line.y < height; line.y++)
-                    m_webViewHost->paintRect(line);
-            }
-        } else if (m_testRunner->isPrinting())
-            m_webViewHost->paintPagesWithBoundaries();
-        else
-            m_webViewHost->paintInvalidatedRegion();
-
-        // See if we need to draw the selection bounds rect. Selection bounds
-        // rect is the rect enclosing the (possibly transformed) selection.
-        // The rect should be drawn after everything is laid out and painted.
-        if (m_testRunner->shouldDumpSelectionRect()) {
-            // If there is a selection rect - draw a red 1px border enclosing rect
-            WebRect wr = frame->selectionBoundsRect();
-            if (!wr.isEmpty()) {
-                // Render a red rectangle bounding selection rect
-                SkPaint paint;
-                paint.setColor(0xFFFF0000); // Fully opaque red
-                paint.setStyle(SkPaint::kStroke_Style);
-                paint.setFlags(SkPaint::kAntiAlias_Flag);
-                paint.setStrokeWidth(1.0f);
-                SkIRect rect; // Bounding rect
-                rect.set(wr.x, wr.y, wr.x + wr.width, wr.y + wr.height);
-                m_webViewHost->canvas()->drawIRect(rect, paint);
-            }
-        }
-
-        dumpImage(m_webViewHost->canvas());
+        dumpImage(m_webViewHost->proxy()->capturePixels());
     }
     m_printer.handleTestFooter(dumpedAnything);
     fflush(stdout);
@@ -739,32 +467,34 @@
 void TestShell::bindJSObjectsToWindow(WebFrame* frame)
 {
     WebTestingSupport::injectInternalsObject(frame);
-    m_testInterfaces->bindTo(frame);
-    m_testRunner->bindToJavascript(frame, WebString::fromUTF8("testRunner"));
-    m_testRunner->bindToJavascript(frame, WebString::fromUTF8("layoutTestController"));
+    if (m_devTools && m_devTools->webView() == frame->view())
+        m_devToolsTestInterfaces->bindTo(frame);
+    else
+        m_testInterfaces->bindTo(frame);
 }
 
 WebViewHost* TestShell::createNewWindow(const WebKit::WebURL& url)
 {
-    return createNewWindow(url, 0);
+    return createNewWindow(url, 0, m_testInterfaces.get());
 }
 
-WebViewHost* TestShell::createNewWindow(const WebKit::WebURL& url, DRTDevToolsAgent* devToolsAgent)
+WebViewHost* TestShell::createNewWindow(const WebKit::WebURL& url, DRTDevToolsAgent* devToolsAgent, WebTestInterfaces *testInterfaces)
 {
-    WebTestRunner::WebTestProxy<WebViewHost, TestShell*>* host = new WebTestRunner::WebTestProxy<WebViewHost, TestShell*>(this);
-    host->setInterfaces(m_testInterfaces.get());
+    WebTestProxy<WebViewHost, TestShell*>* host = new WebTestProxy<WebViewHost, TestShell*>(this);
+    host->setInterfaces(testInterfaces);
     if (m_webViewHost)
         host->setDelegate(m_webViewHost.get());
     else
         host->setDelegate(host);
+    host->setProxy(host);
     WebView* view = WebView::create(host);
-    view->setPermissionClient(webPermissions());
+    view->setPermissionClient(testInterfaces->testRunner()->webPermissions());
     view->setDevToolsAgentClient(devToolsAgent);
     host->setWebWidget(view);
     m_prefs.applyTo(view);
     view->initializeMainFrame(host);
     m_windowList.append(host);
-    host->loadURLForFrame(url, WebString());
+    host->loadURLForFrame(url, string());
     return host;
 }
 
@@ -780,6 +510,7 @@
     if (window->webWidget() == m_focusedWidget)
         focusedWidget = 0;
 
+    window->shutdown();
     delete window;
     // We set the focused widget after deleting the web view host because it
     // can change the focus.
@@ -814,7 +545,23 @@
     return m_windowList.size();
 }
 
-string TestShell::normalizeLayoutTestURL(const string& url)
+void TestShell::captureHistoryForWindow(size_t windowIndex, WebVector<WebHistoryItem>* history, size_t* currentEntryIndex)
 {
-    return normalizeLayoutTestURLInternal(url);
+    ASSERT(history);
+    ASSERT(currentEntryIndex);
+    if (windowIndex >= m_windowList.size())
+        return;
+    TestNavigationController& navigationController = *m_windowList[windowIndex]->navigationController();
+    size_t entryCount = navigationController.entryCount();
+    WebVector<WebHistoryItem> result(entryCount);
+    *currentEntryIndex = navigationController.lastCommittedEntryIndex();
+    for (size_t index = 0; index < entryCount; ++index) {
+        WebHistoryItem historyItem = navigationController.entryAtIndex(index)->contentState();
+        if (historyItem.isNull()) {
+            historyItem.initialize();
+            historyItem.setURLString(navigationController.entryAtIndex(index)->URL().spec().utf16());
+        }
+        result[index] = historyItem;
+    }
+    history->swap(result);
 }
diff --git a/Tools/DumpRenderTree/chromium/TestShell.h b/Tools/DumpRenderTree/chromium/TestShell.h
index 12e1dbb..17498d3 100644
--- a/Tools/DumpRenderTree/chromium/TestShell.h
+++ b/Tools/DumpRenderTree/chromium/TestShell.h
@@ -31,8 +31,6 @@
 #ifndef TestShell_h
 #define TestShell_h
 
-#include "DRTTestRunner.h"
-#include "NotificationPresenter.h"
 #include "TestEventPrinter.h"
 #include "WebPreferences.h"
 #include "WebTestInterfaces.h"
@@ -47,9 +45,9 @@
 namespace WebKit {
 class WebDevToolsAgentClient;
 class WebFrame;
-class WebNotificationPresenter;
 class WebThread;
 class WebView;
+class WebThemeEngine;
 class WebURL;
 }
 
@@ -57,7 +55,7 @@
 class DRTDevToolsCallArgs;
 class DRTDevToolsClient;
 class MockWebPrerenderingSupport;
-class WebPermissions;
+class MockPlatform;
 
 struct TestParams {
     bool dumpTree;
@@ -79,25 +77,18 @@
     TestShell();
     ~TestShell();
 
-    void initialize();
+    void initialize(MockPlatform*);
 
     // The main WebView.
     WebKit::WebView* webView() const { return m_webView; }
     // Returns the host for the main WebView.
     WebViewHost* webViewHost() const { return m_webViewHost.get(); }
-    DRTTestRunner* testRunner() const { return m_testRunner.get(); }
-    WebTestRunner::WebEventSender* eventSender() const { return m_testInterfaces->eventSender(); }
-    WebTestRunner::WebAccessibilityController* accessibilityController() const { return m_testInterfaces->accessibilityController(); }
-#if ENABLE(NOTIFICATIONS)
-    NotificationPresenter* notificationPresenter() const { return m_notificationPresenter.get(); }
-#endif
+    WebTestRunner::WebTestRunner* testRunner() const { return m_testInterfaces->testRunner(); }
     const TestEventPrinter* printer() const { return &m_printer; }
 
-    WebPreferences* preferences() { return &m_prefs; }
+    WebTestRunner::WebPreferences* preferences() { return &m_prefs; }
     void applyPreferences() { m_prefs.applyTo(m_webView); }
 
-    WebPermissions* webPermissions() { return m_webPermissions.get(); }
-
     void bindJSObjectsToWindow(WebKit::WebFrame*);
     void runFileTest(const TestParams&, bool shouldDumpPixelTests);
     void callJSGC();
@@ -111,14 +102,9 @@
     int navigationEntryCount() const;
 
     void setFocus(WebKit::WebWidget*, bool enable);
-    bool shouldDumpFrameLoadCallbacks() const { return (m_testIsPreparing || m_testIsPending) && testRunner()->shouldDumpFrameLoadCallbacks(); }
-    bool shouldDumpUserGestureInFrameLoadCallbacks() const { return (m_testIsPreparing || m_testIsPending) && testRunner()->shouldDumpUserGestureInFrameLoadCallbacks(); }
-    bool shouldDumpResourceLoadCallbacks() const  { return (m_testIsPreparing || m_testIsPending) && testRunner()->shouldDumpResourceLoadCallbacks(); }
-    bool shouldDumpResourceResponseMIMETypes() const  { return (m_testIsPreparing || m_testIsPending) && testRunner()->shouldDumpResourceResponseMIMETypes(); }
-    void setIsLoading(bool flag) { m_isLoading = flag; }
 
     // Called by the DRTTestRunner to signal test completion.
-    void testFinished();
+    void testFinished(WebViewHost*);
     // Called by DRTTestRunner when a test hits the timeout, but does not
     // cause a hang. We can avoid killing TestShell in this case and still dump
     // the test results.
@@ -129,15 +115,14 @@
 
     void setAcceleratedCompositingForVideoEnabled(bool enabled) { m_acceleratedCompositingForVideoEnabled = enabled; }
     void setAcceleratedCompositingForFixedPositionEnabled(bool enabled) { m_acceleratedCompositingForFixedPositionEnabled = enabled; }
+    void setAcceleratedCompositingForOverflowScrollEnabled(bool enabled) { m_acceleratedCompositingForOverflowScrollEnabled = enabled; }
     bool softwareCompositingEnabled() { return m_softwareCompositingEnabled; }
     void setSoftwareCompositingEnabled(bool enabled) { m_softwareCompositingEnabled = enabled; }
     void setThreadedCompositingEnabled(bool enabled) { m_threadedCompositingEnabled = enabled; }
     void setForceCompositingMode(bool enabled) { m_forceCompositingMode = enabled; }
+    void setThreadedHTMLParser(bool enabled) { m_threadedHTMLParser = enabled; }
     void setAccelerated2dCanvasEnabled(bool enabled) { m_accelerated2dCanvasEnabled = enabled; }
-    void setDeferred2dCanvasEnabled(bool enabled) { m_deferred2dCanvasEnabled = enabled; }
-    void setAcceleratedPaintingEnabled(bool enabled) { m_acceleratedPaintingEnabled = enabled; }
-    void setPerTilePaintingEnabled(bool);
-    void setAcceleratedAnimationEnabled(bool);
+    void setPerTilePaintingEnabled(bool enabled) { m_perTilePaintingEnabled = enabled; }
     void setDeferredImageDecodingEnabled(bool enabled) { m_deferredImageDecodingEnabled = enabled; }
 #if defined(OS_WIN)
     // Access to the finished event. Used by the static WatchDog thread.
@@ -173,6 +158,7 @@
     void closeWindow(WebViewHost*);
     void closeRemainingWindows();
     int windowCount();
+    void captureHistoryForWindow(size_t windowIndex, WebKit::WebVector<WebKit::WebHistoryItem>*, size_t* currentEntryIndex);
     static void resizeWindowForTest(WebViewHost*, const WebKit::WebURL&);
 
     void showDevTools();
@@ -187,12 +173,10 @@
     typedef Vector<WebViewHost*> WindowList;
     WindowList windowList() const { return m_windowList; }
 
-    // Returns a string representation of an URL's spec that does not depend on
-    // the location of the layout test in the file system.
-    std::string normalizeLayoutTestURL(const std::string&);
+    WebKit::WebThread* webCompositorThread() const { return m_webCompositorThread.get(); }
 
 private:
-    WebViewHost* createNewWindow(const WebKit::WebURL&, DRTDevToolsAgent*);
+    WebViewHost* createNewWindow(const WebKit::WebURL&, DRTDevToolsAgent*, WebTestRunner::WebTestInterfaces*);
     void createMainWindow();
     void createDRTDevToolsClient(DRTDevToolsAgent*);
 
@@ -203,23 +187,19 @@
 
     bool m_testIsPending;
     bool m_testIsPreparing;
-    bool m_isLoading;
     WebKit::WebView* m_webView;
     WebKit::WebWidget* m_focusedWidget;
     WebViewHost* m_devTools;
 
     // Be careful of the destruction order of the following objects.
     TestEventPrinter m_printer;
-    OwnPtr<WebPermissions> m_webPermissions;
     OwnPtr<DRTDevToolsAgent> m_drtDevToolsAgent;
     OwnPtr<DRTDevToolsClient> m_drtDevToolsClient;
     OwnPtr<WebTestRunner::WebTestInterfaces> m_testInterfaces;
-    OwnPtr<DRTTestRunner> m_testRunner;
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
-    OwnPtr<NotificationPresenter> m_notificationPresenter;
-#endif
-    OwnPtr<WebViewHost> m_webViewHost;
+    OwnPtr<WebTestRunner::WebTestInterfaces> m_devToolsTestInterfaces;
+    // It's important that this thread is destroyed after the WebViewHost.
     OwnPtr<WebKit::WebThread> m_webCompositorThread;
+    OwnPtr<WebViewHost> m_webViewHost;
 #if ENABLE(LINK_PRERENDER)
     OwnPtr<MockWebPrerenderingSupport> m_prerenderingSupport;
 #endif
@@ -230,15 +210,15 @@
     bool m_allowExternalPages;
     bool m_acceleratedCompositingForVideoEnabled;
     bool m_acceleratedCompositingForFixedPositionEnabled;
+    bool m_acceleratedCompositingForOverflowScrollEnabled;
     bool m_softwareCompositingEnabled;
     bool m_threadedCompositingEnabled;
     bool m_forceCompositingMode;
+    bool m_threadedHTMLParser;
     bool m_accelerated2dCanvasEnabled;
-    bool m_deferred2dCanvasEnabled;
-    bool m_acceleratedPaintingEnabled;
     bool m_perTilePaintingEnabled;
     bool m_deferredImageDecodingEnabled;
-    WebPreferences m_prefs;
+    WebTestRunner::WebPreferences m_prefs;
     bool m_stressOpt;
     bool m_stressDeopt;
     std::string m_javaScriptFlags;
diff --git a/Tools/DumpRenderTree/chromium/TestShellMac.mm b/Tools/DumpRenderTree/chromium/TestShellMac.mm
index d79a8c8..53ede56 100644
--- a/Tools/DumpRenderTree/chromium/TestShellMac.mm
+++ b/Tools/DumpRenderTree/chromium/TestShellMac.mm
@@ -31,12 +31,9 @@
 #include "config.h"
 
 #include "TestShell.h"
-#include "WebThemeEngineDRTMac.h"
 #include "webkit/support/webkit_support.h"
 #import <AppKit/AppKit.h>
 
-static WebThemeEngineDRTMac themeEngine;
-
 // A class to be the target/selector of the "watchdog" thread that ensures
 // pages timeout if they take too long and tells the test harness via stdout.
 @interface WatchDogTarget : NSObject {
@@ -129,7 +126,6 @@
 
 void platformInit(int*, char***)
 {
-    webkit_support::SetThemeEngine(&themeEngine);
 }
 
 void openStartupDialog()
diff --git a/Tools/DumpRenderTree/chromium/TestShellWin.cpp b/Tools/DumpRenderTree/chromium/TestShellWin.cpp
index 083d54a..251641e 100644
--- a/Tools/DumpRenderTree/chromium/TestShellWin.cpp
+++ b/Tools/DumpRenderTree/chromium/TestShellWin.cpp
@@ -31,7 +31,6 @@
 #include "config.h"
 #include "TestShell.h"
 
-#include "WebThemeEngineDRTWin.h"
 #include "webkit/support/webkit_support.h"
 #include <fcntl.h>
 #include <io.h>
@@ -48,9 +47,6 @@
 #define NONCLIENTMETRICS_SIZE_PRE_VISTA \
     SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont)
 
-// Theme engine
-static WebThemeEngineDRTWin themeEngine;
-
 // Thread main to run for the thread which just tests for timeout.
 unsigned int __stdcall watchDogThread(void* arg)
 {
@@ -118,9 +114,6 @@
     _setmode(_fileno(stdout), _O_BINARY);
     _setmode(_fileno(stderr), _O_BINARY);
 
-    // Set theme engine.
-    webkit_support::SetThemeEngine(&themeEngine);
-
     // Load Ahem font.
     // AHEM____.TTF is copied to the directory of DumpRenderTree.exe by WebKit.gyp.
     WCHAR path[_MAX_PATH];
diff --git a/Tools/DumpRenderTree/chromium/TestWebPlugin.cpp b/Tools/DumpRenderTree/chromium/TestWebPlugin.cpp
deleted file mode 100644
index 1468846..0000000
--- a/Tools/DumpRenderTree/chromium/TestWebPlugin.cpp
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright (C) 2011 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "TestWebPlugin.h"
-
-#include "WebFrame.h"
-#include "WebInputEvent.h"
-#include "platform/WebGraphicsContext3D.h"
-#include "WebKit.h"
-#include "platform/WebKitPlatformSupport.h"
-#include "WebPluginContainer.h"
-#include "WebPluginParams.h"
-#include "WebTouchPoint.h"
-#include <wtf/Assertions.h>
-#include <wtf/text/CString.h>
-
-using namespace WebKit;
-
-// GLenum values copied from gl2.h.
-#define GL_FALSE                  0
-#define GL_TRUE                   1
-#define GL_ONE                    1
-#define GL_TRIANGLES              0x0004
-#define GL_ONE_MINUS_SRC_ALPHA    0x0303
-#define GL_DEPTH_TEST             0x0B71
-#define GL_BLEND                  0x0BE2
-#define GL_SCISSOR_TEST           0x0B90
-#define GL_TEXTURE_2D             0x0DE1
-#define GL_FLOAT                  0x1406
-#define GL_RGBA                   0x1908
-#define GL_UNSIGNED_BYTE          0x1401
-#define GL_TEXTURE_MAG_FILTER     0x2800
-#define GL_TEXTURE_MIN_FILTER     0x2801
-#define GL_TEXTURE_WRAP_S         0x2802
-#define GL_TEXTURE_WRAP_T         0x2803
-#define GL_NEAREST                0x2600
-#define GL_COLOR_BUFFER_BIT       0x4000
-#define GL_CLAMP_TO_EDGE          0x812F
-#define GL_ARRAY_BUFFER           0x8892
-#define GL_STATIC_DRAW            0x88E4
-#define GL_FRAGMENT_SHADER        0x8B30
-#define GL_VERTEX_SHADER          0x8B31
-#define GL_COMPILE_STATUS         0x8B81
-#define GL_LINK_STATUS            0x8B82
-#define GL_COLOR_ATTACHMENT0      0x8CE0
-#define GL_FRAMEBUFFER_COMPLETE   0x8CD5
-#define GL_FRAMEBUFFER            0x8D40
-
-static void premultiplyAlpha(const unsigned colorIn[3], float alpha, float colorOut[4])
-{
-    for (int i = 0; i < 3; ++i)
-        colorOut[i] = (colorIn[i] / 255.0f) * alpha;
-
-    colorOut[3] = alpha;
-}
-
-static const char* pointState(WebKit::WebTouchPoint::State state)
-{
-    switch (state) {
-    case WebKit::WebTouchPoint::StateReleased:
-        return "Released";
-    case WebKit::WebTouchPoint::StatePressed:
-        return "Pressed";
-    case WebKit::WebTouchPoint::StateMoved:
-        return "Moved";
-    case WebKit::WebTouchPoint::StateCancelled:
-        return "Cancelled";
-    default:
-        return "Unknown";
-    }
-
-    ASSERT_NOT_REACHED();
-    return 0;
-}
-
-static void printTouchList(const WebKit::WebTouchPoint* points, int length)
-{
-    for (int i = 0; i < length; ++i)
-        printf("* %d, %d: %s\n", points[i].position.x, points[i].position.y, pointState(points[i].state));
-}
-
-static void printEventDetails(const WebKit::WebInputEvent& event)
-{
-    if (WebKit::WebInputEvent::isTouchEventType(event.type)) {
-        const WebKit::WebTouchEvent& touch = static_cast<const WebKit::WebTouchEvent&>(event);
-        printTouchList(touch.touches, touch.touchesLength);
-        printTouchList(touch.changedTouches, touch.changedTouchesLength);
-        printTouchList(touch.targetTouches, touch.targetTouchesLength);
-    } else if (WebKit::WebInputEvent::isMouseEventType(event.type) || event.type == WebKit::WebInputEvent::MouseWheel) {
-        const WebKit::WebMouseEvent& mouse = static_cast<const WebKit::WebMouseEvent&>(event);
-        printf("* %d, %d\n", mouse.x, mouse.y);
-    } else if (WebKit::WebInputEvent::isGestureEventType(event.type)) {
-        const WebKit::WebGestureEvent& gesture = static_cast<const WebKit::WebGestureEvent&>(event);
-        printf("* %d, %d\n", gesture.x, gesture.y);
-    }
-}
-
-TestWebPlugin::TestWebPlugin(WebKit::WebFrame* frame,
-                             const WebKit::WebPluginParams& params)
-    : m_frame(frame)
-    , m_container(0)
-    , m_context(0)
-    , m_acceptsTouchEvent(false)
-    , m_printEventDetails(false)
-    , m_canProcessDrag(false)
-{
-    static const WebString kAttributePrimitive = WebString::fromUTF8("primitive");
-    static const WebString kAttributeBackgroundColor = WebString::fromUTF8("background-color");
-    static const WebString kAttributePrimitiveColor = WebString::fromUTF8("primitive-color");
-    static const WebString kAttributeOpacity = WebString::fromUTF8("opacity");
-    static const WebString kAttributeAcceptsTouch = WebString::fromUTF8("accepts-touch");
-    static const WebString kAttributePrintEventDetails = WebString::fromUTF8("print-event-details");
-    static const WebString kAttributeCanProcessDrag = WebString::fromUTF8("can-process-drag");
-
-    ASSERT(params.attributeNames.size() == params.attributeValues.size());
-    size_t size = params.attributeNames.size();
-    for (size_t i = 0; i < size; ++i) {
-        const WebString& attributeName = params.attributeNames[i];
-        const WebString& attributeValue = params.attributeValues[i];
-
-        if (attributeName == kAttributePrimitive)
-            m_scene.primitive = parsePrimitive(attributeValue);
-        else if (attributeName == kAttributeBackgroundColor)
-            parseColor(attributeValue, m_scene.backgroundColor);
-        else if (attributeName == kAttributePrimitiveColor)
-            parseColor(attributeValue, m_scene.primitiveColor);
-        else if (attributeName == kAttributeOpacity)
-            m_scene.opacity = parseOpacity(attributeValue);
-        else if (attributeName == kAttributeAcceptsTouch)
-            m_acceptsTouchEvent = parseBoolean(attributeValue);
-        else if (attributeName == kAttributePrintEventDetails)
-            m_printEventDetails = parseBoolean(attributeValue);
-        else if (attributeName == kAttributeCanProcessDrag)
-            m_canProcessDrag = parseBoolean(attributeValue);
-    }
-}
-
-TestWebPlugin::~TestWebPlugin()
-{
-}
-
-const WebString& TestWebPlugin::mimeType()
-{
-    static const WebString kMimeType = WebString::fromUTF8("application/x-webkit-test-webplugin");
-    return kMimeType;
-}
-
-bool TestWebPlugin::initialize(WebPluginContainer* container)
-{
-    WebGraphicsContext3D::Attributes attrs;
-    m_context = webKitPlatformSupport()->createOffscreenGraphicsContext3D(attrs);
-    if (!m_context)
-        return false;
-
-    if (!m_context->makeContextCurrent())
-        return false;
-
-    if (!initScene())
-        return false;
-
-    m_container = container;
-    m_container->setBackingTextureId(m_colorTexture);
-    m_container->setIsAcceptingTouchEvents(m_acceptsTouchEvent);
-    return true;
-}
-
-void TestWebPlugin::destroy()
-{
-    destroyScene();
-
-    delete m_context;
-    m_context = 0;
-
-    m_container = 0;
-    m_frame = 0;
-}
-
-void TestWebPlugin::updateGeometry(const WebRect& frameRect,
-                                   const WebRect& clipRect,
-                                   const WebVector<WebRect>& cutOutsRects,
-                                   bool isVisible)
-{
-    if (clipRect == m_rect)
-        return;
-    m_rect = clipRect;
-    if (m_rect.isEmpty())
-        return;
-
-    m_context->reshape(m_rect.width, m_rect.height);
-    m_context->viewport(0, 0, m_rect.width, m_rect.height);
-
-    m_context->bindTexture(GL_TEXTURE_2D, m_colorTexture);
-    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-    m_context->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_rect.width, m_rect.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
-    m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
-    m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorTexture, 0);
-
-    drawScene();
-
-    m_context->flush();
-    m_container->commitBackingTexture();
-}
-
-TestWebPlugin::Primitive TestWebPlugin::parsePrimitive(const WebString& string)
-{
-    static const WebString kPrimitiveNone = WebString::fromUTF8("none");
-    static const WebString kPrimitiveTriangle = WebString::fromUTF8("triangle");
-
-    Primitive primitive = PrimitiveNone;
-    if (string == kPrimitiveNone)
-        primitive = PrimitiveNone;
-    else if (string == kPrimitiveTriangle)
-        primitive = PrimitiveTriangle;
-    else
-        ASSERT_NOT_REACHED();
-    return primitive;
-}
-
-// FIXME: This method should already exist. Use it.
-// For now just parse primary colors.
-void TestWebPlugin::parseColor(const WebString& string, unsigned color[3])
-{
-    color[0] = color[1] = color[2] = 0;
-    if (string == "black")
-        return;
-
-    if (string == "red")
-        color[0] = 255;
-    else if (string == "green")
-        color[1] = 255;
-    else if (string == "blue")
-        color[2] = 255;
-    else
-        ASSERT_NOT_REACHED();
-}
-
-float TestWebPlugin::parseOpacity(const WebString& string)
-{
-    return static_cast<float>(atof(string.utf8().data()));
-}
-
-bool TestWebPlugin::parseBoolean(const WebString& string)
-{
-    static const WebString kPrimitiveTrue = WebString::fromUTF8("true");
-    return string == kPrimitiveTrue;
-}
-
-bool TestWebPlugin::initScene()
-{
-    float color[4];
-    premultiplyAlpha(m_scene.backgroundColor, m_scene.opacity, color);
-
-    m_colorTexture = m_context->createTexture();
-    m_framebuffer = m_context->createFramebuffer();
-
-    m_context->viewport(0, 0, m_rect.width, m_rect.height);
-    m_context->disable(GL_DEPTH_TEST);
-    m_context->disable(GL_SCISSOR_TEST);
-
-    m_context->clearColor(color[0], color[1], color[2], color[3]);
-
-    m_context->enable(GL_BLEND);
-    m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-
-    return m_scene.primitive != PrimitiveNone ? initProgram() && initPrimitive() : true;
-}
-
-void TestWebPlugin::drawScene()
-{
-    m_context->viewport(0, 0, m_rect.width, m_rect.height);
-    m_context->clear(GL_COLOR_BUFFER_BIT);
-
-    if (m_scene.primitive != PrimitiveNone)
-        drawPrimitive();
-}
-
-void TestWebPlugin::destroyScene()
-{
-    if (m_scene.program) {
-        m_context->deleteProgram(m_scene.program);
-        m_scene.program = 0;
-    }
-    if (m_scene.vbo) {
-        m_context->deleteBuffer(m_scene.vbo);
-        m_scene.vbo = 0;
-    }
-
-    if (m_framebuffer) {
-        m_context->deleteFramebuffer(m_framebuffer);
-        m_framebuffer = 0;
-    }
-
-    if (m_colorTexture) {
-        m_context->deleteTexture(m_colorTexture);
-        m_colorTexture = 0;
-    }
-}
-
-bool TestWebPlugin::initProgram()
-{
-    const CString vertexSource(
-        "attribute vec4 position;  \n"
-        "void main() {             \n"
-        "  gl_Position = position; \n"
-        "}                         \n"
-    );
-
-    const CString fragmentSource(
-        "precision mediump float; \n"
-        "uniform vec4 color;      \n"
-        "void main() {            \n"
-        "  gl_FragColor = color;  \n"
-        "}                        \n"
-    );
-
-    m_scene.program = loadProgram(vertexSource, fragmentSource);
-    if (!m_scene.program)
-        return false;
-
-    m_scene.colorLocation = m_context->getUniformLocation(m_scene.program, "color");
-    m_scene.positionLocation = m_context->getAttribLocation(m_scene.program, "position");
-    return true;
-}
-
-bool TestWebPlugin::initPrimitive()
-{
-    ASSERT(m_scene.primitive == PrimitiveTriangle);
-
-    m_scene.vbo = m_context->createBuffer();
-    if (!m_scene.vbo)
-        return false;
-
-    const float vertices[] = { 0.0f,  0.8f, 0.0f,
-                              -0.8f, -0.8f, 0.0f,
-                               0.8f, -0.8f, 0.0f };
-    m_context->bindBuffer(GL_ARRAY_BUFFER, m_scene.vbo);
-    m_context->bufferData(GL_ARRAY_BUFFER, sizeof(vertices), 0, GL_STATIC_DRAW);
-    m_context->bufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
-    return true;
-}
-
-void TestWebPlugin::drawPrimitive()
-{
-    ASSERT(m_scene.primitive == PrimitiveTriangle);
-    ASSERT(m_scene.vbo);
-    ASSERT(m_scene.program);
-
-    m_context->useProgram(m_scene.program);
-
-    // Bind primitive color.
-    float color[4];
-    premultiplyAlpha(m_scene.primitiveColor, m_scene.opacity, color);
-    m_context->uniform4f(m_scene.colorLocation, color[0], color[1], color[2], color[3]);
-
-    // Bind primitive vertices.
-    m_context->bindBuffer(GL_ARRAY_BUFFER, m_scene.vbo);
-    m_context->enableVertexAttribArray(m_scene.positionLocation);
-    m_context->vertexAttribPointer(m_scene.positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
-    m_context->drawArrays(GL_TRIANGLES, 0, 3);
-}
-
-unsigned TestWebPlugin::loadShader(unsigned type, const CString& source)
-{
-    unsigned shader = m_context->createShader(type);
-    if (shader) {
-        m_context->shaderSource(shader, source.data());
-        m_context->compileShader(shader);
-
-        int compiled = 0;
-        m_context->getShaderiv(shader, GL_COMPILE_STATUS, &compiled);
-        if (!compiled) {
-            m_context->deleteShader(shader);
-            shader = 0;
-        }
-    }
-    return shader;
-}
-
-unsigned TestWebPlugin::loadProgram(const CString& vertexSource,
-                                    const CString& fragmentSource)
-{
-    unsigned vertexShader = loadShader(GL_VERTEX_SHADER, vertexSource);
-    unsigned fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentSource);
-    unsigned program = m_context->createProgram();
-    if (vertexShader && fragmentShader && program) {
-        m_context->attachShader(program, vertexShader);
-        m_context->attachShader(program, fragmentShader);
-        m_context->linkProgram(program);
-
-        int linked = 0;
-        m_context->getProgramiv(program, GL_LINK_STATUS, &linked);
-        if (!linked) {
-            m_context->deleteProgram(program);
-            program = 0;
-        }
-    }
-    if (vertexShader)
-        m_context->deleteShader(vertexShader);
-    if (fragmentShader)
-        m_context->deleteShader(fragmentShader);
-
-    return program;
-}
-
-bool TestWebPlugin::handleInputEvent(const WebKit::WebInputEvent& event, WebKit::WebCursorInfo& info)
-{
-    const char* eventName = 0;
-    switch (event.type) {
-    case WebKit::WebInputEvent::Undefined:           eventName = "unknown"; break;
-
-    case WebKit::WebInputEvent::MouseDown:           eventName = "MouseDown"; break;
-    case WebKit::WebInputEvent::MouseUp:             eventName = "MouseUp"; break;
-    case WebKit::WebInputEvent::MouseMove:           eventName = "MouseMove"; break;
-    case WebKit::WebInputEvent::MouseEnter:          eventName = "MouseEnter"; break;
-    case WebKit::WebInputEvent::MouseLeave:          eventName = "MouseLeave"; break;
-    case WebKit::WebInputEvent::ContextMenu:         eventName = "ContextMenu"; break;
-
-    case WebKit::WebInputEvent::MouseWheel:          eventName = "MouseWheel"; break;
-
-    case WebKit::WebInputEvent::RawKeyDown:          eventName = "RawKeyDown"; break;
-    case WebKit::WebInputEvent::KeyDown:             eventName = "KeyDown"; break;
-    case WebKit::WebInputEvent::KeyUp:               eventName = "KeyUp"; break;
-    case WebKit::WebInputEvent::Char:                eventName = "Char"; break;
-
-    case WebKit::WebInputEvent::GestureScrollBegin:  eventName = "GestureScrollBegin"; break;
-    case WebKit::WebInputEvent::GestureScrollEnd:    eventName = "GestureScrollEnd"; break;
-    case WebKit::WebInputEvent::GestureScrollUpdate: eventName = "GestureScrollUpdate"; break;
-    case WebKit::WebInputEvent::GestureFlingStart:   eventName = "GestureFlingStart"; break;
-    case WebKit::WebInputEvent::GestureFlingCancel:  eventName = "GestureFlingCancel"; break;
-    case WebKit::WebInputEvent::GestureTap:          eventName = "GestureTap"; break;
-    case WebKit::WebInputEvent::GestureTapDown:      eventName = "GestureTapDown"; break;
-    case WebKit::WebInputEvent::GestureTapCancel:    eventName = "GestureTapCancel"; break;
-    case WebKit::WebInputEvent::GestureDoubleTap:    eventName = "GestureDoubleTap"; break;
-    case WebKit::WebInputEvent::GestureTwoFingerTap: eventName = "GestureTwoFingerTap"; break;
-    case WebKit::WebInputEvent::GestureLongPress:    eventName = "GestureLongPress"; break;
-    case WebKit::WebInputEvent::GestureLongTap:      eventName = "GestureLongTap"; break;
-    case WebKit::WebInputEvent::GesturePinchBegin:   eventName = "GesturePinchBegin"; break;
-    case WebKit::WebInputEvent::GesturePinchEnd:     eventName = "GesturePinchEnd"; break;
-    case WebKit::WebInputEvent::GesturePinchUpdate:  eventName = "GesturePinchUpdate"; break;
-
-    case WebKit::WebInputEvent::TouchStart:          eventName = "TouchStart"; break;
-    case WebKit::WebInputEvent::TouchMove:           eventName = "TouchMove"; break;
-    case WebKit::WebInputEvent::TouchEnd:            eventName = "TouchEnd"; break;
-    case WebKit::WebInputEvent::TouchCancel:         eventName = "TouchCancel"; break;
-    }
-
-    printf("Plugin received event: %s\n", eventName ? eventName : "unknown");
-    if (m_printEventDetails)
-        printEventDetails(event);
-    return false;
-}
-
-bool TestWebPlugin::handleDragStatusUpdate(WebKit::WebDragStatus dragStatus, const WebKit::WebDragData&, WebKit::WebDragOperationsMask, const WebKit::WebPoint& position, const WebKit::WebPoint& screenPosition)
-{
-    const char* dragStatusName = 0;
-    switch (dragStatus) {
-    case WebKit::WebDragStatusEnter:
-        dragStatusName = "DragEnter";
-        break;
-    case WebKit::WebDragStatusOver:
-        dragStatusName = "DragOver";
-        break;
-    case WebKit::WebDragStatusLeave:
-        dragStatusName = "DragLeave";
-        break;
-    case WebKit::WebDragStatusDrop:
-        dragStatusName = "DragDrop";
-        break;
-    case WebKit::WebDragStatusUnknown:
-        ASSERT_NOT_REACHED();
-    }
-    printf("Plugin received event: %s\n", dragStatusName);
-    return false;
-}
-
diff --git a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp b/Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp
deleted file mode 100755
index db8c38b..0000000
--- a/Tools/DumpRenderTree/chromium/WebThemeEngineDRTWin.cpp
+++ /dev/null
@@ -1,793 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "WebThemeEngineDRTWin.h"
-
-#include "platform/WebRect.h"
-#include "WebThemeControlDRTWin.h"
-#include "third_party/skia/include/core/SkRect.h"
-
-// Although all this code is generic, we include these headers
-// to pull in the Windows #defines for the parts and states of
-// the controls.
-#include <vsstyle.h>
-#include <windows.h>
-
-#include <wtf/Assertions.h>
-
-using namespace WebKit;
-
-// We define this for clarity, although there really should be a DFCS_NORMAL in winuser.h.
-static const int dfcsNormal = 0x0000;
-
-static SkIRect webRectToSkIRect(const WebRect& webRect)
-{
-    SkIRect irect;
-    irect.set(webRect.x, webRect.y, webRect.x + webRect.width - 1, webRect.y + webRect.height - 1);
-    return irect;
-}
-
-static void drawControl(WebCanvas* canvas,
-                        const WebRect& rect,
-                        WebThemeControlDRTWin::Type ctype,
-                        WebThemeControlDRTWin::State cstate)
-{
-    WebThemeControlDRTWin control(canvas, webRectToSkIRect(rect), ctype, cstate);
-    control.draw();
-}
-
-static void drawTextField(WebCanvas* canvas,
-                          const WebRect& rect,
-                          WebThemeControlDRTWin::Type ctype,
-                          WebThemeControlDRTWin::State cstate,
-                          bool drawEdges,
-                          bool fillContentArea,
-                          WebColor color)
-{
-    WebThemeControlDRTWin control(canvas, webRectToSkIRect(rect), ctype, cstate);
-    control.drawTextField(drawEdges, fillContentArea, color);
-}
-
-static void drawProgressBar(WebCanvas* canvas,
-                            WebThemeControlDRTWin::Type ctype,
-                            WebThemeControlDRTWin::State cstate,
-                            const WebRect& barRect,
-                            const WebRect& fillRect)
-{
-    WebThemeControlDRTWin control(canvas, webRectToSkIRect(barRect), ctype, cstate);
-    control.drawProgressBar(webRectToSkIRect(fillRect));
-}
-
-// WebThemeEngineDRTWin
-
-void WebThemeEngineDRTWin::paintButton(WebCanvas* canvas,
-                                       int part,
-                                       int state,
-                                       int classicState,
-                                       const WebRect& rect)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    if (part == BP_CHECKBOX) {
-        switch (state) {
-        case CBS_UNCHECKEDNORMAL:
-            ASSERT(classicState == dfcsNormal);
-            ctype = WebThemeControlDRTWin::UncheckedBoxType;
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case CBS_UNCHECKEDHOT:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_HOT));
-            ctype = WebThemeControlDRTWin::UncheckedBoxType;
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case CBS_UNCHECKEDPRESSED:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_PUSHED));
-            ctype = WebThemeControlDRTWin::UncheckedBoxType;
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        case CBS_UNCHECKEDDISABLED:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_INACTIVE));
-            ctype = WebThemeControlDRTWin::UncheckedBoxType;
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        case CBS_CHECKEDNORMAL:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED));
-            ctype = WebThemeControlDRTWin::CheckedBoxType;
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case CBS_CHECKEDHOT:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_HOT));
-            ctype = WebThemeControlDRTWin::CheckedBoxType;
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case CBS_CHECKEDPRESSED:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_PUSHED));
-            ctype = WebThemeControlDRTWin::CheckedBoxType;
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        case CBS_CHECKEDDISABLED:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_INACTIVE));
-            ctype = WebThemeControlDRTWin::CheckedBoxType;
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        case CBS_MIXEDNORMAL:
-            // Classic theme can't represent mixed state checkbox. We assume
-            // it's equivalent to unchecked.
-            ASSERT(classicState == DFCS_BUTTONCHECK);
-            ctype = WebThemeControlDRTWin::IndeterminateCheckboxType;
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case CBS_MIXEDHOT:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_HOT));
-            ctype = WebThemeControlDRTWin::IndeterminateCheckboxType;
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case CBS_MIXEDPRESSED:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_PUSHED));
-            ctype = WebThemeControlDRTWin::IndeterminateCheckboxType;
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        case CBS_MIXEDDISABLED:
-            ASSERT(classicState == (DFCS_BUTTONCHECK | DFCS_INACTIVE));
-            ctype = WebThemeControlDRTWin::IndeterminateCheckboxType;
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        default:
-            ASSERT_NOT_REACHED();
-            break;
-        }
-    } else if (BP_RADIOBUTTON == part) {
-        switch (state) {
-        case RBS_UNCHECKEDNORMAL:
-            ASSERT(classicState == DFCS_BUTTONRADIO);
-            ctype = WebThemeControlDRTWin::UncheckedRadioType;
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case RBS_UNCHECKEDHOT:
-            ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_HOT));
-            ctype = WebThemeControlDRTWin::UncheckedRadioType;
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case RBS_UNCHECKEDPRESSED:
-            ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_PUSHED));
-            ctype = WebThemeControlDRTWin::UncheckedRadioType;
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        case RBS_UNCHECKEDDISABLED:
-            ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_INACTIVE));
-            ctype = WebThemeControlDRTWin::UncheckedRadioType;
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        case RBS_CHECKEDNORMAL:
-            ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED));
-            ctype = WebThemeControlDRTWin::CheckedRadioType;
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case RBS_CHECKEDHOT:
-            ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_HOT));
-            ctype = WebThemeControlDRTWin::CheckedRadioType;
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case RBS_CHECKEDPRESSED:
-            ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_PUSHED));
-            ctype = WebThemeControlDRTWin::CheckedRadioType;
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        case RBS_CHECKEDDISABLED:
-            ASSERT(classicState == (DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_INACTIVE));
-            ctype = WebThemeControlDRTWin::CheckedRadioType;
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        default:
-            ASSERT_NOT_REACHED();
-            break;
-        }
-    } else if (BP_PUSHBUTTON == part) {
-        switch (state) {
-        case PBS_NORMAL:
-            ASSERT(classicState == DFCS_BUTTONPUSH);
-            ctype = WebThemeControlDRTWin::PushButtonType;
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case PBS_HOT:
-            ASSERT(classicState == (DFCS_BUTTONPUSH | DFCS_HOT));
-            ctype = WebThemeControlDRTWin::PushButtonType;
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case PBS_PRESSED:
-            ASSERT(classicState == (DFCS_BUTTONPUSH | DFCS_PUSHED));
-            ctype = WebThemeControlDRTWin::PushButtonType;
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        case PBS_DISABLED:
-            ASSERT(classicState == (DFCS_BUTTONPUSH | DFCS_INACTIVE));
-            ctype = WebThemeControlDRTWin::PushButtonType;
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        case PBS_DEFAULTED:
-            ASSERT(classicState == DFCS_BUTTONPUSH);
-            ctype = WebThemeControlDRTWin::PushButtonType;
-            cstate = WebThemeControlDRTWin::FocusedState;
-            break;
-
-        default:
-            ASSERT_NOT_REACHED();
-            break;
-        }
-    } else
-        ASSERT_NOT_REACHED();
-
-    drawControl(canvas, rect, ctype, cstate);
-}
-
-
-void WebThemeEngineDRTWin::paintMenuList(WebCanvas* canvas,
-                                         int part,
-                                         int state,
-                                         int classicState,
-                                         const WebRect& rect)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    if (CP_DROPDOWNBUTTON == part) {
-        ctype = WebThemeControlDRTWin::DropDownButtonType;
-        switch (state) {
-        case CBXS_NORMAL:
-            ASSERT(classicState == DFCS_MENUARROW);
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case CBXS_HOT:
-            ASSERT(classicState == (DFCS_MENUARROW | DFCS_HOT));
-            cstate = WebThemeControlDRTWin::HoverState;
-            break;
-
-        case CBXS_PRESSED:
-            ASSERT(classicState == (DFCS_MENUARROW | DFCS_PUSHED));
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        case CBXS_DISABLED:
-            ASSERT(classicState == (DFCS_MENUARROW | DFCS_INACTIVE));
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        default:
-            CRASH();
-            break;
-        }
-    } else
-        CRASH();
-
-    drawControl(canvas, rect, ctype, cstate);
-}
-
-void WebThemeEngineDRTWin::paintScrollbarArrow(WebCanvas* canvas,
-                                               int state,
-                                               int classicState,
-                                               const WebRect& rect)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    switch (state) {
-    case ABS_UPNORMAL:
-        ASSERT(classicState == DFCS_SCROLLUP);
-        ctype = WebThemeControlDRTWin::UpArrowType;
-        cstate = WebThemeControlDRTWin::NormalState;
-        break;
-
-    case ABS_DOWNNORMAL:
-        ASSERT(classicState == DFCS_SCROLLDOWN);
-        ctype = WebThemeControlDRTWin::DownArrowType;
-        cstate = WebThemeControlDRTWin::NormalState;
-        break;
-
-    case ABS_LEFTNORMAL:
-        ASSERT(classicState == DFCS_SCROLLLEFT);
-        ctype = WebThemeControlDRTWin::LeftArrowType;
-        cstate = WebThemeControlDRTWin::NormalState;
-        break;
-
-    case ABS_RIGHTNORMAL:
-        ASSERT(classicState == DFCS_SCROLLRIGHT);
-        ctype = WebThemeControlDRTWin::RightArrowType;
-        cstate = WebThemeControlDRTWin::NormalState;
-        break;
-
-    case ABS_UPHOT:
-        ASSERT(classicState == (DFCS_SCROLLUP | DFCS_HOT));
-        ctype = WebThemeControlDRTWin::UpArrowType;
-        cstate = WebThemeControlDRTWin::HotState;
-        break;
-
-    case ABS_DOWNHOT:
-        ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_HOT));
-        ctype = WebThemeControlDRTWin::DownArrowType;
-        cstate = WebThemeControlDRTWin::HotState;
-        break;
-
-    case ABS_LEFTHOT:
-        ASSERT(classicState == (DFCS_SCROLLLEFT | DFCS_HOT));
-        ctype = WebThemeControlDRTWin::LeftArrowType;
-        cstate = WebThemeControlDRTWin::HotState;
-        break;
-
-    case ABS_RIGHTHOT:
-        ASSERT(classicState == (DFCS_SCROLLRIGHT | DFCS_HOT));
-        ctype = WebThemeControlDRTWin::RightArrowType;
-        cstate = WebThemeControlDRTWin::HotState;
-        break;
-
-    case ABS_UPHOVER:
-        ASSERT(classicState == DFCS_SCROLLUP);
-        ctype = WebThemeControlDRTWin::UpArrowType;
-        cstate = WebThemeControlDRTWin::HoverState;
-        break;
-
-    case ABS_DOWNHOVER:
-        ASSERT(classicState == DFCS_SCROLLDOWN);
-        ctype = WebThemeControlDRTWin::DownArrowType;
-        cstate = WebThemeControlDRTWin::HoverState;
-        break;
-
-    case ABS_LEFTHOVER:
-        ASSERT(classicState == DFCS_SCROLLLEFT);
-        ctype = WebThemeControlDRTWin::LeftArrowType;
-        cstate = WebThemeControlDRTWin::HoverState;
-        break;
-
-    case ABS_RIGHTHOVER:
-        ASSERT(classicState == DFCS_SCROLLRIGHT);
-        ctype = WebThemeControlDRTWin::RightArrowType;
-        cstate = WebThemeControlDRTWin::HoverState;
-        break;
-
-    case ABS_UPPRESSED:
-        ASSERT(classicState == (DFCS_SCROLLUP | DFCS_PUSHED | DFCS_FLAT));
-        ctype = WebThemeControlDRTWin::UpArrowType;
-        cstate = WebThemeControlDRTWin::PressedState;
-        break;
-
-    case ABS_DOWNPRESSED:
-        ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_PUSHED | DFCS_FLAT));
-        ctype = WebThemeControlDRTWin::DownArrowType;
-        cstate = WebThemeControlDRTWin::PressedState;
-        break;
-
-    case ABS_LEFTPRESSED:
-        ASSERT(classicState == (DFCS_SCROLLLEFT | DFCS_PUSHED | DFCS_FLAT));
-        ctype = WebThemeControlDRTWin::LeftArrowType;
-        cstate = WebThemeControlDRTWin::PressedState;
-        break;
-
-    case ABS_RIGHTPRESSED:
-        ASSERT(classicState == (DFCS_SCROLLRIGHT | DFCS_PUSHED | DFCS_FLAT));
-        ctype = WebThemeControlDRTWin::RightArrowType;
-        cstate = WebThemeControlDRTWin::PressedState;
-        break;
-
-    case ABS_UPDISABLED:
-        ASSERT(classicState == (DFCS_SCROLLUP | DFCS_INACTIVE));
-        ctype = WebThemeControlDRTWin::UpArrowType;
-        cstate = WebThemeControlDRTWin::DisabledState;
-        break;
-
-    case ABS_DOWNDISABLED:
-        ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_INACTIVE));
-        ctype = WebThemeControlDRTWin::DownArrowType;
-        cstate = WebThemeControlDRTWin::DisabledState;
-        break;
-
-    case ABS_LEFTDISABLED:
-        ASSERT(classicState == (DFCS_SCROLLLEFT | DFCS_INACTIVE));
-        ctype = WebThemeControlDRTWin::LeftArrowType;
-        cstate = WebThemeControlDRTWin::DisabledState;
-        break;
-
-    case ABS_RIGHTDISABLED:
-        ASSERT(classicState == (DFCS_SCROLLRIGHT | DFCS_INACTIVE));
-        ctype = WebThemeControlDRTWin::RightArrowType;
-        cstate = WebThemeControlDRTWin::DisabledState;
-        break;
-
-    default:
-        ASSERT_NOT_REACHED();
-        break;
-    }
-
-    drawControl(canvas, rect, ctype, cstate);
-}
-
-void WebThemeEngineDRTWin::paintScrollbarThumb(WebCanvas* canvas,
-                                               int part,
-                                               int state,
-                                               int classicState,
-                                               const WebRect& rect)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    switch (part) {
-    case SBP_THUMBBTNHORZ:
-        ctype = WebThemeControlDRTWin::HorizontalScrollThumbType;
-        break;
-
-    case SBP_THUMBBTNVERT:
-        ctype = WebThemeControlDRTWin::VerticalScrollThumbType;
-        break;
-
-    case SBP_GRIPPERHORZ:
-        ctype = WebThemeControlDRTWin::HorizontalScrollGripType;
-        break;
-
-    case SBP_GRIPPERVERT:
-        ctype = WebThemeControlDRTWin::VerticalScrollGripType;
-        break;
-
-    default:
-        ASSERT_NOT_REACHED();
-        break;
-    }
-
-    switch (state) {
-    case SCRBS_NORMAL:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::NormalState;
-        break;
-
-    case SCRBS_HOT:
-        ASSERT(classicState == DFCS_HOT);
-        cstate = WebThemeControlDRTWin::HotState;
-        break;
-
-    case SCRBS_HOVER:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::HoverState;
-        break;
-
-    case SCRBS_PRESSED:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::PressedState;
-        break;
-
-    case SCRBS_DISABLED:
-        ASSERT_NOT_REACHED(); // This should never happen in practice.
-        break;
-
-    default:
-        ASSERT_NOT_REACHED();
-        break;
-    }
-
-    drawControl(canvas, rect, ctype, cstate);
-}
-
-void WebThemeEngineDRTWin::paintScrollbarTrack(WebCanvas* canvas,
-                                               int part,
-                                               int state,
-                                               int classicState,
-                                               const WebRect& rect,
-                                               const WebRect& alignRect)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    switch (part) {
-    case SBP_UPPERTRACKHORZ:
-        ctype = WebThemeControlDRTWin::HorizontalScrollTrackBackType;
-        break;
-
-    case SBP_LOWERTRACKHORZ:
-        ctype = WebThemeControlDRTWin::HorizontalScrollTrackForwardType;
-        break;
-
-    case SBP_UPPERTRACKVERT:
-        ctype = WebThemeControlDRTWin::VerticalScrollTrackBackType;
-        break;
-
-    case SBP_LOWERTRACKVERT:
-        ctype = WebThemeControlDRTWin::VerticalScrollTrackForwardType;
-        break;
-
-    default:
-        ASSERT_NOT_REACHED();
-        break;
-    }
-
-    switch (state) {
-    case SCRBS_NORMAL:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::NormalState;
-        break;
-
-    case SCRBS_HOT:
-        ASSERT_NOT_REACHED(); // This should never happen in practice.
-        break;
-
-    case SCRBS_HOVER:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::HoverState;
-        break;
-
-    case SCRBS_PRESSED:
-        ASSERT_NOT_REACHED(); // This should never happen in practice.
-        break;
-
-    case SCRBS_DISABLED:
-        ASSERT(classicState == DFCS_INACTIVE);
-        cstate = WebThemeControlDRTWin::DisabledState;
-        break;
-
-    default:
-        CRASH();
-        break;
-    }
-
-    drawControl(canvas, rect, ctype, cstate);
-}
-
-void WebThemeEngineDRTWin::paintSpinButton(WebCanvas* canvas,
-                                           int part,
-                                           int state,
-                                           int classicState,
-                                           const WebRect& rect)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    if (part == SPNP_UP) {
-        ctype = WebThemeControlDRTWin::UpArrowType;
-        switch (state) {
-        case UPS_NORMAL:
-            ASSERT(classicState == DFCS_SCROLLUP);
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-        case UPS_DISABLED:
-            ASSERT(classicState == (DFCS_SCROLLUP | DFCS_INACTIVE));
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-        case UPS_PRESSED:
-            ASSERT(classicState == (DFCS_SCROLLUP | DFCS_PUSHED));
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-        case UPS_HOT:
-            ASSERT(classicState == (DFCS_SCROLLUP | DFCS_HOT));
-            cstate = WebThemeControlDRTWin::HoverState;
-            break;
-        default:
-            ASSERT_NOT_REACHED();
-        }
-    } else if (part == SPNP_DOWN) {
-        ctype = WebThemeControlDRTWin::DownArrowType;
-        switch (state) {
-        case DNS_NORMAL:
-            ASSERT(classicState == DFCS_SCROLLDOWN);
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-        case DNS_DISABLED:
-            ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_INACTIVE));
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-        case DNS_PRESSED:
-            ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_PUSHED));
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-        case DNS_HOT:
-            ASSERT(classicState == (DFCS_SCROLLDOWN | DFCS_HOT));
-            cstate = WebThemeControlDRTWin::HoverState;
-            break;
-        default:
-            ASSERT_NOT_REACHED();
-        }
-    } else
-        ASSERT_NOT_REACHED();
-    drawControl(canvas, rect, ctype, cstate);
-}
-
-void WebThemeEngineDRTWin::paintTextField(WebCanvas* canvas,
-                                          int part,
-                                          int state,
-                                          int classicState,
-                                          const WebRect& rect,
-                                          WebColor color,
-                                          bool fillContentArea,
-                                          bool drawEdges)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    ASSERT(EP_EDITTEXT == part);
-    ctype = WebThemeControlDRTWin::TextFieldType;
-
-    switch (state) {
-    case ETS_NORMAL:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::NormalState;
-        break;
-
-    case ETS_HOT:
-        ASSERT(classicState == DFCS_HOT);
-        cstate = WebThemeControlDRTWin::HotState;
-        break;
-
-    case ETS_DISABLED:
-        ASSERT(classicState == DFCS_INACTIVE);
-        cstate = WebThemeControlDRTWin::DisabledState;
-        break;
-
-    case ETS_SELECTED:
-        ASSERT(classicState == DFCS_PUSHED);
-        cstate = WebThemeControlDRTWin::PressedState;
-        break;
-
-    case ETS_FOCUSED:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::FocusedState;
-        break;
-
-    case ETS_READONLY:
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::ReadOnlyState;
-        break;
-
-    default:
-        ASSERT_NOT_REACHED();
-        break;
-    }
-
-    drawTextField(canvas, rect, ctype, cstate, drawEdges, fillContentArea, color);
-}
-
-void WebThemeEngineDRTWin::paintTrackbar(WebCanvas* canvas,
-                                         int part,
-                                         int state,
-                                         int classicState,
-                                         const WebRect& rect)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::UnknownType;
-    WebThemeControlDRTWin::State cstate = WebThemeControlDRTWin::UnknownState;
-
-    if (TKP_THUMBBOTTOM == part) {
-        ctype = WebThemeControlDRTWin::HorizontalSliderThumbType;
-        switch (state) {
-        case TUS_NORMAL:
-            ASSERT(classicState == dfcsNormal);
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case TUS_HOT:
-            ASSERT(classicState == DFCS_HOT);
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case TUS_DISABLED:
-            ASSERT(classicState == DFCS_INACTIVE);
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        case TUS_PRESSED:
-            ASSERT(classicState == DFCS_PUSHED);
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        default:
-            ASSERT_NOT_REACHED();
-            break;
-        }
-    } else if (TKP_THUMBVERT == part) {
-        ctype = WebThemeControlDRTWin::VerticalSliderThumbType;
-        switch (state) {
-        case TUS_NORMAL:
-            ASSERT(classicState == dfcsNormal);
-            cstate = WebThemeControlDRTWin::NormalState;
-            break;
-
-        case TUS_HOT:
-            ASSERT(classicState == DFCS_HOT);
-            cstate = WebThemeControlDRTWin::HotState;
-            break;
-
-        case TUS_DISABLED:
-            ASSERT(classicState == DFCS_INACTIVE);
-            cstate = WebThemeControlDRTWin::DisabledState;
-            break;
-
-        case TUS_PRESSED:
-            ASSERT(classicState == DFCS_PUSHED);
-            cstate = WebThemeControlDRTWin::PressedState;
-            break;
-
-        default:
-            ASSERT_NOT_REACHED();
-            break;
-        }
-    } else if (TKP_TRACK == part) {
-        ctype = WebThemeControlDRTWin::HorizontalSliderTrackType;
-        ASSERT(state == TRS_NORMAL);
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::NormalState;
-    } else if (TKP_TRACKVERT == part) {
-        ctype = WebThemeControlDRTWin::VerticalSliderTrackType;
-        ASSERT(state == TRVS_NORMAL);
-        ASSERT(classicState == dfcsNormal);
-        cstate = WebThemeControlDRTWin::NormalState;
-    } else
-        ASSERT_NOT_REACHED();
-
-    drawControl(canvas, rect, ctype, cstate);
-}
-
-
-void WebThemeEngineDRTWin::paintProgressBar(WebKit::WebCanvas* canvas,
-                                            const WebKit::WebRect& barRect,
-                                            const WebKit::WebRect& valueRect,
-                                            bool determinate,
-                                            double)
-{
-    WebThemeControlDRTWin::Type ctype = WebThemeControlDRTWin::ProgressBarType;
-    WebThemeControlDRTWin::State cstate = determinate ? WebThemeControlDRTWin::NormalState
-                                                      : WebThemeControlDRTWin::IndeterminateState;
-    drawProgressBar(canvas, ctype, cstate, barRect, valueRect);
-}
-
-
-WebKit::WebSize WebThemeEngineDRTWin::getSize(int part)
-{
-    return WebKit::WebSize();
-}
-
diff --git a/Tools/DumpRenderTree/chromium/WebViewHost.cpp b/Tools/DumpRenderTree/chromium/WebViewHost.cpp
index 7e2e675..9c542a4 100644
--- a/Tools/DumpRenderTree/chromium/WebViewHost.cpp
+++ b/Tools/DumpRenderTree/chromium/WebViewHost.cpp
@@ -31,27 +31,19 @@
 #include "config.h"
 #include "WebViewHost.h"
 
-#include "DRTTestRunner.h"
-#include "MockGrammarCheck.h"
-#include "MockWebSpeechInputController.h"
-#include "MockWebSpeechRecognizer.h"
+#include "DRTDevToolsAgent.h"
 #include "Task.h"
 #include "TestNavigationController.h"
 #include "TestShell.h"
-#include "TestWebPlugin.h"
+#include "WebCachedURLRequest.h"
 #include "WebConsoleMessage.h"
 #include "WebContextMenuData.h"
 #include "WebDOMMessageEvent.h"
 #include "WebDataSource.h"
-#include "WebDeviceOrientationClientMock.h"
 #include "WebDocument.h"
 #include "WebElement.h"
-#include "WebEventSender.h"
 #include "WebFrame.h"
-#include "WebGeolocationClientMock.h"
 #include "WebHistoryItem.h"
-#include "WebIntent.h"
-#include "WebIntentServiceInfo.h"
 #include "WebKit.h"
 #include "WebNode.h"
 #include "WebPluginParams.h"
@@ -60,28 +52,27 @@
 #include "WebPrintParams.h"
 #include "WebRange.h"
 #include "WebScreenInfo.h"
-#include "WebStorageNamespace.h"
-#include "WebTextCheckingCompletion.h"
-#include "WebTextCheckingResult.h"
-#include "WebUserMediaClientMock.h"
+#include "WebSerializedScriptValue.h"
+#include "WebUserGestureIndicator.h"
 #include "WebView.h"
-#include "WebViewHostOutputSurface.h"
-#include "WebViewHostSoftwareOutputDevice.h"
 #include "WebWindowFeatures.h"
-#include "platform/WebSerializedScriptValue.h"
-#include "skia/ext/platform_canvas.h"
 #include "webkit/support/test_media_stream_client.h"
 #include "webkit/support/webkit_support.h"
+#include <cctype>
+#include <clocale>
 #include <public/WebCString.h>
 #include <public/WebCompositorOutputSurface.h>
+#include <public/WebCompositorSupport.h>
 #include <public/WebDragData.h>
 #include <public/WebRect.h>
 #include <public/WebSize.h>
+#include <public/WebStorageNamespace.h>
 #include <public/WebThread.h>
 #include <public/WebURLRequest.h>
 #include <public/WebURLResponse.h>
 
 #include <wtf/Assertions.h>
+#include <wtf/OwnArrayPtr.h>
 #include <wtf/PassOwnPtr.h>
 #include <wtf/Vector.h>
 
@@ -94,173 +85,13 @@
 static const int screenHeight = 1080;
 static const int screenUnavailableBorder = 8;
 
-// WebNavigationType debugging strings taken from PolicyDelegate.mm.
-static const char* linkClickedString = "link clicked";
-static const char* formSubmittedString = "form submitted";
-static const char* backForwardString = "back/forward";
-static const char* reloadString = "reload";
-static const char* formResubmittedString = "form resubmitted";
-static const char* otherString = "other";
-static const char* illegalString = "illegal value";
-
 static int nextPageID = 1;
 
-// Used to write a platform neutral file:/// URL by only taking the filename
-// (e.g., converts "file:///tmp/foo.txt" to just "foo.txt").
-static string urlSuitableForTestResult(const string& url)
-{
-    if (url.empty() || string::npos == url.find("file://"))
-        return url;
-
-    size_t pos = url.rfind('/');
-    if (pos == string::npos) {
-#if OS(WINDOWS)
-        pos = url.rfind('\\');
-        if (pos == string::npos)
-            pos = 0;
-#else
-        pos = 0;
-#endif
-    }
-    string filename = url.substr(pos + 1);
-    if (filename.empty())
-        return "file:"; // A WebKit test has this in its expected output.
-    return filename;
-}
-
-// Used to write a platform neutral file:/// URL by taking the
-// filename and its directory. (e.g., converts
-// "file:///tmp/foo/bar.txt" to just "bar.txt").
-static string descriptionSuitableForTestResult(const string& url)
-{
-    if (url.empty() || string::npos == url.find("file://"))
-        return url;
-
-    size_t pos = url.rfind('/');
-    if (pos == string::npos || !pos)
-        return "ERROR:" + url;
-    pos = url.rfind('/', pos - 1);
-    if (pos == string::npos)
-        return "ERROR:" + url;
-
-    return url.substr(pos + 1);
-}
-
-// Adds a file called "DRTFakeFile" to dragData (CF_HDROP). Use to fake
-// dragging a file.
-static void addDRTFakeFileToDataObject(WebDragData* dragData)
-{
-    WebDragData::Item item;
-    item.storageType = WebDragData::Item::StorageTypeFilename;
-    item.filenameData = WebString::fromUTF8("DRTFakeFile");
-    dragData->addItem(item);
-}
-
-// Get a debugging string from a WebNavigationType.
-static const char* webNavigationTypeToString(WebNavigationType type)
-{
-    switch (type) {
-    case WebKit::WebNavigationTypeLinkClicked:
-        return linkClickedString;
-    case WebKit::WebNavigationTypeFormSubmitted:
-        return formSubmittedString;
-    case WebKit::WebNavigationTypeBackForward:
-        return backForwardString;
-    case WebKit::WebNavigationTypeReload:
-        return reloadString;
-    case WebKit::WebNavigationTypeFormResubmitted:
-        return formResubmittedString;
-    case WebKit::WebNavigationTypeOther:
-        return otherString;
-    }
-    return illegalString;
-}
-
-static string URLDescription(const GURL& url)
-{
-    if (url.SchemeIs("file"))
-        return url.ExtractFileName();
-    return url.possibly_invalid_spec();
-}
-
-static void printResponseDescription(const WebURLResponse& response)
-{
-    if (response.isNull()) {
-        fputs("(null)", stdout);
-        return;
-    }
-    string url = response.url().spec();
-    printf("<NSURLResponse %s, http status code %d>",
-           descriptionSuitableForTestResult(url).c_str(),
-           response.httpStatusCode());
-}
-
-static void printNodeDescription(const WebNode& node, int exception)
-{
-    if (exception) {
-        fputs("ERROR", stdout);
-        return;
-    }
-    if (node.isNull()) {
-        fputs("(null)", stdout);
-        return;
-    }
-    fputs(node.nodeName().utf8().data(), stdout);
-    const WebNode& parent = node.parentNode();
-    if (!parent.isNull()) {
-        fputs(" > ", stdout);
-        printNodeDescription(parent, 0);
-    }
-}
-
-static void printRangeDescription(const WebRange& range)
-{
-    if (range.isNull()) {
-        fputs("(null)", stdout);
-        return;
-    }
-    printf("range from %d of ", range.startOffset());
-    int exception = 0;
-    WebNode startNode = range.startContainer(exception);
-    printNodeDescription(startNode, exception);
-    printf(" to %d of ", range.endOffset());
-    WebNode endNode = range.endContainer(exception);
-    printNodeDescription(endNode, exception);
-}
-
-static string editingActionDescription(WebEditingAction action)
-{
-    switch (action) {
-    case WebKit::WebEditingActionTyped:
-        return "WebViewInsertActionTyped";
-    case WebKit::WebEditingActionPasted:
-        return "WebViewInsertActionPasted";
-    case WebKit::WebEditingActionDropped:
-        return "WebViewInsertActionDropped";
-    }
-    return "(UNKNOWN ACTION)";
-}
-
-static string textAffinityDescription(WebTextAffinity affinity)
-{
-    switch (affinity) {
-    case WebKit::WebTextAffinityUpstream:
-        return "NSSelectionAffinityUpstream";
-    case WebKit::WebTextAffinityDownstream:
-        return "NSSelectionAffinityDownstream";
-    }
-    return "(UNKNOWN AFFINITY)";
-}
-
 // WebViewClient -------------------------------------------------------------
 
-WebView* WebViewHost::createView(WebFrame* creator, const WebURLRequest& request, const WebWindowFeatures&, const WebString&, WebNavigationPolicy)
+WebView* WebViewHost::createView(WebFrame* creator, const WebURLRequest&, const WebWindowFeatures&, const WebString&, WebNavigationPolicy)
 {
-    if (!testRunner()->canOpenWindows())
-        return 0;
-    if (testRunner()->shouldDumpCreateView())
-        fprintf(stdout, "createView(%s)\n", URLDescription(request.url()).c_str());
-    creator->consumeUserGesture();
+    WebUserGestureIndicator::consumeUserGesture();
     return m_shell->createNewWindow(WebURL())->webView();
 }
 
@@ -291,164 +122,52 @@
     return webkit_support::CreateSessionStorageNamespace(quota);
 }
 
-WebCompositorOutputSurface* WebViewHost::createOutputSurface()
-{
-    if (!webView())
-        return 0;
-
-    if (m_shell->softwareCompositingEnabled())
-        return WebViewHostOutputSurface::createSoftware(adoptPtr(new WebViewHostSoftwareOutputDevice)).leakPtr();
-    return WebViewHostOutputSurface::create3d(adoptPtr(webkit_support::CreateGraphicsContext3D(WebGraphicsContext3D::Attributes(), webView()))).leakPtr();
-}
-
 void WebViewHost::didAddMessageToConsole(const WebConsoleMessage& message, const WebString& sourceName, unsigned sourceLine)
 {
-    // This matches win DumpRenderTree's UIDelegate.cpp.
-    if (!m_logConsoleOutput)
-        return;
-    string newMessage;
-    if (!message.text.isEmpty()) {
-        newMessage = message.text.utf8();
-        size_t fileProtocol = newMessage.find("file://");
-        if (fileProtocol != string::npos) {
-            newMessage = newMessage.substr(0, fileProtocol)
-                + urlSuitableForTestResult(newMessage.substr(fileProtocol));
-        }
-    }
-    printf("CONSOLE MESSAGE: ");
-    if (sourceLine)
-        printf("line %d: ", sourceLine);
-    printf("%s\n", newMessage.data());
 }
 
 void WebViewHost::didStartLoading()
 {
-    m_shell->setIsLoading(true);
 }
 
 void WebViewHost::didStopLoading()
 {
-    if (testRunner()->shouldDumpProgressFinishedCallback())
-        fputs("postProgressFinishedNotification\n", stdout);
-    m_shell->setIsLoading(false);
 }
 
-// The output from these methods in layout test mode should match that
-// expected by the layout tests. See EditingDelegate.m in DumpRenderTree.
-
 bool WebViewHost::shouldBeginEditing(const WebRange& range)
 {
-    if (testRunner()->shouldDumpEditingCallbacks()) {
-        fputs("EDITING DELEGATE: shouldBeginEditingInDOMRange:", stdout);
-        printRangeDescription(range);
-        fputs("\n", stdout);
-    }
-    return testRunner()->acceptsEditing();
+    return true;
 }
 
 bool WebViewHost::shouldEndEditing(const WebRange& range)
 {
-    if (testRunner()->shouldDumpEditingCallbacks()) {
-        fputs("EDITING DELEGATE: shouldEndEditingInDOMRange:", stdout);
-        printRangeDescription(range);
-        fputs("\n", stdout);
-    }
-    return testRunner()->acceptsEditing();
+    return true;
 }
 
 bool WebViewHost::shouldInsertNode(const WebNode& node, const WebRange& range, WebEditingAction action)
 {
-    if (testRunner()->shouldDumpEditingCallbacks()) {
-        fputs("EDITING DELEGATE: shouldInsertNode:", stdout);
-        printNodeDescription(node, 0);
-        fputs(" replacingDOMRange:", stdout);
-        printRangeDescription(range);
-        printf(" givenAction:%s\n", editingActionDescription(action).c_str());
-    }
-    return testRunner()->acceptsEditing();
+    return true;
 }
 
 bool WebViewHost::shouldInsertText(const WebString& text, const WebRange& range, WebEditingAction action)
 {
-    if (testRunner()->shouldDumpEditingCallbacks()) {
-        printf("EDITING DELEGATE: shouldInsertText:%s replacingDOMRange:", text.utf8().data());
-        printRangeDescription(range);
-        printf(" givenAction:%s\n", editingActionDescription(action).c_str());
-    }
-    return testRunner()->acceptsEditing();
+    return true;
 }
 
 bool WebViewHost::shouldChangeSelectedRange(
     const WebRange& fromRange, const WebRange& toRange, WebTextAffinity affinity, bool stillSelecting)
 {
-    if (testRunner()->shouldDumpEditingCallbacks()) {
-        fputs("EDITING DELEGATE: shouldChangeSelectedDOMRange:", stdout);
-        printRangeDescription(fromRange);
-        fputs(" toDOMRange:", stdout);
-        printRangeDescription(toRange);
-        printf(" affinity:%s stillSelecting:%s\n",
-               textAffinityDescription(affinity).c_str(),
-               (stillSelecting ? "TRUE" : "FALSE"));
-    }
-    return testRunner()->acceptsEditing();
+    return true;
 }
 
 bool WebViewHost::shouldDeleteRange(const WebRange& range)
 {
-    if (testRunner()->shouldDumpEditingCallbacks()) {
-        fputs("EDITING DELEGATE: shouldDeleteDOMRange:", stdout);
-        printRangeDescription(range);
-        fputs("\n", stdout);
-    }
-    return testRunner()->acceptsEditing();
+    return true;
 }
 
 bool WebViewHost::shouldApplyStyle(const WebString& style, const WebRange& range)
 {
-    if (testRunner()->shouldDumpEditingCallbacks()) {
-        printf("EDITING DELEGATE: shouldApplyStyle:%s toElementsInDOMRange:", style.utf8().data());
-        printRangeDescription(range);
-        fputs("\n", stdout);
-    }
-    return testRunner()->acceptsEditing();
-}
-
-bool WebViewHost::isSmartInsertDeleteEnabled()
-{
-    return m_smartInsertDeleteEnabled;
-}
-
-bool WebViewHost::isSelectTrailingWhitespaceEnabled()
-{
-    return m_selectTrailingWhitespaceEnabled;
-}
-
-void WebViewHost::didBeginEditing()
-{
-    if (!testRunner()->shouldDumpEditingCallbacks())
-        return;
-    fputs("EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification\n", stdout);
-}
-
-void WebViewHost::didChangeSelection(bool isEmptySelection)
-{
-    if (testRunner()->shouldDumpEditingCallbacks())
-        fputs("EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification\n", stdout);
-    // No need to update clipboard with the selected text in DRT.
-}
-
-void WebViewHost::didChangeContents()
-{
-    if (!testRunner()->shouldDumpEditingCallbacks())
-        return;
-    fputs("EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification\n", stdout);
-}
-
-void WebViewHost::didEndEditing()
-{
-    if (!testRunner()->shouldDumpEditingCallbacks())
-        return;
-    fputs("EDITING DELEGATE: webViewDidEndEditing:WebViewDidEndEditingNotification\n", stdout);
+    return true;
 }
 
 bool WebViewHost::handleCurrentKeyboardEvent()
@@ -469,135 +188,23 @@
 }
 
 
-// WebKit::WebSpellCheckClient
-
-void WebViewHost::spellCheck(const WebString& text, int& misspelledOffset, int& misspelledLength, WebVector<WebString>* optionalSuggestions)
-{
-    // Check the spelling of the given text.
-    m_spellcheck.spellCheckWord(text, &misspelledOffset, &misspelledLength);
-}
-
-void WebViewHost::checkTextOfParagraph(const WebString& text, WebTextCheckingTypeMask mask, WebVector<WebTextCheckingResult>* webResults)
-{
-    Vector<WebTextCheckingResult> results;
-    if (mask & WebTextCheckingTypeSpelling) {
-        size_t offset = 0;
-        size_t length = text.length();
-        const WebUChar* data = text.data();
-        while (offset < length) {
-            int misspelledPosition = 0;
-            int misspelledLength = 0;
-            m_spellcheck.spellCheckWord(WebString(&data[offset], length - offset), &misspelledPosition, &misspelledLength);
-            if (!misspelledLength)
-                break;
-            WebTextCheckingResult result;
-            result.type = WebTextCheckingTypeSpelling;
-            result.location = offset + misspelledPosition;
-            result.length = misspelledLength;
-            results.append(result);
-            offset += misspelledPosition + misspelledLength;
-        }
-    }
-    if (mask & WebTextCheckingTypeGrammar)
-        MockGrammarCheck::checkGrammarOfString(text, &results);
-    webResults->assign(results);
-}
-
-void WebViewHost::requestCheckingOfText(const WebString& text, WebTextCheckingCompletion* completion)
-{
-    if (text.isEmpty()) {
-        if (completion)
-            completion->didCancelCheckingText();
-        return;
-    }
-
-    m_lastRequestedTextCheckingCompletion = completion;
-    m_lastRequestedTextCheckString = text;
-    postDelayedTask(new HostMethodTask(this, &WebViewHost::finishLastTextCheck), 0);
-}
-
-void WebViewHost::finishLastTextCheck()
-{
-    Vector<WebTextCheckingResult> results;
-    int offset = 0;
-    String text(m_lastRequestedTextCheckString.data(), m_lastRequestedTextCheckString.length());
-    while (text.length()) {
-        int misspelledPosition = 0;
-        int misspelledLength = 0;
-        m_spellcheck.spellCheckWord(WebString(text.characters(), text.length()), &misspelledPosition, &misspelledLength);
-        if (!misspelledLength)
-            break;
-        WebVector<WebString> suggestions;
-        m_spellcheck.fillSuggestionList(WebString(text.characters() + misspelledPosition, misspelledLength), &suggestions);
-        results.append(WebTextCheckingResult(WebTextCheckingTypeSpelling, offset + misspelledPosition, misspelledLength,
-                                             suggestions.isEmpty() ? WebString() : suggestions[0]));
-        text = text.substring(misspelledPosition + misspelledLength);
-        offset += misspelledPosition + misspelledLength;
-    }
-    MockGrammarCheck::checkGrammarOfString(m_lastRequestedTextCheckString, &results);
-    m_lastRequestedTextCheckingCompletion->didFinishCheckingText(results);
-    m_lastRequestedTextCheckingCompletion = 0;
-}
-
-
-WebString WebViewHost::autoCorrectWord(const WebString&)
-{
-    // Returns an empty string as Mac WebKit ('WebKitSupport/WebEditorClient.mm')
-    // does. (If this function returns a non-empty string, WebKit replaces the
-    // given misspelled string with the result one. This process executes some
-    // editor commands and causes layout-test failures.)
-    return WebString();
-}
-
 void WebViewHost::runModalAlertDialog(WebFrame*, const WebString& message)
 {
-    printf("ALERT: %s\n", message.utf8().data());
-    fflush(stdout);
 }
 
 bool WebViewHost::runModalConfirmDialog(WebFrame*, const WebString& message)
 {
-    printf("CONFIRM: %s\n", message.utf8().data());
     return true;
 }
 
 bool WebViewHost::runModalPromptDialog(WebFrame* frame, const WebString& message,
                                        const WebString& defaultValue, WebString*)
 {
-    printf("PROMPT: %s, default text: %s\n", message.utf8().data(), defaultValue.utf8().data());
     return true;
 }
 
-bool WebViewHost::runModalBeforeUnloadDialog(WebFrame*, const WebString& message)
-{
-    printf("CONFIRM NAVIGATION: %s\n", message.utf8().data());
-    return !testRunner()->shouldStayOnPageAfterHandlingBeforeUnload();
-}
-
 void WebViewHost::showContextMenu(WebFrame*, const WebContextMenuData& contextMenuData)
 {
-    m_lastContextMenuData = adoptPtr(new WebContextMenuData(contextMenuData));
-}
-
-void WebViewHost::setStatusText(const WebString& text)
-{
-    if (!testRunner()->shouldDumpStatusCallbacks())
-        return;
-    // When running tests, write to stdout.
-    printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", text.utf8().data());
-}
-
-void WebViewHost::startDragging(WebFrame*, const WebDragData& data, WebDragOperationsMask mask, const WebImage&, const WebPoint&)
-{
-    WebDragData mutableDragData = data;
-    if (testRunner()->shouldAddFileToPasteboard()) {
-        // Add a file called DRTFakeFile to the drag&drop clipboard.
-        addDRTFakeFileToDataObject(&mutableDragData);
-    }
-
-    // When running a test, we need to fake a drag drop operation otherwise
-    // Windows waits for real mouse events to know when the drag is over.
-    m_shell->eventSender()->doDragDrop(mutableDragData, mask);
 }
 
 void WebViewHost::didUpdateLayout()
@@ -633,88 +240,8 @@
     return navigationController()->entryCount() - currentIndex - 1;
 }
 
-#if ENABLE(NOTIFICATIONS)
-WebNotificationPresenter* WebViewHost::notificationPresenter()
-{
-    return m_shell->notificationPresenter();
-}
-#endif
-
-WebKit::WebGeolocationClient* WebViewHost::geolocationClient()
-{
-    return geolocationClientMock();
-}
-
-WebKit::WebGeolocationClientMock* WebViewHost::geolocationClientMock()
-{
-    if (!m_geolocationClientMock)
-        m_geolocationClientMock = adoptPtr(WebGeolocationClientMock::create());
-    return m_geolocationClientMock.get();
-}
-
-#if ENABLE(INPUT_SPEECH)
-WebSpeechInputController* WebViewHost::speechInputController(WebKit::WebSpeechInputListener* listener)
-{
-    if (!m_speechInputControllerMock)
-        m_speechInputControllerMock = MockWebSpeechInputController::create(listener);
-    return m_speechInputControllerMock.get();
-}
-#endif
-
-#if ENABLE(SCRIPTED_SPEECH)
-WebSpeechRecognizer* WebViewHost::speechRecognizer()
-{
-    if (!m_mockSpeechRecognizer)
-        m_mockSpeechRecognizer = MockWebSpeechRecognizer::create();
-    return m_mockSpeechRecognizer.get();
-}
-#endif
-
-WebDeviceOrientationClientMock* WebViewHost::deviceOrientationClientMock()
-{
-    if (!m_deviceOrientationClientMock.get())
-        m_deviceOrientationClientMock = adoptPtr(WebDeviceOrientationClientMock::create());
-    return m_deviceOrientationClientMock.get();
-}
-
-MockSpellCheck* WebViewHost::mockSpellCheck()
-{
-    return &m_spellcheck;
-}
-
-WebDeviceOrientationClient* WebViewHost::deviceOrientationClient()
-{
-    return deviceOrientationClientMock();
-}
-
-#if ENABLE(MEDIA_STREAM)
-WebUserMediaClient* WebViewHost::userMediaClient()
-{
-    return userMediaClientMock();
-}
-
-WebUserMediaClientMock* WebViewHost::userMediaClientMock()
-{
-    if (!m_userMediaClientMock.get())
-        m_userMediaClientMock = WebUserMediaClientMock::create();
-    return m_userMediaClientMock.get();
-}
-#endif
-
 // WebWidgetClient -----------------------------------------------------------
 
-void WebViewHost::didInvalidateRect(const WebRect& rect)
-{
-    updatePaintRect(rect);
-}
-
-void WebViewHost::didScrollRect(int, int, const WebRect& clipRect)
-{
-    // This is used for optimizing painting when the renderer is scrolled. We're
-    // currently not doing any optimizations so just invalidate the region.
-    didInvalidateRect(clipRect);
-}
-
 void WebViewHost::didAutoResize(const WebSize& newSize)
 {
     // Purposely don't include the virtualWindowBorder in this case so that
@@ -722,35 +249,56 @@
     setWindowRect(WebRect(0, 0, newSize.width, newSize.height));
 }
 
-void WebViewHost::scheduleComposite()
+class WebViewHostDRTLayerTreeViewClient : public webkit_support::DRTLayerTreeViewClient {
+public:
+    explicit WebViewHostDRTLayerTreeViewClient(WebViewHost* host)
+        : m_host(host) { }
+    virtual ~WebViewHostDRTLayerTreeViewClient() { }
+
+    virtual void Layout() { m_host->webView()->layout(); }
+    virtual void ScheduleComposite() { m_host->proxy()->scheduleComposite(); }
+
+private:
+    WebViewHost* m_host;
+};
+
+void WebViewHost::initializeLayerTreeView()
 {
-    WebSize widgetSize = webWidget()->size();
-    WebRect clientRect(0, 0, widgetSize.width, widgetSize.height);
-    didInvalidateRect(clientRect);
+    m_layerTreeViewClient = adoptPtr(new WebViewHostDRTLayerTreeViewClient(this));
+    if (m_shell->softwareCompositingEnabled()) {
+        m_layerTreeView = adoptPtr(webkit_support::CreateLayerTreeView(
+            webkit_support::SOFTWARE_CONTEXT,
+            m_layerTreeViewClient.get(),
+            m_shell->webCompositorThread()));
+    } else {
+        m_layerTreeView = adoptPtr(webkit_support::CreateLayerTreeView(
+            webkit_support::MESA_CONTEXT,
+            m_layerTreeViewClient.get(),
+            m_shell->webCompositorThread()));
+    }
+
+    ASSERT(m_layerTreeView);
+    updateViewportSize();
+    m_layerTreeView->setSurfaceReady();
 }
 
-#if ENABLE(REQUEST_ANIMATION_FRAME)
-void WebViewHost::serviceAnimation()
+WebLayerTreeView* WebViewHost::layerTreeView()
 {
-    if (webView()->settings()->scrollAnimatorEnabled())
-        webView()->animate(0.0);
-    scheduleComposite();
+    return m_layerTreeView.get();
 }
 
 void WebViewHost::scheduleAnimation()
 {
-    postDelayedTask(new HostMethodTask(this, &WebViewHost::serviceAnimation), 0);
+    if (webView()->settings()->scrollAnimatorEnabled())
+        webView()->animate(0.0);
 }
-#endif
 
 void WebViewHost::didFocus()
 {
-    m_shell->setFocus(webWidget(), true);
 }
 
 void WebViewHost::didBlur()
 {
-    m_shell->setFocus(webWidget(), false);
 }
 
 WebScreenInfo WebViewHost::screenInfo()
@@ -768,68 +316,9 @@
     return info;
 }
 
-#if ENABLE(POINTER_LOCK)
-bool WebViewHost::requestPointerLock()
-{
-    switch (m_pointerLockPlannedResult) {
-    case PointerLockWillSucceed:
-        postDelayedTask(new HostMethodTask(this, &WebViewHost::didAcquirePointerLock), 0);
-        return true;
-    case PointerLockWillRespondAsync:
-        ASSERT(!m_pointerLocked);
-        return true;
-    case PointerLockWillFailSync:
-        ASSERT(!m_pointerLocked);
-        return false;
-    default:
-        ASSERT_NOT_REACHED();
-        return false;
-    }
-}
-
-void WebViewHost::requestPointerUnlock()
-{
-    postDelayedTask(new HostMethodTask(this, &WebViewHost::didLosePointerLock), 0);
-}
-
-bool WebViewHost::isPointerLocked()
-{
-    return m_pointerLocked;
-}
-
-void WebViewHost::didAcquirePointerLock()
-{
-    m_pointerLocked = true;
-    webWidget()->didAcquirePointerLock();
-
-    // Reset planned result to default.
-    m_pointerLockPlannedResult = PointerLockWillSucceed;
-}
-
-void WebViewHost::didNotAcquirePointerLock()
-{
-    ASSERT(!m_pointerLocked);
-    m_pointerLocked = false;
-    webWidget()->didNotAcquirePointerLock();
-
-    // Reset planned result to default.
-    m_pointerLockPlannedResult = PointerLockWillSucceed;
-}
-
-void WebViewHost::didLosePointerLock()
-{
-    bool wasLocked = m_pointerLocked;
-    m_pointerLocked = false;
-    if (wasLocked)
-        webWidget()->didLosePointerLock();
-}
-#endif
-
 void WebViewHost::show(WebNavigationPolicy)
 {
     m_hasWindow = true;
-    WebSize size = webWidget()->size();
-    updatePaintRect(WebRect(0, 0, size.width, size.height));
 }
 
 
@@ -868,9 +357,8 @@
         m_windowRect.height = 1 + border2;
     int width = m_windowRect.width - border2;
     int height = m_windowRect.height - border2;
-    discardBackingStore();
     webWidget()->resize(WebSize(width, height));
-    updatePaintRect(WebRect(0, 0, width, height));
+    updateViewportSize();
 }
 
 WebRect WebViewHost::rootWindowRect()
@@ -918,9 +406,6 @@
 
 WebPlugin* WebViewHost::createPlugin(WebFrame* frame, const WebPluginParams& params)
 {
-    if (params.mimeType == TestWebPlugin::mimeType())
-        return new TestWebPlugin(frame, params);
-
     return webkit_support::CreateWebPlugin(frame, params);
 }
 
@@ -952,48 +437,16 @@
 }
 
 WebNavigationPolicy WebViewHost::decidePolicyForNavigation(
-    WebFrame*, const WebURLRequest& request,
-    WebNavigationType type, const WebNode& originatingNode,
-    WebNavigationPolicy defaultPolicy, bool isRedirect)
+    WebFrame*, const WebURLRequest&,
+    WebNavigationType, const WebNode&,
+    WebNavigationPolicy defaultPolicy, bool)
 {
-    WebNavigationPolicy result;
-    if (!m_policyDelegateEnabled)
-        return defaultPolicy;
-
-    printf("Policy delegate: attempt to load %s with navigation type '%s'",
-           URLDescription(request.url()).c_str(), webNavigationTypeToString(type));
-    if (!originatingNode.isNull()) {
-        fputs(" originating from ", stdout);
-        printNodeDescription(originatingNode, 0);
-    }
-    fputs("\n", stdout);
-    if (m_policyDelegateIsPermissive)
-        result = WebKit::WebNavigationPolicyCurrentTab;
-    else
-        result = WebKit::WebNavigationPolicyIgnore;
-
-    if (m_policyDelegateShouldNotifyDone)
-        testRunner()->policyDelegateDone();
-    return result;
+    return defaultPolicy;
 }
 
 bool WebViewHost::canHandleRequest(WebFrame*, const WebURLRequest& request)
 {
-    GURL url = request.url();
-    // Just reject the scheme used in
-    // LayoutTests/http/tests/misc/redirect-to-external-url.html
-    return !url.SchemeIs("spaceballs");
-}
-
-WebURLError WebViewHost::cannotHandleRequestError(WebFrame*, const WebURLRequest& request)
-{
-    WebURLError error;
-    // A WebKit layout test expects the following values.
-    // unableToImplementPolicyWithError() below prints them.
-    error.domain = WebString::fromUTF8("WebKitErrorDomain");
-    error.reason = 101;
-    error.unreachableURL = request.url();
-    return error;
+    return true;
 }
 
 WebURLError WebViewHost::cancelledError(WebFrame*, const WebURLRequest& request)
@@ -1003,87 +456,15 @@
 
 void WebViewHost::unableToImplementPolicyWithError(WebFrame* frame, const WebURLError& error)
 {
-    printf("Policy delegate: unable to implement policy with error domain '%s', "
-           "error code %d, in frame '%s'\n",
-            error.domain.utf8().data(), error.reason, frame->uniqueName().utf8().data());
-}
-
-void WebViewHost::willPerformClientRedirect(WebFrame* frame, const WebURL& from, const WebURL& to,
-                                            double interval, double fire_time)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        printf(" - willPerformClientRedirectToURL: %s \n", to.spec().data());
-    }
-
-    if (m_shell->shouldDumpUserGestureInFrameLoadCallbacks())
-        printFrameUserGestureStatus(frame, " - in willPerformClientRedirect\n");
-}
-
-void WebViewHost::didCancelClientRedirect(WebFrame* frame)
-{
-    if (!m_shell->shouldDumpFrameLoadCallbacks())
-        return;
-    printFrameDescription(frame);
-    fputs(" - didCancelClientRedirectForFrame\n", stdout);
 }
 
 void WebViewHost::didCreateDataSource(WebFrame*, WebDataSource* ds)
 {
     ds->setExtraData(m_pendingExtraData.leakPtr());
-    if (!testRunner()->deferMainResourceDataLoad())
-        ds->setDeferMainResourceDataLoad(false);
-}
-
-void WebViewHost::didStartProvisionalLoad(WebFrame* frame)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didStartProvisionalLoadForFrame\n", stdout);
-    }
-
-    if (m_shell->shouldDumpUserGestureInFrameLoadCallbacks())
-        printFrameUserGestureStatus(frame, " - in didStartProvisionalLoadForFrame\n");
-
-    if (!m_topLoadingFrame)
-        m_topLoadingFrame = frame;
-
-    if (testRunner()->stopProvisionalFrameLoads()) {
-        printFrameDescription(frame);
-        fputs(" - stopping load in didStartProvisionalLoadForFrame callback\n", stdout);
-        frame->stopLoading();
-    }
-    updateAddressBar(frame->view());
-}
-
-void WebViewHost::didReceiveServerRedirectForProvisionalLoad(WebFrame* frame)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didReceiveServerRedirectForProvisionalLoadForFrame\n", stdout);
-    }
-    updateAddressBar(frame->view());
-}
-
-void WebViewHost::didFailProvisionalLoad(WebFrame* frame, const WebURLError& error)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didFailProvisionalLoadWithError\n", stdout);
-    }
-
-    locationChangeDone(frame);
-
-    // Don't display an error page if we're running layout tests, because
-    // DumpRenderTree doesn't.
 }
 
 void WebViewHost::didCommitProvisionalLoad(WebFrame* frame, bool isNewNavigation)
 {
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didCommitLoadForFrame\n", stdout);
-    }
     updateForCommittedLoad(frame, isNewNavigation);
 }
 
@@ -1094,59 +475,11 @@
 
 void WebViewHost::didReceiveTitle(WebFrame* frame, const WebString& title, WebTextDirection direction)
 {
-    WebCString title8 = title.utf8();
-
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        printf(" - didReceiveTitle: %s\n", title8.data());
-    }
-
-    if (testRunner()->shouldDumpTitleChanges())
-        printf("TITLE CHANGED: '%s'\n", title8.data());
-
     setPageTitle(title);
-    testRunner()->setTitleTextDirection(direction);
 }
 
-void WebViewHost::didFinishDocumentLoad(WebFrame* frame)
+void WebViewHost::didChangeIcon(WebFrame* , WebIconURL::Type)
 {
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didFinishDocumentLoadForFrame\n", stdout);
-    } else {
-        unsigned pendingUnloadEvents = frame->unloadListenerCount();
-        if (pendingUnloadEvents) {
-            printFrameDescription(frame);
-            printf(" - has %u onunload handler(s)\n", pendingUnloadEvents);
-        }
-    }
-}
-
-void WebViewHost::didHandleOnloadEvents(WebFrame* frame)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didHandleOnloadEventsForFrame\n", stdout);
-    }
-}
-
-void WebViewHost::didFailLoad(WebFrame* frame, const WebURLError& error)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didFailLoadWithError\n", stdout);
-    }
-    locationChangeDone(frame);
-}
-
-void WebViewHost::didFinishLoad(WebFrame* frame)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didFinishLoadForFrame\n", stdout);
-    }
-    updateAddressBar(frame->view());
-    locationChangeDone(frame);
 }
 
 void WebViewHost::didNavigateWithinPage(WebFrame* frame, bool isNewNavigation)
@@ -1156,224 +489,31 @@
     updateForCommittedLoad(frame, isNewNavigation);
 }
 
-void WebViewHost::didChangeLocationWithinPage(WebFrame* frame)
+void WebViewHost::willSendRequest(WebFrame* frame, unsigned, WebURLRequest& request, const WebURLResponse&)
 {
-    if (m_shell->shouldDumpFrameLoadCallbacks()) {
-        printFrameDescription(frame);
-        fputs(" - didChangeLocationWithinPageForFrame\n", stdout);
-    }
-}
-
-void WebViewHost::assignIdentifierToRequest(WebFrame*, unsigned identifier, const WebURLRequest& request)
-{
-     if (!m_shell->shouldDumpResourceLoadCallbacks())
+    if (request.url().isEmpty())
         return;
-    ASSERT(!m_resourceIdentifierMap.contains(identifier));
-    m_resourceIdentifierMap.set(identifier, descriptionSuitableForTestResult(request.url().spec()));
-}
-
-void WebViewHost::removeIdentifierForRequest(unsigned identifier)
-{
-    m_resourceIdentifierMap.remove(identifier);
-}
-
-static void blockRequest(WebURLRequest& request)
-{
-    request.setURL(WebURL());
-}
-
-static bool isLocalhost(const string& host)
-{
-    return host == "127.0.0.1" || host == "localhost";
-}
-
-static bool hostIsUsedBySomeTestsToGenerateError(const string& host)
-{
-    return host == "255.255.255.255";
-}
-
-void WebViewHost::willSendRequest(WebFrame* frame, unsigned identifier, WebURLRequest& request, const WebURLResponse& redirectResponse)
-{
-    // Need to use GURL for host() and SchemeIs()
-    GURL url = request.url();
-    string requestURL = url.possibly_invalid_spec();
-
-    GURL mainDocumentURL = request.firstPartyForCookies();
-    if (testRunner()->shouldDumpResourceLoadCallbacks()) {
-        printResourceDescription(identifier);
-        printf(" - willSendRequest <NSURLRequest URL %s, main document URL %s,"
-               " http method %s> redirectResponse ",
-               descriptionSuitableForTestResult(requestURL).c_str(),
-               URLDescription(mainDocumentURL).c_str(),
-               request.httpMethod().utf8().data());
-        printResponseDescription(redirectResponse);
-        fputs("\n", stdout);
-    }
 
     request.setExtraData(webkit_support::CreateWebURLRequestExtraData(frame->document().referrerPolicy()));
-
-    if (!redirectResponse.isNull() && m_blocksRedirects) {
-        fputs("Returning null for this redirect\n", stdout);
-        blockRequest(request);
-        return;
-    }
-
-    if (m_requestReturnNull) {
-        blockRequest(request);
-        return;
-    }
-
-    string host = url.host();
-    if (!host.empty() && (url.SchemeIs("http") || url.SchemeIs("https"))) {
-        if (!isLocalhost(host) && !hostIsUsedBySomeTestsToGenerateError(host)
-            && ((!mainDocumentURL.SchemeIs("http") && !mainDocumentURL.SchemeIs("https")) || isLocalhost(mainDocumentURL.host()))
-            && !m_shell->allowExternalPages()) {
-            printf("Blocked access to external URL %s\n", requestURL.c_str());
-            blockRequest(request);
-            return;
-        }
-    }
-
-    HashSet<String>::const_iterator end = m_clearHeaders.end();
-    for (HashSet<String>::const_iterator header = m_clearHeaders.begin(); header != end; ++header)
-        request.clearHTTPHeaderField(WebString(header->characters(), header->length()));
-
-    // Set the new substituted URL.
-    request.setURL(webkit_support::RewriteLayoutTestsURL(request.url().spec()));
 }
 
-void WebViewHost::didReceiveResponse(WebFrame*, unsigned identifier, const WebURLResponse& response)
-{
-    if (m_shell->shouldDumpResourceLoadCallbacks()) {
-        printResourceDescription(identifier);
-        fputs(" - didReceiveResponse ", stdout);
-        printResponseDescription(response);
-        fputs("\n", stdout);
-    }
-    if (m_shell->shouldDumpResourceResponseMIMETypes()) {
-        GURL url = response.url();
-        WebString mimeType = response.mimeType();
-        printf("%s has MIME type %s\n",
-            url.ExtractFileName().c_str(),
-            // Simulate NSURLResponse's mapping of empty/unknown MIME types to application/octet-stream
-            mimeType.isEmpty() ? "application/octet-stream" : mimeType.utf8().data());
-    }
-}
-
-void WebViewHost::didFinishResourceLoad(WebFrame*, unsigned identifier)
-{
-    if (m_shell->shouldDumpResourceLoadCallbacks()) {
-        printResourceDescription(identifier);
-        fputs(" - didFinishLoading\n", stdout);
-    }
-    removeIdentifierForRequest(identifier);
-}
-
-void WebViewHost::didFailResourceLoad(WebFrame*, unsigned identifier, const WebURLError& error)
-{
-    if (m_shell->shouldDumpResourceLoadCallbacks()) {
-        printResourceDescription(identifier);
-        fputs(" - didFailLoadingWithError: ", stdout);
-        fputs(webkit_support::MakeURLErrorDescription(error).c_str(), stdout);
-        fputs("\n", stdout);
-    }
-    removeIdentifierForRequest(identifier);
-}
-
-void WebViewHost::didDisplayInsecureContent(WebFrame*)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks())
-        fputs("didDisplayInsecureContent\n", stdout);
-}
-
-void WebViewHost::didRunInsecureContent(WebFrame*, const WebSecurityOrigin& origin, const WebURL& insecureURL)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks())
-        fputs("didRunInsecureContent\n", stdout);
-}
-
-void WebViewHost::didDetectXSS(WebFrame*, const WebURL&, bool)
-{
-    if (m_shell->shouldDumpFrameLoadCallbacks())
-        fputs("didDetectXSS\n", stdout);
-}
-
-void WebViewHost::openFileSystem(WebFrame* frame, WebFileSystem::Type type, long long size, bool create, WebFileSystemCallbacks* callbacks)
+void WebViewHost::openFileSystem(WebFrame* frame, WebFileSystemType type, long long size, bool create, WebFileSystemCallbacks* callbacks)
 {
     webkit_support::OpenFileSystem(frame, type, size, create, callbacks);
 }
 
-void WebViewHost::deleteFileSystem(WebKit::WebFrame* frame, WebKit::WebFileSystem::Type type, WebKit::WebFileSystemCallbacks* callbacks)
+void WebViewHost::deleteFileSystem(WebKit::WebFrame* frame, WebKit::WebFileSystemType type, WebKit::WebFileSystemCallbacks* callbacks)
 {
     webkit_support::DeleteFileSystem(frame, type, callbacks);
 }
 
 bool WebViewHost::willCheckAndDispatchMessageEvent(WebFrame* sourceFrame, WebFrame* targetFrame, WebSecurityOrigin target, WebDOMMessageEvent event)
 {
-    if (m_shell->testRunner()->shouldInterceptPostMessage()) {
-        fputs("intercepted postMessage\n", stdout);
-        return true;
-    }
-
     return false;
 }
 
-void WebViewHost::registerIntentService(WebKit::WebFrame*, const WebKit::WebIntentServiceInfo& service)
-{
-    printf("Registered Web Intent Service: action=%s type=%s title=%s url=%s disposition=%s\n",
-           service.action().utf8().data(), service.type().utf8().data(), service.title().utf8().data(), service.url().spec().data(), service.disposition().utf8().data());
-}
-
-void WebViewHost::dispatchIntent(WebFrame* source, const WebIntentRequest& request)
-{
-    printf("Received Web Intent: action=%s type=%s\n",
-           request.intent().action().utf8().data(),
-           request.intent().type().utf8().data());
-    WebMessagePortChannelArray* ports = request.intent().messagePortChannelsRelease();
-    m_currentRequest = request;
-    if (ports) {
-        printf("Have %d ports\n", static_cast<int>(ports->size()));
-        for (size_t i = 0; i < ports->size(); ++i)
-            (*ports)[i]->destroy();
-        delete ports;
-    }
-
-    if (!request.intent().service().isEmpty())
-        printf("Explicit intent service: %s\n", request.intent().service().spec().data());
-
-    WebVector<WebString> extras = request.intent().extrasNames();
-    for (size_t i = 0; i < extras.size(); ++i) {
-        printf("Extras[%s] = %s\n", extras[i].utf8().data(),
-               request.intent().extrasValue(extras[i]).utf8().data());
-    }
-
-    WebVector<WebURL> suggestions = request.intent().suggestions();
-    for (size_t i = 0; i < suggestions.size(); ++i)
-        printf("Have suggestion %s\n", suggestions[i].spec().data());
-}
-
-void WebViewHost::deliveredIntentResult(WebFrame* frame, int id, const WebSerializedScriptValue& data)
-{
-    printf("Web intent success for id %d\n", id);
-}
-
-void WebViewHost::deliveredIntentFailure(WebFrame* frame, int id, const WebSerializedScriptValue& data)
-{
-    printf("Web intent failure for id %d\n", id);
-}
-
 // WebTestDelegate ------------------------------------------------------------
 
-WebContextMenuData* WebViewHost::lastContextMenuData() const
-{
-    return m_lastContextMenuData.get();
-}
-
-void WebViewHost::clearContextMenuData()
-{
-    m_lastContextMenuData.clear();
-}
-
 void WebViewHost::setEditCommand(const string& name, const string& value)
 {
     m_editCommandName = name;
@@ -1386,11 +526,6 @@
     m_editCommandValue.clear();
 }
 
-void WebViewHost::fillSpellingSuggestionList(const WebKit::WebString& word, WebKit::WebVector<WebKit::WebString>* suggestions)
-{
-    mockSpellCheck()->fillSuggestionList(word, suggestions);
-}
-
 void WebViewHost::setGamepadData(const WebGamepads& pads)
 {
     webkit_support::SetGamepadData(pads);
@@ -1426,41 +561,220 @@
     return webkit_support::GetAbsoluteWebStringFromUTF8Path(path);
 }
 
+WebURL WebViewHost::localFileToDataURL(const WebKit::WebURL& url)
+{
+    return webkit_support::LocalFileToDataURL(url);
+}
+
+WebURL WebViewHost::rewriteLayoutTestsURL(const std::string& url)
+{
+    return webkit_support::RewriteLayoutTestsURL(url);
+}
+
+WebPreferences* WebViewHost::preferences()
+{
+    return m_shell->preferences();
+}
+
+void WebViewHost::applyPreferences()
+{
+    m_shell->applyPreferences();
+}
+
+std::string WebViewHost::makeURLErrorDescription(const WebKit::WebURLError& error)
+{
+    return webkit_support::MakeURLErrorDescription(error);
+}
+
+void WebViewHost::showDevTools()
+{
+    m_shell->showDevTools();
+}
+
+void WebViewHost::closeDevTools()
+{
+    m_shell->closeDevTools();
+}
+
+void WebViewHost::evaluateInWebInspector(long callID, const std::string& script)
+{
+    m_shell->drtDevToolsAgent()->evaluateInWebInspector(callID, script);
+}
+
+void WebViewHost::clearAllDatabases()
+{
+    webkit_support::ClearAllDatabases();
+}
+
+void WebViewHost::setDatabaseQuota(int quota)
+{
+    webkit_support::SetDatabaseQuota(quota);
+}
+
+void WebViewHost::setDeviceScaleFactor(float deviceScaleFactor)
+{
+    webView()->setDeviceScaleFactor(deviceScaleFactor);
+    updateViewportSize();
+}
+
+void WebViewHost::setFocus(WebTestProxyBase* proxy, bool focused)
+{
+    for (size_t i = 0; i < m_shell->windowList().size(); ++i) {
+        if (m_shell->windowList()[i]->proxy() == proxy)
+            m_shell->setFocus(m_shell->windowList()[i]->webWidget(), focused);
+    }
+}
+
+void WebViewHost::setAcceptAllCookies(bool acceptCookies)
+{
+    webkit_support::SetAcceptAllCookies(acceptCookies);
+}
+
+string WebViewHost::pathToLocalResource(const string& url)
+{
+#if OS(WINDOWS)
+    if (!url.find("/tmp/")) {
+        // We want a temp file.
+        const unsigned tempPrefixLength = 5;
+        size_t bufferSize = MAX_PATH;
+        OwnArrayPtr<WCHAR> tempPath = adoptArrayPtr(new WCHAR[bufferSize]);
+        DWORD tempLength = ::GetTempPathW(bufferSize, tempPath.get());
+        if (tempLength + url.length() - tempPrefixLength + 1 > bufferSize) {
+            bufferSize = tempLength + url.length() - tempPrefixLength + 1;
+            tempPath = adoptArrayPtr(new WCHAR[bufferSize]);
+            tempLength = GetTempPathW(bufferSize, tempPath.get());
+            ASSERT(tempLength < bufferSize);
+        }
+        string resultPath(WebString(tempPath.get(), tempLength).utf8());
+        resultPath.append(url.substr(tempPrefixLength));
+        return resultPath;
+    }
+#endif
+
+    // Some layout tests use file://// which we resolve as a UNC path. Normalize
+    // them to just file:///.
+    string lowerUrl = url;
+    string result = url;
+    transform(lowerUrl.begin(), lowerUrl.end(), lowerUrl.begin(), ::tolower);
+    while (!lowerUrl.find("file:////")) {
+        result = result.substr(0, 8) + result.substr(9);
+        lowerUrl = lowerUrl.substr(0, 8) + lowerUrl.substr(9);
+    }
+    return webkit_support::RewriteLayoutTestsURL(result).spec();
+}
+
+void WebViewHost::setLocale(const std::string& locale)
+{
+    setlocale(LC_ALL, locale.c_str());
+}
+
+void WebViewHost::testFinished()
+{
+    m_shell->testFinished(this);
+}
+
+void WebViewHost::testTimedOut()
+{
+    m_shell->testTimedOut();
+}
+
+bool WebViewHost::isBeingDebugged()
+{
+    return webkit_support::BeingDebugged();
+}
+
+int WebViewHost::layoutTestTimeout()
+{
+    return m_shell->layoutTestTimeout();
+}
+
+void WebViewHost::closeRemainingWindows()
+{
+    m_shell->closeRemainingWindows();
+}
+
+int WebViewHost::navigationEntryCount()
+{
+    return m_shell->navigationEntryCount();
+}
+
+void WebViewHost::goToOffset(int offset)
+{
+    m_shell->goToOffset(offset);
+}
+
+void WebViewHost::reload()
+{
+    m_shell->reload();
+}
+
+void WebViewHost::loadURLForFrame(const WebURL& url, const string& frameName)
+{
+    if (!url.isValid())
+        return;
+    TestShell::resizeWindowForTest(this, url);
+    navigationController()->loadEntry(TestNavigationEntry::create(-1, url, WebString(), WebString::fromUTF8(frameName)).get());
+}
+
+bool WebViewHost::allowExternalPages()
+{
+    return m_shell->allowExternalPages();
+}
+
+void WebViewHost::captureHistoryForWindow(WebTestProxyBase* proxy, WebVector<WebHistoryItem>* history, size_t* currentEntryIndex)
+{
+    for (size_t i = 0; i < m_shell->windowList().size(); ++i) {
+        if (m_shell->windowList()[i]->proxy() == proxy)
+            m_shell->captureHistoryForWindow(i, history, currentEntryIndex);
+    }
+}
+
 // Public functions -----------------------------------------------------------
 
 WebViewHost::WebViewHost(TestShell* shell)
     : m_shell(shell)
+    , m_proxy(0)
     , m_webWidget(0)
-    , m_lastRequestedTextCheckingCompletion(0)
+    , m_shutdownWasInvoked(false)
 {
     reset();
 }
 
 WebViewHost::~WebViewHost()
 {
+    ASSERT(m_shutdownWasInvoked);
+    if (m_inModalLoop)
+        webkit_support::QuitMessageLoop();
+}
+
+void WebViewHost::shutdown()
+{
+    ASSERT(!m_shutdownWasInvoked);
+
     // DevTools frontend page is supposed to be navigated only once and
     // loading another URL in that Page is an error.
     if (m_shell->devToolsWebView() != this) {
         // Navigate to an empty page to fire all the destruction logic for the
         // current page.
-        loadURLForFrame(GURL("about:blank"), WebString());
+        loadURLForFrame(GURL("about:blank"), string());
     }
 
     for (Vector<WebKit::WebWidget*>::iterator it = m_popupmenus.begin();
          it < m_popupmenus.end(); ++it)
         (*it)->close();
 
+    webWidget()->willCloseLayerTreeView();
+    m_layerTreeView.clear();
     webWidget()->close();
-    if (m_inModalLoop)
-        webkit_support::QuitMessageLoop();
+    m_webWidget = 0;
+    m_shutdownWasInvoked = true;
 }
 
 void WebViewHost::setWebWidget(WebKit::WebWidget* widget)
 {
     m_webWidget = widget;
-    webView()->setSpellCheckClient(this);
+    webView()->setSpellCheckClient(proxy()->spellCheckClient());
     webView()->setPrerendererClient(this);
-    webView()->setCompositorSurfaceReady();
 }
 
 WebView* WebViewHost::webView() const
@@ -1476,97 +790,46 @@
     return m_webWidget;
 }
 
+WebTestProxyBase* WebViewHost::proxy() const
+{
+    ASSERT(m_proxy);
+    return m_proxy;
+}
+
+void WebViewHost::setProxy(WebTestProxyBase* proxy)
+{
+    ASSERT(!m_proxy);
+    ASSERT(proxy);
+    m_proxy = proxy;
+}
+
 void WebViewHost::reset()
 {
-    m_policyDelegateEnabled = false;
-    m_policyDelegateIsPermissive = false;
-    m_policyDelegateShouldNotifyDone = false;
-    m_topLoadingFrame = 0;
     m_pageId = -1;
     m_lastPageIdUpdated = -1;
     m_hasWindow = false;
     m_inModalLoop = false;
-    m_smartInsertDeleteEnabled = true;
-    m_logConsoleOutput = true;
-#if OS(WINDOWS)
-    m_selectTrailingWhitespaceEnabled = true;
-#else
-    m_selectTrailingWhitespaceEnabled = false;
-#endif
-    m_blocksRedirects = false;
-    m_requestReturnNull = false;
-    m_isPainting = false;
-    m_canvas.clear();
-#if ENABLE(POINTER_LOCK)
-    m_pointerLocked = false;
-    m_pointerLockPlannedResult = PointerLockWillSucceed;
-#endif
 
     m_navigationController = adoptPtr(new TestNavigationController(this));
 
     m_pendingExtraData.clear();
-    m_resourceIdentifierMap.clear();
-    m_clearHeaders.clear();
     m_editCommandName.clear();
     m_editCommandValue.clear();
 
-    if (m_geolocationClientMock.get())
-        m_geolocationClientMock->resetMock();
-
-#if ENABLE(INPUT_SPEECH)
-    if (m_speechInputControllerMock.get())
-        m_speechInputControllerMock->clearResults();
-#endif
-
     m_currentCursor = WebCursorInfo();
     m_windowRect = WebRect();
-    m_paintRect = WebRect();
+    // m_proxy is not set when reset() is invoked from the constructor.
+    if (m_proxy)
+        proxy()->reset();
 
     if (m_webWidget) {
         webView()->mainFrame()->setName(WebString());
-        webView()->settings()->setMinimumTimerInterval(webkit_support::GetForegroundTabTimerInterval());
     }
 }
 
-void WebViewHost::setSelectTrailingWhitespaceEnabled(bool enabled)
+void WebViewHost::setClientWindowRect(const WebKit::WebRect& rect)
 {
-    m_selectTrailingWhitespaceEnabled = enabled;
-    // In upstream WebKit, smart insert/delete is mutually exclusive with select
-    // trailing whitespace, however, we allow both because Chromium on Windows
-    // allows both.
-}
-
-void WebViewHost::setSmartInsertDeleteEnabled(bool enabled)
-{
-    m_smartInsertDeleteEnabled = enabled;
-    // In upstream WebKit, smart insert/delete is mutually exclusive with select
-    // trailing whitespace, however, we allow both because Chromium on Windows
-    // allows both.
-}
-
-void WebViewHost::setLogConsoleOutput(bool enabled)
-{
-    m_logConsoleOutput = enabled;
-}
-
-void WebViewHost::setCustomPolicyDelegate(bool isCustom, bool isPermissive)
-{
-    m_policyDelegateEnabled = isCustom;
-    m_policyDelegateIsPermissive = isPermissive;
-}
-
-void WebViewHost::waitForPolicyDelegate()
-{
-    m_policyDelegateEnabled = true;
-    m_policyDelegateShouldNotifyDone = true;
-}
-
-void WebViewHost::loadURLForFrame(const WebURL& url, const WebString& frameName)
-{
-    if (!url.isValid())
-        return;
-    TestShell::resizeWindowForTest(this, url);
-    navigationController()->loadEntry(TestNavigationEntry::create(-1, url, WebString(), frameName).get());
+    setWindowRect(rect);
 }
 
 bool WebViewHost::navigate(const TestNavigationEntry& entry, bool reload)
@@ -1613,36 +876,12 @@
 
 // Private functions ----------------------------------------------------------
 
-DRTTestRunner* WebViewHost::testRunner() const
-{
-    return m_shell->testRunner();
-}
-
-void WebViewHost::updateAddressBar(WebView* webView)
-{
-    WebFrame* mainFrame = webView->mainFrame();
-    WebDataSource* dataSource = mainFrame->dataSource();
-    if (!dataSource)
-        dataSource = mainFrame->provisionalDataSource();
-    if (!dataSource)
-        return;
-
-    setAddressBarURL(dataSource->request().url());
-}
-
-void WebViewHost::locationChangeDone(WebFrame* frame)
-{
-    if (frame != m_topLoadingFrame)
-        return;
-    m_topLoadingFrame = 0;
-    testRunner()->locationChangeDone();
-}
-
 void WebViewHost::updateForCommittedLoad(WebFrame* frame, bool isNewNavigation)
 {
     // Code duplicated from RenderView::DidCommitLoadForFrame.
     TestShellExtraData* extraData = static_cast<TestShellExtraData*>(frame->dataSource()->extraData());
-    bool nonBlankPageAfterReset = m_pageId == -1 && strcmp(frame->dataSource()->request().url().spec().data(), "about:blank");
+    const WebURL& url = frame->dataSource()->request().url();
+    bool nonBlankPageAfterReset = m_pageId == -1 && !url.isEmpty() && strcmp(url.spec().data(), "about:blank");
 
     if (isNewNavigation || nonBlankPageAfterReset) {
         // New navigation.
@@ -1681,7 +920,6 @@
         entry->setContentState(historyItem);
 
     navigationController()->didNavigateToEntry(entry.get());
-    updateAddressBar(frame->view());
     m_lastPageIdUpdated = max(m_lastPageIdUpdated, m_pageId);
 }
 
@@ -1704,6 +942,16 @@
     entry->setContentState(historyItem);
 }
 
+void WebViewHost::updateViewportSize()
+{
+    if (!m_layerTreeView)
+        return;
+
+    WebSize deviceViewportSize(webWidget()->size().width * webView()->deviceScaleFactor(),
+        webWidget()->size().height * webView()->deviceScaleFactor());
+    m_layerTreeView->setViewportSize(webWidget()->size(), deviceViewportSize);
+}
+
 void WebViewHost::printFrameDescription(WebFrame* webframe)
 {
     string name8 = webframe->uniqueName().utf8();
@@ -1722,53 +970,24 @@
     printf("frame \"%s\"", name8.c_str());
 }
 
-void WebViewHost::printFrameUserGestureStatus(WebFrame* webframe, const char* msg)
-{
-    bool isUserGesture = webframe->isProcessingUserGesture();
-    printf("Frame with user gesture \"%s\"%s", isUserGesture ? "true" : "false", msg);
-}
-
-void WebViewHost::printResourceDescription(unsigned identifier)
-{
-    ResourceMap::iterator it = m_resourceIdentifierMap.find(identifier);
-    printf("%s", it != m_resourceIdentifierMap.end() ? it->value.c_str() : "<unknown>");
-}
-
 void WebViewHost::setPendingExtraData(PassOwnPtr<TestShellExtraData> extraData)
 {
     m_pendingExtraData = extraData;
 }
 
-void WebViewHost::setDeviceScaleFactor(float deviceScaleFactor)
-{
-    webView()->setDeviceScaleFactor(deviceScaleFactor);
-    discardBackingStore();
-}
-
 void WebViewHost::setPageTitle(const WebString&)
 {
     // Nothing to do in layout test.
 }
 
-void WebViewHost::setAddressBarURL(const WebURL&)
-{
-    // Nothing to do in layout test.
-}
-
 void WebViewHost::enterFullScreenNow()
 {
-    if (testRunner()->hasCustomFullScreenBehavior())
-        return;
-
     webView()->willEnterFullScreen();
     webView()->didEnterFullScreen();
 }
 
 void WebViewHost::exitFullScreenNow()
 {
-    if (testRunner()->hasCustomFullScreenBehavior())
-        return;
-
     webView()->willExitFullScreen();
     webView()->didExitFullScreen();
 }
@@ -1781,135 +1000,3 @@
     return m_testMediaStreamClient.get();
 }
 #endif
-
-// Painting functions ---------------------------------------------------------
-
-void WebViewHost::updatePaintRect(const WebRect& rect)
-{
-    // m_paintRect = m_paintRect U rect
-    if (rect.isEmpty())
-        return;
-    if (m_paintRect.isEmpty()) {
-        m_paintRect = rect;
-        return;
-    }
-    int left = min(m_paintRect.x, rect.x);
-    int top = min(m_paintRect.y, rect.y);
-    int right = max(m_paintRect.x + m_paintRect.width, rect.x + rect.width);
-    int bottom = max(m_paintRect.y + m_paintRect.height, rect.y + rect.height);
-    m_paintRect = WebRect(left, top, right - left, bottom - top);
-}
-
-void WebViewHost::paintRect(const WebRect& rect)
-{
-    ASSERT(!m_isPainting);
-    ASSERT(canvas());
-    m_isPainting = true;
-    float deviceScaleFactor = webView()->deviceScaleFactor();
-    int scaledX = static_cast<int>(static_cast<float>(rect.x) * deviceScaleFactor);
-    int scaledY = static_cast<int>(static_cast<float>(rect.y) * deviceScaleFactor);
-    int scaledWidth = static_cast<int>(ceil(static_cast<float>(rect.width) * deviceScaleFactor));
-    int scaledHeight = static_cast<int>(ceil(static_cast<float>(rect.height) * deviceScaleFactor));
-    WebRect deviceRect(scaledX, scaledY, scaledWidth, scaledHeight);
-    webWidget()->paint(canvas(), deviceRect);
-    m_isPainting = false;
-}
-
-void WebViewHost::paintInvalidatedRegion()
-{
-#if ENABLE(REQUEST_ANIMATION_FRAME)
-    webWidget()->animate(0.0);
-#endif
-    webWidget()->layout();
-    WebSize widgetSize = webWidget()->size();
-    WebRect clientRect(0, 0, widgetSize.width, widgetSize.height);
-
-    // Paint the canvas if necessary. Allow painting to generate extra rects
-    // for the first two calls. This is necessary because some WebCore rendering
-    // objects update their layout only when painted.
-    // Store the total area painted in total_paint. Then tell the gdk window
-    // to update that area after we're done painting it.
-    for (int i = 0; i < 3; ++i) {
-        // m_paintRect = intersect(m_paintRect , clientRect)
-        int left = max(m_paintRect.x, clientRect.x);
-        int top = max(m_paintRect.y, clientRect.y);
-        int right = min(m_paintRect.x + m_paintRect.width, clientRect.x + clientRect.width);
-        int bottom = min(m_paintRect.y + m_paintRect.height, clientRect.y + clientRect.height);
-        if (left >= right || top >= bottom)
-            m_paintRect = WebRect();
-        else
-            m_paintRect = WebRect(left, top, right - left, bottom - top);
-
-        if (m_paintRect.isEmpty())
-            continue;
-        WebRect rect(m_paintRect);
-        m_paintRect = WebRect();
-        paintRect(rect);
-    }
-    ASSERT(m_paintRect.isEmpty());
-}
-
-void WebViewHost::paintPagesWithBoundaries()
-{
-    ASSERT(!m_isPainting);
-    ASSERT(canvas());
-    m_isPainting = true;
-
-    WebSize pageSizeInPixels = webWidget()->size();
-    WebFrame* webFrame = webView()->mainFrame();
-
-    int pageCount = webFrame->printBegin(pageSizeInPixels);
-    int totalHeight = pageCount * (pageSizeInPixels.height + 1) - 1;
-
-    SkCanvas* testCanvas = skia::TryCreateBitmapCanvas(pageSizeInPixels.width, totalHeight, true);
-    if (testCanvas) {
-        discardBackingStore();
-        m_canvas = adoptPtr(testCanvas);
-    } else {
-        webFrame->printEnd();
-        return;
-    }
-
-    webFrame->printPagesWithBoundaries(canvas(), pageSizeInPixels);
-    webFrame->printEnd();
-
-    m_isPainting = false;
-}
-
-SkCanvas* WebViewHost::canvas()
-{
-    if (m_canvas)
-        return m_canvas.get();
-    WebSize widgetSize = webWidget()->size();
-    float deviceScaleFactor = webView()->deviceScaleFactor();
-    int scaledWidth = static_cast<int>(ceil(static_cast<float>(widgetSize.width) * deviceScaleFactor));
-    int scaledHeight = static_cast<int>(ceil(static_cast<float>(widgetSize.height) * deviceScaleFactor));
-    resetScrollRect();
-    m_canvas = adoptPtr(skia::CreateBitmapCanvas(scaledWidth, scaledHeight, true));
-    return m_canvas.get();
-}
-
-void WebViewHost::resetScrollRect()
-{
-}
-
-void WebViewHost::discardBackingStore()
-{
-    m_canvas.clear();
-}
-
-// Paints the entire canvas a semi-transparent black (grayish). This is used
-// by the layout tests in fast/repaint. The alpha value matches upstream.
-void WebViewHost::displayRepaintMask()
-{
-    canvas()->drawARGB(167, 0, 0, 0);
-}
-
-// Simulate a print by going into print mode and then exit straight away.
-void WebViewHost::printPage(WebKit::WebFrame* frame)
-{
-    WebSize pageSizeInPixels = webWidget()->size();
-    WebPrintParams printParams(pageSizeInPixels);
-    frame->printBegin(printParams);
-    frame->printEnd();
-}
diff --git a/Tools/DumpRenderTree/chromium/WebViewHost.h b/Tools/DumpRenderTree/chromium/WebViewHost.h
index 1ecc456..7b1cb22 100644
--- a/Tools/DumpRenderTree/chromium/WebViewHost.h
+++ b/Tools/DumpRenderTree/chromium/WebViewHost.h
@@ -31,41 +31,27 @@
 #ifndef WebViewHost_h
 #define WebViewHost_h
 
-#include "MockSpellCheck.h"
 #include "TestNavigationController.h"
-#include "WebAccessibilityNotification.h"
 #include "WebCursorInfo.h"
 #include "WebFrameClient.h"
-#include "WebIntentRequest.h"
 #include "WebPrerendererClient.h"
-#include "WebSpellCheckClient.h"
 #include "WebTask.h"
 #include "WebTestDelegate.h"
+#include "WebTestProxy.h"
 #include "WebViewClient.h"
+#include <public/WebFileSystemType.h>
 #include <wtf/HashMap.h>
 #include <wtf/HashSet.h>
 #include <wtf/Vector.h>
 #include <wtf/text/WTFString.h>
 
-class DRTTestRunner;
-class MockWebSpeechInputController;
-class MockWebSpeechRecognizer;
 class SkCanvas;
 class TestShell;
-class WebUserMediaClientMock;
 
 namespace WebKit {
 class WebFrame;
-class WebDeviceOrientationClient;
-class WebDeviceOrientationClientMock;
-class WebGeolocationClient;
-class WebGeolocationClientMock;
-class WebGeolocationServiceMock;
-class WebIntentServiceInfo;
 class WebSerializedScriptValue;
 class WebSharedWorkerClient;
-class WebSpeechInputController;
-class WebSpeechInputListener;
 class WebURL;
 struct WebRect;
 struct WebURLError;
@@ -73,67 +59,35 @@
 }
 
 namespace webkit_support {
+class DRTLayerTreeViewClient;
 class MediaStreamUtil;
 class TestMediaStreamClient;
 }
 
-class WebViewHost : public WebKit::WebViewClient, public WebKit::WebFrameClient, public NavigationHost,
-                    public WebKit::WebPrerendererClient, public WebKit::WebSpellCheckClient,
-                    public WebTestRunner::WebTestDelegate {
+namespace WebTestRunner {
+class WebTestRunner;
+}
+
+class WebViewHost : public WebKit::WebViewClient, public WebKit::WebFrameClient, public NavigationHost, public WebKit::WebPrerendererClient, public WebTestRunner::WebTestDelegate {
  public:
     WebViewHost(TestShell*);
     virtual ~WebViewHost();
+    void shutdown();
     void setWebWidget(WebKit::WebWidget*);
     WebKit::WebView* webView() const;
     WebKit::WebWidget* webWidget() const;
+    WebTestRunner::WebTestProxyBase* proxy() const;
+    void setProxy(WebTestRunner::WebTestProxyBase*);
     void reset();
-    void setSelectTrailingWhitespaceEnabled(bool);
-    void setSmartInsertDeleteEnabled(bool);
-    void setLogConsoleOutput(bool);
-    void waitForPolicyDelegate();
-    void setCustomPolicyDelegate(bool, bool);
-    WebKit::WebFrame* topLoadingFrame() { return m_topLoadingFrame; }
-    void setBlockRedirects(bool block) { m_blocksRedirects = block; }
-    void setRequestReturnNull(bool returnNull) { m_requestReturnNull = returnNull; }
     void setPendingExtraData(PassOwnPtr<TestShellExtraData>);
-    void setDeviceScaleFactor(float);
 
-    void paintRect(const WebKit::WebRect&);
-    void updatePaintRect(const WebKit::WebRect&);
-    void paintInvalidatedRegion();
-    void paintPagesWithBoundaries();
-    SkCanvas* canvas();
-    void displayRepaintMask();
-
-    void loadURLForFrame(const WebKit::WebURL&, const WebKit::WebString& frameName);
     TestNavigationController* navigationController() { return m_navigationController.get(); }
 
-    void addClearHeader(const WTF::String& header) { m_clearHeaders.add(header); }
-    const HashSet<WTF::String>& clearHeaders() const { return m_clearHeaders; }
     void closeWidget();
 
-#if ENABLE(INPUT_SPEECH)
-    MockWebSpeechInputController* speechInputControllerMock() { return m_speechInputControllerMock.get(); }
-#endif
-
-#if ENABLE(SCRIPTED_SPEECH)
-    MockWebSpeechRecognizer* mockSpeechRecognizer() { return m_mockSpeechRecognizer.get(); }
-#endif
-
-#if ENABLE(POINTER_LOCK)
-    void didAcquirePointerLock();
-    void didNotAcquirePointerLock();
-    void didLosePointerLock();
-    void setPointerLockWillRespondAsynchronously() { m_pointerLockPlannedResult = PointerLockWillRespondAsync; }
-    void setPointerLockWillFailSynchronously() { m_pointerLockPlannedResult = PointerLockWillFailSync; }
-#endif
-
     // WebTestDelegate.
-    virtual WebKit::WebContextMenuData* lastContextMenuData() const OVERRIDE;
-    virtual void clearContextMenuData() OVERRIDE;
     virtual void setEditCommand(const std::string& name, const std::string& value) OVERRIDE;
     virtual void clearEditCommand() OVERRIDE;
-    virtual void fillSpellingSuggestionList(const WebKit::WebString& word, WebKit::WebVector<WebKit::WebString>* suggestions) OVERRIDE;
     virtual void setGamepadData(const WebKit::WebGamepads&) OVERRIDE;
     virtual void printMessage(const std::string& message) OVERRIDE;
     virtual void postTask(WebTestRunner::WebTask*) OVERRIDE;
@@ -141,6 +95,33 @@
     virtual WebKit::WebString registerIsolatedFileSystem(const WebKit::WebVector<WebKit::WebString>& absoluteFilenames) OVERRIDE;
     virtual long long getCurrentTimeInMillisecond() OVERRIDE;
     virtual WebKit::WebString getAbsoluteWebStringFromUTF8Path(const std::string& path) OVERRIDE;
+    virtual WebKit::WebURL localFileToDataURL(const WebKit::WebURL&) OVERRIDE;
+    virtual WebKit::WebURL rewriteLayoutTestsURL(const std::string&) OVERRIDE;
+    virtual WebTestRunner::WebPreferences* preferences() OVERRIDE;
+    virtual void applyPreferences() OVERRIDE;
+    virtual std::string makeURLErrorDescription(const WebKit::WebURLError&) OVERRIDE;
+    virtual void setClientWindowRect(const WebKit::WebRect&) OVERRIDE;
+    virtual void showDevTools() OVERRIDE;
+    virtual void closeDevTools() OVERRIDE;
+    virtual void evaluateInWebInspector(long, const std::string&) OVERRIDE;
+    virtual void clearAllDatabases() OVERRIDE;
+    virtual void setDatabaseQuota(int) OVERRIDE;
+    virtual void setDeviceScaleFactor(float) OVERRIDE;
+    virtual void setFocus(WebTestRunner::WebTestProxyBase*, bool) OVERRIDE;
+    virtual void setAcceptAllCookies(bool) OVERRIDE;
+    virtual std::string pathToLocalResource(const std::string& url) OVERRIDE;
+    virtual void setLocale(const std::string&) OVERRIDE;
+    virtual void testFinished() OVERRIDE;
+    virtual void testTimedOut() OVERRIDE;
+    virtual bool isBeingDebugged() OVERRIDE;
+    virtual int layoutTestTimeout() OVERRIDE;
+    virtual void closeRemainingWindows() OVERRIDE;
+    virtual int navigationEntryCount() OVERRIDE;
+    virtual void goToOffset(int) OVERRIDE;
+    virtual void reload() OVERRIDE;
+    virtual void loadURLForFrame(const WebKit::WebURL&, const std::string& frameName) OVERRIDE;
+    virtual bool allowExternalPages() OVERRIDE;
+    virtual void captureHistoryForWindow(WebTestRunner::WebTestProxyBase*, WebKit::WebVector<WebKit::WebHistoryItem>*, size_t* currentEntryIndex) OVERRIDE;
 
     // NavigationHost
     virtual bool navigate(const TestNavigationEntry&, bool reload);
@@ -148,18 +129,11 @@
     // WebKit::WebPrerendererClient
     virtual void willAddPrerender(WebKit::WebPrerender*) OVERRIDE;
 
-    // WebKit::WebSpellCheckClient
-    virtual void spellCheck(const WebKit::WebString&, int& offset, int& length, WebKit::WebVector<WebKit::WebString>* optionalSuggestions);
-    virtual void checkTextOfParagraph(const WebKit::WebString&, WebKit::WebTextCheckingTypeMask, WebKit::WebVector<WebKit::WebTextCheckingResult>*);
-    virtual void requestCheckingOfText(const WebKit::WebString&, WebKit::WebTextCheckingCompletion*);
-    virtual WebKit::WebString autoCorrectWord(const WebKit::WebString&);
-
     // WebKit::WebViewClient
     virtual WebKit::WebView* createView(WebKit::WebFrame*, const WebKit::WebURLRequest&, const WebKit::WebWindowFeatures&, const WebKit::WebString&, WebKit::WebNavigationPolicy);
     virtual WebKit::WebWidget* createPopupMenu(WebKit::WebPopupType);
     virtual WebKit::WebWidget* createPopupMenu(const WebKit::WebPopupMenuInfo&);
     virtual WebKit::WebStorageNamespace* createSessionStorageNamespace(unsigned quota);
-    virtual WebKit::WebCompositorOutputSurface* createOutputSurface();
     virtual void didAddMessageToConsole(const WebKit::WebConsoleMessage&, const WebKit::WebString& sourceName, unsigned sourceLine);
     virtual void didStartLoading();
     virtual void didStopLoading();
@@ -170,49 +144,21 @@
     virtual bool shouldChangeSelectedRange(const WebKit::WebRange& from, const WebKit::WebRange& to, WebKit::WebTextAffinity, bool stillSelecting);
     virtual bool shouldDeleteRange(const WebKit::WebRange&);
     virtual bool shouldApplyStyle(const WebKit::WebString& style, const WebKit::WebRange&);
-    virtual bool isSmartInsertDeleteEnabled();
-    virtual bool isSelectTrailingWhitespaceEnabled();
-    virtual void didBeginEditing();
-    virtual void didChangeSelection(bool isSelectionEmpty);
-    virtual void didChangeContents();
-    virtual void didEndEditing();
     virtual bool handleCurrentKeyboardEvent();
     virtual void runModalAlertDialog(WebKit::WebFrame*, const WebKit::WebString&);
     virtual bool runModalConfirmDialog(WebKit::WebFrame*, const WebKit::WebString&);
     virtual bool runModalPromptDialog(WebKit::WebFrame*, const WebKit::WebString& message, const WebKit::WebString& defaultValue, WebKit::WebString* actualValue);
-    virtual bool runModalBeforeUnloadDialog(WebKit::WebFrame*, const WebKit::WebString&);
     virtual void showContextMenu(WebKit::WebFrame*, const WebKit::WebContextMenuData&);
-    virtual void setStatusText(const WebKit::WebString&);
-    virtual void startDragging(WebKit::WebFrame*, const WebKit::WebDragData&, WebKit::WebDragOperationsMask, const WebKit::WebImage&, const WebKit::WebPoint&);
     virtual void didUpdateLayout();
     virtual void navigateBackForwardSoon(int offset);
     virtual int historyBackListCount();
     virtual int historyForwardListCount();
-#if ENABLE(NOTIFICATIONS)
-    virtual WebKit::WebNotificationPresenter* notificationPresenter();
-#endif
-    virtual WebKit::WebGeolocationClient* geolocationClient();
-#if ENABLE(INPUT_SPEECH)
-    virtual WebKit::WebSpeechInputController* speechInputController(WebKit::WebSpeechInputListener*);
-#endif
-#if ENABLE(SCRIPTED_SPEECH)
-    virtual WebKit::WebSpeechRecognizer* speechRecognizer() OVERRIDE;
-#endif
-    virtual WebKit::WebDeviceOrientationClient* deviceOrientationClient() OVERRIDE;
-#if ENABLE(MEDIA_STREAM)
-    virtual WebKit::WebUserMediaClient* userMediaClient();
-#endif
-    virtual void printPage(WebKit::WebFrame*);
 
     // WebKit::WebWidgetClient
-    virtual void didInvalidateRect(const WebKit::WebRect&);
-    virtual void didScrollRect(int dx, int dy, const WebKit::WebRect&);
     virtual void didAutoResize(const WebKit::WebSize& newSize);
-    virtual void scheduleComposite();
-#if ENABLE(REQUEST_ANIMATION_FRAME)
-    virtual void serviceAnimation();
+    virtual void initializeLayerTreeView();
+    virtual WebKit::WebLayerTreeView* layerTreeView();
     virtual void scheduleAnimation();
-#endif
     virtual void didFocus();
     virtual void didBlur();
     virtual void didChangeCursor(const WebKit::WebCursorInfo&);
@@ -226,11 +172,6 @@
     virtual WebKit::WebRect rootWindowRect();
     virtual WebKit::WebRect windowResizerRect();
     virtual WebKit::WebScreenInfo screenInfo();
-#if ENABLE(POINTER_LOCK)
-    virtual bool requestPointerLock();
-    virtual void requestPointerUnlock();
-    virtual bool isPointerLocked();
-#endif
 
     // WebKit::WebFrameClient
     virtual WebKit::WebPlugin* createPlugin(WebKit::WebFrame*, const WebKit::WebPluginParams&);
@@ -243,59 +184,26 @@
         WebKit::WebNavigationType, const WebKit::WebNode&,
         WebKit::WebNavigationPolicy, bool isRedirect);
     virtual bool canHandleRequest(WebKit::WebFrame*, const WebKit::WebURLRequest&);
-    virtual WebKit::WebURLError cannotHandleRequestError(WebKit::WebFrame*, const WebKit::WebURLRequest&);
     virtual WebKit::WebURLError cancelledError(WebKit::WebFrame*, const WebKit::WebURLRequest&);
     virtual void unableToImplementPolicyWithError(WebKit::WebFrame*, const WebKit::WebURLError&);
-    virtual void willPerformClientRedirect(
-        WebKit::WebFrame*, const WebKit::WebURL& from, const WebKit::WebURL& to,
-        double interval, double fireTime);
-    virtual void didCancelClientRedirect(WebKit::WebFrame*);
     virtual void didCreateDataSource(WebKit::WebFrame*, WebKit::WebDataSource*);
-    virtual void didStartProvisionalLoad(WebKit::WebFrame*);
-    virtual void didReceiveServerRedirectForProvisionalLoad(WebKit::WebFrame*);
-    virtual void didFailProvisionalLoad(WebKit::WebFrame*, const WebKit::WebURLError&);
     virtual void didCommitProvisionalLoad(WebKit::WebFrame*, bool isNewNavigation);
     virtual void didClearWindowObject(WebKit::WebFrame*);
     virtual void didReceiveTitle(WebKit::WebFrame*, const WebKit::WebString&, WebKit::WebTextDirection);
-    virtual void didFinishDocumentLoad(WebKit::WebFrame*);
-    virtual void didHandleOnloadEvents(WebKit::WebFrame*);
-    virtual void didFailLoad(WebKit::WebFrame*, const WebKit::WebURLError&);
-    virtual void didFinishLoad(WebKit::WebFrame*);
+    virtual void didChangeIcon(WebKit::WebFrame* , WebKit::WebIconURL::Type);
     virtual void didNavigateWithinPage(WebKit::WebFrame*, bool isNewNavigation);
-    virtual void didChangeLocationWithinPage(WebKit::WebFrame*);
-    virtual void assignIdentifierToRequest(WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLRequest&);
-    virtual void removeIdentifierForRequest(unsigned identifier);
     virtual void willSendRequest(WebKit::WebFrame*, unsigned identifier, WebKit::WebURLRequest&, const WebKit::WebURLResponse&);
-    virtual void didReceiveResponse(WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLResponse&);
-    virtual void didFinishResourceLoad(WebKit::WebFrame*, unsigned identifier);
-    virtual void didFailResourceLoad(WebKit::WebFrame*, unsigned identifier, const WebKit::WebURLError&);
-    virtual void didDisplayInsecureContent(WebKit::WebFrame*);
-    virtual void didRunInsecureContent(WebKit::WebFrame*, const WebKit::WebSecurityOrigin&, const WebKit::WebURL&);
-    virtual void didDetectXSS(WebKit::WebFrame*, const WebKit::WebURL&, bool didBlockEntirePage);
-    virtual void openFileSystem(WebKit::WebFrame*, WebKit::WebFileSystem::Type, long long size, bool create, WebKit::WebFileSystemCallbacks*);
-    virtual void deleteFileSystem(WebKit::WebFrame*, WebKit::WebFileSystem::Type, WebKit::WebFileSystemCallbacks*);
+    virtual void openFileSystem(WebKit::WebFrame*, WebKit::WebFileSystemType, long long size, bool create, WebKit::WebFileSystemCallbacks*);
+    virtual void deleteFileSystem(WebKit::WebFrame*, WebKit::WebFileSystemType, WebKit::WebFileSystemCallbacks*);
     virtual bool willCheckAndDispatchMessageEvent(
         WebKit::WebFrame* sourceFrame, WebKit::WebFrame* targetFrame, 
         WebKit::WebSecurityOrigin target, WebKit::WebDOMMessageEvent);
-    virtual void registerIntentService(WebKit::WebFrame*, const WebKit::WebIntentServiceInfo&);
-    virtual void dispatchIntent(WebKit::WebFrame*, const WebKit::WebIntentRequest&);
-    virtual void deliveredIntentResult(WebKit::WebFrame*, int, const WebKit::WebSerializedScriptValue&);
-    virtual void deliveredIntentFailure(WebKit::WebFrame*, int, const WebKit::WebSerializedScriptValue&);
-
-    WebKit::WebDeviceOrientationClientMock* deviceOrientationClientMock();
-    
-    // Spellcheck related helper APIs
-    MockSpellCheck* mockSpellCheck();
-    void finishLastTextCheck();
-
-    // Geolocation client mocks for DRTTestRunner
-    WebKit::WebGeolocationClientMock* geolocationClientMock();
 
     // Pending task list, Note taht the method is referred from WebMethodTask class.
     WebTestRunner::WebTaskList* taskList() { return &m_taskList; }
 
-    // The current web intents request.
-    WebKit::WebIntentRequest* currentIntentRequest() { return &m_currentRequest; }
+    // Exposed for WebTestProxy.
+    void scheduleComposite() { }
 
 private:
 
@@ -313,28 +221,13 @@
         CallbackMethodType m_callback;
     };
 
-    DRTTestRunner* testRunner() const;
-
     // Called the title of the page changes.
     // Can be used to update the title of the window.
     void setPageTitle(const WebKit::WebString&);
 
-    // Called when the URL of the page changes.
-    // Extracts the URL and forwards on to SetAddressBarURL().
-    void updateAddressBar(WebKit::WebView*);
-
-    // Called when the URL of the page changes.
-    // Should be used to update the text of the URL bar.
-    void setAddressBarURL(const WebKit::WebURL&);
-
     void enterFullScreenNow();
     void exitFullScreenNow();
 
-    // In the Mac code, this is called to trigger the end of a test after the
-    // page has finished loading. From here, we can generate the dump for the
-    // test.
-    void locationChangeDone(WebKit::WebFrame*);
-
     void updateForCommittedLoad(WebKit::WebFrame*, bool isNewNavigation);
     void updateURL(WebKit::WebFrame*);
     void updateSessionHistory(WebKit::WebFrame*);
@@ -342,124 +235,57 @@
     // Dumping a frame to the console.
     void printFrameDescription(WebKit::WebFrame*);
 
-    // Dumping the user gesture status to the console.
-    void printFrameUserGestureStatus(WebKit::WebFrame*, const char*);
-
     bool hasWindow() const { return m_hasWindow; }
-    void resetScrollRect();
-    void discardBackingStore();
+
+    void updateViewportSize();
 
 #if ENABLE(MEDIA_STREAM)
-    WebUserMediaClientMock* userMediaClientMock();
     webkit_support::TestMediaStreamClient* testMediaStreamClient();
 #endif
 
-    // Causes navigation actions just printout the intended navigation instead
-    // of taking you to the page. This is used for cases like mailto, where you
-    // don't actually want to open the mail program.
-    bool m_policyDelegateEnabled;
-
-    // Toggles the behavior of the policy delegate. If true, then navigations
-    // will be allowed. Otherwise, they will be ignored (dropped).
-    bool m_policyDelegateIsPermissive;
-
-    // If true, the policy delegate will signal layout test completion.
-    bool m_policyDelegateShouldNotifyDone;
-
     // Non-owning pointer. The WebViewHost instance is owned by this TestShell instance.
     TestShell* m_shell;
 
+    // Non-owning pointer. This class needs to be wrapped in a WebTestProxy. This is the pointer to the WebTestProxyBase.
+    WebTestRunner::WebTestProxyBase* m_proxy;
+
     // This delegate works for the following widget.
     WebKit::WebWidget* m_webWidget;
 
-    // This is non-0 IFF a load is in progress.
-    WebKit::WebFrame* m_topLoadingFrame;
-
     // For tracking session history. See RenderView.
     int m_pageId;
     int m_lastPageIdUpdated;
 
     OwnPtr<TestShellExtraData> m_pendingExtraData;
 
-    // Maps resource identifiers to a descriptive string.
-    typedef HashMap<unsigned, std::string> ResourceMap;
-    ResourceMap m_resourceIdentifierMap;
-    void printResourceDescription(unsigned identifier);
-
     WebKit::WebCursorInfo m_currentCursor;
 
     bool m_hasWindow;
     bool m_inModalLoop;
+
+    bool m_shutdownWasInvoked;
+
     WebKit::WebRect m_windowRect;
 
-    // true if we want to enable smart insert/delete.
-    bool m_smartInsertDeleteEnabled;
-
-    // true if we want to enable selection of trailing whitespaces
-    bool m_selectTrailingWhitespaceEnabled;
-
-    // true if whatever is sent to the console should be logged to stdout.
-    bool m_logConsoleOutput;
-
-    // Set of headers to clear in willSendRequest.
-    HashSet<WTF::String> m_clearHeaders;
-
-    // true if we should block any redirects
-    bool m_blocksRedirects;
-
-    // true if we should block (set an empty request for) any requests
-    bool m_requestReturnNull;
-
     // Edit command associated to the current keyboard event.
     std::string m_editCommandName;
     std::string m_editCommandValue;
 
-    // The mock spellchecker used in spellCheck().
-    MockSpellCheck m_spellcheck;
-
-    // Painting.
-    OwnPtr<SkCanvas> m_canvas;
-    WebKit::WebRect m_paintRect;
-    bool m_isPainting;
 
     OwnPtr<WebKit::WebContextMenuData> m_lastContextMenuData;
 
-    // Geolocation
-    OwnPtr<WebKit::WebGeolocationClientMock> m_geolocationClientMock;
-
-    OwnPtr<WebKit::WebDeviceOrientationClientMock> m_deviceOrientationClientMock;
-#if ENABLE(INPUT_SPEECH)
-    OwnPtr<MockWebSpeechInputController> m_speechInputControllerMock;
-#endif
-
-#if ENABLE(SCRIPTED_SPEECH)
-    OwnPtr<MockWebSpeechRecognizer> m_mockSpeechRecognizer;
-#endif
 
 #if ENABLE(MEDIA_STREAM)
-    OwnPtr<WebUserMediaClientMock> m_userMediaClientMock;
     OwnPtr<webkit_support::TestMediaStreamClient> m_testMediaStreamClient;
 #endif
 
     OwnPtr<TestNavigationController> m_navigationController;
 
-    WebKit::WebString m_lastRequestedTextCheckString;
-    WebKit::WebTextCheckingCompletion* m_lastRequestedTextCheckingCompletion;
-
     WebTestRunner::WebTaskList m_taskList;
     Vector<WebKit::WebWidget*> m_popupmenus;
 
-#if ENABLE(POINTER_LOCK)
-    bool m_pointerLocked;
-    enum {
-        PointerLockWillSucceed,
-        PointerLockWillRespondAsync,
-        PointerLockWillFailSync
-    } m_pointerLockPlannedResult;
-#endif
-
-    // For web intents: holds the current request, if any.
-    WebKit::WebIntentRequest m_currentRequest;
+    OwnPtr<webkit_support::DRTLayerTreeViewClient> m_layerTreeViewClient;
+    OwnPtr<WebKit::WebLayerTreeView> m_layerTreeView;
 };
 
 #endif // WebViewHost_h
diff --git a/Tools/DumpRenderTree/chromium/WebViewHostOutputSurface.cpp b/Tools/DumpRenderTree/chromium/WebViewHostOutputSurface.cpp
deleted file mode 100644
index 09a0af5..0000000
--- a/Tools/DumpRenderTree/chromium/WebViewHostOutputSurface.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include "WebViewHostOutputSurface.h"
-
-#include <public/WebCompositorSoftwareOutputDevice.h>
-#include <public/WebGraphicsContext3D.h>
-#include <wtf/Assertions.h>
-
-namespace WebKit {
-
-PassOwnPtr<WebViewHostOutputSurface> WebViewHostOutputSurface::create3d(PassOwnPtr<WebKit::WebGraphicsContext3D> context3d)
-{
-    return adoptPtr(new WebViewHostOutputSurface(context3d));
-}
-
-PassOwnPtr<WebViewHostOutputSurface> WebViewHostOutputSurface::createSoftware(PassOwnPtr<WebKit::WebCompositorSoftwareOutputDevice> softwareDevice)
-{
-    return adoptPtr(new WebViewHostOutputSurface(softwareDevice));
-}
-
-WebViewHostOutputSurface::WebViewHostOutputSurface(PassOwnPtr<WebKit::WebGraphicsContext3D> context)
-    : m_context(context)
-{
-}
-
-WebViewHostOutputSurface::WebViewHostOutputSurface(PassOwnPtr<WebKit::WebCompositorSoftwareOutputDevice> softwareDevice)
-    : m_softwareDevice(softwareDevice)
-{
-}
-
-WebViewHostOutputSurface::~WebViewHostOutputSurface()
-{
-}
-
-bool WebViewHostOutputSurface::bindToClient(WebCompositorOutputSurfaceClient*)
-{
-    if (!m_context)
-        return true;
-
-    return m_context->makeContextCurrent();
-}
-
-const WebKit::WebCompositorOutputSurface::Capabilities& WebViewHostOutputSurface::capabilities() const
-{
-    return m_capabilities;
-}
-
-WebGraphicsContext3D* WebViewHostOutputSurface::context3D() const
-{
-    return m_context.get();
-}
-
-WebCompositorSoftwareOutputDevice* WebViewHostOutputSurface::softwareDevice() const
-{
-    return m_softwareDevice.get();
-}
-
-void WebViewHostOutputSurface::sendFrameToParentCompositor(const WebCompositorFrame&)
-{
-    ASSERT_NOT_REACHED();
-}
-
-}
diff --git a/Tools/DumpRenderTree/chromium/WebViewHostOutputSurface.h b/Tools/DumpRenderTree/chromium/WebViewHostOutputSurface.h
deleted file mode 100644
index bbd61a2..0000000
--- a/Tools/DumpRenderTree/chromium/WebViewHostOutputSurface.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebViewHostOutputSurface_h
-#define WebViewHostOutputSurface_h
-
-#include <public/WebCompositorOutputSurface.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
-
-namespace WebKit {
-
-class WebCompositorOutputSurfaceClient;
-class WebCompositorSoftwareOutputDevice;
-class WebGraphicsContext3D;
-
-class WebViewHostOutputSurface : public WebKit::WebCompositorOutputSurface {
-public:
-    static PassOwnPtr<WebViewHostOutputSurface> create3d(PassOwnPtr<WebKit::WebGraphicsContext3D>);
-    static PassOwnPtr<WebViewHostOutputSurface> createSoftware(PassOwnPtr<WebKit::WebCompositorSoftwareOutputDevice>);
-    virtual ~WebViewHostOutputSurface();
-
-    virtual bool bindToClient(WebCompositorOutputSurfaceClient*) OVERRIDE;
-
-    virtual const WebKit::WebCompositorOutputSurface::Capabilities& capabilities() const OVERRIDE;
-    virtual WebGraphicsContext3D* context3D() const OVERRIDE;
-    virtual WebCompositorSoftwareOutputDevice* softwareDevice() const OVERRIDE;
-    virtual void sendFrameToParentCompositor(const WebCompositorFrame&) OVERRIDE;
-
-private:
-    explicit WebViewHostOutputSurface(PassOwnPtr<WebKit::WebGraphicsContext3D>);
-    explicit WebViewHostOutputSurface(PassOwnPtr<WebKit::WebCompositorSoftwareOutputDevice>);
-
-    WebKit::WebCompositorOutputSurface::Capabilities m_capabilities;
-    OwnPtr<WebKit::WebGraphicsContext3D> m_context;
-    OwnPtr<WebKit::WebCompositorSoftwareOutputDevice> m_softwareDevice;
-};
-
-}
-
-#endif // WebViewHostOutputSurface_h
diff --git a/Tools/DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.cpp b/Tools/DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.cpp
deleted file mode 100644
index ecee994..0000000
--- a/Tools/DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include "WebViewHostSoftwareOutputDevice.h"
-
-#include "SkBitmap.h"
-#include "SkDevice.h"
-#include <public/WebSize.h>
-#include <wtf/Assertions.h>
-
-namespace WebKit {
-
-WebImage* WebViewHostSoftwareOutputDevice::lock(bool forWrite)
-{
-    ASSERT(m_device);
-    m_image = m_device->accessBitmap(forWrite);
-    return &m_image;
-}
-
-void WebViewHostSoftwareOutputDevice::unlock()
-{
-    m_image.reset();
-}
-
-void WebViewHostSoftwareOutputDevice::didChangeViewportSize(WebSize size)
-{
-    if (m_device && size.width == m_device->width() && size.height == m_device->height())
-        return;
-
-    m_device = adoptPtr(new SkDevice(SkBitmap::kARGB_8888_Config, size.width, size.height, true));
-}
-
-
-}
diff --git a/Tools/DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.h b/Tools/DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.h
deleted file mode 100644
index 5bd551f..0000000
--- a/Tools/DumpRenderTree/chromium/WebViewHostSoftwareOutputDevice.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebViewHostSoftwareOutputDevice_h
-#define WebViewHostSoftwareOutputDevice_h
-
-#include <public/WebCompositorSoftwareOutputDevice.h>
-#include <public/WebImage.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
-
-class SkDevice;
-
-namespace WebKit {
-
-struct WebSize;
-
-class WebViewHostSoftwareOutputDevice : public WebKit::WebCompositorSoftwareOutputDevice {
-public:
-    virtual WebImage* lock(bool forWrite) OVERRIDE;
-    virtual void unlock() OVERRIDE;
-
-    virtual void didChangeViewportSize(WebSize) OVERRIDE;
-
-private:
-    OwnPtr<SkDevice> m_device;
-    WebImage m_image;
-};
-
-}
-
-#endif // WebViewHostSoftwareOutputDevice_h
diff --git a/Tools/DumpRenderTree/config.h b/Tools/DumpRenderTree/config.h
index ccff71c..c6ae105 100644
--- a/Tools/DumpRenderTree/config.h
+++ b/Tools/DumpRenderTree/config.h
@@ -85,10 +85,10 @@
 #endif
 
 #undef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500
+#define _WIN32_WINNT 0x0502
 
 #undef WINVER
-#define WINVER 0x0500
+#define WINVER 0x0502
 
 #undef _WINSOCKAPI_
 #define _WINSOCKAPI_ // Prevent inclusion of winsock.h in windows.h
diff --git a/Tools/DumpRenderTree/efl/AccessibilityControllerEfl.cpp b/Tools/DumpRenderTree/efl/AccessibilityControllerEfl.cpp
new file mode 100644
index 0000000..8012da6
--- /dev/null
+++ b/Tools/DumpRenderTree/efl/AccessibilityControllerEfl.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2008, 2009, 2010 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009 Jan Michael Alonzo
+ * Copyright (C) 2013 Samsung Electronics. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "AccessibilityController.h"
+
+#if HAVE(ACCESSIBILITY)
+
+#include "AccessibilityCallbacks.h"
+#include "AccessibilityUIElement.h"
+#include "DumpRenderTree.h"
+#include "DumpRenderTreeChrome.h"
+#include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
+
+#include <atk/atk.h>
+#include <wtf/gobject/GOwnPtr.h>
+
+AccessibilityUIElement AccessibilityController::focusedElement()
+{
+    AtkObject* accessible =  DumpRenderTreeSupportEfl::focusedAccessibleElement(browser->mainFrame());
+    if (!accessible)
+        return 0;
+
+    return AccessibilityUIElement(accessible);
+}
+
+AccessibilityUIElement AccessibilityController::rootElement()
+{
+    AtkObject* accessible = DumpRenderTreeSupportEfl::rootAccessibleElement(browser->mainFrame());
+    if (!accessible)
+        return 0;
+
+    return AccessibilityUIElement(accessible);
+}
+
+AccessibilityUIElement AccessibilityController::accessibleElementById(JSStringRef id)
+{
+    AtkObject* root = DumpRenderTreeSupportEfl::rootAccessibleElement(browser->mainFrame());
+    if (!root)
+        return 0;
+
+    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(id);
+    GOwnPtr<gchar> idBuffer(static_cast<gchar*>(g_malloc(bufferSize)));
+    JSStringGetUTF8CString(id, idBuffer.get(), bufferSize);
+
+    AtkObject* result = childElementById(root, idBuffer.get());
+    if (ATK_IS_OBJECT(result))
+        return AccessibilityUIElement(result);
+
+    return 0;
+}
+
+#endif
diff --git a/Tools/DumpRenderTree/efl/AccessibilityUIElementEfl.cpp b/Tools/DumpRenderTree/efl/AccessibilityUIElementEfl.cpp
new file mode 100644
index 0000000..9e115d9
--- /dev/null
+++ b/Tools/DumpRenderTree/efl/AccessibilityUIElementEfl.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009 Jan Michael Alonzo
+ * Copyright (C) 2013 Samsung Electronics. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "AccessibilityUIElement.h"
+
+#if HAVE(ACCESSIBILITY)
+
+#include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
+#include <JavaScriptCore/JSStringRef.h>
+#include <atk/atk.h>
+#include <wtf/Assertions.h>
+#include <wtf/gobject/GOwnPtr.h>
+#include <wtf/gobject/GRefPtr.h>
+#include <wtf/text/WTFString.h>
+#include <wtf/unicode/CharacterNames.h>
+
+JSStringRef AccessibilityUIElement::helpText() const
+{
+    if (!m_element)
+        return JSStringCreateWithCharacters(0, 0);
+
+    ASSERT(ATK_IS_OBJECT(m_element));
+
+    String helpText = DumpRenderTreeSupportEfl::accessibilityHelpText(ATK_OBJECT(m_element));
+    GOwnPtr<gchar> axHelpText(g_strdup_printf("AXHelp: %s", helpText.utf8().data()));
+    return JSStringCreateWithUTF8CString(axHelpText.get());
+}
+
+#endif
diff --git a/Tools/DumpRenderTree/efl/CMakeLists.txt b/Tools/DumpRenderTree/efl/CMakeLists.txt
index 7f3563d..bedaa5c 100644
--- a/Tools/DumpRenderTree/efl/CMakeLists.txt
+++ b/Tools/DumpRenderTree/efl/CMakeLists.txt
@@ -1,11 +1,19 @@
-SET(DumpRenderTree_SOURCES
+set(DumpRenderTree_SOURCES
+    ${TOOLS_DIR}/DumpRenderTree/AccessibilityController.cpp
+    ${TOOLS_DIR}/DumpRenderTree/AccessibilityTextMarker.cpp
+    ${TOOLS_DIR}/DumpRenderTree/AccessibilityUIElement.cpp
     ${TOOLS_DIR}/DumpRenderTree/DumpRenderTreeCommon.cpp
     ${TOOLS_DIR}/DumpRenderTree/CyclicRedundancyCheck.cpp
     ${TOOLS_DIR}/DumpRenderTree/GCController.cpp
     ${TOOLS_DIR}/DumpRenderTree/TestRunner.cpp
     ${TOOLS_DIR}/DumpRenderTree/PixelDumpSupport.cpp
     ${TOOLS_DIR}/DumpRenderTree/WorkQueue.cpp
+    ${TOOLS_DIR}/DumpRenderTree/atk/AccessibilityCallbacksAtk.cpp
+    ${TOOLS_DIR}/DumpRenderTree/atk/AccessibilityControllerAtk.cpp
+    ${TOOLS_DIR}/DumpRenderTree/atk/AccessibilityUIElementAtk.cpp
     ${TOOLS_DIR}/DumpRenderTree/cairo/PixelDumpSupportCairo.cpp
+    ${TOOLS_DIR}/DumpRenderTree/efl/AccessibilityControllerEfl.cpp
+    ${TOOLS_DIR}/DumpRenderTree/efl/AccessibilityUIElementEfl.cpp
     ${TOOLS_DIR}/DumpRenderTree/efl/DumpHistoryItem.cpp
     ${TOOLS_DIR}/DumpRenderTree/efl/DumpRenderTree.cpp
     ${TOOLS_DIR}/DumpRenderTree/efl/DumpRenderTreeChrome.cpp
@@ -21,11 +29,7 @@
     ${TOOLS_DIR}/DumpRenderTree/efl/WorkQueueItemEfl.cpp
 )
 
-SET(ImageDiff_SOURCES
-    ${TOOLS_DIR}/DumpRenderTree/efl/ImageDiff.cpp
-)
-
-SET(DumpRenderTree_LIBRARIES
+set(DumpRenderTree_LIBRARIES
     ${JavaScriptCore_LIBRARY_NAME}
     ${WebCoreTestSupport_LIBRARY_NAME}
     ${WebCore_LIBRARY_NAME}
@@ -38,6 +42,7 @@
     ${ECORE_INPUT_LIBRARIES}
     ${EDJE_LIBRARIES}
     ${EINA_LIBRARIES}
+    ${EO_LIBRARIES}
     ${EVAS_LIBRARIES}
     ${FONTCONFIG_LIBRARIES}
     ${LIBXML2_LIBRARIES}
@@ -47,7 +52,7 @@
     ${LIBSOUP_LIBRARIES}
 )
 
-SET(DumpRenderTree_INCLUDE_DIRECTORIES
+set(DumpRenderTree_INCLUDE_DIRECTORIES
     "${WEBKIT_DIR}/efl/ewk"
     ${WEBKIT_DIR}/efl
     ${WEBKIT_DIR}/efl/WebCoreSupport
@@ -87,9 +92,11 @@
     ${JAVASCRIPTCORE_DIR}/interpreter
     ${JAVASCRIPTCORE_DIR}/jit
     ${JAVASCRIPTCORE_DIR}/llint
+    ${JAVASCRIPTCORE_DIR}/profiler
     ${JAVASCRIPTCORE_DIR}/runtime
     ${JAVASCRIPTCORE_DIR}/ForwardingHeaders
     ${TOOLS_DIR}/DumpRenderTree
+    ${TOOLS_DIR}/DumpRenderTree/atk
     ${TOOLS_DIR}/DumpRenderTree/cairo
     ${TOOLS_DIR}/DumpRenderTree/efl
     ${WTF_DIR}
@@ -106,24 +113,31 @@
     ${ECORE_INPUT_INCLUDE_DIRS}
     ${EDJE_INCLUDE_DIRS}
     ${EINA_INCLUDE_DIRS}
+    ${EO_INCLUDE_DIRS}
     ${EVAS_INCLUDE_DIRS}
     ${FONTCONFIG_INCLUDE_DIR}
     ${GLIB_INCLUDE_DIRS}
     ${LIBSOUP_INCLUDE_DIRS}
 )
 
+if (ENABLE_ACCESSIBILITY)
+    list(APPEND DumpRenderTree_INCLUDE_DIRECTORIES
+        ${TOOLS_DIR}/DumpRenderTree/atk
+        ${ATK_INCLUDE_DIRS}
+    )
+    list(APPEND DumpRenderTree_LIBRARIES
+        ${ATK_LIBRARIES}
+    )
+endif ()
+
 # FIXME: DOWNLOADED_FONTS_DIR should not hardcode the directory
 # structure. See <https://bugs.webkit.org/show_bug.cgi?id=81475>.
-ADD_DEFINITIONS(-DFONTS_CONF_DIR="${TOOLS_DIR}/DumpRenderTree/gtk/fonts"
+add_definitions(-DFONTS_CONF_DIR="${TOOLS_DIR}/DumpRenderTree/gtk/fonts"
                 -DDOWNLOADED_FONTS_DIR="${CMAKE_SOURCE_DIR}/WebKitBuild/Dependencies/Source/webkitgtk-test-fonts-0.0.3"
                 -DDATA_DIR="${THEME_BINARY_DIR}")
 
-INCLUDE_DIRECTORIES(${DumpRenderTree_INCLUDE_DIRECTORIES})
+include_directories(${DumpRenderTree_INCLUDE_DIRECTORIES})
 
-ADD_EXECUTABLE(DumpRenderTree ${DumpRenderTree_SOURCES})
-TARGET_LINK_LIBRARIES(DumpRenderTree ${DumpRenderTree_LIBRARIES})
-SET_TARGET_PROPERTIES(DumpRenderTree PROPERTIES FOLDER "Tools")
-
-ADD_EXECUTABLE(ImageDiff ${ImageDiff_SOURCES})
-TARGET_LINK_LIBRARIES(ImageDiff ${DumpRenderTree_LIBRARIES})
-SET_TARGET_PROPERTIES(ImageDiff PROPERTIES FOLDER "Tools")
+add_executable(DumpRenderTree ${DumpRenderTree_SOURCES})
+target_link_libraries(DumpRenderTree ${DumpRenderTree_LIBRARIES})
+set_target_properties(DumpRenderTree PROPERTIES FOLDER "Tools")
diff --git a/Tools/DumpRenderTree/efl/DumpRenderTree.cpp b/Tools/DumpRenderTree/efl/DumpRenderTree.cpp
index ef210e0..6de2d4a 100644
--- a/Tools/DumpRenderTree/efl/DumpRenderTree.cpp
+++ b/Tools/DumpRenderTree/efl/DumpRenderTree.cpp
@@ -72,7 +72,14 @@
 
 static String dumpFramesAsText(Evas_Object* frame)
 {
+    if (!frame)
+        return String();
+
     String result;
+    const char* frameContents = ewk_frame_plain_text_get(frame);
+
+    if (!frameContents)
+        return String();
 
     if (browser->mainFrame() != frame) {
         result.append("\n--------\nFrame: '");
@@ -80,7 +87,6 @@
         result.append("'\n--------\n");
     }
 
-    const char* frameContents = ewk_frame_plain_text_get(frame);
     result.append(String::fromUTF8(frameContents));
     result.append("\n");
     eina_stringshare_del(frameContents);
diff --git a/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.cpp b/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.cpp
index fb9c717..6127c9d 100644
--- a/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.cpp
+++ b/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.cpp
@@ -50,11 +50,14 @@
 #include <wtf/NotFound.h>
 #include <wtf/text/StringBuilder.h>
 
+#if HAVE(ACCESSIBILITY)
+#include "AccessibilityController.h"
+#endif
+
 using namespace WebCore;
 
 HashMap<unsigned long, CString> DumpRenderTreeChrome::m_dumpAssignedUrls;
 Evas_Object* DumpRenderTreeChrome::m_provisionalLoadFailedFrame = 0;
-Ewk_Intent_Request* DumpRenderTreeChrome::m_currentIntentRequest = 0;
 
 PassOwnPtr<DumpRenderTreeChrome> DumpRenderTreeChrome::create(Evas* evas)
 {
@@ -71,6 +74,7 @@
     , m_mainFrame(0)
     , m_evas(evas)
     , m_gcController(adoptPtr(new GCController))
+    , m_axController(adoptPtr(new AccessibilityController))
 {
 }
 
@@ -123,8 +127,6 @@
 
     Evas_Object* mainFrame = ewk_view_frame_main_get(view);
     evas_object_smart_callback_add(mainFrame, "icon,changed", onFrameIconChanged, 0);
-    evas_object_smart_callback_add(mainFrame, "intent,new", onFrameIntentNew, 0);
-    evas_object_smart_callback_add(mainFrame, "intent,service,register", onFrameIntentServiceRegistration, 0);
     evas_object_smart_callback_add(mainFrame, "load,provisional", onFrameProvisionalLoad, 0);
     evas_object_smart_callback_add(mainFrame, "load,provisional,failed", onFrameProvisionalLoadFailed, 0);
     evas_object_smart_callback_add(mainFrame, "load,committed", onFrameLoadCommitted, 0);
@@ -241,11 +243,6 @@
     return m_mainView;
 }
 
-Ewk_Intent_Request* DumpRenderTreeChrome::currentIntentRequest() const
-{
-    return m_currentIntentRequest;
-}
-
 void DumpRenderTreeChrome::resetDefaultsToConsistentValues()
 {
     ewk_settings_icon_database_clear();
@@ -281,7 +278,6 @@
     ewk_view_setting_auto_load_images_set(mainView(), EINA_TRUE);
     ewk_view_setting_user_stylesheet_set(mainView(), 0);
     ewk_view_setting_enable_xss_auditor_set(browser->mainView(), EINA_TRUE);
-    ewk_view_setting_minimum_timer_interval_set(browser->mainView(), 0.010); // 10 milliseconds (DOMTimer::s_minDefaultTimerInterval)
     ewk_view_setting_enable_webgl_set(mainView(), EINA_TRUE);
     ewk_view_setting_enable_hyperlink_auditing_set(mainView(), EINA_FALSE);
     ewk_view_setting_include_links_in_focus_chain_set(mainView(), EINA_FALSE);
@@ -306,6 +302,10 @@
 
     ewk_security_policy_whitelist_origin_reset();
 
+#if HAVE(ACCESSIBILITY)
+    browser->accessibilityController()->resetToConsistentState();
+#endif
+
     DumpRenderTreeSupportEfl::clearFrameName(mainFrame());
     DumpRenderTreeSupportEfl::clearOpener(mainFrame());
     DumpRenderTreeSupportEfl::clearUserScripts(mainView());
@@ -315,8 +315,6 @@
     DumpRenderTreeSupportEfl::setValidationMessageTimerMagnification(mainView(), -1);
     DumpRenderTreeSupportEfl::setAuthorAndUserStylesEnabled(mainView(), true);
     DumpRenderTreeSupportEfl::setCSSGridLayoutEnabled(mainView(), false);
-    DumpRenderTreeSupportEfl::setSmartInsertDeleteEnabled(mainView(), false);
-    DumpRenderTreeSupportEfl::setSelectTrailingWhitespaceEnabled(mainView(), false);
     DumpRenderTreeSupportEfl::setDefersLoading(mainView(), false);
     DumpRenderTreeSupportEfl::setLoadsSiteIconsIgnoringImageLoadingSetting(mainView(), false);
     DumpRenderTreeSupportEfl::setSerializeHTTPLoads(false);
@@ -324,6 +322,7 @@
     DumpRenderTreeSupportEfl::setCSSRegionsEnabled(mainView(), true);
     DumpRenderTreeSupportEfl::setShouldTrackVisitedLinks(false);
     DumpRenderTreeSupportEfl::setTracksRepaints(mainFrame(), false);
+    DumpRenderTreeSupportEfl::setSeamlessIFramesEnabled(true);
 
     // Reset capacities for the memory cache for dead objects.
     static const unsigned cacheTotalCapacity =  8192 * 1024;
@@ -331,11 +330,6 @@
     DumpRenderTreeSupportEfl::setDeadDecodedDataDeletionInterval(0);
     ewk_settings_page_cache_capacity_set(3);
 
-    if (m_currentIntentRequest) {
-        ewk_intent_request_unref(m_currentIntentRequest);
-        m_currentIntentRequest = 0;
-    }
-
     policyDelegateEnabled = false;
     policyDelegatePermissive = false;
 }
@@ -443,6 +437,11 @@
     JSValueRef exception = 0;
     ASSERT(gTestRunner);
 
+#if HAVE(ACCESSIBILITY)
+    browser->accessibilityController()->makeWindowObject(objectClearedInfo->context, objectClearedInfo->windowObject, &exception);
+    ASSERT(!exception);
+#endif
+
     GCController* gcController = static_cast<GCController*>(userData);
     ASSERT(gcController);
 
@@ -615,8 +614,6 @@
     Evas_Object* frame = static_cast<Evas_Object*>(eventInfo);
 
     evas_object_smart_callback_add(frame, "icon,changed", onFrameIconChanged, 0);
-    evas_object_smart_callback_add(frame, "intent,new", onFrameIntentNew, 0);
-    evas_object_smart_callback_add(frame, "intent,service,register", onFrameIntentServiceRegistration, 0);
     evas_object_smart_callback_add(frame, "load,provisional", onFrameProvisionalLoad, 0);
     evas_object_smart_callback_add(frame, "load,provisional,failed", onFrameProvisionalLoadFailed, 0);
     evas_object_smart_callback_add(frame, "load,committed", onFrameLoadCommitted, 0);
@@ -850,61 +847,6 @@
         m_dumpAssignedUrls.add(request->identifier, pathSuitableForTestResult(request->url));
 }
 
-void DumpRenderTreeChrome::onFrameIntentNew(void*, Evas_Object*, void* eventInfo)
-{
-    Ewk_Intent_Request* request = static_cast<Ewk_Intent_Request*>(eventInfo);
-    Ewk_Intent* intent = ewk_intent_request_intent_get(request);
-    if (!intent)
-        return;
-
-    ewk_intent_request_ref(request);
-    if (m_currentIntentRequest)
-        ewk_intent_request_unref(m_currentIntentRequest);
-    m_currentIntentRequest = request;
-
-    printf("Received Web Intent: action=%s type=%s\n",
-           ewk_intent_action_get(intent),
-           ewk_intent_type_get(intent));
-
-    const MessagePortChannelArray* messagePorts = DumpRenderTreeSupportEfl::intentMessagePorts(intent);
-    if (messagePorts)
-        printf("Have %d ports\n", static_cast<int>(messagePorts->size()));
-
-    const char* service = ewk_intent_service_get(intent);
-    if (service && strcmp(service, ""))
-        printf("Explicit intent service: %s\n", service);
-
-    void* data = 0;
-    Eina_List* extraNames = ewk_intent_extra_names_get(intent);
-    EINA_LIST_FREE(extraNames, data) {
-        const char* name = static_cast<char*>(data);
-        const char* value = ewk_intent_extra_get(intent, name);
-        if (value) {
-            printf("Extras[%s] = %s\n", name, value);
-            eina_stringshare_del(value);
-        }
-        eina_stringshare_del(name);
-    }
-
-    Eina_List* suggestions = ewk_intent_suggestions_get(intent);
-    EINA_LIST_FREE(suggestions, data) {
-        const char* suggestion = static_cast<char*>(data);
-        printf("Have suggestion %s\n", suggestion);
-        eina_stringshare_del(suggestion);
-    }
-}
-
-void DumpRenderTreeChrome::onFrameIntentServiceRegistration(void*, Evas_Object*, void* eventInfo)
-{
-    Ewk_Intent_Service_Info* serviceInfo = static_cast<Ewk_Intent_Service_Info*>(eventInfo);
-    printf("Registered Web Intent Service: action=%s type=%s title=%s url=%s disposition=%s\n",
-           serviceInfo->action,
-           serviceInfo->type,
-           serviceInfo->title,
-           serviceInfo->href,
-           serviceInfo->disposition);
-}
-
 void DumpRenderTreeChrome::onDownloadRequest(void*, Evas_Object*, void* eventInfo)
 {
     // In case of "download,request", the URL need to be downloaded, not opened on the current view.
@@ -920,3 +862,8 @@
  
     browser->m_extraViews.append(newView);
 }
+
+AccessibilityController* DumpRenderTreeChrome::accessibilityController() const
+{
+    return m_axController.get();
+}
diff --git a/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.h b/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.h
index 32a3654..4cb592b 100644
--- a/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.h
+++ b/Tools/DumpRenderTree/efl/DumpRenderTreeChrome.h
@@ -32,13 +32,16 @@
 
 #include <Eina.h>
 #include <Evas.h>
-#include <ewk_intent_request.h>
 #include <wtf/HashMap.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
 #include <wtf/Vector.h>
 #include <wtf/text/CString.h>
 
+#if HAVE(ACCESSIBILITY)
+#include "AccessibilityController.h"
+#endif
+
 class DumpRenderTreeChrome {
 public:
     ~DumpRenderTreeChrome();
@@ -58,8 +61,6 @@
     Evas_Object* mainFrame() const;
     Evas_Object* mainView() const;
 
-    Ewk_Intent_Request* currentIntentRequest() const;
-
     void resetDefaultsToConsistentValues();
 
 private:
@@ -67,15 +68,16 @@
 
     Evas_Object* createView() const;
     bool initialize();
+    AccessibilityController* accessibilityController() const;
 
     Evas_Object* m_mainFrame;
     Evas_Object* m_mainView;
     Evas* m_evas;
+    OwnPtr<AccessibilityController> m_axController;
     OwnPtr<GCController> m_gcController;
     Vector<Evas_Object*> m_extraViews;
     static HashMap<unsigned long, CString> m_dumpAssignedUrls;
     static Evas_Object* m_provisionalLoadFailedFrame;
-    static Ewk_Intent_Request* m_currentIntentRequest;
 
     // Smart callbacks
     static void onWindowObjectCleared(void*, Evas_Object*, void*);
@@ -139,9 +141,6 @@
 
     static void onNewResourceRequest(void*, Evas_Object*, void*);
 
-    static void onFrameIntentNew(void*, Evas_Object*, void*);
-    static void onFrameIntentServiceRegistration(void*, Evas_Object*, void*);
-
     static void onDownloadRequest(void*, Evas_Object*, void*);
 };
 
diff --git a/Tools/DumpRenderTree/efl/EventSender.cpp b/Tools/DumpRenderTree/efl/EventSender.cpp
index e2ff5e1..92b7889 100644
--- a/Tools/DumpRenderTree/efl/EventSender.cpp
+++ b/Tools/DumpRenderTree/efl/EventSender.cpp
@@ -992,7 +992,6 @@
     unsigned timeStamp = 0;
     Evas_Object* mainFrame = browser->mainFrame();
     Evas* evas = evas_object_evas_get(mainFrame);
-    DumpRenderTreeSupportEfl::layoutFrame(mainFrame);
     EvasMouseEvent event = eventInfo->event;
 
     setEvasModifiers(evas, eventInfo->modifiers);
diff --git a/Tools/DumpRenderTree/efl/PixelDumpSupportEfl.cpp b/Tools/DumpRenderTree/efl/PixelDumpSupportEfl.cpp
index 4464836..2419039 100644
--- a/Tools/DumpRenderTree/efl/PixelDumpSupportEfl.cpp
+++ b/Tools/DumpRenderTree/efl/PixelDumpSupportEfl.cpp
@@ -38,7 +38,7 @@
 #include "PixelDumpSupportCairo.h"
 #include "RefPtrCairo.h"
 #include "WebCoreSupport/DumpRenderTreeSupportEfl.h"
-#include "ewk_view_private.h"
+#include "ewk_view.h"
 
 PassRefPtr<BitmapContext> createBitmapContextFromWebView(bool, bool, bool, bool drawSelectionRect)
 {
diff --git a/Tools/DumpRenderTree/efl/TestRunnerEfl.cpp b/Tools/DumpRenderTree/efl/TestRunnerEfl.cpp
index cd78b10..044dfd4 100644
--- a/Tools/DumpRenderTree/efl/TestRunnerEfl.cpp
+++ b/Tools/DumpRenderTree/efl/TestRunnerEfl.cpp
@@ -112,11 +112,6 @@
     DumpRenderTreeSupportEfl::setShouldTrackVisitedLinks(true);
 }
 
-JSValueRef TestRunner::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef value)
-{
-    return DumpRenderTreeSupportEfl::computedStyleIncludingVisitedInfo(context, value);
-}
-
 size_t TestRunner::webHistoryItemCount()
 {
     const Ewk_History* history = ewk_view_history_get(browser->mainView());
@@ -126,11 +121,6 @@
     return ewk_history_back_list_length(history) + ewk_history_forward_list_length(history);
 }
 
-unsigned TestRunner::workerThreadCount() const
-{
-    return DumpRenderTreeSupportEfl::workerThreadCount();
-}
-
 void TestRunner::notifyDone()
 {
     if (m_waitToDump && !topLoadingFrame && !WorkQueue::shared()->count())
@@ -282,11 +272,6 @@
     notImplemented();
 }
 
-void TestRunner::setSmartInsertDeleteEnabled(bool flag)
-{
-    DumpRenderTreeSupportEfl::setSmartInsertDeleteEnabled(browser->mainView(), flag);
-}
-
 static Eina_Bool waitToDumpWatchdogFired(void*)
 {
     waitToDumpWatchdog = 0;
@@ -323,11 +308,6 @@
     ewk_view_setting_enable_xss_auditor_set(browser->mainView(), flag);
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool flag)
-{
-    ewk_view_setting_enable_frame_flattening_set(browser->mainView(), flag);
-}
-
 void TestRunner::setSpatialNavigationEnabled(bool flag)
 {
     ewk_view_setting_spatial_navigation_set(browser->mainView(), flag);
@@ -348,16 +328,6 @@
     DumpRenderTreeSupportEfl::setAuthorAndUserStylesEnabled(browser->mainView(), flag);
 }
 
-void TestRunner::setAutofilled(JSContextRef context, JSValueRef nodeObject, bool autofilled)
-{
-    DumpRenderTreeSupportEfl::setAutofilled(context, nodeObject, autofilled);
-}
-
-void TestRunner::disableImageLoading()
-{
-    ewk_view_setting_auto_load_images_set(browser->mainView(), EINA_FALSE);
-}
-
 void TestRunner::setMockDeviceOrientation(bool, double, bool, double, bool, double)
 {
     // FIXME: Implement for DeviceOrientation layout tests.
@@ -446,11 +416,6 @@
         ewk_settings_icon_database_path_set(databasePath.utf8().data());
 }
 
-void TestRunner::setSelectTrailingWhitespaceEnabled(bool flag)
-{
-    DumpRenderTreeSupportEfl::setSelectTrailingWhitespaceEnabled(browser->mainView(), flag);
-}
-
 void TestRunner::setPopupBlockingEnabled(bool flag)
 {
     ewk_view_setting_scripts_can_open_windows_set(browser->mainView(), !flag);
@@ -461,13 +426,6 @@
     ewk_view_setting_enable_plugins_set(browser->mainView(), flag);
 }
 
-bool TestRunner::elementDoesAutoCompleteForElementWithId(JSStringRef id)
-{
-    const String elementId(id->string());
-    const Evas_Object* mainFrame = browser->mainFrame();
-    return DumpRenderTreeSupportEfl::elementDoesAutoCompleteForElementWithId(mainFrame, elementId);
-}
-
 void TestRunner::execCommand(JSStringRef name, JSStringRef value)
 {
     DumpRenderTreeSupportEfl::executeCoreCommandByName(browser->mainView(), name->string().utf8().data(), value->string().utf8().data());
@@ -660,21 +618,6 @@
     ewk_settings_application_cache_max_quota_set(size);
 }
 
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
-{
-    return DumpRenderTreeSupportEfl::pauseAnimation(browser->mainFrame(), animationName->string().utf8().data(), elementId->string().utf8().data(), time);
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
-{
-    return DumpRenderTreeSupportEfl::pauseTransition(browser->mainFrame(), propertyName->string().utf8().data(), elementId->string().utf8().data(), time);
-}
-
-unsigned TestRunner::numberOfActiveAnimations() const
-{
-    return DumpRenderTreeSupportEfl::activeAnimationsCount(browser->mainFrame());
-}
-
 static inline bool toBool(JSStringRef value)
 {
     return equals(value, "true") || equals(value, "1");
@@ -736,11 +679,6 @@
     ewk_view_setting_enable_developer_extras_set(browser->mainView(), enabled);
 }
 
-void TestRunner::setAsynchronousSpellCheckingEnabled(bool)
-{
-    notImplemented();
-}
-
 void TestRunner::showWebInspector()
 {
     ewk_view_inspector_show(browser->mainView());
@@ -796,16 +734,6 @@
     ewk_frame_editable_set(browser->mainFrame(), EINA_TRUE);
 }
 
-JSRetainPtr<JSStringRef> TestRunner::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
-{
-    String markerTextChar = DumpRenderTreeSupportEfl::markerTextForListItem(context, nodeObject);
-    if (markerTextChar.isEmpty())
-        return 0;
-
-    JSRetainPtr<JSStringRef> markerText(Adopt, JSStringCreateWithUTF8CString(markerTextChar.utf8().data()));
-    return markerText;
-}
-
 void TestRunner::authenticateSession(JSStringRef, JSStringRef, JSStringRef)
 {
     notImplemented();
@@ -821,11 +749,6 @@
     DumpRenderTreeSupportEfl::setSerializeHTTPLoads(serialize);
 }
 
-void TestRunner::setMinimumTimerInterval(double minimumTimerInterval)
-{
-    ewk_view_setting_minimum_timer_interval_set(browser->mainView(), minimumTimerInterval);
-}
-
 void TestRunner::setTextDirection(JSStringRef direction)
 {
     Ewk_Text_Direction ewkDirection;
@@ -906,21 +829,18 @@
     notImplemented();
 }
 
-void TestRunner::sendWebIntentResponse(JSStringRef response)
-{
-    Ewk_Intent_Request* request = browser->currentIntentRequest();
-    if (!request)
-        return;
-
-    DumpRenderTreeSupportEfl::sendWebIntentResponse(request, response);
-}
-
-void TestRunner::deliverWebIntent(JSStringRef action, JSStringRef type, JSStringRef data)
-{
-    DumpRenderTreeSupportEfl::deliverWebIntent(browser->mainFrame(), action, type, data);
-}
-
 void TestRunner::setStorageDatabaseIdleInterval(double)
 {
     notImplemented();
 }
+
+void TestRunner::closeIdleLocalStorageDatabases()
+{
+    notImplemented();
+}
+
+JSRetainPtr<JSStringRef> TestRunner::platformName() const
+{
+    JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("efl"));
+    return platformName;
+}
diff --git a/Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp b/Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp
index 466182b..d89a8d2 100644
--- a/Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp
+++ b/Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp
@@ -35,22 +35,7 @@
 #include <atk/atk.h>
 #include <gtk/gtk.h>
 #include <webkit/webkit.h>
-
-static bool loggingAccessibilityEvents = false;
-
-AccessibilityController::AccessibilityController()
-{
-}
-
-AccessibilityController::~AccessibilityController()
-{
-}
-
-AccessibilityUIElement AccessibilityController::elementAtPoint(int x, int y)
-{
-    // FIXME: implement
-    return 0;
-}
+#include <wtf/gobject/GOwnPtr.h>
 
 AccessibilityUIElement AccessibilityController::focusedElement()
 {
@@ -72,42 +57,18 @@
 
 AccessibilityUIElement AccessibilityController::accessibleElementById(JSStringRef id)
 {
-    // FIXME: implement
+    AtkObject* root = DumpRenderTreeSupportGtk::getRootAccessibleElement(mainFrame);
+    if (!root)
+        return 0;
+
+    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(id);
+    GOwnPtr<gchar> idBuffer(static_cast<gchar*>(g_malloc(bufferSize)));
+    JSStringGetUTF8CString(id, idBuffer.get(), bufferSize);
+
+    AtkObject* result = childElementById(root, idBuffer.get());
+    if (ATK_IS_OBJECT(result))
+        return AccessibilityUIElement(result);
+
     return 0;
-}
 
-void AccessibilityController::setLogFocusEvents(bool)
-{
-}
-
-void AccessibilityController::setLogScrollingStartEvents(bool)
-{
-}
-
-void AccessibilityController::setLogValueChangeEvents(bool)
-{
-}
-
-void AccessibilityController::setLogAccessibilityEvents(bool logAccessibilityEvents)
-{
-    if (logAccessibilityEvents == loggingAccessibilityEvents)
-        return;
-
-    if (!logAccessibilityEvents) {
-        disconnectAccessibilityCallbacks();
-        loggingAccessibilityEvents = false;
-        return;
-    }
-
-    connectAccessibilityCallbacks();
-    loggingAccessibilityEvents = true;
-}
-
-bool AccessibilityController::addNotificationListener(JSObjectRef)
-{
-    return false;
-}
-
-void AccessibilityController::removeNotificationListener()
-{
 }
diff --git a/Tools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp b/Tools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp
index b00c583..30f7b64 100644
--- a/Tools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp
+++ b/Tools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp
@@ -37,382 +37,6 @@
 #include <wtf/text/WTFString.h>
 #include <wtf/unicode/CharacterNames.h>
 
-static inline String roleToString(AtkRole role)
-{
-    switch (role) {
-    case ATK_ROLE_ALERT:
-        return "AXRole: AXAlert";
-    case ATK_ROLE_CANVAS:
-        return "AXRole: AXCanvas";
-    case ATK_ROLE_CHECK_BOX:
-        return "AXRole: AXCheckBox";
-    case ATK_ROLE_COLUMN_HEADER:
-        return "AXRole: AXColumnHeader";
-    case ATK_ROLE_COMBO_BOX:
-        return "AXRole: AXComboBox";
-    case ATK_ROLE_DOCUMENT_FRAME:
-        return "AXRole: AXWebArea";
-    case ATK_ROLE_ENTRY:
-        return "AXRole: AXTextField";
-    case ATK_ROLE_FOOTER:
-        return "AXRole: AXFooter";
-    case ATK_ROLE_FORM:
-        return "AXRole: AXForm";
-    case ATK_ROLE_GROUPING:
-        return "AXRole: AXGroup";
-    case ATK_ROLE_HEADING:
-        return "AXRole: AXHeading";
-    case ATK_ROLE_IMAGE:
-        return "AXRole: AXImage";
-    case ATK_ROLE_IMAGE_MAP:
-        return "AXRole: AXImageMap";
-    case ATK_ROLE_LABEL:
-        return "AXRole: AXLabel";
-    case ATK_ROLE_LINK:
-        return "AXRole: AXLink";
-    case ATK_ROLE_LIST:
-        return "AXRole: AXList";
-    case ATK_ROLE_LIST_BOX:
-        return "AXRole: AXListBox";
-    case ATK_ROLE_LIST_ITEM:
-        return "AXRole: AXListItem";
-    case ATK_ROLE_MENU:
-        return "AXRole: AXMenu";
-    case ATK_ROLE_MENU_BAR:
-        return "AXRole: AXMenuBar";
-    case ATK_ROLE_MENU_ITEM:
-        return "AXRole: AXMenuItem";
-    case ATK_ROLE_PAGE_TAB:
-        return "AXRole: AXTab";
-    case ATK_ROLE_PAGE_TAB_LIST:
-        return "AXRole: AXTabGroup";
-    case ATK_ROLE_PANEL:
-        return "AXRole: AXGroup";
-    case ATK_ROLE_PARAGRAPH:
-        return "AXRole: AXParagraph";
-    case ATK_ROLE_PASSWORD_TEXT:
-        return "AXRole: AXPasswordField";
-    case ATK_ROLE_PUSH_BUTTON:
-        return "AXRole: AXButton";
-    case ATK_ROLE_RADIO_BUTTON:
-        return "AXRole: AXRadioButton";
-    case ATK_ROLE_ROW_HEADER:
-        return "AXRole: AXRowHeader";
-    case ATK_ROLE_RULER:
-        return "AXRole: AXRuler";
-    case ATK_ROLE_SCROLL_BAR:
-        return "AXRole: AXScrollBar";
-    case ATK_ROLE_SCROLL_PANE:
-        return "AXRole: AXScrollArea";
-    case ATK_ROLE_SECTION:
-        return "AXRole: AXDiv";
-    case ATK_ROLE_SEPARATOR:
-        return "AXRole: AXHorizontalRule";
-    case ATK_ROLE_SLIDER:
-        return "AXRole: AXSlider";
-    case ATK_ROLE_SPIN_BUTTON:
-        return "AXRole: AXSpinButton";
-    case ATK_ROLE_TABLE:
-        return "AXRole: AXTable";
-    case ATK_ROLE_TABLE_CELL:
-        return "AXRole: AXCell";
-    case ATK_ROLE_TABLE_COLUMN_HEADER:
-        return "AXRole: AXColumnHeader";
-    case ATK_ROLE_TABLE_ROW:
-        return "AXRole: AXRow";
-    case ATK_ROLE_TABLE_ROW_HEADER:
-        return "AXRole: AXRowHeader";
-    case ATK_ROLE_TOGGLE_BUTTON:
-        return "AXRole: AXToggleButton";
-    case ATK_ROLE_TOOL_BAR:
-        return "AXRole: AXToolbar";
-    case ATK_ROLE_TOOL_TIP:
-        return "AXRole: AXUserInterfaceTooltip";
-    case ATK_ROLE_TREE:
-        return "AXRole: AXTree";
-    case ATK_ROLE_TREE_TABLE:
-        return "AXRole: AXTreeGrid";
-    case ATK_ROLE_TREE_ITEM:
-        return "AXRole: AXTreeItem";
-    case ATK_ROLE_WINDOW:
-        return "AXRole: AXWindow";
-    case ATK_ROLE_UNKNOWN:
-        return "AXRole: AXUnknown";
-    default:
-        // We want to distinguish ATK_ROLE_UNKNOWN from a known AtkRole which
-        // our DRT isn't properly handling.
-        return "AXRole: FIXME not identified";
-    }
-}
-
-static inline gchar* replaceCharactersForResults(gchar* str)
-{
-    String uString = String::fromUTF8(str);
-
-    // The object replacement character is passed along to ATs so we need to be
-    // able to test for their presence and do so without causing test failures.
-    uString.replace(objectReplacementCharacter, "<obj>");
-
-    // The presence of newline characters in accessible text of a single object
-    // is appropriate, but it makes test results (especially the accessible tree)
-    // harder to read.
-    uString.replace("\n", "<\\n>");
-
-    return g_strdup(uString.utf8().data());
-}
-
-AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
-    : m_element(element)
-{
-    if (m_element)
-        g_object_ref(m_element);
-}
-
-AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
-    : m_element(other.m_element)
-{
-    if (m_element)
-        g_object_ref(m_element);
-}
-
-AccessibilityUIElement::~AccessibilityUIElement()
-{
-    if (m_element)
-        g_object_unref(m_element);
-}
-
-void AccessibilityUIElement::getLinkedUIElements(Vector<AccessibilityUIElement>& elements)
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::getDocumentLinks(Vector<AccessibilityUIElement>&)
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& children)
-{
-    int count = childrenCount();
-    for (int i = 0; i < count; i++) {
-        AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
-        children.append(AccessibilityUIElement(child));
-    }
-}
-
-void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned start, unsigned end)
-{
-    for (unsigned i = start; i < end; i++) {
-        AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
-        elementVector.append(AccessibilityUIElement(child));
-    }
-}
-
-int AccessibilityUIElement::rowCount()
-{
-    if (!m_element)
-        return 0;
-
-    ASSERT(ATK_IS_TABLE(m_element));
-
-    return atk_table_get_n_rows(ATK_TABLE(m_element));
-}
-
-int AccessibilityUIElement::columnCount()
-{
-    if (!m_element)
-        return 0;
-
-    ASSERT(ATK_IS_TABLE(m_element));
-
-    return atk_table_get_n_columns(ATK_TABLE(m_element));
-}
-
-int AccessibilityUIElement::childrenCount()
-{
-    if (!m_element)
-        return 0;
-
-    ASSERT(ATK_IS_OBJECT(m_element));
-
-    return atk_object_get_n_accessible_children(ATK_OBJECT(m_element));
-}
-
-AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
-{
-    // FIXME: implement
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
-{
-    // FIXME: implement
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
-{
-    Vector<AccessibilityUIElement> children;
-    getChildrenWithRange(children, index, index + 1);
-
-    if (children.size() == 1)
-        return children.at(0);
-
-    return 0;
-}
-
-unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
-{ 
-    // FIXME: implement
-    return 0;
-}
-
-gchar* attributeSetToString(AtkAttributeSet* attributeSet)
-{
-    GString* str = g_string_new(0);
-    for (GSList* attributes = attributeSet; attributes; attributes = attributes->next) {
-        AtkAttribute* attribute = static_cast<AtkAttribute*>(attributes->data);
-        GOwnPtr<gchar> attributeData(g_strconcat(attribute->name, ":", attribute->value, NULL));
-        g_string_append(str, attributeData.get());
-        if (attributes->next)
-            g_string_append(str, ", ");
-    }
-
-    return g_string_free(str, FALSE);
-}
-
-JSStringRef AccessibilityUIElement::allAttributes()
-{
-    if (!m_element)
-        return JSStringCreateWithCharacters(0, 0);
-
-    ASSERT(ATK_IS_OBJECT(m_element));
-    GOwnPtr<gchar> attributeData(attributeSetToString(atk_object_get_attributes(ATK_OBJECT(m_element))));
-    return JSStringCreateWithUTF8CString(attributeData.get());
-}
-
-JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::attributesOfDocumentLinks()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-AccessibilityUIElement AccessibilityUIElement::titleUIElement()
-{
-
-    if (!m_element)
-        return 0;
-
-    AtkRelationSet* set = atk_object_ref_relation_set(ATK_OBJECT(m_element));
-    if (!set)
-        return 0;
-
-    AtkObject* target = 0;
-    int count = atk_relation_set_get_n_relations(set);
-    for (int i = 0; i < count; i++) {
-        AtkRelation* relation = atk_relation_set_get_relation(set, i);
-        if (atk_relation_get_relation_type(relation) == ATK_RELATION_LABELLED_BY) {
-            GPtrArray* targetList = atk_relation_get_target(relation);
-            if (targetList->len)
-                target = static_cast<AtkObject*>(g_ptr_array_index(targetList, 0));
-        }
-        g_object_unref(set);
-    }
-
-    return target ? AccessibilityUIElement(target) : 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::parentElement()
-{
-    if (!m_element)
-        return 0;
-
-    ASSERT(ATK_IS_OBJECT(m_element));
-
-    AtkObject* parent =  atk_object_get_parent(ATK_OBJECT(m_element));
-    return parent ? AccessibilityUIElement(parent) : 0;
-}
-
-JSStringRef AccessibilityUIElement::attributesOfChildren()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::role()
-{
-    AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
-    if (!role)
-        return JSStringCreateWithCharacters(0, 0);
-
-    String roleString = roleToString(role);
-    return JSStringCreateWithUTF8CString(roleString.utf8().data());
-}
-
-JSStringRef AccessibilityUIElement::subrole()
-{
-    return 0;
-}
-
-JSStringRef AccessibilityUIElement::roleDescription()
-{
-    return 0;
-}
-
-JSStringRef AccessibilityUIElement::title()
-{
-    const gchar* name = atk_object_get_name(ATK_OBJECT(m_element));
-
-    if (!name)
-        return JSStringCreateWithCharacters(0, 0);
-
-    GOwnPtr<gchar> axTitle(g_strdup_printf("AXTitle: %s", name));
-
-    return JSStringCreateWithUTF8CString(axTitle.get());
-}
-
-JSStringRef AccessibilityUIElement::description()
-{
-    const gchar* description = atk_object_get_description(ATK_OBJECT(m_element));
-
-    if (!description)
-        return JSStringCreateWithCharacters(0, 0);
-
-    GOwnPtr<gchar> axDesc(g_strdup_printf("AXDescription: %s", description));
-
-    return JSStringCreateWithUTF8CString(axDesc.get());
-}
-
-JSStringRef AccessibilityUIElement::stringValue()
-{
-    if (!m_element || !ATK_IS_TEXT(m_element))
-        return JSStringCreateWithCharacters(0, 0);
-
-    gchar* text = atk_text_get_text(ATK_TEXT(m_element), 0, -1);
-    GOwnPtr<gchar> axValue(g_strdup_printf("AXValue: %s", replaceCharactersForResults(text)));
-    g_free(text);
-
-    return JSStringCreateWithUTF8CString(axValue.get());
-}
-
-JSStringRef AccessibilityUIElement::language()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
 JSStringRef AccessibilityUIElement::helpText() const
 {
     if (!m_element)
@@ -424,585 +48,3 @@
     GOwnPtr<gchar> axHelpText(g_strdup_printf("AXHelp: %s", helpText.data()));
     return JSStringCreateWithUTF8CString(axHelpText.get());
 }
-
-double AccessibilityUIElement::x()
-{
-    int x, y;
-
-    atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
-
-    return x;
-}
-
-double AccessibilityUIElement::y()
-{
-    int x, y;
-
-    atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
-
-    return y;
-}
-
-double AccessibilityUIElement::width()
-{
-    int width, height;
-
-    atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
-
-    return width;
-}
-
-double AccessibilityUIElement::height()
-{
-    int width, height;
-
-    atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
-
-    return height;
-}
-
-double AccessibilityUIElement::clickPointX()
-{
-    return 0.f;
-}
-
-double AccessibilityUIElement::clickPointY()
-{
-    return 0.f;
-}
-
-JSStringRef AccessibilityUIElement::orientation() const
-{
-    return 0;
-}
-
-double AccessibilityUIElement::intValue() const
-{
-    GValue value = { 0, { { 0 } } };
-
-    if (!ATK_IS_VALUE(m_element))
-        return 0.0f;
-
-    atk_value_get_current_value(ATK_VALUE(m_element), &value);
-    if (!G_VALUE_HOLDS_FLOAT(&value))
-        return 0.0f;
-    return g_value_get_float(&value);
-}
-
-double AccessibilityUIElement::minValue()
-{
-    GValue value = { 0, { { 0 } } };
-
-    if (!ATK_IS_VALUE(m_element))
-        return 0.0f;
-
-    atk_value_get_minimum_value(ATK_VALUE(m_element), &value);
-    if (!G_VALUE_HOLDS_FLOAT(&value))
-        return 0.0f;
-    return g_value_get_float(&value);
-}
-
-double AccessibilityUIElement::maxValue()
-{
-    GValue value = { 0, { { 0 } } };
-
-    if (!ATK_IS_VALUE(m_element))
-        return 0.0f;
-
-    atk_value_get_maximum_value(ATK_VALUE(m_element), &value);
-    if (!G_VALUE_HOLDS_FLOAT(&value))
-        return 0.0f;
-    return g_value_get_float(&value);
-}
-
-JSStringRef AccessibilityUIElement::valueDescription()
-{
-    // FIXME: implement after it has been implemented in ATK.
-    // See: https://bugzilla.gnome.org/show_bug.cgi?id=684576
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-static bool checkElementState(PlatformUIElement element, AtkStateType stateType)
-{
-    if (!ATK_IS_OBJECT(element))
-         return false;
-
-    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(element)));
-    return atk_state_set_contains_state(stateSet.get(), stateType);
-}
-
-bool AccessibilityUIElement::isEnabled()
-{
-    return checkElementState(m_element, ATK_STATE_ENABLED);
-}
-
-int AccessibilityUIElement::insertionPointLineNumber()
-{
-    // FIXME: implement
-    return 0;
-}
-
-bool AccessibilityUIElement::isActionSupported(JSStringRef action)
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isRequired() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isFocused() const
-{
-    if (!ATK_IS_OBJECT(m_element))
-        return false;
-
-    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
-    gboolean isFocused = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSED);
-
-    return isFocused;
-}
-
-bool AccessibilityUIElement::isSelected() const
-{
-    return checkElementState(m_element, ATK_STATE_SELECTED);
-}
-
-int AccessibilityUIElement::hierarchicalLevel() const
-{
-    // FIXME: implement
-    return 0;
-}
-
-bool AccessibilityUIElement::ariaIsGrabbed() const
-{
-    return false;
-}
- 
-JSStringRef AccessibilityUIElement::ariaDropEffects() const
-{   
-    return 0; 
-}
-
-bool AccessibilityUIElement::isExpanded() const
-{
-    if (!ATK_IS_OBJECT(m_element))
-        return false;
-
-    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
-    gboolean isExpanded = atk_state_set_contains_state(stateSet.get(), ATK_STATE_EXPANDED);
-
-    return isExpanded;
-}
-
-bool AccessibilityUIElement::isChecked() const
-{
-    if (!ATK_IS_OBJECT(m_element))
-        return false;
-
-    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
-    gboolean isChecked = atk_state_set_contains_state(stateSet.get(), ATK_STATE_CHECKED);
-
-    return isChecked;
-}
-
-JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::attributesOfColumns()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::attributesOfRows()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::attributesOfHeader()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-int AccessibilityUIElement::indexInTable()
-{
-    // FIXME: implement
-    return 0;
-}
-
-static JSStringRef indexRangeInTable(PlatformUIElement element, bool isRowRange)
-{
-    GOwnPtr<gchar> rangeString(g_strdup("{0, 0}"));
-
-    if (!element)
-        return JSStringCreateWithUTF8CString(rangeString.get());
-
-    ASSERT(ATK_IS_OBJECT(element));
-
-    AtkObject* axTable = atk_object_get_parent(ATK_OBJECT(element));
-    if (!axTable || !ATK_IS_TABLE(axTable))
-        return JSStringCreateWithUTF8CString(rangeString.get());
-
-    // Look for the cell in the table.
-    gint indexInParent = atk_object_get_index_in_parent(ATK_OBJECT(element));
-    if (indexInParent == -1)
-        return JSStringCreateWithUTF8CString(rangeString.get());
-
-    int row = -1;
-    int column = -1;
-    row = atk_table_get_row_at_index(ATK_TABLE(axTable), indexInParent);
-    column = atk_table_get_column_at_index(ATK_TABLE(axTable), indexInParent);
-
-    // Get the actual values, if row and columns are valid values.
-    if (row != -1 && column != -1) {
-        int base = 0;
-        int length = 0;
-        if (isRowRange) {
-            base = row;
-            length = atk_table_get_row_extent_at(ATK_TABLE(axTable), row, column);
-        } else {
-            base = column;
-            length = atk_table_get_column_extent_at(ATK_TABLE(axTable), row, column);
-        }
-        rangeString.set(g_strdup_printf("{%d, %d}", base, length));
-    }
-
-    return JSStringCreateWithUTF8CString(rangeString.get());
-}
-
-JSStringRef AccessibilityUIElement::rowIndexRange()
-{
-    // Range in table for rows.
-    return indexRangeInTable(m_element, true);
-}
-
-JSStringRef AccessibilityUIElement::columnIndexRange()
-{
-    // Range in table for columns.
-    return indexRangeInTable(m_element, false);
-}
-
-int AccessibilityUIElement::lineForIndex(int)
-{
-    // FIXME: implement
-    return 0;
-}
-
-JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::stringForRange(unsigned, unsigned) 
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-} 
-
-JSStringRef AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned location, unsigned length)
-{
-    // FIXME: implement
-    return false;
-}
-
-AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(AccessibilityUIElement* startElement, bool isDirectionNext, JSStringRef searchKey, JSStringRef searchText)
-{
-    // FIXME: implement
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned column, unsigned row)
-{
-    if (!m_element)
-        return 0;
-
-    ASSERT(ATK_IS_TABLE(m_element));
-
-    AtkObject* foundCell = atk_table_ref_at(ATK_TABLE(m_element), row, column);
-    return foundCell ? AccessibilityUIElement(foundCell) : 0;
-}
-
-JSStringRef AccessibilityUIElement::selectedTextRange()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
-{
-    // FIXME: implement
-}
-
-JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute)
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute)
-{
-    // FIXME: implement
-    return 0.0f;
-}
-
-bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
-{
-    return false;
-}
-
-static void alterCurrentValue(PlatformUIElement element, int factor)
-{
-    if (!element)
-        return;
-
-    ASSERT(ATK_IS_VALUE(element));
-
-    GValue currentValue = G_VALUE_INIT;
-    atk_value_get_current_value(ATK_VALUE(element), &currentValue);
-
-    GValue increment = G_VALUE_INIT;
-    atk_value_get_minimum_increment(ATK_VALUE(element), &increment);
-
-    GValue newValue = G_VALUE_INIT;
-    g_value_init(&newValue, G_TYPE_FLOAT);
-
-    g_value_set_float(&newValue, g_value_get_float(&currentValue) + factor * g_value_get_float(&increment));
-    atk_value_set_current_value(ATK_VALUE(element), &newValue);
-
-    g_value_unset(&newValue);
-    g_value_unset(&increment);
-    g_value_unset(&currentValue);
-}
-
-void AccessibilityUIElement::increment()
-{
-    alterCurrentValue(m_element, 1);
-}
-
-void AccessibilityUIElement::decrement()
-{
-    alterCurrentValue(m_element, -1);
-}
-
-void AccessibilityUIElement::press()
-{
-    if (!m_element)
-        return;
-
-    ASSERT(ATK_IS_OBJECT(m_element));
-
-    if (!ATK_IS_ACTION(m_element))
-        return;
-
-    // Only one action per object is supported so far.
-    atk_action_do_action(ATK_ACTION(m_element), 0);
-}
-
-void AccessibilityUIElement::showMenu()
-{
-    // FIXME: implement
-}
-
-AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index)
-{
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
-{
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index)
-{
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index)
-{
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::rowAtIndex(unsigned index)
-{
-    return 0;
-}
-
-AccessibilityUIElement AccessibilityUIElement::disclosedByRow()
-{
-    return 0;
-}
-
-JSStringRef AccessibilityUIElement::accessibilityValue() const
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-JSStringRef AccessibilityUIElement::documentEncoding()
-{
-    AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
-    if (role != ATK_ROLE_DOCUMENT_FRAME)
-        return JSStringCreateWithCharacters(0, 0);
-
-    return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "Encoding"));
-}
-
-JSStringRef AccessibilityUIElement::documentURI()
-{
-    AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
-    if (role != ATK_ROLE_DOCUMENT_FRAME)
-        return JSStringCreateWithCharacters(0, 0);
-
-    return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "URI"));
-}
-
-JSStringRef AccessibilityUIElement::url()
-{
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
-}
-
-bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
-{
-    // FIXME: implement
-    return false;
-}
-
-void AccessibilityUIElement::removeNotificationListener()
-{
-    // FIXME: implement
-}
-
-bool AccessibilityUIElement::isFocusable() const
-{
-    if (!ATK_IS_OBJECT(m_element))
-        return false;
-
-    GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
-    gboolean isFocusable = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSABLE);
-
-    return isFocusable;
-}
-
-bool AccessibilityUIElement::isSelectable() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isMultiSelectable() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isSelectedOptionActive() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isVisible() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isOffScreen() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isCollapsed() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::isIgnored() const
-{
-    // FIXME: implement
-    return false;
-}
-
-bool AccessibilityUIElement::hasPopup() const
-{
-    // FIXME: implement
-    return false;
-}
-
-void AccessibilityUIElement::takeFocus()
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::takeSelection()
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::addSelection()
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::removeSelection()
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::scrollToMakeVisible()
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::scrollToMakeVisibleWithSubFocus(int x, int y, int width, int height)
-{
-    // FIXME: implement
-}
-
-void AccessibilityUIElement::scrollToGlobalPoint(int x, int y)
-{
-    // FIXME: implement
-}
diff --git a/Tools/DumpRenderTree/gtk/DumpRenderTree.cpp b/Tools/DumpRenderTree/gtk/DumpRenderTree.cpp
index bf687b2..cee461c 100644
--- a/Tools/DumpRenderTree/gtk/DumpRenderTree.cpp
+++ b/Tools/DumpRenderTree/gtk/DumpRenderTree.cpp
@@ -50,6 +50,7 @@
 #include <cstring>
 #include <getopt.h>
 #include <gtk/gtk.h>
+#include <locale.h>
 #include <webkit/webkit.h>
 #include <wtf/Assertions.h>
 #include <wtf/gobject/GOwnPtr.h>
@@ -173,6 +174,7 @@
                  "gtk-xft-antialias", 1,
                  "gtk-xft-hinting", 0,
                  "gtk-font-name", "Liberation Sans 12",
+                 "gtk-icon-theme-name", "gnome",
                  NULL);
     gdk_screen_set_resolution(gdk_screen_get_default(), 96.0);
 
@@ -243,8 +245,7 @@
     if (fontsPath.isNull())
         g_error("Could not locate test fonts at %s. Is WEBKIT_TOP_LEVEL set?", fontsPath.data());
 
-    GOwnPtr<GError> error;
-    GOwnPtr<GDir> fontsDirectory(g_dir_open(fontsPath.data(), 0, &error.outPtr()));
+    GOwnPtr<GDir> fontsDirectory(g_dir_open(fontsPath.data(), 0, 0));
     while (const char* directoryEntry = g_dir_read_name(fontsDirectory.get())) {
         if (!g_str_has_suffix(directoryEntry, ".ttf") && !g_str_has_suffix(directoryEntry, ".otf"))
             continue;
@@ -446,7 +447,6 @@
                  "html5-local-storage-database-path", localStoragePath.get(),
                  "enable-xss-auditor", FALSE,
                  "enable-spatial-navigation", FALSE,
-                 "enable-frame-flattening", FALSE,
                  "javascript-can-access-clipboard", TRUE,
                  "javascript-can-open-windows-automatically", TRUE,
                  "enable-offline-web-application-cache", TRUE,
@@ -483,7 +483,6 @@
     g_object_set(G_OBJECT(inspector), "javascript-profiling-enabled", FALSE, NULL);
 
     webkit_web_view_set_zoom_level(webView, 1.0);
-    DumpRenderTreeSupportGtk::setMinimumTimerInterval(webView, DumpRenderTreeSupportGtk::defaultMinimumTimerInterval());
 
     DumpRenderTreeSupportGtk::resetOriginAccessWhiteLists();
 
@@ -502,8 +501,6 @@
 
     DumpRenderTreeSupportGtk::setLinksIncludedInFocusChain(true);
     webkit_icon_database_set_path(webkit_get_icon_database(), 0);
-    DumpRenderTreeSupportGtk::setSelectTrailingWhitespaceEnabled(false);
-    DumpRenderTreeSupportGtk::setSmartInsertDeleteEnabled(webView, true);
     DumpRenderTreeSupportGtk::setDefersLoading(webView, false);
     DumpRenderTreeSupportGtk::setSerializeHTTPLoads(false);
 
@@ -518,8 +515,18 @@
     DumpRenderTreeSupportGtk::setCSSGridLayoutEnabled(webView, false);
     DumpRenderTreeSupportGtk::setCSSRegionsEnabled(webView, true);
     DumpRenderTreeSupportGtk::setCSSCustomFilterEnabled(webView, false);
+    DumpRenderTreeSupportGtk::setExperimentalContentSecurityPolicyFeaturesEnabled(true);
+    DumpRenderTreeSupportGtk::setSeamlessIFramesEnabled(true);
     DumpRenderTreeSupportGtk::setShadowDOMEnabled(true);
     DumpRenderTreeSupportGtk::setStyleScopedEnabled(true);
+
+    if (gTestRunner) {
+        gTestRunner->setAuthenticationPassword("");
+        gTestRunner->setAuthenticationUsername("");
+        gTestRunner->setHandlesAuthenticationChallenges(false);
+    }
+
+    gtk_widget_set_direction(GTK_WIDGET(webView), GTK_TEXT_DIR_NONE);
 }
 
 static bool useLongRunningServerMode(int argc, char *argv[])
@@ -643,6 +650,15 @@
     gtk_main_quit();
 }
 
+static CString temporaryDatabaseDirectory()
+{
+    const char* directoryFromEnvironment = g_getenv("DUMPRENDERTREE_TEMP");
+    if (directoryFromEnvironment)
+        return directoryFromEnvironment;
+    GOwnPtr<char> fallback(g_build_filename(g_get_user_data_dir(), "gtkwebkitdrt", "databases", NULL));
+    return fallback.get();
+}
+
 static void setDefaultsToConsistentStateValuesForTesting()
 {
     resetDefaultsToConsistentValues();
@@ -651,9 +667,7 @@
     webkit_web_settings_add_extra_plugin_directory(webView, TEST_PLUGIN_DIR);
 #endif
 
-    gchar* databaseDirectory = g_build_filename(g_get_user_data_dir(), "gtkwebkitdrt", "databases", NULL);
-    webkit_set_web_database_directory_path(databaseDirectory);
-    g_free(databaseDirectory);
+    webkit_set_web_database_directory_path(temporaryDatabaseDirectory().data());
 
 #if defined(GTK_API_VERSION_2)
     gtk_rc_parse_string("style \"nix_scrollbar_spacing\"                    "
@@ -1231,8 +1245,7 @@
     CString mainDocumentURIString(descriptionSuitableForTestResult(mainDocumentURI));
     CString path(convertNetworkRequestToURLPath(request));
     GOwnPtr<char> description(g_strdup_printf("<NSURLRequest URL %s, main document URL %s, http method %s>",
-                                              path.data(), mainDocumentURIString.data(),
-                                              soupMessage ? soupMessage->method : "(none)"));
+        path.data(), mainDocumentURIString.data(), soupMessage->method));
     return CString(description.get());
 }
 
@@ -1337,12 +1350,56 @@
     return TRUE;
 }
 
+static void frameLoadEventCallback(WebKitWebFrame* frame, DumpRenderTreeSupportGtk::FrameLoadEvent event, const char* url)
+{
+    if (done || !gTestRunner->dumpFrameLoadCallbacks())
+        return;
+
+    GOwnPtr<char> frameName(getFrameNameSuitableForTestResult(webkit_web_frame_get_web_view(frame), frame));
+    switch (event) {
+    case DumpRenderTreeSupportGtk::WillPerformClientRedirectToURL:
+        ASSERT(url);
+        printf("%s - willPerformClientRedirectToURL: %s \n", frameName.get(), url);
+        break;
+    case DumpRenderTreeSupportGtk::DidCancelClientRedirect:
+        printf("%s - didCancelClientRedirectForFrame\n", frameName.get());
+        break;
+    case DumpRenderTreeSupportGtk::DidReceiveServerRedirectForProvisionalLoad:
+        printf("%s - didReceiveServerRedirectForProvisionalLoadForFrame\n", frameName.get());
+        break;
+    case DumpRenderTreeSupportGtk::DidDisplayInsecureContent:
+        printf ("didDisplayInsecureContent\n");
+        break;
+    case DumpRenderTreeSupportGtk::DidDetectXSS:
+        printf ("didDetectXSS\n");
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+    }
+}
+
+static bool authenticationCallback(CString& username, CString& password)
+{
+    if (!gTestRunner->handlesAuthenticationChallenges()) {
+        printf("<unknown> - didReceiveAuthenticationChallenge - Simulating cancelled authentication sheet\n");
+        return false;
+    }
+
+    username = gTestRunner->authenticationUsername().c_str();
+    password = gTestRunner->authenticationPassword().c_str();
+    printf("<unknown> - didReceiveAuthenticationChallenge - Responding with %s:%s\n", username.data(), password.data());
+    return true;
+}
+
 static WebKitWebView* createWebView()
 {
     // It is important to declare DRT is running early so when creating
     // web view mock clients are used instead of proper ones.
     DumpRenderTreeSupportGtk::setDumpRenderTreeModeEnabled(true);
 
+    DumpRenderTreeSupportGtk::setFrameLoadEventCallback(frameLoadEventCallback);
+    DumpRenderTreeSupportGtk::setAuthenticationCallback(authenticationCallback);
+
     WebKitWebView* view = WEBKIT_WEB_VIEW(self_scrolling_webkit_web_view_new());
 
     g_object_connect(G_OBJECT(view),
diff --git a/Tools/DumpRenderTree/gtk/EditingCallbacks.cpp b/Tools/DumpRenderTree/gtk/EditingCallbacks.cpp
index 4c968d9..ef5a969 100644
--- a/Tools/DumpRenderTree/gtk/EditingCallbacks.cpp
+++ b/Tools/DumpRenderTree/gtk/EditingCallbacks.cpp
@@ -59,15 +59,12 @@
     if (!range)
         return "(null)";
 
-    GOwnPtr<GError> error1;
-    GOwnPtr<GError> error2;
-    GOwnPtr<GError> error3;
-    GOwnPtr<GError> error4;
     GOwnPtr<gchar> dump(g_strdup_printf("range from %li of %s to %li of %s",
-        webkit_dom_range_get_start_offset(range, &error1.outPtr()),
-        dumpNodePath(webkit_dom_range_get_start_container(range, &error2.outPtr())).data(),
-        webkit_dom_range_get_end_offset(range, &error3.outPtr()),
-        dumpNodePath(webkit_dom_range_get_end_container(range, &error4.outPtr())).data()));
+        webkit_dom_range_get_start_offset(range, 0),
+        dumpNodePath(webkit_dom_range_get_start_container(range, 0)).data(),
+        webkit_dom_range_get_end_offset(range, 0),
+        dumpNodePath(webkit_dom_range_get_end_container(range, 0)).data()));
+
     return dump.get();
 }
 
@@ -138,8 +135,7 @@
 
 gboolean shouldShowDeleteInterfaceForElement(WebKitWebView* webView, WebKitDOMHTMLElement* element)
 {
-    GOwnPtr<gchar> elementClassName(webkit_dom_element_get_class_name(WEBKIT_DOM_ELEMENT(element)));
-    return g_str_equal(elementClassName.get(), "needsDeletionUI");
+    return FALSE;
 }
 
 gboolean shouldChangeSelectedRange(WebKitWebView* webView, WebKitDOMRange* fromRange, WebKitDOMRange* toRange, WebKitSelectionAffinity affinity, gboolean stillSelecting)
diff --git a/Tools/DumpRenderTree/gtk/EventSender.cpp b/Tools/DumpRenderTree/gtk/EventSender.cpp
index 8f281b2..dca2c0b 100644
--- a/Tools/DumpRenderTree/gtk/EventSender.cpp
+++ b/Tools/DumpRenderTree/gtk/EventSender.cpp
@@ -489,8 +489,10 @@
     int vertical = JSValueToNumber(context, arguments[1], exception);
     g_return_val_if_fail((!exception || !*exception), JSValueMakeUndefined(context));
 
-    g_return_val_if_fail(argumentCount < 3 || !JSValueToBoolean(context, arguments[2]), JSValueMakeUndefined(context));
-    
+    // We do not yet support continuous scrolling by page.
+    if (argumentCount >= 3 && JSValueToBoolean(context, arguments[2]))
+        return JSValueMakeUndefined(context);
+
     GdkEvent* event = gdk_event_new(GDK_SCROLL);
     event->scroll.x = lastMousePositionX;
     event->scroll.y = lastMousePositionY;
diff --git a/Tools/DumpRenderTree/gtk/GNUmakefile.ImageDiff.am b/Tools/DumpRenderTree/gtk/GNUmakefile.ImageDiff.am
deleted file mode 100644
index e7c3aef..0000000
--- a/Tools/DumpRenderTree/gtk/GNUmakefile.ImageDiff.am
+++ /dev/null
@@ -1,28 +0,0 @@
-noinst_PROGRAMS += \
-	Programs/ImageDiff
-
-Programs_ImageDiff_CPPFLAGS = $(global_cppflags)
-
-Programs_ImageDiff_SOURCES = \
-   Tools/DumpRenderTree/gtk/ImageDiff.cpp
-
-Programs_ImageDiff_CXXFLAGS = \
-   $(global_cxxflags) \
-   $(global_cppflags) \
-   $(Programs_ImageDiff_CFLAGS)
-
-Programs_ImageDiff_CFLAGS = \
-   -fno-strict-aliasing \
-   $(global_cflags) \
-   $(GLOBALDEPS_CFLAGS) \
-   $(GTK_CFLAGS)
-
-Programs_ImageDiff_LDADD = \
-   $(GTK_LIBS)
-
-Programs_ImageDiff_LDFLAGS = \
-   -no-fast-install \
-   -no-install
-
-CLEANFILES += \
-	Programs/ImageDiff
diff --git a/Tools/DumpRenderTree/gtk/TestRunnerGtk.cpp b/Tools/DumpRenderTree/gtk/TestRunnerGtk.cpp
index 32d3dd5..bff0115 100644
--- a/Tools/DumpRenderTree/gtk/TestRunnerGtk.cpp
+++ b/Tools/DumpRenderTree/gtk/TestRunnerGtk.cpp
@@ -48,6 +48,7 @@
 #include <libsoup/soup.h>
 #include <webkit/webkit.h>
 #include <wtf/gobject/GOwnPtr.h>
+#include <wtf/text/WTFString.h>
 
 extern "C" {
 void webkit_web_inspector_execute_script(WebKitWebInspector* inspector, long callId, const gchar* script);
@@ -107,11 +108,6 @@
     // FIXME: implement
 }
 
-JSValueRef TestRunner::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef value)
-{
-    return DumpRenderTreeSupportGtk::computedStyleIncludingVisitedInfo(context, value);
-}
-
 size_t TestRunner::webHistoryItemCount()
 {
     WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame);
@@ -126,11 +122,6 @@
             webkit_web_back_forward_list_get_forward_length(list);
 }
 
-unsigned TestRunner::workerThreadCount() const
-{
-    return DumpRenderTreeSupportGtk::workerThreadCount();
-}
-
 JSRetainPtr<JSStringRef> TestRunner::platformName() const
 {
     JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("gtk"));
@@ -157,26 +148,43 @@
     return JSStringCreateWithUTF8CString(testURI.get());
 }
 
+static CString soupURIToStringPreservingPassword(SoupURI* soupURI)
+{
+    if (!soupURI->password) {
+        GOwnPtr<char> uriString(soup_uri_to_string(soupURI, FALSE));
+        return uriString.get();
+    }
+
+    // soup_uri_to_string does not insert the password into the string, so we need to create the
+    // URI string and then reinsert any credentials that were present in the SoupURI. All tests that
+    // use URL-embedded credentials use HTTP, so it's safe here.
+    GOwnPtr<char> password(soupURI->password);
+    GOwnPtr<char> user(soupURI->user);
+    soupURI->password = 0;
+    soupURI->user = 0;
+
+    GOwnPtr<char> uriString(soup_uri_to_string(soupURI, FALSE));
+    String absoluteURIWithoutCredentialString = String::fromUTF8(uriString.get());
+    String protocolAndCredential = String::format("http://%s:%s@", user ? user.get() : "", password.get());
+    return absoluteURIWithoutCredentialString.replace("http://", protocolAndCredential).utf8();
+}
+
 void TestRunner::queueLoad(JSStringRef url, JSStringRef target)
 {
-    gchar* relativeURL = JSStringCopyUTF8CString(url);
+    GOwnPtr<gchar> relativeURL(JSStringCopyUTF8CString(url));
     SoupURI* baseURI = soup_uri_new(webkit_web_frame_get_uri(mainFrame));
-
-    SoupURI* absoluteURI = soup_uri_new_with_base(baseURI, relativeURL);
+    SoupURI* absoluteURI = soup_uri_new_with_base(baseURI, relativeURL.get());
     soup_uri_free(baseURI);
-    g_free(relativeURL);
 
-    gchar* absoluteCString;
-    if (absoluteURI) {
-        absoluteCString = soup_uri_to_string(absoluteURI, FALSE);
-        soup_uri_free(absoluteURI);
-    } else
-        absoluteCString = JSStringCopyUTF8CString(url);
+    if (!absoluteURI) {
+        WorkQueue::shared()->queue(new LoadItem(url, target));
+        return;
+    }
 
-    JSRetainPtr<JSStringRef> absoluteURL(Adopt, JSStringCreateWithUTF8CString(absoluteCString));
-    g_free(absoluteCString);
-
+    CString absoluteURIString = soupURIToStringPreservingPassword(absoluteURI);
+    JSRetainPtr<JSStringRef> absoluteURL(Adopt, JSStringCreateWithUTF8CString(absoluteURIString.data()));
     WorkQueue::shared()->queue(new LoadItem(absoluteURL.get(), target));
+    soup_uri_free(absoluteURI);
 }
 
 void TestRunner::setAcceptsEditing(bool acceptsEditing)
@@ -315,11 +323,6 @@
     // FIXME: implement
 }
 
-void TestRunner::setSmartInsertDeleteEnabled(bool flag)
-{
-    DumpRenderTreeSupportGtk::setSmartInsertDeleteEnabled(webkit_web_frame_get_web_view(mainFrame), flag);
-}
-
 static gboolean waitToDumpWatchdogFired(void*)
 {
     setWaitToDumpWatchdog(0);
@@ -369,15 +372,6 @@
     g_object_set(G_OBJECT(settings), "enable-xss-auditor", flag, NULL);
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool flag)
-{
-    WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
-    ASSERT(view);
-
-    WebKitWebSettings* settings = webkit_web_view_get_settings(view);
-    g_object_set(G_OBJECT(settings), "enable-frame-flattening", flag, NULL);
-}
-
 void TestRunner::setSpatialNavigationEnabled(bool flag)
 {
     WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
@@ -410,20 +404,6 @@
     // FIXME: implement
 }
 
-void TestRunner::setAutofilled(JSContextRef context, JSValueRef nodeObject, bool isAutofilled)
-{
-    DumpRenderTreeSupportGtk::setAutofilled(context, nodeObject, isAutofilled);
-}
-
-void TestRunner::disableImageLoading()
-{
-    WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
-    ASSERT(view);
-
-    WebKitWebSettings* settings = webkit_web_view_get_settings(view);
-    g_object_set(G_OBJECT(settings), "auto-load-images", FALSE, NULL);
-}
-
 void TestRunner::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
 {
     // FIXME: Implement for DeviceOrientation layout tests.
@@ -500,11 +480,6 @@
         webkit_icon_database_set_path(database, 0);
 }
 
-void TestRunner::setSelectTrailingWhitespaceEnabled(bool flag)
-{
-    DumpRenderTreeSupportGtk::setSelectTrailingWhitespaceEnabled(flag);
-}
-
 void TestRunner::setPopupBlockingEnabled(bool flag)
 {
     WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
@@ -524,11 +499,6 @@
     g_object_set(G_OBJECT(settings), "enable-plugins", flag, NULL);
 }
 
-bool TestRunner::elementDoesAutoCompleteForElementWithId(JSStringRef id) 
-{
-    return DumpRenderTreeSupportGtk::elementDoesAutoCompleteForElementWithId(mainFrame, id);
-}
-
 void TestRunner::execCommand(JSStringRef name, JSStringRef value)
 {
     WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
@@ -711,31 +681,6 @@
     webkit_application_cache_set_maximum_size(size);
 }
 
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
-{    
-    gchar* name = JSStringCopyUTF8CString(animationName);
-    gchar* element = JSStringCopyUTF8CString(elementId);
-    bool returnValue = DumpRenderTreeSupportGtk::pauseAnimation(mainFrame, name, time, element);
-    g_free(name);
-    g_free(element);
-    return returnValue;
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
-{    
-    gchar* name = JSStringCopyUTF8CString(propertyName);
-    gchar* element = JSStringCopyUTF8CString(elementId);
-    bool returnValue = DumpRenderTreeSupportGtk::pauseTransition(mainFrame, name, time, element);
-    g_free(name);
-    g_free(element);
-    return returnValue;
-}
-
-unsigned TestRunner::numberOfActiveAnimations() const
-{
-    return DumpRenderTreeSupportGtk::numberOfActiveAnimations(mainFrame);
-}
-
 static gboolean booleanFromValue(gchar* value)
 {
     return !g_ascii_strcasecmp(value, "true") || !g_ascii_strcasecmp(value, "1");
@@ -814,7 +759,8 @@
 
 void TestRunner::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
 {
-    printf("TestRunner::addUserScript not implemented.\n");
+    GOwnPtr<gchar> sourceCode(JSStringCopyUTF8CString(source));
+    DumpRenderTreeSupportGtk::addUserScript(mainFrame, sourceCode.get(), runAtStart, allFrames);
 }
 
 void TestRunner::addUserStyleSheet(JSStringRef source, bool allFrames)
@@ -833,11 +779,6 @@
     g_object_set(webSettings, "enable-developer-extras", enabled, NULL);
 }
 
-void TestRunner::setAsynchronousSpellCheckingEnabled(bool)
-{
-    // FIXME: Implement this.
-}
-
 void TestRunner::showWebInspector()
 {
     WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame);
@@ -898,16 +839,6 @@
 {
 }
 
-JSRetainPtr<JSStringRef> TestRunner::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
-{
-    CString markerTextGChar = DumpRenderTreeSupportGtk::markerTextForListItem(mainFrame, context, nodeObject);
-    if (markerTextGChar.isNull())
-        return 0;
-
-    JSRetainPtr<JSStringRef> markerText(Adopt, JSStringCreateWithUTF8CString(markerTextGChar.data()));
-    return markerText;
-}
-
 void TestRunner::authenticateSession(JSStringRef, JSStringRef, JSStringRef)
 {
 }
@@ -921,15 +852,21 @@
     DumpRenderTreeSupportGtk::setSerializeHTTPLoads(serialize);
 }
 
-void TestRunner::setMinimumTimerInterval(double minimumTimerInterval)
-{
-    WebKitWebView* webView = webkit_web_frame_get_web_view(mainFrame);
-    DumpRenderTreeSupportGtk::setMinimumTimerInterval(webView, minimumTimerInterval);
-}
-
 void TestRunner::setTextDirection(JSStringRef direction)
 {
-    // FIXME: Implement.
+    GOwnPtr<gchar> writingDirection(JSStringCopyUTF8CString(direction));
+
+    WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame);
+    ASSERT(view);
+
+    if (g_str_equal(writingDirection.get(), "auto"))
+        gtk_widget_set_direction(GTK_WIDGET(view), GTK_TEXT_DIR_NONE);
+    else if (g_str_equal(writingDirection.get(), "ltr"))
+        gtk_widget_set_direction(GTK_WIDGET(view), GTK_TEXT_DIR_LTR);
+    else if (g_str_equal(writingDirection.get(), "rtl"))
+        gtk_widget_set_direction(GTK_WIDGET(view), GTK_TEXT_DIR_RTL);
+    else
+        fprintf(stderr, "TestRunner::setTextDirection called with unknown direction: '%s'.\n", writingDirection.get());
 }
 
 void TestRunner::addChromeInputField()
@@ -983,17 +920,11 @@
     // FIXME: Implement this.
 }
 
-void TestRunner::sendWebIntentResponse(JSStringRef)
-{
-    // FIXME: Implement this.
-}
-
-void TestRunner::deliverWebIntent(JSStringRef, JSStringRef, JSStringRef)
-{
-    // FIXME: Implement this.
-}
-
 void TestRunner::setStorageDatabaseIdleInterval(double)
 {
     // FIXME: Implement this.
 }
+
+void TestRunner::closeIdleLocalStorageDatabases()
+{
+}
diff --git a/Tools/DumpRenderTree/ios/AccessibilityControllerIOS.mm b/Tools/DumpRenderTree/ios/AccessibilityControllerIOS.mm
new file mode 100644
index 0000000..2321b5d
--- /dev/null
+++ b/Tools/DumpRenderTree/ios/AccessibilityControllerIOS.mm
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#import "config.h"
+#import "DumpRenderTree.h"
+#import "AccessibilityController.h"
+
+#if PLATFORM(IOS)
+
+#import "AccessibilityCommonMac.h"
+#import "AccessibilityUIElement.h"
+#import <Foundation/Foundation.h>
+#import <WebKit/WebFramePrivate.h>
+#import <WebKit/WebHTMLViewPrivate.h>
+
+@interface WebHTMLView (Private)
+- (id)accessibilityFocusedUIElement;
+@end
+
+AccessibilityController::AccessibilityController()
+{
+}
+
+AccessibilityController::~AccessibilityController()
+{
+}
+
+AccessibilityUIElement AccessibilityController::elementAtPoint(int x, int y)
+{
+    // FIXME: implement
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityController::focusedElement()
+{
+    id webDocumentView = [[mainFrame frameView] documentView];
+    if ([webDocumentView isKindOfClass:[WebHTMLView class]])
+        return AccessibilityUIElement([(WebHTMLView *)webDocumentView accessibilityFocusedUIElement]);
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityController::rootElement()
+{
+    // FIXME: we could do some caching here.
+    id webDocumentView = [[mainFrame frameView] documentView];
+    if ([webDocumentView isKindOfClass:[WebHTMLView class]])
+        return AccessibilityUIElement([(WebHTMLView *)webDocumentView accessibilityRootElement]);
+    return 0;
+}
+
+static id findAccessibleObjectById(id obj, NSString *idAttribute)
+{
+    id objIdAttribute = [obj accessibilityIdentifier];
+    if ([objIdAttribute isKindOfClass:[NSString class]] && [objIdAttribute isEqualToString:idAttribute])
+        return obj;
+    
+    NSUInteger childrenCount = [obj accessibilityElementCount];
+    for (NSUInteger i = 0; i < childrenCount; ++i) {
+        id result = findAccessibleObjectById([obj accessibilityElementAtIndex:i], idAttribute);
+        if (result)
+            return result;
+    }
+    
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityController::accessibleElementById(JSStringRef idAttributeRef)
+{
+    id webDocumentView = [[mainFrame frameView] documentView];
+    if (![webDocumentView isKindOfClass:[WebHTMLView class]])
+        return 0;
+    
+    id root = [(WebHTMLView *)webDocumentView accessibilityRootElement];
+    NSString *idAttribute = [NSString stringWithJSStringRef:idAttributeRef];
+    id result = findAccessibleObjectById(root, idAttribute);
+    if (result)
+        return AccessibilityUIElement(result);
+    
+    return 0;
+}
+
+void AccessibilityController::setLogFocusEvents(bool)
+{
+}
+
+void AccessibilityController::setLogScrollingStartEvents(bool)
+{
+}
+
+void AccessibilityController::setLogValueChangeEvents(bool)
+{
+}
+
+void AccessibilityController::setLogAccessibilityEvents(bool)
+{
+}
+
+bool AccessibilityController::addNotificationListener(JSObjectRef functionCallback)
+{
+    return false;
+}
+
+void AccessibilityController::removeNotificationListener()
+{
+}
+
+#endif // PLATFORM(IOS)
diff --git a/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm b/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm
new file mode 100644
index 0000000..0f0fa49
--- /dev/null
+++ b/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm
@@ -0,0 +1,768 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#import "config.h"
+#import "DumpRenderTree.h"
+#import "AccessibilityUIElement.h"
+
+#import "AccessibilityCommonMac.h"
+#import <Foundation/Foundation.h>
+#import <JavaScriptCore/JSRetainPtr.h>
+#import <JavaScriptCore/JSStringRef.h>
+#import <JavaScriptCore/JSStringRefCF.h>
+#import <WebCore/TextGranularity.h>
+#import <WebKit/WebFrame.h>
+#import <WebKit/WebHTMLView.h>
+#import <WebKit/WebTypesInternal.h>
+#import <wtf/RetainPtr.h>
+#import <wtf/Vector.h>
+
+#if PLATFORM(IOS)
+
+#import <UIKit/UIKit.h>
+
+typedef void (*AXPostedNotificationCallback)(id element, NSString* notification, void* context);
+
+AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
+    : m_element(element)
+{
+    [m_element retain];
+}
+
+AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
+    : m_element(other.m_element)
+{
+    [m_element retain];
+}
+
+AccessibilityUIElement::~AccessibilityUIElement()
+{
+    [m_element release];
+}
+
+@interface NSObject (UIAccessibilityHidden)
+- (id)accessibilityHitTest:(CGPoint)point;
+- (id)accessibilityLinkedElement;
+- (NSRange)accessibilityColumnRange;
+- (NSRange)accessibilityRowRange;
+- (id)accessibilityElementForRow:(NSInteger)row andColumn:(NSInteger)column;
+- (NSURL *)accessibilityURL;
+- (NSArray *)accessibilityHeaderElements;
+- (NSString *)accessibilityPlaceholderValue;
+- (NSString *)stringForRange:(NSRange)range;
+- (NSArray *)elementsForRange:(NSRange)range;
+- (NSString *)selectionRangeString;
+- (void)accessibilityModifySelection:(WebCore::TextGranularity)granularity increase:(BOOL)increase;
+- (void)accessibilitySetPostedNotificationCallback:(AXPostedNotificationCallback)function withContext:(void*)context;
+@end
+
+static JSStringRef concatenateAttributeAndValue(NSString* attribute, NSString* value)
+{
+    Vector<UniChar> buffer([attribute length]);
+    [attribute getCharacters:buffer.data()];
+    buffer.append(':');
+    buffer.append(' ');
+    
+    Vector<UniChar> valueBuffer([value length]);
+    [value getCharacters:valueBuffer.data()];
+    buffer.append(valueBuffer);
+    
+    return JSStringCreateWithCharacters(buffer.data(), buffer.size());
+}
+
+#pragma mark iPhone Attributes
+
+JSStringRef AccessibilityUIElement::iphoneLabel()
+{
+    return concatenateAttributeAndValue(@"AXLabel", [m_element accessibilityLabel]);
+}
+
+JSStringRef AccessibilityUIElement::iphoneHint()
+{
+    return concatenateAttributeAndValue(@"AXHint", [m_element accessibilityHint]);
+}
+
+JSStringRef AccessibilityUIElement::iphoneValue()
+{
+    return concatenateAttributeAndValue(@"AXValue", [m_element accessibilityValue]);
+}
+
+JSStringRef AccessibilityUIElement::iphoneIdentifier()
+{
+    return concatenateAttributeAndValue(@"AXIdentifier", [m_element accessibilityIdentifier]);
+}
+
+JSStringRef AccessibilityUIElement::iphoneTraits()
+{
+    return concatenateAttributeAndValue(@"AXTraits", [NSString stringWithFormat:@"%qu", [m_element accessibilityTraits]]);
+}
+
+bool AccessibilityUIElement::iphoneIsElement()
+{
+    return [m_element isAccessibilityElement];
+}
+
+int AccessibilityUIElement::iphoneElementTextPosition()
+{
+    NSRange range = [[m_element valueForKey:@"elementTextRange"] rangeValue];
+    return range.location;
+}
+
+int AccessibilityUIElement::iphoneElementTextLength()
+{
+    NSRange range = [[m_element valueForKey:@"elementTextRange"] rangeValue];
+    return range.length;    
+}
+
+JSStringRef AccessibilityUIElement::url()
+{
+    NSURL *url = [m_element accessibilityURL];
+    return [[url absoluteString] createJSStringRef];    
+}
+
+double AccessibilityUIElement::x()
+{
+    CGRect frame = [m_element accessibilityFrame];
+    return frame.origin.x;
+}
+
+double AccessibilityUIElement::y()
+{
+    CGRect frame = [m_element accessibilityFrame];
+    return frame.origin.y;
+}
+
+double AccessibilityUIElement::width()
+{
+    CGRect frame = [m_element accessibilityFrame];
+    return frame.size.width;
+}
+
+double AccessibilityUIElement::height()
+{
+    CGRect frame = [m_element accessibilityFrame];
+    return frame.size.height;
+}
+
+double AccessibilityUIElement::clickPointX()
+{
+    CGPoint centerPoint = [m_element accessibilityActivationPoint];
+    return centerPoint.x;
+}
+
+double AccessibilityUIElement::clickPointY()
+{
+    CGPoint centerPoint = [m_element accessibilityActivationPoint];
+    return centerPoint.y;
+}
+
+void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& elementVector)
+{
+    NSInteger childCount = [m_element accessibilityElementCount];
+    for (NSInteger k = 0; k < childCount; ++k)
+        elementVector.append(AccessibilityUIElement([m_element accessibilityElementAtIndex:k]));
+}
+
+void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned location, unsigned length)
+{
+    NSUInteger childCount = [m_element accessibilityElementCount];
+    for (NSUInteger k = location; k < childCount && k < (location+length); ++k)
+        elementVector.append(AccessibilityUIElement([m_element accessibilityElementAtIndex:k]));    
+}
+
+int AccessibilityUIElement::childrenCount()
+{
+    Vector<AccessibilityUIElement> children;
+    getChildren(children);
+    
+    return children.size();
+}
+
+AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
+{
+    id element = [m_element accessibilityHitTest:NSMakePoint(x, y)];
+    if (!element)
+        return nil;
+    
+    return AccessibilityUIElement(element); 
+}
+
+unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
+{
+    Vector<AccessibilityUIElement> children;
+    getChildrenWithRange(children, index, 1);
+    
+    if (children.size() == 1)
+        return children[0];
+    return nil;
+}
+
+AccessibilityUIElement AccessibilityUIElement::headerElementAtIndex(unsigned index)
+{
+    NSArray *headers = [m_element accessibilityHeaderElements];
+    if (index < [headers count])
+        return [headers objectAtIndex:index];
+    
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::linkedElement()
+{
+    id linkedElement = [m_element accessibilityLinkedElement];
+    if (linkedElement)
+        return AccessibilityUIElement(linkedElement);
+    
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
+{
+    // FIXME: implement
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::rowAtIndex(unsigned index)
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::titleUIElement()
+{
+    return 0;
+}
+
+AccessibilityUIElement AccessibilityUIElement::parentElement()
+{
+    id accessibilityObject = [m_element accessibilityContainer];
+    if (accessibilityObject)
+        return AccessibilityUIElement(accessibilityObject);
+    
+    return nil;
+}
+
+AccessibilityUIElement AccessibilityUIElement::disclosedByRow()
+{
+    return 0;
+}
+
+void AccessibilityUIElement::increaseTextSelection()
+{
+    [m_element accessibilityModifySelection:WebCore::CharacterGranularity increase:YES];
+}
+
+void AccessibilityUIElement::decreaseTextSelection()
+{
+    [m_element accessibilityModifySelection:WebCore::CharacterGranularity increase:NO];    
+}
+
+JSStringRef AccessibilityUIElement::stringForSelection() 
+{ 
+    NSString *stringForRange = [m_element selectionRangeString];
+    if (!stringForRange)
+        return 0;
+    
+    return [stringForRange createJSStringRef];
+}
+
+JSStringRef AccessibilityUIElement::stringForRange(unsigned location, unsigned length) 
+{ 
+    NSString *stringForRange = [m_element stringForRange:NSMakeRange(location, length)];
+    if (!stringForRange)
+        return 0;
+    
+    return [stringForRange createJSStringRef];
+}
+
+JSStringRef AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned, unsigned)
+{
+    return false;
+}
+
+
+void AccessibilityUIElement::elementsForRange(unsigned location, unsigned length, Vector<AccessibilityUIElement>& elements)
+{ 
+    NSArray *elementsForRange = [m_element elementsForRange:NSMakeRange(location, length)];
+    for (id object in elementsForRange) {
+        AccessibilityUIElement element = AccessibilityUIElement(object);
+        elements.append(element);
+    }
+}
+
+#pragma mark Unused
+
+void AccessibilityUIElement::getLinkedUIElements(Vector<AccessibilityUIElement>& elementVector)
+{
+}
+
+void AccessibilityUIElement::getDocumentLinks(Vector<AccessibilityUIElement>& elementVector)
+{
+}
+
+JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfDocumentLinks()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfChildren()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::allAttributes()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute)
+{
+    if (JSStringIsEqualToUTF8CString(attribute, "AXPlaceholderValue"))
+        return [[m_element accessibilityPlaceholderValue] createJSStringRef];
+    
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+bool AccessibilityUIElement::isPressActionSupported()
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isIncrementActionSupported()
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isDecrementActionSupported()
+{
+    return false;
+}
+
+bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
+{
+    return false;
+}
+
+JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::role()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::subrole()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::roleDescription()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::title()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::description()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}    
+
+JSStringRef AccessibilityUIElement::orientation() const
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::stringValue()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::language()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::helpText() const
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+double AccessibilityUIElement::intValue() const
+{
+    return 0.0f;
+}
+
+double AccessibilityUIElement::minValue()
+{
+    return 0.0f;
+}
+
+double AccessibilityUIElement::maxValue()
+{
+    return 0.0;
+}
+
+JSStringRef AccessibilityUIElement::valueDescription()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+int AccessibilityUIElement::insertionPointLineNumber()
+{
+    return -1;
+}
+
+bool AccessibilityUIElement::isEnabled()
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isRequired() const
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isFocused() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isSelected() const
+{
+    UIAccessibilityTraits traits = [m_element accessibilityTraits];
+    return (traits & UIAccessibilityTraitSelected);
+}
+
+bool AccessibilityUIElement::isExpanded() const
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isChecked() const
+{
+    return false;
+}
+
+int AccessibilityUIElement::hierarchicalLevel() const
+{
+    return 0;
+}
+
+bool AccessibilityUIElement::ariaIsGrabbed() const
+{
+    return false;
+}
+
+JSStringRef AccessibilityUIElement::ariaDropEffects() const
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+int AccessibilityUIElement::lineForIndex(int index)
+{
+    return -1;
+}
+
+JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfColumns()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfRows()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::attributesOfHeader()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+int AccessibilityUIElement::rowCount()
+{
+    return -1;
+}
+
+int AccessibilityUIElement::columnCount()
+{
+    return -1;
+}
+
+int AccessibilityUIElement::indexInTable()
+{
+    return -1;
+}
+
+JSStringRef AccessibilityUIElement::rowIndexRange()
+{
+    NSRange range = [m_element accessibilityRowRange];
+    NSMutableString* rangeDescription = [NSMutableString stringWithFormat:@"{%lu, %lu}", (unsigned long)range.location, (unsigned long)range.length];
+    return [rangeDescription createJSStringRef];
+}
+
+JSStringRef AccessibilityUIElement::columnIndexRange()
+{
+    NSRange range = [m_element accessibilityColumnRange];
+    NSMutableString* rangeDescription = [NSMutableString stringWithFormat:@"{%lu, %lu}", (unsigned long)range.location, (unsigned long)range.length];
+    return [rangeDescription createJSStringRef];    
+}
+
+AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned col, unsigned row)
+{
+    return AccessibilityUIElement([m_element accessibilityElementForRow:row andColumn:col]);
+}
+
+JSStringRef AccessibilityUIElement::selectedTextRange()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+void AccessibilityUIElement::assistiveTechnologySimulatedFocus()
+{
+    [m_element accessibilityElementDidBecomeFocused];
+}
+
+void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
+{
+}
+
+void AccessibilityUIElement::increment()
+{
+    [m_element accessibilityIncrement];
+}
+
+void AccessibilityUIElement::decrement()
+{
+    [m_element accessibilityDecrement];
+}
+
+void AccessibilityUIElement::showMenu()
+{
+}
+
+void AccessibilityUIElement::press()
+{
+}
+
+JSStringRef AccessibilityUIElement::accessibilityValue() const
+{
+    // FIXME: implement
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::documentEncoding()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+JSStringRef AccessibilityUIElement::documentURI()
+{
+    return JSStringCreateWithCharacters(0, 0);
+}
+
+static void _accessibilityNotificationCallback(id element, NSString* notification, void* context)
+{
+    if (!context)
+        return;
+    
+    JSObjectRef functionCallback = static_cast<JSObjectRef>(context);
+    
+    JSRetainPtr<JSStringRef> jsNotification(Adopt, [notification createJSStringRef]);
+    JSValueRef argument = JSValueMakeString([mainFrame globalContext], jsNotification.get());
+    JSObjectCallAsFunction([mainFrame globalContext], functionCallback, NULL, 1, &argument, NULL);
+}
+
+bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
+{
+    if (!functionCallback)
+        return false;
+    
+    m_notificationFunctionCallback = functionCallback;
+    [platformUIElement() accessibilitySetPostedNotificationCallback:_accessibilityNotificationCallback withContext:reinterpret_cast<void*>(m_notificationFunctionCallback)];
+    return true;    
+}
+
+void AccessibilityUIElement::removeNotificationListener()
+{
+    m_notificationFunctionCallback = 0;
+    [platformUIElement() accessibilitySetPostedNotificationCallback:nil withContext:nil];
+}
+
+bool AccessibilityUIElement::isFocusable() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isSelectable() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isMultiSelectable() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isSelectedOptionActive() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isVisible() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isOffScreen() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isCollapsed() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isIgnored() const
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::hasPopup() const
+{
+    // FIXME: implement
+    return false;
+}
+
+void AccessibilityUIElement::takeFocus()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::takeSelection()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::addSelection()
+{
+    // FIXME: implement
+}
+
+void AccessibilityUIElement::removeSelection()
+{
+    // FIXME: implement
+}
+
+AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(AccessibilityUIElement* startElement, bool isDirectionNext, JSStringRef searchKey, JSStringRef searchText)
+{
+    // FIXME: implement
+    return 0;
+}
+
+double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute)
+{
+    // FIXME: implement
+    return 0;
+}
+#endif // PLATFORM(IOS)
diff --git a/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm b/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm
index cd1c92d..63a6bd9 100644
--- a/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm
+++ b/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm
@@ -671,11 +671,31 @@
     return -1;
 }
 
-bool AccessibilityUIElement::isActionSupported(JSStringRef action)
+bool AccessibilityUIElement::isPressActionSupported()
 {
     BEGIN_AX_OBJC_EXCEPTIONS
     NSArray* actions = [m_element accessibilityActionNames];
-    return [actions containsObject:[NSString stringWithJSStringRef:action]];
+    return [actions containsObject:NSAccessibilityPressAction];
+    END_AX_OBJC_EXCEPTIONS
+    
+    return false;
+}
+
+bool AccessibilityUIElement::isIncrementActionSupported()
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    NSArray* actions = [m_element accessibilityActionNames];
+    return [actions containsObject:NSAccessibilityIncrementAction];
+    END_AX_OBJC_EXCEPTIONS
+    
+    return false;
+}
+
+bool AccessibilityUIElement::isDecrementActionSupported()
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    NSArray* actions = [m_element accessibilityActionNames];
+    return [actions containsObject:NSAccessibilityDecrementAction];
     END_AX_OBJC_EXCEPTIONS
     
     return false;
@@ -1417,9 +1437,21 @@
 
 #endif // SUPPORTS_AX_TEXTMARKERS
 
+JSStringRef AccessibilityUIElement::supportedActions()
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    NSArray *names = [m_element accessibilityActionNames];
+    return [[names componentsJoinedByString:@","] createJSStringRef];
+    END_AX_OBJC_EXCEPTIONS
+
+    return 0;
+}
+
 void AccessibilityUIElement::scrollToMakeVisible()
 {
-    // FIXME: implement
+    BEGIN_AX_OBJC_EXCEPTIONS
+    [m_element accessibilityPerformAction:@"AXScrollToVisible"];
+    END_AX_OBJC_EXCEPTIONS
 }
 
 void AccessibilityUIElement::scrollToMakeVisibleWithSubFocus(int x, int y, int width, int height)
diff --git a/Tools/DumpRenderTree/mac/DumpRenderTree.mm b/Tools/DumpRenderTree/mac/DumpRenderTree.mm
index 3cd1214..8073e69 100644
--- a/Tools/DumpRenderTree/mac/DumpRenderTree.mm
+++ b/Tools/DumpRenderTree/mac/DumpRenderTree.mm
@@ -87,7 +87,6 @@
 #import <WebKit/WebTypesInternal.h>
 #import <WebKit/WebViewPrivate.h>
 #import <getopt.h>
-#import <objc/objc-runtime.h>
 #import <wtf/Assertions.h>
 #import <wtf/FastMalloc.h>
 #import <wtf/RetainPtr.h>
@@ -111,6 +110,12 @@
 +(void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString *)host;
 @end
 
+#if USE(APPKIT)
+@interface NSSound (Details)
++ (void)_setAlertType:(NSUInteger)alertType;
+@end
+#endif
+
 static void runTest(const string& testPathOrURL);
 
 // Deciding when it's OK to dump out the state is a bit tricky.  All these must be true:
@@ -146,7 +151,7 @@
 StorageTrackerDelegate *storageDelegate;
 
 static int dumpPixelsForAllTests = NO;
-static bool dumpPixelsForCurrentTest;
+static bool dumpPixelsForCurrentTest = false;
 static int threaded;
 static int dumpTree = YES;
 static int useTimeoutWatchdog = YES;
@@ -545,9 +550,11 @@
     DumpRenderTreeWindow *window = [[DumpRenderTreeWindow alloc] initWithContentRect:windowRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES];
 
     [window setColorSpace:[[NSScreen mainScreen] colorSpace]];
+    [window setCollectionBehavior:NSWindowCollectionBehaviorStationary];
     [[window contentView] addSubview:webView];
     [window orderBack:nil];
     [window setAutodisplay:NO];
+    [window _setWindowResolution:1 displayIfChanged:YES];
 
     [window startListeningForAcceleratedCompositingChanges];
     
@@ -588,6 +595,10 @@
     [defaults setBool:YES forKey:WebKitFullScreenEnabledPreferenceKey];
     [defaults setBool:YES forKey:@"UseWebKitWebInspector"];
 
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+    [defaults setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"notational", @"notationl", nil] forKey:@"NSTestCorrectionDictionary"];
+#endif
+
     // Scrollbars are drawn either using AppKit (which uses NSUserDefaults) or using HIToolbox (which uses CFPreferences / kCFPreferencesAnyApplication / kCFPreferencesCurrentUser / kCFPreferencesAnyHost)
     [defaults setObject:@"DoubleMax" forKey:@"AppleScrollBarVariant"];
     RetainPtr<CFTypeRef> initialValue = CFPreferencesCopyValue(CFSTR("AppleScrollBarVariant"), kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
@@ -676,6 +687,7 @@
     [preferences setUsePreHTML5ParserQuirks:NO];
     [preferences setAsynchronousSpellCheckingEnabled:NO];
     [preferences setMockScrollbarsEnabled:YES];
+    [preferences setSeamlessIFramesEnabled:YES];
 
 #if ENABLE(WEB_AUDIO)
     [preferences setWebAudioEnabled:YES];
@@ -693,6 +705,9 @@
 // Called once on DumpRenderTree startup.
 static void setDefaultsToConsistentValuesForTesting()
 {
+    // FIXME: We'd like to start with a clean state for every test, but this function can't be used more than once yet.
+    [WebPreferences _switchNetworkLoaderToNewTestingSession];
+
     resetDefaultsToConsistentValues();
 
     NSString *path = libraryPathForDumpRenderTree();
@@ -702,8 +717,6 @@
                                           diskPath:[path stringByAppendingPathComponent:@"URLCache"]];
     [NSURLCache setSharedURLCache:sharedCache];
     [sharedCache release];
-
-    [WebPreferences _switchNetworkLoaderToNewTestingSession];
 }
 
 static void runThread(void* arg)
@@ -736,28 +749,6 @@
     createThread(runThread, 0, "DumpRenderTree: test");
 }
 
-static void crashHandler(int sig)
-{
-    char *signalName = strsignal(sig);
-    write(STDERR_FILENO, signalName, strlen(signalName));
-    write(STDERR_FILENO, "\n", 1);
-    exit(128 + sig);
-}
-
-static void installSignalHandlers()
-{
-    signal(SIGILL, crashHandler);    /* 4:   illegal instruction (not reset when caught) */
-    signal(SIGTRAP, crashHandler);   /* 5:   trace trap (not reset when caught) */
-    signal(SIGEMT, crashHandler);    /* 7:   EMT instruction */
-    signal(SIGFPE, crashHandler);    /* 8:   floating point exception */
-    signal(SIGBUS, crashHandler);    /* 10:  bus error */
-    signal(SIGSEGV, crashHandler);   /* 11:  segmentation violation */
-    signal(SIGSYS, crashHandler);    /* 12:  bad argument to system call */
-    signal(SIGPIPE, crashHandler);   /* 13:  write on a pipe with no reader */
-    signal(SIGXCPU, crashHandler);   /* 24:  exceeded CPU time limit */
-    signal(SIGXFSZ, crashHandler);   /* 25:  exceeded file size limit */
-}
-
 static void allocateGlobalControllers()
 {
     // FIXME: We should remove these and move to the ObjC standard [Foo sharedInstance] model
@@ -855,6 +846,12 @@
     allocateGlobalControllers();
     
     makeLargeMallocFailSilently();
+
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
+    static id assertion = [[[NSProcessInfo processInfo] beginSuspensionOfSystemBehaviors:NSSystemBehaviorCommonBehaviors
+        reason:@"DumpRenderTree should not be subject to process suppression"] retain];
+    ASSERT_UNUSED(assertion, assertion);
+#endif
 }
 
 void dumpRenderTree(int argc, const char *argv[])
@@ -862,12 +859,14 @@
     initializeGlobalsFromCommandLineOptions(argc, argv);
     prepareConsistentTestingEnvironment();
     addTestPluginsToPluginSearchPath(argv[0]);
-    if (dumpPixelsForCurrentTest)
-        installSignalHandlers();
 
     if (forceComplexText)
         [WebView _setAlwaysUsesComplexTextCodePath:YES];
 
+#if USE(APPKIT)
+    [NSSound _setAlertType:0];
+#endif
+
     WebView *webView = createWebViewAndOffscreenWindow();
     mainFrame = [webView mainFrame];
 
@@ -887,7 +886,7 @@
         printSeparators = YES;
         runTestingServerLoop();
     } else {
-        printSeparators = (optind < argc - 1 || (dumpPixelsForCurrentTest && dumpTree));
+        printSeparators = optind < argc - 1;
         for (int i = optind; i != argc; ++i)
             runTest(argv[i]);
     }
@@ -1270,7 +1269,6 @@
     [[webView undoManager] removeAllActions];
     [WebView _removeAllUserContentFromGroup:[webView groupName]];
     [[webView window] setAutodisplay:NO];
-    [webView _setMinimumTimerInterval:[WebView _defaultMinimumTimerInterval]];
     [webView setTracksRepaints:NO];
     
     resetDefaultsToConsistentValues();
@@ -1281,8 +1279,6 @@
         gTestRunner->removeChromeInputField();
     }
 
-    [[mainFrame webView] setSmartInsertDeleteEnabled:YES];
-
     [WebView _setUsesTestModeFocusRingColor:YES];
     [WebView _resetOriginAccessWhitelists];
     [WebView _setAllowsRoundingHacks:NO];
diff --git a/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.h b/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.h
index a229d20..3b1d77e 100644
--- a/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.h
+++ b/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.h
@@ -32,6 +32,12 @@
 
 @class WebView;
 
+@interface NSWindow (Details)
+
+- (void)_setWindowResolution:(CGFloat)resolution displayIfChanged:(BOOL)displayIfChanged;
+
+@end
+
 @interface DumpRenderTreeWindow : NSWindow
 {
 }
diff --git a/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.mm b/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.mm
index 17a114b..4a6fd6b 100644
--- a/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.mm
+++ b/Tools/DumpRenderTree/mac/DumpRenderTreeWindow.mm
@@ -120,4 +120,9 @@
         [self setAutodisplay:YES];
 }
 
+- (CGFloat)backingScaleFactor
+{
+    return 1;
+}
+
 @end
diff --git a/Tools/DumpRenderTree/mac/ObjCPlugin.m b/Tools/DumpRenderTree/mac/ObjCPlugin.m
index e1aa125..ffd9968 100644
--- a/Tools/DumpRenderTree/mac/ObjCPlugin.m
+++ b/Tools/DumpRenderTree/mac/ObjCPlugin.m
@@ -28,7 +28,7 @@
 #import "ObjCPlugin.h"
 
 #import <WebKit/WebKit.h>
-#import <objc/objc-runtime.h>
+#import <objc/runtime.h>
 
 // === NSObject category to expose almost everything to JavaScript ===
 
diff --git a/Tools/DumpRenderTree/mac/TestRunnerMac.mm b/Tools/DumpRenderTree/mac/TestRunnerMac.mm
index b520e09..f410c75 100644
--- a/Tools/DumpRenderTree/mac/TestRunnerMac.mm
+++ b/Tools/DumpRenderTree/mac/TestRunnerMac.mm
@@ -43,9 +43,9 @@
 #import <JavaScriptCore/JSStringRef.h>
 #import <JavaScriptCore/JSStringRefCF.h>
 #import <WebCore/GeolocationPosition.h>
-#import <WebCore/PageVisibilityState.h>
 #import <WebKit/DOMDocument.h>
 #import <WebKit/DOMElement.h>
+#import <WebKit/DOMHTMLInputElementPrivate.h>
 #import <WebKit/WebApplicationCache.h>
 #import <WebKit/WebBackForwardList.h>
 #import <WebKit/WebCoreStatistics.h>
@@ -74,7 +74,6 @@
 #import <WebKit/WebTypesInternal.h>
 #import <WebKit/WebView.h>
 #import <WebKit/WebViewPrivate.h>
-#import <WebKit/WebWorkersPrivate.h>
 #import <wtf/CurrentTime.h>
 #import <wtf/HashMap.h>
 #import <wtf/RetainPtr.h>
@@ -213,6 +212,11 @@
     [WebStorageManager setStorageDatabaseIdleInterval:interval];
 }
 
+void TestRunner::closeIdleLocalStorageDatabases()
+{
+    [WebStorageManager closeIdleLocalStorageDatabases];
+}
+
 JSValueRef TestRunner::originsWithLocalStorage(JSContextRef context)
 {
     return originsArrayToJS(context, [[WebStorageManager sharedWebStorageManager] origins]);
@@ -270,21 +274,6 @@
     }
 }
 
-JSValueRef TestRunner::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef value)
-{   
-    return [[mainFrame webView] _computedStyleIncludingVisitedInfo:context forElement:value];
-}
-
-JSRetainPtr<JSStringRef> TestRunner::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
-{
-    DOMElement *element = [DOMElement _DOMElementFromJSContext:context value:nodeObject];
-    if (!element)
-        return JSRetainPtr<JSStringRef>();
-
-    JSRetainPtr<JSStringRef> markerText(Adopt, JSStringCreateWithCFString((CFStringRef)[element _markerTextForListItem]));
-    return markerText;
-}
-
 int TestRunner::numberOfPendingGeolocationPermissionRequests()
 {
     return [[[mainFrame webView] UIDelegate] numberOfPendingGeolocationPermissionRequests];
@@ -295,11 +284,6 @@
     return [[[WebHistory optionalSharedHistory] allItems] count];
 }
 
-unsigned TestRunner::workerThreadCount() const
-{
-    return [WebWorkersPrivate workerThreadCount];
-}
-
 JSRetainPtr<JSStringRef> TestRunner::platformName() const
 {
     JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("mac"));
@@ -421,15 +405,6 @@
     [[[mainFrame webView] preferences] setAuthorAndUserStylesEnabled:flag];
 }
 
-void TestRunner::setAutofilled(JSContextRef context, JSValueRef nodeObject, bool autofilled)
-{
-    DOMElement *element = [DOMElement _DOMElementFromJSContext:context value:nodeObject];
-    if (!element || ![element isKindOfClass:[DOMHTMLInputElement class]])
-        return;
-
-    [(DOMHTMLInputElement *)element _setAutofilled:autofilled];
-}
-
 void TestRunner::setCustomPolicyDelegate(bool setDelegate, bool permissive)
 {
     if (setDelegate) {
@@ -549,11 +524,6 @@
     [[[mainFrame webView] preferences] setXSSAuditorEnabled:enabled];
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool enabled)
-{
-    [[[mainFrame webView] preferences] setFrameFlatteningEnabled:enabled];
-}
-
 void TestRunner::setSpatialNavigationEnabled(bool enabled)
 {
     [[[mainFrame webView] preferences] setSpatialNavigationEnabled:enabled];
@@ -618,7 +588,7 @@
         return;
 
     RetainPtr<CFStringRef> valueCF(AdoptCF, JSStringCopyCFString(kCFAllocatorDefault, value));
-    [(DOMHTMLInputElement *)element _setValueForUser:(NSString *)valueCF.get()];
+    [(DOMHTMLInputElement *)element setValueForUser:(NSString *)valueCF.get()];
 }
 
 void TestRunner::setViewModeMediaFeature(JSStringRef mode)
@@ -626,11 +596,6 @@
     // FIXME: implement
 }
 
-void TestRunner::disableImageLoading()
-{
-    [[WebPreferences standardPreferences] setLoadsImagesAutomatically:NO];
-}
-
 void TestRunner::dispatchPendingLoadRequests()
 {
     [[mainFrame webView] _dispatchPendingLoadRequests];
@@ -669,16 +634,6 @@
     [[mainFrame webView] _updateActiveState];
 }
 
-void TestRunner::setSmartInsertDeleteEnabled(bool flag)
-{
-    [[mainFrame webView] setSmartInsertDeleteEnabled:flag];
-}
-
-void TestRunner::setSelectTrailingWhitespaceEnabled(bool flag)
-{
-    [[mainFrame webView] setSelectTrailingWhitespaceEnabled:flag];
-}
-
 static const CFTimeInterval waitToDumpWatchdogInterval = 30.0;
 
 static void waitUntilDoneWatchdogFired(CFRunLoopTimerRef timer, void* info)
@@ -698,20 +653,6 @@
     return CFArrayGetCount(openWindowsRef);
 }
 
-bool TestRunner::elementDoesAutoCompleteForElementWithId(JSStringRef jsString)
-{
-    RetainPtr<CFStringRef> idCF(AdoptCF, JSStringCopyCFString(kCFAllocatorDefault, jsString));
-    NSString *idNS = (NSString *)idCF.get();
-    
-    DOMElement *element = [[mainFrame DOMDocument] getElementById:idNS];
-    id rep = [[mainFrame dataSource] representation];
-    
-    if ([rep class] == [WebHTMLRepresentation class])
-        return [(WebHTMLRepresentation *)rep elementDoesAutoComplete:element];
-
-    return false;
-}
-
 void TestRunner::execCommand(JSStringRef name, JSStringRef value)
 {
     RetainPtr<CFStringRef> nameCF(AdoptCF, JSStringCopyCFString(kCFAllocatorDefault, name));
@@ -788,31 +729,6 @@
     return [validator validateUserInterfaceItem:target.get()];
 }
 
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
-{
-    RetainPtr<CFStringRef> idCF(AdoptCF, JSStringCopyCFString(kCFAllocatorDefault, elementId));
-    NSString *idNS = (NSString *)idCF.get();
-    RetainPtr<CFStringRef> nameCF(AdoptCF, JSStringCopyCFString(kCFAllocatorDefault, animationName));
-    NSString *nameNS = (NSString *)nameCF.get();
-    
-    return [mainFrame _pauseAnimation:nameNS onNode:[[mainFrame DOMDocument] getElementById:idNS] atTime:time];
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
-{
-    RetainPtr<CFStringRef> idCF(AdoptCF, JSStringCopyCFString(kCFAllocatorDefault, elementId));
-    NSString *idNS = (NSString *)idCF.get();
-    RetainPtr<CFStringRef> nameCF(AdoptCF, JSStringCopyCFString(kCFAllocatorDefault, propertyName));
-    NSString *nameNS = (NSString *)nameCF.get();
-    
-    return [mainFrame _pauseTransitionOfProperty:nameNS onNode:[[mainFrame DOMDocument] getElementById:idNS] atTime:time];
-}
-
-unsigned TestRunner::numberOfActiveAnimations() const
-{
-    return [mainFrame _numberOfActiveAnimations];
-}
-
 void TestRunner::waitForPolicyDelegate()
 {
     setWaitToDump(true);
@@ -866,11 +782,6 @@
     [[[mainFrame webView] preferences] setDeveloperExtrasEnabled:enabled];
 }
 
-void TestRunner::setAsynchronousSpellCheckingEnabled(bool enabled)
-{
-    [[[mainFrame webView] preferences] setAsynchronousSpellCheckingEnabled:enabled];
-}
-
 void TestRunner::showWebInspector()
 {
     [[[mainFrame webView] inspector] show:nil];
@@ -1106,11 +1017,6 @@
     [WebView _setLoadResourcesSerially:serialize];
 }
 
-void TestRunner::setMinimumTimerInterval(double minimumTimerInterval)
-{
-    [[mainFrame webView] _setMinimumTimerInterval:minimumTimerInterval];
-}
-
 void TestRunner::setTextDirection(JSStringRef directionName)
 {
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
@@ -1156,9 +1062,8 @@
 void TestRunner::resetPageVisibility()
 {
     WebView *webView = [mainFrame webView];
-    if ([webView respondsToSelector:@selector(_setVisibilityState:isInitialState:)]) {
-        [webView _setVisibilityState:WebCore::PageVisibilityStateVisible isInitialState:NO];
-    }
+    if ([webView respondsToSelector:@selector(_setVisibilityState:isInitialState:)])
+        [webView _setVisibilityState:WebPageVisibilityStateVisible isInitialState:YES];
 }
 
 void TestRunner::setPageVisibility(const char* newVisibility)
@@ -1168,23 +1073,13 @@
 
     WebView *webView = [mainFrame webView];
     if (!strcmp(newVisibility, "visible"))
-        [webView _setVisibilityState:WebCore::PageVisibilityStateVisible isInitialState:NO];
+        [webView _setVisibilityState:WebPageVisibilityStateVisible isInitialState:NO];
     else if (!strcmp(newVisibility, "hidden"))
-        [webView _setVisibilityState:WebCore::PageVisibilityStateHidden isInitialState:NO];
+        [webView _setVisibilityState:WebPageVisibilityStateHidden isInitialState:NO];
     else if (!strcmp(newVisibility, "prerender"))
-        [webView _setVisibilityState:WebCore::PageVisibilityStatePrerender isInitialState:NO];
+        [webView _setVisibilityState:WebPageVisibilityStatePrerender isInitialState:NO];
     else if (!strcmp(newVisibility, "preview"))
-        [webView _setVisibilityState:WebCore::PageVisibilityStatePreview isInitialState:NO];
-}
-
-void TestRunner::sendWebIntentResponse(JSStringRef)
-{
-    // FIXME: Implement.
-}
-
-void TestRunner::deliverWebIntent(JSStringRef, JSStringRef, JSStringRef)
-{
-    // FIXME: Implement.
+        [webView _setVisibilityState:WebPageVisibilityStatePreview isInitialState:NO];
 }
 
 void TestRunner::grantWebNotificationPermission(JSStringRef jsOrigin)
diff --git a/Tools/DumpRenderTree/qt/DumpRenderTree.pro b/Tools/DumpRenderTree/qt/DumpRenderTree.pro
index 0bd0b16..2d6cfca 100644
--- a/Tools/DumpRenderTree/qt/DumpRenderTree.pro
+++ b/Tools/DumpRenderTree/qt/DumpRenderTree.pro
@@ -16,6 +16,7 @@
     $$PWD/.. \
     $${ROOT_WEBKIT_DIR}/Source/WebCore/platform/qt \
     $${ROOT_WEBKIT_DIR}/Source/WebKit/qt/WebCoreSupport \
+    $${ROOT_WEBKIT_DIR}/Source/WebKit/qt/WidgetSupport \
     $${ROOT_WEBKIT_DIR}/Source/WTF
 
 QT = core gui network testlib webkitwidgets widgets
@@ -25,17 +26,20 @@
 HEADERS += \
     $$PWD/../WorkQueue.h \
     $$PWD/../DumpRenderTree.h \
+    $$PWD/../GCController.h \
+    $$PWD/../TestRunner.h \
     DumpRenderTreeQt.h \
     EventSenderQt.h \
     TextInputControllerQt.h \
     WorkQueueItemQt.h \
     TestRunnerQt.h \
-    GCControllerQt.h \
     testplugin.h
 
 SOURCES += \
     $$PWD/../WorkQueue.cpp \
     $$PWD/../DumpRenderTreeCommon.cpp \
+    $$PWD/../GCController.cpp \
+    $$PWD/../TestRunner.cpp \
     DumpRenderTreeQt.cpp \
     EventSenderQt.cpp \
     TextInputControllerQt.cpp \
@@ -46,7 +50,7 @@
     DumpRenderTreeMain.cpp
 
 wince*: {
-    INCLUDEPATH += $$QT.core.sources/../3rdparty/ce-compat $$WCECOMPAT/include
+    INCLUDEPATH += $$WCECOMPAT/include
     LIBS += $$WCECOMPAT/lib/wcecompat.lib
 }
 
diff --git a/Tools/DumpRenderTree/qt/DumpRenderTreeMain.cpp b/Tools/DumpRenderTree/qt/DumpRenderTreeMain.cpp
index 70b5d14..6b86e9d 100644
--- a/Tools/DumpRenderTree/qt/DumpRenderTreeMain.cpp
+++ b/Tools/DumpRenderTree/qt/DumpRenderTreeMain.cpp
@@ -35,13 +35,13 @@
 #include <qdir.h>
 #include <qfont.h>
 #include <qstringlist.h>
+#include <qstylefactory.h>
 #include <qtimer.h>
 #include <qurl.h>
 #include <qwebdatabase.h>
-#include <qwindowsstyle.h>
+
 
 #include <wtf/AlwaysInline.h>
-#include <wtf/ExportMacros.h>
 
 #ifdef Q_WS_X11
 #include <qx11info_x11.h>
@@ -116,7 +116,7 @@
 
     WebKit::QtTestSupport::initializeTestFonts();
 
-    QApplication::setStyle(new QWindowsStyle);
+    QApplication::setStyle(QStyleFactory::create(QLatin1String("windows")));
     QApplication::setDesktopSettingsAware(false);
 
     QApplication app(argc, argv);
@@ -135,7 +135,7 @@
     // Remove the first arguments, it is application name itself
     args.removeAt(0);
 
-    WebCore::DumpRenderTree dumper;
+    DumpRenderTree dumper;
 
     int index = args.indexOf(QLatin1String("--stdout"));
     if (index != -1) {
diff --git a/Tools/DumpRenderTree/qt/DumpRenderTreeQt.cpp b/Tools/DumpRenderTree/qt/DumpRenderTreeQt.cpp
index 34ee5ad..ef3e38f 100755
--- a/Tools/DumpRenderTree/qt/DumpRenderTreeQt.cpp
+++ b/Tools/DumpRenderTree/qt/DumpRenderTreeQt.cpp
@@ -35,8 +35,12 @@
 #include "DumpRenderTreeQt.h"
 #include "DumpRenderTreeSupportQt.h"
 #include "EventSenderQt.h"
-#include "GCControllerQt.h"
+#include "GCController.h"
+#include "InitWebCoreQt.h"
+#include "InitWebKitQt.h"
+#include "JSStringRefQt.h"
 #include "QtTestSupport.h"
+#include "TestRunner.h"
 #include "TestRunnerQt.h"
 #include "TextInputControllerQt.h"
 #include "testplugin.h"
@@ -62,20 +66,15 @@
 #include <QProgressBar>
 #include <QUndoStack>
 #include <QUrl>
-
-#include <qwebsettings.h>
-#include <qwebsecurityorigin.h>
-
 #include <limits.h>
 #include <locale.h>
-
+#include <qwebsecurityorigin.h>
+#include <qwebsettings.h>
 #ifndef Q_OS_WIN
 #include <unistd.h>
 #endif
 
-#include <qdebug.h>
-
-namespace WebCore {
+using namespace WebCore;
 
 const int databaseDefaultQuota = 5 * 1024 * 1024;
 
@@ -195,9 +194,6 @@
 
     m_drt->testRunner()->setCaretBrowsingEnabled(false);
     m_drt->testRunner()->setAuthorAndUserStylesEnabled(true);
-    m_drt->testRunner()->setFrameFlatteningEnabled(false);
-    m_drt->testRunner()->setSmartInsertDeleteEnabled(true);
-    m_drt->testRunner()->setSelectTrailingWhitespaceEnabled(false);
     m_drt->testRunner()->setDefersLoading(false);
 
     // globalSettings must be reset explicitly.
@@ -206,14 +202,14 @@
     QWebSettings::setMaximumPagesInCache(0); // reset to default
     settings()->setUserStyleSheetUrl(QUrl()); // reset to default
 
-    DumpRenderTreeSupportQt::setMinimumTimerInterval(this, DumpRenderTreeSupportQt::defaultMinimumTimerInterval());
+    DumpRenderTreeSupportQt::setSeamlessIFramesEnabled(true);
 
-    DumpRenderTreeSupportQt::resetInternalsObject(mainFrame());
+    DumpRenderTreeSupportQt::resetInternalsObject(mainFrame()->handle());
 
     m_pendingGeolocationRequests.clear();
 }
 
-QWebPage *WebPage::createWindow(QWebPage::WebWindowType)
+QWebPage* WebPage::createWindow(QWebPage::WebWindowType)
 {
     return m_drt->createWindow();
 }
@@ -387,6 +383,8 @@
     scene()->addItem(m_item);
 }
 
+static DumpRenderTree *s_instance = 0;
+
 DumpRenderTree::DumpRenderTree()
     : m_dumpPixelsForAllTests(false)
     , m_stdin(0)
@@ -395,10 +393,15 @@
     , m_graphicsBased(false)
     , m_persistentStoragePath(QString(getenv("DUMPRENDERTREE_TEMP")))
 {
+    ASSERT(!s_instance);
+    s_instance = this;
+
     QByteArray viewMode = getenv("QT_DRT_WEBVIEW_MODE");
     if (viewMode == "graphics")
         setGraphicsBased(true);
 
+    WebKit::initializeWebKitWidgets();
+    WebCore::initializeWebCoreQt();
     DumpRenderTreeSupportQt::initialize();
 
     // Set running in DRT mode for qwebpage to create testable objects.
@@ -421,10 +424,10 @@
     }
     // Use a frame group name for all pages created by DumpRenderTree to allow
     // testing of cross-page frame lookup.
-    DumpRenderTreeSupportQt::webPageSetGroupName(m_page, "org.webkit.qt.DumpRenderTree");
+    DumpRenderTreeSupportQt::webPageSetGroupName(pageAdapter(), "org.webkit.qt.DumpRenderTree");
 
     m_mainView->setContextMenuPolicy(Qt::NoContextMenu);
-    m_mainView->resize(QSize(TestRunner::maxViewWidth, TestRunner::maxViewHeight));
+    m_mainView->resize(QSize(TestRunnerQt::maxViewWidth, TestRunnerQt::maxViewHeight));
 
     // clean up cache by resetting quota.
     qint64 quota = webPage()->settings()->offlineWebApplicationCacheQuota();
@@ -432,7 +435,7 @@
 
     // create our controllers. This has to be done before connectFrame,
     // as it exports there to the JavaScript DOM window.
-    m_controller = new TestRunner(this);
+    m_controller = new TestRunnerQt(this);
     connect(m_controller, SIGNAL(showPage()), this, SLOT(showPage()));
     connect(m_controller, SIGNAL(hidePage()), this, SLOT(hidePage()));
 
@@ -442,7 +445,7 @@
     connect(m_controller, SIGNAL(done()), this, SLOT(dump()));
     m_eventSender = new EventSender(m_page);
     m_textInputController = new TextInputController(m_page);
-    m_gcController = new GCController(m_page);
+    m_gcController.reset(new GCController());
 
     // now connect our different signals
     connect(m_page, SIGNAL(frameCreated(QWebFrame *)),
@@ -470,7 +473,7 @@
     QObject::connect(this, SIGNAL(quit()), qApp, SLOT(quit()), Qt::QueuedConnection);
 
     DumpRenderTreeSupportQt::setDumpRenderTreeModeEnabled(true);
-    DumpRenderTreeSupportQt::setInteractiveFormValidationEnabled(webPage(), true);
+    DumpRenderTreeSupportQt::setInteractiveFormValidationEnabled(pageAdapter(), true);
     DumpRenderTreeSupportQt::enableMockScrollbars();
 
     QFocusEvent event(QEvent::FocusIn, Qt::ActiveWindowFocusReason);
@@ -485,6 +488,12 @@
         fclose(stderr);
     delete m_mainView;
     delete m_stdin;
+    s_instance = 0;
+}
+
+DumpRenderTree* DumpRenderTree::instance()
+{
+    return s_instance;
 }
 
 static void clearHistory(QWebPage* page)
@@ -526,6 +535,8 @@
     // of the DRT.
     m_controller->reset();
 
+    m_jscController = TestRunner::create(url.toString().toStdString(), m_expectedHash.toStdString());
+
     // reset mouse clicks counter
     m_eventSender->resetClickCount();
 
@@ -541,9 +552,9 @@
 #endif
 
     clearHistory(m_page);
-    DumpRenderTreeSupportQt::scalePageBy(m_page->mainFrame(), 1, QPoint(0, 0));
-    DumpRenderTreeSupportQt::clearFrameName(m_page->mainFrame());
-    DumpRenderTreeSupportQt::removeUserStyleSheets(m_page);
+    DumpRenderTreeSupportQt::scalePageBy(mainFrameAdapter(), 1, QPoint(0, 0));
+    DumpRenderTreeSupportQt::clearFrameName(mainFrameAdapter());
+    DumpRenderTreeSupportQt::removeUserStyleSheets(pageAdapter());
 
     m_page->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAsNeeded);
     m_page->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAsNeeded);
@@ -561,7 +572,7 @@
 
     DumpRenderTreeSupportQt::resetOriginAccessWhiteLists();
 
-    DumpRenderTreeSupportQt::setWindowsBehaviorAsEditingBehavior(m_page);
+    DumpRenderTreeSupportQt::setWindowsBehaviorAsEditingBehavior(pageAdapter());
 
     QLocale::setDefault(QLocale::c());
 
@@ -570,7 +581,7 @@
     setlocale(LC_ALL, "");
 #endif
 
-    DumpRenderTreeSupportQt::clearOpener(m_page->mainFrame());
+    DumpRenderTreeSupportQt::clearOpener(mainFrameAdapter());
 }
 
 static bool isGlobalHistoryTest(const QUrl& url)
@@ -607,15 +618,15 @@
         testRunner()->showWebInspector();
 
     if (isDumpAsTextTest(url))
-        testRunner()->dumpAsText();
+        m_jscController->setDumpAsText(true);
 
     if (isGlobalHistoryTest(url))
         testRunner()->dumpHistoryCallbacks();
 
     // W3C SVG tests expect to be 480x360
     bool isW3CTest = url.toString().contains("svg/W3C-SVG-1.1");
-    int width = isW3CTest ? 480 : TestRunner::maxViewWidth;
-    int height = isW3CTest ? 360 : TestRunner::maxViewHeight;
+    int width = isW3CTest ? 480 : TestRunnerQt::maxViewWidth;
+    int height = isW3CTest ? 360 : TestRunnerQt::maxViewHeight;
     m_mainView->resize(QSize(width, height));
     m_page->setPreferredContentsSize(QSize());
     m_page->setViewportSize(QSize(width, height));
@@ -721,6 +732,8 @@
         open(QUrl::fromLocalFile(fi.absoluteFilePath()));
     }
 
+    if (command.timeout > 0)
+        setTimeout(command.timeout);
     fflush(stdout);
 }
 
@@ -735,11 +748,52 @@
 {
     QWebFrame *frame = qobject_cast<QWebFrame*>(sender());
     Q_ASSERT(frame);
+
+    JSContextRef context = 0;
+    JSObjectRef window = 0;
+
+    DumpRenderTreeSupportQt::getJSWindowObject(frame->handle(), &context, &window);
+
     frame->addToJavaScriptWindowObject(QLatin1String("testRunner"), m_controller);
     frame->addToJavaScriptWindowObject(QLatin1String("eventSender"), m_eventSender);
     frame->addToJavaScriptWindowObject(QLatin1String("textInputController"), m_textInputController);
-    frame->addToJavaScriptWindowObject(QLatin1String("GCController"), m_gcController);
-    DumpRenderTreeSupportQt::injectInternalsObject(frame);
+    m_gcController->makeWindowObject(context, window, 0);
+
+    if (m_jscController) {
+        JSObjectRef dummyWindow = JSObjectMake(context, 0, 0);
+        m_jscController->makeWindowObject(context, dummyWindow, 0);
+        JSRetainPtr<JSStringRef> testRunnerName(Adopt, JSStringCreateWithUTF8CString("testRunner"));
+        JSValueRef wrappedTestRunner = JSObjectGetProperty(context, dummyWindow, testRunnerName.get(), 0);
+        JSRetainPtr<JSStringRef> helperScript(Adopt, JSStringCreateWithUTF8CString("(function() {\n"
+                                                                                   "    function bind(fun, thisArg) {\n"
+                                                                                   "        return function() {\n"
+                                                                                   "            return fun.apply(thisArg, Array.prototype.slice.call(arguments));\n"
+                                                                                   "        }\n"
+                                                                                   "    }\n"
+                                                                                   "for (var prop in this.jscBasedTestRunner) {\n"
+                                                                                   "    var pd = Object.getOwnPropertyDescriptor(this.qtBasedTestRunner, prop);\n"
+                                                                                   "    if (pd !== undefined) continue;\n"
+                                                                                   "    pd = Object.getOwnPropertyDescriptor(this.jscBasedTestRunner, prop);\n"
+                                                                                   "    this.qtBasedTestRunner[prop] = bind(this.jscBasedTestRunner[prop], this.jscBasedTestRunner);\n"
+                                                                                   "}\n"
+                                                                                   "}).apply(this)\n"));
+
+        JSRetainPtr<JSStringRef> qtBasedTestRunnerName(Adopt, JSStringCreateWithUTF8CString("qtBasedTestRunner"));
+        JSRetainPtr<JSStringRef> jscBasedTestRunnerName(Adopt, JSStringCreateWithUTF8CString("jscBasedTestRunner"));
+
+        JSObjectRef args = JSObjectMake(context, 0, 0);
+        JSObjectSetProperty(context, args, qtBasedTestRunnerName.get(), JSObjectGetProperty(context, window, testRunnerName.get(), 0), 0, 0);
+        JSObjectSetProperty(context, args, jscBasedTestRunnerName.get(), wrappedTestRunner, 0, 0);
+
+        JSValueRef ex = 0;
+        JSEvaluateScript(context, helperScript.get(), args, 0, 0, &ex);
+        if (ex) {
+            JSRetainPtr<JSStringRef> msg(Adopt, JSValueToStringCopy(context, ex, 0));
+            fprintf(stderr, "Error evaluating TestRunner setup-script: %s\n", qPrintable(JSStringCopyQString(msg.get())));
+        }
+    }
+
+    DumpRenderTreeSupportQt::injectInternalsObject(frame->handle());
 }
 
 void DumpRenderTree::showPage()
@@ -757,7 +811,7 @@
 
 QString DumpRenderTree::dumpFrameScrollPosition(QWebFrame* frame)
 {
-    if (!frame || !DumpRenderTreeSupportQt::hasDocumentElement(frame))
+    if (!frame || !DumpRenderTreeSupportQt::hasDocumentElement(frame->handle()))
         return QString();
 
     QString result;
@@ -769,7 +823,7 @@
         result.append(QString("scrolled to %1,%2\n").arg(pos.x()).arg(pos.y()));
     }
 
-    if (m_controller->shouldDumpChildFrameScrollPositions()) {
+    if (m_jscController->dumpChildFrameScrollPositions()) {
         QList<QWebFrame*> children = frame->childFrames();
         for (int i = 0; i < children.size(); ++i)
             result += dumpFrameScrollPosition(children.at(i));
@@ -779,7 +833,7 @@
 
 QString DumpRenderTree::dumpFramesAsText(QWebFrame* frame)
 {
-    if (!frame || !DumpRenderTreeSupportQt::hasDocumentElement(frame))
+    if (!frame || !DumpRenderTreeSupportQt::hasDocumentElement(frame->handle()))
         return QString();
 
     QString result;
@@ -794,7 +848,7 @@
     result.append(innerText);
     result.append(QLatin1String("\n"));
 
-    if (m_controller->shouldDumpChildrenAsText()) {
+    if (m_jscController->dumpChildFramesAsText()) {
         QList<QWebFrame *> children = frame->childFrames();
         for (int i = 0; i < children.size(); ++i)
             result += dumpFramesAsText(children.at(i));
@@ -881,7 +935,7 @@
 static const char *methodNameStringForFailedTest(TestRunner *controller)
 {
     const char *errorMessage;
-    if (controller->shouldDumpAsText())
+    if (controller->dumpAsText())
         errorMessage = "[documentElement innerText]";
     // FIXME: Add when we have support
     //else if (controller->dumpDOMAsWebArchive())
@@ -907,51 +961,59 @@
         fprintf(stdout, "Source:\n\n%s\n", markup.toUtf8().constData());
     }
 
-    QString mimeType = DumpRenderTreeSupportQt::responseMimeType(mainFrame);
+    QString mimeType = DumpRenderTreeSupportQt::responseMimeType(mainFrame->handle());
     if (mimeType == "text/plain")
-        m_controller->dumpAsText();
+        m_jscController->setDumpAsText(true);
 
     // Dump render text...
     QString resultString;
-    if (m_controller->shouldDumpAsText())
+    QString resultContentType = "text/plain";
+    QByteArray resultData;
+    if (m_controller->shouldDumpAsAudio()) {
+        resultContentType = "audio/wav";
+        resultData = m_controller->audioData();
+    } else if (m_jscController->dumpAsText())
         resultString = dumpFramesAsText(mainFrame);
     else {
-        resultString = mainFrame->renderTreeDump();
+        resultString = DumpRenderTreeSupportQt::frameRenderTreeDump(mainFrame->handle());
         resultString += dumpFrameScrollPosition(mainFrame);
     }
     if (!resultString.isEmpty()) {
-        fprintf(stdout, "Content-Type: text/plain\n");
+        fprintf(stdout, "Content-Type: %s\n", resultContentType.toUtf8().constData());
         fprintf(stdout, "%s", resultString.toUtf8().constData());
 
-        if (m_controller->shouldDumpBackForwardList()) {
+        if (m_jscController->dumpBackForwardList()) {
             fprintf(stdout, "%s", dumpBackForwardList(webPage()).toUtf8().constData());
             foreach (QObject* widget, windows) {
                 QWebPage* page = qobject_cast<QWebPage*>(widget->findChild<QWebPage*>());
                 fprintf(stdout, "%s", dumpBackForwardList(page).toUtf8().constData());
             }
         }
-
+    } else if (!resultData.isEmpty()) {
+        fprintf(stdout, "Content-Type: %s\n", resultContentType.toUtf8().constData());
+        fprintf(stdout, "Content-Transfer-Encoding: base64\n");
+        fprintf(stdout, "%s", resultData.toBase64().constData());
     } else
-        printf("ERROR: nil result from %s", methodNameStringForFailedTest(m_controller));
+        printf("ERROR: nil result from %s", methodNameStringForFailedTest(m_jscController.get()));
 
     // signal end of text block
     fputs("#EOF\n", stdout);
     fputs("#EOF\n", stderr);
 
-    if (m_dumpPixelsForCurrentTest && m_controller->shouldDumpPixels()) {
+    if (m_dumpPixelsForCurrentTest && m_jscController->generatePixelResults()) {
         QImage image;
-        if (!m_controller->isPrinting()) {
+        if (!m_jscController->isPrinting()) {
             image = QImage(m_page->viewportSize(), QImage::Format_ARGB32);
             image.fill(Qt::white);
             QPainter painter(&image);
             mainFrame->render(&painter);
             painter.end();
         } else
-            image = DumpRenderTreeSupportQt::paintPagesWithBoundaries(mainFrame);
+            image = DumpRenderTreeSupportQt::paintPagesWithBoundaries(mainFrame->handle());
 
-        if (DumpRenderTreeSupportQt::trackRepaintRects(m_page->mainFrame())) {
+        if (DumpRenderTreeSupportQt::trackRepaintRects(mainFrameAdapter())) {
             QVector<QRect> repaintRects;
-            DumpRenderTreeSupportQt::getTrackedRepaintRects(m_page->mainFrame(), repaintRects);
+            DumpRenderTreeSupportQt::getTrackedRepaintRects(mainFrameAdapter(), repaintRects);
             QImage mask(image.size(), image.format());
             mask.fill(QColor(0, 0, 0, 0.66 * 255));
 
@@ -963,7 +1025,7 @@
             QPainter painter(&image);
             painter.drawImage(image.rect(), mask);
 
-            DumpRenderTreeSupportQt::setTrackRepaintRects(m_page->mainFrame(), false);
+            DumpRenderTreeSupportQt::setTrackRepaintRects(mainFrameAdapter(), false);
         }
 
         QCryptographicHash hash(QCryptographicHash::Md5);
@@ -1021,7 +1083,7 @@
 
 void DumpRenderTree::titleChanged(const QString &s)
 {
-    if (m_controller->shouldDumpTitleChanges())
+    if (m_jscController->dumpTitleChanges())
         printf("TITLE CHANGED: '%s'\n", s.toUtf8().data());
 }
 
@@ -1034,7 +1096,7 @@
 
 void DumpRenderTree::dumpDatabaseQuota(QWebFrame* frame, const QString& dbName)
 {
-    if (!m_controller->shouldDumpDatabaseCallbacks())
+    if (!m_jscController->dumpDatabaseCallbacks())
         return;
     QWebSecurityOrigin origin = frame->securityOrigin();
     printf("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:{%s, %s, %i} database:%s\n",
@@ -1047,7 +1109,7 @@
 
 void DumpRenderTree::dumpApplicationCacheQuota(QWebSecurityOrigin* origin, quint64 defaultOriginQuota, quint64 totalSpaceNeeded)
 {
-    if (m_controller->shouldDumpApplicationCacheDelegateCallbacks()) {
+    if (m_jscController->dumpApplicationCacheDelegateCallbacks()) {
         // For example, numbers from 30000 - 39999 will output as 30000.
         // Rounding up or down not really matter for these tests. It's
         // sufficient to just get a range of 10000 to determine if we were
@@ -1061,7 +1123,7 @@
                );
     }
 
-    if (m_controller->shouldDisallowIncreaseForApplicationCacheQuota())
+    if (m_jscController->disallowIncreaseForApplicationCacheQuota())
         return;
 
     origin->setApplicationCacheQuota(defaultOriginQuota);
@@ -1069,7 +1131,7 @@
 
 void DumpRenderTree::statusBarMessage(const QString& message)
 {
-    if (!m_controller->shouldDumpStatusCallbacks())
+    if (!m_jscController->dumpStatusCallbacks())
         return;
 
     printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", message.toUtf8().constData());
@@ -1077,7 +1139,7 @@
 
 QWebPage *DumpRenderTree::createWindow()
 {
-    if (!m_controller->canOpenWindows())
+    if (!m_jscController->canOpenWindows())
         return 0;
 
     // Create a dummy container object to track the page in DRT.
@@ -1098,7 +1160,7 @@
 
     // Use a frame group name for all pages created by DumpRenderTree to allow
     // testing of cross-page frame lookup.
-    DumpRenderTreeSupportQt::webPageSetGroupName(page, "org.webkit.qt.DumpRenderTree");
+    DumpRenderTreeSupportQt::webPageSetGroupName(page->handle(), "org.webkit.qt.DumpRenderTree");
 
     return page;
 }
@@ -1134,6 +1196,16 @@
 
 }
 
+QWebPageAdapter* DumpRenderTree::pageAdapter() const
+{
+    return m_page->handle();
+}
+
+QWebFrameAdapter* DumpRenderTree::mainFrameAdapter() const
+{
+    return m_page->mainFrame()->handle();
+}
+
 QList<WebPage*> DumpRenderTree::getAllPages() const
 {
     QList<WebPage*> pages;
@@ -1154,5 +1226,3 @@
 {
     m_controller->setShouldTimeout(flag);
 }
-
-}
diff --git a/Tools/DumpRenderTree/qt/DumpRenderTreeQt.h b/Tools/DumpRenderTree/qt/DumpRenderTreeQt.h
index 98429c4..13d9e65 100644
--- a/Tools/DumpRenderTree/qt/DumpRenderTreeQt.h
+++ b/Tools/DumpRenderTree/qt/DumpRenderTreeQt.h
@@ -41,28 +41,29 @@
 #endif
 
 #include "DumpRenderTreeSupportQt.h"
+#include "TestRunner.h"
 #include <qgraphicsview.h>
 #include <qgraphicswebview.h>
 #include <qwebframe.h>
 #include <qwebinspector.h>
 #include <qwebpage.h>
 #include <qwebview.h>
+#include <wtf/RefPtr.h>
 
 QT_BEGIN_NAMESPACE
 class QUrl;
 class QFile;
 QT_END_NAMESPACE
 
-class QWebFrame;
+class QWebFrameAdapter;
+class QWebPageAdapter;
 
-class TestRunner;
+class TestRunnerQt;
 class DumpRenderTreeSupportQt;
 class EventSender;
 class TextInputController;
 class GCController;
 
-namespace WebCore {
-
 class WebPage;
 class NetworkAccessManager;
 
@@ -73,6 +74,8 @@
     DumpRenderTree();
     virtual ~DumpRenderTree();
 
+    static DumpRenderTree* instance();
+
     // Initialize in single-file mode.
     void open(const QUrl& url);
 
@@ -85,7 +88,7 @@
     void closeRemainingWindows();
     void resetToConsistentStateBeforeTesting(const QUrl&);
 
-    TestRunner *testRunner() const { return m_controller; }
+    TestRunnerQt *testRunner() const { return m_controller; }
     EventSender *eventSender() const { return m_eventSender; }
     TextInputController *textInputController() const { return m_textInputController; }
     QString persistentStoragePath() const { return m_persistentStoragePath; }
@@ -97,6 +100,9 @@
     void switchFocus(bool focused);
 
     WebPage *webPage() const { return m_page; }
+    QWebPageAdapter *pageAdapter() const;
+    QWebFrameAdapter *mainFrameAdapter() const;
+
     QList<WebPage*> getAllPages() const;
 
     void processArgsLine(const QStringList&);
@@ -139,7 +145,8 @@
     QString dumpFramesAsText(QWebFrame* frame);
     QString dumpBackForwardList(QWebPage* page);
     QString dumpFrameScrollPosition(QWebFrame* frame);
-    TestRunner *m_controller;
+    TestRunnerQt *m_controller;
+    RefPtr<TestRunner> m_jscController;
 
     bool m_dumpPixelsForCurrentTest;
     bool m_dumpPixelsForAllTests;
@@ -151,7 +158,7 @@
 
     EventSender *m_eventSender;
     TextInputController *m_textInputController;
-    GCController* m_gcController;
+    QScopedPointer<GCController> m_gcController;
     NetworkAccessManager* m_networkAccessManager;
 
     QFile *m_stdin;
@@ -200,8 +207,9 @@
 
     void permissionSet(QWebPage::Feature feature);
 
+    virtual bool shouldInterruptJavaScript() { return false; }
+
 public Q_SLOTS:
-    bool shouldInterruptJavaScript() { return false; }
     void requestPermission(QWebFrame* frame, QWebPage::Feature feature);
     void cancelPermission(QWebFrame* frame, QWebPage::Feature feature);
 
@@ -230,6 +238,4 @@
     QGraphicsWebView* m_item;
 };
 
-}
-
 #endif
diff --git a/Tools/DumpRenderTree/qt/EventSenderQt.cpp b/Tools/DumpRenderTree/qt/EventSenderQt.cpp
index dcf9f1b..352f1de 100644
--- a/Tools/DumpRenderTree/qt/EventSenderQt.cpp
+++ b/Tools/DumpRenderTree/qt/EventSenderQt.cpp
@@ -424,14 +424,14 @@
         QGraphicsSceneContextMenuEvent ctxEvent(QEvent::GraphicsSceneContextMenu);
         ctxEvent.setReason(QGraphicsSceneContextMenuEvent::Mouse);
         ctxEvent.setPos(m_mousePos);
-        WebCore::WebViewGraphicsBased* view = qobject_cast<WebCore::WebViewGraphicsBased*>(m_page->view());
+        WebViewGraphicsBased* view = qobject_cast<WebViewGraphicsBased*>(m_page->view());
         if (view)
             sendEvent(view->graphicsView(), &ctxEvent);
     } else {
         QContextMenuEvent ctxEvent(QContextMenuEvent::Mouse, m_mousePos);
         sendEvent(m_page->view(), &ctxEvent);
     }
-    return DumpRenderTreeSupportQt::contextMenu(m_page);
+    return DumpRenderTreeSupportQt::contextMenu(m_page->handle());
 }
 
 void EventSender::scheduleAsynchronousClick()
@@ -616,7 +616,7 @@
 void EventSender::scalePageBy(float scaleFactor, float x, float y)
 {
     if (QWebFrame* frame = m_page->mainFrame())
-        DumpRenderTreeSupportQt::scalePageBy(frame, scaleFactor, QPoint(x, y));
+        DumpRenderTreeSupportQt::scalePageBy(frame->handle(), scaleFactor, QPoint(x, y));
 }
 
 QWebFrame* EventSender::frameUnderMouse() const
@@ -745,7 +745,7 @@
 
 void EventSender::sendEvent(QObject* receiver, QEvent* event)
 {
-    if (WebCore::WebViewGraphicsBased* view = qobject_cast<WebCore::WebViewGraphicsBased*>(receiver))
+    if (WebViewGraphicsBased* view = qobject_cast<WebViewGraphicsBased*>(receiver))
         view->scene()->sendEvent(view->graphicsView(), event);
     else
         QApplication::sendEvent(receiver, event);
@@ -755,9 +755,11 @@
 {
     // QGraphicsScene does not have a postEvent method, so send the event in this case
     // and delete it after that.
-    if (WebCore::WebViewGraphicsBased* view = qobject_cast<WebCore::WebViewGraphicsBased*>(receiver)) {
+    if (WebViewGraphicsBased* view = qobject_cast<WebViewGraphicsBased*>(receiver)) {
         view->scene()->sendEvent(view->graphicsView(), event);
         delete event;
     } else
         QApplication::postEvent(receiver, event); // event deleted by the system
 }
+
+#include "moc_EventSenderQt.cpp"
diff --git a/Tools/DumpRenderTree/qt/EventSenderQt.h b/Tools/DumpRenderTree/qt/EventSenderQt.h
index 7e4c60a..ad13cad 100644
--- a/Tools/DumpRenderTree/qt/EventSenderQt.h
+++ b/Tools/DumpRenderTree/qt/EventSenderQt.h
@@ -96,7 +96,7 @@
     void timerEvent(QTimerEvent*);
 
 private:
-    bool isGraphicsBased() const { return qobject_cast<WebCore::WebViewGraphicsBased*>(m_page->view()); }
+    bool isGraphicsBased() const { return qobject_cast<WebViewGraphicsBased*>(m_page->view()); }
     QGraphicsSceneMouseEvent* createGraphicsSceneMouseEvent(QEvent::Type, const QPoint& pos, const QPoint& screenPos, Qt::MouseButton, Qt::MouseButtons, Qt::KeyboardModifiers);
     QGraphicsSceneWheelEvent* createGraphicsSceneWheelEvent(QEvent::Type, const QPoint& pos, const QPoint& screenPos, int delta, Qt::KeyboardModifiers, Qt::Orientation);
     void sendEvent(QObject* receiver, QEvent* event);
diff --git a/Tools/DumpRenderTree/qt/GCControllerQt.cpp b/Tools/DumpRenderTree/qt/GCControllerQt.cpp
index a2e5e0c..9f93698 100644
--- a/Tools/DumpRenderTree/qt/GCControllerQt.cpp
+++ b/Tools/DumpRenderTree/qt/GCControllerQt.cpp
@@ -28,16 +28,10 @@
  */
 
 #include "config.h"
-#include "GCControllerQt.h"
+#include "GCController.h"
+
 #include "DumpRenderTreeSupportQt.h"
 
-#include <qwebpage.h>
-
-GCController::GCController(QWebPage* parent)
-    : QObject(parent)
-{
-}
-
 void GCController::collect() const
 {
     DumpRenderTreeSupportQt::garbageCollectorCollect();
@@ -48,7 +42,7 @@
     DumpRenderTreeSupportQt::garbageCollectorCollectOnAlternateThread(waitUntilDone);
 }
 
-unsigned int GCController::getJSObjectCount() const
+size_t GCController::getJSObjectCount() const
 {
     return DumpRenderTreeSupportQt::javaScriptObjectsCount();
 }
diff --git a/Tools/DumpRenderTree/qt/TestRunnerQt.cpp b/Tools/DumpRenderTree/qt/TestRunnerQt.cpp
index 6067514..a62cb4c 100644
--- a/Tools/DumpRenderTree/qt/TestRunnerQt.cpp
+++ b/Tools/DumpRenderTree/qt/TestRunnerQt.cpp
@@ -31,39 +31,34 @@
 
 #include "DumpRenderTreeQt.h"
 #include "DumpRenderTreeSupportQt.h"
+#include "NotificationPresenterClientQt.h"
 #include "WorkQueue.h"
 #include "WorkQueueItemQt.h"
+#include <JSStringRefQt.h>
 #include <QCoreApplication>
 #include <QDir>
 #include <QLocale>
 #include <qwebsettings.h>
 
-TestRunner::TestRunner(WebCore::DumpRenderTree* drt)
+TestRunnerQt::TestRunnerQt(DumpRenderTree* drt)
     : QObject()
     , m_drt(drt)
     , m_shouldTimeout(true)
     , m_timeout(30000)
 {
     reset();
-    DumpRenderTreeSupportQt::dumpNotification(true);
 }
 
-void TestRunner::reset()
+TestRunner::~TestRunner()
+{
+}
+
+void TestRunnerQt::reset()
 {
     m_hasDumped = false;
     m_loadFinished = false;
-    m_textDump = false;
-    m_shouldDumpPixels = true;
-    m_dumpBackForwardList = false;
-    m_dumpChildrenAsText = false;
-    m_dumpChildFrameScrollPositions = false;
-    m_canOpenWindows = false;
+    m_audioDump = false;
     m_waitForDone = false;
-    m_disallowIncreaseForApplicationCacheQuota = false;
-    m_dumpTitleChanges = false;
-    m_dumpDatabaseCallbacks = false;
-    m_dumpApplicationCacheDelegateCallbacks = false;
-    m_dumpStatusCallbacks = false;
     m_timeoutTimer.stop();
     m_topLoadingFrame = 0;
     m_waitForPolicy = false;
@@ -71,11 +66,10 @@
     m_webHistory = 0;
     m_globalFlag = false;
     m_userStyleSheetEnabled = false;
-    m_desktopNotificationAllowedOrigins.clear();
     m_ignoreDesktopNotification = false;
     m_isGeolocationPermissionSet = false;
-    m_isPrinting = false;
     m_geolocationPermission = false;
+    m_audioData.clear();
 
     DumpRenderTreeSupportQt::dumpEditingCallbacks(false);
     DumpRenderTreeSupportQt::dumpFrameLoader(false);
@@ -92,15 +86,24 @@
     DumpRenderTreeSupportQt::setCustomPolicyDelegate(false, false);
     DumpRenderTreeSupportQt::dumpHistoryCallbacks(false);
     DumpRenderTreeSupportQt::dumpVisitedLinksCallbacks(false);
-    DumpRenderTreeSupportQt::resetGeolocationMock(m_drt->webPage());
+    DumpRenderTreeSupportQt::resetGeolocationMock(m_drt->pageAdapter());
+    DumpRenderTreeSupportQt::dumpNotification(false);
+    DumpRenderTreeSupportQt::setShouldUseFontSmoothing(false);
+    DumpRenderTreeSupportQt::disableDefaultTypesettingFeatures();
     setIconDatabaseEnabled(false);
     clearAllDatabases();
+    removeAllWebNotificationPermissions();
     // The default state for DRT is to block third-party cookies, mimicing the Mac port
     setAlwaysAcceptCookies(false);
     emit hidePage();
 }
 
-void TestRunner::processWork()
+void TestRunnerQt::dumpNotifications()
+{
+    DumpRenderTreeSupportQt::dumpNotification(true);
+}
+
+void TestRunnerQt::processWork()
 {
     // qDebug() << ">>>processWork";
 
@@ -112,7 +115,7 @@
 }
 
 // Called on loadFinished on WebPage
-void TestRunner::maybeDump(bool /*success*/)
+void TestRunnerQt::maybeDump(bool /*success*/)
 {
 
     // This can happen on any of the http/tests/security/window-events-*.html tests, where the test opens
@@ -143,13 +146,7 @@
     }
 }
 
-void TestRunner::dumpAsText(bool shouldDumpPixels)
-{
-    m_textDump = true;
-    m_shouldDumpPixels = shouldDumpPixels;
-}
-
-void TestRunner::waitUntilDone()
+void TestRunnerQt::waitUntilDone()
 {
     //qDebug() << ">>>>waitForDone";
     m_waitForDone = true;
@@ -160,12 +157,12 @@
     m_timeoutTimer.start(m_timeout, this);
 }
 
-void TestRunner::setViewModeMediaFeature(const QString& mode)
+void TestRunnerQt::setViewModeMediaFeature(const QString& mode)
 {
     m_drt->webPage()->setProperty("_q_viewMode", mode);
 }
 
-int TestRunner::webHistoryItemCount()
+int TestRunnerQt::webHistoryItemCount()
 {
     if (!m_webHistory)
         return -1;
@@ -175,12 +172,12 @@
     return m_webHistory->count() - 1;
 }
 
-void TestRunner::keepWebHistory()
+void TestRunnerQt::keepWebHistory()
 {
     m_webHistory = m_drt->webPage()->history();
 }
 
-void TestRunner::notifyDone()
+void TestRunnerQt::notifyDone()
 {
     qDebug() << ">>>>notifyDone";
 
@@ -204,60 +201,55 @@
     m_waitForPolicy = false;
 }
 
-int TestRunner::windowCount()
+int TestRunnerQt::windowCount()
 {
     return m_drt->windowCount();
 }
 
-void TestRunner::grantWebNotificationPermission(const QString& origin)
+void TestRunnerQt::grantWebNotificationPermission(const QString& origin)
 {
     QWebFrame* frame = m_drt->webPage()->mainFrame();
     m_drt->webPage()->setFeaturePermission(frame, QWebPage::Notifications, QWebPage::PermissionGrantedByUser);
-    m_desktopNotificationAllowedOrigins.append(origin);
 }
 
-void TestRunner::ignoreLegacyWebNotificationPermissionRequests()
+void TestRunnerQt::ignoreLegacyWebNotificationPermissionRequests()
 {
     m_ignoreDesktopNotification = true;
 }
 
-void TestRunner::denyWebNotificationPermission(const QString& origin)
+void TestRunnerQt::denyWebNotificationPermission(const QString& origin)
 {
-    // FIXME: implement.
+    QWebFrame* frame = m_drt->webPage()->mainFrame();
+    m_drt->webPage()->setFeaturePermission(frame, QWebPage::Notifications, QWebPage::PermissionDeniedByUser);
 }
 
-void TestRunner::removeAllWebNotificationPermissions()
+void TestRunnerQt::removeAllWebNotificationPermissions()
 {
-    // FIXME: implement.
+    DumpRenderTreeSupportQt::clearNotificationPermissions();
 }
 
-void TestRunner::simulateWebNotificationClick(const QWebElement& notification)
-{
-    // FIXME: implement.
-}
-
-void TestRunner::simulateLegacyWebNotificationClick(const QString& title)
+void TestRunnerQt::simulateLegacyWebNotificationClick(const QString& title)
 {
     DumpRenderTreeSupportQt::simulateDesktopNotificationClick(title);
 }
 
-void TestRunner::display()
+void TestRunnerQt::display()
 {
-    DumpRenderTreeSupportQt::setTrackRepaintRects(m_topLoadingFrame, true);
+    DumpRenderTreeSupportQt::setTrackRepaintRects(m_topLoadingFrame->handle(), true);
     emit showPage();
 }
 
-void TestRunner::displayInvalidatedRegion()
+void TestRunnerQt::displayInvalidatedRegion()
 {
     display();
 }
 
-void TestRunner::clearBackForwardList()
+void TestRunnerQt::clearBackForwardList()
 {
     m_drt->webPage()->history()->clear();
 }
 
-QString TestRunner::pathToLocalResource(const QString& url)
+QString TestRunnerQt::pathToLocalResource(const QString& url)
 {
     QString localTmpUrl(QLatin1String("file:///tmp/LayoutTests"));
 
@@ -274,82 +266,82 @@
     return url;
 }
 
-void TestRunner::dumpEditingCallbacks()
+void TestRunnerQt::dumpEditingCallbacks()
 {
     qDebug() << ">>>dumpEditingCallbacks";
     DumpRenderTreeSupportQt::dumpEditingCallbacks(true);
 }
 
-void TestRunner::dumpFrameLoadCallbacks()
+void TestRunnerQt::dumpFrameLoadCallbacks()
 {
     DumpRenderTreeSupportQt::dumpFrameLoader(true);
 }
 
-void TestRunner::dumpProgressFinishedCallback()
+void TestRunnerQt::dumpProgressFinishedCallback()
 {
     DumpRenderTreeSupportQt::dumpProgressFinishedCallback(true);
 }
 
-void TestRunner::dumpUserGestureInFrameLoadCallbacks()
+void TestRunnerQt::dumpUserGestureInFrameLoadCallbacks()
 {
     DumpRenderTreeSupportQt::dumpUserGestureInFrameLoader(true);
 }
 
-void TestRunner::dumpResourceLoadCallbacks()
+void TestRunnerQt::dumpResourceLoadCallbacks()
 {
     DumpRenderTreeSupportQt::dumpResourceLoadCallbacks(true);
 }
 
-void TestRunner::dumpResourceResponseMIMETypes()
+void TestRunnerQt::dumpResourceResponseMIMETypes()
 {
     DumpRenderTreeSupportQt::dumpResourceResponseMIMETypes(true);
 }
 
-void TestRunner::dumpWillCacheResponse()
+void TestRunnerQt::dumpWillCacheResponse()
 {
     DumpRenderTreeSupportQt::dumpWillCacheResponseCallbacks(true);
 }
 
-void TestRunner::dumpHistoryCallbacks()
+void TestRunnerQt::dumpHistoryCallbacks()
 {
     DumpRenderTreeSupportQt::dumpHistoryCallbacks(true);
 }
 
-void TestRunner::setWillSendRequestReturnsNullOnRedirect(bool enabled)
+void TestRunnerQt::setWillSendRequestReturnsNullOnRedirect(bool enabled)
 {
     DumpRenderTreeSupportQt::setWillSendRequestReturnsNullOnRedirect(enabled);
 }
 
-void TestRunner::setWillSendRequestReturnsNull(bool enabled)
+void TestRunnerQt::setWillSendRequestReturnsNull(bool enabled)
 {
     DumpRenderTreeSupportQt::setWillSendRequestReturnsNull(enabled);
 }
 
-void TestRunner::setWillSendRequestClearHeader(const QStringList& headers)
+void TestRunnerQt::setWillSendRequestClearHeader(const QStringList& headers)
 {
     DumpRenderTreeSupportQt::setWillSendRequestClearHeaders(headers);
 }
 
-void TestRunner::setDeferMainResourceDataLoad(bool defer)
+void TestRunnerQt::setDeferMainResourceDataLoad(bool defer)
 {
     DumpRenderTreeSupportQt::setDeferMainResourceDataLoad(defer);
 }
 
-void TestRunner::queueBackNavigation(int howFarBackward)
+void TestRunnerQt::queueBackNavigation(int howFarBackward)
 {
     //qDebug() << ">>>queueBackNavigation" << howFarBackward;
     for (int i = 0; i != howFarBackward; ++i)
         WorkQueue::shared()->queue(new BackItem(1, m_drt->webPage()));
 }
 
-void TestRunner::queueForwardNavigation(int howFarForward)
+void TestRunnerQt::queueForwardNavigation(int howFarForward)
 {
     //qDebug() << ">>>queueForwardNavigation" << howFarForward;
     for (int i = 0; i != howFarForward; ++i)
         WorkQueue::shared()->queue(new ForwardItem(1, m_drt->webPage()));
 }
 
-void TestRunner::queueLoad(const QString& url, const QString& target)
+void TestRunnerQt::queueLoad(const QString& url, const QString& target)
 {
     //qDebug() << ">>>queueLoad" << url << target;
     QUrl mainResourceUrl = m_drt->webPage()->mainFrame()->url();
@@ -357,7 +349,7 @@
     WorkQueue::shared()->queue(new LoadItem(absoluteUrl, target, m_drt->webPage()));
 }
 
-void TestRunner::queueLoadHTMLString(const QString& content, const QString& baseURL, const QString& failingURL)
+void TestRunnerQt::queueLoadHTMLString(const QString& content, const QString& baseURL, const QString& failingURL)
 {
     if (failingURL.isEmpty())
         WorkQueue::shared()->queue(new LoadHTMLStringItem(content, baseURL, m_drt->webPage()));
@@ -365,32 +357,32 @@
         WorkQueue::shared()->queue(new LoadAlternateHTMLStringItem(content, baseURL, failingURL, m_drt->webPage()));
 }
 
-void TestRunner::queueReload()
+void TestRunnerQt::queueReload()
 {
     //qDebug() << ">>>queueReload";
     WorkQueue::shared()->queue(new ReloadItem(m_drt->webPage()));
 }
 
-void TestRunner::queueLoadingScript(const QString& script)
+void TestRunnerQt::queueLoadingScript(const QString& script)
 {
     //qDebug() << ">>>queueLoadingScript" << script;
     WorkQueue::shared()->queue(new LoadingScriptItem(script, m_drt->webPage()));
 }
 
-void TestRunner::queueNonLoadingScript(const QString& script)
+void TestRunnerQt::queueNonLoadingScript(const QString& script)
 {
     //qDebug() << ">>>queueNonLoadingScript" << script;
     WorkQueue::shared()->queue(new NonLoadingScriptItem(script, m_drt->webPage()));
 }
 
-void TestRunner::provisionalLoad()
+void TestRunnerQt::provisionalLoad()
 {
     QWebFrame* frame = qobject_cast<QWebFrame*>(sender());
     if (!m_topLoadingFrame && !m_hasDumped)
         m_topLoadingFrame = frame;
 }
 
-void TestRunner::timerEvent(QTimerEvent *ev)
+void TestRunnerQt::timerEvent(QTimerEvent *ev)
 {
     if (ev->timerId() == m_timeoutTimer.timerId()) {
         const char* message = "FAIL: Timed out waiting for notifyDone to be called\n";
@@ -401,134 +393,109 @@
         QObject::timerEvent(ev);
 }
 
-QString TestRunner::encodeHostName(const QString& host)
+QString TestRunnerQt::encodeHostName(const QString& host)
 {
     QString encoded = QString::fromLatin1(QUrl::toAce(host + QLatin1String(".no")));
     encoded.truncate(encoded.length() - 3); // strip .no
     return encoded;
 }
 
-QString TestRunner::decodeHostName(const QString& host)
+QString TestRunnerQt::decodeHostName(const QString& host)
 {
     QString decoded = QUrl::fromAce(host.toLatin1() + QByteArray(".no"));
     decoded.truncate(decoded.length() - 3);
     return decoded;
 }
 
-void TestRunner::closeWebInspector()
+void TestRunnerQt::closeWebInspector()
 {
-    DumpRenderTreeSupportQt::webInspectorClose(m_drt->webPage());
+    DumpRenderTreeSupportQt::webInspectorClose(m_drt->pageAdapter());
     m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, false);
 }
 
-void TestRunner::setDeveloperExtrasEnabled(bool enabled)
+void TestRunnerQt::setDeveloperExtrasEnabled(bool enabled)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, enabled);
 }
 
-void TestRunner::setAsynchronousSpellCheckingEnabled(bool)
-{
-    // FIXME: Implement this.
-}
-
-void TestRunner::showWebInspector()
+void TestRunnerQt::showWebInspector()
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
-    DumpRenderTreeSupportQt::webInspectorShow(m_drt->webPage());
+    DumpRenderTreeSupportQt::webInspectorShow(m_drt->pageAdapter());
 }
 
-void TestRunner::evaluateInWebInspector(long callId, const QString& script)
+void TestRunnerQt::evaluateInWebInspector(long callId, const QString& script)
 {
-    DumpRenderTreeSupportQt::webInspectorExecuteScript(m_drt->webPage(), callId, script);
+    DumpRenderTreeSupportQt::webInspectorExecuteScript(m_drt->pageAdapter(), callId, script);
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool enabled)
+void TestRunnerQt::goBack()
 {
-    DumpRenderTreeSupportQt::setFrameFlatteningEnabled(m_drt->webPage(), enabled);
+    DumpRenderTreeSupportQt::goBack(m_drt->pageAdapter());
 }
 
-void TestRunner::goBack()
+void TestRunnerQt::setDefersLoading(bool flag)
 {
-    DumpRenderTreeSupportQt::goBack(m_drt->webPage());
+    DumpRenderTreeSupportQt::setDefersLoading(m_drt->pageAdapter(), flag);
 }
 
-void TestRunner::setDefersLoading(bool flag)
-{
-    DumpRenderTreeSupportQt::setDefersLoading(m_drt->webPage(), flag);
-}
-
-void TestRunner::setAllowUniversalAccessFromFileURLs(bool enabled)
+void TestRunnerQt::setAllowUniversalAccessFromFileURLs(bool enabled)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, enabled);
 }
 
-void TestRunner::setAllowFileAccessFromFileURLs(bool enabled)
+void TestRunnerQt::setAllowFileAccessFromFileURLs(bool enabled)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, enabled);
 }
 
-void TestRunner::setAppCacheMaximumSize(unsigned long long quota)
+void TestRunnerQt::setAppCacheMaximumSize(unsigned long long quota)
 {
     m_drt->webPage()->settings()->setOfflineWebApplicationCacheQuota(quota);
 }
 
-void TestRunner::setAutofilled(const QWebElement& element, bool isAutofilled)
-{
-    return DumpRenderTreeSupportQt::setAutofilled(element, isAutofilled);
-}
-
-void TestRunner::setValueForUser(const QWebElement& element, const QString& value)
+void TestRunnerQt::setValueForUser(const QWebElement& element, const QString& value)
 {
     DumpRenderTreeSupportQt::setValueForUser(element, value);
 }
 
-void TestRunner::setFixedContentsSize(int width, int height)
+void TestRunnerQt::setFixedContentsSize(int width, int height)
 {
     m_topLoadingFrame->page()->setPreferredContentsSize(QSize(width, height));
 }
 
-void TestRunner::setPrivateBrowsingEnabled(bool enable)
+void TestRunnerQt::setPrivateBrowsingEnabled(bool enable)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, enable);
 }
 
-void TestRunner::setSpatialNavigationEnabled(bool enable)
+void TestRunnerQt::setSpatialNavigationEnabled(bool enable)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::SpatialNavigationEnabled, enable);
 }
 
-void TestRunner::setPopupBlockingEnabled(bool enable)
+void TestRunnerQt::setPopupBlockingEnabled(bool enable)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, !enable);
 }
 
-void TestRunner::setPluginsEnabled(bool flag)
-{
-    // FIXME: Implement
-}
-
-void TestRunner::setPOSIXLocale(const QString& locale)
+void TestRunnerQt::setPOSIXLocale(const QString& locale)
 {
     QLocale qlocale(locale);
     QLocale::setDefault(qlocale);
 } 
 
-void TestRunner::setWindowIsKey(bool isKey)
+void TestRunnerQt::setWindowIsKey(bool isKey)
 {
     m_drt->switchFocus(isKey);
 }
 
-void TestRunner::setMainFrameIsFirstResponder(bool isFirst)
-{
-    //FIXME: only need this for the moment: https://bugs.webkit.org/show_bug.cgi?id=32990
-}
-
-void TestRunner::setJavaScriptCanAccessClipboard(bool enable)
+void TestRunnerQt::setJavaScriptCanAccessClipboard(bool enable)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, enable);
 }
 
-void TestRunner::setXSSAuditorEnabled(bool enable)
+void TestRunnerQt::setXSSAuditorEnabled(bool enable)
 {
     // Set XSSAuditingEnabled globally so that windows created by the test inherit it too.
     // resetSettings() will call this to reset the page and global setting to false again.
@@ -538,121 +505,59 @@
     m_drt->webPage()->settings()->setAttribute(QWebSettings::XSSAuditingEnabled, enable);
 }
 
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(const QString& animationName,
-                                                               double time,
-                                                               const QString& elementId)
-{
-    QWebFrame* frame = m_drt->webPage()->mainFrame();
-    Q_ASSERT(frame);
-    return DumpRenderTreeSupportQt::pauseAnimation(frame, animationName, time, elementId);
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(const QString& propertyName,
-                                                                double time,
-                                                                const QString& elementId)
-{
-    QWebFrame* frame = m_drt->webPage()->mainFrame();
-    Q_ASSERT(frame);
-    return DumpRenderTreeSupportQt::pauseTransitionOfProperty(frame, propertyName, time, elementId);
-}
-
-unsigned TestRunner::numberOfActiveAnimations() const
-{
-    QWebFrame* frame = m_drt->webPage()->mainFrame();
-    Q_ASSERT(frame);
-    return DumpRenderTreeSupportQt::numberOfActiveAnimations(frame);
-}
-
-void TestRunner::disableImageLoading()
-{
-    m_drt->webPage()->settings()->setAttribute(QWebSettings::AutoLoadImages, false);
-}
-
-void TestRunner::dispatchPendingLoadRequests()
-{
-    // FIXME: Implement for testing fix for 6727495
-}
-
-void TestRunner::clearAllApplicationCaches()
+void TestRunnerQt::clearAllApplicationCaches()
 {
     DumpRenderTreeSupportQt::clearAllApplicationCaches();
 }
 
-void TestRunner::clearApplicationCacheForOrigin(const QString& url)
-{
-    // FIXME: Implement to support deleting all application caches for an origin.
-}
-
-long long TestRunner::localStorageDiskUsageForOrigin(const QString& originIdentifier)
-{
-    // FIXME: Implement to support getting disk usage in bytes for an origin.
-    return 0;
-}
-
-void TestRunner::setApplicationCacheOriginQuota(unsigned long long quota)
+void TestRunnerQt::setApplicationCacheOriginQuota(unsigned long long quota)
 {
     if (!m_topLoadingFrame)
         return;
     m_topLoadingFrame->securityOrigin().setApplicationCacheQuota(quota);
 }
 
-long long TestRunner::applicationCacheDiskUsageForOrigin(const QString& origin)
-{
-    // FIXME: Implement to support getting disk usage by all application caches for an origin.
-    return 0;
-}
-
-QStringList TestRunner::originsWithApplicationCache()
+QStringList TestRunnerQt::originsWithApplicationCache()
 {
     // FIXME: Implement to get origins that have application caches.
     return QStringList();
 }
 
-void TestRunner::setCacheModel(int model)
-{
-    // qwebsetting doesn't have matched setting yet :
-    // WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER
-    // WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER
-    // WEBKIT_CACHE_MODEL_WEB_BROWSER
-
-    // FIXME: Implement.
-}
-
-void TestRunner::setDatabaseQuota(int size)
+void TestRunnerQt::setDatabaseQuota(int size)
 {
     if (!m_topLoadingFrame)
         return;
     m_topLoadingFrame->securityOrigin().setDatabaseQuota(size);
 }
 
-void TestRunner::clearAllDatabases()
+void TestRunnerQt::clearAllDatabases()
 {
     QWebDatabase::removeAllDatabases();
 }
 
-void TestRunner::addOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
+void TestRunnerQt::addOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
 {
     DumpRenderTreeSupportQt::whiteListAccessFromOrigin(sourceOrigin, destinationProtocol, destinationHost, allowDestinationSubdomains);
 }
 
-void TestRunner::removeOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
+void TestRunnerQt::removeOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
 {
     DumpRenderTreeSupportQt::removeWhiteListAccessFromOrigin(sourceOrigin, destinationProtocol, destinationHost, allowDestinationSubdomains);
 }
 
-void TestRunner::setCustomPolicyDelegate(bool enabled, bool permissive)
+void TestRunnerQt::setCustomPolicyDelegate(bool enabled, bool permissive)
 {
     DumpRenderTreeSupportQt::setCustomPolicyDelegate(enabled, permissive);
 }
 
-void TestRunner::waitForPolicyDelegate()
+void TestRunnerQt::waitForPolicyDelegate()
 {
     setCustomPolicyDelegate(true);
     m_waitForPolicy = true;
     waitUntilDone();
 }
 
-void TestRunner::overridePreference(const QString& name, const QVariant& value)
+void TestRunnerQt::overridePreference(const QString& name, const QVariant& value)
 {
     QWebSettings* settings = m_topLoadingFrame->page()->settings();
 
@@ -682,12 +587,14 @@
         settings->setAttribute(QWebSettings::AcceleratedCompositingEnabled, value.toBool());
     else if (name == "WebKitDisplayImagesKey")
         settings->setAttribute(QWebSettings::AutoLoadImages, value.toBool());
+    else if (name == "WebKitWebAudioEnabled")
+        settings->setAttribute(QWebSettings::WebAudioEnabled, value.toBool());
     else
         printf("ERROR: TestRunner::overridePreference() does not support the '%s' preference\n",
             name.toLatin1().data());
 }
 
-void TestRunner::setUserStyleSheetLocation(const QString& url)
+void TestRunnerQt::setUserStyleSheetLocation(const QString& url)
 {
     QByteArray urlData = pathToLocalResource(url).toLatin1();
     m_userStyleSheetLocation = QUrl::fromEncoded(urlData, QUrl::StrictMode);
@@ -696,17 +603,17 @@
         setUserStyleSheetEnabled(true);
 }
 
-void TestRunner::setCaretBrowsingEnabled(bool value)
+void TestRunnerQt::setCaretBrowsingEnabled(bool value)
 {
-    DumpRenderTreeSupportQt::setCaretBrowsingEnabled(m_drt->webPage(), value);
+    DumpRenderTreeSupportQt::setCaretBrowsingEnabled(m_drt->pageAdapter(), value);
 }
 
-void TestRunner::setAuthorAndUserStylesEnabled(bool value)
+void TestRunnerQt::setAuthorAndUserStylesEnabled(bool value)
 {
-    DumpRenderTreeSupportQt::setAuthorAndUserStylesEnabled(m_drt->webPage(), value);
+    DumpRenderTreeSupportQt::setAuthorAndUserStylesEnabled(m_drt->pageAdapter(), value);
 }
 
-void TestRunner::setUserStyleSheetEnabled(bool enabled)
+void TestRunnerQt::setUserStyleSheetEnabled(bool enabled)
 {
     m_userStyleSheetEnabled = enabled;
 
@@ -716,22 +623,17 @@
         m_drt->webPage()->settings()->setUserStyleSheetUrl(QUrl());
 }
 
-void TestRunner::setDomainRelaxationForbiddenForURLScheme(bool forbidden, const QString& scheme)
+void TestRunnerQt::setDomainRelaxationForbiddenForURLScheme(bool forbidden, const QString& scheme)
 {
     DumpRenderTreeSupportQt::setDomainRelaxationForbiddenForURLScheme(forbidden, scheme);
 }
 
-int TestRunner::workerThreadCount()
+bool TestRunnerQt::callShouldCloseOnWebView()
 {
-    return DumpRenderTreeSupportQt::workerThreadCount();
+    return DumpRenderTreeSupportQt::shouldClose(m_drt->mainFrameAdapter());
 }
 
-bool TestRunner::callShouldCloseOnWebView()
-{
-    return DumpRenderTreeSupportQt::shouldClose(m_drt->webPage()->mainFrame());
-}
-
-void TestRunner::setScrollbarPolicy(const QString& orientation, const QString& policy)
+void TestRunnerQt::setScrollbarPolicy(const QString& orientation, const QString& policy)
 {
     Qt::Orientation o;
     Qt::ScrollBarPolicy p;
@@ -755,52 +657,51 @@
     m_drt->webPage()->mainFrame()->setScrollBarPolicy(o, p);
 }
 
-void TestRunner::setSmartInsertDeleteEnabled(bool enable)
+void TestRunnerQt::execCommand(const QString& name, const QString& value)
 {
-    DumpRenderTreeSupportQt::setSmartInsertDeleteEnabled(m_drt->webPage(), enable);
+    DumpRenderTreeSupportQt::executeCoreCommandByName(m_drt->pageAdapter(), name, value);
 }
 
-void TestRunner::setSelectTrailingWhitespaceEnabled(bool enable)
+bool TestRunnerQt::isCommandEnabled(const QString& name) const
 {
-    DumpRenderTreeSupportQt::setSelectTrailingWhitespaceEnabled(m_drt->webPage(), enable);
+    return DumpRenderTreeSupportQt::isCommandEnabled(m_drt->pageAdapter(), name);
 }
 
-void TestRunner::execCommand(const QString& name, const QString& value)
+bool TestRunner::findString(JSContextRef context, JSStringRef string, JSObjectRef optionsArray)
 {
-    DumpRenderTreeSupportQt::executeCoreCommandByName(m_drt->webPage(), name, value);
+    JSRetainPtr<JSStringRef> lengthPropertyName(Adopt, JSStringCreateWithUTF8CString("length"));
+    JSValueRef lengthValue = JSObjectGetProperty(context, optionsArray, lengthPropertyName.get(), 0);
+    if (!JSValueIsNumber(context, lengthValue))
+        return false;
+
+    QWebPage::FindFlags findFlags = QWebPage::FindCaseSensitively;
+
+    int length = static_cast<int>(JSValueToNumber(context, lengthValue, 0));
+    for (int i = 0; i < length; ++i) {
+        JSValueRef value = JSObjectGetPropertyAtIndex(context, optionsArray, i, 0);
+        if (!JSValueIsString(context, value))
+            continue;
+
+        JSRetainPtr<JSStringRef> optionName(Adopt, JSValueToStringCopy(context, value, 0));
+        if (JSStringIsEqualToUTF8CString(optionName.get(), "CaseInsensitive"))
+            findFlags &= ~QWebPage::FindCaseSensitively;
+        else if (JSStringIsEqualToUTF8CString(optionName.get(), "AtWordStarts"))
+            findFlags |= QWebPage::FindAtWordBeginningsOnly;
+        else if (JSStringIsEqualToUTF8CString(optionName.get(), "TreatMedialCapitalAsWordStart"))
+            findFlags |=  QWebPage::TreatMedialCapitalAsWordBeginning;
+        else if (JSStringIsEqualToUTF8CString(optionName.get(), "Backwards"))
+            findFlags |=  QWebPage::FindBackward;
+        else if (JSStringIsEqualToUTF8CString(optionName.get(), "WrapAround"))
+            findFlags |=  QWebPage::FindWrapsAroundDocument;
+        else if (JSStringIsEqualToUTF8CString(optionName.get(), "StartInSelection"))
+            findFlags |=  QWebPage::FindBeginsInSelection;
+    }
+
+    DumpRenderTree* drt = DumpRenderTree::instance();
+    return drt->webPage()->findText(JSStringCopyQString(string), findFlags);
 }
 
-bool TestRunner::isCommandEnabled(const QString& name) const
-{
-    return DumpRenderTreeSupportQt::isCommandEnabled(m_drt->webPage(), name);
-}
-
-bool TestRunner::findString(const QString& string, const QStringList& optionArray)
-{
-    return DumpRenderTreeSupportQt::findString(m_drt->webPage(), string, optionArray);
-}
-
-QString TestRunner::markerTextForListItem(const QWebElement& listItem)
-{
-    return DumpRenderTreeSupportQt::markerTextForListItem(listItem);
-}
-
-QVariantMap TestRunner::computedStyleIncludingVisitedInfo(const QWebElement& element) const
-{
-    return DumpRenderTreeSupportQt::computedStyleIncludingVisitedInfo(element);
-}
-
-bool TestRunner::elementDoesAutoCompleteForElementWithId(const QString& elementId)
-{
-    return DumpRenderTreeSupportQt::elementDoesAutoCompleteForElementWithId(m_drt->webPage()->mainFrame(), elementId);
-}
-
-void TestRunner::authenticateSession(const QString&, const QString&, const QString&)
-{
-    // FIXME: If there is a concept per-session (per-process) credential storage, the credentials should be added to it for later use.
-}
-
-void TestRunner::setIconDatabaseEnabled(bool enable)
+void TestRunnerQt::setIconDatabaseEnabled(bool enable)
 {
     if (enable && !m_drt->persistentStoragePath().isEmpty())
         QWebSettings::setIconDatabasePath(m_drt->persistentStoragePath());
@@ -808,142 +709,80 @@
         QWebSettings::setIconDatabasePath(QString());
 }
 
-void TestRunner::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
+void TestRunnerQt::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
 {
-    QList<WebCore::WebPage*> pages = m_drt->getAllPages();
-    foreach (WebCore::WebPage* page, pages)
-        DumpRenderTreeSupportQt::setMockDeviceOrientation(page, canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma);
+    QList<WebPage*> pages = m_drt->getAllPages();
+    foreach (WebPage* page, pages)
+        DumpRenderTreeSupportQt::setMockDeviceOrientation(page->handle(), canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma);
 }
 
-void TestRunner::setGeolocationPermission(bool allow)
+void TestRunnerQt::setGeolocationPermission(bool allow)
 {
     setGeolocationPermissionCommon(allow);
-    QList<WebCore::WebPage*> pages = m_drt->getAllPages();
-    foreach (WebCore::WebPage* page, pages)
-        DumpRenderTreeSupportQt::setMockGeolocationPermission(page, allow);
+    QList<WebPage*> pages = m_drt->getAllPages();
+    foreach (WebPage* page, pages)
+        DumpRenderTreeSupportQt::setMockGeolocationPermission(page->handle(), allow);
 }
 
-int TestRunner::numberOfPendingGeolocationPermissionRequests()
+int TestRunnerQt::numberOfPendingGeolocationPermissionRequests()
 {
     int pendingPermissionCount = 0;
-    QList<WebCore::WebPage*> pages = m_drt->getAllPages();
-    foreach (WebCore::WebPage* page, pages)
-        pendingPermissionCount += DumpRenderTreeSupportQt::numberOfPendingGeolocationPermissionRequests(page);
+    QList<WebPage*> pages = m_drt->getAllPages();
+    foreach (WebPage* page, pages)
+        pendingPermissionCount += DumpRenderTreeSupportQt::numberOfPendingGeolocationPermissionRequests(page->handle());
 
     return pendingPermissionCount;
 }
 
-void TestRunner::setGeolocationPermissionCommon(bool allow)
+void TestRunnerQt::setGeolocationPermissionCommon(bool allow)
 {
      m_isGeolocationPermissionSet = true;
      m_geolocationPermission = allow;
 }
 
-void TestRunner::setMockGeolocationPositionUnavailableError(const QString& message)
+void TestRunnerQt::setMockGeolocationPositionUnavailableError(const QString& message)
 {
-    QList<WebCore::WebPage*> pages = m_drt->getAllPages();
-    foreach (WebCore::WebPage* page, pages)
-        DumpRenderTreeSupportQt::setMockGeolocationPositionUnavailableError(page, message);
+    QList<WebPage*> pages = m_drt->getAllPages();
+    foreach (WebPage* page, pages)
+        DumpRenderTreeSupportQt::setMockGeolocationPositionUnavailableError(page->handle(), message);
 }
 
-void TestRunner::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
+void TestRunnerQt::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
 {
-    QList<WebCore::WebPage*> pages = m_drt->getAllPages();
-    foreach (WebCore::WebPage* page, pages)
-        DumpRenderTreeSupportQt::setMockGeolocationPosition(page, latitude, longitude, accuracy);
+    QList<WebPage*> pages = m_drt->getAllPages();
+    foreach (WebPage* page, pages)
+        DumpRenderTreeSupportQt::setMockGeolocationPosition(page->handle(), latitude, longitude, accuracy);
 }
 
-void TestRunner::addMockSpeechInputResult(const QString& result, double confidence, const QString& language)
+void TestRunnerQt::startSpeechInput(const QString& inputElement)
 {
     // FIXME: Implement for speech input layout tests.
     // See https://bugs.webkit.org/show_bug.cgi?id=39485.
 }
 
-void TestRunner::setMockSpeechInputDumpRect(bool flag)
+void TestRunnerQt::evaluateScriptInIsolatedWorld(int worldID, const QString& script)
 {
-    // FIXME: Implement for speech input layout tests.
-    // See https://bugs.webkit.org/show_bug.cgi?id=39485.
+    DumpRenderTreeSupportQt::evaluateScriptInIsolatedWorld(m_drt->mainFrameAdapter(), worldID, script);
 }
 
-void TestRunner::startSpeechInput(const QString& inputElement)
+void TestRunnerQt::addUserStyleSheet(const QString& sourceCode)
 {
-    // FIXME: Implement for speech input layout tests.
-    // See https://bugs.webkit.org/show_bug.cgi?id=39485.
+    DumpRenderTreeSupportQt::addUserStyleSheet(m_drt->pageAdapter(), sourceCode);
 }
 
-void TestRunner::evaluateScriptInIsolatedWorldAndReturnValue(int worldID, const QString& script)
-{
-    // FIXME: Implement.
-}
-
-void TestRunner::evaluateScriptInIsolatedWorld(int worldID, const QString& script)
-{
-    DumpRenderTreeSupportQt::evaluateScriptInIsolatedWorld(m_drt->webPage()->mainFrame(), worldID, script);
-}
-
-void TestRunner::addUserStyleSheet(const QString& sourceCode)
-{
-    DumpRenderTreeSupportQt::addUserStyleSheet(m_drt->webPage(), sourceCode);
-}
-
-void TestRunner::removeAllVisitedLinks()
+void TestRunnerQt::removeAllVisitedLinks()
 {
     QWebHistory* history = m_drt->webPage()->history();
     history->clear();
     DumpRenderTreeSupportQt::dumpVisitedLinksCallbacks(true);
 }
 
-void TestRunner::addURLToRedirect(const QString& origin, const QString& destination)
+void TestRunnerQt::addURLToRedirect(const QString& origin, const QString& destination)
 {
     DumpRenderTreeSupportQt::addURLToRedirect(origin, destination);
 }
 
-void TestRunner::setMinimumTimerInterval(double minimumTimerInterval)
-{
-    DumpRenderTreeSupportQt::setMinimumTimerInterval(m_drt->webPage(), minimumTimerInterval);
-}
-
-void TestRunner::originsWithLocalStorage()
-{
-    // FIXME: Implement.
-}
-
-void TestRunner::deleteAllLocalStorage()
-{
-    // FIXME: Implement.
-}
-
-void TestRunner::deleteLocalStorageForOrigin(const QString& originIdentifier)
-{
-    // FIXME: Implement.
-}
-
-void TestRunner::observeStorageTrackerNotifications(unsigned number)
-{
-    // FIXME: Implement.
-}
-
-void TestRunner::syncLocalStorage()
-{
-    // FIXME: Implement.
-}
-
-void TestRunner::resetPageVisibility()
-{
-    // FIXME: Implement this.
-}
-
-void TestRunner::setPageVisibility(const char*)
-{
-    // FIXME: Implement this.
-}
-
-void TestRunner::setAutomaticLinkDetectionEnabled(bool)
-{
-    // FIXME: Implement this.
-}
-
-void TestRunner::setTextDirection(const QString& directionName)
+void TestRunnerQt::setTextDirection(const QString& directionName)
 {
     if (directionName == "auto")
         m_drt->webPage()->triggerAction(QWebPage::SetTextDirectionDefault);
@@ -953,7 +792,7 @@
         m_drt->webPage()->triggerAction(QWebPage::SetTextDirectionLeftToRight);
 }
 
-void TestRunner::setAlwaysAcceptCookies(bool accept)
+void TestRunnerQt::setAlwaysAcceptCookies(bool accept)
 {
     QWebSettings* globalSettings = QWebSettings::globalSettings();
     if (accept)
@@ -964,7 +803,7 @@
     }
 }
 
-void TestRunner::setAlwaysBlockCookies(bool block)
+void TestRunnerQt::setAlwaysBlockCookies(bool block)
 {
     QWebSettings* globalSettings = QWebSettings::globalSettings();
     if (block)
@@ -973,5 +812,418 @@
         globalSettings->setThirdPartyCookiePolicy(QWebSettings::AlwaysAllowThirdPartyCookies);
 }
 
-const unsigned TestRunner::maxViewWidth = 800;
-const unsigned TestRunner::maxViewHeight = 600;
+void TestRunnerQt::setAudioData(const QByteArray& audioData)
+{
+    m_audioData = audioData;
+    m_audioDump = true;
+}
+
+const unsigned TestRunnerQt::maxViewWidth = 800;
+const unsigned TestRunnerQt::maxViewHeight = 600;
+
+// --- JSC C API stubs
+
+void TestRunner::addDisallowedURL(JSStringRef url)
+{
+}
+
+void TestRunner::queueLoad(JSStringRef url, JSStringRef target)
+{
+}
+
+void TestRunner::removeAllVisitedLinks()
+{
+}
+
+void TestRunner::setAcceptsEditing(bool)
+{
+}
+
+void TestRunner::simulateLegacyWebNotificationClick(JSStringRef title)
+{
+}
+
+void TestRunner::setWindowIsKey(bool)
+{
+}
+
+void TestRunner::setAlwaysAcceptCookies(bool)
+{
+}
+
+void TestRunner::addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
+{
+}
+
+void TestRunner::setWebViewEditable(bool)
+{
+}
+
+void TestRunner::clearAllApplicationCaches()
+{
+}
+
+void TestRunner::setTextDirection(JSStringRef)
+{
+}
+
+void TestRunner::notifyDone()
+{
+}
+
+int TestRunner::numberOfPendingGeolocationPermissionRequests()
+{
+    return 0;
+}
+
+void TestRunner::overridePreference(JSStringRef key, JSStringRef value)
+{
+}
+
+JSStringRef TestRunner::pathToLocalResource(JSContextRef, JSStringRef url)
+{
+    return JSStringCreateWithUTF8CString(0); // ### Take impl from WTR
+}
+
+void TestRunner::removeAllWebNotificationPermissions()
+{
+}
+
+void TestRunner::simulateWebNotificationClick(JSValueRef notification)
+{
+}
+
+void TestRunner::closeIdleLocalStorageDatabases()
+{
+}
+
+void TestRunner::focusWebView()
+{
+}
+
+void TestRunner::setBackingScaleFactor(double)
+{
+}
+
+void TestRunner::removeChromeInputField()
+{
+}
+
+void TestRunner::addChromeInputField()
+{
+}
+
+JSValueRef TestRunner::originsWithLocalStorage(JSContextRef context)
+{
+    return JSValueMakeNull(context);
+}
+
+void TestRunner::deleteAllLocalStorage()
+{
+}
+
+void TestRunner::deleteLocalStorageForOrigin(JSStringRef originIdentifier)
+{
+}
+
+void TestRunner::observeStorageTrackerNotifications(unsigned number)
+{
+}
+
+void TestRunner::syncLocalStorage()
+{
+}
+
+int TestRunner::windowCount()
+{
+    return 0;
+}
+
+void TestRunner::setWaitToDump(bool)
+{
+}
+
+void TestRunner::waitForPolicyDelegate()
+{
+}
+
+size_t TestRunner::webHistoryItemCount()
+{
+    return 0;
+}
+
+void TestRunner::showWebInspector()
+{
+}
+
+void TestRunner::closeWebInspector()
+{
+}
+
+void TestRunner::evaluateInWebInspector(long callId, JSStringRef script)
+{
+}
+
+void TestRunner::setSerializeHTTPLoads(bool)
+{
+}
+
+void TestRunner::apiTestNewWindowDataLoadBaseURL(JSStringRef utf8Data, JSStringRef baseURL)
+{
+}
+
+void TestRunner::setCustomPolicyDelegate(bool setDelegate, bool permissive)
+{
+}
+
+void TestRunner::setDatabaseQuota(unsigned long long quota)
+{
+}
+
+void TestRunner::setDomainRelaxationForbiddenForURLScheme(bool forbidden, JSStringRef scheme)
+{
+}
+
+void TestRunner::resetPageVisibility()
+{
+}
+
+void TestRunner::keepWebHistory()
+{
+}
+
+void TestRunner::goBack()
+{
+}
+
+JSValueRef TestRunner::originsWithApplicationCache(JSContextRef context)
+{
+    return JSValueMakeNull(context);
+}
+
+long long TestRunner::applicationCacheDiskUsageForOrigin(JSStringRef name)
+{
+    return 0;
+}
+
+void TestRunner::display()
+{
+}
+
+void TestRunner::dispatchPendingLoadRequests()
+{
+}
+
+void TestRunner::clearPersistentUserStyleSheet()
+{
+}
+
+bool TestRunner::callShouldCloseOnWebView()
+{
+    return false;
+}
+
+JSStringRef TestRunner::copyDecodedHostName(JSStringRef name)
+{
+    return JSStringCreateWithUTF8CString(0);
+}
+
+void TestRunner::clearBackForwardList()
+{
+}
+
+void TestRunner::clearAllDatabases()
+{
+}
+
+void TestRunner::clearApplicationCacheForOrigin(JSStringRef name)
+{
+}
+
+void TestRunner::apiTestGoToCurrentBackForwardItem()
+{
+}
+
+void TestRunner::authenticateSession(JSStringRef url, JSStringRef username, JSStringRef password)
+{
+}
+
+void TestRunner::abortModal()
+{
+}
+
+void TestRunner::setStorageDatabaseIdleInterval(double)
+{
+}
+
+void TestRunner::setXSSAuditorEnabled(bool flag)
+{
+}
+
+void TestRunner::setSpatialNavigationEnabled(bool)
+{
+}
+
+void TestRunner::setScrollbarPolicy(JSStringRef orientation, JSStringRef policy)
+{
+}
+
+void TestRunner::setJavaScriptCanAccessClipboard(bool flag)
+{
+}
+
+void TestRunner::setAutomaticLinkDetectionEnabled(bool flag)
+{
+}
+
+void TestRunner::setUserStyleSheetEnabled(bool flag)
+{
+}
+
+void TestRunner::setUserStyleSheetLocation(JSStringRef path)
+{
+}
+
+void TestRunner::setUseDashboardCompatibilityMode(bool flag)
+{
+}
+
+void TestRunner::setTabKeyCyclesThroughElements(bool)
+{
+}
+
+void TestRunner::setPrivateBrowsingEnabled(bool)
+{
+}
+
+void TestRunner::setPluginsEnabled(bool)
+{
+}
+
+void TestRunner::setPopupBlockingEnabled(bool)
+{
+}
+
+void TestRunner::setMockSpeechInputDumpRect(bool flag)
+{
+}
+
+void TestRunner::setPersistentUserStyleSheetLocation(JSStringRef path)
+{
+}
+
+void TestRunner::setMockGeolocationPosition(double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+{
+}
+
+void TestRunner::setMockGeolocationPositionUnavailableError(JSStringRef message)
+{
+}
+
+void TestRunner::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
+{
+}
+
+void TestRunner::setMainFrameIsFirstResponder(bool flag)
+{
+}
+
+void TestRunner::setIconDatabaseEnabled(bool)
+{
+}
+
+void TestRunner::setGeolocationPermission(bool allow)
+{
+}
+
+void TestRunner::setDefersLoading(bool)
+{
+}
+
+void TestRunner::setCacheModel(int)
+{
+}
+
+void TestRunner::setAuthorAndUserStylesEnabled(bool)
+{
+}
+
+void TestRunner::setAllowFileAccessFromFileURLs(bool)
+{
+}
+
+void TestRunner::setAppCacheMaximumSize(unsigned long long quota)
+{
+}
+
+void TestRunner::setAllowUniversalAccessFromFileURLs(bool)
+{
+}
+
+void TestRunner::setApplicationCacheOriginQuota(unsigned long long)
+{
+}
+
+void TestRunner::denyWebNotificationPermission(JSStringRef origin)
+{
+}
+
+void TestRunner::grantWebNotificationPermission(JSStringRef origin)
+{
+}
+
+void TestRunner::setValueForUser(JSContextRef, JSValueRef nodeObject, JSStringRef value)
+{
+}
+
+void TestRunner::setViewModeMediaFeature(JSStringRef)
+{
+}
+
+void TestRunner::setPageVisibility(const char *)
+{
+}
+
+void TestRunner::addMockSpeechInputResult(JSStringRef result, double confidence, JSStringRef language)
+{
+}
+
+void TestRunner::removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
+{
+}
+
+void TestRunner::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
+{
+}
+
+bool TestRunner::isCommandEnabled(JSStringRef name)
+{
+    return false;
+}
+
+void TestRunner::evaluateScriptInIsolatedWorld(unsigned worldID, JSObjectRef globalObject, JSStringRef script)
+{
+}
+
+void TestRunner::evaluateScriptInIsolatedWorldAndReturnValue(unsigned worldID, JSObjectRef globalObject, JSStringRef script)
+{
+}
+
+JSStringRef TestRunner::copyEncodedHostName(JSStringRef name)
+{
+    return JSStringCreateWithUTF8CString(0);
+}
+
+void TestRunner::addUserStyleSheet(JSStringRef source, bool allFrames)
+{
+}
+
+void TestRunner::execCommand(JSStringRef name, JSStringRef value)
+{
+}
+
+long long TestRunner::localStorageDiskUsageForOrigin(JSStringRef originIdentifier)
+{
+    return 0;
+}
+
diff --git a/Tools/DumpRenderTree/qt/TestRunnerQt.h b/Tools/DumpRenderTree/qt/TestRunnerQt.h
index a1c1a48..4b16b8f 100644
--- a/Tools/DumpRenderTree/qt/TestRunnerQt.h
+++ b/Tools/DumpRenderTree/qt/TestRunnerQt.h
@@ -49,34 +49,22 @@
 
 class QWebFrame;
 class DumpRenderTreeSupportQt;
-namespace WebCore {
 class DumpRenderTree;
-}
 
-class TestRunner : public QObject {
+class TestRunnerQt : public QObject {
     Q_OBJECT
     Q_PROPERTY(int webHistoryItemCount READ webHistoryItemCount)
-    Q_PROPERTY(int workerThreadCount READ workerThreadCount)
     Q_PROPERTY(bool globalFlag READ globalFlag WRITE setGlobalFlag)
 public:
-    TestRunner(WebCore::DumpRenderTree*);
+    TestRunnerQt(DumpRenderTree*);
 
-    bool shouldDisallowIncreaseForApplicationCacheQuota() const { return m_disallowIncreaseForApplicationCacheQuota; }
-    bool shouldDumpAsText() const { return m_textDump; }
-    bool shouldDumpPixels() const { return m_shouldDumpPixels; }
-    bool shouldDumpBackForwardList() const { return m_dumpBackForwardList; }
-    bool shouldDumpChildrenAsText() const { return m_dumpChildrenAsText; }
-    bool shouldDumpChildFrameScrollPositions() const { return m_dumpChildFrameScrollPositions; }
-    bool shouldDumpDatabaseCallbacks() const { return m_dumpDatabaseCallbacks; }
-    bool shouldDumpApplicationCacheDelegateCallbacks() const { return m_dumpApplicationCacheDelegateCallbacks; }
-    bool shouldDumpStatusCallbacks() const { return m_dumpStatusCallbacks; }
+    bool shouldDumpAsAudio() const { return m_audioDump; }
     bool shouldWaitUntilDone() const { return m_waitForDone; }
     bool shouldHandleErrorPages() const { return m_handleErrorPages; }
-    bool canOpenWindows() const { return m_canOpenWindows; }
-    bool shouldDumpTitleChanges() const { return m_dumpTitleChanges; }
     bool waitForPolicy() const { return m_waitForPolicy; }
     bool ignoreReqestForPermission() const { return m_ignoreDesktopNotification; }
-    bool isPrinting() { return m_isPrinting; }
+
+    const QByteArray& audioData() const { return m_audioData; }
 
     void reset();
 
@@ -98,20 +86,11 @@
 
 public Q_SLOTS:
     void maybeDump(bool ok);
-    void disallowIncreaseForApplicationCacheQuota() { m_disallowIncreaseForApplicationCacheQuota = true; }
-    void dumpAsText(bool shouldDumpPixels = false);
-    void dumpChildFramesAsText() { m_dumpChildrenAsText = true; }
-    void dumpChildFrameScrollPositions() { m_dumpChildFrameScrollPositions = true; }
-    void dumpDatabaseCallbacks() { m_dumpDatabaseCallbacks = true; }
-    void dumpApplicationCacheDelegateCallbacks() { m_dumpApplicationCacheDelegateCallbacks = true; }
-    void dumpStatusCallbacks() { m_dumpStatusCallbacks = true; }
-    void setCanOpenWindows() { m_canOpenWindows = true; }
-    void setPrinting() { m_isPrinting = true; }
+    void dumpNotifications();
     void waitUntilDone();
     int webHistoryItemCount();
     void keepWebHistory();
     void notifyDone();
-    void dumpBackForwardList() { m_dumpBackForwardList = true; }
     bool globalFlag() const { return m_globalFlag; }
     void setGlobalFlag(bool flag) { m_globalFlag = flag; }
     void handleErrorPages() { m_handleErrorPages = true; }
@@ -134,73 +113,50 @@
     void queueLoadingScript(const QString& script);
     void queueNonLoadingScript(const QString& script);
     void provisionalLoad();
-    void setCloseRemainingWindowsWhenComplete(bool = false) { }
     int windowCount();
     void ignoreLegacyWebNotificationPermissionRequests();
     void simulateLegacyWebNotificationClick(const QString& title);
     void grantWebNotificationPermission(const QString& origin);
     void denyWebNotificationPermission(const QString& origin);
     void removeAllWebNotificationPermissions();
-    void simulateWebNotificationClick(const QWebElement&);
     void display();
     void displayInvalidatedRegion();
     void clearBackForwardList();
     QString pathToLocalResource(const QString& url);
-    void dumpTitleChanges() { m_dumpTitleChanges = true; }
     QString encodeHostName(const QString& host);
     QString decodeHostName(const QString& host);
     void dumpSelectionRect() const { }
     void setDeveloperExtrasEnabled(bool);
-    void setAsynchronousSpellCheckingEnabled(bool);
     void showWebInspector();
     void closeWebInspector();
     void evaluateInWebInspector(long callId, const QString& script);
     void removeAllVisitedLinks();
-    void setFrameFlatteningEnabled(bool);
     void setAllowUniversalAccessFromFileURLs(bool enable);
     void setAllowFileAccessFromFileURLs(bool enable);
     void setAppCacheMaximumSize(unsigned long long quota);
-    void setAutofilled(const QWebElement&, bool enable);
     void setValueForUser(const QWebElement&, const QString& value);
     void setFixedContentsSize(int width, int height);
     void setPrivateBrowsingEnabled(bool);
     void setSpatialNavigationEnabled(bool);
-    void setPluginsEnabled(bool flag);
     void setPopupBlockingEnabled(bool);
     void setPOSIXLocale(const QString& locale);
     void resetLoadFinished() { m_loadFinished = false; }
     void setWindowIsKey(bool);
-    void setMainFrameIsFirstResponder(bool);
     void setDeferMainResourceDataLoad(bool);
     void setJavaScriptCanAccessClipboard(bool enable);
     void setXSSAuditorEnabled(bool);
     void setCaretBrowsingEnabled(bool);
     void setAuthorAndUserStylesEnabled(bool);
     void setViewModeMediaFeature(const QString& mode);
-    void setSmartInsertDeleteEnabled(bool);
-    void setSelectTrailingWhitespaceEnabled(bool);
     void execCommand(const QString& name, const QString& value = QString());
     bool isCommandEnabled(const QString& name) const;
-    bool findString(const QString&, const QStringList& optionArray);
-
-    bool pauseAnimationAtTimeOnElementWithId(const QString& animationName, double time, const QString& elementId);
-    bool pauseTransitionAtTimeOnElementWithId(const QString& propertyName, double time, const QString& elementId);
-    bool elementDoesAutoCompleteForElementWithId(const QString& elementId);
-
-    unsigned numberOfActiveAnimations() const;
 
     void addOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains);
     void removeOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains);
 
-    void dispatchPendingLoadRequests();
-    void disableImageLoading();
-
     void clearAllApplicationCaches();
-    void clearApplicationCacheForOrigin(const QString& url);
     void setApplicationCacheOriginQuota(unsigned long long);
     QStringList originsWithApplicationCache();
-    long long applicationCacheDiskUsageForOrigin(const QString&); 
-    void setCacheModel(int);
 
     void setDatabaseQuota(int size);
     void clearAllDatabases();
@@ -213,15 +169,7 @@
     void setUserStyleSheetLocation(const QString& url);
     void setUserStyleSheetEnabled(bool);
     void setDomainRelaxationForbiddenForURLScheme(bool forbidden, const QString& scheme);
-    int workerThreadCount();
     bool callShouldCloseOnWebView();
-    // For now, this is a no-op. This may change depending on outcome of
-    // https://bugs.webkit.org/show_bug.cgi?id=33333
-    void setCallCloseOnWebViews() { }
-    // This is a no-op - it allows us to pass
-    // plugins/get-url-that-the-resource-load-delegate-will-disallow.html
-    // which is a Mac-specific test.
-    void addDisallowedURL(const QString&) { }
 
     void setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma);
 
@@ -232,18 +180,8 @@
     bool isGeolocationPermissionSet() const { return m_isGeolocationPermissionSet; }
     bool geolocationPermission() const { return m_geolocationPermission; }
 
-    void addMockSpeechInputResult(const QString& result, double confidence, const QString& language);
-    void setMockSpeechInputDumpRect(bool flag);
     void startSpeechInput(const QString& inputElement);
 
-    void setPageVisibility(const char*);
-    void resetPageVisibility();
-
-    void setAutomaticLinkDetectionEnabled(bool);
-
-    // Empty stub method to keep parity with object model exposed by global TestRunner.
-    void abortModal() { }
-
     void addURLToRedirect(const QString& origin, const QString& destination);
 
     /*
@@ -252,30 +190,17 @@
     */
     void setScrollbarPolicy(const QString& orientation, const QString& policy);
 
-    QString markerTextForListItem(const QWebElement& listItem);
-    QVariantMap computedStyleIncludingVisitedInfo(const QWebElement&) const;
-
-    // Simulate a request an embedding application could make, populating per-session credential storage.
-    void authenticateSession(const QString& url, const QString& username, const QString& password);
-
-    void evaluateScriptInIsolatedWorldAndReturnValue(int worldID, const QString& script);
     void evaluateScriptInIsolatedWorld(int worldID, const QString& script);
     void addUserStyleSheet(const QString& sourceCode);
-
-    void setMinimumTimerInterval(double);
     
-    void originsWithLocalStorage();
-    void deleteAllLocalStorage();
-    void deleteLocalStorageForOrigin(const QString& originIdentifier);
-    long long localStorageDiskUsageForOrigin(const QString& originIdentifier);
-    void observeStorageTrackerNotifications(unsigned number);
-    void syncLocalStorage();
     void setTextDirection(const QString& directionName);
     void goBack();
     void setDefersLoading(bool);
     void setAlwaysAcceptCookies(bool);
     void setAlwaysBlockCookies(bool);
 
+    void setAudioData(const QByteArray&);
+
 private Q_SLOTS:
     void processWork();
 
@@ -284,35 +209,27 @@
 
 private:
     bool m_hasDumped;
-    bool m_textDump;
-    bool m_shouldDumpPixels;
+    bool m_audioDump;
     bool m_disallowIncreaseForApplicationCacheQuota;
-    bool m_dumpBackForwardList;
-    bool m_dumpChildrenAsText;
-    bool m_dumpChildFrameScrollPositions;
     bool m_canOpenWindows;
     bool m_waitForDone;
-    bool m_dumpTitleChanges;
-    bool m_dumpDatabaseCallbacks;
-    bool m_dumpApplicationCacheDelegateCallbacks;
-    bool m_dumpStatusCallbacks;
     bool m_waitForPolicy;
     bool m_handleErrorPages;
     bool m_loadFinished;
     bool m_globalFlag;
     bool m_userStyleSheetEnabled;
     bool m_isGeolocationPermissionSet;
-    bool m_isPrinting;
     bool m_geolocationPermission;
 
     QUrl m_userStyleSheetLocation;
     QBasicTimer m_timeoutTimer;
     QWebFrame* m_topLoadingFrame;
-    WebCore::DumpRenderTree* m_drt;
+    DumpRenderTree* m_drt;
     QWebHistory* m_webHistory;
-    QStringList m_desktopNotificationAllowedOrigins;
     bool m_ignoreDesktopNotification;
 
+    QByteArray m_audioData;
+
     bool m_shouldTimeout;
     int m_timeout;
 };
diff --git a/Tools/DumpRenderTree/qt/TextInputControllerQt.cpp b/Tools/DumpRenderTree/qt/TextInputControllerQt.cpp
index d5645a5..38e489d 100644
--- a/Tools/DumpRenderTree/qt/TextInputControllerQt.cpp
+++ b/Tools/DumpRenderTree/qt/TextInputControllerQt.cpp
@@ -149,15 +149,15 @@
 
 QVariantList TextInputController::selectedRange()
 {
-    return DumpRenderTreeSupportQt::selectedRange(qobject_cast<QWebPage*>(parent()));
+    return DumpRenderTreeSupportQt::selectedRange(qobject_cast<QWebPage*>(parent())->handle());
 }
 
 QVariantList TextInputController::firstRectForCharacterRange(int location, int length)
 {
-    return DumpRenderTreeSupportQt::firstRectForCharacterRange(qobject_cast<QWebPage*>(parent()), location, length);
+    return DumpRenderTreeSupportQt::firstRectForCharacterRange(qobject_cast<QWebPage*>(parent())->handle(), location, length);
 }
 
 void TextInputController::unmarkText()
 {
-    DumpRenderTreeSupportQt::confirmComposition(qobject_cast<QWebPage*>(parent()), 0);
+    DumpRenderTreeSupportQt::confirmComposition(qobject_cast<QWebPage*>(parent())->handle(), 0);
 }
diff --git a/Tools/DumpRenderTree/qt/WorkQueueItemQt.cpp b/Tools/DumpRenderTree/qt/WorkQueueItemQt.cpp
index b093366..7cf9fca 100644
--- a/Tools/DumpRenderTree/qt/WorkQueueItemQt.cpp
+++ b/Tools/DumpRenderTree/qt/WorkQueueItemQt.cpp
@@ -81,7 +81,7 @@
     if (!frame)
         return false;
 
-    DumpRenderTreeSupportQt::setAlternateHtml(frame, m_content, QUrl(m_baseURL), QUrl(m_failingURL));
+    DumpRenderTreeSupportQt::setAlternateHtml(frame->handle(), m_content, QUrl(m_baseURL), QUrl(m_failingURL));
     return true;
 }
 
diff --git a/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp b/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp
index 07c28ac..973ba89 100644
--- a/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp
+++ b/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp
@@ -396,7 +396,17 @@
     return 0;
 }
 
-bool AccessibilityUIElement::isActionSupported(JSStringRef action)
+bool AccessibilityUIElement::isPressActionSupported()
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isIncrementActionSupported()
+{
+    return false;
+}
+
+bool AccessibilityUIElement::isDecrementActionSupported()
 {
     return false;
 }
diff --git a/Tools/DumpRenderTree/win/DumpRenderTree.cpp b/Tools/DumpRenderTree/win/DumpRenderTree.cpp
index 173f345..89fa9f7 100644
--- a/Tools/DumpRenderTree/win/DumpRenderTree.cpp
+++ b/Tools/DumpRenderTree/win/DumpRenderTree.cpp
@@ -843,6 +843,7 @@
     preferences->setTabsToLinks(FALSE);
     preferences->setShouldPrintBackgrounds(TRUE);
     preferences->setLoadsImagesAutomatically(TRUE);
+    preferences->setSeamlessIFramesEnabled(TRUE);
 
     if (persistentUserStyleSheetLocation) {
         Vector<wchar_t> urlCharacters(CFStringGetLength(persistentUserStyleSheetLocation.get()));
@@ -864,7 +865,6 @@
         prefsPrivate->setShouldPaintNativeControls(FALSE); // FIXME - need to make DRT pass with Windows native controls <http://bugs.webkit.org/show_bug.cgi?id=25592>
         prefsPrivate->setJavaScriptCanAccessClipboard(TRUE);
         prefsPrivate->setXSSAuditorEnabled(FALSE);
-        prefsPrivate->setFrameFlatteningEnabled(FALSE);
         prefsPrivate->setOfflineWebApplicationCacheEnabled(TRUE);
         prefsPrivate->setLoadsSiteIconsIgnoringImageLoadingPreference(FALSE);
     }
@@ -899,18 +899,10 @@
         WebCoreTestSupport::resetInternalsObject(context);
     }
 
-    COMPtr<IWebViewEditing> viewEditing;
-    if (SUCCEEDED(webView->QueryInterface(&viewEditing)))
-        viewEditing->setSmartInsertDeleteEnabled(TRUE);
-
     COMPtr<IWebViewPrivate> webViewPrivate(Query, webView);
     if (!webViewPrivate)
         return;
 
-    double minimumInterval = 0;
-    if (SUCCEEDED(webViewPrivate->defaultMinimumTimerInterval(&minimumInterval)))
-        webViewPrivate->setMinimumTimerInterval(minimumInterval);
-
     HWND viewWindow;
     if (SUCCEEDED(webViewPrivate->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow))) && viewWindow)
         SetFocus(viewWindow);
diff --git a/Tools/DumpRenderTree/win/EventSender.cpp b/Tools/DumpRenderTree/win/EventSender.cpp
index 76dafd9..5cc73c0 100644
--- a/Tools/DumpRenderTree/win/EventSender.cpp
+++ b/Tools/DumpRenderTree/win/EventSender.cpp
@@ -45,6 +45,9 @@
 #include <wtf/text/WTFString.h>
 
 #define WM_DRT_SEND_QUEUED_EVENT (WM_APP+1)
+#ifndef MAPVK_VK_TO_VSC
+#define MAPVK_VK_TO_VSC 0
+#endif
 
 static bool down;
 static bool dragMode = true;
@@ -434,6 +437,16 @@
     replayingSavedEvents = false;
 }
 
+static int makeKeyDataForScanCode(int virtualKeyCode)
+{
+    unsigned scancode = MapVirtualKey(virtualKeyCode, MAPVK_VK_TO_VSC);
+    int keyData = scancode & 0xFF;
+    scancode = scancode >> 8;
+    if (scancode == 0xe0 || scancode == 0xe1)
+        keyData += KF_EXTENDED;
+    return keyData << 16;
+}
+
 static JSValueRef keyDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     if (argumentCount < 1)
@@ -479,19 +492,25 @@
         virtualKeyCode = VK_SNAPSHOT;
     else if (JSStringIsEqualToUTF8CString(character, "menu"))
         virtualKeyCode = VK_APPS;
-    else if (JSStringIsEqualToUTF8CString(character, "leftControl"))
-        virtualKeyCode = VK_LCONTROL;
-    else if (JSStringIsEqualToUTF8CString(character, "leftShift"))
-        virtualKeyCode = VK_LSHIFT;
-    else if (JSStringIsEqualToUTF8CString(character, "leftAlt"))
-        virtualKeyCode = VK_LMENU;
-    else if (JSStringIsEqualToUTF8CString(character, "rightControl"))
-        virtualKeyCode = VK_RCONTROL;
-    else if (JSStringIsEqualToUTF8CString(character, "rightShift"))
-        virtualKeyCode = VK_RSHIFT;
-    else if (JSStringIsEqualToUTF8CString(character, "rightAlt"))
-        virtualKeyCode = VK_RMENU;
-    else {
+    else if (JSStringIsEqualToUTF8CString(character, "leftControl")) {
+        virtualKeyCode = VK_CONTROL;
+        keyData += makeKeyDataForScanCode(VK_LCONTROL);
+    } else if (JSStringIsEqualToUTF8CString(character, "leftShift")) {
+        virtualKeyCode = VK_SHIFT;
+        keyData += makeKeyDataForScanCode(VK_LSHIFT);
+    } else if (JSStringIsEqualToUTF8CString(character, "leftAlt")) {
+        virtualKeyCode = VK_MENU;
+        keyData += makeKeyDataForScanCode(VK_LMENU);
+    } else if (JSStringIsEqualToUTF8CString(character, "rightControl")) {
+        virtualKeyCode = VK_CONTROL;
+        keyData += makeKeyDataForScanCode(VK_RCONTROL);
+    } else if (JSStringIsEqualToUTF8CString(character, "rightShift")) {
+        virtualKeyCode = VK_SHIFT;
+        keyData += makeKeyDataForScanCode(VK_RSHIFT);
+    } else if (JSStringIsEqualToUTF8CString(character, "rightAlt")) {
+        virtualKeyCode = VK_MENU;
+        keyData += makeKeyDataForScanCode(VK_RMENU);
+    } else {
         charCode = JSStringGetCharactersPtr(character)[0];
         virtualKeyCode = LOBYTE(VkKeyScan(charCode));
         if (WTF::isASCIIUpper(charCode))
diff --git a/Tools/DumpRenderTree/win/TestRunnerWin.cpp b/Tools/DumpRenderTree/win/TestRunnerWin.cpp
index 3e48ade..d5b9810 100644
--- a/Tools/DumpRenderTree/win/TestRunnerWin.cpp
+++ b/Tools/DumpRenderTree/win/TestRunnerWin.cpp
@@ -137,19 +137,6 @@
     return 0;
 }
 
-void TestRunner::disableImageLoading()
-{
-    COMPtr<IWebView> webView;
-    if (FAILED(frame->webView(&webView)))
-        return;
-    
-    COMPtr<IWebPreferences> preferences;
-    if (FAILED(webView->preferences(&preferences)))
-        return;
-    
-    preferences->setLoadsImagesAutomatically(FALSE);
-}
-
 void TestRunner::dispatchPendingLoadRequests()
 {
     // FIXME: Implement for testing fix for 6727495
@@ -173,39 +160,6 @@
     history->setOptionalSharedHistory(sharedHistory.get());
 }
 
-JSValueRef TestRunner::computedStyleIncludingVisitedInfo(JSContextRef context, JSValueRef value)
-{
-    // FIXME: Implement this.
-    return JSValueMakeUndefined(context);
-}
-
-JSRetainPtr<JSStringRef> TestRunner::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
-{
-    COMPtr<IWebView> webView;
-    if (FAILED(frame->webView(&webView)))
-        return 0;
-
-    COMPtr<IWebViewPrivate> webViewPrivate(Query, webView);
-    if (!webViewPrivate)
-        return 0;
-
-    COMPtr<IDOMElement> element;
-    if (FAILED(webViewPrivate->elementFromJS(context, nodeObject, &element)))
-        return 0;
-
-    COMPtr<IDOMElementPrivate> elementPrivate(Query, element);
-    if (!elementPrivate)
-        return 0;
-
-    BSTR textBSTR = 0;
-    if (FAILED(elementPrivate->markerTextForListItem(&textBSTR)))
-        return 0;
-
-    JSRetainPtr<JSStringRef> markerText(Adopt, JSStringCreateWithBSTR(textBSTR));
-    SysFreeString(textBSTR);
-    return markerText;
-}
-
 void TestRunner::waitForPolicyDelegate()
 {
     COMPtr<IWebView> webView;
@@ -238,17 +192,6 @@
     return count;
 }
 
-unsigned TestRunner::workerThreadCount() const
-{
-    COMPtr<IWebWorkersPrivate> workers;
-    if (FAILED(WebKitCreateInstance(CLSID_WebWorkersPrivate, 0, __uuidof(workers), reinterpret_cast<void**>(&workers))))
-        return 0;
-    unsigned count;
-    if (FAILED(workers->workerThreadCount(&count)))
-        return 0;
-    return count;
-}
-
 JSRetainPtr<JSStringRef> TestRunner::platformName() const
 {
     JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("win"));
@@ -359,27 +302,6 @@
     prefsPrivate->setAuthorAndUserStylesEnabled(flag);
 }
 
-void TestRunner::setAutofilled(JSContextRef context, JSValueRef nodeObject, bool autofilled)
-{
-    COMPtr<IWebView> webView;
-    if (FAILED(frame->webView(&webView)))
-        return;
-
-    COMPtr<IWebViewPrivate> webViewPrivate(Query, webView);
-    if (!webViewPrivate)
-        return;
-
-    COMPtr<IDOMElement> element;
-    if (FAILED(webViewPrivate->elementFromJS(context, nodeObject, &element)))
-        return;
-
-    COMPtr<IFormsAutoFillTransition> autofillElement(Query, element);
-    if (!autofillElement)
-        return;
-
-    autofillElement->setAutofilled(autofilled);
-}
-
 void TestRunner::setCustomPolicyDelegate(bool setDelegate, bool permissive)
 {
     COMPtr<IWebView> webView;
@@ -489,23 +411,6 @@
     prefsPrivate->setXSSAuditorEnabled(enabled);
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool enabled)
-{
-    COMPtr<IWebView> webView;
-    if (FAILED(frame->webView(&webView)))
-        return;
-
-    COMPtr<IWebPreferences> preferences;
-    if (FAILED(webView->preferences(&preferences)))
-        return;
-
-    COMPtr<IWebPreferencesPrivate> prefsPrivate(Query, preferences);
-    if (!prefsPrivate)
-        return;
-
-    prefsPrivate->setFrameFlatteningEnabled(enabled);
-}
-
 void TestRunner::setSpatialNavigationEnabled(bool enabled)
 {
     // FIXME: Implement for SpatialNavigation layout tests.
@@ -818,32 +723,6 @@
     ::SendMessage(webViewWindow, flag ? WM_SETFOCUS : WM_KILLFOCUS, (WPARAM)::GetDesktopWindow(), 0);
 }
 
-void TestRunner::setSmartInsertDeleteEnabled(bool flag)
-{
-    COMPtr<IWebView> webView;
-    if (FAILED(frame->webView(&webView)))
-        return;
-
-    COMPtr<IWebViewEditing> viewEditing;
-    if (FAILED(webView->QueryInterface(&viewEditing)))
-        return;
-
-    viewEditing->setSmartInsertDeleteEnabled(flag ? TRUE : FALSE);
-}
-
-void TestRunner::setSelectTrailingWhitespaceEnabled(bool flag)
-{
-    COMPtr<IWebView> webView;
-    if (FAILED(frame->webView(&webView)))
-        return;
-
-    COMPtr<IWebViewEditing> viewEditing;
-    if (FAILED(webView->QueryInterface(&viewEditing)))
-        return;
-
-    viewEditing->setSelectTrailingWhitespaceEnabled(flag ? TRUE : FALSE);
-}
-
 static const CFTimeInterval waitToDumpWatchdogInterval = 30.0;
 
 static void CALLBACK waitUntilDoneWatchdogFired(HWND, UINT, UINT_PTR, DWORD)
@@ -863,32 +742,6 @@
     return openWindows().size();
 }
 
-bool TestRunner::elementDoesAutoCompleteForElementWithId(JSStringRef id)
-{
-    COMPtr<IDOMDocument> document;
-    if (FAILED(frame->DOMDocument(&document)))
-        return false;
-
-    wstring idWstring = jsStringRefToWString(id);
-    BSTR idBSTR = SysAllocStringLen((OLECHAR*)idWstring.c_str(), idWstring.length());
-    COMPtr<IDOMElement> element;
-    HRESULT result = document->getElementById(idBSTR, &element);
-    SysFreeString(idBSTR);
-
-    if (FAILED(result))
-        return false;
-
-    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
-    if (!framePrivate)
-        return false;
-
-    BOOL autoCompletes;
-    if (FAILED(framePrivate->elementDoesAutoComplete(element.get(), &autoCompletes)))
-        return false;
-
-    return autoCompletes;
-}
-
 void TestRunner::execCommand(JSStringRef name, JSStringRef value)
 {
     wstring wName = jsStringRefToWString(name);
@@ -1026,69 +879,6 @@
     printf("ERROR: TestRunner::setAppCacheMaximumSize() not implemented\n");
 }
 
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
-{
-    COMPtr<IDOMDocument> document;
-    if (FAILED(frame->DOMDocument(&document)))
-        return false;
-
-    BSTR idBSTR = JSStringCopyBSTR(elementId);
-    COMPtr<IDOMElement> element;
-    HRESULT hr = document->getElementById(idBSTR, &element);
-    SysFreeString(idBSTR);
-    if (FAILED(hr))
-        return false;
-
-    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
-    if (!framePrivate)
-        return false;
-
-    BSTR nameBSTR = JSStringCopyBSTR(animationName);
-    BOOL wasRunning = FALSE;
-    hr = framePrivate->pauseAnimation(nameBSTR, element.get(), time, &wasRunning);
-    SysFreeString(nameBSTR);
-
-    return SUCCEEDED(hr) && wasRunning;
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
-{
-    COMPtr<IDOMDocument> document;
-    if (FAILED(frame->DOMDocument(&document)))
-        return false;
-
-    BSTR idBSTR = JSStringCopyBSTR(elementId);
-    COMPtr<IDOMElement> element;
-    HRESULT hr = document->getElementById(idBSTR, &element);
-    SysFreeString(idBSTR);
-    if (FAILED(hr))
-        return false;
-
-    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
-    if (!framePrivate)
-        return false;
-
-    BSTR nameBSTR = JSStringCopyBSTR(propertyName);
-    BOOL wasRunning = FALSE;
-    hr = framePrivate->pauseTransition(nameBSTR, element.get(), time, &wasRunning);
-    SysFreeString(nameBSTR);
-
-    return SUCCEEDED(hr) && wasRunning;
-}
-
-unsigned TestRunner::numberOfActiveAnimations() const
-{
-    COMPtr<IWebFramePrivate> framePrivate(Query, frame);
-    if (!framePrivate)
-        return 0;
-
-    UINT number = 0;
-    if (FAILED(framePrivate->numberOfActiveAnimations(&number)))
-        return 0;
-
-    return number;
-}
-
 static _bstr_t bstrT(JSStringRef jsString)
 {
     // The false parameter tells the _bstr_t constructor to adopt the BSTR we pass it.
@@ -1162,11 +952,6 @@
     prefsPrivate->setDeveloperExtrasEnabled(enabled);
 }
 
-void TestRunner::setAsynchronousSpellCheckingEnabled(bool)
-{
-    // FIXME: Implement this.
-}
-
 void TestRunner::showWebInspector()
 {
     COMPtr<IWebView> webView;
@@ -1357,19 +1142,6 @@
     // FIXME: Implement.
 }
 
-void TestRunner::setMinimumTimerInterval(double minimumTimerInterval)
-{
-    COMPtr<IWebView> webView;
-    if (FAILED(frame->webView(&webView)))
-        return;
-
-    COMPtr<IWebViewPrivate> viewPrivate(Query, webView);
-    if (!viewPrivate)
-        return;
-
-    viewPrivate->setMinimumTimerInterval(minimumTimerInterval);
-}
-
 void TestRunner::setTextDirection(JSStringRef direction)
 {
     COMPtr<IWebFramePrivate> framePrivate(Query, frame);
@@ -1431,17 +1203,12 @@
     // FIXME: Implement this.
 }
 
-void TestRunner::sendWebIntentResponse(JSStringRef)
-{
-    // FIXME: Implement this.
-}
-
-void TestRunner::deliverWebIntent(JSStringRef, JSStringRef, JSStringRef)
-{
-    // FIXME: Implement this.
-}
-
 void TestRunner::setStorageDatabaseIdleInterval(double)
 {
     // FIXME: Implement this.
 }
+
+void TestRunner::closeIdleLocalStorageDatabases()
+{
+    // FIXME: Implement this.
+}
diff --git a/Tools/DumpRenderTree/wx/TestRunnerWx.cpp b/Tools/DumpRenderTree/wx/TestRunnerWx.cpp
index 35a9137..bb8d71a 100644
--- a/Tools/DumpRenderTree/wx/TestRunnerWx.cpp
+++ b/Tools/DumpRenderTree/wx/TestRunnerWx.cpp
@@ -151,11 +151,6 @@
     // FIXME: implement
 }
 
-void TestRunner::setSmartInsertDeleteEnabled(bool flag)
-{
-    // FIXME: implement
-}
-
 void TestRunner::setWaitToDump(bool waitUntilDone)
 {
     static const int timeoutSeconds = 10;
@@ -184,11 +179,6 @@
     // FIXME: implement
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool enabled)
-{
-    // FIXME: implement
-}
-
 void TestRunner::setAllowUniversalAccessFromFileURLs(bool enabled)
 {
     // FIXME: implement
@@ -204,11 +194,6 @@
     // FIXME: implement
 }
 
-void TestRunner::setAutofilled(JSContextRef, JSValueRef element, bool isAutofilled)
-{
-    // FIXME: implement
-}
-
 void TestRunner::setPopupBlockingEnabled(bool popupBlockingEnabled)
 {
     // FIXME: implement
@@ -219,12 +204,6 @@
     // FIXME: Implement
 }
 
-bool TestRunner::elementDoesAutoCompleteForElementWithId(JSStringRef id) 
-{
-    // FIXME: implement
-    return false;
-}
-
 void TestRunner::execCommand(JSStringRef name, JSStringRef value)
 {
     // FIXME: implement
@@ -304,29 +283,6 @@
     // FIXME: implement
 }
 
-unsigned TestRunner::numberOfActiveAnimations() const
-{
-    // FIXME: implement
-    return 0;
-}
-
-unsigned TestRunner::workerThreadCount() const
-{
-    // FIXME: implement
-    return 0;
-}
-
-void TestRunner::setSelectTrailingWhitespaceEnabled(bool flag)
-{
-    // FIXME: implement
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
-{
-    // FIXME: implement
-    return false;
-}
-
 void TestRunner::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
 {
     // FIXME: Implement for DeviceOrientation layout tests.
@@ -380,12 +336,6 @@
     // FIXME: implement
 }
 
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
-{
-    // FIXME: implement
-    return false;
-}
-
 void TestRunner::setCacheModel(int)
 {
     // FIXME: implement
@@ -453,11 +403,6 @@
 
 }
 
-void TestRunner::disableImageLoading()
-{
-
-}
-
 void TestRunner::addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
 {
     // FIXME: implement
@@ -497,16 +442,6 @@
     return false;
 }
 
-JSRetainPtr<JSStringRef> TestRunner::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
-{
-    return 0;
-}
-
-JSValueRef TestRunner::computedStyleIncludingVisitedInfo(JSContextRef, JSValueRef)
-{
-    return 0;
-}
-
 void TestRunner::authenticateSession(JSStringRef, JSStringRef, JSStringRef)
 {
 }
@@ -515,11 +450,6 @@
 {
 }
 
-void TestRunner::setAsynchronousSpellCheckingEnabled(bool)
-{
-    // FIXME: Implement this.
-}
-
 bool TestRunner::findString(JSContextRef context, JSStringRef target, JSObjectRef optionsArray)
 {
     // FIXME: Implement
@@ -531,11 +461,6 @@
     // FIXME: Implement.
 }
 
-void TestRunner::setMinimumTimerInterval(double interval)
-{
-
-}
-
 void TestRunner::syncLocalStorage()
 {
     // FIXME: Implement.
@@ -603,17 +528,12 @@
     // FIXME: Implement this.
 }
 
-void TestRunner::sendWebIntentResponse(JSStringRef)
-{
-    // FIXME: Implement this.
-}
-
-void TestRunner::deliverWebIntent(JSStringRef, JSStringRef, JSStringRef)
-{
-    // FIXME: Implement this.
-}
-
 void TestRunner::setStorageDatabaseIdleInterval(double)
 {
     // FIXME: Implement this.
 }
+
+void TestRunner::closeIdleLocalStorageDatabases()
+{
+    // FIXME: Implement this.
+}
diff --git a/Tools/EWSTools/GoogleComputeEngine/build-chromium-ews.sh b/Tools/EWSTools/GoogleComputeEngine/build-chromium-ews.sh
index eb9355b..6c9e745 100755
--- a/Tools/EWSTools/GoogleComputeEngine/build-chromium-ews.sh
+++ b/Tools/EWSTools/GoogleComputeEngine/build-chromium-ews.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright (c) 2012 Google Inc. All rights reserved.
+# Copyright (c) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -11,9 +11,6 @@
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
 #
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -32,18 +29,32 @@
 exit 1
 fi
 
+CWD="$(pwd)"
+cd "$(dirname "$0")"
+
 QUEUE_TYPE=chromium-ews
 BOT_ID=gce-cr-linux-$1
 BUGZILLA_USERNAME=webkit.review.bot@gmail.com
 read -s -p "Bugzilla Password: " BUGZILLA_PASSWORD && echo
 
-# FIXME: We should use gcutil to find a zone that's actually up.
-ZONE=us-east-b
-IMAGE=projects/google/images/ubuntu-10-04-v20120621
+PROJECT=google.com:webkit
+ZONE=$(bash findzone.sh $PROJECT)
+IMAGE=projects/google/global/images/gcel-10-04-v20130104
+MACHINE_TYPE=n1-standard-4-d
 
-gcutil addinstance $BOT_ID --machine_type=standard-4-cpu-ephemeral-disk --image=$IMAGE --zone=$ZONE --wait_until_running
+gcutil --project=$PROJECT addinstance $BOT_ID --machine_type=$MACHINE_TYPE --image=$IMAGE --zone=$ZONE --wait_until_running
 
 echo "Sleeping for 30s to let the server spin up ssh..."
 sleep 30
 
-gcutil ssh $BOT_ID "sudo apt-get install subversion -y && svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools/EWSTools tools && cd tools && bash cold-boot.sh $QUEUE_TYPE $BOT_ID $BUGZILLA_USERNAME $BUGZILLA_PASSWORD"
+gcutil --project=$PROJECT ssh $BOT_ID "
+    sudo apt-get install subversion -y &&
+    svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools/EWSTools tools &&
+    cd tools &&
+    bash build-vm.sh &&
+    bash build-repo.sh $QUEUE_TYPE $BUGZILLA_USERNAME $BUGZILLA_PASSWORD &&
+    bash build-boot-cmd.sh \"screen -t kr ./start-queue.sh $QUEUE_TYPE $BOT_ID 10\" &&
+    bash boot.sh
+"
+
+cd "$CWD"
diff --git a/Tools/EWSTools/GoogleComputeEngine/build-commit-queue.sh b/Tools/EWSTools/GoogleComputeEngine/build-commit-queue.sh
index a94b020..4ac73c8 100755
--- a/Tools/EWSTools/GoogleComputeEngine/build-commit-queue.sh
+++ b/Tools/EWSTools/GoogleComputeEngine/build-commit-queue.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright (c) 2012 Google Inc. All rights reserved.
+# Copyright (c) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -11,9 +11,6 @@
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
 #
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -32,21 +29,36 @@
 exit 1
 fi
 
+CWD="$(pwd)"
+cd "$(dirname "$0")"
+
 QUEUE_TYPE=commit-queue
 BOT_ID=gce-cq-$1
 BUGZILLA_USERNAME=webkit.review.bot@gmail.com
 read -s -p "Bugzilla Password: " BUGZILLA_PASSWORD && echo
-
 SVN_USERNAME=commit-queue@webkit.org
 read -s -p "Subversion Password: " SVN_PASSWORD && echo
 
-# FIXME: We should use gcutil to find a zone that's actually up.
-ZONE=us-east-b
-IMAGE=projects/google/images/ubuntu-10-04-v20120621
+PROJECT=google.com:webkit
+ZONE=$(bash findzone.sh $PROJECT)
+IMAGE=projects/google/global/images/gcel-10-04-v20130104
+MACHINE_TYPE=n1-standard-4-d
 
-gcutil addinstance $BOT_ID --machine_type=standard-4-cpu-ephemeral-disk --image=$IMAGE --zone=$ZONE --wait_until_running
+gcutil --project=$PROJECT addinstance $BOT_ID --machine_type=$MACHINE_TYPE --image=$IMAGE --zone=$ZONE --wait_until_running
 
 echo "Sleeping for 30s to let the server spin up ssh..."
 sleep 30
 
-gcutil ssh $BOT_ID "sudo apt-get install subversion -y && svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools/EWSTools tools && cd tools && bash configure-svn-auth.sh $SVN_USERNAME $SVN_PASSWORD && bash cold-boot.sh $QUEUE_TYPE $BOT_ID $BUGZILLA_USERNAME $BUGZILLA_PASSWORD"
+gcutil --project=$PROJECT ssh $BOT_ID "
+    sudo apt-get install subversion -y &&
+    svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools/EWSTools tools &&
+    cd tools &&
+    bash configure-svn-config.sh &&
+    bash configure-svn-auth.sh $SVN_USERNAME $SVN_PASSWORD &&
+    bash build-vm.sh &&
+    bash build-repo.sh $QUEUE_TYPE $BUGZILLA_USERNAME $BUGZILLA_PASSWORD &&
+    bash build-boot-cmd.sh \"screen -t kr ./start-queue.sh $QUEUE_TYPE $BOT_ID 10\" &&
+    bash boot.sh
+"
+
+cd "$CWD"
diff --git a/Tools/EWSTools/GoogleComputeEngine/build-cr-linux-debug-ews.sh b/Tools/EWSTools/GoogleComputeEngine/build-cr-linux-debug-ews.sh
new file mode 100755
index 0000000..1cf4e69
--- /dev/null
+++ b/Tools/EWSTools/GoogleComputeEngine/build-cr-linux-debug-ews.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if [[ $# -ne 1 ]];then
+echo "Usage: build-cr-linux-debug-ews.sh BOT_NUMBER"
+exit 1
+fi
+
+CWD="$(pwd)"
+cd "$(dirname "$0")"
+
+QUEUE_TYPE=cr-linux-debug-ews
+BOT_ID=gce-cr-linux-debug-$1
+BUGZILLA_USERNAME=webkit.review.bot@gmail.com
+read -s -p "Bugzilla Password: " BUGZILLA_PASSWORD && echo
+
+PROJECT=google.com:webkit
+ZONE=$(bash findzone.sh $PROJECT)
+IMAGE=projects/google/global/images/gcel-10-04-v20130104
+MACHINE_TYPE=n1-standard-4-d
+
+gcutil --project=$PROJECT addinstance $BOT_ID --machine_type=$MACHINE_TYPE --image=$IMAGE --zone=$ZONE --wait_until_running
+
+echo "Sleeping for 30s to let the server spin up ssh..."
+sleep 30
+
+gcutil --project=$PROJECT ssh $BOT_ID "
+    sudo apt-get install subversion -y &&
+    svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools/EWSTools tools &&
+    cd tools &&
+    bash build-vm.sh &&
+    bash build-repo.sh $QUEUE_TYPE $BUGZILLA_USERNAME $BUGZILLA_PASSWORD &&
+    bash build-boot-cmd.sh \"\\
+screen -t kr ./start-queue.sh -r \\\"configure-clang-linux.sh $QUEUE_TYPE\\\" $QUEUE_TYPE $BOT_ID 10\" &&
+    bash boot.sh
+"
+
+cd "$CWD"
diff --git a/Tools/EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh b/Tools/EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh
new file mode 100755
index 0000000..6297d80
--- /dev/null
+++ b/Tools/EWSTools/GoogleComputeEngine/build-feeder-style-sheriffbot.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if [[ $# -ne 1 ]];then
+echo "Usage: build-feeder-style-sheriffbot.sh BOT_NUMBER"
+exit 1
+fi
+
+CWD="$(pwd)"
+cd "$(dirname "$0")"
+
+BOT_ID=gce-feeder-$1
+BUGZILLA_USERNAME=webkit.review.bot@gmail.com
+read -s -p "Bugzilla Password: " BUGZILLA_PASSWORD && echo
+read -s -p "sheriffbot IRC Password: " IRC_PASSWORD && echo
+
+PROJECT=google.com:webkit
+ZONE=$(bash findzone.sh $PROJECT)
+IMAGE=projects/google/global/images/gcel-10-04-v20130104
+MACHINE_TYPE=n1-standard-4-d
+
+gcutil --project=$PROJECT addinstance $BOT_ID --machine_type=$MACHINE_TYPE --image=$IMAGE --zone=$ZONE --wait_until_running
+
+echo "Sleeping for 30s to let the server spin up ssh..."
+sleep 30
+
+gcutil --project=$PROJECT ssh $BOT_ID "
+    sudo apt-get install subversion -y &&
+    svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools/EWSTools tools &&
+    cd tools &&
+    bash build-vm.sh &&
+    bash build-repo.sh feeder-queue $BUGZILLA_USERNAME $BUGZILLA_PASSWORD &&
+    cp -r /mnt/git/webkit-feeder-queue /mnt/git/webkit-style-queue &&
+    cp -r /mnt/git/webkit-feeder-queue /mnt/git/webkit-sheriff-bot &&
+    bash configure-svn-config.sh &&
+    bash configure-git-svn.sh sheriff-bot &&
+    bash configure-git-user.sh sheriff-bot \"Sheriff Bot\" $BUGZILLA_USERNAME &&
+    bash build-boot-cmd.sh \"\\
+screen -t fq ./start-queue.sh feeder-queue $BOT_ID 10
+screen -t sq ./start-queue.sh style-queue $BOT_ID 10
+screen -t sb ./start-queue.sh -p \\\"--irc-password=$IRC_PASSWORD\\\" sheriff-bot $BOT_ID 180\" &&
+    bash boot.sh
+"
+
+cd "$CWD"
diff --git a/Tools/EWSTools/GoogleComputeEngine/findzone.sh b/Tools/EWSTools/GoogleComputeEngine/findzone.sh
new file mode 100755
index 0000000..ac2cee5
--- /dev/null
+++ b/Tools/EWSTools/GoogleComputeEngine/findzone.sh
@@ -0,0 +1,5 @@
+if [[ $# -ne 1 ]]; then
+    echo "Usage: findzone.sh PROJECT"
+fi
+
+echo $(gcutil --project=$1 listzones | grep UP | awk '{print $2}' | sort | tail -1)
diff --git a/Tools/EWSTools/boot.sh b/Tools/EWSTools/boot.sh
index fb5aadd..787e619 100755
--- a/Tools/EWSTools/boot.sh
+++ b/Tools/EWSTools/boot.sh
@@ -27,4 +27,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-screen -d -m -c ~/tools/screen-config
+CWD=$(pwd)
+
+cd ~/tools
+screen -d -m -c ./screen-config
+
+cd $CWD
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/EWSTools/build-boot-cmd.sh
old mode 100644
new mode 100755
similarity index 77%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/EWSTools/build-boot-cmd.sh
index f06f94e..b22c1fb
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/EWSTools/build-boot-cmd.sh
@@ -1,9 +1,10 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +14,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +27,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+if [[ $# -ne 1 ]];then
+echo "Usage: build-boot-cmd.sh BOOT_COMMAND"
+exit 1
+fi
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+echo "$1" > ~/tools/screen-config
diff --git a/Tools/EWSTools/create-webkit-git b/Tools/EWSTools/build-repo.sh
similarity index 68%
copy from Tools/EWSTools/create-webkit-git
copy to Tools/EWSTools/build-repo.sh
index cbf8ce4..65b0d84 100755
--- a/Tools/EWSTools/create-webkit-git
+++ b/Tools/EWSTools/build-repo.sh
@@ -1,5 +1,5 @@
-#/bin/bash
-# Copyright (c) 2010 Google Inc. All rights reserved.
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -27,16 +27,35 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# These are meant to match the instructions from:
-# http://trac.webkit.org/wiki/UsingGitWithWebKit
+if [[ $# -ne 3 ]];then
+echo "Usage: build-repo.sh QUEUE_TYPE BUGZILLA_USERNAME BUGZILLA_PASSWORD"
+exit 1
+fi
+
+CWD=$(pwd)
+
 cd /mnt/git
-git clone git://git.webkit.org/WebKit.git webkit
-cd webkit
 
-git svn init -T trunk http://svn.webkit.org/repository/webkit
-git update-ref refs/remotes/trunk origin/master
-# It's possible that this "config" step can get merged into an earlier setup step.
-git config --replace-all svn-remote.svn.fetch trunk:refs/remotes/origin/master
+echo "Cloning WebKit git repository, process takes ~30m."
+echo "Note: No status output will be shown via remote pipe."
+git clone git://git.webkit.org/WebKit.git webkit-$1
+cd webkit-$1
 
-git fetch
-git svn rebase
+cat >> .git/config <<EOF
+[bugzilla]
+	username = $2
+	password = $3
+EOF
+
+if [[ $1 == "commit-queue" ]];then
+cat >> .git/config <<EOF
+[svn-remote "svn"]
+	url = http://svn.webkit.org/repository/webkit
+	fetch = trunk:refs/remotes/origin/master
+[user]
+	email = commit-queue@webkit.org
+	name = Commit Queue
+EOF
+fi
+
+cd $CWD
diff --git a/Tools/EWSTools/cold-boot.sh b/Tools/EWSTools/build-vm.sh
similarity index 66%
rename from Tools/EWSTools/cold-boot.sh
rename to Tools/EWSTools/build-vm.sh
index 81516b4..62daca0 100755
--- a/Tools/EWSTools/cold-boot.sh
+++ b/Tools/EWSTools/build-vm.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright (c) 2012 Google Inc. All rights reserved.
+# Copyright (c) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -11,9 +11,6 @@
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
 #
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -27,13 +24,15 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-if [[ $# -ne 4 ]];then
-echo "Usage: cold-boot.sh QUEUE_TYPE BOT_ID BUGZILLA_USERNAME BUGZILLA_PASSWORD"
+if [[ $# -ne 0 ]];then
+echo "Usage: build-vm.sh"
 exit 1
 fi
 
+CWD=$(pwd)
+
 # Format the disk
-cat <<EOF | sudo fdisk /dev/vdb
+cat <<EOF | sudo fdisk /dev/sdb
 n
 p
 1
@@ -42,8 +41,8 @@
 w
 EOF
 
-sudo mkfs.ext4 /dev/vdb1
-sudo mount /dev/vdb1 /mnt
+sudo mkfs.ext4 /dev/sdb1
+sudo mount /dev/sdb1 /mnt
 
 echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
 
@@ -58,29 +57,7 @@
 sudo mkdir -p git
 sudo chown $USER git
 sudo chgrp $USER git
-cd git
 
-git clone http://git.chromium.org/external/Webkit.git
-mv Webkit webkit-$1
-cd webkit-$1
+sudo chmod 644 /etc/hosts
 
-cat >> .git/config <<EOF
-[bugzilla]
-	username = $3
-	password = $4
-EOF
-
-if [[ $1 == "commit-queue" ]];then
-cat >> .git/config <<EOF
-[svn-remote "svn"]
-	url = http://svn.webkit.org/repository/webkit
-	fetch = trunk:refs/remotes/origin/master
-[user]
-	email = commit-queue@webkit.org
-	name = Commit Queue
-EOF
-fi
-
-cd ~/tools
-echo "screen -t kr ./start-queue.sh" $1 $2 > screen-config
-bash boot.sh
+cd $CWD
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/EWSTools/configure-clang-linux.sh
old mode 100644
new mode 100755
similarity index 67%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/EWSTools/configure-clang-linux.sh
index f06f94e..049c206
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/EWSTools/configure-clang-linux.sh
@@ -1,19 +1,17 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +24,11 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+if [[ $# -ne 1 ]];then
+    echo "Usage: configure-clang-linux.sh QUEUE_TYPE"
+    exit 1
+fi
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+bash /mnt/git/$QUEUE_TYPE/Source/WebKit/chromium/tools/clang/scripts/update.sh
+export builddir_name=llvm
+export GYP_DEFINES='clang=1'
\ No newline at end of file
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/EWSTools/configure-git-svn.sh
old mode 100644
new mode 100755
similarity index 67%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/EWSTools/configure-git-svn.sh
index f06f94e..0416125
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/EWSTools/configure-git-svn.sh
@@ -1,19 +1,17 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +24,19 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+if [[ $# -ne 1 ]]; then
+    echo "Usage: configure-git-svn.sh QUEUE_TYPE"
+    exit 1
+fi
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+QUEUE_TYPE=$1
+
+CWD="$(pwd)"
+cd /mnt/git/webkit-$QUEUE_TYPE
+
+# These commands come from the WebKit wiki: http://trac.webkit.org/wiki/UsingGitWithWebKit
+git svn init --prefix=origin/ -T trunk http://svn.webkit.org/repository/webkit
+git config --replace svn-remote.svn.fetch trunk:refs/remotes/origin/master
+git svn fetch --local
+
+cd "$CWD"
\ No newline at end of file
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/EWSTools/configure-git-user.sh
old mode 100644
new mode 100755
similarity index 67%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/EWSTools/configure-git-user.sh
index f06f94e..0c29360
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/EWSTools/configure-git-user.sh
@@ -1,19 +1,17 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +24,22 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+if [[ $# -ne 3 ]]; then
+    echo "Usage: configure-git-user.sh QUEUE_TYPE NAME EMAIL"
+    exit 1
+fi
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+QUEUE_TYPE=$1
+NAME="$2"
+EMAIL=$3
+
+if [[ "$NAME" != *" "* ]]; then
+    echo "NAME parameter must contain a space."
+    exit 1
+fi
+
+cat >> /mnt/git/webkit-$QUEUE_TYPE/.git/config <<EOF
+[user]
+	name = $NAME
+	email = $EMAIL
+EOF
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/EWSTools/configure-svn-config.sh
old mode 100644
new mode 100755
similarity index 67%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/EWSTools/configure-svn-config.sh
index f06f94e..c61fc7e
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/EWSTools/configure-svn-config.sh
@@ -1,19 +1,17 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#!/bin/sh
+# Copyright (c) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +24,4 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
-
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools/svn-config ~/.subversion/config
diff --git a/Tools/EWSTools/screen-config b/Tools/EWSTools/screen-config
index 5c003df..5a00fee 100644
--- a/Tools/EWSTools/screen-config
+++ b/Tools/EWSTools/screen-config
@@ -1,4 +1,4 @@
-screen -t style ./start-queue.sh style-queue
-screen -t qt ./start-queue.sh qt-ews
-screen -t kr ./start-queue.sh chromium-ews
-screen -t gtk ./start-queue.sh gtk-ews
+screen -t style ./start-queue.sh style-queue 10
+screen -t qt ./start-queue.sh qt-ews 10
+screen -t kr ./start-queue.sh chromium-ews 10
+screen -t gtk ./start-queue.sh gtk-ews 10
diff --git a/Tools/EWSTools/start-queue-mac.sh b/Tools/EWSTools/start-queue-mac.sh
new file mode 100755
index 0000000..1168115
--- /dev/null
+++ b/Tools/EWSTools/start-queue-mac.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+# Copyright (c) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if [[ $# -lt 3 ]]; then
+    echo "Usage: start-queue-loop.sh QUEUE_NAME BOT_ID RESET_AFTER_ITERATION [QUEUE_PARAMS]"
+    exit 1
+fi
+
+QUEUE_NAME=$1
+BOT_ID=$2
+RESET_AFTER_ITERATION=$3
+shift 3
+QUEUE_PARAMS="$@"
+
+while :
+do
+    # Delete log files older than 14 days, move aside the main mac-ews.log file to prevent it from growing extra large.
+    cd /Volumes/Data/EWS/$QUEUE_NAME-logs
+    find . -mtime +14 -delete
+    rm $QUEUE_NAME.old
+    mv $QUEUE_NAME.log $QUEUE_NAME.old
+    cd /Volumes/Data/EWS/Webkit
+    
+    # Delete WebKitBuild to force a clean build
+    rm -rf /Volumes/Data/EWS/WebKit/WebKitBuild
+    
+    # This somewhat quirky sequence of steps seems to clear up all the broken
+    # git situations we've gotten ourself into in the past.
+    git clean -f # Remove any left-over layout test results, added files, etc.
+    git rebase --abort # If we got killed during a git rebase, we need to clean up.
+    git fetch origin # Avoid updating the working copy to a stale revision.
+    git checkout origin/master -f
+    git branch -D master
+    git checkout origin/master -b master
+
+    # Most queues auto-update as part of their normal operation, but updating
+    # here makes sure that we get the latest version of the master process.
+    ./Tools/Scripts/update-webkit
+
+    # test-webkitpy has code to remove orphaned .pyc files, so we
+    # run it before running webkit-patch to avoid stale .pyc files
+    # preventing webkit-patch from launching.
+    ./Tools/Scripts/test-webkitpy
+
+    # We use --exit-after-iteration to pick up any changes to webkit-patch, including
+    # changes to the committers.py file.
+    ./Tools/Scripts/webkit-patch $QUEUE_NAME --bot-id=$BOT_ID --no-confirm --exit-after-iteration $RESET_AFTER_ITERATION $QUEUE_PARAMS
+done
diff --git a/Tools/EWSTools/start-queue-win.sh b/Tools/EWSTools/start-queue-win.sh
new file mode 100755
index 0000000..5925271
--- /dev/null
+++ b/Tools/EWSTools/start-queue-win.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+export WEBKIT_BUGZILLA_USERNAME=$1
+export WEBKIT_BUGZILLA_PASSWORD=$2
+export BOT_ID=$3
+
+function error_handler()
+{
+    start_ews
+}
+
+function start_ews()
+{
+    trap 'error_handler ${LINENO} $?' ERR
+
+    while :
+    do
+        date
+        echo "TASK: cleaning up old log files."
+        cd ~/win-ews-logs
+        rm -rf win-ews.old
+        mv win-ews.log win-ews.old
+        find ~/win-ews-logs -mtime +7 -exec rm -f {} \;
+        echo "TASK: Starting up"
+        cd ~/WebKit
+        echo "TASK: Cleaning WebKitBuild"
+        rm -rf WebKitBuild
+        date
+        echo "TASK: Cleaning up"
+        svn cleanup
+        date
+        echo "TASK: svn revert -R *"
+        svn revert -R *
+        date
+        echo "TASK: svn status"
+        svn status | grep "?" | awk '{print $2}' | xargs rm -rf
+        date
+        echo "TASK: webkit-patch clean"
+        ~/WebKit/Tools/Scripts/webkit-patch clean
+        date
+        echo "TASK: svn up --non-interactive"
+        svn up --non-interactive
+        date
+        echo "TASK: kill orphaned tasks"
+        taskkill.exe /f /im cl.exe
+        echo "TASK: webkit-patch win-ews"
+        ~/WebKit/Tools/Scripts/webkit-patch win-ews --bot-id=$BOT_ID --no-confirm --exit-after-iteration 10
+    done
+}
+
+start_ews
\ No newline at end of file
diff --git a/Tools/EWSTools/start-queue.sh b/Tools/EWSTools/start-queue.sh
index 801de99..e1f86b3 100755
--- a/Tools/EWSTools/start-queue.sh
+++ b/Tools/EWSTools/start-queue.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright (c) 2012 Google Inc. All rights reserved.
+# Copyright (c) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -11,9 +11,6 @@
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
 #
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -27,31 +24,63 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+USAGE="Usage: start-queue-loop.sh [OPTIONS] QUEUE_NAME BOT_ID RESET_AFTER_ITERATION
+       -r RESET_SCRIPT    A bash script to be run every cycle just before the queue starts up again.
+       -p QUEUE_PARAMS    Additional parameters to be given to the queue's execution command."
+
+while getopts "r:p:" FLAG
+do
+    case $FLAG in
+    r) RESET_SCRIPT=$OPTARG;;
+    p) QUEUE_PARAMS=$OPTARG;;
+    esac
+done
+
+shift $((OPTIND-1))
+
+if [[ "$#" -ne 3 ]]; then
+    echo "$USAGE"
+    exit 1
+fi
+
 QUEUE_NAME=$1
 BOT_ID=$2
+RESET_AFTER_ITERATION=$3
 
 cd /mnt/git/webkit-$QUEUE_NAME
 while :
 do
-  # This somewhat quirky sequence of steps seems to clear up all the broken
-  # git situations we've gotten ourself into in the past.
-  git clean -f # Remove any left-over layout test results, added files, etc.
-  git rebase --abort # If we got killed during a git rebase, we need to clean up.
-  git fetch origin # Avoid updating the working copy to a stale revision.
-  git checkout origin/master -f
-  git branch -D master
-  git checkout origin/master -b master
+    # This clears any temporary file leaks after running tests.
+    # Not the nicest solution but it will keep the queues running instead of
+    # filling up all remaining disk space.
+    # NOTE: This will clear any Chromium browser temporary files running on the
+    # machine as well. Not advised to run this while using Chrome.
+    find /tmp -name ".org.chromium.Chromium.*" | xargs rm -rf
 
-  # Most queues auto-update as part of their normal operation, but updating
-  # here makes sure that we get the latest version of the master process.
-  ./Tools/Scripts/update-webkit
+    # This somewhat quirky sequence of steps seems to clear up all the broken
+    # git situations we've gotten ourself into in the past.
+    git clean -f -d # Remove any left-over layout test results, added files, etc.
+    git rebase --abort # If we got killed during a git rebase, we need to clean up.
+    git fetch origin # Avoid updating the working copy to a stale revision.
+    git checkout origin/master -f
+    git branch -D master
+    git checkout origin/master -b master
 
-  # test-webkitpy has code to remove orphaned .pyc files, so we
-  # run it before running webkit-patch to avoid stale .pyc files
-  # preventing webkit-patch from launching.
-  ./Tools/Scripts/test-webkitpy
+    # Most queues auto-update as part of their normal operation, but updating
+    # here makes sure that we get the latest version of the master process.
+    ./Tools/Scripts/update-webkit
 
-  # We use --exit-after-iteration to pick up any changes to webkit-patch, including
-  # changes to the committers.py file.
-  ./Tools/Scripts/webkit-patch $QUEUE_NAME --bot-id=$BOT_ID --no-confirm --exit-after-iteration 10
+    # test-webkitpy has code to remove orphaned .pyc files, so we
+    # run it before running webkit-patch to avoid stale .pyc files
+    # preventing webkit-patch from launching.
+    ./Tools/Scripts/test-webkitpy
+
+    # Run the given reset script.
+    if [[ -n "$RESET_SCRIPT" ]]; then
+        bash "$RESET_SCRIPT"
+    fi
+
+    # We use --exit-after-iteration to pick up any changes to webkit-patch, including
+    # changes to the committers.py file.
+    ./Tools/Scripts/webkit-patch $QUEUE_NAME --bot-id=$BOT_ID --no-confirm --exit-after-iteration $RESET_AFTER_ITERATION $QUEUE_PARAMS
 done
diff --git a/Tools/EWebLauncher/CMakeLists.txt b/Tools/EWebLauncher/CMakeLists.txt
index 817231d..05b95fd 100644
--- a/Tools/EWebLauncher/CMakeLists.txt
+++ b/Tools/EWebLauncher/CMakeLists.txt
@@ -1,10 +1,10 @@
-SET(EWebLauncher_SOURCES
+set(EWebLauncher_SOURCES
     ${TOOLS_DIR}/EWebLauncher/url_bar.c
     ${TOOLS_DIR}/EWebLauncher/url_utils.c
     ${TOOLS_DIR}/EWebLauncher/main.c
 )
 
-SET(EWebLauncher_LIBRARIES
+set(EWebLauncher_LIBRARIES
     ${JavaScriptCore_LIBRARY_NAME}
     ${WebCore_LIBRARY_NAME}
     ${WebKit_LIBRARY_NAME}
@@ -15,6 +15,7 @@
     ${ECORE_X_LIBRARIES}
     ${EDJE_LIBRARIES}
     ${EINA_LIBRARIES}
+    ${EO_LIBRARIES}
     ${EVAS_LIBRARIES}
     ${LIBXML2_LIBRARIES}
     ${LIBXSLT_LIBRARIES}
@@ -23,7 +24,7 @@
     ${LIBSOUP_LIBRARIES}
 )
 
-SET(EWebLauncher_INCLUDE_DIRECTORIES
+set(EWebLauncher_INCLUDE_DIRECTORIES
     "${WEBKIT_DIR}/efl/ewk"
     ${CAIRO_INCLUDE_DIRS}
     ${ECORE_INCLUDE_DIRS}
@@ -32,16 +33,17 @@
     ${ECORE_X_INCLUDE_DIRS}
     ${EDJE_INCLUDE_DIRS}
     ${EINA_INCLUDE_DIRS}
+    ${EO_INCLUDE_DIRS}
     ${EVAS_INCLUDE_DIRS}
     ${GLIB_INCLUDE_DIRS}
     ${LIBSOUP_INCLUDE_DIRS}
 )
 
-ADD_DEFINITIONS(-DTHEME_DIR=\"${THEME_BINARY_DIR}\")
+add_definitions(-DTHEME_DIR=\"${THEME_BINARY_DIR}\")
 
-INCLUDE_DIRECTORIES(${EWebLauncher_INCLUDE_DIRECTORIES})
-ADD_EXECUTABLE(EWebLauncher ${EWebLauncher_SOURCES})
-TARGET_LINK_LIBRARIES(EWebLauncher ${EWebLauncher_LIBRARIES})
-SET_TARGET_PROPERTIES(EWebLauncher PROPERTIES FOLDER "Tools")
+include_directories(${EWebLauncher_INCLUDE_DIRECTORIES})
+add_executable(EWebLauncher ${EWebLauncher_SOURCES})
+target_link_libraries(EWebLauncher ${EWebLauncher_LIBRARIES})
+set_target_properties(EWebLauncher PROPERTIES FOLDER "Tools")
 
-ADD_DEPENDENCIES(EWebLauncher ControlTheme)
+add_dependencies(EWebLauncher ControlTheme)
diff --git a/Tools/EWebLauncher/ControlTheme/CMakeLists.txt b/Tools/EWebLauncher/ControlTheme/CMakeLists.txt
index f140733..52ef72e 100644
--- a/Tools/EWebLauncher/ControlTheme/CMakeLists.txt
+++ b/Tools/EWebLauncher/ControlTheme/CMakeLists.txt
@@ -1,6 +1,6 @@
-SET(ControlTheme_DIR "${TOOLS_DIR}/EWebLauncher/ControlTheme")
+set(ControlTheme_DIR "${TOOLS_DIR}/EWebLauncher/ControlTheme")
 
-ADD_CUSTOM_COMMAND(
+add_custom_command(
     OUTPUT ${THEME_BINARY_DIR}/entry.edj
     COMMAND ${EDJE_CC_EXECUTABLE} -v ${ControlTheme_DIR}/entry.edc ${THEME_BINARY_DIR}/entry.edj
     DEPENDS
@@ -8,4 +8,4 @@
     VERBATIM
 )
 
-ADD_CUSTOM_TARGET(ControlTheme DEPENDS ${THEME_BINARY_DIR}/entry.edj)
+add_custom_target(ControlTheme DEPENDS ${THEME_BINARY_DIR}/entry.edj)
diff --git a/Tools/EWebLauncher/main.c b/Tools/EWebLauncher/main.c
index b119243..684800a 100644
--- a/Tools/EWebLauncher/main.c
+++ b/Tools/EWebLauncher/main.c
@@ -126,6 +126,8 @@
              ecore_getopt_callback_geometry_parse, NULL),
         ECORE_GETOPT_STORE_STR
             ('t', "theme", "path to read the theme file from."),
+        ECORE_GETOPT_STORE_DEF_BOOL
+            ('T', "tiled-backing-store", "enable/disable WebCore's tiled backingstore(ewk_view_single only)", 0),
         ECORE_GETOPT_STORE_STR
             ('U', "user-agent", "custom user agent string to use."),
         ECORE_GETOPT_COUNT
@@ -147,6 +149,7 @@
     Eina_Bool quitOption;
     char *backingStore;
     Eina_Bool enableEncodingDetector;
+    Eina_Bool enableTiledBackingStore;
     Eina_Bool isFlattening;
     Eina_Bool isFullscreen;
     Eina_Rectangle geometry;
@@ -847,6 +850,8 @@
     } else {
         app->browser = ewk_view_single_add(app->evas);
         info("backing store: single\n");
+
+        ewk_view_setting_tiled_backing_store_enabled_set(app->browser, userArgs->enableTiledBackingStore);
     }
 
     ewk_view_theme_set(app->browser, themePath);
@@ -932,6 +937,7 @@
     userArgs->quitOption = EINA_FALSE;
     userArgs->backingStore = (char *)backingStores[1];
     userArgs->enableEncodingDetector = EINA_FALSE;
+    userArgs->enableTiledBackingStore = EINA_FALSE;
     userArgs->isFlattening = EINA_FALSE;
     userArgs->isFullscreen = EINA_FALSE;
     userArgs->geometry.x = 0;
@@ -950,6 +956,7 @@
         ECORE_GETOPT_VALUE_BOOL(userArgs->isFullscreen),
         ECORE_GETOPT_VALUE_PTR_CAST(userArgs->geometry),
         ECORE_GETOPT_VALUE_STR(userArgs->theme),
+        ECORE_GETOPT_VALUE_BOOL(userArgs->enableTiledBackingStore),
         ECORE_GETOPT_VALUE_STR(userArgs->userAgent),
         ECORE_GETOPT_VALUE_INT(verbose),
         ECORE_GETOPT_VALUE_BOOL(userArgs->quitOption),
diff --git a/Tools/GNUmakefile.am b/Tools/GNUmakefile.am
index 87b8f6a..debcd24 100644
--- a/Tools/GNUmakefile.am
+++ b/Tools/GNUmakefile.am
@@ -1,6 +1,11 @@
 noinst_PROGRAMS += \
+	Programs/ImageDiff
+
+if ENABLE_WEBKIT1
+noinst_PROGRAMS += \
 	Programs/DumpRenderTree \
 	Programs/GtkLauncher
+endif
 
 # GtkLauncher
 Programs_GtkLauncher_CPPFLAGS = \
@@ -21,16 +26,20 @@
 	-ansi \
 	-fno-strict-aliasing \
 	$(global_cflags) \
+	$(FREETYPE_CFLAGS) \
 	$(GTK_CFLAGS) \
-	$(LIBSOUP_CFLAGS)
+	$(LIBSOUP_CFLAGS) \
+	$(GSTREAMER_CFLAGS)
 
 Programs_GtkLauncher_LDADD = \
 	libwebkitgtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
 	libjavascriptcoregtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
+	$(FREETYPE_LIBS) \
 	$(GTK_LIBS) \
 	$(GLIB_LIBS) \
 	$(LIBSOUP_LIBS) \
-	$(WINMM_LIBS)
+	$(WINMM_LIBS) \
+	$(GSTREAMER_LIBS)
 
 Programs_GtkLauncher_LDFLAGS = \
 	-no-fast-install \
@@ -51,16 +60,23 @@
 	Source/WebCore/testing/InternalSettings.h \
 	Source/WebCore/testing/MockPagePopupDriver.cpp \
 	Source/WebCore/testing/MockPagePopupDriver.h \
+	Source/WebCore/testing/TypeConversions.h \
 	Source/WebCore/testing/js/WebCoreTestSupport.cpp \
 	Source/WebCore/testing/js/WebCoreTestSupport.h
 
 libwebcoreinternals_built_sources += \
+	DerivedSources/WebCore/InternalSettingsGenerated.cpp \
+	DerivedSources/WebCore/InternalSettingsGenerated.h   \
 	DerivedSources/WebCore/JSMallocStatistics.cpp \
 	DerivedSources/WebCore/JSMallocStatistics.h   \
 	DerivedSources/WebCore/JSInternals.cpp \
 	DerivedSources/WebCore/JSInternals.h   \
 	DerivedSources/WebCore/JSInternalSettings.cpp \
-	DerivedSources/WebCore/JSInternalSettings.h
+	DerivedSources/WebCore/JSInternalSettings.h   \
+	DerivedSources/WebCore/JSInternalSettingsGenerated.cpp \
+	DerivedSources/WebCore/JSInternalSettingsGenerated.h \
+	DerivedSources/WebCore/JSTypeConversions.cpp \
+	DerivedSources/WebCore/JSTypeConversions.h
 
 nodist_libWebCoreInternals_la_SOURCES = $(libwebcoreinternals_built_sources)
 BUILT_SOURCES += $(libwebcoreinternals_built_sources)
@@ -71,6 +87,7 @@
 	$(webcoregtk_cppflags) \
 	$(javascriptcore_cppflags) \
 	$(CAIRO_CFLAGS) \
+	$(FREETYPE_CFLAGS) \
 	$(LIBSOUP_CFLAGS) \
 	$(PANGO_CFLAGS) \
 	-I$(top_builddir)/DerivedSources \
@@ -89,6 +106,7 @@
 	$(global_cppflags) \
 	-DTOP_LEVEL_DIR=\"${shell pwd}/${srcdir}\" \
 	-I$(srcdir)/Tools/DumpRenderTree \
+	-I$(srcdir)/Tools/DumpRenderTree/atk \
 	-I$(srcdir)/Tools/DumpRenderTree/cairo \
 	-I$(srcdir)/Tools/DumpRenderTree/gtk \
 	-I$(srcdir)/Source/WebKit/gtk \
@@ -97,6 +115,7 @@
 	-I$(top_builddir)/DerivedSources \
 	-I$(top_builddir)/Source/WebKit/gtk \
 	$(javascriptcore_cppflags) \
+	$(platformgtk_cppflags) \
 	$(webcore_cppflags)
 
 if TARGET_X11
@@ -128,10 +147,12 @@
 	Tools/DumpRenderTree/WorkQueue.h \
 	Tools/DumpRenderTree/WorkQueueItem.h \
 	Tools/DumpRenderTree/config.h \
+	Tools/DumpRenderTree/atk/AccessibilityCallbacks.h \
+	Tools/DumpRenderTree/atk/AccessibilityCallbacksAtk.cpp \
+    	Tools/DumpRenderTree/atk/AccessibilityControllerAtk.cpp \
+	Tools/DumpRenderTree/atk/AccessibilityUIElementAtk.cpp \
 	Tools/DumpRenderTree/cairo/PixelDumpSupportCairo.cpp \
 	Tools/DumpRenderTree/cairo/PixelDumpSupportCairo.h \
-	Tools/DumpRenderTree/gtk/AccessibilityCallbacks.h \
-	Tools/DumpRenderTree/gtk/AccessibilityCallbacks.cpp \
 	Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp \
 	Tools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp \
 	Tools/DumpRenderTree/gtk/DumpRenderTree.cpp \
@@ -148,7 +169,7 @@
 	Tools/DumpRenderTree/gtk/TextInputController.h \
 	Tools/DumpRenderTree/gtk/TextInputController.cpp \
 	Tools/DumpRenderTree/gtk/WorkQueueItemGtk.cpp \
-	Source/WebCore/platform/gtk/GtkVersioning.c
+	Source/Platform/gtk/GtkVersioning.c
 
 Programs_DumpRenderTree_CXXFLAGS = \
 	$(global_cxxflags) \
@@ -165,6 +186,7 @@
 Programs_DumpRenderTree_LDADD = \
 	libjavascriptcoregtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
 	libwebkitgtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
+	libWebCorePlatform.la \
 	libWebCoreModules.la \
 	libWebCoreInternals.la \
 	$(GLOBALDEPS_LIBS) \
@@ -181,10 +203,35 @@
 	-no-fast-install \
 	-no-install
 
+# ImageDiff
+Programs_ImageDiff_CPPFLAGS = $(global_cppflags)
+
+Programs_ImageDiff_SOURCES = \
+   Tools/ImageDiff/gtk/ImageDiff.cpp
+
+Programs_ImageDiff_CXXFLAGS = \
+   $(global_cxxflags) \
+   $(global_cppflags) \
+   $(Programs_ImageDiff_CFLAGS)
+
+Programs_ImageDiff_CFLAGS = \
+   -fno-strict-aliasing \
+   $(global_cflags) \
+   $(GLOBALDEPS_CFLAGS) \
+   $(GTK_CFLAGS)
+
+Programs_ImageDiff_LDADD = \
+   $(GTK_LIBS)
+
+Programs_ImageDiff_LDFLAGS = \
+   -no-fast-install \
+   -no-install
+
 # clean target
 CLEANFILES += \
 	Programs/DumpRenderTree \
-	Programs/GtkLauncher
+	Programs/GtkLauncher \
+	Programs/ImageDiff
 
 if TARGET_X11
 
@@ -221,6 +268,7 @@
 	Tools/DumpRenderTree/TestNetscapePlugIn/Tests/GetURLWithJavaScriptURL.cpp \
 	Tools/DumpRenderTree/TestNetscapePlugIn/Tests/GetURLWithJavaScriptURLDestroyingPlugin.cpp \
 	Tools/DumpRenderTree/TestNetscapePlugIn/Tests/GetUserAgentWithNullNPPFromNPPNew.cpp \
+	Tools/DumpRenderTree/TestNetscapePlugIn/Tests/LogNPPSetWindow.cpp \
 	Tools/DumpRenderTree/TestNetscapePlugIn/Tests/NPDeallocateCalledBeforeNPShutdown.cpp \
 	Tools/DumpRenderTree/TestNetscapePlugIn/Tests/NPPNewFails.cpp \
 	Tools/DumpRenderTree/TestNetscapePlugIn/Tests/NPPSetWindowCalledDuringDestruction.cpp \
@@ -253,10 +301,11 @@
 endif
 
 check-local:
-	$(top_srcdir)/Tools/Scripts/run-gtk-tests
+	$(top_srcdir)/Tools/Scripts/run-gtk-tests --timeout=-1
 
 EXTRA_DIST += \
 	Tools/gtk/common.py \
+	Tools/gtk/generate-feature-defines-files \
 	Tools/gtk/generate-gtkdoc \
 	Tools/gtk/gtkdoc.py \
 	Tools/jhbuild/jhbuildutils.py \
@@ -269,27 +318,27 @@
 .PHONY : docs
 DISTCLEANFILES += docs-build.stamp
 
-if ENABLE_WEBKIT2
-docs-build.stamp: \
-	Source/WebKit/gtk/docs/webkitenvironment.xml \
-	Source/WebKit/gtk/docs/webkitgtk-docs.sgml \
-	Source/WebKit/gtk/docs/webkitgtk-sections.txt \
+docs_build_stamp_list = \
+	Source/WebKit/gtk/docs/webkitenvironment.xml
+
+if ENABLE_WEBKIT1
+docs_build_stamp_list += \
 	libwebkitgtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
+	Source/WebKit/gtk/docs/webkitgtk-docs.sgml \
+	Source/WebKit/gtk/docs/webkitgtk-sections.txt
+endif
+
+if ENABLE_WEBKIT2
+docs_build_stamp_list += \
 	libwebkit2gtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
 	Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml \
 	Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt
-	$(srcdir)/Tools/gtk/generate-gtkdoc
-	@touch docs-build.stamp
-else
-docs-build.stamp: \
-	libwebkitgtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
-	Source/WebKit/gtk/docs/webkitenvironment.xml \
-	Source/WebKit/gtk/docs/webkitgtk-docs.sgml \
-	Source/WebKit/gtk/docs/webkitgtk-sections.txt
-	$(srcdir)/Tools/gtk/generate-gtkdoc
-	@touch docs-build.stamp
 endif
 
+docs-build.stamp: $(doc_build_stamp_list)
+	CC=$(CC) $(srcdir)/Tools/gtk/generate-gtkdoc
+	@touch docs-build.stamp
+
 clean-local: doc-clean-local
 doc-clean-local:
 	@rm -f Documentation/webkitgtk/*~ Documentation/webkitgtk*.bak
@@ -303,6 +352,7 @@
 	-@rmdir Documentation
 
 install-data-local:
+if ENABLE_WEBKIT1
 	@installfiles=`echo ./Documentation/webkitgtk/html/*`; \
 	if test "$$installfiles" = './Documentation/webkitgtk/html/*'; \
 	then echo 1>&2 'No documentation to install' ; \
@@ -323,6 +373,7 @@
 	      $${installdir}/webkitgtk-$(DOC_MODULE_VERSION).devhelp2; \
 	  fi; \
 	fi
+endif
 if ENABLE_WEBKIT2
 	@installfiles=`echo ./Documentation/webkit2gtk/html/*`; \
 	if test "$$installfiles" = './Documentation/webkit2gtk/html/*'; \
@@ -348,6 +399,7 @@
 	@$(AM_V_GEN)$(PYTHON) $(srcdir)/Tools/gtk/generate-gtkdoc --rebase --virtual-root=$${DESTDIR}
 
 uninstall-local:
+if ENABLE_WEBKIT1
 	@DOC_MODULE_VERSION=`cat ./Documentation/webkitgtk/version.xml`; \
 	if test -n "$(DOC_MODULE_VERSION)"; then \
 	  installdir="$(DESTDIR)$(HTML_DIR)/webkitgtk-$(DOC_MODULE_VERSION)"; \
@@ -355,6 +407,7 @@
 	  installdir="$(DESTDIR)$(HTML_DIR)/webkitgtk"; \
 	fi; \
 	rm -rf $${installdir}
+endif
 if ENABLE_WEBKIT2
 	@DOC_MODULE_VERSION=`cat ./Documentation/webkit2gtk/version.xml`; \
 	if test -n "$(DOC_MODULE_VERSION)"; then \
diff --git a/Tools/GtkLauncher/main.c b/Tools/GtkLauncher/main.c
index 942a20b..b6c5bae 100644
--- a/Tools/GtkLauncher/main.c
+++ b/Tools/GtkLauncher/main.c
@@ -25,8 +25,13 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "autotoolsconfig.h"
 #include "LauncherInspectorWindow.h"
 #include <errno.h>
+#include <gdk/gdkkeysyms.h>
+#ifdef WTF_USE_GSTREAMER
+#include <gst/gst.h>
+#endif
 #include <gtk/gtk.h>
 #include <stdlib.h>
 #include <string.h>
@@ -103,6 +108,11 @@
     webkit_web_view_go_forward(webView);
 }
 
+static void reloadCb(GtkWidget* widget, WebKitWebView* webView)
+{
+    webkit_web_view_reload(webView);
+}
+
 static WebKitWebView*
 createWebViewCb(WebKitWebView* webView, WebKitWebFrame* web_frame, GtkWidget* window)
 {
@@ -250,7 +260,7 @@
     return GTK_WIDGET(statusbar);
 }
 
-static GtkWidget* createToolbar(GtkWidget* uriEntry, WebKitWebView* webView)
+static GtkWidget* createToolbar(GtkWidget* window, GtkWidget* uriEntry, WebKitWebView* webView)
 {
     GtkWidget *toolbar = gtk_toolbar_new();
 
@@ -263,6 +273,10 @@
 
     GtkToolItem *item;
 
+    /* Keyboard accelerators */
+    GtkAccelGroup *accelGroup = gtk_accel_group_new();
+    gtk_window_add_accel_group(GTK_WINDOW(window), accelGroup);
+
     /* the back button */
     item = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
     g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(goBackCb), webView);
@@ -273,6 +287,12 @@
     g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(goForwardCb), webView);
     gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
 
+    /* The reload button */
+    item = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH);
+    g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(reloadCb), webView);
+    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
+    gtk_widget_add_accelerator(GTK_WIDGET(item), "clicked", accelGroup, GDK_KEY_F5, 0, GTK_ACCEL_VISIBLE);
+
     /* The URL entry */
     item = gtk_tool_item_new();
     gtk_tool_item_set_expand(item, TRUE);
@@ -312,7 +332,7 @@
     vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
 #endif
     statusbar = createStatusbar(webView);
-    gtk_box_pack_start(GTK_BOX(vbox), createToolbar(uriEntry, webView), FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), createToolbar(window, uriEntry, webView), FALSE, FALSE, 0);
     gtk_box_pack_start(GTK_BOX(vbox), createBrowser(window, uriEntry, statusbar, webView, vbox), TRUE, TRUE, 0);
     gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
 
@@ -487,7 +507,9 @@
     GOptionContext *context = g_option_context_new(0);
     g_option_context_add_main_entries(context, commandLineOptions, 0);
     g_option_context_add_group(context, gtk_get_option_group(TRUE));
-
+#ifdef WTF_USE_GSTREAMER
+    g_option_context_add_group(context, gst_init_get_option_group());
+#endif
     webkitSettings = webkit_web_settings_new();
     g_object_set(webkitSettings, "enable-developer-extras", TRUE, NULL);
     if (!addWebSettingsGroupToContext(context, webkitSettings)) {
diff --git a/Tools/ImageDiff/CMakeLists.txt b/Tools/ImageDiff/CMakeLists.txt
new file mode 100644
index 0000000..f23c3c733
--- /dev/null
+++ b/Tools/ImageDiff/CMakeLists.txt
@@ -0,0 +1,17 @@
+set(IMAGE_DIFF_DIR "${TOOLS_DIR}/ImageDiff")
+
+set(IMAGE_DIFF_INCLUDE_DIRECTORIES
+    ${CMAKE_BINARY_DIR}
+    ${WTF_DIR}
+)
+
+set(IMAGE_DIFF_LIBRARIES
+    ${WTF_LIBRARY_NAME}
+)
+
+INCLUDE_IF_EXISTS(${IMAGE_DIFF_DIR}/Platform${PORT}.cmake)
+
+include_directories(${IMAGE_DIFF_INCLUDE_DIRECTORIES})
+add_executable(ImageDiff ${IMAGE_DIFF_SOURCES})
+target_link_libraries(ImageDiff ${IMAGE_DIFF_LIBRARIES})
+set_target_properties(ImageDiff PROPERTIES FOLDER "Tools")
diff --git a/Tools/DumpRenderTree/qt/ImageDiff.pro b/Tools/ImageDiff/ImageDiff.pro
similarity index 92%
rename from Tools/DumpRenderTree/qt/ImageDiff.pro
rename to Tools/ImageDiff/ImageDiff.pro
index 40bcdfb..f3e8a49 100644
--- a/Tools/DumpRenderTree/qt/ImageDiff.pro
+++ b/Tools/ImageDiff/ImageDiff.pro
@@ -11,4 +11,4 @@
 
 QT = core gui widgets
 
-SOURCES = ImageDiff.cpp
+SOURCES = qt/ImageDiff.cpp
diff --git a/Tools/ImageDiff/PlatformEfl.cmake b/Tools/ImageDiff/PlatformEfl.cmake
new file mode 100644
index 0000000..68b4444
--- /dev/null
+++ b/Tools/ImageDiff/PlatformEfl.cmake
@@ -0,0 +1,19 @@
+set(IMAGE_DIFF_SOURCES
+    ${IMAGE_DIFF_DIR}/efl/ImageDiff.cpp
+)
+
+list(APPEND IMAGE_DIFF_INCLUDE_DIRECTORIES
+    ${ECORE_EVAS_INCLUDE_DIRS}
+    ${ECORE_INCLUDE_DIRS}
+    ${EINA_INCLUDE_DIRS}
+    ${EO_INCLUDE_DIRS}
+    ${EVAS_INCLUDE_DIRS}
+)
+
+list(APPEND IMAGE_DIFF_LIBRARIES
+    ${ECORE_EVAS_LIBRARIES}
+    ${ECORE_LIBRARIES}
+    ${EINA_LIBRARIES}
+    ${EO_LIBRARIES}
+    ${EVAS_LIBRARIES}
+)
diff --git a/Tools/DumpRenderTree/efl/ImageDiff.cpp b/Tools/ImageDiff/efl/ImageDiff.cpp
similarity index 100%
rename from Tools/DumpRenderTree/efl/ImageDiff.cpp
rename to Tools/ImageDiff/efl/ImageDiff.cpp
diff --git a/Tools/DumpRenderTree/gtk/ImageDiff.cpp b/Tools/ImageDiff/gtk/ImageDiff.cpp
similarity index 99%
rename from Tools/DumpRenderTree/gtk/ImageDiff.cpp
rename to Tools/ImageDiff/gtk/ImageDiff.cpp
index e40c33a..7baa25e 100644
--- a/Tools/DumpRenderTree/gtk/ImageDiff.cpp
+++ b/Tools/ImageDiff/gtk/ImageDiff.cpp
@@ -171,14 +171,15 @@
             g_object_unref(differenceImage);
         }
         printf("diff: %01.2f%% failed\n", difference);
-    } else {
+    } else
         printf("diff: %01.2f%% passed\n", difference);
-    }
 }
 
 int main(int argc, char* argv[])
 {
+#if !GLIB_CHECK_VERSION(2, 35, 0)
     g_type_init();
+#endif
 
     GError* error = 0;
     GOptionContext* context = g_option_context_new("- compare two image files, printing their percentage difference and the difference image to stdout");
diff --git a/Tools/DumpRenderTree/qt/ImageDiff.cpp b/Tools/ImageDiff/qt/ImageDiff.cpp
similarity index 84%
rename from Tools/DumpRenderTree/qt/ImageDiff.cpp
rename to Tools/ImageDiff/qt/ImageDiff.cpp
index 537b63d..816086a 100644
--- a/Tools/DumpRenderTree/qt/ImageDiff.cpp
+++ b/Tools/ImageDiff/qt/ImageDiff.cpp
@@ -31,7 +31,7 @@
 {
     QCoreApplication app(argc, argv);
 
-    qreal tolerance = 0;
+    qreal tolerance = 0; // Tolerated percentage of error pixels.
 
     QStringList args = app.arguments();
     for (int i = 0; i < argc; ++i)
@@ -70,7 +70,7 @@
                 // Convert into QImage
                 QImage decodedImage;
                 decodedImage.loadFromData(data.data(), "PNG");
-                decodedImage.convertToFormat(QImage::Format_ARGB32);
+                decodedImage = decodedImage.convertToFormat(QImage::Format_ARGB32);
 
                 // Place it in the right place
                 if (actualImage.isNull())
@@ -93,11 +93,9 @@
                 int h = actualImage.height();
                 QImage diffImage(w, h, QImage::Format_ARGB32);
 
-                int count = 0;
-                qreal sum = 0;
-                qreal maxDistance = 0;
+                int errorCount = 0;
 
-                for (int x = 0; x < w; ++x)
+                for (int x = 0; x < w; ++x) {
                     for (int y = 0; y < h; ++y) {
                         QRgb pixel = actualImage.pixel(x, y);
                         QRgb basePixel = baselineImage.pixel(x, y);
@@ -106,26 +104,19 @@
                         qreal blue = (qBlue(pixel) - qBlue(basePixel)) / static_cast<float>(qMax(255 - qBlue(basePixel), qBlue(basePixel)));
                         qreal alpha = (qAlpha(pixel) - qAlpha(basePixel)) / static_cast<float>(qMax(255 - qAlpha(basePixel), qAlpha(basePixel)));
                         qreal distance = qSqrt(red * red + green * green + blue * blue + alpha * alpha) / 2.0f;
-                        int gray = distance * qreal(255);
-                        diffImage.setPixel(x, y, qRgb(gray, gray, gray));
                         if (distance >= 1 / qreal(255)) {
-                            count++;
-                            sum += distance;
-                            maxDistance = qMax(maxDistance, distance);
-                        }
+                            errorCount++;
+                            diffImage.setPixel(x, y, qRgb(255, 0, 0));
+                        } else
+                            diffImage.setPixel(x, y, qRgba(qRed(basePixel), qGreen(basePixel), qBlue(basePixel), qAlpha(basePixel) * 0.5));
+                    }
                 }
 
                 qreal difference = 0;
-                if (count)
-                    difference = 100 * sum / static_cast<qreal>(w * h);
-                if (difference <= tolerance) {
-                    difference = 0;
-                } else {
-                    difference = qRound(difference * 100) / 100.0f;
-                    difference = qMax(difference, qreal(0.01));
-                }
+                if (errorCount)
+                    difference = 100 * errorCount / static_cast<qreal>(w * h);
 
-                if (!difference)
+                if (difference <= tolerance)
                     fprintf(stdout, "diff: %01.2f%% passed\n", difference);
                 else {
                     QBuffer buffer;
diff --git a/Tools/Makefile b/Tools/Makefile
index adc3ae6..57f8b74 100644
--- a/Tools/Makefile
+++ b/Tools/Makefile
@@ -1,5 +1,11 @@
 MODULES = DumpRenderTree WebKitTestRunner MiniBrowser ../Source/ThirdParty/gtest/xcode TestWebKitAPI
 
+ifneq (,$(findstring iphoneos,$(SDKROOT)))
+	MODULES = ../Source/ThirdParty/gtest/xcode TestWebKitAPI
+else ifneq (,$(findstring iphonesimulator,$(SDKROOT)))
+	MODULES = DumpRenderTree ../Source/ThirdParty/gtest/xcode TestWebKitAPI
+endif
+
 all:
 	@for dir in $(MODULES); do ${MAKE} $@ -C $$dir; exit_status=$$?; \
 	if [ $$exit_status -ne 0 ]; then exit $$exit_status; fi; done
diff --git a/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj b/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj
index 68dadb5..2256445 100644
--- a/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj
+++ b/Tools/MiniBrowser/MiniBrowser.xcodeproj/project.pbxproj
@@ -86,8 +86,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
-				BC8FB5A8116AA1FE0080D413 /* WebKit2.framework in Frameworks */,
 				0F7EB6E3134113C300F4D865 /* WebKit.framework in Frameworks */,
+				BC8FB5A8116AA1FE0080D413 /* WebKit2.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -95,8 +95,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				0F7EB879134113F200F4D865 /* WebKit.framework in Frameworks */,
 				BC20545E11C96C92008F3375 /* Cocoa.framework in Frameworks */,
+				0F7EB879134113F200F4D865 /* WebKit.framework in Frameworks */,
 				BCBD384411B08AAD00E01E54 /* WebKit2.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -107,18 +107,18 @@
 		080E96DDFE201D6D7F000001 /* MiniBrowser */ = {
 			isa = PBXGroup;
 			children = (
-				BC72B89A11E57E8A001EB4EA /* Info.plist */,
-				BC329486116A92E2008635D0 /* main.m */,
 				256AC3D80F4B6AC300CF3369 /* AppDelegate.h */,
 				256AC3D90F4B6AC300CF3369 /* AppDelegate.m */,
 				0FE6439F161FA8940059E3FF /* BrowserWindowController.h */,
 				0FE643A0161FA8940059E3FF /* BrowserWindowController.m */,
+				BC72B89A11E57E8A001EB4EA /* Info.plist */,
+				BC329486116A92E2008635D0 /* main.m */,
+				51E244F811EFCE07008228D1 /* MBToolbarItem.h */,
+				51E244F911EFCE07008228D1 /* MBToolbarItem.m */,
 				0FE643A2161FAC660059E3FF /* WK1BrowserWindowController.h */,
 				0FE643A3161FAC660059E3FF /* WK1BrowserWindowController.m */,
 				BC329496116A941B008635D0 /* WK2BrowserWindowController.h */,
 				BC329497116A941B008635D0 /* WK2BrowserWindowController.m */,
-				51E244F811EFCE07008228D1 /* MBToolbarItem.h */,
-				51E244F911EFCE07008228D1 /* MBToolbarItem.m */,
 			);
 			name = MiniBrowser;
 			sourceTree = "<group>";
@@ -274,8 +274,8 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				BC72B89511E57E07001EB4EA /* MainMenu.xib in Resources */,
 				BC72B89611E57E0F001EB4EA /* BrowserWindow.xib in Resources */,
+				BC72B89511E57E07001EB4EA /* MainMenu.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -294,11 +294,11 @@
 			buildActionMask = 2147483647;
 			files = (
 				256AC3DA0F4B6AC300CF3369 /* AppDelegate.m in Sources */,
-				BC329487116A92E2008635D0 /* main.m in Sources */,
-				BC329498116A941B008635D0 /* WK2BrowserWindowController.m in Sources */,
-				51E244FA11EFCE07008228D1 /* MBToolbarItem.m in Sources */,
 				0FE643A1161FA8940059E3FF /* BrowserWindowController.m in Sources */,
+				BC329487116A92E2008635D0 /* main.m in Sources */,
+				51E244FA11EFCE07008228D1 /* MBToolbarItem.m in Sources */,
 				0FE643A4161FAC660059E3FF /* WK1BrowserWindowController.m in Sources */,
+				BC329498116A941B008635D0 /* WK2BrowserWindowController.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Tools/MiniBrowser/efl/CMakeLists.txt b/Tools/MiniBrowser/efl/CMakeLists.txt
index e39d911..1053ad2 100644
--- a/Tools/MiniBrowser/efl/CMakeLists.txt
+++ b/Tools/MiniBrowser/efl/CMakeLists.txt
@@ -1,17 +1,24 @@
-SET(MiniBrowser_DIR "${TOOLS_DIR}/MiniBrowser/efl")
+set(MiniBrowser_DIR "${TOOLS_DIR}/MiniBrowser/efl")
 
-SET(MiniBrowser_SOURCES
+# Elementary is needed to build MiniBrowser
+find_package(Elementary 1.6)
+
+set(MiniBrowser_SOURCES
     ${TOOLS_DIR}/EWebLauncher/url_utils.c
     ${MiniBrowser_DIR}/main.c
 )
 
-SET(MiniBrowser_INCLUDE_DIRECTORIES
+set(MiniBrowser_INCLUDE_DIRECTORIES
     ${CAIRO_INCLUDE_DIRS}
     ${ECORE_INCLUDE_DIRS}
     ${ECORE_EVAS_INCLUDE_DIRS}
+    ${ECORE_CON_INCLUDE_DIRS}
     ${ECORE_FILE_INCLUDE_DIRS}
+    ${ECORE_IMF_INCLUDE_DIRS}
+    ${ECORE_INPUT_INCLUDE_DIRS}
     ${EDJE_INCLUDE_DIRS}
     ${EET_INCLUDE_DIRS}
+    ${EO_INCLUDE_DIRS}
     ${DBUS_INCLUDE_DIRS}
     ${E_DBUS_INCLUDE_DIRS}
     ${EFREET_INCLUDE_DIRS}
@@ -24,7 +31,7 @@
     ${CMAKE_SOURCE_DIR}/Source
 )
 
-SET(MiniBrowser_LIBRARIES
+set(MiniBrowser_LIBRARIES
     ${JavaScriptCore_LIBRARY_NAME}
     ${WebCore_LIBRARY_NAME}
     ${WebKit2_LIBRARY_NAME}
@@ -35,8 +42,11 @@
     ${EDJE_LIBRARIES}
     ${EINA_LIBRARIES}
     ${ELEMENTARY_LIBRARIES}
+    ${EO_LIBRARIES}
     ${EVAS_LIBRARIES}
     ${FONTCONFIG_LIBRARIES}
+    ${GLIB_LIBRARIES}
+    ${GLIB_GTHREAD_LIBRARIES}
     ${LIBSOUP_LIBRARIES}
     ${LIBXML2_LIBRARIES}
     ${LIBXSLT_LIBRARIES}
@@ -44,17 +54,11 @@
     ${SQLITE_LIBRARIES}
 )
 
-IF (ENABLE_GLIB_SUPPORT)
-    LIST(APPEND MiniBrowser_LIBRARIES
-        ${GLIB_LIBRARIES}
-        ${GLIB_GTHREAD_LIBRARIES}
-    )
-ENDIF ()
+add_definitions(-DTHEME_DIR=\"${THEME_BINARY_DIR}\")
 
-ADD_DEFINITIONS(-DTHEME_DIR=\"${THEME_BINARY_DIR}\")
-
-INCLUDE_DIRECTORIES(${MiniBrowser_INCLUDE_DIRECTORIES})
-
-ADD_EXECUTABLE(MiniBrowser ${MiniBrowser_SOURCES})
-TARGET_LINK_LIBRARIES(MiniBrowser ${MiniBrowser_LIBRARIES})
-SET_TARGET_PROPERTIES(MiniBrowser PROPERTIES FOLDER "Tools")
+if (ELEMENTARY_FOUND)
+    include_directories(${MiniBrowser_INCLUDE_DIRECTORIES})
+    add_executable(MiniBrowser ${MiniBrowser_SOURCES})
+    target_link_libraries(MiniBrowser ${MiniBrowser_LIBRARIES})
+    set_target_properties(MiniBrowser PROPERTIES FOLDER "Tools")
+endif ()
diff --git a/Tools/MiniBrowser/efl/main.c b/Tools/MiniBrowser/efl/main.c
index e982a71..57c8efd 100644
--- a/Tools/MiniBrowser/efl/main.c
+++ b/Tools/MiniBrowser/efl/main.c
@@ -21,6 +21,7 @@
 #include "url_utils.h"
 #include <Ecore.h>
 #include <Ecore_Evas.h>
+#include <Ecore_Getopt.h>
 #include <Eina.h>
 #include <Elementary.h>
 #include <Evas.h>
@@ -29,6 +30,11 @@
 static const char APP_NAME[] = "EFL MiniBrowser";
 static const int TOOL_BAR_ICON_SIZE = 24;
 static const int TOOL_BAR_BUTTON_SIZE = 32;
+static const int SEARCH_FIELD_SIZE = 200;
+static const int SEARCH_BUTTON_SIZE = 25;
+static const int MAX_SEARCH_COUNT = 100;
+static const int DEFAULT_SEARCH_FLAGS = EWK_FIND_OPTIONS_SHOW_HIGHLIGHT | EWK_FIND_OPTIONS_CASE_INSENSITIVE | EWK_FIND_OPTIONS_WRAP_AROUND;
+static const double TOOLTIP_DELAY_SECONDS = 1.0;
 
 #define info(format, args...)       \
     do {                            \
@@ -41,35 +47,97 @@
 static char *evas_engine_name = NULL;
 static Eina_Bool encoding_detector_enabled = EINA_FALSE;
 static Eina_Bool frame_flattening_enabled = EINA_FALSE;
+static Eina_Bool local_storage_enabled = EINA_TRUE;
+static Eina_Bool fullscreen_enabled = EINA_FALSE;
 static int window_width = 800;
 static int window_height = 600;
+/* Default value of device_pixel_ratio is '0' so that we don't set custom device
+ * scale factor unless it's required by the User. */
+static double device_pixel_ratio = 0;
+static Eina_Bool legacy_behavior_enabled = EINA_FALSE;
 
-static Ewk_View_Smart_Class* miniBrowserViewSmartClass()
+#define DEFAULT_ZOOM_LEVEL 5 // Set default zoom level to 1.0 (index 5 on zoomLevels).
+// The zoom values are chosen to be like in Mozilla Firefox 3.
+const static float zoomLevels[] = {0.3, 0.5, 0.67, 0.8, 0.9, 1.0, 1.1, 1.2, 1.33, 1.5, 1.7, 2.0, 2.4, 3.0};
+
+static Eina_Bool
+zoom_level_set(Evas_Object *webview, int level)
+{
+    if (level < 0  || level >= sizeof(zoomLevels) / sizeof(float))
+        return EINA_FALSE;
+
+    Evas_Coord ox, oy, mx, my, cx, cy;
+    evas_pointer_canvas_xy_get(evas_object_evas_get(webview), &mx, &my); // Get current mouse position on window.
+    evas_object_geometry_get(webview, &ox, &oy, NULL, NULL); // Get webview's position on window.
+    cx = mx - ox; // current x position = mouse x position - webview x position
+    cy = my - oy; // current y position = mouse y position - webview y position
+
+    Eina_Bool result = ewk_view_scale_set(webview, zoomLevels[level], cx, cy);
+    return result;
+}
+
+static Ewk_View_Smart_Class *miniBrowserViewSmartClass()
 {
     static Ewk_View_Smart_Class ewkViewClass = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("MiniBrowser_View");
     return &ewkViewClass;
 }
 
+typedef struct _Tooltip_Information {
+    Ecore_Timer *show_timer;
+    Eina_Bool activated;
+    Eina_Bool text_set;
+    Eina_Bool shown;
+} Tooltip_Information;
+
 typedef struct _Browser_Window {
-    Evas_Object *window;
-    Evas_Object *webview;
+    Evas_Object *elm_window;
+    Evas_Object *ewk_view;
     Evas_Object *url_bar;
     Evas_Object *back_button;
     Evas_Object *forward_button;
+    struct {
+        Evas_Object *elm_menu;
+        Ewk_Popup_Menu *ewk_menu;
+    } popup;
+    struct {
+        Evas_Object *search_bar;
+        Evas_Object *search_field;
+        Evas_Object *backward_button;
+        Evas_Object *forward_button;
+    } search;
+    int current_zoom_level; 
+    Tooltip_Information tooltip;
 } Browser_Window;
 
+typedef struct _File_Selector_Data {
+    Browser_Window* parent;
+    Evas_Object *elm_window;
+    Ewk_File_Chooser_Request *request;
+} File_Selector_Data;
+
+typedef struct _Auth_Data {
+    Evas_Object *popup;
+    Ewk_Auth_Request *request;
+    Evas_Object *username_entry;
+    Evas_Object *password_entry;
+} Auth_Data;
+
 static const Ecore_Getopt options = {
     "MiniBrowser",
     "%prog [options] [url]",
     "0.0.1",
-    "(C)2012 Samsung Electronics\n",
+    "(C)2012 Samsung Electronics\n (C)2012 Intel Corporation\n",
     "",
-    "Test Web Browser using the Enlightenment Foundation Libraries of WebKit2",
+    "Test Web Browser using the Enlightenment Foundation Libraries (EFL) port of WebKit2",
     EINA_TRUE, {
         ECORE_GETOPT_STORE_STR
             ('e', "engine", "ecore-evas engine to use."),
         ECORE_GETOPT_STORE_STR
             ('s', "window-size", "window size in following format (width)x(height)."),
+        ECORE_GETOPT_STORE_DEF_BOOL
+            ('b', "legacy", "Legacy mode", EINA_FALSE),
+        ECORE_GETOPT_STORE_DOUBLE
+            ('r', "device-pixel-ratio", "Ratio between the CSS units and device pixels."),
         ECORE_GETOPT_CALLBACK_NOARGS
             ('E', "list-engines", "list ecore-evas engines.",
              ecore_getopt_callback_ecore_evas_list_engines, NULL),
@@ -77,6 +145,10 @@
             ('c', "encoding-detector", "enable/disable encoding detector", EINA_FALSE),
         ECORE_GETOPT_STORE_DEF_BOOL
             ('f', "flattening", "frame flattening.", EINA_FALSE),
+        ECORE_GETOPT_STORE_DEF_BOOL
+            ('l', "local-storage", "HTML5 local storage support (enabled by default).", EINA_TRUE),
+        ECORE_GETOPT_STORE_DEF_BOOL
+            ('F', "full-screen", "start in full-screen.", EINA_FALSE),
         ECORE_GETOPT_VERSION
             ('V', "version"),
         ECORE_GETOPT_COPYRIGHT
@@ -87,45 +159,111 @@
     }
 };
 
-static Browser_Window *window_create(const char *url);
+static Browser_Window *window_create(Evas_Object* opener, const char *url, int width, int height, Eina_Bool view_mode);
 
-static Browser_Window *browser_window_find(Evas_Object *window)
+static Browser_Window *window_find_with_elm_window(Evas_Object *elm_window)
 {
     Eina_List *l;
     void *data;
 
-    if (!window)
+    if (!elm_window)
         return NULL;
 
     EINA_LIST_FOREACH(windows, l, data) {
-        Browser_Window *browser_window = (Browser_Window *)data;
-        if (browser_window->window == window)
-            return browser_window;
+        Browser_Window *window = (Browser_Window *)data;
+        if (window->elm_window == elm_window)
+            return window;
     }
     return NULL;
 }
 
-static Browser_Window *browser_view_find(Evas_Object *view)
+static Browser_Window *window_find_with_ewk_view(Evas_Object *ewk_view)
 {
     Eina_List *l;
     void *data;
 
-    if (!view)
+    if (!ewk_view)
         return NULL;
 
     EINA_LIST_FOREACH(windows, l, data) {
-        Browser_Window *browser_window = (Browser_Window *)data;
-        if (browser_window->webview == view)
-            return browser_window;
+        Browser_Window *window = (Browser_Window *)data;
+        if (window->ewk_view == ewk_view)
+            return window;
     }
     return NULL;
 }
 
+static Eina_Bool
+on_tooltip_show(void *user_data)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+
+    window->tooltip.show_timer = NULL;
+    elm_object_tooltip_show(window->elm_window);
+    window->tooltip.shown = EINA_TRUE;
+    return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+window_tooltip_hide(Browser_Window *window)
+{
+    if (window->tooltip.show_timer) {
+        ecore_timer_del(window->tooltip.show_timer);
+        window->tooltip.show_timer = NULL;
+    }
+
+    if (window->tooltip.shown) {
+        elm_object_tooltip_hide(window->elm_window);
+        window->tooltip.shown = EINA_FALSE;
+    }
+}
+
+static void
+window_tooltip_update(Browser_Window *window)
+{
+    window_tooltip_hide(window);
+
+    if (window->tooltip.activated && window->tooltip.text_set)
+        window->tooltip.show_timer = ecore_timer_add(TOOLTIP_DELAY_SECONDS, on_tooltip_show, window);
+}
+
+static void
+on_mouse_in(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+
+    window->tooltip.activated = EINA_TRUE;
+    window_tooltip_update(window);
+}
+
+static void
+on_mouse_move(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
+{
+    window_tooltip_update((Browser_Window *)user_data);
+}
+
+static void
+on_mouse_out(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+
+    window->tooltip.activated = EINA_FALSE;
+    window_tooltip_update(window);
+}
+
 static void window_free(Browser_Window *window)
 {
-    evas_object_del(window->webview);
+    evas_object_event_callback_del(window->ewk_view, EVAS_CALLBACK_MOUSE_IN, on_mouse_in);
+    evas_object_event_callback_del(window->ewk_view, EVAS_CALLBACK_MOUSE_OUT, on_mouse_out);
+    evas_object_event_callback_del(window->ewk_view, EVAS_CALLBACK_MOUSE_MOVE, on_mouse_move);
+
+    evas_object_del(window->ewk_view);
     /* The elm_win will take care of freeing its children */
-    evas_object_del(window->window);
+    evas_object_del(window->elm_window);
+
+    if (window->tooltip.show_timer)
+        ecore_timer_del(window->tooltip.show_timer);
+
     free(window);
 }
 
@@ -139,7 +277,38 @@
 }
 
 static void
-on_key_down(void *user_data, Evas *e, Evas_Object *webview, void *event_info)
+search_box_show(Browser_Window *window)
+{
+    evas_object_size_hint_min_set(window->search.search_bar, SEARCH_FIELD_SIZE + 2 * SEARCH_BUTTON_SIZE, SEARCH_BUTTON_SIZE);
+
+    evas_object_show(window->search.search_bar);
+    evas_object_show(window->search.search_field);
+    evas_object_show(window->search.backward_button);
+    evas_object_show(window->search.forward_button);
+
+    /* Grab focus from the view */
+    evas_object_focus_set(window->ewk_view, EINA_FALSE);
+    elm_object_focus_set(window->search.search_field, EINA_TRUE);
+}
+
+static void
+search_box_hide(Browser_Window *window)
+{
+    ewk_view_text_find_highlight_clear(window->ewk_view);
+
+    evas_object_size_hint_min_set(window->search.search_bar, SEARCH_FIELD_SIZE + 2 * SEARCH_BUTTON_SIZE, 0);
+    evas_object_hide(window->search.search_bar);
+    evas_object_hide(window->search.search_field);
+    evas_object_hide(window->search.backward_button);
+    evas_object_hide(window->search.forward_button);
+
+    /* Give focus back to the view */
+    elm_object_focus_set(window->search.search_field, EINA_FALSE);
+    evas_object_focus_set(window->ewk_view, EINA_TRUE);
+}
+
+static void
+on_key_down(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
 {
     Browser_Window *window = (Browser_Window *)user_data;
     Evas_Event_Key_Down *ev = (Evas_Event_Key_Down*) event_info;
@@ -154,39 +323,64 @@
 
     if (!strcmp(ev->key, "F1")) {
         info("Back (F1) was pressed\n");
-        if (!ewk_view_back(webview))
+        if (!ewk_view_back(ewk_view))
             info("Back ignored: No back history\n");
     } else if (!strcmp(ev->key, "F2")) {
         info("Forward (F2) was pressed\n");
-        if (!ewk_view_forward(webview))
+        if (!ewk_view_forward(ewk_view))
             info("Forward ignored: No forward history\n");
     } else if (!strcmp(ev->key, "F3")) {
         currentEncoding = (currentEncoding + 1) % (sizeof(encodings) / sizeof(encodings[0]));
         info("Set encoding (F3) pressed. New encoding to %s", encodings[currentEncoding]);
-        ewk_view_setting_encoding_custom_set(webview, encodings[currentEncoding]);
+        ewk_view_custom_encoding_set(ewk_view, encodings[currentEncoding]);
     } else if (!strcmp(ev->key, "F5")) {
         info("Reload (F5) was pressed, reloading.\n");
-        ewk_view_reload(webview);
+        ewk_view_reload(ewk_view);
     } else if (!strcmp(ev->key, "F6")) {
         info("Stop (F6) was pressed, stop loading.\n");
-        ewk_view_stop(webview);
-    } else if  (!strcmp(ev->key, "F7")) {
-        Ewk_Pagination_Mode mode =  ewk_view_pagination_mode_get(webview);
+        ewk_view_stop(ewk_view);
+    } else if (!strcmp(ev->key, "F7")) {
+        Ewk_Pagination_Mode mode =  ewk_view_pagination_mode_get(ewk_view);
         mode = (++mode) % (EWK_PAGINATION_MODE_BOTTOM_TO_TOP + 1);
-        if (ewk_view_pagination_mode_set(webview, mode))
+        if (ewk_view_pagination_mode_set(ewk_view, mode))
             info("Change Pagination Mode (F7) was pressed, changed to: %d\n", mode);
         else
             info("Change Pagination Mode (F7) was pressed, but NOT changed!");
+    } else if (!strcmp(ev->key, "F8")) {
+        info("Create souce code window (F8) was pressed.\n");
+        Browser_Window *window = window_create(ewk_view, ewk_view_url_get(ewk_view), 0, 0, EINA_TRUE);
+        windows = eina_list_append(windows, window);
+    } else if (!strcmp(ev->key, "F11")) {
+        info("Fullscreen (F11) was pressed, toggling window/fullscreen.\n");
+        elm_win_fullscreen_set(window->elm_window, !elm_win_fullscreen_get(window->elm_window));
     } else if (!strcmp(ev->key, "n") && ctrlPressed) {
         info("Create new window (Ctrl+n) was pressed.\n");
-        Browser_Window *window = window_create(DEFAULT_URL);
+        Browser_Window *window = window_create(NULL, DEFAULT_URL, 0, 0, EINA_FALSE);
+        // 0 equals default width and height.
         windows = eina_list_append(windows, window);
     } else if (!strcmp(ev->key, "i") && ctrlPressed) {
         info("Show Inspector (Ctrl+i) was pressed.\n");
-        ewk_view_inspector_show(webview);
+        ewk_view_inspector_show(ewk_view);
+    } else if (!strcmp(ev->key, "f") && ctrlPressed) {
+        info("Show Search Box (Ctrl+f) was pressed.\n");
+        search_box_show(window);
     } else if (!strcmp(ev->key, "Escape")) {
-        if (elm_win_fullscreen_get(window->window))
-            ewk_view_fullscreen_exit(webview);
+        if (evas_object_visible_get(window->search.search_bar))
+            search_box_hide(window);
+        else if (elm_win_fullscreen_get(window->elm_window))
+            ewk_view_fullscreen_exit(ewk_view);
+    } else if (ctrlPressed && (!strcmp(ev->key, "minus") || !strcmp(ev->key, "KP_Subtract"))) {
+        if (zoom_level_set(ewk_view, window->current_zoom_level - 1))
+            window->current_zoom_level--;
+        info("Zoom out (Ctrl + '-') was pressed, zoom level became %.2f\n", zoomLevels[window->current_zoom_level]);
+    } else if (ctrlPressed && (!strcmp(ev->key, "equal") || !strcmp(ev->key, "KP_Add"))) {
+        if (zoom_level_set(ewk_view, window->current_zoom_level + 1))
+            window->current_zoom_level++;
+        info("Zoom in (Ctrl + '+') was pressed, zoom level became %.2f\n", zoomLevels[window->current_zoom_level]);
+    } else if (ctrlPressed && !strcmp(ev->key, "0")) {
+        if (zoom_level_set(ewk_view, DEFAULT_ZOOM_LEVEL))
+            window->current_zoom_level = DEFAULT_ZOOM_LEVEL;
+        info("Zoom to default (Ctrl + '0') was pressed, zoom level became %.2f\n", zoomLevels[window->current_zoom_level]);
     }
 }
 
@@ -196,12 +390,12 @@
     /* We steal focus away from elm's focus model and start to do things
      * manually here, so elm now has no clue what's up. Tell elm that its
      * toplevel widget is to be unfocused so elm gives up the focus */
-    elm_object_focus_set(elm_object_top_widget_get(window->window), EINA_FALSE);
-    evas_object_focus_set(window->webview, focus);
+    elm_object_focus_set(elm_object_top_widget_get(window->elm_window), EINA_FALSE);
+    evas_object_focus_set(window->ewk_view, focus);
 }
 
 static void
-on_mouse_down(void *user_data, Evas *e, Evas_Object *webview, void *event_info)
+on_mouse_down(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
 {
     Browser_Window *window = (Browser_Window *)user_data;
     Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
@@ -212,16 +406,16 @@
     if (ev->button == 1)
         view_focus_set(window, EINA_TRUE);
     else if (ev->button == 2)
-        view_focus_set(window, !evas_object_focus_get(webview));
+        view_focus_set(window, !evas_object_focus_get(ewk_view));
 }
 
 static void
-title_set(Evas_Object *window, const char *title, int progress)
+title_set(Evas_Object *elm_window, const char *title, int progress)
 {
     Eina_Strbuf *buffer;
 
     if (!title || !*title) {
-        elm_win_title_set(window, APP_NAME);
+        elm_win_title_set(elm_window, APP_NAME);
         return;
     }
 
@@ -231,68 +425,55 @@
     else
         eina_strbuf_append_printf(buffer, "%s - %s", title, APP_NAME);
 
-    elm_win_title_set(window, eina_strbuf_string_get(buffer));
+    elm_win_title_set(elm_window, eina_strbuf_string_get(buffer));
     eina_strbuf_free(buffer);
 }
 
 static void
-on_title_changed(void *user_data, Evas_Object *webview, void *event_info)
+on_title_changed(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
     Browser_Window *window = (Browser_Window *)user_data;
     const char *title = (const char *)event_info;
 
-    title_set(window->window, title, 100);
+    title_set(window->elm_window, title, 100);
 }
 
 static void
-on_url_changed(void *user_data, Evas_Object *webview, void *event_info)
+on_url_changed(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
     Browser_Window *window = (Browser_Window *)user_data;
 
-    char *url = elm_entry_utf8_to_markup(ewk_view_url_get(window->webview));
+    char *url = elm_entry_utf8_to_markup(ewk_view_url_get(window->ewk_view));
     elm_entry_entry_set(window->url_bar, url);
 
     free(url);
+
+    search_box_hide(window);
 }
 
 static void
-on_back_forward_list_changed(void *user_data, Evas_Object *webview, void *event_info)
+on_back_forward_list_changed(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
     Browser_Window *window = (Browser_Window *)user_data;
 
     /* Update navigation buttons state */
-    elm_object_disabled_set(window->back_button, !ewk_view_back_possible(webview));
-    elm_object_disabled_set(window->forward_button, !ewk_view_forward_possible(webview));
+    elm_object_disabled_set(window->back_button, !ewk_view_back_possible(ewk_view));
+    elm_object_disabled_set(window->forward_button, !ewk_view_forward_possible(ewk_view));
 }
 
 static void
-on_new_window(void *user_data, Evas_Object *webview, void *event_info)
-{
-    Evas_Object **new_view = (Evas_Object **)event_info;
-    Browser_Window *window = window_create(NULL);
-    *new_view = window->webview;
-    windows = eina_list_append(windows, window);
-}
-
-static void
-on_close_window(void *user_data, Evas_Object *webview, void *event_info)
-{
-    window_close((Browser_Window *)user_data);
-}
-
-static void
-on_progress(void *user_data, Evas_Object *webview, void *event_info)
+on_progress(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
     Browser_Window *window = (Browser_Window *)user_data;
     double progress = *(double *)event_info;
 
-    title_set(window->window, ewk_view_title_get(window->webview), progress * 100);
+    title_set(window->elm_window, ewk_view_title_get(window->ewk_view), progress * 100);
 }
 
 static void
-on_error(void *user_data, Evas_Object *webview, void *event_info)
+on_error(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
-    Eina_Strbuf* buffer;
+    Eina_Strbuf *buffer;
     const Ewk_Error *error = (const Ewk_Error *)event_info;
 
     /* This is a cancellation, do not display the error page */
@@ -303,12 +484,12 @@
     eina_strbuf_append_printf(buffer, "<html><body><div style=\"color:#ff0000\">ERROR!</div><br><div>Code: %d<br>Description: %s<br>URL: %s</div></body</html>",
         ewk_error_code_get(error), ewk_error_description_get(error), ewk_error_url_get(error));
 
-    ewk_view_html_string_load(webview, eina_strbuf_string_get(buffer), 0, ewk_error_url_get(error));
+    ewk_view_html_string_load(ewk_view, eina_strbuf_string_get(buffer), 0, ewk_error_url_get(error));
     eina_strbuf_free(buffer);
 }
 
 static void
-on_download_request(void *user_data, Evas_Object *webview, void *event_info)
+on_download_request(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
     Ewk_Download_Job *download = (Ewk_Download_Job *)event_info;
 
@@ -329,38 +510,32 @@
     eina_strbuf_free(destination_path);
 }
 
-typedef struct {
-    Evas_Object *parent;
-    Evas_Object *window;
-    Ewk_File_Chooser_Request *request;
-} FileSelectorData;
+static void on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *elm_window, void *event);
 
-static void on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event);
-
-static void close_file_picker(FileSelectorData* fs_data)
+static void close_file_picker(File_Selector_Data *fs_data)
 {
-    evas_object_event_callback_del(fs_data->parent, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion);
-    evas_object_del(fs_data->window);
+    evas_object_event_callback_del(fs_data->parent->elm_window, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion);
+    evas_object_del(fs_data->elm_window);
     ewk_object_unref(fs_data->request);
     free(fs_data);
 }
 
 static void
-on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event)
+on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *elm_window, void *event)
 {
-    close_file_picker((FileSelectorData *)user_data);
+    close_file_picker((File_Selector_Data *)user_data);
 }
 
 static void
-on_filepicker_deletion(void *user_data, Evas_Object *window, void *event_info)
+on_filepicker_deletion(void *user_data, Evas_Object *elm_window, void *event_info)
 {
-    close_file_picker((FileSelectorData *)user_data);
+    close_file_picker((File_Selector_Data *)user_data);
 }
 
 static void
 on_fileselector_done(void *user_data, Evas_Object *file_selector, void *event_info)
 {
-    FileSelectorData *fs_data = (FileSelectorData *)user_data;
+    File_Selector_Data *fs_data = (File_Selector_Data *)user_data;
 
     const char *selected = (const char *)event_info;
     if (selected && *selected)
@@ -370,60 +545,56 @@
 }
 
 static void
-on_file_chooser_request(void *user_data, Evas_Object *webview, void *event_info)
+on_file_chooser_request(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
+    Browser_Window *window = (Browser_Window *)user_data;
     Ewk_File_Chooser_Request *request = (Ewk_File_Chooser_Request *)event_info;
 
     // Show basic file picker which does not currently support multiple files
     // or MIME type filtering.
-    Evas_Object *window = elm_win_add(app_data->window, "file-picker-window", ELM_WIN_DIALOG_BASIC);
-    elm_win_title_set(window, "File picker");
-    elm_win_modal_set(window, EINA_TRUE);
+    Evas_Object *elm_window = elm_win_add(window->elm_window, "file-picker-window", ELM_WIN_DIALOG_BASIC);
+    elm_win_title_set(elm_window, "File picker");
+    elm_win_modal_set(elm_window, EINA_TRUE);
 
-    FileSelectorData* fs_data = (FileSelectorData*)malloc(sizeof(FileSelectorData));
-    fs_data->parent = app_data->window;
-    fs_data->window = window;
+    File_Selector_Data *fs_data = (File_Selector_Data *)malloc(sizeof(File_Selector_Data));
+    fs_data->parent = window;
+    fs_data->elm_window = elm_window;
     fs_data->request = ewk_object_ref(request);
-    evas_object_smart_callback_add(window, "delete,request", on_filepicker_deletion, fs_data);
-    evas_object_event_callback_add(app_data->window, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion, fs_data);
+    evas_object_smart_callback_add(elm_window, "delete,request", on_filepicker_deletion, fs_data);
+    evas_object_event_callback_add(window->elm_window, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion, fs_data);
 
-    Evas_Object *file_selector = elm_fileselector_add(window);
+    Evas_Object *file_selector = elm_fileselector_add(elm_window);
     const char *home_path = getenv("HOME");
     elm_fileselector_path_set(file_selector, home_path ? home_path : "/home");
     evas_object_size_hint_weight_set(file_selector, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    elm_win_resize_object_add(window, file_selector);
+    elm_win_resize_object_add(elm_window, file_selector);
     evas_object_show(file_selector);
 
     evas_object_smart_callback_add(file_selector, "done", on_fileselector_done, fs_data);
 
-    evas_object_resize(window, 400, 400);
-    elm_win_center(window, EINA_TRUE, EINA_TRUE);
-    evas_object_show(window);
+    evas_object_resize(elm_window, 400, 400);
+    elm_win_center(elm_window, EINA_TRUE, EINA_TRUE);
+    evas_object_show(elm_window);
 }
 
 static void
-on_download_finished(void *user_data, Evas_Object *webview, void *event_info)
+on_download_finished(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
     Ewk_Download_Job *download = (Ewk_Download_Job *)event_info;
     info("Download finished: %s\n",  ewk_download_job_destination_get(download));
 }
 
 static void
-on_download_failed(void *user_data, Evas_Object *webview, void *event_info)
+on_download_failed(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
     info("Download failed!\n");
 }
 
 static void
-on_favicon_received(const char *page_url, Evas_Object *icon, void *event_info)
+update_view_favicon(Browser_Window *window, Evas_Object *icon)
 {
-    Browser_Window *app_data = (Browser_Window *)event_info;
-    if (strcmp(page_url, ewk_view_url_get(app_data->webview)))
-        return;
-
     /* Remove previous icon from URL bar */
-    Evas_Object *old_icon = elm_object_part_content_unset(app_data->url_bar, "icon");
+    Evas_Object *old_icon = elm_object_part_content_unset(window->url_bar, "icon");
     if (old_icon) {
         evas_object_unref(old_icon);
         evas_object_del(old_icon);
@@ -436,22 +607,21 @@
         evas_object_size_hint_min_set(icon, 48, 24);
         evas_object_image_filled_set(icon, EINA_FALSE);
         evas_object_image_fill_set(icon, 24, 0, 24, 24);
-        elm_object_part_content_set(app_data->url_bar, "icon", icon);
+        elm_object_part_content_set(window->url_bar, "icon", icon);
         evas_object_ref(icon);
     }
 }
 
 static void
-on_view_icon_changed(void *user_data, Evas_Object *webview, void *event_info)
+on_view_favicon_changed(void *user_data, Evas_Object *ewk_view, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
-    /* Retrieve the view's favicon */
-    Ewk_Context *context = ewk_view_context_get(webview);
-    Ewk_Favicon_Database *icon_database = ewk_context_favicon_database_get(context);
+    Browser_Window *window = (Browser_Window *)user_data;
 
-    const char *page_url = ewk_view_url_get(webview);
-    Evas *evas = evas_object_evas_get(webview);
-    ewk_favicon_database_async_icon_get(icon_database, page_url, evas, on_favicon_received, app_data);
+    Evas_Object* favicon = ewk_view_favicon_get(ewk_view);
+    update_view_favicon(window, favicon);
+
+    if (favicon)
+        evas_object_unref(favicon);
 }
 
 static int
@@ -472,63 +642,118 @@
 static void
 on_url_bar_activated(void *user_data, Evas_Object *url_bar, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
+    Browser_Window *window = (Browser_Window *)user_data;
 
     const char *markup_url = elm_entry_entry_get(url_bar);
     char *user_url = elm_entry_markup_to_utf8(markup_url);
     char *url = url_from_user_input(user_url);
-    ewk_view_url_set(app_data->webview, url);
+    ewk_view_url_set(window->ewk_view, url);
 
     free(user_url);
     free(url);
 
     /* Give focus back to the view */
-    view_focus_set(app_data, EINA_TRUE);
+    view_focus_set(window, EINA_TRUE);
 }
 
 static void
 on_url_bar_clicked(void *user_data, Evas_Object *url_bar, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
+    Browser_Window *window = (Browser_Window *)user_data;
 
     /* Grab focus from the view */
-    evas_object_focus_set(app_data->webview, EINA_FALSE);
+    evas_object_focus_set(window->ewk_view, EINA_FALSE);
     elm_object_focus_set(url_bar, EINA_TRUE);
 }
 
 static void
+on_search_field_aborted(void *user_data, Evas_Object *search_field, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+    search_box_hide(window);
+
+    /* Give focus back to the view */
+    view_focus_set(window, EINA_TRUE);
+}
+
+static void
+on_search_field_activated(void *user_data, Evas_Object *search_field, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+
+    const char *markup_text = elm_entry_entry_get(search_field);
+    char *text = elm_entry_markup_to_utf8(markup_text);
+    ewk_view_text_find(window->ewk_view, text, DEFAULT_SEARCH_FLAGS, MAX_SEARCH_COUNT);
+    free(text);
+
+    /* Grab focus from the view */
+    evas_object_focus_set(window->ewk_view, EINA_FALSE);
+    elm_object_focus_set(search_field, EINA_TRUE);
+}
+
+static void
+on_search_field_clicked(void *user_data, Evas_Object *search_field, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+
+    /* Grab focus from the view */
+    evas_object_focus_set(window->ewk_view, EINA_FALSE);
+    elm_object_focus_set(search_field, EINA_TRUE);
+}
+
+static void
 on_back_button_clicked(void *user_data, Evas_Object *back_button, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
+    Browser_Window *window = (Browser_Window *)user_data;
 
-    ewk_view_back(app_data->webview);
+    ewk_view_back(window->ewk_view);
     /* Update back button state */
-    elm_object_disabled_set(back_button, !ewk_view_back_possible(app_data->webview));
+    elm_object_disabled_set(back_button, !ewk_view_back_possible(window->ewk_view));
 }
 
 static void
 on_forward_button_clicked(void *user_data, Evas_Object *forward_button, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
+    Browser_Window *window = (Browser_Window *)user_data;
 
-    ewk_view_forward(app_data->webview);
+    ewk_view_forward(window->ewk_view);
     /* Update forward button state */
-    elm_object_disabled_set(forward_button, !ewk_view_forward_possible(app_data->webview));
+    elm_object_disabled_set(forward_button, !ewk_view_forward_possible(window->ewk_view));
+}
+
+static void
+on_search_backward_button_clicked(void *user_data, Evas_Object *search_backward_button, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+
+    char *text = elm_entry_markup_to_utf8(elm_entry_entry_get(window->search.search_field));
+    ewk_view_text_find(window->ewk_view, text, DEFAULT_SEARCH_FLAGS | EWK_FIND_OPTIONS_BACKWARDS, MAX_SEARCH_COUNT);
+    free(text);
+}
+
+static void
+on_search_forward_button_clicked(void *user_data, Evas_Object *search_forward_button, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+
+    char *text = elm_entry_markup_to_utf8(elm_entry_entry_get(window->search.search_field));
+    ewk_view_text_find(window->ewk_view, text, DEFAULT_SEARCH_FLAGS, MAX_SEARCH_COUNT);
+    free(text);
 }
 
 static void
 on_refresh_button_clicked(void *user_data, Evas_Object *refresh_button, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
+    Browser_Window *window = (Browser_Window *)user_data;
 
     Evas *evas = evas_object_evas_get(refresh_button);
     Eina_Bool ctrlPressed = evas_key_modifier_is_set(evas_key_modifier_get(evas), "Control");
     if (ctrlPressed) {
         info("Reloading and bypassing cache...\n");
-        ewk_view_reload_bypass_cache(app_data->webview);
+        ewk_view_reload_bypass_cache(window->ewk_view);
     } else {
         info("Reloading...\n");
-        ewk_view_reload(app_data->webview);
+        ewk_view_reload(window->ewk_view);
     }
 }
 
@@ -550,9 +775,9 @@
 static void
 on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message)
 {
-    Browser_Window *window = browser_view_find(smartData->self);
+    Browser_Window *window = window_find_with_ewk_view(smartData->self);
 
-    Evas_Object *alert_popup = elm_popup_add(window->window);
+    Evas_Object *alert_popup = elm_popup_add(window->elm_window);
     evas_object_size_hint_weight_set(alert_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     elm_object_text_set(alert_popup, message);
     elm_object_part_text_set(alert_popup, "title,text", "Alert");
@@ -574,11 +799,11 @@
 static Eina_Bool
 on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message)
 {
-    Browser_Window *window = browser_view_find(smartData->self);
+    Browser_Window *window = window_find_with_ewk_view(smartData->self);
 
     Eina_Bool ok = EINA_FALSE;
 
-    Evas_Object *confirm_popup = elm_popup_add(window->window);
+    Evas_Object *confirm_popup = elm_popup_add(window->elm_window);
     evas_object_size_hint_weight_set(confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     elm_object_text_set(confirm_popup, message);
     elm_object_part_text_set(confirm_popup, "title,text", "Confirmation");
@@ -606,29 +831,29 @@
 static const char *
 on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value)
 {
-    Browser_Window *window = browser_view_find(smartData->self);
+    Browser_Window *window = window_find_with_ewk_view(smartData->self);
 
     Eina_Bool ok = EINA_FALSE;
 
-    Evas_Object *prompt_popup = elm_popup_add(window->window);
+    Evas_Object *prompt_popup = elm_popup_add(window->elm_window);
     evas_object_size_hint_weight_set(prompt_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     elm_object_part_text_set(prompt_popup, "title,text", "Prompt");
 
     /* Popup Content */
-    Evas_Object *box = elm_box_add(window->window);
+    Evas_Object *box = elm_box_add(window->elm_window);
     elm_box_padding_set(box, 0, 4);
     evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
     evas_object_show(box);
 
-    Evas_Object *prompt = elm_label_add(window->window);
+    Evas_Object *prompt = elm_label_add(window->elm_window);
     elm_object_text_set(prompt, message);
     evas_object_size_hint_weight_set(prompt, EVAS_HINT_EXPAND, 0.0);
     evas_object_size_hint_align_set(prompt, EVAS_HINT_FILL, 0.5);
     elm_box_pack_end(box, prompt);
     evas_object_show(prompt);
 
-    Evas_Object *entry = elm_entry_add(window->window);
+    Evas_Object *entry = elm_entry_add(window->elm_window);
     elm_entry_scrollable_set(entry, EINA_TRUE);
     elm_entry_single_line_set(entry, EINA_TRUE);
     elm_entry_text_style_user_push(entry, "DEFAULT='font_size=18'");
@@ -663,27 +888,114 @@
     return prompt_text;
 }
 
+static void
+on_popup_menu_discarded(void *user_data, Evas_Object *obj, void *event_info)
+{
+    // The user clicked outside the menu to discard it.
+    info("Popup menu was discarded.\n");
+    Browser_Window *window = (Browser_Window *)user_data;
+    ewk_popup_menu_close(window->popup.ewk_menu);
+}
+
+static void
+on_popup_menu_item_clicked(void *user_data, Evas_Object *obj, void *event_info)
+{
+    Browser_Window *window = (Browser_Window *)user_data;
+    Elm_Object_Item *item = (Elm_Object_Item *)event_info;
+
+    info("Selected popup menu index: %u\n", elm_menu_item_index_get(item));
+    ewk_popup_menu_selected_index_set(window->popup.ewk_menu, elm_menu_item_index_get(item));
+
+    // Close popup menu.
+    ewk_popup_menu_close(window->popup.ewk_menu);
+}
+
+static void
+popup_menu_populate(Evas_Object *elm_menu, Ewk_Popup_Menu *ewk_menu, void *user_data)
+{
+    const Eina_List* ewk_items = ewk_popup_menu_items_get(ewk_menu);
+
+    void *data;
+    const Eina_List *l;
+    EINA_LIST_FOREACH(ewk_items, l, data) {
+        Ewk_Popup_Menu_Item *ewk_item = (Ewk_Popup_Menu_Item *)data;
+        switch (ewk_popup_menu_item_type_get(ewk_item)) {
+        case EWK_POPUP_MENU_SEPARATOR:
+            elm_menu_item_separator_add(elm_menu, NULL);
+            break;
+        case EWK_POPUP_MENU_ITEM:
+            if (ewk_popup_menu_item_is_label_get(ewk_item)) {
+                Elm_Object_Item *item = elm_menu_item_add(elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(ewk_item), NULL, NULL);
+                elm_object_item_disabled_set(item, EINA_TRUE);
+            } else {
+                Elm_Object_Item *item = elm_menu_item_add(elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(ewk_item), on_popup_menu_item_clicked, user_data);
+                elm_object_item_tooltip_text_set(item, ewk_popup_menu_item_tooltip_get(ewk_item));
+                elm_object_item_disabled_set(item, !ewk_popup_menu_item_enabled_get(ewk_item));
+                elm_menu_item_selected_set(item, ewk_popup_menu_item_selected_get(ewk_item));
+            }
+            break;
+        default:
+            info("Unrecognized popup menu item type!\n");
+            break;
+        }
+    }
+}
+
+static Eina_Bool
+on_popup_menu_show(Ewk_View_Smart_Data *smartData, Eina_Rectangle rect, Ewk_Text_Direction text_direction, double page_scale_factor, Ewk_Popup_Menu *ewk_menu)
+{
+    Browser_Window *window = window_find_with_ewk_view(smartData->self);
+
+    if (window->popup.elm_menu)
+        evas_object_del(window->popup.elm_menu);
+
+    window->popup.elm_menu = elm_menu_add(window->elm_window);
+    window->popup.ewk_menu = ewk_menu;
+    evas_object_smart_callback_add(window->popup.elm_menu, "clicked", on_popup_menu_discarded, window);
+
+    popup_menu_populate(window->popup.elm_menu, ewk_menu, window);
+
+    info("Showing popup menu at (%d, %d)\n", rect.x, rect.y);
+    elm_menu_move(window->popup.elm_menu, rect.x, rect.y);
+    evas_object_show(window->popup.elm_menu);
+
+    return EINA_TRUE;
+}
+
+static Eina_Bool
+on_popup_menu_hide(Ewk_View_Smart_Data *smartData)
+{
+    Browser_Window *window = window_find_with_ewk_view(smartData->self);
+
+    if (!window->popup.elm_menu)
+        return EINA_FALSE;
+
+    elm_menu_close(window->popup.elm_menu);
+
+    return EINA_TRUE;
+}
+
 static Eina_Bool on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height)
 {
-    Browser_Window *window = browser_view_find(sd->self);
+    Browser_Window *window = window_find_with_ewk_view(sd->self);
 
-    evas_object_geometry_get(window->window, x, y, width, height);
+    evas_object_geometry_get(window->elm_window, x, y, width, height);
 
     return EINA_TRUE;
 }
 
 static Eina_Bool on_window_geometry_set(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height)
 {
-    Browser_Window *window = browser_view_find(sd->self);
+    Browser_Window *window = window_find_with_ewk_view(sd->self);
 
-    evas_object_move(window->window, x, y);
-    evas_object_resize(window->window, width, height);
+    evas_object_move(window->elm_window, x, y);
+    evas_object_resize(window->elm_window, width, height);
 
     return EINA_TRUE;
 }
 
 typedef struct {
-    Evas_Object *webview;
+    Evas_Object *ewk_view;
     Evas_Object *permission_popup;
 } PermissionData;
 
@@ -693,6 +1005,7 @@
     PermissionData *permission_data = (PermissionData *)user_data;
 
     evas_object_del(permission_data->permission_popup);
+    evas_object_focus_set(permission_data->ewk_view, EINA_TRUE);
     free(permission_data);
 }
 
@@ -701,20 +1014,21 @@
 {
     PermissionData *permission_data = (PermissionData *)user_data;
 
-    ewk_view_fullscreen_exit(permission_data->webview);
+    ewk_view_fullscreen_exit(permission_data->ewk_view);
     evas_object_del(permission_data->permission_popup);
+    evas_object_focus_set(permission_data->ewk_view, EINA_TRUE);
     free(permission_data);
 }
 
 static Eina_Bool on_fullscreen_enter(Ewk_View_Smart_Data *sd, Ewk_Security_Origin *origin)
 {
-    Browser_Window *window = browser_view_find(sd->self);
+    Browser_Window *window = window_find_with_ewk_view(sd->self);
 
     /* Go fullscreen */
-    elm_win_fullscreen_set(window->window, EINA_TRUE);
+    elm_win_fullscreen_set(window->elm_window, EINA_TRUE);
 
     /* Show user popup */
-    Evas_Object *permission_popup = elm_popup_add(window->window);
+    Evas_Object *permission_popup = elm_popup_add(window->elm_window);
     evas_object_size_hint_weight_set(permission_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 
     Eina_Strbuf *message = eina_strbuf_new();
@@ -725,7 +1039,7 @@
 
     /* Popup buttons */
     PermissionData *permission_data = (PermissionData *)malloc(sizeof(PermissionData));
-    permission_data->webview = window->webview;
+    permission_data->ewk_view = window->ewk_view;
     permission_data->permission_popup = permission_popup;
     Evas_Object *accept_button = elm_button_add(permission_popup);
     elm_object_text_set(accept_button, "Accept");
@@ -744,22 +1058,48 @@
 
 static Eina_Bool on_fullscreen_exit(Ewk_View_Smart_Data *sd)
 {
-    Browser_Window *window = browser_view_find(sd->self);
+    Browser_Window *window = window_find_with_ewk_view(sd->self);
 
-    elm_win_fullscreen_set(window->window, EINA_FALSE);
+    elm_win_fullscreen_set(window->elm_window, EINA_FALSE);
 
     return EINA_TRUE;
 }
 
-typedef struct {
-    Evas_Object *popup;
-    Ewk_Auth_Request *request;
-    Evas_Object *username_entry;
-    Evas_Object *password_entry;
-} AuthData;
+static Evas_Object *
+on_window_create(Ewk_View_Smart_Data *smartData, const char *url, const Ewk_Window_Features *window_features)
+{
+    int x = 0;
+    int y = 0;
+    int width = 0;
+    int height = 0;
+
+    ewk_window_features_geometry_get(window_features, &x, &y, &width, &height);
+
+    if (!width)
+        width = window_width;
+
+    if (!height)
+        height = window_height;
+
+    Browser_Window *window = window_create(smartData->self, url, width, height, EINA_FALSE);
+    Evas_Object *new_view = window->ewk_view;
+
+    windows = eina_list_append(windows, window);
+
+    info("minibrowser: location(%d,%d) size=(%d,%d) url=%s\n", x, y, width, height, url);
+
+    return new_view;
+}
 
 static void
-auth_popup_close(AuthData *auth_data)
+on_window_close(Ewk_View_Smart_Data *smartData)
+{
+    Browser_Window *window = window_find_with_ewk_view(smartData->self);
+    window_close(window);
+}
+
+static void
+auth_popup_close(Auth_Data *auth_data)
 {
     ewk_object_unref(auth_data->request);
     evas_object_del(auth_data->popup);
@@ -769,7 +1109,7 @@
 static void
 on_auth_cancel(void *user_data, Evas_Object *obj, void *event_info)
 {
-    AuthData *auth_data = (AuthData *)user_data;
+    Auth_Data *auth_data = (Auth_Data *)user_data;
 
     ewk_auth_request_cancel(auth_data->request);
 
@@ -779,7 +1119,7 @@
 static void
 on_auth_ok(void *user_data, Evas_Object *obj, void *event_info)
 {
-    AuthData *auth_data = (AuthData *)user_data;
+    Auth_Data *auth_data = (Auth_Data *)user_data;
 
     const char *username = elm_entry_entry_get(auth_data->username_entry);
     const char *password = elm_entry_entry_get(auth_data->password_entry);
@@ -794,10 +1134,10 @@
     Browser_Window *window = (Browser_Window *)user_data;
     Ewk_Auth_Request *request = ewk_object_ref((Ewk_Auth_Request *)event_info);
 
-    AuthData *auth_data = (AuthData *)malloc(sizeof(AuthData));
+    Auth_Data *auth_data = (Auth_Data *)malloc(sizeof(Auth_Data));
     auth_data->request = request;
 
-    Evas_Object *auth_popup = elm_popup_add(window->window);
+    Evas_Object *auth_popup = elm_popup_add(window->elm_window);
     auth_data->popup = auth_popup;
     evas_object_size_hint_weight_set(auth_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     elm_object_part_text_set(auth_popup, "title,text", "Authentication Required");
@@ -814,8 +1154,8 @@
     Evas_Object *label = elm_label_add(auth_popup);
     elm_label_line_wrap_set(label, ELM_WRAP_WORD);
     Eina_Strbuf *auth_text = eina_strbuf_new();
-    const char* host = ewk_auth_request_host_get(request);
-    const char* realm = ewk_auth_request_realm_get(request);
+    const char *host = ewk_auth_request_host_get(request);
+    const char *realm = ewk_auth_request_realm_get(request);
     eina_strbuf_append_printf(auth_text, "A username and password are being requested by %s. The site says: \"%s\"", host, realm ? realm : "");
     elm_object_text_set(label, eina_strbuf_string_get(auth_text));
     eina_strbuf_free(auth_text);
@@ -889,10 +1229,11 @@
 on_tooltip_text_set(void *user_data, Evas_Object *obj, void *event_info)
 {
     Browser_Window *window = (Browser_Window *)user_data;
-    const char* message = (const char*)event_info;
+    const char *message = (const char*)event_info;
 
-    elm_object_tooltip_text_set(window->webview, message);
-    elm_object_tooltip_show(window->webview);
+    elm_object_tooltip_text_set(window->elm_window, message);
+    window->tooltip.text_set = EINA_TRUE;
+    window_tooltip_update(window);
 }
 
 static void
@@ -900,29 +1241,31 @@
 {
     Browser_Window *window = (Browser_Window *)user_data;
 
-    elm_object_tooltip_unset(window->webview);
+    window_tooltip_hide(window);
+    elm_object_tooltip_unset(window->elm_window);
+    window->tooltip.text_set = EINA_FALSE;
 }
 
 static void
 on_home_button_clicked(void *user_data, Evas_Object *home_button, void *event_info)
 {
-    Browser_Window *app_data = (Browser_Window *)user_data;
+    Browser_Window *window = (Browser_Window *)user_data;
 
-    ewk_view_url_set(app_data->webview, DEFAULT_URL);
+    ewk_view_url_set(window->ewk_view, DEFAULT_URL);
 }
 
 static void
-on_window_deletion(void *user_data, Evas_Object *window, void *event_info)
+on_window_deletion(void *user_data, Evas_Object *elm_window, void *event_info)
 {
-    window_close(browser_window_find(window));
+    window_close(window_find_with_elm_window(elm_window));
 }
 
 static Evas_Object *
-create_toolbar_button(Evas_Object *window, const char *icon_name)
+create_toolbar_button(Evas_Object *elm_window, const char *icon_name)
 {
-    Evas_Object *button = elm_button_add(window);
+    Evas_Object *button = elm_button_add(elm_window);
 
-    Evas_Object *icon = elm_icon_add(window);
+    Evas_Object *icon = elm_icon_add(elm_window);
     elm_icon_standard_set(icon, icon_name);
     evas_object_size_hint_max_set(icon, TOOL_BAR_ICON_SIZE, TOOL_BAR_ICON_SIZE);
     evas_object_color_set(icon, 44, 44, 102, 128);
@@ -933,35 +1276,41 @@
     return button;
 }
 
-static Browser_Window *window_create(const char *url)
+static Browser_Window *window_create(Evas_Object *opener, const char *url, int width, int height, Eina_Bool view_mode)
 {
-    Browser_Window *app_data = malloc(sizeof(Browser_Window));
-    if (!app_data) {
+    Browser_Window *window = calloc(1, sizeof(Browser_Window));
+    if (!window) {
         info("ERROR: could not create browser window.\n");
         return NULL;
     }
 
+    /* Initialize tooltip information */
+    window->tooltip.show_timer = NULL;
+    window->tooltip.activated = EINA_FALSE;
+    window->tooltip.text_set = EINA_FALSE;
+    window->tooltip.shown = EINA_FALSE;
+
     /* Create window */
-    app_data->window = elm_win_add(NULL, "minibrowser-window", ELM_WIN_BASIC);
-    elm_win_title_set(app_data->window, APP_NAME);
-    evas_object_smart_callback_add(app_data->window, "delete,request", on_window_deletion, &app_data);
+    window->elm_window = elm_win_add(NULL, "minibrowser-window", ELM_WIN_BASIC);
+    elm_win_title_set(window->elm_window, APP_NAME);
+    evas_object_smart_callback_add(window->elm_window, "delete,request", on_window_deletion, &window);
 
     /* Create window background */
-    Evas_Object *bg = elm_bg_add(app_data->window);
+    Evas_Object *bg = elm_bg_add(window->elm_window);
     elm_bg_color_set(bg, 193, 192, 191);
     evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    elm_win_resize_object_add(app_data->window, bg);
+    elm_win_resize_object_add(window->elm_window, bg);
     evas_object_show(bg);
 
     /* Create vertical layout */
-    Evas_Object *vertical_layout = elm_box_add(app_data->window);
+    Evas_Object *vertical_layout = elm_box_add(window->elm_window);
     elm_box_padding_set(vertical_layout, 0, 2);
     evas_object_size_hint_weight_set(vertical_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    elm_win_resize_object_add(app_data->window, vertical_layout);
+    elm_win_resize_object_add(window->elm_window, vertical_layout);
     evas_object_show(vertical_layout);
 
     /* Create horizontal layout for top bar */
-    Evas_Object *horizontal_layout = elm_box_add(app_data->window);
+    Evas_Object *horizontal_layout = elm_box_add(window->elm_window);
     elm_box_horizontal_set(horizontal_layout, EINA_TRUE);
     evas_object_size_hint_weight_set(horizontal_layout, EVAS_HINT_EXPAND, 0.0);
     evas_object_size_hint_align_set(horizontal_layout, EVAS_HINT_FILL, 0.0);
@@ -969,54 +1318,94 @@
     evas_object_show(horizontal_layout);
 
     /* Create Back button */
-    app_data->back_button = create_toolbar_button(app_data->window, "arrow_left");
-    evas_object_smart_callback_add(app_data->back_button, "clicked", on_back_button_clicked, app_data);
-    elm_object_disabled_set(app_data->back_button, EINA_TRUE);
-    evas_object_size_hint_weight_set(app_data->back_button, 0.0, EVAS_HINT_EXPAND);
-    evas_object_size_hint_align_set(app_data->back_button, 0.0, 0.5);
-    elm_box_pack_end(horizontal_layout, app_data->back_button);
-    evas_object_show(app_data->back_button);
+    window->back_button = create_toolbar_button(window->elm_window, "arrow_left");
+    evas_object_smart_callback_add(window->back_button, "clicked", on_back_button_clicked, window);
+    elm_object_disabled_set(window->back_button, EINA_TRUE);
+    evas_object_size_hint_weight_set(window->back_button, 0.0, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(window->back_button, 0.0, 0.5);
+    elm_box_pack_end(horizontal_layout, window->back_button);
+    evas_object_show(window->back_button);
 
     /* Create Forward button */
-    app_data->forward_button = create_toolbar_button(app_data->window, "arrow_right");
-    evas_object_smart_callback_add(app_data->forward_button, "clicked", on_forward_button_clicked, app_data);
-    elm_object_disabled_set(app_data->forward_button, EINA_TRUE);
-    evas_object_size_hint_weight_set(app_data->forward_button, 0.0, EVAS_HINT_EXPAND);
-    evas_object_size_hint_align_set(app_data->forward_button, 0.0, 0.5);
-    elm_box_pack_end(horizontal_layout, app_data->forward_button);
-    evas_object_show(app_data->forward_button);
+    window->forward_button = create_toolbar_button(window->elm_window, "arrow_right");
+    evas_object_smart_callback_add(window->forward_button, "clicked", on_forward_button_clicked, window);
+    elm_object_disabled_set(window->forward_button, EINA_TRUE);
+    evas_object_size_hint_weight_set(window->forward_button, 0.0, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(window->forward_button, 0.0, 0.5);
+    elm_box_pack_end(horizontal_layout, window->forward_button);
+    evas_object_show(window->forward_button);
 
     /* Create URL bar */
-    app_data->url_bar = elm_entry_add(app_data->window);
-    elm_entry_scrollable_set(app_data->url_bar, EINA_TRUE);
-    elm_entry_scrollbar_policy_set(app_data->url_bar, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-    elm_entry_single_line_set(app_data->url_bar, EINA_TRUE);
-    elm_entry_cnp_mode_set(app_data->url_bar, ELM_CNP_MODE_PLAINTEXT);
-    elm_entry_text_style_user_push(app_data->url_bar, "DEFAULT='font_size=18'");
-    evas_object_smart_callback_add(app_data->url_bar, "activated", on_url_bar_activated, app_data);
-    evas_object_smart_callback_add(app_data->url_bar, "clicked", on_url_bar_clicked, app_data);
-    evas_object_size_hint_weight_set(app_data->url_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    evas_object_size_hint_align_set(app_data->url_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    elm_box_pack_end(horizontal_layout, app_data->url_bar);
-    evas_object_show(app_data->url_bar);
+    window->url_bar = elm_entry_add(window->elm_window);
+    elm_entry_scrollable_set(window->url_bar, EINA_TRUE);
+    elm_entry_scrollbar_policy_set(window->url_bar, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+    elm_entry_single_line_set(window->url_bar, EINA_TRUE);
+    elm_entry_cnp_mode_set(window->url_bar, ELM_CNP_MODE_PLAINTEXT);
+    elm_entry_text_style_user_push(window->url_bar, "DEFAULT='font_size=18'");
+    evas_object_smart_callback_add(window->url_bar, "activated", on_url_bar_activated, window);
+    evas_object_smart_callback_add(window->url_bar, "clicked", on_url_bar_clicked, window);
+    evas_object_size_hint_weight_set(window->url_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(window->url_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    elm_box_pack_end(horizontal_layout, window->url_bar);
+    evas_object_show(window->url_bar);
 
     /* Create Refresh button */
-    Evas_Object *refresh_button = create_toolbar_button(app_data->window, "refresh");
-    evas_object_smart_callback_add(refresh_button, "clicked", on_refresh_button_clicked, app_data);
+    Evas_Object *refresh_button = create_toolbar_button(window->elm_window, "refresh");
+    evas_object_smart_callback_add(refresh_button, "clicked", on_refresh_button_clicked, window);
     evas_object_size_hint_weight_set(refresh_button, 0.0, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(refresh_button, 1.0, 0.5);
     elm_box_pack_end(horizontal_layout, refresh_button);
     evas_object_show(refresh_button);
 
     /* Create Home button */
-    Evas_Object *home_button = create_toolbar_button(app_data->window, "home");
-    evas_object_smart_callback_add(home_button, "clicked", on_home_button_clicked, app_data);
+    Evas_Object *home_button = create_toolbar_button(window->elm_window, "home");
+    evas_object_smart_callback_add(home_button, "clicked", on_home_button_clicked, window);
     evas_object_size_hint_weight_set(home_button, 0.0, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(home_button, 1.0, 0.5);
     elm_box_pack_end(horizontal_layout, home_button);
     evas_object_show(home_button);
 
-    /* Create webview */
+    /* Create Search bar */
+    window->search.search_bar = elm_box_add(window->elm_window);
+    elm_box_horizontal_set(window->search.search_bar, EINA_TRUE);
+    evas_object_size_hint_min_set(window->search.search_bar, SEARCH_FIELD_SIZE + 2 * SEARCH_BUTTON_SIZE, 0);
+    evas_object_size_hint_align_set(window->search.search_bar, 0.0, EVAS_HINT_FILL);
+    elm_box_pack_end(vertical_layout, window->search.search_bar);
+
+    /* Create Search field */
+    window->search.search_field = elm_entry_add(window->elm_window);
+    elm_entry_scrollable_set(window->search.search_field, EINA_TRUE);
+    elm_entry_scrollbar_policy_set(window->search.search_field, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+    elm_entry_single_line_set(window->search.search_field, EINA_TRUE);
+    elm_entry_cnp_mode_set(window->search.search_field, ELM_CNP_MODE_PLAINTEXT);
+    elm_entry_text_style_user_push(window->search.search_field, "DEFAULT='font_size=14'");
+    evas_object_smart_callback_add(window->search.search_field, "activated", on_search_field_activated, window);
+    evas_object_smart_callback_add(window->search.search_field, "changed", on_search_field_activated, window);
+    evas_object_smart_callback_add(window->search.search_field, "aborted", on_search_field_aborted, window);
+    evas_object_smart_callback_add(window->search.search_field, "clicked", on_search_field_clicked, window);
+    evas_object_size_hint_weight_set(window->search.search_field, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(window->search.search_field, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    elm_box_pack_end(window->search.search_bar, window->search.search_field);
+
+    /* Create Search backward button */
+    window->search.backward_button = create_toolbar_button(window->elm_window, "arrow_up");
+    evas_object_smart_callback_add(window->search.backward_button, "clicked", on_search_backward_button_clicked, window);
+    elm_object_disabled_set(window->search.backward_button, EINA_FALSE);
+    evas_object_size_hint_weight_set(window->search.backward_button, 0.0, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(window->search.backward_button, 1.0, 0.5);
+    evas_object_size_hint_min_set(window->search.backward_button, SEARCH_BUTTON_SIZE, SEARCH_BUTTON_SIZE);
+    elm_box_pack_end(window->search.search_bar, window->search.backward_button);
+
+    /* Create Search forwardward button */
+    window->search.forward_button = create_toolbar_button(window->elm_window, "arrow_down");
+    evas_object_smart_callback_add(window->search.forward_button, "clicked", on_search_forward_button_clicked, window);
+    elm_object_disabled_set(window->search.forward_button, EINA_FALSE);
+    evas_object_size_hint_weight_set(window->search.forward_button, 0.0, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(window->search.forward_button, 1.0, 0.5);
+    evas_object_size_hint_min_set(window->search.forward_button, SEARCH_BUTTON_SIZE, SEARCH_BUTTON_SIZE);
+    elm_box_pack_end(window->search.search_bar, window->search.forward_button);
+
+    /* Create ewk_view */
     Ewk_View_Smart_Class *ewkViewClass = miniBrowserViewSmartClass();
     ewkViewClass->run_javascript_alert = on_javascript_alert;
     ewkViewClass->run_javascript_confirm = on_javascript_confirm;
@@ -1025,52 +1414,75 @@
     ewkViewClass->window_geometry_set = on_window_geometry_set;
     ewkViewClass->fullscreen_enter = on_fullscreen_enter;
     ewkViewClass->fullscreen_exit = on_fullscreen_exit;
+    ewkViewClass->window_create = on_window_create;
+    ewkViewClass->window_close = on_window_close;
+    ewkViewClass->popup_menu_show = on_popup_menu_show;
+    ewkViewClass->popup_menu_hide = on_popup_menu_hide;
 
-    Evas *evas = evas_object_evas_get(app_data->window);
-    Evas_Smart *smart = evas_smart_class_new(&ewkViewClass->sc);
-    app_data->webview = ewk_view_smart_add(evas, smart, ewk_context_default_get());
-    ewk_view_theme_set(app_data->webview, THEME_DIR "/default.edj");
+    Evas *evas = evas_object_evas_get(window->elm_window);
+    if (legacy_behavior_enabled) {
+        // Use raw WK2 api to create a view using legacy mode.
+        window->ewk_view = (Evas_Object*)WKViewCreate(evas, 0, 0);
+    } else {
+        Evas_Smart *smart = evas_smart_class_new(&ewkViewClass->sc);
+        Ewk_Context *context = opener ? ewk_view_context_get(opener) : ewk_context_default_get();
+        Ewk_Page_Group *pageGroup = opener ? ewk_view_page_group_get(opener) : ewk_page_group_create("");
+        window->ewk_view = ewk_view_smart_add(evas, smart, context, pageGroup);
+    }
+    ewk_view_theme_set(window->ewk_view, THEME_DIR "/default.edj");
+    if (device_pixel_ratio)
+        ewk_view_device_pixel_ratio_set(window->ewk_view, (float)device_pixel_ratio);
+    ewk_view_source_mode_set(window->ewk_view, view_mode);
 
-    Ewk_Settings *settings = ewk_view_settings_get(app_data->webview);
+    /* Set the zoom level to default */
+    window->current_zoom_level = DEFAULT_ZOOM_LEVEL;
+
+    Ewk_Settings *settings = ewk_view_settings_get(window->ewk_view);
     ewk_settings_file_access_from_file_urls_allowed_set(settings, EINA_TRUE);
     ewk_settings_encoding_detector_enabled_set(settings, encoding_detector_enabled);
     ewk_settings_frame_flattening_enabled_set(settings, frame_flattening_enabled);
+    ewk_settings_local_storage_enabled_set(settings, local_storage_enabled);
+    info("HTML5 local storage is %s for this view.\n", local_storage_enabled ? "enabled" : "disabled");
+    elm_win_fullscreen_set(window->elm_window, fullscreen_enabled);
     ewk_settings_developer_extras_enabled_set(settings, EINA_TRUE);
     ewk_settings_preferred_minimum_contents_width_set(settings, 0);
 
-    evas_object_smart_callback_add(app_data->webview, "authentication,request", on_authentication_request, app_data);
-    evas_object_smart_callback_add(app_data->webview, "close,window", on_close_window, app_data);
-    evas_object_smart_callback_add(app_data->webview, "create,window", on_new_window, app_data);
-    evas_object_smart_callback_add(app_data->webview, "download,failed", on_download_failed, app_data);
-    evas_object_smart_callback_add(app_data->webview, "download,finished", on_download_finished, app_data);
-    evas_object_smart_callback_add(app_data->webview, "download,request", on_download_request, app_data);
-    evas_object_smart_callback_add(app_data->webview, "file,chooser,request", on_file_chooser_request, app_data);
-    evas_object_smart_callback_add(app_data->webview, "icon,changed", on_view_icon_changed, app_data);
-    evas_object_smart_callback_add(app_data->webview, "load,error", on_error, app_data);
-    evas_object_smart_callback_add(app_data->webview, "load,progress", on_progress, app_data);
-    evas_object_smart_callback_add(app_data->webview, "title,changed", on_title_changed, app_data);
-    evas_object_smart_callback_add(app_data->webview, "url,changed", on_url_changed, app_data);
-    evas_object_smart_callback_add(app_data->webview, "back,forward,list,changed", on_back_forward_list_changed, app_data);
-    evas_object_smart_callback_add(app_data->webview, "tooltip,text,set", on_tooltip_text_set, app_data);
-    evas_object_smart_callback_add(app_data->webview, "tooltip,text,unset", on_tooltip_text_unset, app_data);
+    evas_object_smart_callback_add(window->ewk_view, "authentication,request", on_authentication_request, window);
+    evas_object_smart_callback_add(window->ewk_view, "download,failed", on_download_failed, window);
+    evas_object_smart_callback_add(window->ewk_view, "download,finished", on_download_finished, window);
+    evas_object_smart_callback_add(window->ewk_view, "download,request", on_download_request, window);
+    evas_object_smart_callback_add(window->ewk_view, "file,chooser,request", on_file_chooser_request, window);
+    evas_object_smart_callback_add(window->ewk_view, "favicon,changed", on_view_favicon_changed, window);
+    evas_object_smart_callback_add(window->ewk_view, "load,error", on_error, window);
+    evas_object_smart_callback_add(window->ewk_view, "load,progress", on_progress, window);
+    evas_object_smart_callback_add(window->ewk_view, "title,changed", on_title_changed, window);
+    evas_object_smart_callback_add(window->ewk_view, "url,changed", on_url_changed, window);
+    evas_object_smart_callback_add(window->ewk_view, "back,forward,list,changed", on_back_forward_list_changed, window);
+    evas_object_smart_callback_add(window->ewk_view, "tooltip,text,set", on_tooltip_text_set, window);
+    evas_object_smart_callback_add(window->ewk_view, "tooltip,text,unset", on_tooltip_text_unset, window);
 
-    evas_object_event_callback_add(app_data->webview, EVAS_CALLBACK_KEY_DOWN, on_key_down, app_data);
-    evas_object_event_callback_add(app_data->webview, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down, app_data);
+    evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_KEY_DOWN, on_key_down, window);
+    evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down, window);
 
-    evas_object_size_hint_weight_set(app_data->webview, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    evas_object_size_hint_align_set(app_data->webview, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    elm_box_pack_end(vertical_layout, app_data->webview);
-    evas_object_show(app_data->webview);
+    evas_object_size_hint_weight_set(window->ewk_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(window->ewk_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    elm_box_pack_before(vertical_layout, window->ewk_view, window->search.search_bar);
+    evas_object_show(window->ewk_view);
 
-    if (url)
-        ewk_view_url_set(app_data->webview, url);
+    if (url && strcmp(url, "about:blank")) // Do not reset 'about:blank' as it would erase all previous document modifications.
+        ewk_view_url_set(window->ewk_view, url);
 
-    evas_object_resize(app_data->window, window_width, window_height);
-    evas_object_show(app_data->window);
+    evas_object_resize(window->elm_window, width ? width : window_width, height ? height : window_height);
+    evas_object_show(window->elm_window);
+    search_box_hide(window);
 
-    view_focus_set(app_data, EINA_TRUE);
+    view_focus_set(window, EINA_TRUE);
 
-    return app_data;
+    evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_MOUSE_IN, on_mouse_in, window);
+    evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_MOUSE_OUT, on_mouse_out, window);
+    evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_MOUSE_MOVE, on_mouse_move, window);
+
+    return window;
 }
 
 static void
@@ -1109,9 +1521,13 @@
     Ecore_Getopt_Value values[] = {
         ECORE_GETOPT_VALUE_STR(evas_engine_name),
         ECORE_GETOPT_VALUE_STR(window_size_string),
+        ECORE_GETOPT_VALUE_BOOL(legacy_behavior_enabled),
+        ECORE_GETOPT_VALUE_DOUBLE(device_pixel_ratio),
         ECORE_GETOPT_VALUE_BOOL(quitOption),
         ECORE_GETOPT_VALUE_BOOL(encoding_detector_enabled),
         ECORE_GETOPT_VALUE_BOOL(frame_flattening_enabled),
+        ECORE_GETOPT_VALUE_BOOL(local_storage_enabled),
+        ECORE_GETOPT_VALUE_BOOL(fullscreen_enabled),
         ECORE_GETOPT_VALUE_BOOL(quitOption),
         ECORE_GETOPT_VALUE_BOOL(quitOption),
         ECORE_GETOPT_VALUE_BOOL(quitOption),
@@ -1150,10 +1566,10 @@
 
     if (args < argc) {
         char *url = url_from_user_input(argv[args]);
-        window = window_create(url);
+        window = window_create(NULL, url, 0, 0, EINA_FALSE);
         free(url);
     } else
-        window = window_create(DEFAULT_URL);
+        window = window_create(NULL, DEFAULT_URL, 0, 0, EINA_FALSE);
 
     if (!window)
         return quit(EINA_FALSE, "ERROR: could not create browser window.\n");
@@ -1165,3 +1581,4 @@
     return quit(EINA_TRUE, NULL);
 }
 ELM_MAIN()
+
diff --git a/Tools/MiniBrowser/gtk/BrowserWindow.c b/Tools/MiniBrowser/gtk/BrowserWindow.c
index 86b0446..a5b0cd3 100644
--- a/Tools/MiniBrowser/gtk/BrowserWindow.c
+++ b/Tools/MiniBrowser/gtk/BrowserWindow.c
@@ -52,6 +52,10 @@
     WebKitWebView *webView;
     GtkWidget *downloadsBar;
     GdkPixbuf *favicon;
+#if GTK_CHECK_VERSION(3, 2, 0)
+    GtkWidget *fullScreenMessageLabel;
+    guint fullScreenMessageLabelId;
+#endif
 };
 
 struct _BrowserWindowClass {
@@ -261,6 +265,50 @@
     gtk_widget_show(GTK_WIDGET(window));
 }
 
+#if GTK_CHECK_VERSION(3, 2, 0)
+static gboolean fullScreenMessageTimeoutCallback(BrowserWindow *window)
+{
+    gtk_widget_hide(window->fullScreenMessageLabel);
+    window->fullScreenMessageLabelId = 0;
+    return FALSE;
+}
+#endif
+
+static gboolean webViewEnterFullScreen(WebKitWebView *webView, BrowserWindow *window)
+{
+#if GTK_CHECK_VERSION(3, 2, 0)
+    const gchar *titleOrURI = webkit_web_view_get_title(window->webView);
+    if (!titleOrURI)
+        titleOrURI = webkit_web_view_get_uri(window->webView);
+    gchar *message = g_strdup_printf("%s is now full screen. Press ESC or f to exit.", titleOrURI);
+    gtk_label_set_text(GTK_LABEL(window->fullScreenMessageLabel), message);
+    g_free(message);
+
+    gtk_widget_show(window->fullScreenMessageLabel);
+
+    window->fullScreenMessageLabelId = g_timeout_add_seconds(2, (GSourceFunc)fullScreenMessageTimeoutCallback, window);
+#endif
+
+    gtk_widget_hide(window->toolbar);
+
+    return FALSE;
+}
+
+static gboolean webViewLeaveFullScreen(WebKitWebView *webView, BrowserWindow *window)
+{
+#if GTK_CHECK_VERSION(3, 2, 0)
+    if (window->fullScreenMessageLabelId) {
+        g_source_remove(window->fullScreenMessageLabelId);
+        window->fullScreenMessageLabelId = 0;
+    }
+    gtk_widget_hide(window->fullScreenMessageLabel);
+#endif
+
+    gtk_widget_show(window->toolbar);
+
+    return FALSE;
+}
+
 static GtkWidget *webViewCreate(WebKitWebView *webView, BrowserWindow *window)
 {
     WebKitWebView *newWebView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(webkit_web_view_get_context(webView)));
@@ -396,6 +444,11 @@
         window->favicon = NULL;
     }
 
+#if GTK_CHECK_VERSION(3, 2, 0)
+    if (window->fullScreenMessageLabelId)
+        g_source_remove(window->fullScreenMessageLabelId);
+#endif
+
     G_OBJECT_CLASS(browser_window_parent_class)->finalize(gObject);
 
     if (g_atomic_int_dec_and_test(&windowCount))
@@ -513,6 +566,8 @@
     g_signal_connect(window->webView, "mouse-target-changed", G_CALLBACK(webViewMouseTargetChanged), window);
     g_signal_connect(window->webView, "notify::zoom-level", G_CALLBACK(webViewZoomLevelChanged), window);
     g_signal_connect(window->webView, "notify::favicon", G_CALLBACK(faviconChanged), window);
+    g_signal_connect(window->webView, "enter-fullscreen", G_CALLBACK(webViewEnterFullScreen), window);
+    g_signal_connect(window->webView, "leave-fullscreen", G_CALLBACK(webViewLeaveFullScreen), window);
 
     g_signal_connect(webkit_web_view_get_context(window->webView), "download-started", G_CALLBACK(downloadStarted), window);
 
@@ -534,6 +589,12 @@
     gtk_overlay_add_overlay(GTK_OVERLAY(overlay), window->statusLabel);
 
     gtk_container_add(GTK_CONTAINER(overlay), GTK_WIDGET(window->webView));
+
+    window->fullScreenMessageLabel = gtk_label_new(NULL);
+    gtk_widget_set_halign(window->fullScreenMessageLabel, GTK_ALIGN_CENTER);
+    gtk_widget_set_valign(window->fullScreenMessageLabel, GTK_ALIGN_CENTER);
+    gtk_widget_set_no_show_all(window->fullScreenMessageLabel, TRUE);
+    gtk_overlay_add_overlay(GTK_OVERLAY(overlay), window->fullScreenMessageLabel);
 #else
     gtk_box_pack_start(GTK_BOX(window->mainBox), GTK_WIDGET(window->webView), TRUE, TRUE, 0);
 #endif
diff --git a/Tools/MiniBrowser/gtk/GNUmakefile.am b/Tools/MiniBrowser/gtk/GNUmakefile.am
index 50974ae..2f20d42 100644
--- a/Tools/MiniBrowser/gtk/GNUmakefile.am
+++ b/Tools/MiniBrowser/gtk/GNUmakefile.am
@@ -9,8 +9,10 @@
 	-I$(top_builddir)/DerivedSources/WebKit2/webkit2gtk \
 	-I$(top_builddir)/DerivedSources/WebKit2/webkit2gtk/include \
 	-DWEBKIT_EXEC_PATH=\"${shell pwd}/$(top_builddir)/Programs/\" \
+	-DWEBKIT_INJECTED_BUNDLE_PATH=\"${shell pwd}/$(top_builddir)/.libs\" \
 	$(global_cppflags) \
 	$(javascriptcore_cppflags) \
+	$(FREETYPE_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	$(GTK_CFLAGS)
 
@@ -33,6 +35,7 @@
 
 Programs_MiniBrowser_LDADD = \
 	libwebkit2gtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
+	$(FREETYPE_LIBS) \
 	$(GLIB_LIBS) \
 	$(GTK_LIBS) \
 	$(LIBSOUP_LIBS)
diff --git a/Tools/MiniBrowser/gtk/main.c b/Tools/MiniBrowser/gtk/main.c
index c7367df..17e46f4 100644
--- a/Tools/MiniBrowser/gtk/main.c
+++ b/Tools/MiniBrowser/gtk/main.c
@@ -226,6 +226,7 @@
 #ifdef WEBKIT_EXEC_PATH
     g_setenv("WEBKIT_INSPECTOR_PATH", WEBKIT_EXEC_PATH "resources/inspector", FALSE);
 #endif /* WEBKIT_EXEC_PATH */
+    g_setenv("WEBKIT_INJECTED_BUNDLE_PATH", WEBKIT_INJECTED_BUNDLE_PATH, FALSE);
 
     // Enable the favicon database, by specifying the default directory.
     webkit_web_context_set_favicon_database_directory(webkit_web_context_get_default(), NULL);
diff --git a/Tools/MiniBrowser/mac/WK1BrowserWindowController.m b/Tools/MiniBrowser/mac/WK1BrowserWindowController.m
index 273adb5..9953643 100644
--- a/Tools/MiniBrowser/mac/WK1BrowserWindowController.m
+++ b/Tools/MiniBrowser/mac/WK1BrowserWindowController.m
@@ -48,6 +48,9 @@
 
 - (void)dealloc
 {
+    [_webView setFrameLoadDelegate:nil];
+    [_webView setUIDelegate:nil];
+    [_webView setResourceLoadDelegate:nil];
     [_webView release];
 
     [super dealloc];
@@ -250,4 +253,16 @@
     [[self window] setTitle:[title stringByAppendingString:@" [WK1]"]];
 }
 
+- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
+{
+    NSAlert *alert = [[NSAlert alloc] init];
+    [alert addButtonWithTitle:@"OK"];
+
+    alert.messageText = [NSString stringWithFormat:@"JavaScript alert dialog from %@.", frame.dataSource.request.URL.absoluteString];
+    alert.informativeText = message;
+
+    [alert runModal];
+    [alert release];
+}
+
 @end
diff --git a/Tools/MiniBrowser/mac/WK2BrowserWindowController.m b/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
index 1731eb6..4517a02 100644
--- a/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
+++ b/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
@@ -638,10 +638,12 @@
         0, // didNewFirstVisuallyNonEmptyLayout
         0, // willGoToBackForwardListItem
         0, // interactionOccurredWhileProcessUnresponsive
-        0, // pluginDidFail
+        0, // pluginDidFail_deprecatedForUseWithV1
         0, // didReceiveIntentForFrame
         0, // registerIntentServiceForFrame
         0, // didLayout
+        0, // pluginLoadPolicy
+        0, // pluginDidFail
     };
     WKPageSetPageLoaderClient(_webView.pageRef, &loadClient);
     
@@ -700,9 +702,10 @@
         createNewPage,
         mouseDidMoveOverElement,
         0, // decidePolicyForNotificationPermissionRequest
-        0, // unavailablePluginButtonClicked
+        0, // unavailablePluginButtonClicked_deprecatedForUseWithV1
         0, // showColorPicker
         0, // hideColorPicker
+        0, // unavailablePluginButtonClicked
     };
     WKPageSetPageUIClient(_webView.pageRef, &uiClient);
 }
diff --git a/Tools/MiniBrowser/qt/BrowserWindow.cpp b/Tools/MiniBrowser/qt/BrowserWindow.cpp
index 70750c6..8472d5c 100644
--- a/Tools/MiniBrowser/qt/BrowserWindow.cpp
+++ b/Tools/MiniBrowser/qt/BrowserWindow.cpp
@@ -39,8 +39,8 @@
 BrowserWindow::BrowserWindow(WindowOptions* options)
     : m_windowOptions(options)
 {
-    setWindowTitle("MiniBrowser");
-    setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
+    setTitle("MiniBrowser");
+    setFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
     setResizeMode(QQuickView::SizeRootObjectToView);
 
     // This allows starting MiniBrowser from the build directory without previously defining QML_IMPORT_PATH.
@@ -104,6 +104,11 @@
     QMetaObject::invokeMethod(rootObject(), "focusAddressBar", Qt::DirectConnection);
 }
 
+void BrowserWindow::toggleFind()
+{
+    QMetaObject::invokeMethod(rootObject(), "toggleFind", Qt::DirectConnection);
+}
+
 BrowserWindow* BrowserWindow::newWindow(const QString& url)
 {
     BrowserWindow* window = new BrowserWindow(m_windowOptions);
@@ -113,14 +118,22 @@
 
 void BrowserWindow::updateVisualMockTouchPoints(const QList<QTouchEvent::TouchPoint>& touchPoints)
 {
+    if (touchPoints.isEmpty()) {
+        // Hide all touch indicator items.
+        foreach (QQuickItem* item, m_activeMockComponents.values())
+            item->setProperty("pressed", false);
+
+        return;
+    }
+
     foreach (const QTouchEvent::TouchPoint& touchPoint, touchPoints) {
-        QString mockTouchPointIdentifier = QString("mockTouchPoint%1").arg(touchPoint.id());
-        QQuickItem* mockTouchPointItem = rootObject()->findChild<QQuickItem*>(mockTouchPointIdentifier, Qt::FindDirectChildrenOnly);
+        QQuickItem* mockTouchPointItem = m_activeMockComponents.value(touchPoint.id());
 
         if (!mockTouchPointItem) {
             QQmlComponent touchMockPointComponent(engine(), QUrl("qrc:///qml/MockTouchPoint.qml"));
             mockTouchPointItem = qobject_cast<QQuickItem*>(touchMockPointComponent.create());
-            mockTouchPointItem->setObjectName(mockTouchPointIdentifier);
+            Q_ASSERT(mockTouchPointItem);
+            m_activeMockComponents.insert(touchPoint.id(), mockTouchPointItem);
             mockTouchPointItem->setProperty("pointId", QVariant(touchPoint.id()));
             mockTouchPointItem->setParent(rootObject());
             mockTouchPointItem->setParentItem(rootObject());
@@ -147,7 +160,7 @@
 {
     if (title.isEmpty())
         title = QLatin1String("MiniBrowser");
-    setWindowTitle(title);
+    setTitle(title);
 }
 
 void BrowserWindow::zoomIn()
diff --git a/Tools/MiniBrowser/qt/BrowserWindow.h b/Tools/MiniBrowser/qt/BrowserWindow.h
index 0f30e2c..2ecfc14 100644
--- a/Tools/MiniBrowser/qt/BrowserWindow.h
+++ b/Tools/MiniBrowser/qt/BrowserWindow.h
@@ -45,6 +45,7 @@
     void load(const QString& url);
     void reload();
     void focusAddressBar();
+    void toggleFind();
     QQuickWebView* webView() const;
     QQuickWebViewExperimental* webViewExperimental() const;
 
@@ -67,6 +68,7 @@
     virtual void wheelEvent(QWheelEvent*);
 
     WindowOptions* m_windowOptions;
+    QHash<int, QQuickItem*> m_activeMockComponents;
     QVector<qreal> m_zoomLevels;
     unsigned m_currentZoomLevel;
 };
diff --git a/Tools/MiniBrowser/qt/MiniBrowser.pro b/Tools/MiniBrowser/qt/MiniBrowser.pro
index 0fbddbe..3db1c78 100644
--- a/Tools/MiniBrowser/qt/MiniBrowser.pro
+++ b/Tools/MiniBrowser/qt/MiniBrowser.pro
@@ -30,7 +30,7 @@
 
 have?(FONTCONFIG): PKGCONFIG += fontconfig
 
-QT += network gui-private quick quick-private webkitwidgets webkitwidgets-private
+QT += network gui-private quick quick-private webkit webkit-private
 macx: QT += xml
 
 RESOURCES += MiniBrowser.qrc
diff --git a/Tools/MiniBrowser/qt/MiniBrowser.qrc b/Tools/MiniBrowser/qt/MiniBrowser.qrc
index e21eef3..3fa6208 100644
--- a/Tools/MiniBrowser/qt/MiniBrowser.qrc
+++ b/Tools/MiniBrowser/qt/MiniBrowser.qrc
@@ -4,6 +4,7 @@
         <file>icons/checkbox_unchecked.png</file>
         <file>icons/contents_width.png</file>
         <file>icons/favicon.png</file>
+        <file>icons/find.png</file>
         <file>icons/folder.png</file>
         <file>icons/info.png</file>
         <file>icons/next.png</file>
diff --git a/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp b/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp
index ec919a6..6d5c6a6 100644
--- a/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp
+++ b/Tools/MiniBrowser/qt/MiniBrowserApplication.cpp
@@ -26,10 +26,14 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "config.h"
+
 #include "MiniBrowserApplication.h"
 
 #include "BrowserWindow.h"
+#if HAVE(QTTESTSUPPORT)
 #include "QtTestSupport.h"
+#endif
 #include "private/qquickwebview_p.h"
 #include "utils.h"
 #include <QRegExp>
@@ -106,6 +110,8 @@
     if (!browserWindow)
         return QGuiApplication::notify(target, event);
 
+    m_holdingControl = QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier);
+
     // In QML events are propagated through parents. But since the WebView
     // may consume key events, a shortcut might never reach the top QQuickItem.
     // Therefore we are checking here for shortcuts.
@@ -119,19 +125,25 @@
             browserWindow->focusAddressBar();
             return true;
         }
+        if ((keyEvent->key() == Qt::Key_F && keyEvent->modifiers() == Qt::ControlModifier) || keyEvent->key() == Qt::Key_F3) {
+            browserWindow->toggleFind();
+            return true;
+        }
     }
 
     if (event->type() == QEvent::KeyRelease && static_cast<QKeyEvent*>(event)->key() == Qt::Key_Control) {
         foreach (int id, m_heldTouchPoints)
-            if (m_touchPoints.contains(id))
+            if (m_touchPoints.contains(id) && !QGuiApplication::mouseButtons().testFlag(Qt::MouseButton(id))) {
                 m_touchPoints[id].setState(Qt::TouchPointReleased);
-        m_heldTouchPoints.clear();
-        sendTouchEvent(browserWindow, QEvent::TouchEnd, static_cast<QKeyEvent*>(event)->timestamp());
+                m_heldTouchPoints.remove(id);
+            } else
+                m_touchPoints[id].setState(Qt::TouchPointStationary);
+
+        sendTouchEvent(browserWindow, m_heldTouchPoints.isEmpty() ? QEvent::TouchEnd : QEvent::TouchUpdate, static_cast<QKeyEvent*>(event)->timestamp());
     }
 
     if (isMouseEvent(event)) {
         const QMouseEvent* const mouseEvent = static_cast<QMouseEvent*>(event);
-        m_holdingControl = mouseEvent->modifiers().testFlag(Qt::ControlModifier);
 
         QTouchEvent::TouchPoint touchPoint;
         touchPoint.setPressure(1);
@@ -334,8 +346,10 @@
             m_windowOptions.setRequestedWindowSize(QSize(list.at(0).toInt(), list.at(1).toInt()));
     }
 
+#if HAVE(QTTESTSUPPORT)
     if (takeOptionFlag(&args, QStringLiteral("--use-test-fonts")))
         WebKit::QtTestSupport::initializeTestFonts();
+#endif
 
     if (args.contains("-r")) {
         QString listFile = takeOptionValue(&args, "-r");
diff --git a/Tools/MiniBrowser/qt/icons/find.png b/Tools/MiniBrowser/qt/icons/find.png
new file mode 100644
index 0000000..b76afa3
--- /dev/null
+++ b/Tools/MiniBrowser/qt/icons/find.png
Binary files differ
diff --git a/Tools/MiniBrowser/qt/qml/BrowserWindow.qml b/Tools/MiniBrowser/qt/qml/BrowserWindow.qml
index c73308e..b4b5bc0 100644
--- a/Tools/MiniBrowser/qt/qml/BrowserWindow.qml
+++ b/Tools/MiniBrowser/qt/qml/BrowserWindow.qml
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
  * Copyright (C) 2010 University of Szeged
+ * Copyright (c) 2012 Hewlett-Packard Development Company, L.P.
  *
  * All rights reserved.
  *
@@ -54,7 +55,163 @@
         addressLine.forceActiveFocus()
         addressLine.selectAll()
     }
+    function toggleFind() {
+        findBar.toggle()
+    }
+    Rectangle {
+        id: findBar
+        z: webView.z + 1
+        y: navigationBar.y
+        anchors {
+            left: parent.left
+            right: parent.right
+        }
+        height: navigationBar.height
+        color: "#efefef"
+        visible: y > navigationBar.y
 
+        Behavior on y {NumberAnimation {duration: 250}}
+
+        function toggle() {
+            if (y == navigationBar.y) {
+                findTextInput.forceActiveFocus()
+                y += height
+            } else {
+                webView.forceActiveFocus()
+                y = navigationBar.y
+                find("",0);
+            }
+        }
+
+        function find(str, options) {
+            var findOptions = options | WebViewExperimental.FindHighlightAllOccurrences
+            findOptions |= WebViewExperimental.FindWrapsAroundDocument
+            webView.experimental.findText(str, findOptions)
+        }
+
+        Connections {
+            target: webView.experimental
+            onTextFound: {
+                failedOverlay.visible = matchCount == 0
+            }
+        }
+        Item {
+            anchors.fill: parent
+            Rectangle {
+                id: inputArea
+                height: 26
+                anchors {
+                    left: parent.left
+                    right: prevButton.left
+                    margins: 6
+                    verticalCenter: parent.verticalCenter
+                }
+                color: "white"
+                border.width: 1
+                border.color: "#bfbfbf"
+                radius: 3
+                Rectangle {
+                    id: failedOverlay
+                    anchors.fill: parent
+                    color: "red"
+                    opacity: 0.5
+                    radius: 6
+                    visible: false
+                }
+                TextInput {
+                    id: findTextInput
+                    clip: true
+                    selectByMouse: true
+                    horizontalAlignment: TextInput.AlignLeft
+                    anchors.fill: parent
+                    anchors.margins: 3
+                    font {
+                        pointSize: 11
+                        family: "Sans"
+                    }
+                    text: ""
+                    readOnly: !findBar.visible
+                    function doFind() {
+                        if (!findBar.visible) {
+                            return;
+                        }
+                        if (findTextInput.text == "") {
+                            failedOverlay.visible = false
+                        }
+                        findBar.find(findTextInput.text)
+                    }
+                    onTextChanged: {
+                        doFind()
+                    }
+                    Keys.onReturnPressed:{
+                        doFind()
+                    }
+                }
+            }
+            Rectangle {
+                id: prevButton
+                height: inputArea.height
+                width: height
+                anchors.right: nextButton.left
+                anchors.verticalCenter: parent.verticalCenter
+                color: "#efefef"
+                radius: 6
+
+                Image {
+                    anchors.centerIn: parent
+                    source: "../icons/previous.png"
+                }
+
+                Rectangle {
+                    anchors.fill: parent
+                    color: parent.color
+                    radius: parent.radius
+                    opacity: 0.8
+                    visible: !parent.enabled
+                }
+
+                MouseArea {
+                    anchors.fill: parent
+                    onPressed: { if (parent.enabled) parent.color = "#cfcfcf" }
+                    onReleased: { parent.color = "#efefef" }
+                    onClicked: {
+                        findBar.find(findTextInput.text, WebViewExperimental.FindBackward)
+                    }
+                }
+            }
+            Rectangle {
+                id: nextButton
+                height: inputArea.height
+                width: height
+                anchors.right: parent.right
+                anchors.verticalCenter: parent.verticalCenter
+                color: "#efefef"
+                radius: 6
+
+                Image {
+                    anchors.centerIn: parent
+                    source: "../icons/next.png"
+                }
+
+                Rectangle {
+                    anchors.fill: parent
+                    color: parent.color
+                    radius: parent.radius
+                    opacity: 0.8
+                    visible: !parent.enabled
+                }
+
+                MouseArea {
+                    anchors.fill: parent
+                    onPressed: { if (parent.enabled) parent.color = "#cfcfcf" }
+                    onReleased: { parent.color = "#efefef" }
+                    onClicked: {
+                        findBar.find(findTextInput.text, 0)
+                    }
+                }
+            }
+        }
+    }
     Rectangle {
         id: navigationBar
         color: "#efefef"
@@ -213,6 +370,27 @@
             }
 
             Rectangle {
+                id: findButton
+                height: parent.height
+                width: height
+                color: "#efefef"
+                radius: 6
+
+                Image {
+                    anchors.centerIn: parent
+                    opacity: 0.6
+                    source: "../icons/find.png"
+                }
+
+                MouseArea {
+                    anchors.fill: parent
+                    onClicked: {
+                        findBar.toggle()
+                    }
+                }
+            }
+
+            Rectangle {
                 id: touchEventsButton
                 height: parent.height
                 width: height
@@ -335,7 +513,7 @@
         clip: false
 
         anchors {
-            top: navigationBar.bottom
+            top: findBar.bottom
             left: parent.left
             right: parent.right
             bottom: parent.bottom
@@ -354,7 +532,6 @@
                 webView.loadHtml("Failed to load " + loadRequest.url, "", loadRequest.url)
         }
 
-        experimental.devicePixelRatio: 1.5
         experimental.preferences.fullScreenEnabled: true
         experimental.preferences.webGLEnabled: true
         experimental.preferences.webAudioEnabled: true
diff --git a/Tools/MiniBrowser/qt/raw/View.cpp b/Tools/MiniBrowser/qt/raw/View.cpp
index 8e04fd0..4c4d528 100644
--- a/Tools/MiniBrowser/qt/raw/View.cpp
+++ b/Tools/MiniBrowser/qt/raw/View.cpp
@@ -62,7 +62,7 @@
 {
     setSurfaceType(OpenGLSurface);
     setGeometry(50, 50, 980, 600);
-    setWindowFlags(Qt::Window | Qt::WindowTitleHint);
+    setFlags(Qt::Window | Qt::WindowTitleHint);
     create();
 
     m_context = new QOpenGLContext;
diff --git a/Tools/QtTestBrowser/launcherwindow.cpp b/Tools/QtTestBrowser/launcherwindow.cpp
index d9dd0f9..8badf46 100644
--- a/Tools/QtTestBrowser/launcherwindow.cpp
+++ b/Tools/QtTestBrowser/launcherwindow.cpp
@@ -51,7 +51,7 @@
 #ifndef QT_NO_SHORTCUT
 #include <QMenuBar>
 #endif
-#if !defined(QT_NO_PRINTER) && HAVE(QTPRINTSUPPORT)
+#if !defined(QT_NO_PRINTPREVIEWDIALOG) && HAVE(QTPRINTSUPPORT)
 #include <QPrintPreviewDialog>
 #endif
 #include <QSlider>
@@ -73,6 +73,11 @@
 #include <QtNetwork/QNetworkDiskCache>
 #endif
 
+struct HighlightedElement {
+    QWebElement m_element;
+    QString m_previousStyle;
+};
+
 const int gExitClickArea = 80;
 QVector<int> LauncherWindow::m_zoomLevels;
 
@@ -217,6 +222,7 @@
     settings->setAttribute(QWebSettings::TiledBackingStoreEnabled, m_windowOptions.useTiledBackingStore);
     settings->setAttribute(QWebSettings::FrameFlatteningEnabled, m_windowOptions.useFrameFlattening);
     settings->setAttribute(QWebSettings::WebGLEnabled, m_windowOptions.useWebGL);
+    m_windowOptions.useWebAudio = settings->testAttribute(QWebSettings::WebAudioEnabled);
 
     if (!isGraphicsBased())
         return;
@@ -312,6 +318,17 @@
     QAction* toggleWebGL = toolsMenu->addAction("Toggle WebGL", this, SLOT(toggleWebGL(bool)));
     toggleWebGL->setCheckable(true);
     toggleWebGL->setChecked(settings->testAttribute(QWebSettings::WebGLEnabled));
+#if !ENABLE(WEBGL)
+    toggleWebGL->setEnabled(false);
+#endif
+
+    QAction* toggleWebAudio = toolsMenu->addAction("Toggle WebAudio", this, SLOT(toggleWebAudio(bool)));
+    toggleWebAudio->setCheckable(true);
+#if ENABLE(WEB_AUDIO)
+    toggleWebAudio->setChecked(m_windowOptions.useWebAudio);
+#else
+    toggleWebAudio->setEnabled(false);
+#endif
 
     QAction* spatialNavigationAction = toolsMenu->addAction("Toggle Spatial Navigation", this, SLOT(toggleSpatialNavigation(bool)));
     spatialNavigationAction->setCheckable(true);
@@ -350,6 +367,8 @@
 
     toolsMenu->addAction("Select Elements...", this, SLOT(selectElements()));
 
+    toolsMenu->addAction("Clear selection", this, SLOT(clearSelection()));
+
     QAction* showInspectorAction = toolsMenu->addAction("Show Web Inspector", m_inspector, SLOT(setVisible(bool)), QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_I));
     showInspectorAction->setCheckable(true);
     showInspectorAction->connect(m_inspector, SIGNAL(visibleChanged(bool)), SLOT(setChecked(bool)));
@@ -477,6 +496,10 @@
 #endif
     toggleScrollAnimator->setChecked(false);
 
+    QAction* toggleJavaScriptEnabled = settingsMenu->addAction("Enable Javascript", this, SLOT(toggleJavaScriptEnabled(bool)));
+    toggleJavaScriptEnabled->setCheckable(true);
+    toggleJavaScriptEnabled->setChecked(settings->testAttribute(QWebSettings::JavascriptEnabled));
+
     QAction* toggleInterruptingJavaScripteEnabled = settingsMenu->addAction("Enable interrupting js scripts", this, SLOT(toggleInterruptingJavaScriptEnabled(bool)));
     toggleInterruptingJavaScripteEnabled->setCheckable(true);
     toggleInterruptingJavaScripteEnabled->setChecked(false);
@@ -735,7 +758,7 @@
 
 void LauncherWindow::print()
 {
-#if !defined(QT_NO_PRINTER) && HAVE(QTPRINTSUPPORT)
+#if !defined(QT_NO_PRINTPREVIEWDIALOG) && HAVE(QTPRINTSUPPORT)
     QPrintPreviewDialog dlg(this);
     connect(&dlg, SIGNAL(paintRequested(QPrinter*)),
             page()->mainFrame(), SLOT(print(QPrinter*)));
@@ -800,14 +823,25 @@
                                         QLineEdit::Normal, "a", &ok);
 
     if (ok && !str.isEmpty()) {
+        clearSelection();
         QWebElementCollection result =  page()->mainFrame()->findAllElements(str);
-        foreach (QWebElement e, result)
+        foreach (QWebElement e, result) {
+            HighlightedElement el = { e, e.styleProperty("background-color", QWebElement::InlineStyle) };
+            m_highlightedElements.append(el);
             e.setStyleProperty("background-color", "yellow");
+        }
         statusBar()->showMessage(QString("%1 element(s) selected").arg(result.count()), 5000);
     }
 #endif
 }
 
+void LauncherWindow::clearSelection()
+{
+    for (int i = 0; i < m_highlightedElements.size(); ++i)
+        m_highlightedElements[i].m_element.setStyleProperty("background-color", m_highlightedElements[i].m_previousStyle);
+    m_highlightedElements.clear();
+}
+
 void LauncherWindow::setDiskCache(bool enable)
 {
 #if !defined(QT_NO_NETWORKDISKCACHE) && !defined(QT_NO_DESKTOPSERVICES)
@@ -860,6 +894,12 @@
     page()->settings()->setAttribute(QWebSettings::WebGLEnabled, toggle);
 }
 
+void LauncherWindow::toggleWebAudio(bool toggle)
+{
+    m_windowOptions.useWebAudio = toggle;
+    page()->settings()->setAttribute(QWebSettings::WebAudioEnabled, toggle);
+}
+
 void LauncherWindow::animatedFlip()
 {
     qobject_cast<WebViewGraphicsBased*>(m_view)->animatedFlip();
@@ -887,6 +927,11 @@
     page()->settings()->setAttribute(QWebSettings::FrameFlatteningEnabled, toggle);
 }
 
+void LauncherWindow::toggleJavaScriptEnabled(bool enable)
+{
+    page()->settings()->setAttribute(QWebSettings::JavascriptEnabled, enable);
+}
+
 void LauncherWindow::toggleInterruptingJavaScriptEnabled(bool enable)
 {
     page()->setInterruptingJavaScriptEnabled(enable);
diff --git a/Tools/QtTestBrowser/launcherwindow.h b/Tools/QtTestBrowser/launcherwindow.h
index 3de8667..185f21b 100644
--- a/Tools/QtTestBrowser/launcherwindow.h
+++ b/Tools/QtTestBrowser/launcherwindow.h
@@ -60,6 +60,8 @@
 class QLineEdit;
 QT_END_NAMESPACE
 
+struct HighlightedElement;
+
 class WindowOptions {
 public:
     WindowOptions()
@@ -68,6 +70,7 @@
         , useCompositing(true)
         , useTiledBackingStore(false)
         , useWebGL(false)
+        , useWebAudio(false)
         , useFrameFlattening(false)
         , cacheWebView(false)
         , showFrameRate(false)
@@ -92,6 +95,7 @@
     bool useCompositing;
     bool useTiledBackingStore;
     bool useWebGL;
+    bool useWebAudio;
     bool useFrameFlattening;
     bool cacheWebView;
     bool showFrameRate;
@@ -152,9 +156,11 @@
     void toggleTiledBackingStore(bool toggle);
     void toggleResizesToContents(bool toggle);
     void toggleWebGL(bool toggle);
+    void toggleWebAudio(bool toggle);
     void toggleSpatialNavigation(bool b);
     void toggleFullScreenMode(bool enable);
     void toggleFrameFlattening(bool toggle);
+    void toggleJavaScriptEnabled(bool enable);
     void toggleInterruptingJavaScriptEnabled(bool enable);
     void toggleJavascriptCanOpenWindows(bool enable);
     void toggleAutoLoadImages(bool enable);
@@ -178,6 +184,7 @@
     void animatedFlip();
     void animatedYFlip();
     void selectElements();
+    void clearSelection();
     void showFPS(bool enable);
     void showUserAgentDialog();
 
@@ -222,6 +229,7 @@
     QNetworkReply* m_reply;
 #endif
     QList<QTouchEvent::TouchPoint> m_touchPoints;
+    QList<HighlightedElement> m_highlightedElements;
     bool m_touchMocking;
 
     QString m_inputUrl;
diff --git a/Tools/QtTestBrowser/qttestbrowser.cpp b/Tools/QtTestBrowser/qttestbrowser.cpp
index fcd13a2..c5b6ef0 100644
--- a/Tools/QtTestBrowser/qttestbrowser.cpp
+++ b/Tools/QtTestBrowser/qttestbrowser.cpp
@@ -88,7 +88,7 @@
 }
 
 LauncherApplication::LauncherApplication(int& argc, char** argv)
-    : QApplication(argc, argv, QApplication::GuiServer)
+    : QApplication(argc, argv)
     , m_isRobotized(false)
     , m_robotTimeoutSeconds(0)
     , m_robotExtraTimeSeconds(0)
diff --git a/Tools/QtTestBrowser/webpage.h b/Tools/QtTestBrowser/webpage.h
index 9f98212..0965b56 100644
--- a/Tools/QtTestBrowser/webpage.h
+++ b/Tools/QtTestBrowser/webpage.h
@@ -52,10 +52,11 @@
     QString userAgentForUrl(const QUrl& url) const;
     void setInterruptingJavaScriptEnabled(bool enabled) { m_interruptingJavaScriptEnabled = enabled; }
 
+    virtual bool shouldInterruptJavaScript();
+
 public Q_SLOTS:
     void openUrlInDefaultBrowser(const QUrl& url = QUrl());
     void setUserAgent(const QString& ua) { m_userAgent = ua; }
-    bool shouldInterruptJavaScript();
     void authenticationRequired(QNetworkReply*, QAuthenticator*);
     void requestPermission(QWebFrame* frame, QWebPage::Feature feature);
     void featurePermissionRequestCanceled(QWebFrame* frame, QWebPage::Feature feature);
diff --git a/Tools/QueueStatusServer/app.yaml b/Tools/QueueStatusServer/app.yaml
index e320eb0..be760c0 100644
--- a/Tools/QueueStatusServer/app.yaml
+++ b/Tools/QueueStatusServer/app.yaml
@@ -1,5 +1,5 @@
 application: webkit-commit-queue
-version: 1
+version: 108593 # Bugzilla bug ID of last major change
 runtime: python
 api_version: 1
 
diff --git a/Tools/QueueStatusServer/config/__init__.py b/Tools/QueueStatusServer/config/__init__.py
new file mode 100644
index 0000000..ef65bee
--- /dev/null
+++ b/Tools/QueueStatusServer/config/__init__.py
@@ -0,0 +1 @@
+# Required for Python to search this directory for module files
diff --git a/Tools/QueueStatusServer/config/charts.py b/Tools/QueueStatusServer/config/charts.py
new file mode 100644
index 0000000..3e38a85
--- /dev/null
+++ b/Tools/QueueStatusServer/config/charts.py
@@ -0,0 +1,61 @@
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+patch_log_limit = 500
+
+# All units are represented numerically as seconds.
+one_minute = 60.0
+one_hour = one_minute * 60.0
+one_day = one_hour * 24.0
+one_month = one_day * 30.0
+
+# How far back to view the history, specified in seconds.
+view_range_choices = [
+    {"name": "1 day", "view_range": one_day},
+    {"name": "1 week", "view_range": one_day * 7},
+    {"name": "1 month", "view_range": one_month},
+]
+
+default_view_range = one_day
+
+_time_units = [
+    #(threshold, time unit, name)
+    (0, one_hour, "hours"),
+    (4 * one_day, one_day, "days"),
+    (3 * one_month, one_month, "months"),
+]
+
+
+def get_time_unit(view_range):
+    current_threshold, current_time_unit, current_name = _time_units[0]
+    for threshold, time_unit, name in _time_units[1:]:
+        if view_range >= threshold:
+            current_time_unit, current_name = time_unit, name
+        else:
+            break
+    return current_time_unit, current_name
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/QueueStatusServer/config/logging.py
similarity index 77%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/QueueStatusServer/config/logging.py
index f06f94e..b18b071 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/QueueStatusServer/config/logging.py
@@ -1,9 +1,9 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +13,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,5 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
-
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+# Specified in seconds
+queue_log_duration = 60 * 60
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/QueueStatusServer/config/messages.py
similarity index 77%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/QueueStatusServer/config/messages.py
index f06f94e..96547ab 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/QueueStatusServer/config/messages.py
@@ -1,9 +1,9 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +13,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,8 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
-
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+# These must be in sync with webkit-patch's AbstractQueue.
+pass_status = "Pass"
+fail_status = "Fail"
+retry_status = "Retry"
+error_status = "Error"
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/QueueStatusServer/config/queues.py
similarity index 77%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/QueueStatusServer/config/queues.py
index f06f94e..99bf34f 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/QueueStatusServer/config/queues.py
@@ -1,9 +1,9 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +13,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,18 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
-
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+# Eventually the list of queues may be stored in the data store.
+all_queue_names = [
+    "commit-queue",
+    "style-queue",
+    "chromium-ews",  # aka cr-linux-ews
+    "cr-linux-debug-ews",
+    "cr-android-ews",
+    "qt-ews",
+    "qt-wk2-ews",
+    "gtk-ews",
+    "mac-ews",
+    "mac-wk2-ews",
+    "win-ews",
+    "efl-ews",
+]
diff --git a/Tools/QueueStatusServer/cron.yaml b/Tools/QueueStatusServer/cron.yaml
index 09b9945..d1b0d59 100644
--- a/Tools/QueueStatusServer/cron.yaml
+++ b/Tools/QueueStatusServer/cron.yaml
@@ -2,3 +2,7 @@
 - description: collect the garbage
   url: /gc
   schedule: every 4 hours
+
+- description: Sync new queue logs up with unchanging data
+  url: /sync-queue-logs
+  schedule: every 10 minutes
diff --git a/Tools/QueueStatusServer/filters/webkit_extras.py b/Tools/QueueStatusServer/filters/webkit_extras.py
index b645f78..5b3c9b1 100644
--- a/Tools/QueueStatusServer/filters/webkit_extras.py
+++ b/Tools/QueueStatusServer/filters/webkit_extras.py
@@ -36,6 +36,7 @@
 bug_regexp = re.compile(r"bug (?P<bug_id>\d+)")
 patch_regexp = re.compile(r"patch (?P<patch_id>\d+)")
 
+
 @register.filter
 @stringfilter
 def webkit_linkify(value):
@@ -43,17 +44,32 @@
     value = patch_regexp.sub(r'<a href="https://bugs.webkit.org/attachment.cgi?id=\g<patch_id>&action=prettypatch">patch \g<patch_id></a>', value)
     return value
 
+
 @register.filter
 @stringfilter
 def webkit_bug_id(value):
     return '<a href="http://webkit.org/b/%s">%s</a>' % (value, value)
 
+
 @register.filter
 @stringfilter
 def webkit_attachment_id(value):
     return '<a href="https://bugs.webkit.org/attachment.cgi?id=%s&action=prettypatch">%s</a>' % (value, value)
 
+
 @register.filter
 @stringfilter
 def results_link(status_id):
     return '<a href="/results/%s">results</a>' % status_id
+
+
+@register.filter
+@stringfilter
+def queue_status_link(queue_name, text):
+    return '<a href="/queue-status/%s">%s</a>' % (queue_name, text)
+
+
+@register.filter
+@stringfilter
+def queue_charts_link(queue_name, text):
+    return '<a href="/queue-charts/%s">%s</a>' % (queue_name, text)
diff --git a/Tools/QueueStatusServer/handlers/nextpatch.py b/Tools/QueueStatusServer/handlers/nextpatch.py
index 5f6d71d..e5ba655 100644
--- a/Tools/QueueStatusServer/handlers/nextpatch.py
+++ b/Tools/QueueStatusServer/handlers/nextpatch.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
+# Copyright (C) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -31,6 +31,7 @@
 from google.appengine.ext import db
 from google.appengine.ext import webapp
 
+from loggers.recordpatchevent import RecordPatchEvent
 from model.queues import Queue
 
 
@@ -47,11 +48,12 @@
         if not patch_id:
             self.error(404)
             return
+        RecordPatchEvent.started(patch_id, queue_name)
         self.response.out.write(patch_id)
 
     @staticmethod
     def _assign_patch(key, work_item_ids):
-        now = datetime.now()
+        now = datetime.utcnow()
         active_work_items = db.get(key)
         active_work_items.deactivate_expired(now)
         next_item = active_work_items.next_item(work_item_ids, now)
diff --git a/Tools/QueueStatusServer/handlers/queuecharts.py b/Tools/QueueStatusServer/handlers/queuecharts.py
new file mode 100644
index 0000000..6611027
--- /dev/null
+++ b/Tools/QueueStatusServer/handlers/queuecharts.py
@@ -0,0 +1,151 @@
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import calendar
+from datetime import datetime
+import itertools
+from time import time
+
+from google.appengine.ext import webapp
+from google.appengine.ext.webapp import template
+
+from config import logging, charts
+from model.patchlog import PatchLog
+from model.queues import Queue
+from model.queuelog import QueueLog
+
+
+class QueueCharts(webapp.RequestHandler):
+    def get(self, queue_name):
+        queue_name = queue_name.lower()
+        if not Queue.queue_with_name(queue_name):
+            self.error(404)
+            return
+
+        timestamp = self._get_timestamp()
+        view_range = self._get_view_range()
+        time_unit, time_unit_name = charts.get_time_unit(view_range)
+
+        all_queue_names = map(Queue.name, Queue.all())
+
+        template_values = {
+            "all_queue_names": all_queue_names,
+            "patch_data": self._get_patch_data(queue_name, timestamp, view_range),
+            "queue_data": self._get_queue_data(queue_name, timestamp, view_range),
+            "queue_name": queue_name,
+            "seconds_ago_min": 0,
+            "seconds_ago_max": view_range,
+            "time_unit_name": time_unit_name,
+            "time_unit": time_unit,
+            "timestamp": timestamp,
+            "view_range": view_range,
+            "view_range_choices": charts.view_range_choices,
+        }
+        self.response.out.write(template.render("templates/queuecharts.html", template_values))
+
+    @classmethod
+    def _get_min_med_max(cls, values, defaults=(0, 0, 0)):
+        if not values:
+            return defaults
+        length = len(values)
+        sorted_values = sorted(values)
+        return sorted_values[0], sorted_values[length / 2], sorted_values[length - 1]
+
+    def _get_patch_data(self, queue_name, timestamp, view_range):
+        patch_logs = self._get_patch_logs(queue_name, timestamp, view_range)
+        patch_data = []
+        for patch_log in patch_logs:
+            if patch_log.process_duration and patch_log.wait_duration:
+                patch_log_timestamp = calendar.timegm(patch_log.date.utctimetuple())
+                patch_data.append({
+                    "attachment_id": patch_log.attachment_id,
+                    "seconds_ago": timestamp - patch_log_timestamp,
+                    "process_duration": patch_log.process_duration / charts.one_minute,
+                    "retry_count": patch_log.retry_count,
+                    "status_update_count": patch_log.status_update_count,
+                    "wait_duration": patch_log.wait_duration / charts.one_minute,
+               })
+        return patch_data
+
+    def _get_patch_logs(self, queue_name, timestamp, view_range):
+        patch_log_query = PatchLog.all()
+        patch_log_query = patch_log_query.filter("queue_name =", queue_name)
+        patch_log_query = patch_log_query.filter("date >=", datetime.utcfromtimestamp(timestamp - view_range))
+        patch_log_query = patch_log_query.filter("date <=", datetime.utcfromtimestamp(timestamp))
+        patch_log_query = patch_log_query.order("date")
+        return patch_log_query.run(limit=charts.patch_log_limit)
+
+    def _get_queue_data(self, queue_name, timestamp, view_range):
+        queue_logs = self._get_queue_logs(queue_name, timestamp, view_range)
+        queue_data = []
+        for queue_log in queue_logs:
+            queue_log_timestamp = calendar.timegm(queue_log.date.utctimetuple())
+            p_min, p_med, p_max = self._get_min_med_max(queue_log.patch_process_durations)
+            w_min, w_med, w_max = self._get_min_med_max(queue_log.patch_wait_durations)
+            queue_data.append({
+                "bots_seen": len(queue_log.bot_ids_seen),
+                "seconds_ago": timestamp - queue_log_timestamp,
+                "patch_processing_min": p_min,
+                "patch_processing_med": p_med,
+                "patch_processing_max": p_max,
+                "patch_retry_count": queue_log.patch_retry_count,
+                "patch_waiting_min": w_min,
+                "patch_waiting_med": w_med,
+                "patch_waiting_max": w_max,
+                "patches_completed": len(queue_log.patch_process_durations),
+                "patches_waiting": queue_log.max_patches_waiting,
+                "status_update_count": queue_log.status_update_count,
+            })
+        return queue_data
+
+    def _get_queue_logs(self, queue_name, timestamp, view_range):
+        queue_logs = []
+        current_timestamp = timestamp - view_range
+        while current_timestamp <= timestamp:
+            queue_logs.append(QueueLog.get_at(queue_name, logging.queue_log_duration, current_timestamp))
+            current_timestamp += logging.queue_log_duration
+        return queue_logs
+
+    @classmethod
+    def _get_time_unit(cls, view_range):
+        if view_range > charts.one_day * 2:
+            return 
+
+    def _get_timestamp(self):
+        timestamp = self.request.get("timestamp")
+        try:
+            return int(timestamp)
+        except ValueError:
+            return int(time())
+
+    def _get_view_range(self):
+        view_range = self.request.get("view_range")
+        try:
+            return int(view_range)
+        except ValueError:
+            return charts.default_view_range
diff --git a/Tools/QueueStatusServer/handlers/queuestatus.py b/Tools/QueueStatusServer/handlers/queuestatus.py
index 9054fca..4f4e2d2 100644
--- a/Tools/QueueStatusServer/handlers/queuestatus.py
+++ b/Tools/QueueStatusServer/handlers/queuestatus.py
@@ -104,6 +104,7 @@
 
         statuses = self._fetch_statuses(queue, bot_id)
         template_values = {
+            "queue_name": queue_name,
             "page_title": self._page_title(queue, bot_id),
             "work_item_rows": self._rows_for_work_items(queue),
             "status_groups": self._build_status_groups(statuses),
diff --git a/Tools/QueueStatusServer/handlers/releasepatch.py b/Tools/QueueStatusServer/handlers/releasepatch.py
index 0e46e69..88f46b0 100644
--- a/Tools/QueueStatusServer/handlers/releasepatch.py
+++ b/Tools/QueueStatusServer/handlers/releasepatch.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
+# Copyright (C) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -30,6 +30,7 @@
 from google.appengine.ext.webapp import template
 
 from handlers.updatebase import UpdateBase
+from loggers.recordpatchevent import RecordPatchEvent
 from model.attachment import Attachment
 from model.queues import Queue
 
@@ -57,6 +58,9 @@
         # Allow removing it from the queue even if there is no last_status for easier testing.
         if not last_status or not last_status.is_retry_request():
             queue.work_items().remove_work_item(attachment_id)
+            RecordPatchEvent.stopped(attachment_id, queue_name)
+        else:
+            RecordPatchEvent.retrying(attachment_id, queue_name)
 
         # Always release the lock on the item.
         queue.active_work_items().expire_item(attachment_id)
diff --git a/Tools/QueueStatusServer/handlers/submittoews.py b/Tools/QueueStatusServer/handlers/submittoews.py
index 248bce4..f7669d2 100644
--- a/Tools/QueueStatusServer/handlers/submittoews.py
+++ b/Tools/QueueStatusServer/handlers/submittoews.py
@@ -30,6 +30,7 @@
 from google.appengine.ext.webapp import template
 
 from handlers.updatebase import UpdateBase
+from loggers.recordpatchevent import RecordPatchEvent
 from model.attachment import Attachment
 from model.queues import Queue
 
@@ -57,6 +58,7 @@
         for queue in Queue.all_ews():  # all_ews() currently includes the style-queue
             if self._should_add_to_ews_queue(queue, attachment):
                 queue.work_items().add_work_item(attachment.id)
+                RecordPatchEvent.added(attachment.id, queue.name())
 
     def post(self):
         attachment_id = self._int_from_request("attachment_id")
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/QueueStatusServer/handlers/syncqueuelogs.py
similarity index 72%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/QueueStatusServer/handlers/syncqueuelogs.py
index f06f94e..e2a55f9 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/QueueStatusServer/handlers/syncqueuelogs.py
@@ -1,9 +1,9 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +13,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,17 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+from google.appengine.ext import webapp
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+from config.queues import all_queue_names
+from config.logging import queue_log_duration
+from model.queuelog import QueueLog
+
+
+class SyncQueueLogs(webapp.RequestHandler):
+    def get(self):
+        for queue_name in all_queue_names:
+            queue_log = QueueLog.get_current(queue_name, queue_log_duration)
+            if queue_log.update_max_patches_waiting():
+                queue_log.put()
+        self.response.out.write("Done!")
diff --git a/Tools/QueueStatusServer/handlers/updatestatus.py b/Tools/QueueStatusServer/handlers/updatestatus.py
index 7301101..b02e987 100644
--- a/Tools/QueueStatusServer/handlers/updatestatus.py
+++ b/Tools/QueueStatusServer/handlers/updatestatus.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2009 Google Inc. All rights reserved.
+# Copyright (C) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -31,6 +31,8 @@
 from google.appengine.ext.webapp import template
 
 from handlers.updatebase import UpdateBase
+from loggers.recordbotevent import RecordBotEvent
+from loggers.recordpatchevent import RecordPatchEvent
 from model.attachment import Attachment
 from model.queuestatus import QueueStatus
 
@@ -62,5 +64,7 @@
     def post(self):
         queue_status = self._queue_status_from_request()
         queue_status.put()
-        Attachment.dirty(queue_status.active_patch_id)
+        RecordBotEvent.record_activity(queue_status.queue_name, queue_status.bot_id)
+        if queue_status.active_patch_id:
+            RecordPatchEvent.updated(queue_status.active_patch_id, queue_status.queue_name, queue_status.bot_id)
         self.response.out.write(queue_status.key().id())
diff --git a/Tools/QueueStatusServer/handlers/updateworkitems.py b/Tools/QueueStatusServer/handlers/updateworkitems.py
index 16a9d49..6b3dded 100644
--- a/Tools/QueueStatusServer/handlers/updateworkitems.py
+++ b/Tools/QueueStatusServer/handlers/updateworkitems.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
+# Copyright (C) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -30,6 +30,7 @@
 from google.appengine.ext.webapp import template
 
 from handlers.updatebase import UpdateBase
+from loggers.recordpatchevent import RecordPatchEvent
 from model.queues import Queue
 from model.workitems import WorkItems
 
@@ -41,26 +42,46 @@
         self.response.out.write(template.render("templates/updateworkitems.html", None))
 
     def _parse_work_items_string(self, items_string):
-        # Our parsing could be much more robust.
-        item_strings = items_string.split(" ") if items_string else []
-        return map(int, item_strings)
+        try:
+            item_strings = items_string.split(" ") if items_string else []
+            return map(int, item_strings)
+        except ValueError:
+            return None
 
-    def _work_items_from_request(self):
+    def _update_work_items_from_request(self, work_items):
+        items_string = self.request.get("work_items")
+        new_work_items = self._parse_work_items_string(items_string)
+        if new_work_items == None:
+            self.response.out.write("Failed to parse work items: %s" % items_string)
+            return False
+        work_items.item_ids = new_work_items
+        work_items.date = datetime.utcnow()
+        return True
+
+    def _queue_from_request(self):
         queue_name = self.request.get("queue_name")
         queue = Queue.queue_with_name(queue_name)
         if not queue:
             self.response.out.write("\"%s\" is not in queues %s" % (queue_name, Queue.all()))
             return None
-
-        items_string = self.request.get("work_items")
-        work_items = queue.work_items()
-        work_items.item_ids = self._parse_work_items_string(items_string)
-        work_items.date = datetime.now()
-        return work_items
+        return queue
 
     def post(self):
-        work_items = self._work_items_from_request()
-        if not work_items:
+        queue = self._queue_from_request()
+        if not queue:
             self.response.set_status(500)
             return
+        work_items = queue.work_items()
+        old_items = set(work_items.item_ids)
+
+        success = self._update_work_items_from_request(work_items)
+        if not success:
+            self.response.set_status(500)
+            return
+        new_items = set(work_items.item_ids)
         work_items.put()
+
+        for work_item in new_items - old_items:
+            RecordPatchEvent.added(work_item, queue.name())
+        for work_item in old_items - new_items:
+            RecordPatchEvent.stopped(work_item, queue.name())
diff --git a/Tools/QueueStatusServer/index.yaml b/Tools/QueueStatusServer/index.yaml
index 34eb72e..694f77b 100644
--- a/Tools/QueueStatusServer/index.yaml
+++ b/Tools/QueueStatusServer/index.yaml
@@ -10,6 +10,11 @@
 # automatically uploaded to the admin console when you next deploy
 # your application using appcfg.py.
 
+- kind: PatchLog
+  properties:
+  - name: queue_name
+  - name: date
+
 - kind: QueueStatus
   properties:
   - name: active_patch_id
diff --git a/Tools/QueueStatusServer/loggers/__init__.py b/Tools/QueueStatusServer/loggers/__init__.py
new file mode 100644
index 0000000..ef65bee
--- /dev/null
+++ b/Tools/QueueStatusServer/loggers/__init__.py
@@ -0,0 +1 @@
+# Required for Python to search this directory for module files
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/QueueStatusServer/loggers/recordbotevent.py
similarity index 75%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/QueueStatusServer/loggers/recordbotevent.py
index f06f94e..cb0e224 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/QueueStatusServer/loggers/recordbotevent.py
@@ -1,9 +1,9 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +13,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+from config.logging import queue_log_duration
+from model.queuelog import QueueLog
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+
+class RecordBotEvent(object):
+    @classmethod
+    def record_activity(cls, queue_name, bot_id):
+        queue_log = QueueLog.get_current(queue_name, queue_log_duration)
+        if queue_log and bot_id not in queue_log.bot_ids_seen:
+            queue_log.bot_ids_seen.append(bot_id)
+            queue_log.put()
diff --git a/Tools/QueueStatusServer/loggers/recordpatchevent.py b/Tools/QueueStatusServer/loggers/recordpatchevent.py
new file mode 100644
index 0000000..08c57cd
--- /dev/null
+++ b/Tools/QueueStatusServer/loggers/recordpatchevent.py
@@ -0,0 +1,114 @@
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from config.logging import queue_log_duration
+from model.patchlog import PatchLog
+from model.queuelog import QueueLog
+from model.warninglog import WarningLog
+
+
+class RecordPatchEvent(object):
+    @classmethod
+    def added(cls, attachment_id, queue_name):
+        PatchLog.lookup(attachment_id, queue_name)
+        queue_log = QueueLog.get_current(queue_name, queue_log_duration)
+        if queue_log.update_max_patches_waiting():
+            queue_log.put()
+
+    @classmethod
+    def retrying(cls, attachment_id, queue_name, bot_id=None):
+        patch_log = PatchLog.lookup_if_exists(attachment_id, queue_name)
+        if not patch_log:
+            WarningLog.record("patchlog missing", "In retrying event.", attachment_id, queue_name, bot_id)
+            return
+
+        if bot_id:
+            patch_log.bot_id = bot_id
+        patch_log.retry_count += 1
+        patch_log.put()
+
+        queue_log = QueueLog.get_current(queue_name, queue_log_duration)
+        queue_log.patch_retry_count += 1
+        queue_log.put()
+
+    @classmethod
+    def started(cls, attachment_id, queue_name, bot_id=None):
+        patch_log = PatchLog.lookup_if_exists(attachment_id, queue_name)
+        if not patch_log:
+            WarningLog.record("patchlog missing", "In started event.", attachment_id, queue_name, bot_id)
+            return
+
+        # An existing wait_duration implies the patch had been started previously and is being picked up again because it had expired.
+        if not patch_log.wait_duration:
+            if bot_id:
+                patch_log.bot_id = bot_id
+            patch_log.calculate_wait_duration()
+            patch_log.put()
+
+            queue_log = QueueLog.get_current(queue_name, queue_log_duration)
+            queue_log.patch_wait_durations.append(patch_log.wait_duration)
+            queue_log.put()
+
+    @classmethod
+    def stopped(cls, attachment_id, queue_name, bot_id=None):
+        patch_log = PatchLog.lookup_if_exists(attachment_id, queue_name)
+        if not patch_log:
+            WarningLog.record("patchlog missing", "In stopped event.", attachment_id, queue_name, bot_id)
+            return
+
+        if not patch_log.wait_duration:
+            WarningLog.record("patchlog wait duration missing", "In stopped event.", attachment_id, queue_name, bot_id)
+            return
+
+        if not patch_log.finished:
+            if bot_id:
+                patch_log.bot_id = bot_id
+            patch_log.finished = True
+            patch_log.calculate_process_duration()
+            patch_log.put()
+
+            queue_log = QueueLog.get_current(queue_name, queue_log_duration)
+            queue_log.patch_process_durations.append(patch_log.process_duration)
+            queue_log.put()
+
+    @classmethod
+    def updated(cls, attachment_id, queue_name, bot_id=None):
+        patch_log = PatchLog.lookup_if_exists(attachment_id, queue_name)
+        if not patch_log:
+            WarningLog.record("patchlog missing", "In updated event.", attachment_id, queue_name, bot_id)
+            return
+
+        if bot_id:
+            patch_log.bot_id = bot_id
+        patch_log.status_update_count += 1
+        patch_log.put()
+
+        queue_log = QueueLog.get_current(queue_name, queue_log_duration)
+        queue_log.status_update_count += 1
+        queue_log.put()
+
diff --git a/Tools/QueueStatusServer/main.py b/Tools/QueueStatusServer/main.py
index e1155ff..a626f83 100644
--- a/Tools/QueueStatusServer/main.py
+++ b/Tools/QueueStatusServer/main.py
@@ -39,6 +39,7 @@
 from handlers.nextpatch import NextPatch
 from handlers.patch import Patch
 from handlers.patchstatus import PatchStatus
+from handlers.queuecharts import QueueCharts
 from handlers.queuestatus import QueueStatus
 from handlers.recentstatus import QueuesOverview
 from handlers.releasepatch import ReleasePatch
@@ -46,6 +47,7 @@
 from handlers.statusbubble import StatusBubble
 from handlers.submittoews import SubmitToEWS
 from handlers.svnrevision import SVNRevision
+from handlers.syncqueuelogs import SyncQueueLogs
 from handlers.updatestatus import UpdateStatus
 from handlers.updatesvnrevision import UpdateSVNRevision
 from handlers.updateworkitems import UpdateWorkItems
@@ -57,12 +59,14 @@
     ('/', QueuesOverview),
     ('/dashboard', Dashboard),
     ('/gc', GC),
+    ('/sync-queue-logs', SyncQueueLogs),
     (r'/patch-status/(.*)/(.*)', PatchStatus),
     (r'/patch/(.*)', Patch),
     (r'/submit-to-ews', SubmitToEWS),
     (r'/results/(.*)', ShowResults),
     (r'/status-bubble/(.*)', StatusBubble),
     (r'/svn-revision/(.*)', SVNRevision),
+    (r'/queue-charts/(.*)', QueueCharts),
     (r'/queue-status/(.*)/bots/(.*)', QueueStatus),
     (r'/queue-status/(.*)', QueueStatus),
     (r'/next-patch/(.*)', NextPatch),
diff --git a/Tools/QueueStatusServer/model/attachment.py b/Tools/QueueStatusServer/model/attachment.py
index f98f265..83b441e 100644
--- a/Tools/QueueStatusServer/model/attachment.py
+++ b/Tools/QueueStatusServer/model/attachment.py
@@ -28,8 +28,6 @@
 
 import re
 
-from google.appengine.api import memcache
-
 from model.queues import Queue
 from model.queuestatus import QueueStatus
 from model.workitems import WorkItems
@@ -37,10 +35,6 @@
 
 class Attachment(object):
     @classmethod
-    def dirty(cls, attachment_id):
-        memcache.delete(str(attachment_id), namespace="attachment-summary")
-
-    @classmethod
     def recent(cls, limit=1):
         statuses = QueueStatus.all().order("-date")
         # Notice that we use both a set and a list here to keep the -date ordering.
@@ -66,11 +60,7 @@
     def summary(self):
         if self._summary:
             return self._summary
-        self._summary = memcache.get(str(self.id), namespace="attachment-summary")
-        if self._summary:
-            return self._summary
         self._summary = self._fetch_summary()
-        memcache.set(str(self.id), self._summary, namespace="attachment-summary")
         return self._summary
 
     def state_from_queue_status(self, status):
diff --git a/Tools/QueueStatusServer/model/patchlog.py b/Tools/QueueStatusServer/model/patchlog.py
new file mode 100644
index 0000000..78254da
--- /dev/null
+++ b/Tools/QueueStatusServer/model/patchlog.py
@@ -0,0 +1,70 @@
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from datetime import datetime
+
+from google.appengine.ext import db
+
+
+class PatchLog(db.Model):
+    attachment_id = db.IntegerProperty()
+    queue_name = db.StringProperty()
+    date = db.DateTimeProperty(auto_now_add=True)
+    bot_id = db.StringProperty()
+    retry_count = db.IntegerProperty(default=0)
+    status_update_count = db.IntegerProperty(default=0)
+    finished = db.BooleanProperty(default=False)
+    wait_duration = db.IntegerProperty()
+    process_duration = db.IntegerProperty()
+
+    @classmethod
+    def lookup(cls, attachment_id, queue_name):
+        key = cls._generate_key(attachment_id, queue_name)
+        return cls.get_or_insert(key, attachment_id=attachment_id, queue_name=queue_name)
+
+    @classmethod
+    def lookup_if_exists(cls, attachment_id, queue_name):
+        key = cls._generate_key(attachment_id, queue_name)
+        return cls.get_by_key_name(key)
+
+    def calculate_wait_duration(self):
+        time_delta = datetime.utcnow() - self.date
+        self.wait_duration = int(self._time_delta_to_seconds(time_delta))
+
+    def calculate_process_duration(self):
+        time_delta = datetime.utcnow() - self.date
+        self.process_duration = int(self._time_delta_to_seconds(time_delta)) - (self.wait_duration or 0)
+
+    @classmethod
+    def _generate_key(cls, attachment_id, queue_name):
+        return "%s-%s" % (attachment_id, queue_name)
+
+    # Needed to support Python 2.5's lack of timedelta.total_seconds().
+    @classmethod
+    def _time_delta_to_seconds(cls, time_delta):
+        return time_delta.seconds + time_delta.days * 24 * 3600
diff --git a/Tools/QueueStatusServer/model/queuelog.py b/Tools/QueueStatusServer/model/queuelog.py
new file mode 100644
index 0000000..ee3e9de
--- /dev/null
+++ b/Tools/QueueStatusServer/model/queuelog.py
@@ -0,0 +1,88 @@
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from time import time
+from datetime import datetime
+
+from google.appengine.ext import db
+
+from model.workitems import WorkItems
+from model.activeworkitems import ActiveWorkItems
+
+
+class QueueLog(db.Model):
+    date = db.DateTimeProperty()
+    # duration specifies in seconds the time period these log values apply to.
+    duration = db.IntegerProperty()
+    queue_name = db.StringProperty()
+    bot_ids_seen = db.StringListProperty()
+    max_patches_waiting = db.IntegerProperty(default=0)
+    patch_wait_durations = db.ListProperty(int)
+    patch_process_durations = db.ListProperty(int)
+    patch_retry_count = db.IntegerProperty(default=0)
+    status_update_count = db.IntegerProperty(default=0)
+
+    @staticmethod
+    def create_key(queue_name, duration, timestamp):
+        return "%s-%s-%s" % (queue_name, duration, timestamp)
+
+    @classmethod
+    def get_at(cls, queue_name, duration, timestamp):
+        timestamp = int(timestamp / duration) * duration
+        date = datetime.utcfromtimestamp(timestamp)
+        key = cls.create_key(queue_name, duration, timestamp)
+        return cls.get_or_create(key, date=date, duration=duration, queue_name=queue_name)
+
+    @classmethod
+    def get_current(cls, queue_name, duration):
+        return cls.get_at(queue_name, duration, time())
+
+    # This is to prevent page requests from generating lots of rows in the database.
+    @classmethod
+    def get_or_create(cls, key_name, **kwargs):
+        return db.run_in_transaction(cls._get_or_create_txn, key_name, **kwargs)
+
+    def update_max_patches_waiting(self):
+        patches_waiting = self._get_patches_waiting(self.queue_name)
+        if patches_waiting > self.max_patches_waiting:
+            self.max_patches_waiting = patches_waiting
+            return True
+        return False
+
+    @classmethod
+    def _get_or_create_txn(cls, key_name, **kwargs):
+        entity = cls.get_by_key_name(key_name, parent=kwargs.get('parent'))
+        if entity is None:
+            entity = cls(key_name=key_name, **kwargs)
+        return entity
+
+    @classmethod
+    def _get_patches_waiting(cls, queue_name):
+        work_items = WorkItems.lookup_by_queue(queue_name)
+        active_work_items = ActiveWorkItems.lookup_by_queue(queue_name)
+        return len(set(work_items.item_ids) - set(active_work_items.item_ids))
diff --git a/Tools/QueueStatusServer/model/queuepropertymixin_unittest.py b/Tools/QueueStatusServer/model/queuepropertymixin_unittest.py
index 9a301fe..e83c3f5 100644
--- a/Tools/QueueStatusServer/model/queuepropertymixin_unittest.py
+++ b/Tools/QueueStatusServer/model/queuepropertymixin_unittest.py
@@ -42,10 +42,10 @@
         test_object = ObjectWithQueueName()
         mac_ews = Queue("mac-ews")
         test_object.queue = mac_ews
-        self.assertEquals(test_object.queue.name(), "mac-ews")
-        self.assertEquals(test_object.queue_name, "mac-ews")
+        self.assertEqual(test_object.queue.name(), "mac-ews")
+        self.assertEqual(test_object.queue_name, "mac-ews")
         test_object.queue = None
-        self.assertEquals(test_object.queue_name, None)
+        self.assertEqual(test_object.queue_name, None)
 
 
 if __name__ == '__main__':
diff --git a/Tools/QueueStatusServer/model/queues.py b/Tools/QueueStatusServer/model/queues.py
index afdd9ea..b32f69e 100644
--- a/Tools/QueueStatusServer/model/queues.py
+++ b/Tools/QueueStatusServer/model/queues.py
@@ -29,39 +29,25 @@
 
 import re
 
+from config.queues import all_queue_names
 from model.activeworkitems import ActiveWorkItems
 from model.workitems import WorkItems
 
 
 class Queue(object):
-
-    # Eventually the list of queues may be stored in the data store.
-    _all_queue_names = [
-        "commit-queue",
-        "style-queue",
-        "chromium-ews",  # aka cr-linux-ews
-        "cr-android-ews",
-        "qt-ews",
-        "qt-wk2-ews",
-        "gtk-ews",
-        "mac-ews",
-        "win-ews",
-        "efl-ews",
-    ]
-
     def __init__(self, name):
-        assert(name in self._all_queue_names)
+        assert(name in all_queue_names)
         self._name = name
 
     @classmethod
     def queue_with_name(cls, queue_name):
-        if queue_name not in cls._all_queue_names:
+        if queue_name not in all_queue_names:
             return None
         return Queue(queue_name)
 
     @classmethod
     def all(cls):
-        return [Queue(name) for name in cls._all_queue_names]
+        return [Queue(name) for name in all_queue_names]
 
     @classmethod
     def all_ews(cls):
diff --git a/Tools/QueueStatusServer/model/queues_unittest.py b/Tools/QueueStatusServer/model/queues_unittest.py
index cfa7fcd..654c8a6 100644
--- a/Tools/QueueStatusServer/model/queues_unittest.py
+++ b/Tools/QueueStatusServer/model/queues_unittest.py
@@ -43,7 +43,7 @@
         self.assertRaises(AssertionError, Queue, ("bogus"))
 
     def _assert_short_name(self, queue_name, short_name):
-        self.assertEquals(Queue(queue_name).short_name(), short_name)
+        self.assertEqual(Queue(queue_name).short_name(), short_name)
 
     def test_short_name(self):
         self._assert_short_name("mac-ews", "Mac")
@@ -52,7 +52,7 @@
         self._assert_short_name("style-queue", "Style")
 
     def _assert_display_name(self, queue_name, short_name):
-        self.assertEquals(Queue(queue_name).display_name(), short_name)
+        self.assertEqual(Queue(queue_name).display_name(), short_name)
 
     def test_display_name(self):
         self._assert_display_name("mac-ews", "Mac EWS")
@@ -61,7 +61,7 @@
         self._assert_display_name("style-queue", "Style Queue")
 
     def _assert_name_with_underscores(self, queue_name, short_name):
-        self.assertEquals(Queue(queue_name).name_with_underscores(), short_name)
+        self.assertEqual(Queue(queue_name).name_with_underscores(), short_name)
 
     def test_name_with_underscores(self):
         self._assert_name_with_underscores("mac-ews", "mac_ews")
diff --git a/Tools/QueueStatusServer/model/queuestatus.py b/Tools/QueueStatusServer/model/queuestatus.py
index 8002f89..0f4d38b 100644
--- a/Tools/QueueStatusServer/model/queuestatus.py
+++ b/Tools/QueueStatusServer/model/queuestatus.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2009 Google Inc. All rights reserved.
+# Copyright (C) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -26,6 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+from config import messages
 from google.appengine.ext import db
 from model.queuepropertymixin import QueuePropertyMixin
 
@@ -41,4 +42,4 @@
     results_file = db.BlobProperty()
 
     def is_retry_request(self):
-        return self.message == "Retry"  # From AbstractQueue._retry_status
+        return self.message == messages.retry_status
diff --git a/Tools/EWSTools/create-webkit-git b/Tools/QueueStatusServer/model/warninglog.py
old mode 100755
new mode 100644
similarity index 68%
rename from Tools/EWSTools/create-webkit-git
rename to Tools/QueueStatusServer/model/warninglog.py
index cbf8ce4..b9677eb
--- a/Tools/EWSTools/create-webkit-git
+++ b/Tools/QueueStatusServer/model/warninglog.py
@@ -1,5 +1,4 @@
-#/bin/bash
-# Copyright (c) 2010 Google Inc. All rights reserved.
+# Copyright (C) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -27,16 +26,22 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# These are meant to match the instructions from:
-# http://trac.webkit.org/wiki/UsingGitWithWebKit
-cd /mnt/git
-git clone git://git.webkit.org/WebKit.git webkit
-cd webkit
+from time import time
+from datetime import datetime
 
-git svn init -T trunk http://svn.webkit.org/repository/webkit
-git update-ref refs/remotes/trunk origin/master
-# It's possible that this "config" step can get merged into an earlier setup step.
-git config --replace-all svn-remote.svn.fetch trunk:refs/remotes/origin/master
+from google.appengine.ext import db
 
-git fetch
-git svn rebase
+
+class WarningLog(db.Model):
+    date = db.DateTimeProperty(auto_now_add=True)
+    event = db.StringProperty()
+    message = db.StringProperty()
+    attachment_id = db.IntegerProperty()
+    queue_name = db.StringProperty()
+    bot_id = db.StringProperty()
+
+    @classmethod
+    def record(cls, event, message=None, attachment_id=None, queue_name=None, bot_id=None):
+        entity = cls(event=event, message=message, queue_name=queue_name, bot_id=bot_id, attachment_id=attachment_id)
+        entity.put()
+        return entity
diff --git a/Tools/QueueStatusServer/model/workitems_unittest.py b/Tools/QueueStatusServer/model/workitems_unittest.py
index b1ff1d3..f6ca785 100644
--- a/Tools/QueueStatusServer/model/workitems_unittest.py
+++ b/Tools/QueueStatusServer/model/workitems_unittest.py
@@ -36,9 +36,9 @@
     def test_display_position_for_attachment(self):
         items = WorkItems()
         items.item_ids = [0, 1, 2]
-        self.assertEquals(items.display_position_for_attachment(0), 1)
-        self.assertEquals(items.display_position_for_attachment(1), 2)
-        self.assertEquals(items.display_position_for_attachment(3), None)
+        self.assertEqual(items.display_position_for_attachment(0), 1)
+        self.assertEqual(items.display_position_for_attachment(1), 2)
+        self.assertEqual(items.display_position_for_attachment(3), None)
 
 
 if __name__ == '__main__':
diff --git a/Tools/QueueStatusServer/stylesheets/charts.css b/Tools/QueueStatusServer/stylesheets/charts.css
new file mode 100644
index 0000000..b841b2c
--- /dev/null
+++ b/Tools/QueueStatusServer/stylesheets/charts.css
@@ -0,0 +1,8 @@
+.chart {
+    margin-bottom: 40px;
+    height: 200px;
+}
+
+.choices {
+    font-size: 0.75em;
+}
\ No newline at end of file
diff --git a/Tools/QueueStatusServer/templates/queuecharts.html b/Tools/QueueStatusServer/templates/queuecharts.html
new file mode 100644
index 0000000..953debd
--- /dev/null
+++ b/Tools/QueueStatusServer/templates/queuecharts.html
@@ -0,0 +1,284 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>{{ queue_name }} Charts</title>
+        <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
+        <link type="text/css" rel="stylesheet" href="/stylesheets/charts.css" />
+        <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+        <script type="text/javascript">
+            google.load('visualization', '1.0', {'packages':['corechart']});
+            google.setOnLoadCallback(function () {
+
+                function secondsToString(seconds) {
+                    var oneSecond = 1;
+                    var oneMinute = 60;
+                    var oneHour = oneMinute * 60;
+                    var oneDay = oneHour * 24;
+                    var oneYear = oneDay * 365.25;
+                    var unitArray = [
+                        [oneYear, "year"],
+                        [oneDay, "day"],
+                        [oneHour, "hour"],
+                        [oneMinute, "minute"],
+                        [oneSecond, "second"],
+                    ];
+                    var result = "";
+                    for (var i = 0; i < unitArray.length; i++) {
+                        var unit = unitArray[i][0];
+                        if (seconds >= unit) {
+                            if (result !== "") {
+                                result += " ";
+                            }
+                            var name = unitArray[i][1];
+                            var number = Math.floor(seconds/unit);
+                            result += number + " " + name + (number > 1 ? "s" : "");
+                            seconds %= unit;
+                        }
+                    }
+                    if (result === "") {
+                        return "0 seconds";
+                    }
+                    return result;
+                }
+
+                var data, chart, options;
+
+                var timeString = new Date({{ timestamp }} * 1000).toString();
+                var timestampDiv = document.getElementById("timestamp");
+                timestampDiv.innerHTML = "Viewing from " + timeString;
+
+                options = {
+                    legend: {position: "top"},
+                    hAxis: {
+                        title: "{{ time_unit_name|capfirst }} Ago",
+                        direction: -1,
+                        viewWindow: {
+                            min: {{ seconds_ago_min }} / {{ time_unit }},
+                            max: {{ seconds_ago_max }} / {{ time_unit }},
+                        },
+                        gridlines: {
+                            count: 9,
+                        },
+                    },
+                    vAxis: {
+                        viewWindow: {min: 0 },
+                    },
+                    lineWidth: 3,
+                };
+
+                // CHART 1
+                options.colors = ["green", "red", "orange"];
+                data = new google.visualization.DataTable();
+                data.addColumn("number", "<time>");
+                data.addColumn("number", "Patches Completed");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addColumn("number", "Patches Waiting");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addColumn("number", "Bots (visible to server)");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addRows([
+                    {% for queue_datum in queue_data %}
+                        [
+                            {{ queue_datum.seconds_ago }} / {{ time_unit }},
+                            {{ queue_datum.patches_completed }},
+                            "Patches Completed: " + {{ queue_datum.patches_completed }} + "\n" + secondsToString({{ queue_datum.seconds_ago }}) + " ago",
+                            {{ queue_datum.patches_waiting }},
+                            "Patches Waiting: " + {{ queue_datum.patches_waiting }} + "\n" + secondsToString({{ queue_datum.seconds_ago }}) + " ago",
+                            {{ queue_datum.bots_seen }},
+                            "Bots (visible to server): " + {{ queue_datum.bots_seen }} + "\n" + secondsToString({{ queue_datum.seconds_ago }}) + " ago",
+                        ],
+                    {% endfor %}
+                ]);
+                chart = new google.visualization.LineChart(document.getElementById('chart1'));
+                chart.draw(data, options);
+
+                // CHART 2
+                options.colors = ["blue", "purple"];
+                data = new google.visualization.DataTable();
+                data.addColumn("number", "<time>");
+                data.addColumn("number", "Status Updates");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addColumn("number", "Patch Retries");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addRows([
+                    {% for queue_datum in queue_data %}
+                        [
+                            {{ queue_datum.seconds_ago }} / {{ time_unit }},
+                            {{ queue_datum.status_update_count }},
+                            "Status Updates: " + {{ queue_datum.status_update_count }} + "\n" + secondsToString({{ queue_datum.seconds_ago }}) + " ago",
+                            {{ queue_datum.patch_retry_count }},
+                            "Patch Retries: " + {{ queue_datum.patch_retry_count }} + "\n" + secondsToString({{ queue_datum.seconds_ago }}) + " ago",
+                        ],
+                    {% endfor %}
+                ]);
+                chart = new google.visualization.LineChart(document.getElementById('chart2'));
+                chart.draw(data, options);
+
+                // CHART 3
+                options.colors = ["brown"];
+                options.vAxis.title = "Minutes";
+                data = new google.visualization.DataTable();
+                data.addColumn("number", "<time>");
+                data.addColumn("number", "Patch Processing Times");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addColumn({type: "number", role: "interval"});
+                data.addColumn({type: "number", role: "interval"});
+                data.addRows([
+                    {% for queue_datum in queue_data %}
+                        [
+                            {{ queue_datum.seconds_ago }} / {{ time_unit }},
+                            {{ queue_datum.patch_processing_med }} / 60,
+                            "Patch Processing Times\nMax: " + secondsToString({{ queue_datum.patch_processing_max }}) + "\nMedian: " + secondsToString({{ queue_datum.patch_processing_med }}) + "\nMin: " + secondsToString({{ queue_datum.patch_processing_min }}) + "\n" + secondsToString({{ queue_datum.seconds_ago }}) + " ago",
+                            {{ queue_datum.patch_processing_min }} / 60,
+                            {{ queue_datum.patch_processing_max }} / 60,
+                        ],
+                    {% endfor %}
+                ]);
+                chart = new google.visualization.LineChart(document.getElementById('chart3'));
+                chart.draw(data, options);
+
+                // CHART 4
+                options.colors = ["red"];
+                data = new google.visualization.DataTable();
+                data.addColumn("number", "<time>");
+                data.addColumn("number", "Patch Waiting Times");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addColumn({type: "number", role: "interval"});
+                data.addColumn({type: "number", role: "interval"});
+                data.addRows([
+                    {% for queue_datum in queue_data %}
+                        [
+                            {{ queue_datum.seconds_ago }} / {{ time_unit }},
+                            {{ queue_datum.patch_waiting_med }} / 60,
+                            "Patch Waiting Times\nMax: " + secondsToString({{ queue_datum.patch_waiting_max }}) + "\nMedian: " + secondsToString({{ queue_datum.patch_waiting_med }}) + "\nMin: " + secondsToString({{ queue_datum.patch_waiting_min }}) + "\n" + secondsToString({{ queue_datum.seconds_ago }}) + " ago",
+                            {{ queue_datum.patch_waiting_min }} / 60,
+                            {{ queue_datum.patch_waiting_max }} / 60,
+                        ],
+                    {% endfor %}
+                ]);
+                chart = new google.visualization.LineChart(document.getElementById('chart4'));
+                chart.draw(data, options);
+
+                function postPatchLink (selection) {
+                    if (selection.length > 0 && selection[0].row !== undefined) {
+                        var attachmentIdArray = [{% for patch_datum in patch_data %}{{ patch_datum.attachment_id }}, {% endfor %}];
+                        var attachmentId = attachmentIdArray[selection[0].row];
+                        var aTag = document.getElementById("selectedPatch");
+                        aTag.innerHTML = aTag.href = "//" + window.location.host + "/patch/" + attachmentId;
+                    }
+                }
+
+                // CHART 5
+                options.colors = ["brown", "red"];
+                options.hAxis.title = "{{ time_unit_name|capfirst }} Ago";
+                options.hAxis.viewWindow.min = {{ seconds_ago_min }} / {{ time_unit }};
+                options.hAxis.viewWindow.max = {{ seconds_ago_max }} / {{ time_unit }};
+                delete options.lineWidth;
+                data = new google.visualization.DataTable();
+                data.addColumn("number", "<time>");
+                data.addColumn("number", "Process Duration");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addColumn("number", "Wait Duration");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addRows([
+                    {% for patch_datum in patch_data %}
+                        [
+                            {{ patch_datum.seconds_ago }} / {{ time_unit }},
+                            {{ patch_datum.process_duration }},
+                            "Patch {{ patch_datum.attachment_id }}\n" + secondsToString({{ patch_datum.seconds_ago }}) + " ago",
+                            {{ patch_datum.wait_duration }},
+                            "Patch {{ patch_datum.attachment_id }}\n" + secondsToString({{ patch_datum.seconds_ago }}) + " ago",
+                        ],
+                    {% endfor %}
+                ]);
+                chart = new google.visualization.ScatterChart(document.getElementById('chart5'));
+                var chart5 = chart;
+                google.visualization.events.addListener(chart, "select", function () {postPatchLink(chart5.getSelection());});
+                chart.draw(data, options);
+
+                // CHART 6
+                options.colors = ["blue", "purple"];
+                delete options.vAxis.title;
+                data = new google.visualization.DataTable();
+                data.addColumn("number", "<time>");
+                data.addColumn("number", "Status Updates");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addColumn("number", "Retries");
+                data.addColumn({type: "string", role: "tooltip"});
+                data.addRows([
+                    {% for patch_datum in patch_data %}
+                        [
+                            {{ patch_datum.seconds_ago }} / {{ time_unit }},
+                            {{ patch_datum.status_update_count }},
+                            "Patch {{ patch_datum.attachment_id }}\n" + secondsToString({{ patch_datum.seconds_ago }}) + " ago",
+                            {{ patch_datum.retry_count }},
+                            "Patch {{ patch_datum.attachment_id }}\n" + secondsToString({{ patch_datum.seconds_ago }}) + " ago",
+                        ],
+                    {% endfor %}
+                ]);
+                chart = new google.visualization.ScatterChart(document.getElementById('chart6'));
+                var chart6 = chart;
+                google.visualization.events.addListener(chart, "select", function () {postPatchLink(chart6.getSelection());});
+                chart.draw(data, options);
+            });
+
+            function setURLParameter (parameterName, newValue) {
+                var split;
+                split = window.location.href.split("?");
+                var url, parameterArray;
+                url = split[0];
+                if (split.length > 1) {
+                    parameterArray = split[1].split("&");
+                } else {
+                    parameterArray = [];
+                }
+                var setParameter = false;
+                for (var i = 0; i < parameterArray.length; i++) {
+                    var currentParameterName = decodeURIComponent(parameterArray[i].split("=")[0]);
+                    if (currentParameterName === parameterName) {
+                        parameterArray[i] = encodeURIComponent(parameterName) + "=" + encodeURIComponent(newValue);
+                        setParameter = true;
+                        break;
+                    }
+                }
+                if (!setParameter) {
+                    parameterArray.push(encodeURIComponent(parameterName) + "=" + encodeURIComponent(newValue));
+                }console.log(parameterArray);
+                window.location.href = url + "?" + parameterArray.join("&");
+            }
+        </script>
+    </head>
+
+    <body>
+        <div class="choices">
+            {% for single_queue_name in all_queue_names %}
+                {% if single_queue_name == queue_name %}
+                    {{ queue_name }}
+                {% else %}
+                    {{ single_queue_name|force_escape|queue_charts_link:single_queue_name|safe }}
+                {% endif %}
+                {% if not forloop.last %} | {% endif %}
+            {% endfor %}
+        </div>
+        <h1>{{ queue_name }} Charts</h1>
+        <div>[{{ queue_name|force_escape|queue_status_link:"status"|safe }}]</div>
+        <div id="timestamp"></div>
+        <div class="choices">Viewing range:
+            {% for view_range_choice in view_range_choices %}
+                {% if view_range_choice.view_range == view_range %}
+                    {{ view_range_choice.name }}
+                {% else %}
+                    <a href="javascript:setURLParameter('view_range', {{ view_range_choice.view_range }})">{{ view_range_choice.name }}</a>
+                {% endif %}
+                {% if not forloop.last %} | {% endif %}
+            {% endfor %}
+        </div>
+        <div class="chart" id="chart1"></div>
+        <div class="chart" id="chart2"></div>
+        <div class="chart" id="chart3"></div>
+        <div class="chart" id="chart4"></div>
+        <div class="chart" id="chart5"></div>
+        <div class="chart" id="chart6"></div>
+        Selected patch: <a id="selectedPatch">(None)</div>
+    </body>
+</html>
diff --git a/Tools/QueueStatusServer/templates/queuestatus.html b/Tools/QueueStatusServer/templates/queuestatus.html
index f8eb61e..aafafbd 100644
--- a/Tools/QueueStatusServer/templates/queuestatus.html
+++ b/Tools/QueueStatusServer/templates/queuestatus.html
@@ -9,6 +9,7 @@
 
 <h3>Summary</h3>
 <div>
+<div>[{{ queue_name|force_escape|queue_charts_link:"charts"|safe }}]</div>
 Last Pass: {% if last_pass %}{{ last_pass.date|timesince }} ago{% else %}never{% endif %}
 {% if not bot_id and last_pass.bot_id %}
 by <a href="/queue-status/{{last_pass.queue_name}}/bots/{{last_pass.bot_id}}">{{ last_pass.bot_id }}</a>
diff --git a/Tools/Scripts/VCSUtils.pm b/Tools/Scripts/VCSUtils.pm
index b3b8ec2..cf87db3 100644
--- a/Tools/Scripts/VCSUtils.pm
+++ b/Tools/Scripts/VCSUtils.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2007, 2008, 2009 Apple Inc.  All rights reserved.
+# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.  All rights reserved.
 # Copyright (C) 2009, 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
 # Copyright (C) 2010, 2011 Research In Motion Limited. All rights reserved.
 # Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
@@ -1005,13 +1005,23 @@
             # Then we are in the body of the diff.
             my $isChunkRange = defined(parseChunkRange($line));
             $numTextChunks += 1 if $isChunkRange;
+            my $nextLine = <$fileHandle>;
+            my $willAddNewLineAtEndOfFile = defined($nextLine) && $nextLine =~ /^\\ No newline at end of file$/;
+            if ($willAddNewLineAtEndOfFile) {
+                # Diff(1) always emits a LF character preceeding the line "\ No newline at end of file".
+                # We must preserve both the added LF character and the line ending of this sentinel line
+                # or patch(1) will complain.
+                $svnText .= $line . $nextLine;
+                $line = <$fileHandle>;
+                next;
+            }
             if ($indexPathEOL && !$isChunkRange) {
                 # The chunk range is part of the body of the diff, but its line endings should't be
                 # modified or patch(1) will complain. So, we only modify non-chunk range lines.
                 $line =~ s/\r\n|\r|\n/$indexPathEOL/g;
             }
             $svnText .= $line;
-            $line = <$fileHandle>;
+            $line = $nextLine;
             next;
         } # Otherwise, we found a diff header.
 
@@ -1023,6 +1033,10 @@
 
         ($headerHashRef, $line) = parseDiffHeader($fileHandle, $line);
         if (!$optionsHashRef || !$optionsHashRef->{shouldNotUseIndexPathEOL}) {
+            # FIXME: We shouldn't query the file system (via firstEOLInFile()) to determine the
+            #        line endings of the file indexPath. Instead, either the caller to parseDiff()
+            #        should provide this information or parseDiff() should take a delegate that it
+            #        can use to query for this information.
             $indexPathEOL = firstEOLInFile($headerHashRef->{indexPath}) if !$headerHashRef->{isNew} && !$headerHashRef->{isBinary};
         }
 
@@ -1815,9 +1829,6 @@
     my ($config) = @_;
 
     my $result = `git config $config`;
-    if (($? >> 8)) {
-        $result = `git repo-config $config`;
-    }
     chomp $result;
     return $result;
 }
diff --git a/Tools/Scripts/build-jsc b/Tools/Scripts/build-jsc
index 3fbf43f..ca056f8 100755
--- a/Tools/Scripts/build-jsc
+++ b/Tools/Scripts/build-jsc
@@ -85,7 +85,7 @@
         $result = buildVisualStudioProject("$projectName.vcproj/$projectName.sln");
     } elsif (isGtk()) {
         checkForArgumentAndRemoveFromARGV("--gtk");
-        $result = buildGtkProject($projectName, 0, @ARGV);
+        $result = buildGtkProject($projectName, 0);
     } elsif (isWx()) {
         # Builds everything in one-shot. No need to build anything here.
         $result = 0;
diff --git a/Tools/Scripts/build-webkit b/Tools/Scripts/build-webkit
index f36abef..88948a6 100755
--- a/Tools/Scripts/build-webkit
+++ b/Tools/Scripts/build-webkit
@@ -57,8 +57,9 @@
 my $installLibs;
 my $prefixPath;
 my $makeArgs = "";
-my $cmakeArgs;
+my $cmakeArgs = "";
 my $onlyWebKitProject = 0;
+my $noWebKit1 = 0;
 my $noWebKit2 = 0;
 my $coverageSupport = 0;
 my $startTime = time();
@@ -107,7 +108,11 @@
 Usage: $programName [options] [options to pass to build system]
   --help                            Show this help message
   --clean                           Cleanup the build directory
-  --debug                           Compile in debug mode
+  --debug                           Compile with Debug configuration
+  --release                         Compile with Release configuration
+  --sdk=<sdk>                       Use a specific Xcode SDK (iOS and Mac only)
+  --device                          Use the current iphoneos.internal SDK (iOS only)
+  --simulator                       Use the current iphonesimulator SDK (iOS only)
   --gyp                             Use GYP-generated project files
   --coverage                        Enable Code Coverage support (Mac only)
 
@@ -128,11 +133,12 @@
   --prefix=<path>                   Set installation prefix to the given path (Gtk/Efl/BlackBerry only)
   --makeargs=<arguments>            Optional Makefile flags
   --qmakearg=<arguments>            Optional qmake flags (Qt only, e.g. --qmakearg="CONFIG+=webkit2" to build WebKit2)
-  --cmakearg=<arguments>            Optional CMake flags (e.g. --cmakearg="-DFOO=bar -DCMAKE_PREFIX_PATH=/usr/local")
+  --cmakeargs=<arguments>           Optional CMake flags (e.g. --cmakeargs="-DFOO=bar -DCMAKE_PREFIX_PATH=/usr/local")
 
   --minimal                         No optional features, unless explicitly enabled
 
   --only-webkit                     Build only the WebKit project
+  --no-webkit1                      Omit WebKit1 code from the build (Qt/EFL/GTK only)
   --no-webkit2                      Omit WebKit2 code from the build
 
 EOF
@@ -148,6 +154,7 @@
     'cmakeargs=s' => \$cmakeArgs,
     'minimal' => \$minimal,
     'only-webkit' => \$onlyWebKitProject,
+    'no-webkit1' => \$noWebKit1,
     'no-webkit2' => \$noWebKit2,
     'coverage' => \$coverageSupport,
 );
@@ -209,16 +216,7 @@
 
 my @options = ();
 
-# enable autotool options accordingly
-if (isGtk()) {
-    @options = @ARGV;
-    foreach (@features) {
-        push @options, autotoolsFlag(${$_->{value}}, $_->{option});
-    }
-
-    push @options, "--prefix=" . $prefixPath if defined($prefixPath);
-    push @options, "--makeargs=" . $makeArgs if $makeArgs;
-} elsif (isAppleMacWebKit()) {
+if (isAppleMacWebKit()) {
     push @options, XcodeOptions();
 
     sub option($$$)
@@ -254,6 +252,7 @@
     push @options, "--install-headers=" . $installHeaders if defined($installHeaders);
     push @options, "--install-libs=" . $installLibs if defined($installLibs);
     push @options, "--makeargs=" . $makeArgs if $makeArgs;
+    push @options, "WEBKIT_CONFIG-=build_webkit1" if $noWebKit1;
     push @options, "WEBKIT_CONFIG-=build_webkit2" if $noWebKit2;
 
     if (checkForArgumentAndRemoveFromARGV("-2")) {
@@ -319,8 +318,8 @@
 if (isEfl()) {
     # By default we build using all of the available CPUs.
     $makeArgs .= ($makeArgs ? " " : "") . "-j" . numberOfCPUs() if $makeArgs !~ /-j\s*\d+/;
-    $cmakeArgs .= ($cmakeArgs ? " " : "") . "-DENABLE_WEBKIT=ON";
-    $cmakeArgs .= " -DENABLE_WEBKIT2=ON" if !$noWebKit2;
+    $cmakeArgs = "-DENABLE_WEBKIT=OFF "  . $cmakeArgs if $noWebKit1;
+    $cmakeArgs = "-DENABLE_WEBKIT2=OFF " . $cmakeArgs if $noWebKit2;
 
     # We remove CMakeCache to avoid the bots to reuse cached flags when
     # we enable new features. This forces a reconfiguration.
@@ -364,10 +363,7 @@
 
     my $project = basename($dir);
     if (isGtk()) {
-        if ($noWebKit2) {
-            unshift(@options, "--disable-webkit2");
-        }
-        $result = buildGtkProject($project, $clean, @options);
+        $result = buildGtkProject($project, $clean, $prefixPath, $makeArgs, $noWebKit1, $noWebKit2, @features);
     } elsif (isAppleMacWebKit()) {
         my @local_options = @options;
         push @local_options, XcodeCoverageSupportOptions() if $coverageSupport && $project ne "ANGLE";
@@ -450,11 +446,11 @@
     my $buildTime = formatBuildTime($endTime - $startTime);
 
     print "\n";
-    print "===========================================================\n";
+    print "====================================================================\n";
     print " WebKit is now built ($buildTime). \n";
     if (!isChromium()) {
         print " To run $launcherName with this newly-built code, use the\n";
         print " \"$launcherPath\" script.\n";
     }
-    print "===========================================================\n";
+    print "====================================================================\n";
 }
diff --git a/Tools/Scripts/check-for-inappropriate-macros-in-external-headers b/Tools/Scripts/check-for-inappropriate-macros-in-external-headers
new file mode 100755
index 0000000..7e6c31f
--- /dev/null
+++ b/Tools/Scripts/check-for-inappropriate-macros-in-external-headers
@@ -0,0 +1,77 @@
+#!/usr/bin/env ruby
+
+# Copyright (C) 2012 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+# This script checks that the given headers in the framework build product do
+# not contain Platform.h and Compiler.h macros such as PLATFORM, COMPILER, etc.
+# This is meant to limit the exposure of the WTF headers, ensuring that if
+# clients include these headers they would not also need WTF's Platform.h.
+
+base_directory = ENV['TARGET_BUILD_DIR'] or throw "Unable to find TARGET_BUILD_DIR in the environment!"
+project_name = ENV['PROJECT_NAME'] or throw "Unable to find PROJECT_NAME in the environment!"
+$is_shallow_bundle = (ENV['SHALLOW_BUNDLE'] || "NO").upcase == "YES"
+
+$error_printed = false
+
+def print_error(msg)
+  $error_printed = true
+  STDERR.puts "ERROR: #{msg}"
+end
+
+def framework_headers_for_path(framework, path)
+  full_path = File.join Dir.pwd, framework, $is_shallow_bundle ? "" : "Versions/A/", path
+  if File.directory? full_path
+    Dir.glob "#{full_path}/**/*.h"
+  elsif File.exists? full_path
+    [full_path]
+  else
+    print_error "path '#{full_path}' for argument '#{path}' does not exist."
+    [] # Return an empty list so we can continue to check the other paths.
+  end
+end
+
+def verify_macros_in_header(header)
+  File.open(header) do |file|
+    file.each_line.with_index do |line, index|
+      # Check for the common macros from Platform.h and Compiler.h.
+      # NOTE: Negative lookahead (?!error) prevents matching "#error WebKit was not available prior to Mac OS X 10.2".
+      # NOTE: Negative lookahead (?!:2) prevents matching OS2 in macros like "defined(__OS2__)".
+      if match = /^\s*#(?!error).*?\b(PLATFORM|CPU|HAVE|OS(?!2)|USE|ENABLE|COMPILER)/.match(line)
+        print_error "'#{header}:#{index+1}' included forbidden macro '#{match[1]}' => '#{line.chomp}'"
+      end
+    end
+  end
+end
+
+
+Dir.chdir base_directory
+
+framework = "#{project_name}.framework"
+ARGV.each do |path|
+  framework_headers_for_path(framework, path).each do |header|
+    verify_macros_in_header(header)
+  end
+end
+
+exit 1 if $error_printed
diff --git a/Tools/Scripts/check-for-webkit-framework-include-consistency b/Tools/Scripts/check-for-webkit-framework-include-consistency
index 339fa7e..fabc692 100755
--- a/Tools/Scripts/check-for-webkit-framework-include-consistency
+++ b/Tools/Scripts/check-for-webkit-framework-include-consistency
@@ -27,10 +27,6 @@
 base_directory = ENV['TARGET_BUILD_DIR'] or throw "Unable to find TARGET_BUILD_DIR in the environment!"
 is_shallow_bundle = (ENV['SHALLOW_BUNDLE'] || "NO").upcase == "YES"
 
-unless base_directory
-  throw "Unable to find TARGET_BUILD_DIR in the environment!"
-end
-
 Dir.chdir base_directory
 
 $PERMITTED_INCLUDE_TYPES = { :public => [ :public ], :private => [ :public, :private ] }
@@ -73,9 +69,6 @@
 
   # A header of any type including a WebCore header is a recipe for disaster.
   if framework == "WebCore"
-    # <rdar://problem/7718826> WebKeyGenerator.h should not include a WebCore header
-    return if header =~ /\/WebKeyGenerator.h$/ and included_header_name == "WebCoreKeyGenerator.h"
-
     print_error "#{header} included #{included_header}!"
     return
   end
diff --git a/Tools/Scripts/copy-webkitlibraries-to-product-directory b/Tools/Scripts/copy-webkitlibraries-to-product-directory
index dd6f29d..67a1e3b 100755
--- a/Tools/Scripts/copy-webkitlibraries-to-product-directory
+++ b/Tools/Scripts/copy-webkitlibraries-to-product-directory
@@ -34,8 +34,6 @@
 chdirWebKit();
 
 my @librariesToCopy = (
-    "libWebKitSystemInterfaceLeopard.a",
-    "libWebKitSystemInterfaceSnowLeopard.a",
     "libWebKitSystemInterfaceLion.a",
     "libWebKitSystemInterfaceMountainLion.a",
     "libWebCoreSQLite3.a",
diff --git a/Tools/Scripts/display-profiler-output b/Tools/Scripts/display-profiler-output
new file mode 100755
index 0000000..1a1deee
--- /dev/null
+++ b/Tools/Scripts/display-profiler-output
@@ -0,0 +1,938 @@
+#!/usr/bin/env ruby
+
+# Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+require 'rubygems'
+
+require 'readline'
+
+begin
+    require 'json'
+    require 'highline'
+rescue LoadError
+    $stderr.puts "Error: some required gems are not installed!"
+    $stderr.puts
+    $stderr.puts "Try running:"
+    $stderr.puts
+    $stderr.puts "sudo gem install json"
+    $stderr.puts "sudo gem install highline"
+    exit 1
+end
+
+class Bytecode
+    attr_accessor :bytecodes, :bytecodeIndex, :opcode, :description, :topCounts, :bottomCounts, :machineInlinees, :osrExits
+    
+    def initialize(bytecodes, bytecodeIndex, opcode, description)
+        @bytecodes = bytecodes
+        @bytecodeIndex = bytecodeIndex
+        @opcode = opcode
+        @description = description
+        @topCounts = [] # "source" counts
+        @bottomCounts = {} # "machine" counts, maps compilations to counts
+        @machineInlinees = {} # maps my compilation to a set of inlinees
+        @osrExits = []
+    end
+    
+    def shouldHaveCounts?
+        @opcode != "op_call_put_result"
+    end
+    
+    def addTopCount(count)
+        @topCounts << count
+    end
+    
+    def addBottomCountForCompilation(count, compilation)
+        @bottomCounts[compilation] = [] unless @bottomCounts[compilation]
+        @bottomCounts[compilation] << count
+    end
+    
+    def addMachineInlinee(compilation, inlinee)
+        @machineInlinees[compilation] = {} unless @machineInlinees[compilation]
+        @machineInlinees[compilation][inlinee] = true
+    end
+    
+    def totalTopExecutionCount
+        sum = 0
+        @topCounts.each {
+            | value |
+            sum += value.count
+        }
+        sum
+    end
+    
+    def topExecutionCount(engine)
+        sum = 0
+        @topCounts.each {
+            | value |
+            if value.engine == engine
+                sum += value.count
+            end
+        }
+        sum
+    end
+    
+    def totalBottomExecutionCount
+        sum = 0
+        @bottomCounts.each_value {
+            | counts |
+            max = 0
+            counts.each {
+                | value |
+                max = [max, value.count].max
+            }
+            sum += max
+        }
+        sum
+    end
+    
+    def bottomExecutionCount(engine)
+        sum = 0
+        @bottomCounts.each_pair {
+            | compilation, counts |
+            if compilation.engine == engine
+                max = 0
+                counts.each {
+                    | value |
+                    max = [max, value.count].max
+                }
+                sum += max
+            end
+        }
+        sum
+    end
+    
+    def totalExitCount
+        sum = 0
+        @osrExits.each {
+            | exit |
+            sum += exit.count
+        }
+        sum
+    end
+end
+
+class Bytecodes
+    attr_accessor :codeHash, :inferredName, :source, :instructionCount, :machineInlineSites, :compilations
+    
+    def initialize(json)
+        @codeHash = json["hash"].to_s
+        @inferredName = json["inferredName"].to_s
+        @source = json["sourceCode"].to_s
+        @instructionCount = json["instructionCount"].to_i
+        @bytecode = {}
+        json["bytecode"].each {
+            | subJson |
+            index = subJson["bytecodeIndex"].to_i
+            @bytecode[index] = Bytecode.new(self, index, subJson["opcode"].to_s, subJson["description"].to_s)
+        }
+        @machineInlineSites = {} # maps compilation to a set of origins
+        @compilations = []
+    end
+    
+    def name(limit)
+        if to_s.size > limit
+            "\##{@codeHash}"
+        else
+            to_s
+        end
+    end
+    
+    def to_s
+        "#{@inferredName}\##{@codeHash}"
+    end
+    
+    def matches(pattern)
+        if pattern =~ /^#/
+            $~.post_match == @codeHash
+        elsif pattern =~ /#/
+            pattern == to_s
+        else
+            pattern == @inferredName or pattern == @codeHash
+        end
+    end
+    
+    def each
+        @bytecode.values.sort{|a, b| a.bytecodeIndex <=> b.bytecodeIndex}.each {
+            | value |
+            yield value
+        }
+    end
+    
+    def bytecode(bytecodeIndex)
+        @bytecode[bytecodeIndex]
+    end
+    
+    def addMachineInlineSite(compilation, origin)
+        @machineInlineSites[compilation] = {} unless @machineInlineSites[compilation]
+        @machineInlineSites[compilation][origin] = true
+    end
+    
+    def totalMachineInlineSites
+        sum = 0
+        @machineInlineSites.each_value {
+            | set |
+            sum += set.size
+        }
+        sum
+    end
+    
+    def sourceMachineInlineSites
+        set = {}
+        @machineInlineSites.each_value {
+            | mySet |
+            set.merge!(mySet)
+        }
+        set.size
+    end
+    
+    def totalMaxTopExecutionCount
+        max = 0
+        @bytecode.each_value {
+            | bytecode |
+            max = [max, bytecode.totalTopExecutionCount].max
+        }
+        max
+    end
+    
+    def maxTopExecutionCount(engine)
+        max = 0
+        @bytecode.each_value {
+            | bytecode |
+            max = [max, bytecode.topExecutionCount(engine)].max
+        }
+        max
+    end
+    
+    def totalMaxBottomExecutionCount
+        max = 0
+        @bytecode.each_value {
+            | bytecode |
+            max = [max, bytecode.totalBottomExecutionCount].max
+        }
+        max
+    end
+    
+    def maxBottomExecutionCount(engine)
+        max = 0
+        @bytecode.each_value {
+            | bytecode |
+            max = [max, bytecode.bottomExecutionCount(engine)].max
+        }
+        max
+    end
+    
+    def totalExitCount
+        sum = 0
+        each {
+            | bytecode |
+            sum += bytecode.totalExitCount
+        }
+        sum
+    end
+end
+
+class ProfiledBytecode
+    attr_reader :bytecodeIndex, :description
+    
+    def initialize(json)
+        @bytecodeIndex = json["bytecodeIndex"].to_i
+        @description = json["description"].to_s
+    end
+end
+
+class ProfiledBytecodes
+    attr_reader :header, :bytecodes
+    
+    def initialize(json)
+        @header = json["header"]
+        @bytecodes = $bytecodes[json["bytecodesID"].to_i]
+        @sequence = json["bytecode"].map {
+            | subJson |
+            ProfiledBytecode.new(subJson)
+        }
+    end
+    
+    def each
+        @sequence.each {
+            | description |
+            yield description
+        }
+    end
+end
+
+def originStackFromJSON(json)
+    json.map {
+        | subJson |
+        $bytecodes[subJson["bytecodesID"].to_i].bytecode(subJson["bytecodeIndex"].to_i)
+    }
+end
+
+class CompiledBytecode
+    attr_accessor :origin, :description
+    
+    def initialize(json)
+        @origin = originStackFromJSON(json["origin"])
+        @description = json["description"].to_s
+    end
+end
+
+class ExecutionCounter
+    attr_accessor :origin, :engine, :count
+    
+    def initialize(origin, engine, count)
+        @origin = origin
+        @engine = engine
+        @count = count
+    end
+end
+
+class OSRExit
+    attr_reader :compilation, :origin, :codeAddresses, :exitKind, :isWatchpoint, :count
+    
+    def initialize(compilation, origin, codeAddresses, exitKind, isWatchpoint, count)
+        @compilation = compilation
+        @origin = origin
+        @codeAddresses = codeAddresses
+        @exitKind = exitKind
+        @isWatchpoint = isWatchpoint
+        @count = count
+    end
+    
+    def dumpForDisplay(prefix)
+        puts(prefix + "EXIT: due to #{@exitKind}, #{@count} times")
+    end
+end
+
+class Compilation
+    attr_accessor :bytecode, :engine, :descriptions, :counters, :compilationIndex
+    attr_accessor :osrExits, :profiledBytecodes, :numInlinedGetByIds, :numInlinedPutByIds
+    attr_accessor :numInlinedCalls
+    
+    def initialize(json)
+        @bytecode = $bytecodes[json["bytecodesID"].to_i]
+        @bytecode.compilations << self
+        @compilationIndex = @bytecode.compilations.size
+        @engine = json["compilationKind"]
+        @descriptions = json["descriptions"].map {
+            | subJson |
+            CompiledBytecode.new(subJson)
+        }
+        @descriptions.each {
+            | description |
+            next if description.origin.empty?
+            description.origin[1..-1].each_with_index {
+                | inlinee, index |
+                description.origin[0].addMachineInlinee(self, inlinee.bytecodes)
+                inlinee.bytecodes.addMachineInlineSite(self, description.origin[0...index])
+            }
+        }
+        @counters = {}
+        json["counters"].each {
+            | subJson |
+            origin = originStackFromJSON(subJson["origin"])
+            counter = ExecutionCounter.new(origin, @engine, subJson["executionCount"].to_i)
+            @counters[origin] = counter
+            origin[-1].addTopCount(counter)
+            origin[0].addBottomCountForCompilation(counter, self)
+        }
+        @osrExits = {}
+        json["osrExits"].each {
+            | subJson |
+            osrExit = OSRExit.new(self, originStackFromJSON(subJson["origin"]),
+                                  json["osrExitSites"][subJson["id"]].map {
+                                      | value |
+                                      value.hex
+                                  }, subJson["exitKind"], subJson["isWatchpoint"],
+                                  subJson["count"])
+            osrExit.codeAddresses.each {
+                | codeAddress |
+                osrExits[codeAddress] = [] unless osrExits[codeAddress]
+                osrExits[codeAddress] << osrExit
+            }
+            osrExit.origin[-1].osrExits << osrExit
+        }
+        @profiledBytecodes = []
+        json["profiledBytecodes"].each {
+            | subJson |
+            @profiledBytecodes << ProfiledBytecodes.new(subJson)
+        }
+        @numInlinedGetByIds = json["numInlinedGetByIds"]
+        @numInlinedPutByIds = json["numInlinedPutByIds"]
+        @numInlinedCalls = json["numInlinedCalls"]
+    end
+    
+    def counter(origin)
+        @counters[origin]
+    end
+    
+    def to_s
+        "#{bytecode}-#{compilationIndex}-#{engine}"
+    end
+end
+
+class DescriptionLine
+    attr_reader :actualCountsString, :sourceCountsString, :disassembly, :shouldShow
+    
+    def initialize(actualCountsString, sourceCountsString, disassembly, shouldShow)
+        @actualCountsString = actualCountsString
+        @sourceCountsString = sourceCountsString
+        @disassembly = disassembly
+        @shouldShow = shouldShow
+    end
+    
+    def codeAddress
+        if @disassembly =~ /^\s*(0x[0-9a-fA-F]+):/
+            $1.hex
+        else
+            nil
+        end
+    end
+end
+            
+if ARGV.length != 1
+    $stderr.puts "Usage: display-profiler-output <path to profiler output file>"
+    $stderr.puts
+    $stderr.puts "The typical usage pattern for the profiler currently looks something like:"
+    $stderr.puts
+    $stderr.puts "Path/To/jsc -p profile.json myprogram.js"
+    $stderr.puts "display-profiler-output profile.json"
+    exit 1
+end
+
+$json = JSON::parse(IO::read(ARGV[0]))
+$bytecodes = $json["bytecodes"].map {
+    | subJson |
+    Bytecodes.new(subJson)
+}
+$compilations = $json["compilations"].map {
+    | subJson |
+    Compilation.new(subJson)
+}
+$engines = ["Baseline", "DFG"]
+
+def lpad(str,chars)
+  if str.length>chars
+    str
+  else
+    "%#{chars}s"%(str)
+  end
+end
+
+def rpad(str, chars)
+    while str.length < chars
+        str += " "
+    end
+    str
+end
+
+def center(str, chars)
+    while str.length < chars
+        str += " "
+        if str.length < chars
+            str = " " + str
+        end
+    end
+    str
+end
+
+def mayBeHash(hash)
+    hash =~ /#/ or hash.size == 6
+end
+
+def sourceOnOneLine(source, limit)
+    source.gsub(/\s+/, ' ')[0...limit]
+end
+
+def screenWidth
+    if $stdin.tty?
+        HighLine::SystemExtensions.terminal_size[0]
+    else
+        200
+    end
+end
+
+def summary(mode)
+    remaining = screenWidth
+    
+    # Figure out how many columns we need for the code block names, and for counts
+    maxCount = 0
+    maxName = 0
+    $bytecodes.each {
+        | bytecodes |
+        maxCount = ([maxCount] + $engines.map {
+                        | engine |
+                        bytecodes.maxTopExecutionCount(engine)
+                    } + $engines.map {
+                        | engine |
+                        bytecodes.maxBottomExecutionCount(engine)
+                    }).max
+        maxName = [bytecodes.to_s.size, maxName].max
+    }
+    maxCountDigits = maxCount.to_s.size
+    
+    hashCols = [[maxName, 30].min, "CodeBlock".size].max
+    remaining -= hashCols + 1
+    
+    countCols = [maxCountDigits * $engines.size, "Source Counts".size].max
+    remaining -= countCols + 1
+    
+    if mode == :full
+        instructionCountCols = 6
+        remaining -= instructionCountCols + 1
+        
+        machineCountCols = [maxCountDigits * $engines.size, "Machine Counts".size].max
+        remaining -= machineCountCols + 1
+        
+        compilationsCols = 7
+        remaining -= compilationsCols + 1
+        
+        inlinesCols = 9
+        remaining -= inlinesCols + 1
+        
+        exitCountCols = 7
+        remaining -= exitCountCols + 1
+        
+        recentOptsCols = 12
+        remaining -= recentOptsCols + 1
+    end
+    
+    if remaining > 0
+        sourceCols = remaining
+    else
+        sourceCols = nil
+    end
+    
+    print(center("CodeBlock", hashCols))
+    if mode == :full
+        print(" " + center("#Instr", instructionCountCols))
+    end
+    print(" " + center("Source Counts", countCols))
+    if mode == :full
+        print(" " + center("Machine Counts", machineCountCols))
+        print(" " + center("#Compil", compilationsCols))
+        print(" " + center("Inlines", inlinesCols))
+        print(" " + center("#Exits", exitCountCols))
+        print(" " + center("Last Opts", recentOptsCols))
+    end
+    if sourceCols
+        print(" " + center("Source", sourceCols))
+    end
+    puts
+    
+    print(center("", hashCols))
+    if mode == :full
+        print(" " + (" " * instructionCountCols))
+    end
+    print(" " + center("Base/DFG", countCols))
+    if mode == :full
+        print(" " + center("Base/DFG", machineCountCols))
+        print(" " + (" " * compilationsCols))
+        print(" " + center("Src/Total", inlinesCols))
+        print(" " + (" " * exitCountCols))
+        print(" " + center("Get/Put/Call", recentOptsCols))
+    end
+    puts
+    $bytecodes.sort {
+        | a, b |
+        b.totalMaxTopExecutionCount <=> a.totalMaxTopExecutionCount
+    }.each {
+        | bytecode |
+        print(center(bytecode.name(hashCols), hashCols))
+        if mode == :full
+            print(" " + center(bytecode.instructionCount.to_s, instructionCountCols))
+        end
+        print(" " +
+              center($engines.map {
+                         | engine |
+                         bytecode.maxTopExecutionCount(engine).to_s
+                     }.join("/"), countCols))
+        if mode == :full
+            print(" " + center($engines.map {
+                                   | engine |
+                                   bytecode.maxBottomExecutionCount(engine).to_s
+                               }.join("/"), machineCountCols))
+            print(" " + center(bytecode.compilations.size.to_s, compilationsCols))
+            print(" " + center(bytecode.sourceMachineInlineSites.to_s + "/" + bytecode.totalMachineInlineSites.to_s, inlinesCols))
+            print(" " + center(bytecode.totalExitCount.to_s, exitCountCols))
+            lastCompilation = bytecode.compilations[-1]
+            if lastCompilation
+                optData = [lastCompilation.numInlinedGetByIds,
+                           lastCompilation.numInlinedPutByIds,
+                           lastCompilation.numInlinedCalls]
+            else
+                optData = ["N/A"]
+            end
+            print(" " + center(optData.join('/'), recentOptsCols))
+        end
+        if sourceCols
+            print(" " + sourceOnOneLine(bytecode.source, sourceCols))
+        end
+        puts
+    }
+end
+
+def executeCommand(*commandArray)
+    command = commandArray[0]
+    args = commandArray[1..-1]
+    case command
+    when "help", "h", "?"
+        puts "summary (s)     Print a summary of code block execution rates."
+        puts "full (f)        Same as summary, but prints more information."
+        puts "source          Show the source for a code block."
+        puts "bytecode (b)    Show the bytecode for a code block, with counts."
+        puts "profiling (p)   Show the (internal) profiling data for a code block."
+        puts "display (d)     Display details for a code block."
+        puts "inlines         Show all inlining stacks that the code block was on."
+        puts "help (h)        Print this message."
+        puts "quit (q)        Quit."
+    when "quit", "q", "exit"
+        exit 0
+    when "summary", "s"
+        summary(:summary)
+    when "full", "f"
+        summary(:full)
+    when "source"
+        if args.length != 1
+            puts "Usage: source <code block hash>"
+            return
+        end
+        $bytecodes.each {
+            | bytecode |
+            if bytecode.matches(args[0])
+                puts bytecode.source
+            end
+        }
+    when "bytecode", "b"
+        if args.length != 1
+            puts "Usage: source <code block hash>"
+            return
+        end
+        
+        hash = args[0]
+        
+        countCols = 10 * $engines.size
+        machineCols = 10 * $engines.size
+        pad = 1
+        while (countCols + 1 + machineCols + pad) % 8 != 0
+            pad += 1
+        end
+        
+        $bytecodes.each {
+            | bytecodes |
+            next unless bytecodes.matches(hash)
+            puts(center("Source Counts", countCols) + " " + center("Machine Counts", machineCols) +
+                 (" " * pad) + center("Bytecode for #{bytecodes}", screenWidth - pad - countCols - 1 - machineCols))
+            puts(center("Base/DFG", countCols) + " " + center("Base/DFG", countCols))
+            bytecodes.each {
+                | bytecode |
+                if bytecode.shouldHaveCounts?
+                    countsString = $engines.map {
+                        | myEngine |
+                        bytecode.topExecutionCount(myEngine)
+                    }.join("/")
+                    machineString = $engines.map {
+                        | myEngine |
+                        bytecode.bottomExecutionCount(myEngine)
+                    }.join("/")
+                else
+                    countsString = ""
+                    machineString = ""
+                end
+                puts(center(countsString, countCols) + " " + center(machineString, machineCols) + (" " * pad) + bytecode.description.chomp)
+                bytecode.osrExits.each {
+                    | exit |
+                    puts(center("!!!!!", countCols) + " " + center("!!!!!", machineCols) + (" " * (pad + 10)) +
+                         "EXIT: in #{exit.compilation} due to #{exit.exitKind}, #{exit.count} times")
+                }
+            }
+        }
+    when "profiling", "p"
+        if args.length != 1
+            puts "Usage: profiling <code block hash>"
+            return
+        end
+        
+        hash = args[0]
+        
+        first = true
+        $compilations.each {
+            | compilation |
+            
+            compilation.profiledBytecodes.each {
+                | profiledBytecodes |
+                if profiledBytecodes.bytecodes.matches(hash)
+                    if first
+                        first = false
+                    else
+                        puts
+                    end
+                    
+                    puts "Compilation #{compilation}:"
+                    profiledBytecodes.header.each {
+                        | header |
+                        puts(" " * 6 + header)
+                    }
+                    profiledBytecodes.each {
+                        | bytecode |
+                        puts(" " * 8 + bytecode.description)
+                        profiledBytecodes.bytecodes.bytecode(bytecode.bytecodeIndex).osrExits.each {
+                            | exit |
+                            if exit.compilation == compilation
+                                puts(" !!!!!           EXIT: due to #{exit.exitKind}, #{exit.count} times")
+                            end
+                        }
+                    }
+                end
+            }
+        }
+    when "inlines"
+        if args.length != 1
+            puts "Usage: inlines <code block hash>"
+            return
+        end
+        
+        hash = args[0]
+        
+        $bytecodes.each {
+            | bytecodes |
+            next unless bytecodes.matches(hash)
+            
+            # FIXME: print something useful to say more about which code block this is.
+            
+            $compilations.each {
+                | compilation |
+                myOrigins = []
+                compilation.descriptions.each {
+                    | description |
+                    if description.origin.index {
+                            | myBytecode |
+                            bytecodes == myBytecode.bytecodes
+                        }
+                        myOrigins << description.origin
+                    end
+                }
+                myOrigins.uniq!
+                myOrigins.sort! {
+                    | a, b |
+                    result = 0
+                    [a.size, b.size].min.times {
+                        | index |
+                        result = a[index].bytecodeIndex <=> b[index].bytecodeIndex
+                        break if result != 0
+                    }
+                    result
+                }
+                
+                next if myOrigins.empty?
+
+                printArray = []
+                lastPrintStack = []
+                
+                def originToPrintStack(origin)
+                    (0...(origin.size - 1)).map {
+                        | index |
+                        "bc\##{origin[index].bytecodeIndex} --> #{origin[index + 1].bytecodes}"
+                    }
+                end
+                
+                def printStack(printArray, stack, lastStack)
+                    stillCommon = true
+                    stack.each_with_index {
+                        | entry, index |
+                        next if stillCommon and entry == lastStack[index]
+                        printArray << ("    " * (index + 1) + entry)
+                        stillCommon = false
+                    }
+                end
+                
+                myOrigins.each {
+                    | origin |
+                    currentPrintStack = originToPrintStack(origin)
+                    printStack(printArray, currentPrintStack, lastPrintStack)
+                    lastPrintStack = currentPrintStack
+                }
+
+                next if printArray.empty?
+                
+                puts "Compilation #{compilation}:"
+                printArray.each {
+                    | entry |
+                    puts entry
+                }
+            }
+        }
+    when "display", "d"
+        compilationIndex = nil
+        
+        case args.length
+        when 1
+            if args[0] == "*"
+                hash = nil
+            else
+                hash = args[0]
+            end
+            engine = nil
+        when 2
+            if mayBeHash(args[0])
+                hash = args[0]
+                engine = args[1]
+            else
+                engine = args[0]
+                hash = args[1]
+            end
+        else
+            puts "Usage: summary <code block hash> <engine>"
+            return
+        end
+        
+        if hash and hash =~ /-([0-9]+)-/
+            hash = $~.pre_match
+            engine = $~.post_match
+            compilationIndex = $1.to_i
+        end
+        
+        if engine and not $engines.index(engine)
+            pattern = Regexp.new(Regexp.escape(engine), "i")
+            trueEngine = nil
+            $engines.each {
+                | myEngine |
+                if myEngine =~ pattern
+                    trueEngine = myEngine
+                    break
+                end
+            }
+            unless trueEngine
+                puts "#{engine} is not a valid engine, try #{$engines.join(' or ')}."
+                return
+            end
+            engine = trueEngine
+        end
+        
+        actualCountCols = 13
+        sourceCountCols = 10 * $engines.size
+        
+        first = true
+        $compilations.each {
+            | compilation |
+            next if hash and not compilation.bytecode.matches(hash)
+            next if engine and compilation.engine != engine
+            next if compilationIndex and compilation.compilationIndex != compilationIndex
+            
+            if first
+                first = false
+            else
+                puts
+            end
+            
+            puts("Compilation #{compilation}:")
+            puts("    Num inlined: GetByIds: #{compilation.numInlinedGetByIds}  PutByIds: #{compilation.numInlinedPutByIds}  Calls: #{compilation.numInlinedCalls}")
+            puts(center("Actual Counts", actualCountCols) + " " + center("Source Counts", sourceCountCols) + " " + center("Disassembly in #{compilation.engine}", screenWidth - 1 - sourceCountCols - 1 - actualCountCols))
+            puts((" " * actualCountCols) + " " + center("Base/DFG", sourceCountCols))
+
+            lines = []
+
+            compilation.descriptions.each {
+                | description |
+                # FIXME: We should have a better way of detecting things like CountExecution nodes
+                # and slow path entries in the baseline JIT.
+                if description.description =~ /CountExecution\(/ and compilation.engine == "DFG"
+                    shouldShow = false
+                else
+                    shouldShow = true
+                end
+                if description.origin.empty? or not description.origin[-1].shouldHaveCounts? or (compilation.engine == "Baseline" and description.description =~ /^\s*\(S\)/)
+                    actualCountsString = ""
+                    sourceCountsString = ""
+                else
+                    actualCountsString = compilation.counter(description.origin).count.to_s
+                    sourceCountsString = $engines.map {
+                        | myEngine |
+                        description.origin[-1].topExecutionCount(myEngine)
+                    }.join("/")
+                end
+                description.description.split("\n").each {
+                    | line |
+                    lines << DescriptionLine.new(actualCountsString, sourceCountsString, line.chomp, shouldShow)
+                }
+            }
+            
+            exitPrefix = center("!!!!!", actualCountCols) + " " + center("!!!!!", sourceCountCols) + (" " * 25)
+            
+            lines.each_with_index {
+                | line, index |
+                codeAddress = line.codeAddress
+                if codeAddress
+                    list = compilation.osrExits[codeAddress]
+                    if list
+                        list.each {
+                            | exit |
+                            if exit.isWatchpoint
+                                exit.dumpForDisplay(exitPrefix)
+                            end
+                        }
+                    end
+                end
+                if line.shouldShow
+                    puts(center(line.actualCountsString, actualCountCols) + " " + center(line.sourceCountsString, sourceCountCols) + " " + line.disassembly)
+                end
+                if codeAddress
+                    # Find the next disassembly address.
+                    endIndex = index + 1
+                    endAddress = nil
+                    while endIndex < lines.size
+                        myAddress = lines[endIndex].codeAddress
+                        if myAddress
+                            endAddress = myAddress
+                            break
+                        end
+                        endIndex += 1
+                    end
+                    
+                    if endAddress
+                        list = compilation.osrExits[endAddress]
+                        if list
+                            list.each {
+                                | exit |
+                                unless exit.isWatchpoint
+                                    exit.dumpForDisplay(exitPrefix)
+                                end
+                            }
+                        end
+                    end
+                end
+            }
+        }
+    else
+        puts "Invalid command: #{command}"
+    end
+end
+
+if $stdin.tty?
+    executeCommand("full")
+end
+
+while commandLine = Readline.readline("> ", true)
+    executeCommand(*commandLine.split)
+end
+
diff --git a/Tools/Scripts/export-w3c-performance-wg-tests b/Tools/Scripts/export-w3c-performance-wg-tests
index aaa8659..1a41d44 100755
--- a/Tools/Scripts/export-w3c-performance-wg-tests
+++ b/Tools/Scripts/export-w3c-performance-wg-tests
@@ -43,7 +43,7 @@
 import sys
 
 if len(sys.argv) != 3:
-    print 'USAGE: %s path_to_webkit_checkout_root path_to_webperf_checkout_root'
+    print 'USAGE: %s path_to_webkit_checkout_root path_to_webperf_checkout_root' % sys.argv[0]
     sys.exit(1)
 
 source_directory = os.path.join(sys.argv[1], 'LayoutTests', 'http', 'tests', 'w3c', 'webperf')
@@ -63,7 +63,6 @@
     if not os.path.exists(destination_subdirectory):
         os.makedirs(destination_subdirectory)
     for root, dirs, files in os.walk(os.path.join(source_directory, directory_to_copy)):
-        print root, dirs, files
         root = os.path.relpath(root, source_directory)
         for dirname in dirs:
             destination_subdirectory = os.path.join(destination_directory, root, dirname)
@@ -78,3 +77,4 @@
                         for to_find, replace_with in replacements:
                             line = line.replace(to_find, replace_with)
                         out_file.write(line)
+                print 'Exported %s' % os.path.join(root, filename)
diff --git a/Tools/Scripts/generate-coverage-data b/Tools/Scripts/generate-coverage-data
index d06ee99..9365932 100755
--- a/Tools/Scripts/generate-coverage-data
+++ b/Tools/Scripts/generate-coverage-data
@@ -60,7 +60,7 @@
 
 print "Building and testing\n";
 system("Tools/Scripts/build-webkit", "--coverage", @ARGV) == 0 or die;
-system "Tools/Scripts/new-run-webkit-tests", "--no-launch-safari";
+system "Tools/Scripts/new-run-webkit-tests", "--no-show-results";
 system "Tools/Scripts/run-javascriptcore-tests", "--coverage", @ARGV;
 
 # Collect the data and generate a report
diff --git a/Tools/Scripts/import-w3c-performance-wg-tests b/Tools/Scripts/import-w3c-performance-wg-tests
index e48e261..caddde7 100755
--- a/Tools/Scripts/import-w3c-performance-wg-tests
+++ b/Tools/Scripts/import-w3c-performance-wg-tests
@@ -42,7 +42,7 @@
 import sys
 
 if len(sys.argv) != 3:
-    print 'USAGE: %s path_to_webperf_checkout_root path_to_webkit_checkout_root'
+    print 'USAGE: %s path_to_webperf_checkout_root path_to_webkit_checkout_root' % sys.argv[0]
     sys.exit(1)
 
 source_directory = os.path.join(sys.argv[1], 'tests')
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/Scripts/lint-test-expectations
old mode 100644
new mode 100755
similarity index 77%
rename from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
rename to Tools/Scripts/lint-test-expectations
index f06f94e..c56eb77
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/Scripts/lint-test-expectations
@@ -1,9 +1,10 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#!/usr/bin/env python
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +14,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +27,11 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+import sys
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+from webkitpy.common import version_check
+from webkitpy.layout_tests import lint_test_expectations
+
+
+sys.exit(lint_test_expectations.main(sys.argv[1:], sys.stdout, sys.stderr))
+
diff --git a/Tools/Scripts/lint-webkitpy b/Tools/Scripts/lint-webkitpy
index 0fbbd73..22de981e 100755
--- a/Tools/Scripts/lint-webkitpy
+++ b/Tools/Scripts/lint-webkitpy
@@ -27,14 +27,8 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import os
 import sys
 
-from webkitpy.thirdparty.autoinstalled.pylint import lint
+from webkitpy.style.checkers.python import Pylinter
 
-script_dir = os.path.abspath(os.path.dirname(__file__))
-if not script_dir in sys.path:
-    sys.path.append(script_dir)
-
-pylintrc = os.path.join(script_dir, 'webkitpy', 'pylintrc')
-lint.Run(['--rcfile', pylintrc, '-f', 'parseable' ] + sys.argv[1:])
+sys.stdout.write(Pylinter().run(sys.argv[1:]).getvalue())
diff --git a/Tools/Scripts/old-run-webkit-tests b/Tools/Scripts/old-run-webkit-tests
index ef3b197..aa4e484 100755
--- a/Tools/Scripts/old-run-webkit-tests
+++ b/Tools/Scripts/old-run-webkit-tests
@@ -201,6 +201,8 @@
 
 my $expectedTag = "expected";
 my $mismatchTag = "mismatch";
+my $refTag = "ref";
+my $notrefTag = "notref";
 my $actualTag = "actual";
 my $prettyDiffTag = "pretty-diff";
 my $diffsTag = "diffs";
@@ -293,6 +295,7 @@
   -i|--ignore-tests               Comma-separated list of directories or tests to ignore
   --iterations n                  Number of times to run the set of tests (e.g. ABCABCABC)
   --[no-]launch-safari            Launch (or do not launch) Safari to display test results (default: $launchSafariDefault)
+  --[no-]show-results             Same as --[no-]launch-safari
   -l|--leaks                      Enable leaks checking
   --[no-]new-test-results         Generate results for new tests
   --nthly n                       Restart DumpRenderTree every n tests (default: $testsPerDumpTool)
@@ -358,6 +361,7 @@
     'reverse' => \$reverseTests,
     'root=s' => \$root,
     'sample-on-timeout!' => \$runSample,
+    'show-results!' => \$launchSafari,
     'singly|1' => sub { $testsPerDumpTool = 1; },
     'skipped=s' => \&validateSkippedArg,
     'slowest' => \$report10Slowest,
@@ -423,6 +427,8 @@
 $productDir .= "/bin" if isQt();
 $productDir .= "/Programs" if isGtk();
 
+# Save the current directory before chaging it via chdirWebKit
+my $currentDir = cwd();
 chdirWebKit();
 
 if (!defined($root) && !$noBuildDumpTool) {
@@ -467,7 +473,7 @@
 
 $expectedDirectory = $ENV{"WebKitExpectedTestResultsDirectory"} if $ENV{"WebKitExpectedTestResultsDirectory"};
 
-$testResultsDirectory = File::Spec->rel2abs($testResultsDirectory);
+$testResultsDirectory = File::Spec->catfile($currentDir, $testResultsDirectory);
 # $testResultsDirectory must be empty before testing.
 rmtree $testResultsDirectory;
 my $testResults = File::Spec->catfile($testResultsDirectory, "results.html");
@@ -2628,15 +2634,18 @@
     my $filename = $_[0];
     my @extensions = ('html','shtml','xml','xhtml','htm','php','svg','mht','pl');
     my $extensionsJoined = join("|", @extensions);
-    my $extensionExpression = "-$expectedTag(-$mismatchTag)?\\.(".$extensionsJoined.")\$";
-    
-    if ($filename =~ /$extensionExpression/) {
+    my $suffixExtensionExpression = "-($expectedTag|$refTag|$notrefTag)(-$mismatchTag)?\\.(".$extensionsJoined.")\$";
+    my $prefixExtensionExpression = "^($refTag|$notrefTag)-";
+    if ($filename =~ /$suffixExtensionExpression/ || $filename =~ /$prefixExtensionExpression/) {
         return 1;
     }
     my $base = stripExtension($filename);
-    
+
     foreach my $extension (@extensions) {
-        if (-f "$base-$expectedTag.$extension" || -f "$base-$expectedTag-$mismatchTag.$extension") {
+        if (-f "$base-$expectedTag.$extension" || 
+            -f "$base-$refTag.$extension" || -f "$base-$notrefTag.$extension" ||
+            -f "$base-$expectedTag-$mismatchTag.$extension" ||
+            -f "$refTag-$base.$extension" || -f "$notrefTag-$base.$extension") {
             return 1;
         }
     }
diff --git a/Tools/Scripts/prepare-ChangeLog b/Tools/Scripts/prepare-ChangeLog
index a3816e2..f551540 100755
--- a/Tools/Scripts/prepare-ChangeLog
+++ b/Tools/Scripts/prepare-ChangeLog
@@ -499,7 +499,6 @@
         print CHANGE_LOG normalizeLineEndings("\n", $endl);
 
         print CHANGE_LOG normalizeLineEndings("        Reviewed by $reviewer.\n\n", $endl);
-        print CHANGE_LOG normalizeLineEndings("        Additional information of the change such as approach, rationale. Please add per-function descriptions below (OOPS!).\n\n", $endl);
 
         if ($prefix =~ m/WebCore/ || `pwd` =~ m/WebCore/) {
             if (@$addedRegressionTests) {
diff --git a/Tools/Scripts/run-api-tests b/Tools/Scripts/run-api-tests
index 3a3e00c..18eb17c 100755
--- a/Tools/Scripts/run-api-tests
+++ b/Tools/Scripts/run-api-tests
@@ -52,6 +52,7 @@
 my $verbose = 0;
 my $dumpTests = 0;
 my $build = 1;
+my $root;
 my $buildDefault = $build ? "build" : "do not build";
 my @testsFailed;
 my @testsTimedOut;
@@ -63,6 +64,7 @@
   -v|--verbose          Verbose output
   -d|--dump-tests       Dump the names of testcases without running them
   --[no-]build          Build (or do not build) unit tests prior to running (default: $buildDefault)
+  --root=               Path to the pre-built root containing TestWebKitAPI
   --chromium            Run the Chromium port on Mac/Win/Linux
 EOF
 
@@ -70,7 +72,8 @@
     'help' => \$showHelp,
     'verbose|v' => \$verbose,
     'dump|d' => \$dumpTests,
-    'build!' => \$build
+    'build!' => \$build,
+    'root=s' => \$root
 );
 
 if ($showHelp) {
@@ -79,7 +82,22 @@
 }
 
 setConfiguration();
-buildTestTool() if $build;
+
+# When running TestWebKitAPI for Chromium on Android, defer to the test runner in
+# Chromium as we can't execute the binary locally.
+if (isChromiumAndroid()) {
+    my @runTestCommand = ('build/android/run_tests.py', '--verbose', '--webkit', '--exit_code', '--out-directory', sourceDir() . '/out', '-s', 'TestWebKitAPI');
+    if (configuration() eq "Release") {
+        push @runTestCommand, '--release';
+    }
+
+    chdir(sourceDir() . '/Source/WebKit/chromium') or die $!;
+    exit exitStatus(system(@runTestCommand));
+}
+
+setConfigurationProductDir(Cwd::abs_path($root)) if (defined($root));
+
+buildTestTool() if $build && !defined($root);
 setPathForRunningWebKitApp(\%ENV);
 my @testsToRun = listAllTests();
 
@@ -260,6 +278,8 @@
        if ($line =~ m/\.$/) {
           $suite = $line; # "SuiteName."
        } else {
+          # Disabling WebKit2 API test on Windows since we will be disabling WebKit2 on Windows.
+          next if (isAppleWinWebKit() && $suite =~ m/WebKit2*/);       
           $line =~ s/^\s*//; # "TestName"
           push @tests, $suite . $line; # "SuiteName.TestName"
         }
diff --git a/Tools/Scripts/run-chromium-webkit-unit-tests b/Tools/Scripts/run-chromium-webkit-unit-tests
index 43f85ad..114f77a 100755
--- a/Tools/Scripts/run-chromium-webkit-unit-tests
+++ b/Tools/Scripts/run-chromium-webkit-unit-tests
@@ -34,7 +34,19 @@
 use webkitdirs;
 use VCSUtils;
 
-push(@ARGV, "--chromium");
 setConfiguration();
+
+# Defer to Android's test runners for running webkit_unit_tests on a device.
+if (checkForArgumentAndRemoveFromARGV('--platform=chromium-android')) {
+    my @runTestCommand = ('build/android/run_tests.py', '--verbose', '--webkit', '--exit_code', '--out-directory', sourceDir() . '/out', '-s', 'webkit_unit_tests');
+    if (configuration() eq "Release") {
+        push @runTestCommand, '--release';
+    }
+
+    chdir(sourceDir() . '/Source/WebKit/chromium') or die $!;
+    exit exitStatus(system(@runTestCommand));
+}
+
+push(@ARGV, "--chromium");
 my $pathToBinary = productDir() . "/webkit_unit_tests";
 exit exitStatus(system ($pathToBinary, @ARGV));
diff --git a/Tools/Scripts/run-efl-tests b/Tools/Scripts/run-efl-tests
index 52d119a..cb6df5b 100755
--- a/Tools/Scripts/run-efl-tests
+++ b/Tools/Scripts/run-efl-tests
@@ -48,6 +48,9 @@
 } else {
     setConfiguration();
 
+    # Manually add this for jhbuildWrapperPrefixIfNeeded().
+    push(@ARGV, "--efl");
+
     my $returnCode = exitStatus(generateBuildSystemFromCMakeProject("Efl", undef, cmakeBasedPortArguments()));
     exit($returnCode) if $returnCode;
 
diff --git a/Tools/Scripts/run-gtk-tests b/Tools/Scripts/run-gtk-tests
index b24cb24..35e70ed 100755
--- a/Tools/Scripts/run-gtk-tests
+++ b/Tools/Scripts/run-gtk-tests
@@ -62,26 +62,33 @@
 
     SKIPPED = [
         SkippedTest("unittests/testdownload", "/webkit/download/not-found", "Test fails in GTK Linux 64-bit Release bot", 82329),
-        SkippedTest("unittests/testwebview", "/webkit/webview/icon-uri", "Test times out in GTK Linux 64-bit Release bot", 82328),
-        SkippedTest("unittests/testwebresource", "/webkit/webresource/sub_resource_loading", "Test fails in GTK Linux 64-bit Release bot", 82330),
         SkippedTest("unittests/testwebinspector", "/webkit/webinspector/close-and-inspect", "Test is flaky in GTK Linux 32-bit Release bot", 82869),
-        SkippedTest("WebKit2APITests/TestWebKitWebView", "/webkit2/WebKitWebView/mouse-target", "Test is flaky in GTK Linux 32-bit Release bot", 82866),
+        SkippedTest("unittests/testwebresource", "/webkit/webresource/loading", "Test fails", 104689),
+        SkippedTest("unittests/testwebresource", "/webkit/webresource/sub_resource_loading", "Test fails in GTK Linux 64-bit Release bot", 82330),
+        SkippedTest("unittests/testwebview", "/webkit/webview/icon-uri", "Test times out in GTK Linux 64-bit Release bot", 82328),
+        SkippedTest("unittests/testatk", "/webkit/atk/getTextInParagraphAndBodyModerate", "Test fails", 105538),
+        SkippedTest("WebKit2APITests/TestInspectorServer", SkippedTest.ENTIRE_SUITE, "Test times out", 105866),
         SkippedTest("WebKit2APITests/TestResources", "/webkit2/WebKitWebView/resources", "Test is flaky in GTK Linux 32-bit Release bot", 82868),
-        SkippedTest("WebKit2APITests/TestWebKitFindController", "/webkit2/WebKitFindController/hide", "Test always fails in Xvfb", 89810),
         SkippedTest("WebKit2APITests/TestWebKitAccessibility", "/webkit2/WebKitAccessibility/atspi-basic-hierarchy", "Test fails", 100408),
-        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.WKConnection", "Tests fail and time out out", 84959),
-        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.RestoreSessionStateContainingFormData", "Session State is not implemented in GTK+ port", 84960),
-        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.SpacebarScrolling", "Test fails", 84961),
+        SkippedTest("WebKit2APITests/TestWebKitFindController", "/webkit2/WebKitFindController/hide", "Test always fails in Xvfb", 89810),
+        SkippedTest("WebKit2APITests/TestWebKitWebContext", "/webkit2/WebKitWebContext/uri-scheme", "Test fails", 104779),
+        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.CanHandleRequest", "Test fails", 88453),
+        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.MouseMoveAfterCrash", "Test is flaky", 85066),
         SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.NewFirstVisuallyNonEmptyLayoutForImages", "Test is flaky", 85066),
         SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.NewFirstVisuallyNonEmptyLayoutFrames", "Test fails", 85037),
-        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.MouseMoveAfterCrash", "Test is flaky", 85066),
-        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.CanHandleRequest", "Test fails", 88453),
+        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.RestoreSessionStateContainingFormData", "Session State is not implemented in GTK+ port", 84960),
+        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.SpacebarScrolling", "Test fails", 84961),
+        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.WKConnection", "Tests fail and time out out", 84959),
         SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.WKPageGetScaleFactorNotZero", "Test fails and times out", 88455),
+        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.ForceRepaint", "Test times out", 105532),
+        SkippedTest("TestWebKitAPI/TestWebKit2", "WebKit2.ReloadPageAfterCrash", "Test flakily times out", 110129),
     ]
 
     def __init__(self, options, tests=[]):
         self._options = options
-        self._programs_path = common.build_path("Programs")
+        self._build_type = "Debug" if self._options.debug else "Release"
+
+        self._programs_path = common.build_path_for_build_types((self._build_type,), "Programs")
         self._tests = self._get_tests(tests)
         self._skipped_tests = TestRunner.SKIPPED
         if not sys.stdout.isatty():
@@ -154,7 +161,7 @@
         self._test_env["WEBKIT_INSPECTOR_PATH"] = os.path.abspath(os.path.join(self._programs_path, 'resources', 'inspector'))
         self._test_env['GSETTINGS_BACKEND'] = 'memory'
         self._test_env["TEST_WEBKIT_API_WEBKIT2_RESOURCES_PATH"] = common.top_level_path("Tools", "TestWebKitAPI", "Tests", "WebKit2")
-        self._test_env["TEST_WEBKIT_API_WEBKIT2_INJECTED_BUNDLE_PATH"] = common.build_path("Libraries")
+        self._test_env["TEST_WEBKIT_API_WEBKIT2_INJECTED_BUNDLE_PATH"] = common.build_path_for_build_types((self._build_type,), "Libraries")
         self._test_env["WEBKIT_EXEC_PATH"] = self._programs_path
 
         try:
@@ -333,19 +340,21 @@
 
         if failed_tests:
             names = [test.replace(self._programs_path, '', 1) for test in failed_tests]
-            sys.stdout.write("Tests failed: %s\n" % ", ".join(names))
+            sys.stdout.write("Tests failed (%d): %s\n" % (len(names), ", ".join(names)))
             sys.stdout.flush()
 
         if timed_out_tests:
             names = [test.replace(self._programs_path, '', 1) for test in timed_out_tests]
-            sys.stdout.write("Tests that timed out: %s\n" % ", ".join(names))
+            sys.stdout.write("Tests that timed out (%d): %s\n" % (len(names), ", ".join(names)))
             sys.stdout.flush()
 
         if self._skipped_tests and self._options.skipped_action == 'skip':
-            sys.stdout.write("Tests skipped:\n%s\n" % "\n".join([str(skipped) for skipped in self._skipped_tests]))
+            sys.stdout.write("Tests skipped (%d):\n%s\n" %
+                             (len(self._skipped_tests),
+                              "\n".join([str(skipped) for skipped in self._skipped_tests])))
             sys.stdout.flush()
 
-        return len(failed_tests)
+        return len(failed_tests) + len(timed_out_tests)
 
 if __name__ == "__main__":
     if not jhbuildutils.enter_jhbuild_environment_if_available("gtk"):
diff --git a/Tools/Scripts/run-javascriptcore-tests b/Tools/Scripts/run-javascriptcore-tests
index 9cb4c48..8b79f25 100755
--- a/Tools/Scripts/run-javascriptcore-tests
+++ b/Tools/Scripts/run-javascriptcore-tests
@@ -140,11 +140,16 @@
 printf "Running: jsDriver.pl -e squirrelfish -s %s -f actual.html %s\n", jscPath($productDir), join(" ", @jsArgs);
 my @jsDriverCmd = ("perl", "jsDriver.pl", "-e", "squirrelfish", "-s", jscPath($productDir), "-f", "actual.html", @jsArgs);
 if (isGtk() || isEfl()) {
-    my $jhbuildPrefix = sourceDir() . "/Tools/";
-    $jhbuildPrefix .= isEfl() ? "efl" : "";
-    $jhbuildPrefix .= isGtk() ? "gtk" : "";
-    $jhbuildPrefix .= "/run-with-jhbuild";
-    unshift(@jsDriverCmd, $jhbuildPrefix);
+    my @jhbuildPrefix = sourceDir() . "/Tools/jhbuild/jhbuild-wrapper";
+
+    if (isEfl()) {
+        push(@jhbuildPrefix, '--efl');
+    } elsif (isGtk()) {
+        push(@jhbuildPrefix, '--gtk');
+    }
+    push(@jhbuildPrefix, 'run');
+
+    unshift(@jsDriverCmd, @jhbuildPrefix);
 }
 my $result = system(@jsDriverCmd);
 exit exitStatus($result)  if $result;
diff --git a/Tools/Scripts/run-launcher b/Tools/Scripts/run-launcher
index eca07f6..32e2b8e 100755
--- a/Tools/Scripts/run-launcher
+++ b/Tools/Scripts/run-launcher
@@ -69,18 +69,20 @@
         } else {
             unshift(@ARGV, catdir($launcherPath, "Programs", "GtkLauncher"));
         }
-        $launcherPath = catdir(sourceDir(), "Tools", "gtk", "run-with-jhbuild");
+        $launcherPath = catdir(sourceDir(), "Tools", "jhbuild", "jhbuild-wrapper");
+        unshift(@ARGV, ("--gtk", "run"));
     }
-    
+
     if (isEfl()) {
         if (isWK2()) {
             unshift(@ARGV, catdir($launcherPath, "bin", "MiniBrowser"));
         } else {
             unshift(@ARGV, catdir($launcherPath, "bin", "EWebLauncher"));
         }
-        $launcherPath = catdir(sourceDir(), "Tools", "efl", "run-with-jhbuild");
+        $launcherPath = catdir(sourceDir(), "Tools", "jhbuild", "jhbuild-wrapper");
+        unshift(@ARGV, ("--efl", "run"));
     }
-    
+
     if (isWx()) {
         if (isDarwin()) {
             $launcherPath = catdir($launcherPath, 'wxBrowser.app', 'Contents', 'MacOS', 'wxBrowser');
diff --git a/Tools/Scripts/run-sunspider b/Tools/Scripts/run-sunspider
index 1b60a75..4aec301 100755
--- a/Tools/Scripts/run-sunspider
+++ b/Tools/Scripts/run-sunspider
@@ -38,9 +38,6 @@
 
 my $root;
 my $testRuns = 10; # This number may be different from what sunspider defaults to (that's OK)
-my $runShark = 0;
-my $runShark20 = 0;
-my $runSharkCache = 0;
 my $runInstruments = 0;
 my $suite = "";
 my $ubench = 0;
@@ -59,9 +56,6 @@
   --root            Path to root tools build
   --runs            Number of times to run tests (default: $testRuns)
   --tests           Only run tests matching provided pattern
-  --shark           Sample with the Mac OS X "Shark" performance testing tool (implies --runs=1)
-  --shark20         Like --shark, but with a 20 microsecond sampling interval
-  --shark-cache     Like --shark, but performs a L2 cache-miss sample instead of time sample
   --instruments     Sample with the Mac OS X "Instruments" tool (Time Profile) (implies --runs=1)
   --suite           Select a specific benchmark suite. The default is sunspider-0.9.1
   --ubench          Use microbenchmark suite instead of regular tests. Same as --suite=ubench
@@ -73,9 +67,6 @@
 GetOptions('root=s' => sub { my ($x, $value) = @_; $root = $value; setConfigurationProductDir(Cwd::abs_path($root)); },
            'runs=i' => \$testRuns,
            'set-baseline' => \$setBaseline,
-           'shark' => \$runShark,
-           'shark20' => \$runShark20,
-           'shark-cache' => \$runSharkCache,
            'instruments' => \$runInstruments,
            'suite=s' => \$suite,
            'ubench' => \$ubench,
@@ -125,9 +116,6 @@
 my @args = ("--shell", jscPath($productDir), "--runs", $testRuns);
 # This code could be removed if we chose to pass extra args to sunspider instead of Xcode
 push @args, "--set-baseline" if $setBaseline;
-push @args, "--shark" if $runShark;
-push @args, "--shark20" if $runShark20;
-push @args, "--shark-cache" if $runSharkCache;
 push @args, "--instruments" if $runInstruments;
 push @args, "--suite=${suite}" if $suite;
 push @args, "--ubench" if $ubench;
diff --git a/Tools/Scripts/run-webkit-httpd b/Tools/Scripts/run-webkit-httpd
index 8fb1887..af4d4f3 100755
--- a/Tools/Scripts/run-webkit-httpd
+++ b/Tools/Scripts/run-webkit-httpd
@@ -89,7 +89,7 @@
     "-X",
     # Disable Keep-Alive support. Makes testing in multiple browsers easier (no need to wait
     # for another browser's connection to expire).
-    "-c", "KeepAlive 0"
+    "-c", "KeepAlive off"
 );
 
 my @defaultArgs = getDefaultConfigForTestDirectory($testDirectory);
diff --git a/Tools/Scripts/run-webkit-tests b/Tools/Scripts/run-webkit-tests
index 4bb8f39..fa6243f 100755
--- a/Tools/Scripts/run-webkit-tests
+++ b/Tools/Scripts/run-webkit-tests
@@ -65,20 +65,6 @@
     return 1;
 }
 
-sub platformIsReadyForParallelTesting()
-{
-    # NRWT is able to run the tests in parallel, ORWT was not.
-    # When we run the tests in parallel, tests which (incorrectly)
-    # interact with each other can start failing.
-    # To reduce the failure burden during the transition individual
-    # platforms can opt-in to parallel test execution by default.
-
-    # We believe all platforms are ready for default parallel testing except
-    # Qt, as Qt runs more than one build-slave per-server.
-    # Ossy has asked me to blacklist Qt for now.
-    return !isQt();
-}
-
 my $script = "perl";
 my $harnessName = "old-run-webkit-tests";
 
@@ -86,12 +72,6 @@
     $script = "python";
     $harnessName = "new-run-webkit-tests";
 
-    if (!grep(/--child-processes/, @ARGV) and !platformIsReadyForParallelTesting()) {
-        push(@ARGV, "--child-processes=1");
-        print "Running new-run-webkit-tests with one child process.\n";
-        print "For more parallelism, run new-run-webkit-tests directly.\n";
-    }
-
     if (runningOnBuildBot()) {
         push(@ARGV, "--debug-rwt-logging");
     }
diff --git a/Tools/Scripts/sampstat b/Tools/Scripts/sampstat
new file mode 100755
index 0000000..72ba2b7
--- /dev/null
+++ b/Tools/Scripts/sampstat
@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+
+#  Copyright (C) 2007, 2012 Apple Inc.  All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+#  1. Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#  2. Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+# 
+#  THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+#  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+#  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+#  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+
+import math
+import sys
+import re
+import fileinput
+from optparse import OptionParser
+
+usage = "usage: %prog [options] [FILES]\n  Compute the mean and 95% confidence interval of a sample set.\n  Standard input or files must contain two or more decimal numbers, one per line."
+parser = OptionParser(usage=usage)
+parser.add_option("-u", "--unit", dest="unit", default="",
+                  help="assume values are in units of UNIT", metavar="UNIT")
+parser.add_option("-v", "--verbose",
+                  action="store_true", dest="verbose", default=False,
+                  help="print all values (with units)")
+(options, files) = parser.parse_args()
+
+def sum(items):
+    return reduce(lambda x,y: x+y, items)
+
+def arithmeticMean(items):
+    return sum(items) / len(items)
+
+def standardDeviation(mean, items):
+    deltaSquares = [(item - mean) ** 2 for item in items]
+    return math.sqrt(sum(deltaSquares) / (len(items) - 1))
+
+def standardError(stdDev, items):
+    return stdDev / math.sqrt(len(items))
+
+# t-distribution for 2-sided 95% confidence intervals
+tDistribution = [float('NaN'), float('NaN'), 12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31, 2.26, 2.23, 2.20, 2.18, 2.16, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.09, 2.08, 2.07, 2.07, 2.06, 2.06, 2.06, 2.05, 2.05, 2.05, 2.04, 2.04, 2.04, 2.03, 2.03, 2.03, 2.03, 2.03, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.96]
+tMax = len(tDistribution)
+tLimit = 1.96
+
+def tDist(n):
+    if n > tMax:
+        return tLimit
+    return tDistribution[n]
+
+def twoSidedConfidenceInterval(items):
+    mean = arithmeticMean(items)
+    stdDev = standardDeviation(mean, items)
+    stdErr = standardError(stdDev, items)
+    return tDist(len(items)) * stdErr
+
+results = []
+
+decimalNumberPattern = re.compile(r"\d+\.?\d*")
+for line in fileinput.input(files):
+    match = re.search(decimalNumberPattern, line)
+    if match:
+        results.append(float(match.group(0)))
+
+if len(results) == 0:
+    parser.print_help()
+    quit()
+
+
+mean = arithmeticMean(results)
+confidenceInterval = twoSidedConfidenceInterval(results)
+confidencePercent = 100 * confidenceInterval / mean
+
+if options.verbose:
+    length = 7
+    for item in results:
+        line = "      %.2f %s" % (item, options.unit)
+        print line
+        length = len(line) if len(line) > length else length
+
+    print "-" * length
+
+prefix = "Mean: " if options.verbose else ""
+print "%s%.2f %s +/- %.2f %s (%.1f%%)" % (prefix, mean, options.unit, confidenceInterval, options.unit, confidencePercent)
+
diff --git a/Tools/Scripts/test-webkit-scripts b/Tools/Scripts/test-webkit-scripts
index 781e8ce..baba059 100755
--- a/Tools/Scripts/test-webkit-scripts
+++ b/Tools/Scripts/test-webkit-scripts
@@ -28,7 +28,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-"""Run unit tests of WebKit's Perl and Python scripts."""
+"""Run unit tests of WebKit's Perl, Python, and Ruby scripts."""
 
 # The docstring above is passed as the "description" to the OptionParser
 # used in this script's __main__ block.
@@ -72,11 +72,12 @@
         self.run_test_script('Perl scripts', self.script_path('test-webkitperl'))
         self.run_test_script('Python scripts', self.script_path('test-webkitpy'),
                              ['--all'] if options.all else None)
+        self.run_test_script('Ruby scripts', self.script_path('test-webkitruby'))
 
         # FIXME: Display a cumulative indication of success or failure.
         #        In addition, call sys.exit() with 0 or 1 depending on that
         #        cumulative success or failure.
-        print('Note: Perl and Python results appear separately above.')
+        print('Note: Perl, Python, and Ruby results appear separately above.')
 
 
 if __name__ == '__main__':
diff --git a/Tools/Scripts/test-webkitruby b/Tools/Scripts/test-webkitruby
new file mode 100755
index 0000000..cd04a0a
--- /dev/null
+++ b/Tools/Scripts/test-webkitruby
@@ -0,0 +1,34 @@
+#!/usr/bin/env ruby
+
+# Copyright (C) 2012 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+$exit_code = 0;
+
+Dir.chdir File.dirname(__FILE__)
+Dir.glob("./webkitruby/*/*.rb").each do |test|
+  puts %x{ '#{test}' }
+  $exit_code = 1 if $?.exitstatus != 0
+end
+
+exit $exit_code
diff --git a/Tools/Scripts/update-webkit b/Tools/Scripts/update-webkit
index 6ba8044..d0d1afe 100755
--- a/Tools/Scripts/update-webkit
+++ b/Tools/Scripts/update-webkit
@@ -47,7 +47,7 @@
 my $showHelp;
 my $useGYP = 0;
 my $useMake = 0;
-my $useNinja = 0;
+my $useNinja = -1; # -1: Let update-webkit-chromium pick the default.
 
 determineIsChromium();
 determineIsChromiumAndroid();
@@ -61,7 +61,7 @@
     'q|quiet' => \$quiet,
     'gyp' => \$useGYP,
     'make' => \$useMake,
-    'ninja' => \$useNinja,
+    'ninja!' => \$useNinja,
 ); 
 
 if (!$getOptionsResult || $showHelp) {
@@ -69,7 +69,7 @@
 Usage: @{[ basename($0) ]} [options]
   --chromium          also update dependencies of the chromium port
   --make              generate the Makefile-based build system (Chromium only)
-  --ninja             generate the ninja-based build system (Chromium only)
+  --[no-]ninja        generate the ninja-based build system (Chromium only)
   --chromium-android  also update dependencies of the chromium port for Android
   -h|--help           show the help message
   -q|--quiet          pass -q to svn update for quiet updates
@@ -82,9 +82,6 @@
 if ($useMake) {
     $ENV{"GYP_GENERATORS"} = "make";
 }
-if ($useNinja) {
-    $ENV{"GYP_GENERATORS"} = "ninja";
-}
 
 my @svnOptions = ();
 push @svnOptions, '-q' if $quiet;
@@ -105,6 +102,8 @@
     my @chromiumUpdateArgs = ("perl", "Tools/Scripts/update-webkit-chromium");
     push @chromiumUpdateArgs, "--chromium-android" if isChromiumAndroid();
     push @chromiumUpdateArgs, "--force" if forceChromiumUpdate();
+    push @chromiumUpdateArgs, "--ninja" if $useNinja == 1;
+    push @chromiumUpdateArgs, "--no-ninja" if $useNinja == 0;
     system(@chromiumUpdateArgs) == 0 or die $!;
 } elsif (isAppleWinWebKit()) {
     system("perl", "Tools/Scripts/update-webkit-auxiliary-libs") == 0 or die;
diff --git a/Tools/Scripts/update-webkit-chromium b/Tools/Scripts/update-webkit-chromium
index b21d09e..f98473f 100755
--- a/Tools/Scripts/update-webkit-chromium
+++ b/Tools/Scripts/update-webkit-chromium
@@ -66,10 +66,17 @@
 }
 
 my $force = 0;
+my $useNinja = 1;
+
 GetOptions(
   'force' => \$force,
+  'ninja!' => \$useNinja,
 );
 
+if ($useNinja) {
+    $ENV{"GYP_GENERATORS"} = "ninja";
+}
+
 # Execute gclient sync.
 print "Updating chromium port dependencies using gclient...\n";
 my @gclientArgs = ($gclientPath, "sync");
diff --git a/Tools/Scripts/webkit-tools-completion.sh b/Tools/Scripts/webkit-tools-completion.sh
index d83a5a6..a57a1ab 100755
--- a/Tools/Scripts/webkit-tools-completion.sh
+++ b/Tools/Scripts/webkit-tools-completion.sh
@@ -111,4 +111,4 @@
 complete -o default -W "--continue --fix-merged --help --no-continue --no-warnings --warnings -c -f -h -w" resolve-ChangeLogs
 complete -o default -W "--bug --diff --git-commit --git-index --git-reviewer --help --no-update --no-write --open --update --write -d -h -o" prepare-ChangeLog
 complete -W "--clean --debug --help -h" build-webkit
-complete -o default -W "--add-platform-exceptions --complex-text --configuration --guard-malloc --help --http --ignore-tests --launch-safari --leaks --merge-leak-depth --new-test-results --no-http --no-launch-safari --no-new-test-results --no-sample-on-timeout --no-strip-editing-callbacks --pixel-tests --platform --port --quiet --random --reset-results --results-directory --reverse --root --sample-on-timeout --singly --skipped --slowest --strict --strip-editing-callbacks --threaded --timeout --tolerance --use-remote-links-to-tests --valgrind --verbose -1 -c -g -h -i -l -m -o -p -q -t -v" run-webkit-tests
+complete -o default -W "--add-platform-exceptions --complex-text --configuration --guard-malloc --help --http --ignore-tests --launch-safari --leaks --merge-leak-depth --new-test-results --no-http --no-show-results --no-new-test-results --no-sample-on-timeout --no-strip-editing-callbacks --pixel-tests --platform --port --quiet --random --reset-results --results-directory --reverse --root --sample-on-timeout --singly --skipped --slowest --strict --strip-editing-callbacks --threaded --timeout --tolerance --use-remote-links-to-tests --valgrind --verbose -1 -c -g -h -i -l -m -o -p -q -t -v" run-webkit-tests
diff --git a/Tools/Scripts/webkitdirs.pm b/Tools/Scripts/webkitdirs.pm
index e8c6cab..bcd48e7 100755
--- a/Tools/Scripts/webkitdirs.pm
+++ b/Tools/Scripts/webkitdirs.pm
@@ -80,6 +80,7 @@
 my $baseProductDir;
 my @baseProductDirOption;
 my $configuration;
+my $xcodeSDK;
 my $configurationForVisualStudio;
 my $configurationProductDir;
 my $sourceDir;
@@ -186,7 +187,7 @@
     determineSourceDir();
 
     my $setSharedPrecompsDir;
-    $baseProductDir = $ENV{"WEBKITOUTPUTDIR"};
+    $baseProductDir = $ENV{"WEBKITOUTPUTDIR"}; # FIXME: Switch to WEBKIT_OUTPUTDIR as part of https://bugs.webkit.org/show_bug.cgi?id=109472
 
     if (!defined($baseProductDir) and isAppleMacWebKit()) {
         # Silently remove ~/Library/Preferences/xcodebuild.plist which can
@@ -222,7 +223,7 @@
 
         undef $baseProductDir unless $baseProductDir =~ /^\//;
     } elsif (isChromium()) {
-        if (isLinux() || isChromiumAndroid() || isChromiumMacMake()) {
+        if (isLinux() || isChromiumAndroid() || isChromiumMacMake() || isChromiumNinja()) {
             $baseProductDir = "$sourceDir/out";
         } elsif (isDarwin()) {
             $baseProductDir = "$sourceDir/Source/WebKit/chromium/xcodebuild";
@@ -259,6 +260,7 @@
         my $dosBuildPath = `cygpath --windows \"$baseProductDir\"`;
         chomp $dosBuildPath;
         $ENV{"WEBKITOUTPUTDIR"} = $dosBuildPath;
+        $ENV{"WEBKIT_OUTPUTDIR"} = $dosBuildPath;
         my $unixBuildPath = `cygpath --unix \"$baseProductDir\"`;
         chomp $unixBuildPath;
         $baseProductDir = $unixBuildPath;
@@ -301,6 +303,7 @@
     $architecture = "";
 
     determineBaseProductDir();
+    determineXcodeSDK();
 
     if (isGtk()) {
         determineConfigurationProductDir();
@@ -317,9 +320,15 @@
         if ($architecture) {
             chomp $architecture;
         } else {
-            my $supports64Bit = `sysctl -n hw.optional.x86_64`;
-            chomp $supports64Bit;
-            $architecture = 'x86_64' if $supports64Bit;
+            if (not defined $xcodeSDK or $xcodeSDK =~ /^(\/$|macosx)/) {
+                my $supports64Bit = `sysctl -n hw.optional.x86_64`;
+                chomp $supports64Bit;
+                $architecture = 'x86_64' if $supports64Bit;
+            } elsif ($xcodeSDK =~ /^iphonesimulator/) {
+                $architecture = 'i386';
+            } elsif ($xcodeSDK =~ /^iphoneos/) {
+                $architecture = 'armv7';
+            }
         }
     } elsif (isEfl()) {
         my $host_processor = "";
@@ -396,6 +405,30 @@
     return @args;
 }
 
+sub determineXcodeSDK
+{
+    return if defined $xcodeSDK;
+    for (my $i = 0; $i <= $#ARGV; $i++) {
+        my $opt = $ARGV[$i];
+        if ($opt =~ /^--sdk$/i) {
+            splice(@ARGV, $i, 1);
+            $xcodeSDK = splice(@ARGV, $i, 1);
+        } elsif ($opt =~ /^--device$/i) {
+            splice(@ARGV, $i, 1);
+            $xcodeSDK = 'iphoneos.internal';
+        } elsif ($opt =~ /^--sim(ulator)?/i) {
+            splice(@ARGV, $i, 1);
+            $xcodeSDK = 'iphonesimulator';
+        }
+    }
+}
+
+sub xcodeSDK
+{
+    determineXcodeSDK();
+    return $xcodeSDK;
+}
+
 sub determineConfigurationForVisualStudio
 {
     return if defined $configurationForVisualStudio;
@@ -520,7 +553,12 @@
     determineBaseProductDir();
     determineConfiguration();
     determineArchitecture();
-    return (@baseProductDirOption, "-configuration", $configuration, "ARCHS=$architecture", argumentsForXcode());
+    determineXcodeSDK();
+
+    my @sdkOption = ($xcodeSDK ? "SDKROOT=$xcodeSDK" : ());
+    my @architectureOption = ($architecture ? "ARCHS=$architecture" : ());
+
+    return (@baseProductDirOption, "-configuration", $configuration, @architectureOption, @sdkOption, argumentsForXcode());
 }
 
 sub XcodeOptionString
@@ -553,13 +591,13 @@
 
     for my $i (0 .. $#ARGV) {
         my $opt = $ARGV[$i];
-        if ($opt =~ /^--debug$/i || $opt =~ /^--devel/i) {
+        if ($opt =~ /^--debug$/i) {
             splice(@ARGV, $i, 1);
             $passedConfiguration = "Debug";
             $passedConfiguration .= "_Cairo_CFLite" if (isWinCairo() && isCygwin());
             return;
         }
-        if ($opt =~ /^--release$/i || $opt =~ /^--deploy/i) {
+        if ($opt =~ /^--release$/i) {
             splice(@ARGV, $i, 1);
             $passedConfiguration = "Release";
             $passedConfiguration .= "_Cairo_CFLite" if (isWinCairo() && isCygwin());
@@ -723,7 +761,11 @@
     }
     if (isQt()) {
         my $isSearchingForWebCore = $libraryName =~ "WebCore";
-        $libraryName = "QtWebKitWidgets";
+        if (isDarwin()) {
+            $libraryName = "QtWebKitWidgets";
+        } else {
+            $libraryName = "Qt5WebKitWidgets";
+        }
         my $result;
         if (isDarwin() and -d "$configurationProductDir/lib/$libraryName.framework") {
             $result = "$configurationProductDir/lib/$libraryName.framework/$libraryName";
@@ -774,6 +816,9 @@
         return "NotFound";
     }
     if (isEfl()) {
+        if (isWK2()) {
+            return "$configurationProductDir/lib/libewebkit2.so";
+        }
         return "$configurationProductDir/lib/libewebkit.so";
     }
     if (isWinCE()) {
@@ -1005,8 +1050,11 @@
     push @includeSystemDirectories, File::Spec->catdir($stageInc, "grskia");
     push @includeSystemDirectories, File::Spec->catdir($stageInc, "harfbuzz");
     push @includeSystemDirectories, File::Spec->catdir($stageInc, "imf");
+    # We only use jpeg-turbo for device build
+    push @includeSystemDirectories, File::Spec->catdir($stageInc, "jpeg-turbo") if $arch=~/arm/;
     push @includeSystemDirectories, $stageInc;
     push @includeSystemDirectories, File::Spec->catdir($stageInc, "browser", "platform");
+    push @includeSystemDirectories, File::Spec->catdir($stageInc, "browser", "platform", "graphics");
     push @includeSystemDirectories, File::Spec->catdir($stageInc, "browser", "qsk");
     push @includeSystemDirectories, File::Spec->catdir($stageInc, "ots");
 
@@ -1191,7 +1239,11 @@
 {
     return if defined($isChromiumNinja);
 
-    my $config = configuration();
+    # This function can be called from baseProductDir(), which in turn is
+    # called by configuration(). So calling configuration() here leads to
+    # infinite recursion. Gyp writes both Debug and Release at the same time
+    # by default, so just check the timestamp on the Release build.ninja file.
+    my $config = "Release";
 
     my $hasUpToDateNinjabuild = 0;
     if (-e "out/$config/build.ninja") {
@@ -1207,7 +1259,12 @@
           $statMake = stat('Makefile.chromium')->mtime;
         }
 
-        $hasUpToDateNinjabuild = $statNinja > $statXcode && $statNinja > $statMake;
+        my $statVisualStudio = 0;
+        if (-e 'Source/WebKit/chromium/webkit.vcxproj') {
+          $statVisualStudio = stat('Source/WebKit/chromium/webkit.vcxproj')->mtime;
+        }
+
+        $hasUpToDateNinjabuild = $statNinja > $statXcode && $statNinja > $statMake && $statNinja > $statVisualStudio;
     }
     $isChromiumNinja = $hasUpToDateNinjabuild;
 }
@@ -1302,7 +1359,7 @@
 
 sub isARM()
 {
-    return $Config{archname} =~ /^arm-/;
+    return $Config{archname} =~ /^arm[v\-]/;
 }
 
 sub isCrossCompilation()
@@ -1514,7 +1571,7 @@
     } elsif (isAppleWebKit()) {
         return "Safari";
     } elsif (isEfl()) {
-        return "EWebLauncher";
+        return "EWebLauncher/MiniBrowser";
     } elsif (isWinCE()) {
         return "WinCELauncher";
     }
@@ -1587,6 +1644,11 @@
     return $windowsSourceDir;
 }
 
+sub windowsSourceSourceDir()
+{
+    return windowsSourceDir() . "\\Source";
+}
+
 sub windowsLibrariesDir()
 {
     return windowsSourceDir() . "\\WebKitLibraries\\win";
@@ -1617,12 +1679,15 @@
         
         # Those environment variables must be set to be able to build inside Visual Studio.
         $variablesToSet{WEBKITLIBRARIESDIR} = windowsLibrariesDir() unless $ENV{WEBKITLIBRARIESDIR};
+        $variablesToSet{WEBKIT_LIBRARIES} = windowsLibrariesDir() unless $ENV{WEBKIT_LIBRARIES};
         $variablesToSet{WEBKITOUTPUTDIR} = windowsOutputDir() unless $ENV{WEBKITOUTPUTDIR};
+        $variablesToSet{WEBKIT_OUTPUTDIR} = windowsOutputDir() unless $ENV{WEBKIT_OUTPUTDIR};
+        $variablesToSet{WEBKIT_SOURCE} = windowsSourceSourceDir() unless $ENV{WEBKIT_SOURCE};
 
         foreach my $variable (keys %variablesToSet) {
             print "Setting the Environment Variable '" . $variable . "' to '" . $variablesToSet{$variable} . "'\n\n";
             system qw(regtool -s set), '\\HKEY_CURRENT_USER\\Environment\\' . $variable, $variablesToSet{$variable};
-            $restartNeeded ||= $variable eq "WEBKITLIBRARIESDIR" || $variable eq "WEBKITOUTPUTDIR";
+            $restartNeeded ||= $variable eq "WEBKITLIBRARIESDIR" || $variable eq "WEBKITOUTPUTDIR" || $variable eq "WEBKIT_LIBRARIES" || $variable eq "WEBKIT_OUTPUTDIR" || $variable eq "WEBKIT_SOURCE";
         }
 
         if ($restartNeeded) {
@@ -1630,14 +1695,34 @@
         }
     } else {
         if (!$ENV{'WEBKITLIBRARIESDIR'}) {
+            # VS2005 version.  This will be removed as part of https://bugs.webkit.org/show_bug.cgi?id=109472.
             print "Warning: You must set the 'WebKitLibrariesDir' environment variable\n";
-            print "         to be able build WebKit from within Visual Studio.\n";
+            print "         to be able build WebKit from within Visual Studio 2005.\n";
             print "         Make sure that 'WebKitLibrariesDir' points to the\n";
             print "         'WebKitLibraries/win' directory, not the 'WebKitLibraries/' directory.\n\n";
         }
+        if (!$ENV{'WEBKIT_LIBRARIES'}) {
+            # VS2010 (and newer) version. This will replace the VS2005 version as part of
+            # https://bugs.webkit.org/show_bug.cgi?id=109472. 
+            print "Warning: You must set the 'WebKit_Libraries' environment variable\n";
+            print "         to be able build WebKit from within Visual Studio 2010 and newer.\n";
+            print "         Make sure that 'WebKit_Libraries' points to the\n";
+            print "         'WebKitLibraries/win' directory, not the 'WebKitLibraries/' directory.\n\n";
+        }
         if (!$ENV{'WEBKITOUTPUTDIR'}) {
+            # VS2005 version.  This will be removed as part of https://bugs.webkit.org/show_bug.cgi?id=109472.
             print "Warning: You must set the 'WebKitOutputDir' environment variable\n";
-            print "         to be able build WebKit from within Visual Studio.\n\n";
+            print "         to be able build WebKit from within Visual Studio 2005.\n\n";
+        }
+        if (!$ENV{'WEBKIT_OUTPUTDIR'}) {
+            # VS2010 (and newer) version. This will replace the VS2005 version as part of
+            # https://bugs.webkit.org/show_bug.cgi?id=109472. 
+            print "Warning: You must set the 'WebKit_OutputDir' environment variable\n";
+            print "         to be able build WebKit from within Visual Studio 2010 and newer.\n\n";
+        }
+        if (!$ENV{'WEBKIT_SOURCE'}) {
+            print "Warning: You must set the 'WebKit_Source' environment variable\n";
+            print "         to be able build WebKit from within Visual Studio 2010 and newer.\n\n";
         }
     }
 }
@@ -1689,10 +1774,16 @@
         $ENV{'WEBKITLIBRARIESDIR'} = File::Spec->catdir($sourceDir, "WebKitLibraries", "win");
         chomp($ENV{WEBKITLIBRARIESDIR} = `cygpath -wa '$ENV{WEBKITLIBRARIESDIR}'`) if isCygwin();
     }
+    unless ($ENV{WEBKIT_LIBRARIES}) {
+        $ENV{'WEBKIT_LIBRARIES'} = File::Spec->catdir($sourceDir, "WebKitLibraries", "win");
+        chomp($ENV{WEBKIT_LIBRARIES} = `cygpath -wa '$ENV{WEBKIT_LIBRARIES}'`) if isCygwin();
+    }
 
     print "Building results into: ", baseProductDir(), "\n";
     print "WEBKITOUTPUTDIR is set to: ", $ENV{"WEBKITOUTPUTDIR"}, "\n";
+    print "WEBKIT_OUTPUTDIR is set to: ", $ENV{"WEBKIT_OUTPUTDIR"}, "\n";
     print "WEBKITLIBRARIESDIR is set to: ", $ENV{"WEBKITLIBRARIESDIR"}, "\n";
+    print "WEBKIT_LIBRARIES is set to: ", $ENV{"WEBKIT_LIBRARIES"}, "\n";
 }
 
 sub dieIfWindowsPlatformSDKNotInstalled
@@ -1901,9 +1992,10 @@
 
 sub runAutogenForAutotoolsProjectIfNecessary($@)
 {
-    my ($dir, $prefix, $sourceDir, $project, @buildArgs) = @_;
+    my ($dir, $prefix, $sourceDir, $project, $joinedOverridableFeatures, @buildArgs) = @_;
 
-    my $argumentsFile = "previous-autogen-arguments.txt";
+    my $joinedBuildArgs = join(" ", @buildArgs);
+
     if (-e "GNUmakefile") {
         # Just assume that build-jsc will never be used to reconfigure JSC. Later
         # we can go back and make this more complicated if the demand is there.
@@ -1911,8 +2003,9 @@
             return;
         }
 
-        # We only run autogen.sh again if the arguments passed have changed.
-        if (!mustReRunAutogen($sourceDir, $argumentsFile, @buildArgs)) {
+        # Run autogen.sh again if either the features overrided by build-webkit or build arguments have changed.
+        if (!mustReRunAutogen($sourceDir, "WebKitFeatureOverrides.txt", $joinedOverridableFeatures)
+            && !mustReRunAutogen($sourceDir, "previous-autogen-arguments.txt", $joinedBuildArgs)) {
             return;
         }
     }
@@ -1923,8 +2016,12 @@
     # Only for WebKit, write the autogen.sh arguments to a file so that we can detect
     # when they change and automatically re-run it.
     if ($project eq 'WebKit') {
-        open(AUTOTOOLS_ARGUMENTS, ">$argumentsFile");
-        print AUTOTOOLS_ARGUMENTS join(" ", @buildArgs);
+        open(OVERRIDABLE_FEATURES, ">WebKitFeatureOverrides.txt");
+        print OVERRIDABLE_FEATURES $joinedOverridableFeatures;
+        close(OVERRIDABLE_FEATURES);
+
+        open(AUTOTOOLS_ARGUMENTS, ">previous-autogen-arguments.txt");
+        print AUTOTOOLS_ARGUMENTS $joinedBuildArgs;
         close(AUTOTOOLS_ARGUMENTS);
     }
 
@@ -1942,10 +2039,7 @@
 
     # Prefix the command with jhbuild run.
     unshift(@buildArgs, "$relSourceDir/autogen.sh");
-    my $jhbuildWrapperPrefix = jhbuildWrapperPrefixIfNeeded();
-    if ($jhbuildWrapperPrefix) {
-        unshift(@buildArgs, $jhbuildWrapperPrefix);
-    }
+    unshift(@buildArgs, jhbuildWrapperPrefixIfNeeded());
     if (system(@buildArgs) ne 0) {
         die "Calling autogen.sh failed!\n";
     }
@@ -1958,24 +2052,24 @@
 
 sub mustReRunAutogen($@)
 {
-    my ($sourceDir, $filename, @currentArguments) = @_;
+    my ($sourceDir, $filename, $currentContents) = @_;
 
     if (! -e $filename) {
         return 1;
     }
 
-    open(AUTOTOOLS_ARGUMENTS, $filename);
-    chomp(my $previousArguments = <AUTOTOOLS_ARGUMENTS>);
-    close(AUTOTOOLS_ARGUMENTS);
+    open(CONTENTS_FILE, $filename);
+    chomp(my $previousContents = <CONTENTS_FILE>);
+    close(CONTENTS_FILE);
 
     # We only care about the WebKit2 argument when we are building WebKit itself.
     # build-jsc never passes --enable-webkit2, so if we didn't do this, autogen.sh
     # would run for every single build on the bots, since it runs both build-webkit
     # and build-jsc.
-    my $joinedCurrentArguments = join(" ", @currentArguments);
-    if ($previousArguments ne $joinedCurrentArguments) {
-        print "Previous autogen arguments were: $previousArguments\n\n";
-        print "New autogen arguments are: $joinedCurrentArguments\n";
+    if ($previousContents ne $currentContents) {
+        print "Contents for file $filename have changed.\n";
+        print "Previous contents were: $previousContents\n\n";
+        print "New contents are: $currentContents\n";
         return 1;
     }
 
@@ -1984,12 +2078,11 @@
 
 sub buildAutotoolsProject($@)
 {
-    my ($project, $clean, @buildParams) = @_;
+    my ($project, $clean, $prefix, $makeArgs, $noWebKit1, $noWebKit2, @features) = @_;
 
     my $make = 'make';
     my $dir = productDir();
     my $config = passedConfiguration() || configuration();
-    my $prefix;
 
     # Use rm to clean the build directory since distclean may miss files
     if ($clean && -d $dir) {
@@ -2005,19 +2098,39 @@
         return 0;
     }
 
-    my @buildArgs = ();
-    my $makeArgs = $ENV{"WebKitMakeArguments"} || "";
-    for my $i (0 .. $#buildParams) {
-        my $opt = $buildParams[$i];
-        if ($opt =~ /^--makeargs=(.*)/i ) {
-            $makeArgs = $makeArgs . " " . $1;
-        } elsif ($opt =~ /^--prefix=(.*)/i ) {
-            $prefix = $1;
+    my @buildArgs = @ARGV;
+    if ($noWebKit1) {
+        unshift(@buildArgs, "--disable-webkit1");
+    }
+    if ($noWebKit2) {
+        unshift(@buildArgs, "--disable-webkit2");
+    }
+
+    # Configurable features listed here should be kept in sync with the
+    # features for which there exists a configuration option in configure.ac.
+    my %configurableFeatures = (
+        "gamepad" => 1,
+        "geolocation" => 1,
+        "media-stream" => 1,
+        "svg" => 1,
+        "svg-fonts" => 1,
+        "video" => 1,
+        "webgl" => 1,
+        "web-audio" => 1,
+        "xslt" => 1,
+    );
+    my @overridableFeatures = ();
+    foreach (@features) {
+        if ($configurableFeatures{$_->{option}}) {
+            push @buildArgs, autotoolsFlag(${$_->{value}}, $_->{option});;
         } else {
-            push @buildArgs, $opt;
+            push @overridableFeatures, $_->{define} . "=" . (${$_->{value}} ? "1" : "0");
         }
     }
 
+    $makeArgs = $makeArgs || "";
+    $makeArgs = $makeArgs . " " . $ENV{"WebKitMakeArguments"} if $ENV{"WebKitMakeArguments"};
+
     # Automatically determine the number of CPUs for make only
     # if make arguments haven't already been specified.
     if ($makeArgs eq "") {
@@ -2042,9 +2155,6 @@
         push @buildArgs, "--disable-debug";
     }
 
-    # Enable unstable features when building through build-webkit.
-    push @buildArgs, "--enable-unstable-features";
-
     if (checkForArgumentAndRemoveFromArrayRef("--update-gtk", \@buildArgs)) {
         # Force autogen to run, to catch the possibly updated libraries.
         system("rm -f previous-autogen-arguments.txt");
@@ -2055,22 +2165,21 @@
     # If GNUmakefile exists, don't run autogen.sh unless its arguments
     # have changed. The makefile should be smart enough to track autotools
     # dependencies and re-run autogen.sh when build files change.
-    runAutogenForAutotoolsProjectIfNecessary($dir, $prefix, $sourceDir, $project, @buildArgs);
+    my $joinedOverridableFeatures = join(" ", @overridableFeatures);
+    runAutogenForAutotoolsProjectIfNecessary($dir, $prefix, $sourceDir, $project, $joinedOverridableFeatures, @buildArgs);
 
-    my $runWithJhbuild = jhbuildWrapperPrefixIfNeeded();
+    my $runWithJhbuild = join(" ", jhbuildWrapperPrefixIfNeeded());
     if (system("$runWithJhbuild $make $makeArgs") ne 0) {
         die "\nFailed to build WebKit using '$make'!\n";
     }
 
     chdir ".." or die;
 
-    if ($project eq 'WebKit' && !isCrossCompilation()) {
+    if ($project eq 'WebKit' && !isCrossCompilation() && !($noWebKit1 && $noWebKit2)) {
         my @docGenerationOptions = ("$sourceDir/Tools/gtk/generate-gtkdoc", "--skip-html");
         push(@docGenerationOptions, productDir());
 
-        if ($runWithJhbuild) {
-            unshift(@docGenerationOptions, $runWithJhbuild);
-        }
+        unshift(@docGenerationOptions, jhbuildWrapperPrefixIfNeeded());
 
         if (system(@docGenerationOptions)) {
             die "\n gtkdoc did not build without warnings\n";
@@ -2083,14 +2192,18 @@
 sub jhbuildWrapperPrefixIfNeeded()
 {
     if (-e getJhbuildPath()) {
+        my @prefix = (File::Spec->catfile(sourceDir(), "Tools", "jhbuild", "jhbuild-wrapper"));
         if (isEfl()) {
-            return File::Spec->catfile(sourceDir(), "Tools", "efl", "run-with-jhbuild");
+            push(@prefix, "--efl");
         } elsif (isGtk()) {
-            return File::Spec->catfile(sourceDir(), "Tools", "gtk", "run-with-jhbuild");
+            push(@prefix, "--gtk");
         }
+        push(@prefix, "run");
+
+        return @prefix;
     }
 
-    return "";
+    return ();
 }
 
 sub removeCMakeCache()
@@ -2117,6 +2230,8 @@
     } elsif ($config =~ /debug/i) {
         push @args, "-DCMAKE_BUILD_TYPE=Debug";
     }
+    # Don't warn variables which aren't used by cmake ports.
+    push @args, "--no-warn-unused-cli";
     push @args, @cmakeArgs if @cmakeArgs;
     push @args, $additionalCMakeArgs if $additionalCMakeArgs;
 
@@ -2131,7 +2246,7 @@
 
     # We call system("cmake @args") instead of system("cmake", @args) so that @args is
     # parsed for shell metacharacters.
-    my $wrapper = jhbuildWrapperPrefixIfNeeded() . " ";
+    my $wrapper = join(" ", jhbuildWrapperPrefixIfNeeded()) . " ";
     my $returnCode = system($wrapper . "cmake @args");
 
     chdir($originalWorkingDirectory);
@@ -2151,7 +2266,7 @@
 
     # We call system("cmake @args") instead of system("cmake", @args) so that @args is
     # parsed for shell metacharacters. In particular, $makeArgs may contain such metacharacters.
-    my $wrapper = jhbuildWrapperPrefixIfNeeded() . " ";
+    my $wrapper = join(" ", jhbuildWrapperPrefixIfNeeded()) . " ";
     return system($wrapper . "cmake @args");
 }
 
@@ -2190,7 +2305,7 @@
 sub cmakeBasedPortArguments()
 {
     return blackberryCMakeArguments() if isBlackBerry();
-    return ('-DCMAKE_WINCE_SDK="STANDARDSDK_500 (ARMV4I)"') if isWinCE();
+    return ('-G "Visual Studio 8 2005 STANDARDSDK_500 (ARMV4I)"') if isWinCE();
     return ();
 }
 
@@ -2285,14 +2400,14 @@
 
     my $buildHint = "";
 
-    my $pathToQmakeCache = File::Spec->catfile($dir, ".qmake.cache");
-    if (-e $pathToQmakeCache && open(QMAKECACHE, $pathToQmakeCache)) {
-        while (<QMAKECACHE>) {
+    my $pathToBuiltRevisions = File::Spec->catfile($dir, ".builtRevisions.cache");
+    if (-e $pathToBuiltRevisions && open(BUILTREVISIONS, $pathToBuiltRevisions)) {
+        while (<BUILTREVISIONS>) {
             if ($_ =~ m/^SVN_REVISION\s=\s(\d+)$/) {
                 $previousSvnRevision = $1;
             }
         }
-        close(QMAKECACHE);
+        close(BUILTREVISIONS);
     }
 
     my $result = 0;
@@ -2324,6 +2439,11 @@
     my $maybeNeedsCleanBuild = 0;
     my $needsIncrementalBuild = 0;
 
+    # Full incremental build (run qmake) needed on buildbots and EWS bots always.
+    if (grep(/CONFIG\+=buildbot/,@buildParams)) {
+        $needsIncrementalBuild = 1;
+    }
+
     if ($svnRevision ne $previousSvnRevision) {
         print "Last built revision was " . $previousSvnRevision .
             ", now at revision $svnRevision. Full incremental build needed.\n";
@@ -2360,9 +2480,9 @@
 
     if ($result eq 0) {
         # Now that the build completed successfully we can save the SVN revision
-        open(QMAKECACHE, ">>$pathToQmakeCache");
-        print QMAKECACHE "SVN_REVISION = $svnRevision\n";
-        close(QMAKECACHE);
+        open(BUILTREVISIONS, ">>$pathToBuiltRevisions");
+        print BUILTREVISIONS "SVN_REVISION = $svnRevision\n";
+        close(BUILTREVISIONS);
     } elsif (!$command =~ /incremental/ && exitStatus($result)) {
         my $exitCode = exitStatus($result);
         my $failMessage = <<EOF;
@@ -2401,13 +2521,13 @@
 
 sub buildGtkProject
 {
-    my ($project, $clean, @buildArgs) = @_;
+    my ($project, $clean, $prefix, $makeArgs, $noWebKit1, $noWebKit2, @features) = @_;
 
     if ($project ne "WebKit" and $project ne "JavaScriptCore" and $project ne "WTF") {
         die "Unsupported project: $project. Supported projects: WebKit, JavaScriptCore, WTF\n";
     }
 
-    return buildAutotoolsProject($project, $clean, @buildArgs);
+    return buildAutotoolsProject($project, $clean, $prefix, $makeArgs, $noWebKit1, $noWebKit2, @features);
 }
 
 sub buildChromiumMakefile($$@)
@@ -2512,10 +2632,10 @@
     if (isDarwin() && !isChromiumAndroid() && !isChromiumMacMake() && !isChromiumNinja()) {
         # Mac build - builds the root xcode project.
         $result = buildXCodeProject("Source/WebKit/chromium/All", $clean, "-configuration", configuration(), @options);
-    } elsif (isCygwin() || isWindows()) {
+    } elsif ((isCygwin() || isWindows()) && !isChromiumNinja()) {
         # Windows build - builds the root visual studio solution.
         $result = buildChromiumVisualStudioProject("Source/WebKit/chromium/All.sln", $clean);
-    } elsif (isChromiumNinja() && !isChromiumAndroid()) {
+    } elsif (isChromiumNinja()) {
         $result = buildChromiumNinja("all", $clean, @options);
     } elsif (isLinux() || isChromiumAndroid() || isChromiumMacMake()) {
         # Linux build - build using make.
@@ -2640,7 +2760,7 @@
             die "Targetting the Web Process is not compatible with using an XPC Service for the Web Process at this time.";
         }
         
-        my $webProcessShimPath = File::Spec->catfile($productDir, "WebProcessShim.dylib");
+        my $webProcessShimPath = File::Spec->catfile($productDir, "SecItemShim.dylib");
         my $webProcessPath = File::Spec->catdir($productDir, "WebProcess.app");
         my $webKit2ExecutablePath = File::Spec->catfile($productDir, "WebKit2.framework", "WebKit2");
 
diff --git a/Tools/Scripts/webkitperl/FeatureList.pm b/Tools/Scripts/webkitperl/FeatureList.pm
index cc5f0de..1d7a596 100644
--- a/Tools/Scripts/webkitperl/FeatureList.pm
+++ b/Tools/Scripts/webkitperl/FeatureList.pm
@@ -44,23 +44,27 @@
 my (
     $threeDRenderingSupport,
     $accelerated2DCanvasSupport,
-    $animationAPISupport,
     $batteryStatusSupport,
     $blobSupport,
+    $canvasPathSupport,
+    $canvasProxySupport,
     $channelMessagingSupport,
     $cspNextSupport,
     $css3ConditionalRulesSupport,
     $css3TextSupport,
+    $css3TextLineBreakSupport,
     $cssBoxDecorationBreakSupport,
     $cssDeviceAdaptation,
     $cssExclusionsSupport,
     $cssFiltersSupport,
-    $cssHierarchiesSupport,
     $cssImageOrientationSupport,
     $cssImageResolutionSupport,
+    $cssImageSetSupport,
     $cssRegionsSupport,
     $cssShadersSupport,
+    $cssStickyPositionSupport,
     $cssCompositingSupport,
+    $cssAnimationsTransformsUnprefixedSupport,
     $cssVariablesSupport,
     $customSchemeHandlerSupport,
     $dataTransferItemsSupport,
@@ -69,9 +73,11 @@
     $deviceOrientationSupport,
     $dialogElementSupport,
     $directoryUploadSupport,
+    $dom4EventsConstructor,
     $downloadAttributeSupport,
     $fileSystemSupport,
     $filtersSupport,
+    $fontLoadEventsSupport,
     $ftpDirSupport,
     $fullscreenAPISupport,
     $gamepadSupport,
@@ -79,7 +85,6 @@
     $highDPICanvasSupport,
     $icondatabaseSupport,
     $iframeSeamlessSupport,
-    $imageResizerSupport,
     $indexedDatabaseSupport,
     $inputSpeechSupport,
     $inputTypeColorSupport,
@@ -104,66 +109,75 @@
     $meterTagSupport,
     $mhtmlSupport,
     $microdataSupport,
-    $mutationObserversSupport,
+    $mouseCursorScaleSupport,
     $netscapePluginAPISupport,
     $networkInfoSupport,
+    $nosniffSupport,
     $notificationsSupport,
     $orientationEventsSupport,
     $pageVisibilityAPISupport,
+    $performanceTimelineSupport,
     $progressTagSupport,
+    $proximityEventsSupport,
     $quotaSupport,
     $resolutionMediaQuerySupport,
     $registerProtocolHandlerSupport,
     $requestAnimationFrameSupport,
+    $resourceTimingSupport,
     $scriptedSpeechSupport,
     $shadowDOMSupport,
     $sharedWorkersSupport,
     $sqlDatabaseSupport,
     $styleScopedSupport,
+    $suidLinuxSandbox,
     $svgDOMObjCBindingsSupport,
     $svgFontsSupport,
     $svgSupport,
     $systemMallocSupport,
+    $templateElementSupport,
     $textAutosizingSupport,
     $tiledBackingStoreSupport,
+    $threadedHTMLParserSupport,
     $touchEventsSupport,
+    $touchSliderSupport,
     $touchIconLoadingSupport,
+    $userTimingSupport,
     $vibrationSupport,
     $videoSupport,
     $videoTrackSupport,
     $webglSupport,
     $webAudioSupport,
-    $webIntentsSupport,
-    $webIntentsTagSupport,
     $webSocketsSupport,
     $webTimingSupport,
     $workersSupport,
-    $xhrResponseBlobSupport,
     $xhrTimeoutSupport,
     $xsltSupport,
 );
 
 my @features = (
     { option => "3d-rendering", desc => "Toggle 3D Rendering support",
-      define => "ENABLE_3D_RENDERING", default => (isAppleMacWebKit() || isQt()), value => \$threeDRenderingSupport },
+      define => "ENABLE_3D_RENDERING", default => (isAppleMacWebKit() || isQt() || isGtk() || isEfl()), value => \$threeDRenderingSupport },
 
     { option => "accelerated-2d-canvas", desc => "Toggle Accelerated 2D Canvas support",
       define => "ENABLE_ACCELERATED_2D_CANVAS", default => 0, value => \$accelerated2DCanvasSupport },
 
-    { option => "animation-api", desc => "Toggle Animation API support",
-      define => "ENABLE_ANIMATION_API", default => (isBlackBerry() || isEfl()), value => \$animationAPISupport },
-
     { option => "battery-status", desc => "Toggle Battery Status support",
       define => "ENABLE_BATTERY_STATUS", default => (isEfl() || isBlackBerry()), value => \$batteryStatusSupport },
 
     { option => "blob", desc => "Toggle Blob support",
       define => "ENABLE_BLOB", default => (isAppleMacWebKit() || isGtk() || isChromium() || isBlackBerry() || isEfl()), value => \$blobSupport },
 
+    { option => "canvas-path", desc => "Toggle Canvas Path support",
+      define => "ENABLE_CANVAS_PATH", default => 1, value => \$canvasPathSupport },
+
+    { option => "canvas-proxy", desc => "Toggle CanvasProxy support",
+      define => "ENABLE_CANVAS_PROXY", default => 0, value => \$canvasProxySupport },
+
     { option => "channel-messaging", desc => "Toggle Channel Messaging support",
       define => "ENABLE_CHANNEL_MESSAGING", default => 1, value => \$channelMessagingSupport },
 
     { option => "csp-next", desc => "Toggle Content Security Policy 1.1 support",
-      define => "ENABLE_CSP_NEXT", default => 0, value => \$cspNextSupport },
+      define => "ENABLE_CSP_NEXT", default => isGtk(), value => \$cspNextSupport },
 
     { option => "css-device-adaptation", desc => "Toggle CSS Device Adaptation support",
       define => "ENABLE_CSS_DEVICE_ADAPTATION", default => isEfl(), value => \$cssDeviceAdaptation },
@@ -178,19 +192,22 @@
       define => "ENABLE_CSS3_CONDITIONAL_RULES", default => 0, value => \$css3ConditionalRulesSupport },
 
     { option => "css3-text", desc => "Toggle CSS3 Text support",
-      define => "ENABLE_CSS3_TEXT", default => isEfl(), value => \$css3TextSupport },
+      define => "ENABLE_CSS3_TEXT", default => (isEfl() || isGtk()), value => \$css3TextSupport },
 
-    { option => "css-hierarchies", desc => "Toggle CSS Hierarchy support",
-      define => "ENABLE_CSS_HIERARCHIES", default => 0, value => \$cssHierarchiesSupport },
+    { option => "css3-text-line-break", desc => "Toggle CSS3 Text Line Break support",
+      define => "ENABLE_CSS3_TEXT_LINE_BREAK", default => 0, value => \$css3TextLineBreakSupport },
 
     { option => "css-box-decoration-break", desc => "Toggle CSS box-decoration-break support",
       define => "ENABLE_CSS_BOX_DECORATION_BREAK", default => 1, value => \$cssBoxDecorationBreakSupport },
 
     { option => "css-image-orientation", desc => "Toggle CSS image-orientation support",
-      define => "ENABLE_CSS_IMAGE_ORIENTATION", default => 0, value => \$cssImageOrientationSupport },
+      define => "ENABLE_CSS_IMAGE_ORIENTATION", default => isGtk(), value => \$cssImageOrientationSupport },
 
     { option => "css-image-resolution", desc => "Toggle CSS image-resolution support",
-      define => "ENABLE_CSS_IMAGE_RESOLUTION", default => 0, value => \$cssImageResolutionSupport },
+      define => "ENABLE_CSS_IMAGE_RESOLUTION", default => (isBlackBerry() || isGtk()), value => \$cssImageResolutionSupport },
+
+    { option => "css-image-set", desc => "Toggle CSS image-set support",
+      define => "ENABLE_CSS_IMAGE_SET", default => (isEfl() || isGtk()), value => \$cssImageSetSupport },
 
     { option => "css-regions", desc => "Toggle CSS Regions support",
       define => "ENABLE_CSS_REGIONS", default => 1, value => \$cssRegionsSupport },
@@ -198,11 +215,17 @@
     { option => "css-shaders", desc => "Toggle CSS Shaders support",
       define => "ENABLE_CSS_SHADERS", default => isAppleMacWebKit(), value => \$cssShadersSupport },
 
+    { option => "css-sticky-position", desc => "Toggle CSS sticky position support",
+      define => "ENABLE_CSS_STICKY_POSITION", default => (isGtk() || isEfl()), value => \$cssStickyPositionSupport },
+
     { option => "css-compositing", desc => "Toggle CSS Compositing support",
       define => "ENABLE_CSS_COMPOSITING", default => isAppleWebKit(), value => \$cssCompositingSupport },
 
+    { option => "css-transforms-animations-unprefixed", desc => "Toggle support for unprefixed CSS animations and transforms",
+      define => "ENABLE_CSS_TRANSFORMS_ANIMATIONS_UNPREFIXED", default => 1, value => \$cssAnimationsTransformsUnprefixedSupport },
+
     { option => "css-variables", desc => "Toggle CSS Variable support",
-      define => "ENABLE_CSS_VARIABLES", default => (isBlackBerry() || isEfl()), value => \$cssVariablesSupport },
+      define => "ENABLE_CSS_VARIABLES", default => (isBlackBerry() || isEfl() || isGtk()), value => \$cssVariablesSupport },
 
     { option => "custom-scheme-handler", desc => "Toggle Custom Scheme Handler support",
       define => "ENABLE_CUSTOM_SCHEME_HANDLER", default => (isBlackBerry() || isEfl()), value => \$customSchemeHandlerSupport },
@@ -225,6 +248,9 @@
     { option => "directory-upload", desc => "Toggle Directory Upload support",
       define => "ENABLE_DIRECTORY_UPLOAD", default => 0, value => \$directoryUploadSupport },
 
+    { option => "dom4-events-constructor", desc => "Expose DOM4 Events constructors",
+      define => "ENABLE_DOM4_EVENTS_CONSTRUCTOR", default => (isAppleWebKit() || isGtk()), value => \$dom4EventsConstructor },
+
     { option => "download-attribute", desc => "Toggle Download Attribute support",
       define => "ENABLE_DOWNLOAD_ATTRIBUTE", default => (isBlackBerry() || isEfl()), value => \$downloadAttributeSupport },
 
@@ -234,6 +260,9 @@
     { option => "filters", desc => "Toggle Filters support",
       define => "ENABLE_FILTERS", default => (isAppleWebKit() || isGtk() || isQt() || isEfl() || isBlackBerry()), value => \$filtersSupport },
 
+    { option => "font-load-events", desc => "Toggle Font Load Events support",
+      define => "ENABLE_FONT_LOAD_EVENTS", default => 0, value => \$fontLoadEventsSupport },
+
     { option => "ftpdir", desc => "Toggle FTP Directory support",
       define => "ENABLE_FTPDIR", default => !isWinCE(), value => \$ftpDirSupport },
 
@@ -256,7 +285,7 @@
       define => "ENABLE_IFRAME_SEAMLESS", default => 1, value => \$iframeSeamlessSupport },
 
     { option => "indexed-database", desc => "Toggle Indexed Database support",
-      define => "ENABLE_INDEXED_DATABASE", default => 0, value => \$indexedDatabaseSupport },
+      define => "ENABLE_INDEXED_DATABASE", default => isGtk(), value => \$indexedDatabaseSupport },
 
     { option => "input-speech", desc => "Toggle Input Speech support",
       define => "ENABLE_INPUT_SPEECH", default => 0, value => \$inputSpeechSupport },
@@ -304,7 +333,7 @@
       define => "ENABLE_LINK_PRERENDER", default => 0, value => \$linkPrerenderSupport },
 
     { option => "mathml", desc => "Toggle MathML support",
-      define => "ENABLE_MATHML", default => 1, value => \$mathmlSupport },
+      define => "ENABLE_MATHML", default => !isBlackBerry(), value => \$mathmlSupport },
 
     { option => "media-capture", desc => "Toggle Media Capture support",
       define => "ENABLE_MEDIA_CAPTURE", default => isEfl(), value => \$mediaCaptureSupport },
@@ -316,19 +345,19 @@
       define => "ENABLE_MEDIA_STATISTICS", default => 0, value => \$mediaStatisticsSupport },
 
     { option => "media-stream", desc => "Toggle Media Stream support",
-      define => "ENABLE_MEDIA_STREAM", default => (isChromium() || isGtk() || isBlackBerry()), value => \$mediaStreamSupport },
+      define => "ENABLE_MEDIA_STREAM", default => (isChromium() || isBlackBerry()), value => \$mediaStreamSupport },
 
     { option => "meter-tag", desc => "Toggle Meter Tag support",
       define => "ENABLE_METER_ELEMENT", default => !isAppleWinWebKit(), value => \$meterTagSupport },
 
     { option => "mhtml", desc => "Toggle MHTML support",
-      define => "ENABLE_MHTML", default => isGtk(), value => \$mhtmlSupport },
+      define => "ENABLE_MHTML", default => (isGtk() || isEfl()), value => \$mhtmlSupport },
 
     { option => "microdata", desc => "Toggle Microdata support",
-      define => "ENABLE_MICRODATA", default => (isEfl() || isBlackBerry()), value => \$microdataSupport },
+      define => "ENABLE_MICRODATA", default => (isEfl() || isBlackBerry() || isGtk()), value => \$microdataSupport },
 
-    { option => "mutation-observers", desc => "Toggle Mutation Observers support",
-      define => "ENABLE_MUTATION_OBSERVERS", default => 1, value => \$mutationObserversSupport },
+    { option => "mouse-cursor-scale", desc => "Toggle Scaled mouse cursor support",
+      define => "ENABLE_MOUSE_CURSOR_SCALE", default => 0, value => \$mouseCursorScaleSupport },
 
     { option => "navigator-content-utils", desc => "Toggle Navigator Content Utils support",
       define => "ENABLE_NAVIGATOR_CONTENT_UTILS", default => (isBlackBerry() || isEfl()), value => \$registerProtocolHandlerSupport },
@@ -339,6 +368,9 @@
     { option => "network-info", desc => "Toggle Network Info support",
       define => "ENABLE_NETWORK_INFO", default => (isEfl() || isBlackBerry()), value => \$networkInfoSupport },
 
+    { option => "nosniff", desc => "Toggle support for 'X-Content-Type-Options: nosniff'",
+      define => "ENABLE_NOSNIFF", default => 0, value => \$nosniffSupport },
+
     { option => "notifications", desc => "Toggle Notifications support",
       define => "ENABLE_NOTIFICATIONS", default => isBlackBerry(), value => \$notificationsSupport },
 
@@ -348,15 +380,24 @@
     { option => "page-visibility-api", desc => "Toggle Page Visibility API support",
       define => "ENABLE_PAGE_VISIBILITY_API", default => (isBlackBerry() || isEfl()), value => \$pageVisibilityAPISupport },
 
+    { option => "performance-timeline", desc => "Toggle Performance Timeline support",
+      define => "ENABLE_PERFORMANCE_TIMELINE", default => isGtk(), value => \$performanceTimelineSupport },
+
     { option => "progress-tag", desc => "Toggle Progress Tag support",
       define => "ENABLE_PROGRESS_ELEMENT", default => 1, value => \$progressTagSupport },
 
+    { option => "proximity-events", desc => "Toggle Proximity Events support",
+      define => "ENABLE_PROXIMITY_EVENTS", default => 0, value => \$proximityEventsSupport },
+
     { option => "quota", desc => "Toggle Quota support",
       define => "ENABLE_QUOTA", default => 0, value => \$quotaSupport },
 
     { option => "resolution-media-query", desc => "Toggle resolution media query support",
       define => "ENABLE_RESOLUTION_MEDIA_QUERY", default => (isEfl() || isQt()), value => \$resolutionMediaQuerySupport },
 
+    { option => "resource-timing", desc => "Toggle Resource Timing support",
+      define => "ENABLE_RESOURCE_TIMING", default => isGtk(), value => \$resourceTimingSupport },
+
     { option => "request-animation-frame", desc => "Toggle Request Animation Frame support",
       define => "ENABLE_REQUEST_ANIMATION_FRAME", default => (isAppleMacWebKit() || isGtk() || isEfl() || isBlackBerry()), value => \$requestAnimationFrameSupport },
 
@@ -373,7 +414,10 @@
       define => "ENABLE_SQL_DATABASE", default => 1, value => \$sqlDatabaseSupport },
 
     { option => "style-scoped", desc => "Toggle Style Scoped support",
-      define => "ENABLE_STYLE_SCOPED", default => isBlackBerry(), value => \$styleScopedSupport },
+      define => "ENABLE_STYLE_SCOPED", default => (isBlackBerry() || isGtk()), value => \$styleScopedSupport },
+
+    { option => "suid-linux-sandbox", desc => "Toggle suid sandbox for linux",
+      define => "ENABLE_SUID_SANDBOX_LINUX", default => 0, value => \$suidLinuxSandbox },
 
     { option => "svg", desc => "Toggle SVG support",
       define => "ENABLE_SVG", default => 1, value => \$svgSupport },
@@ -385,7 +429,10 @@
       define => "ENABLE_SVG_FONTS", default => 1, value => \$svgFontsSupport },
 
     { option => "system-malloc", desc => "Toggle system allocator instead of TCmalloc",
-      define => "USE_SYSTEM_MALLOC", default => isWinCE(), value => \$systemMallocSupport },
+      define => "USE_SYSTEM_MALLOC", default => (isBlackBerry() || isWinCE()), value => \$systemMallocSupport },
+
+    { option => "template-element", desc => "Toggle HTMLTemplateElement support",
+      define => "ENABLE_TEMPLATE_ELEMENT", default => (isEfl() || isGtk()), value => \$templateElementSupport },
 
     { option => "text-autosizing", desc => "Toggle Text Autosizing support",
       define => "ENABLE_TEXT_AUTOSIZING", default => 0, value => \$textAutosizingSupport },
@@ -393,12 +440,21 @@
     { option => "tiled-backing-store", desc => "Toggle Tiled Backing Store support",
       define => "WTF_USE_TILED_BACKING_STORE", default => (isQt() || isEfl()), value => \$tiledBackingStoreSupport },
 
+    { option => "threaded-html-parser", desc => "Toggle threaded HTML parser support",
+      define => "ENABLE_THREADED_HTML_PARSER", default => isChromium(), value => \$threadedHTMLParserSupport },
+
     { option => "touch-events", desc => "Toggle Touch Events support",
       define => "ENABLE_TOUCH_EVENTS", default => (isQt() || isBlackBerry() || isEfl()), value => \$touchEventsSupport },
 
+    { option => "touch-slider", desc => "Toggle Touch Slider support",
+      define => "ENABLE_TOUCH_SLIDER", default => isBlackBerry(), value => \$touchSliderSupport },
+
     { option => "touch-icon-loading", desc => "Toggle Touch Icon Loading Support",
       define => "ENABLE_TOUCH_ICON_LOADING", default => 0, value => \$touchIconLoadingSupport },
 
+    { option => "user-timing", desc => "Toggle User Timing support",
+      define => "ENABLE_USER_TIMING", default => isGtk(), value => \$userTimingSupport },
+
     { option => "vibration", desc => "Toggle Vibration support",
       define => "ENABLE_VIBRATION", default => (isEfl() || isBlackBerry()), value => \$vibrationSupport },
 
@@ -409,16 +465,10 @@
       define => "ENABLE_VIDEO_TRACK", default => (isAppleWebKit() || isGtk() || isEfl() || isBlackBerry()), value => \$videoTrackSupport },
 
     { option => "webgl", desc => "Toggle WebGL support",
-      define => "ENABLE_WEBGL", default => (isAppleMacWebKit() || isGtk()), value => \$webglSupport },
+      define => "ENABLE_WEBGL", default => (isAppleMacWebKit() || isGtk() || isEfl()), value => \$webglSupport },
 
     { option => "web-audio", desc => "Toggle Web Audio support",
-      define => "ENABLE_WEB_AUDIO", default => 0, value => \$webAudioSupport },
-
-    { option => "web-intents", desc => "Toggle Web Intents support",
-      define => "ENABLE_WEB_INTENTS", default => isEfl(), value => \$webIntentsSupport },
-
-    { option => "web-intents-tag", desc => "Toggle Web Intents Tag support",
-      define => "ENABLE_WEB_INTENTS_TAG", default => isEfl(), value => \$webIntentsTagSupport },
+      define => "ENABLE_WEB_AUDIO", default => (isEfl() || isGtk()), value => \$webAudioSupport },
 
     { option => "web-sockets", desc => "Toggle Web Sockets support",
       define => "ENABLE_WEB_SOCKETS", default => 1, value => \$webSocketsSupport },
@@ -429,9 +479,6 @@
     { option => "workers", desc => "Toggle Workers support",
       define => "ENABLE_WORKERS", default => (isAppleWebKit() || isGtk() || isBlackBerry() || isEfl()), value => \$workersSupport },
 
-    { option => "xhr-response-blob", desc => "Toggle XHR Response BLOB support",
-      define => "ENABLE_XHR_RESPONSE_BLOB", default => isBlackBerry(), value => \$xhrResponseBlobSupport },
-
     { option => "xhr-timeout", desc => "Toggle XHR Timeout support",
       define => "ENABLE_XHR_TIMEOUT", default => (isEfl() || isGtk() || isAppleMacWebKit()), value => \$xhrTimeoutSupport },
 
diff --git a/Tools/Scripts/webkitperl/VCSUtils_unittest/parseDiffWithMockFiles.pl b/Tools/Scripts/webkitperl/VCSUtils_unittest/parseDiffWithMockFiles.pl
index ee9fff9..b15838c 100644
--- a/Tools/Scripts/webkitperl/VCSUtils_unittest/parseDiffWithMockFiles.pl
+++ b/Tools/Scripts/webkitperl/VCSUtils_unittest/parseDiffWithMockFiles.pl
@@ -1,6 +1,7 @@
 #!/usr/bin/perl -w
 #
 # Copyright (C) 2011 Research In Motion Limited. All rights reserved.
+# Copyright (C) 2013 Apple Inc. All rights reserved.
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -26,6 +27,33 @@
 use Test::More;
 use VCSUtils;
 
+# We should consider moving escapeNewLineCharacters() and toMacLineEndings()
+# to VCSUtils.pm if they're useful in other places.
+sub escapeNewLineCharacters($)
+{
+    my ($text) = @_;
+    my @characters = split(//, $text);
+    my $result = "";
+    foreach (@characters) {
+        if (/^\r$/) {
+            $result .= '\r';
+            next;
+        }
+        if (/^\n$/) {
+            $result .= '\n';
+        }
+        $result .= $_;
+    }
+    return $result;
+}
+
+sub toMacLineEndings($)
+{
+    my ($text) = @_;
+    $text =~ s/\n/\r/g;
+    return $text;
+}
+
 my $gitDiffHeaderForNewFile = <<EOF;
 diff --git a/Makefile b/Makefile
 new file mode 100644
@@ -92,6 +120,7 @@
 my $mockDir = File::Temp->tempdir("parseDiffXXXX", CLEANUP => 1);
 writeToFile(File::Spec->catfile($mockDir, "MakefileWithUnixEOL"), $MakefileContents);
 writeToFile(File::Spec->catfile($mockDir, "MakefileWithWindowsEOL"), toWindowsLineEndings($MakefileContents));
+writeToFile(File::Spec->catfile($mockDir, "MakefileWithMacEOL"), toMacLineEndings($MakefileContents));
 
 # The array of test cases.
 my @testCaseHashRefs = (
@@ -145,6 +174,76 @@
 },
 {
     # New test
+    diffName => "SVN: Patch adds Windows newline to EOF and IndexPath has Windows line endings",
+    inputText => <<"EOF",
+Index: MakefileWithWindowsEOL
+===================================================================
+--- MakefileWithWindowsEOL	(revision 53052)
++++ MakefileWithWindowsEOL	(working copy)
+@@ -1,3 +1,4 @@\r
+ MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
+ \r
+-all:
+\\ No newline at end of file
++all:\r
++\r
+EOF
+    expectedReturn => [
+[{
+    # Same as input text
+    svnConvertedText => <<"EOF",
+Index: MakefileWithWindowsEOL
+===================================================================
+--- MakefileWithWindowsEOL	(revision 53052)
++++ MakefileWithWindowsEOL	(working copy)
+@@ -1,3 +1,4 @@\r
+ MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
+ \r
+-all:
+\\ No newline at end of file
++all:\r
++\r
+EOF
+    indexPath => "MakefileWithWindowsEOL",
+    isSvn => 1,
+    numTextChunks => 1,
+    sourceRevision => 53052
+}],
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
+    diffName => "SVN: Patch adds Mac newline to EOF and IndexPath has Mac line endings",
+    inputText => <<"EOF",
+Index: MakefileWithMacEOL
+===================================================================
+--- MakefileWithMacEOL	(revision 53052)
++++ MakefileWithMacEOL	(working copy)
+@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
+\\ No newline at end of file
++all:\r+\r
+EOF
+    expectedReturn => [
+[{
+    # Same as input text
+    svnConvertedText => q(Index: MakefileWithMacEOL
+===================================================================
+--- MakefileWithMacEOL	(revision 53052)
++++ MakefileWithMacEOL	(working copy)
+@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
+\\ No newline at end of file
++all:\r+\r),
+    indexPath => "MakefileWithMacEOL",
+    isSvn => 1,
+    numTextChunks => 1,
+    sourceRevision => 53052
+}],
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
     diffName => "SVN: Patch with Unix line endings and IndexPath has Windows line endings",
     inputText => substituteString($svnDiffHeader, "Makefile", "MakefileWithWindowsEOL") . $diffBody,
     expectedReturn => [
@@ -235,6 +334,74 @@
 },
 {
     # New test
+    diffName => "Git: Patch adds newline to EOF with Windows line endings and IndexPath has Windows line endings",
+    inputText => <<"EOF",
+diff --git a/MakefileWithWindowsEOL b/MakefileWithWindowsEOL
+index e7e8475..ae16fc3 100644
+--- a/MakefileWithWindowsEOL
++++ b/MakefileWithWindowsEOL
+@@ -1,3 +1,4 @@\r
+ MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
+ \r
+-all:
+\\ No newline at end of file
++all:\r
++\r
+EOF
+    expectedReturn => [
+[{
+    # Same as input text
+    svnConvertedText => <<"EOF",
+Index: MakefileWithWindowsEOL
+index e7e8475..ae16fc3 100644
+--- MakefileWithWindowsEOL
++++ MakefileWithWindowsEOL
+@@ -1,3 +1,4 @@\r
+ MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r
+ \r
+-all:
+\\ No newline at end of file
++all:\r
++\r
+EOF
+    indexPath => "MakefileWithWindowsEOL",
+    isGit => 1,
+    numTextChunks => 1
+}],
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
+    diffName => "Git: Patch adds Mac newline to EOF and IndexPath has Mac line endings",
+    inputText => <<"EOF",
+diff --git a/MakefileWithMacEOL b/MakefileWithMacEOL
+index e7e8475..ae16fc3 100644
+--- a/MakefileWithMacEOL
++++ b/MakefileWithMacEOL
+@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
+\\ No newline at end of file
++all:\r+\r
+EOF
+    expectedReturn => [
+[{
+    # Same as input text
+    svnConvertedText => q(Index: MakefileWithMacEOL
+index e7e8475..ae16fc3 100644
+--- MakefileWithMacEOL
++++ MakefileWithMacEOL
+@@ -1,3 +1,4 @@\r MODULES = JavaScriptCore JavaScriptGlue WebCore WebKit WebKitTools\r \r-all:
+\\ No newline at end of file
++all:\r+\r),
+    indexPath => "MakefileWithMacEOL",
+    isGit => 1,
+    numTextChunks => 1
+}],
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
     diffName => "Git: Patch with Unix line endings and IndexPath has Windows line endings",
     inputText => substituteString($gitDiffHeader, "Makefile", "MakefileWithWindowsEOL") . $diffBody,
     expectedReturn => [
@@ -294,6 +461,8 @@
     my @got = VCSUtils::parseDiff($fileHandle, $line);
     my $expectedReturn = $testCase->{expectedReturn};
 
+    $got[0][0]->{svnConvertedText} = escapeNewLineCharacters($got[0][0]->{svnConvertedText});
+    $expectedReturn->[0][0]->{svnConvertedText} = escapeNewLineCharacters($expectedReturn->[0][0]->{svnConvertedText});
     is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
 
     my $gotNextLine = <$fileHandle>;
diff --git a/Tools/Scripts/webkitperl/httpd.pm b/Tools/Scripts/webkitperl/httpd.pm
index 58ff108..a38552a 100644
--- a/Tools/Scripts/webkitperl/httpd.pm
+++ b/Tools/Scripts/webkitperl/httpd.pm
@@ -90,6 +90,14 @@
     return system(@command) == 0;
 }
 
+sub getApacheVersion
+{
+    my $httpdPath = getHTTPDPath();
+    my $version = `$httpdPath -v`;
+    $version =~ s/.*Server version: Apache\/(\d+\.\d+).*/$1/s;
+    return $version;
+}
+
 sub getDefaultConfigForTestDirectory
 {
     my ($testDirectory) = @_;
@@ -112,11 +120,14 @@
         "-c", "TypesConfig \"$typesConfig\"",
         # Apache wouldn't run CGIs with permissions==700 otherwise
         "-c", "User \"#$<\"",
-        "-c", "LockFile \"$httpdLockFile\"",
         "-c", "PidFile \"$httpdPidFile\"",
         "-c", "ScoreBoardFile \"$httpdScoreBoardFile\"",
     );
 
+    if (getApacheVersion() eq "2.2") {
+        push(@httpdArgs, "-c", "LockFile \"$httpdLockFile\"");
+    }
+
     # FIXME: Enable this on Windows once <rdar://problem/5345985> is fixed
     # The version of Apache we use with Cygwin does not support SSL
     my $sslCertificate = "$testDirectory/http/conf/webkit-httpd.pem";
@@ -134,6 +145,7 @@
     my $httpdConfig;
     my $httpdPath = getHTTPDPath();
     my $httpdConfDirectory = "$testDirectory/http/conf/";
+    my $apacheVersion = getApacheVersion();
 
     if (isCygwin()) {
         my $libPHP4DllPath = "/usr/lib/apache/libphp4.dll";
@@ -146,7 +158,7 @@
     } elsif (isDebianBased()) {
         $httpdConfig = "apache2-debian-httpd.conf";
     } elsif (isFedoraBased()) {
-        $httpdConfig = "fedora-httpd.conf"; # This is an apache2 config, despite the name.
+        $httpdConfig = "fedora-httpd-$apacheVersion.conf";
     } else {
         # All other ports use apache2, so just use our default apache2 config.
         $httpdConfig = "apache2-httpd.conf";
diff --git a/Tools/Scripts/webkitpy/bindings/main.py b/Tools/Scripts/webkitpy/bindings/main.py
index 15884bb..af541f0 100644
--- a/Tools/Scripts/webkitpy/bindings/main.py
+++ b/Tools/Scripts/webkitpy/bindings/main.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2011 Google Inc.  All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -76,8 +75,7 @@
                'WebCore/bindings/scripts/preprocess-idls.pl',
                '--idlFilesList', idl_files_list[1],
                '--defines', '',
-               '--supplementalDependencyFile', supplemental_dependency_file,
-               '--idlAttributesFile', 'WebCore/bindings/scripts/IDLAttributes.txt']
+               '--supplementalDependencyFile', supplemental_dependency_file]
 
         exit_code = 0
         try:
diff --git a/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py b/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py
index a5fd065..308fc17 100644
--- a/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py
+++ b/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.checkout.baselineoptimizer import BaselineOptimizer
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -82,6 +82,14 @@
             'LayoutTests/platform/chromium-win': '462d03b9c025db1b0392d7453310dbee5f9a9e74',
         })
 
+    def test_efl(self):
+        self._assertOptimization({
+            'LayoutTests/platform/efl': '462d03b9c025db1b0392d7453310dbee5f9a9e74',
+        }, {
+            'LayoutTests/platform/efl': '462d03b9c025db1b0392d7453310dbee5f9a9e74',
+        })
+
+
     def test_no_add_mac_future(self):
         self._assertOptimization({
             'LayoutTests/platform/mac': '29a1715a6470d5dd9486a142f609708de84cdac8',
diff --git a/Tools/Scripts/webkitpy/common/checkout/changelog.py b/Tools/Scripts/webkitpy/common/checkout/changelog.py
index ae7b71f..e927b33 100644
--- a/Tools/Scripts/webkitpy/common/checkout/changelog.py
+++ b/Tools/Scripts/webkitpy/common/checkout/changelog.py
@@ -28,15 +28,17 @@
 #
 # WebKit's Python module for parsing and modifying ChangeLog files
 
-import codecs
-import fileinput # inplace file editing for set_reviewer_in_changelog
+import logging
 import re
+from StringIO import StringIO
 import textwrap
 
 from webkitpy.common.config.committers import CommitterList
 from webkitpy.common.config.committers import Account
+from webkitpy.common.system.filesystem import FileSystem
 import webkitpy.common.config.urls as config_urls
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 # FIXME: parse_bug_id_from_changelog should not be a free function.
@@ -62,6 +64,8 @@
 
     # e.g. * Source/WebCore/page/EventHandler.cpp: Implement FooBarQuux.
     touched_files_regexp = r'^\s*\*\s*(?P<file>[A-Za-z0-9_\-\./\\]+)\s*\:'
+    # e.g. (ChangeLogEntry.touched_functions): Added.
+    touched_functions_regexp = r'^\s*\((?P<function>[^)]*)\):'
 
     # e.g. Reviewed by Darin Adler.
     # (Discard everything after the first period to match more invalid lines.)
@@ -100,14 +104,16 @@
     # e.g. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@96161 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     svn_id_regexp = r'git-svn-id: http://svn.webkit.org/repository/webkit/trunk@(?P<svnid>\d+) '
 
+    split_names_regexp = r'\s*(?:,(?:\s+and\s+|&)?|(?:^|\s+)and\s+|&&|[/+&])\s*'
+
     def __init__(self, contents, committer_list=CommitterList(), revision=None):
         self._contents = contents
         self._committer_list = committer_list
         self._revision = revision
         self._parse_entry()
 
-    @staticmethod
-    def _parse_reviewer_text(text):
+    @classmethod
+    def _parse_reviewer_text(cls, text):
         match = re.search(ChangeLogEntry.reviewed_by_regexp, text, re.MULTILINE | re.IGNORECASE)
         if not match:
             # There are cases where people omit "by". We match it only if reviewer part looked nice
@@ -127,7 +133,7 @@
         if not len(reviewer_text):
             return None, None
 
-        reviewer_list = ChangeLogEntry._split_contributor_names(reviewer_text)
+        reviewer_list = ChangeLogEntry._split_reviewer_names(reviewer_text)
 
         # Get rid of "reviewers" like "even though this is just a..." in "Reviewed by Sam Weinig, even though this is just a..."
         # and "who wrote the original code" in "Noam Rosenthal, who wrote the original code"
@@ -135,9 +141,17 @@
 
         return reviewer_text, reviewer_list
 
-    @staticmethod
-    def _split_contributor_names(text):
-        return re.split(r'\s*(?:,(?:\s+and\s+|&)?|(?:^|\s+)and\s+|&&|[/+&])\s*', text)
+    @classmethod
+    def _split_reviewer_names(cls, text):
+        return re.split(ChangeLogEntry.split_names_regexp, text)
+
+    @classmethod
+    def _split_author_names_with_emails(cls, text):
+        regex = '>' + ChangeLogEntry.split_names_regexp
+        names = re.split(regex, text)
+        if len(names) > 1:
+            names = [name + ">" for name in names[:-1]] + [names[-1]]
+        return names
 
     def _fuzz_match_reviewers(self, reviewers_text_list):
         if not reviewers_text_list:
@@ -146,23 +160,53 @@
         # Flatten lists and get rid of any reviewers with more than one candidate.
         return [reviewers[0] for reviewers in list_of_reviewers if len(reviewers) == 1]
 
-    @staticmethod
-    def _parse_author_name_and_email(author_name_and_email):
+    @classmethod
+    def _parse_author_name_and_email(cls, author_name_and_email):
         match = re.match(r'(?P<name>.+?)\s+<(?P<email>[^>]+)>', author_name_and_email)
         return {'name': match.group("name"), 'email': match.group("email")}
 
-    @staticmethod
-    def _parse_author_text(text):
+    @classmethod
+    def _parse_author_text(cls, text):
         if not text:
             return []
-        authors = ChangeLogEntry._split_contributor_names(text)
+        authors = cls._split_author_names_with_emails(text)
         assert(authors and len(authors) >= 1)
-        return [ChangeLogEntry._parse_author_name_and_email(author) for author in authors]
+        return [cls._parse_author_name_and_email(author) for author in authors]
+
+    @classmethod
+    def _parse_touched_functions(cls, text):
+        result = {}
+        cur_file = None
+        for line in text.splitlines():
+            file_match = re.match(cls.touched_files_regexp, line)
+            if file_match:
+                cur_file = file_match.group("file")
+                result[cur_file] = []
+            func_match = re.match(cls.touched_functions_regexp, line)
+            if func_match and cur_file:
+                result[cur_file].append(func_match.group("function"))
+        return result
+
+    @classmethod
+    def _parse_bug_description(cls, text):
+        # If line 4 is a bug url, line 3 is the bug description.
+        # It's too hard to guess in other cases, so we return None.
+        lines = text.splitlines()
+        if len(lines) < 4:
+            return None
+        for bug_url in (config_urls.bug_url_short, config_urls.bug_url_long):
+            if re.match("^\s*" + bug_url + "$", lines[3]):
+                return lines[2].strip()
+        return None
 
     def _parse_entry(self):
         match = re.match(self.date_line_regexp, self._contents, re.MULTILINE)
         if not match:
-            log("WARNING: Creating invalid ChangeLogEntry:\n%s" % self._contents)
+            _log.warning("Creating invalid ChangeLogEntry:\n%s" % self._contents)
+
+        self._date_line = match.group()
+        self._date = match.group("date")
+        self._bug_description = self._parse_bug_description(self._contents)
 
         # FIXME: group("name") does not seem to be Unicode?  Probably due to self._contents not being unicode.
         self._author_text = match.group("authors") if match else None
@@ -173,6 +217,13 @@
         self._author = self._committer_list.contributor_by_email(self.author_email()) or self._committer_list.contributor_by_name(self.author_name())
 
         self._touched_files = re.findall(self.touched_files_regexp, self._contents, re.MULTILINE)
+        self._touched_functions = self._parse_touched_functions(self._contents)
+
+    def date_line(self):
+        return self._date_line
+
+    def date(self):
+        return self._date
 
     def author_text(self):
         return self._author_text
@@ -218,69 +269,75 @@
     def bug_id(self):
         return parse_bug_id_from_changelog(self._contents)
 
+    def bug_description(self):
+        return self._bug_description
+
     def touched_files(self):
         return self._touched_files
 
+    # Returns a dict from file name to lists of function names.
+    def touched_functions(self):
+        return self._touched_functions
+
+    def touched_files_text(self):
+        match = re.search(self.touched_files_regexp, self._contents, re.MULTILINE)
+        return self._contents[match.start():].lstrip("\n\r") if match else ""
+
+    # Determine if any text has been added to the section on touched files
+    def is_touched_files_text_clean(self):
+        file_line_end = r"( (Added|Removed|(Copied|Renamed) from [A-Za-z0-9_\-./\\]+).)?$"
+        for line in self.touched_files_text().splitlines():
+            if re.match(self.touched_files_regexp + file_line_end, line):
+                continue
+            if re.match(self.touched_functions_regexp + "$", line):
+                continue
+            return False
+        return True
 
 # FIXME: Various methods on ChangeLog should move into ChangeLogEntry instead.
 class ChangeLog(object):
 
-    def __init__(self, path):
+    def __init__(self, path, filesystem=None):
         self.path = path
+        self._filesystem = filesystem or FileSystem()
 
     _changelog_indent = " " * 8
 
-    @staticmethod
-    def parse_latest_entry_from_file(changelog_file):
-        """changelog_file must be a file-like object which returns
-        unicode strings.  Use codecs.open or StringIO(unicode())
-        to pass file objects to this class."""
-        date_line_regexp = re.compile(ChangeLogEntry.date_line_regexp)
-        rolled_over_regexp = re.compile(ChangeLogEntry.rolled_over_regexp)
-        entry_lines = []
-        # The first line should be a date line.
-        first_line = changelog_file.readline()
-        assert(isinstance(first_line, unicode))
-        if not date_line_regexp.match(first_line):
+    @classmethod
+    def parse_latest_entry_from_file(cls, changelog_file):
+        try:
+            return next(cls.parse_entries_from_file(changelog_file))
+        except StopIteration, e:
             return None
-        entry_lines.append(first_line)
-
-        for line in changelog_file:
-            # If we've hit the next entry, return.
-            if date_line_regexp.match(line) or rolled_over_regexp.match(line):
-                # Remove the extra newline at the end
-                return ChangeLogEntry(''.join(entry_lines[:-1]))
-            entry_lines.append(line)
-        return None # We never found a date line!
 
     svn_blame_regexp = re.compile(r'^(\s*(?P<revision>\d+) [^ ]+)\s*(?P<line>.*?\n)')
 
-    @staticmethod
-    def _separate_revision_and_line(line):
-        match = ChangeLog.svn_blame_regexp.match(line)
+    @classmethod
+    def _separate_revision_and_line(cls, line):
+        match = cls.svn_blame_regexp.match(line)
         if not match:
             return None, line
         return int(match.group('revision')), match.group('line')
 
-    @staticmethod
-    def parse_entries_from_file(changelog_file):
+    @classmethod
+    def parse_entries_from_file(cls, changelog_file):
         """changelog_file must be a file-like object which returns
-        unicode strings.  Use codecs.open or StringIO(unicode())
-        to pass file objects to this class."""
+        unicode strings, e.g. from StringIO(unicode()) or
+        fs.open_text_file_for_reading()"""
         date_line_regexp = re.compile(ChangeLogEntry.date_line_regexp)
         rolled_over_regexp = re.compile(ChangeLogEntry.rolled_over_regexp)
 
         # The first line should be a date line.
-        revision, first_line = ChangeLog._separate_revision_and_line(changelog_file.readline())
+        revision, first_line = cls._separate_revision_and_line(changelog_file.readline())
         assert(isinstance(first_line, unicode))
-        if not date_line_regexp.match(ChangeLog.svn_blame_regexp.sub('', first_line)):
+        if not date_line_regexp.match(cls.svn_blame_regexp.sub('', first_line)):
             raise StopIteration
 
         entry_lines = [first_line]
         revisions_in_entry = {revision: 1} if revision != None else None
         for line in changelog_file:
             if revisions_in_entry:
-                revision, line = ChangeLog._separate_revision_and_line(line)
+                revision, line = cls._separate_revision_and_line(line)
 
             if rolled_over_regexp.match(line):
                 break
@@ -301,7 +358,7 @@
 
     def latest_entry(self):
         # ChangeLog files are always UTF-8, we read them in as such to support Reviewers with unicode in their names.
-        changelog_file = codecs.open(self.path, "r", "utf-8")
+        changelog_file = self._filesystem.open_text_file_for_reading(self.path)
         try:
             return self.parse_latest_entry_from_file(changelog_file)
         finally:
@@ -329,20 +386,22 @@
         first_boilerplate_line_regexp = re.compile(
                 "%sNeed a short description \(OOPS!\)\." % self._changelog_indent)
         removing_boilerplate = False
-        # inplace=1 creates a backup file and re-directs stdout to the file
-        for line in fileinput.FileInput(self.path, inplace=1):
-            if first_boilerplate_line_regexp.search(line):
-                message_lines = self._wrap_lines(message)
-                print first_boilerplate_line_regexp.sub(message_lines, line),
-                # Remove all the ChangeLog boilerplate before the first changed
-                # file.
-                removing_boilerplate = True
-            elif removing_boilerplate:
-                if line.find('*') >= 0: # each changed file is preceded by a *
-                    removing_boilerplate = False
+        result = StringIO()
+        with self._filesystem.open_text_file_for_reading(self.path) as file:
+            for line in file:
+                if first_boilerplate_line_regexp.search(line):
+                    message_lines = self._wrap_lines(message)
+                    result.write(first_boilerplate_line_regexp.sub(message_lines, line))
+                    # Remove all the ChangeLog boilerplate before the first changed
+                    # file.
+                    removing_boilerplate = True
+                elif removing_boilerplate:
+                    if line.find('*') >= 0:  # each changed file is preceded by a *
+                        removing_boilerplate = False
 
-            if not removing_boilerplate:
-                print line,
+                if not removing_boilerplate:
+                    result.write(line)
+        self._filesystem.write_text_file(self.path, result.getvalue())
 
     def set_reviewer(self, reviewer):
         latest_entry = self.latest_entry()
@@ -353,25 +412,49 @@
         if not found_nobody and not reviewer_text:
             bug_url_number_of_items = len(re.findall(config_urls.bug_url_long, latest_entry_contents, re.MULTILINE))
             bug_url_number_of_items += len(re.findall(config_urls.bug_url_short, latest_entry_contents, re.MULTILINE))
-            for line in fileinput.FileInput(self.path, inplace=1):
-                found_bug_url = re.search(config_urls.bug_url_long, line)
-                if not found_bug_url:
-                    found_bug_url = re.search(config_urls.bug_url_short, line)
-                print line,
-                if found_bug_url:
-                    if bug_url_number_of_items == 1:
-                        print "\n        Reviewed by %s." % (reviewer.encode("utf-8"))
-                    bug_url_number_of_items -= 1
+            result = StringIO()
+            with self._filesystem.open_text_file_for_reading(self.path) as file:
+                for line in file:
+                    found_bug_url = re.search(config_urls.bug_url_long, line)
+                    if not found_bug_url:
+                        found_bug_url = re.search(config_urls.bug_url_short, line)
+                    result.write(line)
+                    if found_bug_url:
+                        if bug_url_number_of_items == 1:
+                            result.write("\n        Reviewed by %s.\n" % reviewer)
+                        bug_url_number_of_items -= 1
+            self._filesystem.write_text_file(self.path, result.getvalue())
         else:
-            # inplace=1 creates a backup file and re-directs stdout to the file
-            for line in fileinput.FileInput(self.path, inplace=1):
-                # Trailing comma suppresses printing newline
-                print line.replace("NOBODY (OOPS!)", reviewer.encode("utf-8")),
+            data = self._filesystem.read_text_file(self.path)
+            newdata = data.replace("NOBODY (OOPS!)", reviewer)
+            self._filesystem.write_text_file(self.path, newdata)
 
     def set_short_description_and_bug_url(self, short_description, bug_url):
         message = "%s\n%s%s" % (short_description, self._changelog_indent, bug_url)
         bug_boilerplate = "%sNeed the bug URL (OOPS!).\n" % self._changelog_indent
-        for line in fileinput.FileInput(self.path, inplace=1):
-            line = line.replace("Need a short description (OOPS!).", message.encode("utf-8"))
-            if line != bug_boilerplate:
-                print line,
+        result = StringIO()
+        with self._filesystem.open_text_file_for_reading(self.path) as file:
+            for line in file:
+                line = line.replace("Need a short description (OOPS!).", message)
+                if line != bug_boilerplate:
+                    result.write(line)
+        self._filesystem.write_text_file(self.path, result.getvalue())
+
+    def delete_entries(self, num_entries):
+        date_line_regexp = re.compile(ChangeLogEntry.date_line_regexp)
+        rolled_over_regexp = re.compile(ChangeLogEntry.rolled_over_regexp)
+        entries = 0
+        result = StringIO()
+        with self._filesystem.open_text_file_for_reading(self.path) as file:
+            for line in file:
+                if date_line_regexp.match(line):
+                    entries += 1
+                elif rolled_over_regexp.match(line):
+                    entries = num_entries + 1
+                if entries > num_entries:
+                    result.write(line)
+        self._filesystem.write_text_file(self.path, result.getvalue())
+
+    def prepend_text(self, text):
+        data = self._filesystem.read_text_file(self.path)
+        self._filesystem.write_text_file(self.path, text + data)
diff --git a/Tools/Scripts/webkitpy/common/checkout/changelog_unittest.py b/Tools/Scripts/webkitpy/common/checkout/changelog_unittest.py
index 9591744..05b21e0 100644
--- a/Tools/Scripts/webkitpy/common/checkout/changelog_unittest.py
+++ b/Tools/Scripts/webkitpy/common/checkout/changelog_unittest.py
@@ -26,18 +26,18 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import codecs
-import os
-import tempfile
-import unittest
+import unittest2 as unittest
 
 from StringIO import StringIO
 
+from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.checkout.changelog import *
 
 
 class ChangeLogTest(unittest.TestCase):
 
+    _changelog_path = 'Tools/ChangeLog'
+
     _example_entry = u'''2009-08-17  Peter Kasting  <pkasting@google.com>
 
         Reviewed by Tor Arne Vestb\xf8.
@@ -181,7 +181,7 @@
 
         '''
 
-        self.assertEquals(56988, parse_bug_id_from_changelog(commit_text))
+        self.assertEqual(56988, parse_bug_id_from_changelog(commit_text))
 
         commit_text = '''
 2011-03-23  Ojan Vafai  <ojan@chromium.org>
@@ -194,7 +194,7 @@
 
         '''
 
-        self.assertEquals(12345, parse_bug_id_from_changelog(commit_text))
+        self.assertEqual(12345, parse_bug_id_from_changelog(commit_text))
 
         commit_text = '''
 2011-03-31  Adam Roben  <aroben@apple.com>
@@ -213,7 +213,7 @@
 
         '''
 
-        self.assertEquals(57569, parse_bug_id_from_changelog(commit_text))
+        self.assertEqual(57569, parse_bug_id_from_changelog(commit_text))
 
         commit_text = '''
 2011-03-29  Timothy Hatcher  <timothy@apple.com>
@@ -230,24 +230,38 @@
         extract-localizable-strings does not complain about unbalanced single quotes.
         '''
 
-        self.assertEquals(57354, parse_bug_id_from_changelog(commit_text))
+        self.assertEqual(57354, parse_bug_id_from_changelog(commit_text))
 
     def test_parse_log_entries_from_changelog(self):
         changelog_file = StringIO(self._example_changelog)
         parsed_entries = list(ChangeLog.parse_entries_from_file(changelog_file))
-        self.assertEquals(len(parsed_entries), 9)
-        self.assertEquals(parsed_entries[0].reviewer_text(), "David Levin")
-        self.assertEquals(parsed_entries[1].author_email(), "ddkilzer@apple.com")
-        self.assertEquals(parsed_entries[2].reviewer_text(), "Mark Rowe")
-        self.assertEquals(parsed_entries[2].touched_files(), ["DumpRenderTree/mac/DumpRenderTreeWindow.mm"])
-        self.assertEquals(parsed_entries[3].author_name(), "Benjamin Poulain")
-        self.assertEquals(parsed_entries[3].touched_files(), ["platform/cf/KURLCFNet.cpp", "platform/mac/KURLMac.mm",
+        self.assertEqual(len(parsed_entries), 9)
+        self.assertEqual(parsed_entries[0].date_line(), u"2009-08-17  Tor Arne Vestb\xf8  <vestbo@webkit.org>")
+        self.assertEqual(parsed_entries[0].date(), "2009-08-17")
+        self.assertEqual(parsed_entries[0].reviewer_text(), "David Levin")
+        self.assertEqual(parsed_entries[0].is_touched_files_text_clean(), False)
+        self.assertEqual(parsed_entries[1].date_line(), "2009-08-16  David Kilzer  <ddkilzer@apple.com>")
+        self.assertEqual(parsed_entries[1].date(), "2009-08-16")
+        self.assertEqual(parsed_entries[1].author_email(), "ddkilzer@apple.com")
+        self.assertEqual(parsed_entries[1].touched_files_text(), "        * Scripts/bugzilla-tool:\n        * Scripts/modules/scm.py:\n")
+        self.assertEqual(parsed_entries[1].is_touched_files_text_clean(), True)
+        self.assertEqual(parsed_entries[2].reviewer_text(), "Mark Rowe")
+        self.assertEqual(parsed_entries[2].touched_files(), ["DumpRenderTree/mac/DumpRenderTreeWindow.mm"])
+        self.assertEqual(parsed_entries[2].touched_functions(), {"DumpRenderTree/mac/DumpRenderTreeWindow.mm": ["-[DumpRenderTreeWindow close]"]})
+        self.assertEqual(parsed_entries[2].is_touched_files_text_clean(), False)
+        self.assertEqual(parsed_entries[3].author_name(), "Benjamin Poulain")
+        self.assertEqual(parsed_entries[3].touched_files(), ["platform/cf/KURLCFNet.cpp", "platform/mac/KURLMac.mm",
             "WebCoreSupport/ChromeClientEfl.cpp", "ewk/ewk_private.h", "ewk/ewk_view.cpp"])
-        self.assertEquals(parsed_entries[4].reviewer_text(), "David Hyatt")
-        self.assertEquals(parsed_entries[5].reviewer_text(), "Adam Roben")
-        self.assertEquals(parsed_entries[6].reviewer_text(), "Tony Chang")
-        self.assertEquals(parsed_entries[7].reviewer_text(), None)
-        self.assertEquals(parsed_entries[8].reviewer_text(), 'Darin Adler')
+        self.assertEqual(parsed_entries[3].touched_functions(), {"platform/cf/KURLCFNet.cpp": ["WebCore::createCFURLFromBuffer", "WebCore::KURL::createCFURL"],
+            "platform/mac/KURLMac.mm": ["WebCore::KURL::operator NSURL *", "WebCore::KURL::createCFURL"],
+            "WebCoreSupport/ChromeClientEfl.cpp": ["WebCore::ChromeClientEfl::closeWindowSoon"], "ewk/ewk_private.h": [], "ewk/ewk_view.cpp": []})
+        self.assertEqual(parsed_entries[3].bug_description(), "[Mac] ResourceRequest's nsURLRequest() does not differentiate null and empty URLs with CFNetwork")
+        self.assertEqual(parsed_entries[4].reviewer_text(), "David Hyatt")
+        self.assertIsNone(parsed_entries[4].bug_description())
+        self.assertEqual(parsed_entries[5].reviewer_text(), "Adam Roben")
+        self.assertEqual(parsed_entries[6].reviewer_text(), "Tony Chang")
+        self.assertIsNone(parsed_entries[7].reviewer_text())
+        self.assertEqual(parsed_entries[8].reviewer_text(), 'Darin Adler')
 
     def test_parse_log_entries_from_annotated_file(self):
         # Note that there are trailing spaces on some of the lines intentionally.
@@ -285,28 +299,28 @@
             u"99187 andreas.kling@nokia.com \n")
 
         parsed_entries = list(ChangeLog.parse_entries_from_file(changelog_file))
-        self.assertEquals(parsed_entries[0].revision(), 100000)
-        self.assertEquals(parsed_entries[0].reviewer_text(), "Zoltan Herczeg")
-        self.assertEquals(parsed_entries[0].author_name(), u"Csaba Osztrogon\u00e1c")
-        self.assertEquals(parsed_entries[0].author_email(), "ossy@webkit.org")
-        self.assertEquals(parsed_entries[1].revision(), 93798)
-        self.assertEquals(parsed_entries[1].author_name(), "Alexey Proskuryakov")
-        self.assertEquals(parsed_entries[2].revision(), 99190)
-        self.assertEquals(parsed_entries[2].author_name(), "Andreas Kling")
-        self.assertEquals(parsed_entries[3].revision(), 99187)
-        self.assertEquals(parsed_entries[3].author_name(), "Andreas Kling")
+        self.assertEqual(parsed_entries[0].revision(), 100000)
+        self.assertEqual(parsed_entries[0].reviewer_text(), "Zoltan Herczeg")
+        self.assertEqual(parsed_entries[0].author_name(), u"Csaba Osztrogon\u00e1c")
+        self.assertEqual(parsed_entries[0].author_email(), "ossy@webkit.org")
+        self.assertEqual(parsed_entries[1].revision(), 93798)
+        self.assertEqual(parsed_entries[1].author_name(), "Alexey Proskuryakov")
+        self.assertEqual(parsed_entries[2].revision(), 99190)
+        self.assertEqual(parsed_entries[2].author_name(), "Andreas Kling")
+        self.assertEqual(parsed_entries[3].revision(), 99187)
+        self.assertEqual(parsed_entries[3].author_name(), "Andreas Kling")
 
     def _assert_parse_reviewer_text_and_list(self, text, expected_reviewer_text, expected_reviewer_text_list=None):
         reviewer_text, reviewer_text_list = ChangeLogEntry._parse_reviewer_text(text)
-        self.assertEquals(reviewer_text, expected_reviewer_text)
+        self.assertEqual(reviewer_text, expected_reviewer_text)
         if expected_reviewer_text_list:
-            self.assertEquals(reviewer_text_list, expected_reviewer_text_list)
+            self.assertEqual(reviewer_text_list, expected_reviewer_text_list)
         else:
-            self.assertEquals(reviewer_text_list, [expected_reviewer_text])
+            self.assertEqual(reviewer_text_list, [expected_reviewer_text])
 
     def _assert_parse_reviewer_text_list(self, text, expected_reviewer_text_list):
         reviewer_text, reviewer_text_list = ChangeLogEntry._parse_reviewer_text(text)
-        self.assertEquals(reviewer_text_list, expected_reviewer_text_list)
+        self.assertEqual(reviewer_text_list, expected_reviewer_text_list)
 
     def test_parse_reviewer_text(self):
         self._assert_parse_reviewer_text_and_list('  reviewed  by Ryosuke Niwa,   Oliver Hunt, and  Dimitri Glazkov',
@@ -388,8 +402,8 @@
 
     def _assert_fuzzy_reviewer_match(self, reviewer_text, expected_text_list, expected_contributors):
         unused, reviewer_text_list = ChangeLogEntry._parse_reviewer_text(reviewer_text)
-        self.assertEquals(reviewer_text_list, expected_text_list)
-        self.assertEquals(self._entry_with_reviewer(reviewer_text).reviewers(), self._contributors(expected_contributors))
+        self.assertEqual(reviewer_text_list, expected_text_list)
+        self.assertEqual(self._entry_with_reviewer(reviewer_text).reviewers(), self._contributors(expected_contributors))
 
     def test_fuzzy_reviewer_match__none(self):
         self._assert_fuzzy_reviewer_match('Reviewed by BUILD FIX', ['BUILD FIX'], [])
@@ -427,7 +441,7 @@
 
     def _assert_parse_authors(self, author_text, expected_contributors):
         parsed_authors = [(author['name'], author['email']) for author in self._entry_with_author(author_text).authors()]
-        self.assertEquals(parsed_authors, expected_contributors)
+        self.assertEqual(parsed_authors, expected_contributors)
 
     def test_parse_authors(self):
         self._assert_parse_authors(u'Aaron Colwell  <acolwell@chromium.org>', [(u'Aaron Colwell', u'acolwell@chromium.org')])
@@ -439,6 +453,10 @@
             [('New Contributor', 'new@webkit.org'), ('Noob', 'noob@webkit.org')])
         self._assert_parse_authors('Adam Barth  <abarth@webkit.org> && Benjamin Poulain  <bpoulain@apple.com>',
             [('Adam Barth', 'abarth@webkit.org'), ('Benjamin Poulain', 'bpoulain@apple.com')])
+        self._assert_parse_authors(u'Pawe\u0142 Hajdan, Jr.  <phajdan.jr@chromium.org>',
+            [(u'Pawe\u0142 Hajdan, Jr.', u'phajdan.jr@chromium.org')])
+        self._assert_parse_authors(u'Pawe\u0142 Hajdan, Jr.  <phajdan.jr@chromium.org>, Adam Barth  <abarth@webkit.org>',
+            [(u'Pawe\u0142 Hajdan, Jr.', u'phajdan.jr@chromium.org'), (u'Adam Barth', u'abarth@webkit.org')])
 
     def _assert_has_valid_reviewer(self, reviewer_line, expected):
         self.assertEqual(self._entry_with_reviewer(reviewer_line).has_valid_reviewer(), expected)
@@ -454,15 +472,59 @@
         self._assert_has_valid_reviewer("Rubber stamped by Eric Seidel.", True)
         self._assert_has_valid_reviewer("Unreviewed build fix.", True)
 
+    def test_is_touched_files_text_clean(self):
+        tests = [
+        ('''2013-01-30  Timothy Loh  <timloh@chromium.com>
+
+        Make ChangeLogEntry detect annotations by prepare-ChangeLog (Added/Removed/Copied from/Renamed from) as clean.
+        https://bugs.webkit.org/show_bug.cgi?id=108433
+
+        * Scripts/webkitpy/common/checkout/changelog.py:
+        (ChangeLogEntry.is_touched_files_text_clean):
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (test_is_touched_files_text_clean):
+''', True),
+        ('''2013-01-10  Alan Cutter  <alancutter@chromium.org>
+
+        Perform some file operations (automatically added comments).
+
+        * QueueStatusServer/config/charts.py: Copied from Tools/QueueStatusServer/model/queuelog.py.
+        (get_time_unit):
+        * QueueStatusServer/handlers/queuecharts.py: Added.
+        (QueueCharts):
+        * Scripts/webkitpy/tool/bot/testdata/webkit_sheriff_0.js: Removed.
+        * EWSTools/build-vm.sh: Renamed from Tools/EWSTools/cold-boot.sh.
+''', True),
+        ('''2013-01-30  Timothy Loh  <timloh@chromium.com>
+
+        Add unit test (manually added comment).
+
+        * Scripts/webkitpy/common/checkout/changelog_unittest.py:
+        (test_is_touched_files_text_clean): Added.
+''', False),
+        ('''2013-01-30  Timothy Loh  <timloh@chromium.com>
+
+        Add file (manually added comment).
+
+        * Scripts/webkitpy/common/checkout/super_changelog.py: Copied from the internet.
+''', False),
+        ]
+
+        for contents, expected_result in tests:
+            entry = ChangeLogEntry(contents)
+            self.assertEqual(entry.is_touched_files_text_clean(), expected_result)
+
     def test_latest_entry_parse(self):
         changelog_contents = u"%s\n%s" % (self._example_entry, self._example_changelog)
         changelog_file = StringIO(changelog_contents)
         latest_entry = ChangeLog.parse_latest_entry_from_file(changelog_file)
-        self.assertEquals(latest_entry.contents(), self._example_entry)
-        self.assertEquals(latest_entry.author_name(), "Peter Kasting")
-        self.assertEquals(latest_entry.author_email(), "pkasting@google.com")
-        self.assertEquals(latest_entry.reviewer_text(), u"Tor Arne Vestb\xf8")
-        self.assertEquals(latest_entry.touched_files(), ["DumpRenderTree/win/DumpRenderTree.vcproj", "DumpRenderTree/win/ImageDiff.vcproj", "DumpRenderTree/win/TestNetscapePlugin/TestNetscapePlugin.vcproj"])
+        self.assertEqual(latest_entry.contents(), self._example_entry)
+        self.assertEqual(latest_entry.author_name(), "Peter Kasting")
+        self.assertEqual(latest_entry.author_email(), "pkasting@google.com")
+        self.assertEqual(latest_entry.reviewer_text(), u"Tor Arne Vestb\xf8")
+        touched_files = ["DumpRenderTree/win/DumpRenderTree.vcproj", "DumpRenderTree/win/ImageDiff.vcproj", "DumpRenderTree/win/TestNetscapePlugin/TestNetscapePlugin.vcproj"]
+        self.assertEqual(latest_entry.touched_files(), touched_files)
+        self.assertEqual(latest_entry.touched_functions(), dict((f, []) for f in touched_files))
 
         self.assertTrue(latest_entry.reviewer())  # Make sure that our UTF8-based lookup of Tor works.
 
@@ -470,21 +532,8 @@
         changelog_contents = u"%s\n%s" % (self._example_entry, self._rolled_over_footer)
         changelog_file = StringIO(changelog_contents)
         latest_entry = ChangeLog.parse_latest_entry_from_file(changelog_file)
-        self.assertEquals(latest_entry.contents(), self._example_entry)
-        self.assertEquals(latest_entry.author_name(), "Peter Kasting")
-
-    @staticmethod
-    def _write_tmp_file_with_contents(byte_array):
-        assert(isinstance(byte_array, str))
-        (file_descriptor, file_path) = tempfile.mkstemp() # NamedTemporaryFile always deletes the file on close in python < 2.6
-        with os.fdopen(file_descriptor, "w") as file:
-            file.write(byte_array)
-        return file_path
-
-    @staticmethod
-    def _read_file_contents(file_path, encoding):
-        with codecs.open(file_path, "r", encoding) as file:
-            return file.read()
+        self.assertEqual(latest_entry.contents(), self._example_entry)
+        self.assertEqual(latest_entry.author_name(), "Peter Kasting")
 
     # FIXME: We really should be getting this from prepare-ChangeLog itself.
     _new_entry_boilerplate = '''2009-08-19  Eric Seidel  <eric@webkit.org>
@@ -536,50 +585,83 @@
 '''
 
     def test_set_reviewer(self):
+        fs = MockFileSystem()
+
         changelog_contents = u"%s\n%s" % (self._new_entry_boilerplate_with_bugurl, self._example_changelog)
-        changelog_path = self._write_tmp_file_with_contents(changelog_contents.encode("utf-8"))
         reviewer_name = 'Test Reviewer'
-        ChangeLog(changelog_path).set_reviewer(reviewer_name)
-        actual_contents = self._read_file_contents(changelog_path, "utf-8")
+        fs.write_text_file(self._changelog_path, changelog_contents)
+        ChangeLog(self._changelog_path, fs).set_reviewer(reviewer_name)
+        actual_contents = fs.read_text_file(self._changelog_path)
         expected_contents = changelog_contents.replace('NOBODY (OOPS!)', reviewer_name)
-        os.remove(changelog_path)
-        self.assertEquals(actual_contents.splitlines(), expected_contents.splitlines())
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
 
         changelog_contents_without_reviewer_line = u"%s\n%s" % (self._new_entry_boilerplate_without_reviewer_line, self._example_changelog)
-        changelog_path = self._write_tmp_file_with_contents(changelog_contents_without_reviewer_line.encode("utf-8"))
-        ChangeLog(changelog_path).set_reviewer(reviewer_name)
-        actual_contents = self._read_file_contents(changelog_path, "utf-8")
-        os.remove(changelog_path)
-        self.assertEquals(actual_contents.splitlines(), expected_contents.splitlines())
+        fs.write_text_file(self._changelog_path, changelog_contents_without_reviewer_line)
+        ChangeLog(self._changelog_path, fs).set_reviewer(reviewer_name)
+        actual_contents = fs.read_text_file(self._changelog_path)
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
 
         changelog_contents_without_reviewer_line = u"%s\n%s" % (self._new_entry_boilerplate_without_reviewer_multiple_bugurl, self._example_changelog)
-        changelog_path = self._write_tmp_file_with_contents(changelog_contents_without_reviewer_line.encode("utf-8"))
-        ChangeLog(changelog_path).set_reviewer(reviewer_name)
-        actual_contents = self._read_file_contents(changelog_path, "utf-8")
+        fs.write_text_file(self._changelog_path, changelog_contents_without_reviewer_line)
+        ChangeLog(self._changelog_path, fs).set_reviewer(reviewer_name)
+        actual_contents = fs.read_text_file(self._changelog_path)
         changelog_contents = u"%s\n%s" % (self._new_entry_boilerplate_with_multiple_bugurl, self._example_changelog)
         expected_contents = changelog_contents.replace('NOBODY (OOPS!)', reviewer_name)
-        os.remove(changelog_path)
-        self.assertEquals(actual_contents.splitlines(), expected_contents.splitlines())
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
 
     def test_set_short_description_and_bug_url(self):
+        fs = MockFileSystem()
+
         changelog_contents = u"%s\n%s" % (self._new_entry_boilerplate_with_bugurl, self._example_changelog)
-        changelog_path = self._write_tmp_file_with_contents(changelog_contents.encode("utf-8"))
+        fs.write_text_file(self._changelog_path, changelog_contents)
         short_description = "A short description"
         bug_url = "http://example.com/b/2344"
-        ChangeLog(changelog_path).set_short_description_and_bug_url(short_description, bug_url)
-        actual_contents = self._read_file_contents(changelog_path, "utf-8")
+        ChangeLog(self._changelog_path, fs).set_short_description_and_bug_url(short_description, bug_url)
+        actual_contents = fs.read_text_file(self._changelog_path)
         expected_message = "%s\n        %s" % (short_description, bug_url)
         expected_contents = changelog_contents.replace("Need a short description (OOPS!).", expected_message)
-        os.remove(changelog_path)
-        self.assertEquals(actual_contents.splitlines(), expected_contents.splitlines())
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
 
         changelog_contents = u"%s\n%s" % (self._new_entry_boilerplate, self._example_changelog)
-        changelog_path = self._write_tmp_file_with_contents(changelog_contents.encode("utf-8"))
+        fs.write_text_file(self._changelog_path, changelog_contents)
         short_description = "A short description 2"
         bug_url = "http://example.com/b/2345"
-        ChangeLog(changelog_path).set_short_description_and_bug_url(short_description, bug_url)
-        actual_contents = self._read_file_contents(changelog_path, "utf-8")
+        ChangeLog(self._changelog_path, fs).set_short_description_and_bug_url(short_description, bug_url)
+        actual_contents = fs.read_text_file(self._changelog_path)
         expected_message = "%s\n        %s" % (short_description, bug_url)
         expected_contents = changelog_contents.replace("Need a short description (OOPS!).\n        Need the bug URL (OOPS!).", expected_message)
-        os.remove(changelog_path)
-        self.assertEquals(actual_contents.splitlines(), expected_contents.splitlines())
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
+
+    def test_delete_entries(self):
+        fs = MockFileSystem()
+        fs.write_text_file(self._changelog_path, self._example_changelog)
+        ChangeLog(self._changelog_path, fs).delete_entries(8)
+        actual_contents = fs.read_text_file(self._changelog_path)
+        expected_contents = """2011-10-11  Antti Koivisto  <antti@apple.com>
+
+       Resolve regular and visited link style in a single pass
+       https://bugs.webkit.org/show_bug.cgi?id=69838
+
+       Reviewed by Darin Adler
+
+       We can simplify and speed up selector matching by removing the recursive matching done
+       to generate the style for the :visited pseudo selector. Both regular and visited link style
+       can be generated in a single pass through the style selector.
+
+== Rolled over to ChangeLog-2009-06-16 ==
+"""
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
+
+        ChangeLog(self._changelog_path, fs).delete_entries(2)
+        actual_contents = fs.read_text_file(self._changelog_path)
+        expected_contents = "== Rolled over to ChangeLog-2009-06-16 ==\n"
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
+
+
+    def test_prepend_text(self):
+        fs = MockFileSystem()
+        fs.write_text_file(self._changelog_path, self._example_changelog)
+        ChangeLog(self._changelog_path, fs).prepend_text(self._example_entry + "\n")
+        actual_contents = fs.read_text_file(self._changelog_path)
+        expected_contents = self._example_entry + "\n" + self._example_changelog
+        self.assertEqual(actual_contents.splitlines(), expected_contents.splitlines())
diff --git a/Tools/Scripts/webkitpy/common/checkout/checkout.py b/Tools/Scripts/webkitpy/common/checkout/checkout.py
index 8f45024..f599ace 100644
--- a/Tools/Scripts/webkitpy/common/checkout/checkout.py
+++ b/Tools/Scripts/webkitpy/common/checkout/checkout.py
@@ -35,7 +35,6 @@
 from webkitpy.common.checkout.deps import DEPS
 from webkitpy.common.memoized import memoized
 from webkitpy.common.system.executive import ScriptError
-from webkitpy.common.system.deprecated_logging import log
 
 
 # This class represents the WebKit-specific parts of the checkout (like ChangeLogs).
@@ -136,10 +135,10 @@
 
     def suggested_reviewers(self, git_commit, changed_files=None):
         changed_files = self.modified_non_changelogs(git_commit, changed_files)
-        commit_infos = self.recent_commit_infos_for_files(changed_files)
-        reviewers = [commit_info.reviewer() for commit_info in commit_infos if commit_info.reviewer()]
-        reviewers.extend([commit_info.author() for commit_info in commit_infos if commit_info.author() and commit_info.author().can_review])
-        return sorted(set(reviewers))
+        commit_infos = sorted(self.recent_commit_infos_for_files(changed_files), key=lambda info: info.revision(), reverse=True)
+        reviewers = filter(lambda person: person and person.can_review, sum(map(lambda info: [info.reviewer(), info.author()], commit_infos), []))
+        unique_reviewers = reduce(lambda suggestions, reviewer: suggestions + [reviewer if reviewer not in suggestions else None], reviewers, [])
+        return filter(lambda reviewer: reviewer, unique_reviewers)
 
     def bug_id_for_this_commit(self, git_commit, changed_files=None):
         try:
diff --git a/Tools/Scripts/webkitpy/common/checkout/checkout_unittest.py b/Tools/Scripts/webkitpy/common/checkout/checkout_unittest.py
index e9c2cdd..85e3dd4 100644
--- a/Tools/Scripts/webkitpy/common/checkout/checkout_unittest.py
+++ b/Tools/Scripts/webkitpy/common/checkout/checkout_unittest.py
@@ -30,7 +30,7 @@
 import os
 import shutil
 import tempfile
-import unittest
+import unittest2 as unittest
 
 from .checkout import Checkout
 from .changelog import ChangeLogEntry
@@ -141,7 +141,7 @@
         commit_message = checkout.commit_message_for_this_commit(git_commit=None, return_stderr=True)
         # Throw away the first line - a warning about unknown VCS root.
         commit_message.message_lines = commit_message.message_lines[1:]
-        self.assertEqual(commit_message.message(), self.expected_commit_message)
+        self.assertMultiLineEqual(commit_message.message(), self.expected_commit_message)
 
 
 class CheckoutTest(unittest.TestCase):
@@ -160,7 +160,7 @@
         checkout = self._make_checkout()
         checkout._scm.contents_at_revision = mock_contents_at_revision
         entry = checkout._latest_entry_for_changelog_at_revision("foo", "bar")
-        self.assertEqual(entry.contents(), _changelog1entry1)
+        self.assertMultiLineEqual(entry.contents(), _changelog1entry1)  # Pylint is confused about this line, pylint: disable=E1101
 
     # FIXME: This tests a hack around our current changed_files handling.
     # Right now changelog_entries_for_revision tries to fetch deleted files
@@ -191,10 +191,10 @@
         self.assertEqual(commitinfo.bug_id(), 36629)
         self.assertEqual(commitinfo.author_name(), u"Tor Arne Vestb\u00f8")
         self.assertEqual(commitinfo.author_email(), "vestbo@webkit.org")
-        self.assertEqual(commitinfo.reviewer_text(), None)
-        self.assertEqual(commitinfo.reviewer(), None)
+        self.assertIsNone(commitinfo.reviewer_text())
+        self.assertIsNone(commitinfo.reviewer())
         self.assertEqual(commitinfo.committer_email(), "committer@example.com")
-        self.assertEqual(commitinfo.committer(), None)
+        self.assertIsNone(commitinfo.committer())
         self.assertEqual(commitinfo.to_json(), {
             'bug_id': 36629,
             'author_email': 'vestbo@webkit.org',
@@ -207,7 +207,7 @@
         })
 
         checkout.changelog_entries_for_revision = lambda revision, changed_files=None: []
-        self.assertEqual(checkout.commit_info_for_revision(1), None)
+        self.assertIsNone(checkout.commit_info_for_revision(1))
 
     def test_bug_id_for_revision(self):
         checkout = self._make_checkout()
@@ -259,5 +259,5 @@
         mock_patch = Mock()
         mock_patch.contents = lambda: "foo"
         mock_patch.reviewer = lambda: None
-        expected_stderr = "MOCK run_command: ['svn-apply', '--force'], cwd=/mock-checkout, input=foo\n"
-        OutputCapture().assert_outputs(self, checkout.apply_patch, [mock_patch], expected_stderr=expected_stderr)
+        expected_logs = "MOCK run_command: ['svn-apply', '--force'], cwd=/mock-checkout, input=foo\n"
+        OutputCapture().assert_outputs(self, checkout.apply_patch, [mock_patch], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/common/checkout/commitinfo_unittest.py b/Tools/Scripts/webkitpy/common/checkout/commitinfo_unittest.py
index f58e6f1..826673d 100644
--- a/Tools/Scripts/webkitpy/common/checkout/commitinfo_unittest.py
+++ b/Tools/Scripts/webkitpy/common/checkout/commitinfo_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.checkout.commitinfo import CommitInfo
 from webkitpy.common.config.committers import CommitterList, Committer, Reviewer
diff --git a/Tools/Scripts/webkitpy/common/checkout/deps_mock.py b/Tools/Scripts/webkitpy/common/checkout/deps_mock.py
index cb57e8b..423deba 100644
--- a/Tools/Scripts/webkitpy/common/checkout/deps_mock.py
+++ b/Tools/Scripts/webkitpy/common/checkout/deps_mock.py
@@ -26,8 +26,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 
-from webkitpy.common.system.deprecated_logging import log
+_log = logging.getLogger(__name__)
 
 
 class MockDEPS(object):
@@ -35,4 +36,4 @@
         return 6564
 
     def write_variable(self, name, value):
-        log("MOCK: MockDEPS.write_variable(%s, %s)" % (name, value))
+        _log.info("MOCK: MockDEPS.write_variable(%s, %s)" % (name, value))
diff --git a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
index 2ed552c..3a9ea92 100644
--- a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
+++ b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
@@ -58,7 +58,7 @@
     # These regexp patterns should be compiled once instead of every time.
     conversion_patterns = (("^diff --git \w/(.+) \w/(?P<FilePath>.+)", lambda matched: "Index: " + matched.group('FilePath') + "\n"),
                            ("^new file.*", lambda matched: "\n"),
-                           ("^index [0-9a-f]{7}\.\.[0-9a-f]{7} [0-9]{6}", lambda matched: "===================================================================\n"),
+                           ("^index (([0-9a-f]{7}\.\.[0-9a-f]{7})|([0-9a-f]{40}\.\.[0-9a-f]{40})) [0-9]{6}", lambda matched: "===================================================================\n"),
                            ("^--- \w/(?P<FilePath>.+)", lambda matched: "--- " + matched.group('FilePath') + "\n"),
                            ("^\+\+\+ \w/(?P<FilePath>.+)", lambda matched: "+++ " + matched.group('FilePath') + "\n"))
 
@@ -69,19 +69,27 @@
     return line
 
 
+# This function exists so we can unittest get_diff_converter function
+def svn_diff_to_svn_diff(line):
+    return line
+
+
 # FIXME: This method belongs on DiffParser
-def get_diff_converter(first_diff_line):
+def get_diff_converter(lines):
     """Gets a converter function of diff lines.
 
     Args:
-      first_diff_line: The first filename line of a diff file.
-                       If this line is git formatted, we'll return a
-                       converter from git to SVN.
+      lines: The lines of a diff file.
+             If this line is git formatted, we'll return a
+             converter from git to SVN.
     """
-    if match(r"^diff --git \w/", first_diff_line):
-        return git_diff_to_svn_diff
-    return lambda input: input
-
+    for i, line in enumerate(lines[:-1]):
+        # Stop when we find the first patch
+        if line[:3] == "+++" and lines[i + 1] == "---":
+            break
+        if match(r"^diff --git \w/", line):
+            return git_diff_to_svn_diff
+    return svn_diff_to_svn_diff
 
 _INITIAL_STATE = 1
 _DECLARED_FILE_PATH = 2
@@ -142,10 +150,9 @@
         current_file = None
         old_diff_line = None
         new_diff_line = None
+        transform_line = get_diff_converter(diff_input)
         for line in diff_input:
             line = line.rstrip("\n")
-            if state == _INITIAL_STATE:
-                transform_line = get_diff_converter(line)
             line = transform_line(line)
 
             file_declaration = match(r"^Index: (?P<FilePath>.+)", line)
diff --git a/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py b/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py
index d61a098..78dab26 100644
--- a/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py
+++ b/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py
@@ -26,54 +26,93 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import cStringIO as StringIO
+import unittest2 as unittest
 import diff_parser
 import re
 
 from webkitpy.common.checkout.diff_test_data import DIFF_TEST_DATA
 
 class DiffParserTest(unittest.TestCase):
+    maxDiff = None
+
     def test_diff_parser(self, parser = None):
         if not parser:
             parser = diff_parser.DiffParser(DIFF_TEST_DATA.splitlines())
-        self.assertEquals(3, len(parser.files))
+        self.assertEqual(3, len(parser.files))
 
         self.assertTrue('WebCore/rendering/style/StyleFlexibleBoxData.h' in parser.files)
         diff = parser.files['WebCore/rendering/style/StyleFlexibleBoxData.h']
-        self.assertEquals(7, len(diff.lines))
+        self.assertEqual(7, len(diff.lines))
         # The first two unchaged lines.
-        self.assertEquals((47, 47), diff.lines[0][0:2])
-        self.assertEquals('', diff.lines[0][2])
-        self.assertEquals((48, 48), diff.lines[1][0:2])
-        self.assertEquals('    unsigned align : 3; // EBoxAlignment', diff.lines[1][2])
+        self.assertEqual((47, 47), diff.lines[0][0:2])
+        self.assertEqual('', diff.lines[0][2])
+        self.assertEqual((48, 48), diff.lines[1][0:2])
+        self.assertEqual('    unsigned align : 3; // EBoxAlignment', diff.lines[1][2])
         # The deleted line
-        self.assertEquals((50, 0), diff.lines[3][0:2])
-        self.assertEquals('    unsigned orient: 1; // EBoxOrient', diff.lines[3][2])
+        self.assertEqual((50, 0), diff.lines[3][0:2])
+        self.assertEqual('    unsigned orient: 1; // EBoxOrient', diff.lines[3][2])
 
         # The first file looks OK. Let's check the next, more complicated file.
         self.assertTrue('WebCore/rendering/style/StyleRareInheritedData.cpp' in parser.files)
         diff = parser.files['WebCore/rendering/style/StyleRareInheritedData.cpp']
         # There are 3 chunks.
-        self.assertEquals(7 + 7 + 9, len(diff.lines))
+        self.assertEqual(7 + 7 + 9, len(diff.lines))
         # Around an added line.
-        self.assertEquals((60, 61), diff.lines[9][0:2])
-        self.assertEquals((0, 62), diff.lines[10][0:2])
-        self.assertEquals((61, 63), diff.lines[11][0:2])
+        self.assertEqual((60, 61), diff.lines[9][0:2])
+        self.assertEqual((0, 62), diff.lines[10][0:2])
+        self.assertEqual((61, 63), diff.lines[11][0:2])
         # Look through the last chunk, which contains both add's and delete's.
-        self.assertEquals((81, 83), diff.lines[14][0:2])
-        self.assertEquals((82, 84), diff.lines[15][0:2])
-        self.assertEquals((83, 85), diff.lines[16][0:2])
-        self.assertEquals((84, 0), diff.lines[17][0:2])
-        self.assertEquals((0, 86), diff.lines[18][0:2])
-        self.assertEquals((0, 87), diff.lines[19][0:2])
-        self.assertEquals((85, 88), diff.lines[20][0:2])
-        self.assertEquals((86, 89), diff.lines[21][0:2])
-        self.assertEquals((87, 90), diff.lines[22][0:2])
+        self.assertEqual((81, 83), diff.lines[14][0:2])
+        self.assertEqual((82, 84), diff.lines[15][0:2])
+        self.assertEqual((83, 85), diff.lines[16][0:2])
+        self.assertEqual((84, 0), diff.lines[17][0:2])
+        self.assertEqual((0, 86), diff.lines[18][0:2])
+        self.assertEqual((0, 87), diff.lines[19][0:2])
+        self.assertEqual((85, 88), diff.lines[20][0:2])
+        self.assertEqual((86, 89), diff.lines[21][0:2])
+        self.assertEqual((87, 90), diff.lines[22][0:2])
 
         # Check if a newly added file is correctly handled.
         diff = parser.files['LayoutTests/platform/mac/fast/flexbox/box-orient-button-expected.checksum']
-        self.assertEquals(1, len(diff.lines))
-        self.assertEquals((0, 1), diff.lines[0][0:2])
+        self.assertEqual(1, len(diff.lines))
+        self.assertEqual((0, 1), diff.lines[0][0:2])
+
+    def test_diff_converter(self):
+        comment_lines = [
+            "Hey guys,\n",
+            "\n",
+            "See my awesome patch below!\n",
+            "\n",
+            " - Cool Hacker\n",
+            "\n",
+            ]
+
+        revision_lines = [
+            "Subversion Revision 289799\n",
+            ]
+
+        svn_diff_lines = [
+            "Index: Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "===================================================================\n",
+            "--- Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "+++ Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "@@ -59,6 +59,7 @@ def git_diff_to_svn_diff(line):\n",
+            ]
+        self.assertEqual(diff_parser.get_diff_converter(svn_diff_lines), diff_parser.svn_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(comment_lines + svn_diff_lines), diff_parser.svn_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(revision_lines + svn_diff_lines), diff_parser.svn_diff_to_svn_diff)
+
+        git_diff_lines = [
+            "diff --git a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "index 3c5b45b..0197ead 100644\n",
+            "--- a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "+++ b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "@@ -59,6 +59,7 @@ def git_diff_to_svn_diff(line):\n",
+            ]
+        self.assertEqual(diff_parser.get_diff_converter(git_diff_lines), diff_parser.git_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(comment_lines + git_diff_lines), diff_parser.git_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(revision_lines + git_diff_lines), diff_parser.git_diff_to_svn_diff)
 
     def test_git_mnemonicprefix(self):
         p = re.compile(r' ([a|b])/')
@@ -90,5 +129,47 @@
             patch = p.sub(lambda x: " %s/" % prefix[x.group(1)], DIFF_TEST_DATA)
             self.test_diff_parser(diff_parser.DiffParser(patch.splitlines()))
 
-if __name__ == '__main__':
-    unittest.main()
+    def test_git_diff_to_svn_diff(self):
+        output = """\
+Index: Tools/Scripts/webkitpy/common/checkout/diff_parser.py
+===================================================================
+--- Tools/Scripts/webkitpy/common/checkout/diff_parser.py
++++ Tools/Scripts/webkitpy/common/checkout/diff_parser.py
+@@ -59,6 +59,7 @@ def git_diff_to_svn_diff(line):
+ A
+ B
+ C
++D
+ E
+ F
+"""
+
+        inputfmt = StringIO.StringIO("""\
+diff --git a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
+index 2ed552c4555db72df16b212547f2c125ae301a04..72870482000c0dba64ce4300ed782c03ee79b74f 100644
+--- a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
++++ b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
+@@ -59,6 +59,7 @@ def git_diff_to_svn_diff(line):
+ A
+ B
+ C
++D
+ E
+ F
+""")
+        shortfmt = StringIO.StringIO("""\
+diff --git a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
+index b48b162..f300960 100644
+--- a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
++++ b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py
+@@ -59,6 +59,7 @@ def git_diff_to_svn_diff(line):
+ A
+ B
+ C
++D
+ E
+ F
+""")
+
+        self.assertMultiLineEqual(output, ''.join(diff_parser.git_diff_to_svn_diff(x) for x in shortfmt.readlines()))
+        self.assertMultiLineEqual(output, ''.join(diff_parser.git_diff_to_svn_diff(x) for x in inputfmt.readlines()))
diff --git a/Tools/Scripts/webkitpy/common/checkout/scm/detection.py b/Tools/Scripts/webkitpy/common/checkout/scm/detection.py
index 44bc926..e635b40 100644
--- a/Tools/Scripts/webkitpy/common/checkout/scm/detection.py
+++ b/Tools/Scripts/webkitpy/common/checkout/scm/detection.py
@@ -27,14 +27,16 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.common.system.filesystem import FileSystem
 from webkitpy.common.system.executive import Executive
 
-from webkitpy.common.system.deprecated_logging import log
-
 from .svn import SVN
 from .git import Git
 
+_log = logging.getLogger(__name__)
+
 
 class SCMDetector(object):
     def __init__(self, filesystem, executive):
@@ -55,7 +57,7 @@
             script_directory = self._filesystem.dirname(self._filesystem.path_to_module(self.__module__))
             scm_system = self.detect_scm_system(script_directory, patch_directories)
             if scm_system:
-                log("The current directory (%s) is not a WebKit checkout, using %s" % (cwd, scm_system.checkout_root))
+                _log.info("The current directory (%s) is not a WebKit checkout, using %s" % (cwd, scm_system.checkout_root))
             else:
                 raise Exception("FATAL: Failed to determine the SCM system for either %s or %s" % (cwd, script_directory))
         return scm_system
diff --git a/Tools/Scripts/webkitpy/common/checkout/scm/detection_unittest.py b/Tools/Scripts/webkitpy/common/checkout/scm/detection_unittest.py
index ecd9125..593f093 100644
--- a/Tools/Scripts/webkitpy/common/checkout/scm/detection_unittest.py
+++ b/Tools/Scripts/webkitpy/common/checkout/scm/detection_unittest.py
@@ -28,7 +28,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from .detection import SCMDetector
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -42,7 +42,10 @@
         executive = MockExecutive(should_log=True)
         detector = SCMDetector(filesystem, executive)
 
-        expected_stderr = "MOCK run_command: ['svn', 'info'], cwd=/\nMOCK run_command: ['git', 'rev-parse', '--is-inside-work-tree'], cwd=/\n"
-        scm = OutputCapture().assert_outputs(self, detector.detect_scm_system, ["/"], expected_stderr=expected_stderr)
-        self.assertEqual(scm, None)
+        expected_logs = """\
+MOCK run_command: ['svn', 'info'], cwd=/
+MOCK run_command: ['git', 'rev-parse', '--is-inside-work-tree'], cwd=/
+"""
+        scm = OutputCapture().assert_outputs(self, detector.detect_scm_system, ["/"], expected_logs=expected_logs)
+        self.assertIsNone(scm)
         # FIXME: This should make a synthetic tree and test SVN and Git detection in that tree.
diff --git a/Tools/Scripts/webkitpy/common/checkout/scm/git.py b/Tools/Scripts/webkitpy/common/checkout/scm/git.py
index f688238..a29cead 100644
--- a/Tools/Scripts/webkitpy/common/checkout/scm/git.py
+++ b/Tools/Scripts/webkitpy/common/checkout/scm/git.py
@@ -27,32 +27,27 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import datetime
 import logging
 import os
 import re
 
 from webkitpy.common.memoized import memoized
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.executive import Executive, ScriptError
 
 from .commitmessage import CommitMessage
 from .scm import AuthenticationError, SCM, commit_error_handler
 from .svn import SVN, SVNRepository
 
-
 _log = logging.getLogger(__name__)
 
 
-def run_command(*args, **kwargs):
-    # FIXME: This should not be a global static.
-    # New code should use Executive.run_command directly instead
-    return Executive().run_command(*args, **kwargs)
-
-
 class AmbiguousCommitError(Exception):
-    def __init__(self, num_local_commits, working_directory_is_clean):
+    def __init__(self, num_local_commits, has_working_directory_changes):
+        Exception.__init__(self, "Found %s local commits and the working directory is %s" % (
+            num_local_commits, ["clean", "not clean"][has_working_directory_changes]))
         self.num_local_commits = num_local_commits
-        self.working_directory_is_clean = working_directory_is_clean
+        self.has_working_directory_changes = has_working_directory_changes
 
 
 class Git(SCM, SVNRepository):
@@ -96,7 +91,7 @@
             return
 
         webkit_dev_thread_url = "https://lists.webkit.org/pipermail/webkit-dev/2010-December/015287.html"
-        log("Warning: This machine is 64-bit, but the git binary (%s) does not support 64-bit.\nInstall a 64-bit git for better performance, see:\n%s\n" % (git_path, webkit_dev_thread_url))
+        _log.warning("This machine is 64-bit, but the git binary (%s) does not support 64-bit.\nInstall a 64-bit git for better performance, see:\n%s\n" % (git_path, webkit_dev_thread_url))
 
     def _run_git(self, command_args, **kwargs):
         full_command_args = [self.executable_name] + command_args
@@ -128,12 +123,13 @@
         return filepath.replace(root_end_with_slash, '')
 
     @classmethod
-    def read_git_config(cls, key, cwd=None):
+    def read_git_config(cls, key, cwd=None, executive=None):
         # FIXME: This should probably use cwd=self.checkout_root.
         # Pass --get-all for cases where the config has multiple values
         # Pass the cwd if provided so that we can handle the case of running webkit-patch outside of the working directory.
         # FIXME: This should use an Executive.
-        return run_command([cls.executable_name, "config", "--get-all", key], error_handler=Executive.ignore_error, cwd=cwd).rstrip('\n')
+        executive = executive or Executive()
+        return executive.run_command([cls.executable_name, "config", "--get-all", key], error_handler=Executive.ignore_error, cwd=cwd).rstrip('\n')
 
     @staticmethod
     def commit_success_regexp():
@@ -148,13 +144,13 @@
     def rebase_in_progress(self):
         return self._filesystem.exists(self.absolute_path(self._filesystem.join('.git', 'rebase-apply')))
 
-    def working_directory_is_clean(self):
-        return self._run_git(['diff', 'HEAD', '--no-renames', '--name-only']) == ""
+    def has_working_directory_changes(self):
+        return self._run_git(['diff', 'HEAD', '--no-renames', '--name-only']) != ""
 
-    def clean_working_directory(self):
-        # Could run git clean here too, but that wouldn't match working_directory_is_clean
-        self._run_git(['reset', '--hard', 'HEAD'])
-        # Aborting rebase even though this does not match working_directory_is_clean
+    def discard_working_directory_changes(self):
+        # Could run git clean here too, but that wouldn't match subversion
+        self._run_git(['reset', 'HEAD', '--hard'])
+        # Aborting rebase even though this does not match subversion
         if self.rebase_in_progress():
             self._run_git(['rebase', '--abort'])
 
@@ -184,7 +180,7 @@
 
     def _upstream_branch(self):
         current_branch = self._current_branch()
-        return self._branch_from_ref(self.read_git_config('branch.%s.merge' % current_branch, cwd=self.checkout_root).strip())
+        return self._branch_from_ref(self.read_git_config('branch.%s.merge' % current_branch, cwd=self.checkout_root, executive=self._executive).strip())
 
     def merge_base(self, git_commit):
         if git_commit:
@@ -250,14 +246,33 @@
     def display_name(self):
         return "git"
 
+    def _most_recent_log_matching(self, grep_str, path):
+        # We use '--grep=' + foo rather than '--grep', foo because
+        # git 1.7.0.4 (and earlier) didn't support the separate arg.
+        return self._run_git(['log', '-1', '--grep=' + grep_str, '--date=iso', self.find_checkout_root(path)])
+
     def svn_revision(self, path):
-        _log.debug('Running git.head_svn_revision... (Temporary logging message)')
-        git_log = self._run_git(['log', '-25', path])
+        git_log = self._most_recent_log_matching('git-svn-id:', path)
         match = re.search("^\s*git-svn-id:.*@(?P<svn_revision>\d+)\ ", git_log, re.MULTILINE)
         if not match:
             return ""
         return str(match.group('svn_revision'))
 
+    def timestamp_of_revision(self, path, revision):
+        git_log = self._most_recent_log_matching('git-svn-id:.*@%s' % revision, path)
+        match = re.search("^Date:\s*(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}) ([+-])(\d{2})(\d{2})$", git_log, re.MULTILINE)
+        if not match:
+            return ""
+
+        # Manually modify the timezone since Git doesn't have an option to show it in UTC.
+        # Git also truncates milliseconds but we're going to ignore that for now.
+        time_with_timezone = datetime.datetime(int(match.group(1)), int(match.group(2)), int(match.group(3)),
+            int(match.group(4)), int(match.group(5)), int(match.group(6)), 0)
+
+        sign = 1 if match.group(7) == '+' else -1
+        time_without_timezone = time_with_timezone - datetime.timedelta(hours=sign * int(match.group(8)), minutes=int(match.group(9)))
+        return time_without_timezone.strftime('%Y-%m-%dT%H:%M:%SZ')
+
     def prepend_svn_revision(self, diff):
         revision = self.head_svn_revision()
         if not revision:
@@ -295,6 +310,9 @@
 
     @memoized
     def git_commit_from_svn_revision(self, svn_revision):
+        # FIXME: https://bugs.webkit.org/show_bug.cgi?id=111668
+        # We should change this to run git log --grep 'git-svn-id' instead
+        # so that we don't require git+svn to be set up.
         git_commit = self._run_git_svn_find_rev('r%s' % svn_revision)
         if not git_commit:
             # FIXME: Alternatively we could offer to update the checkout? Or return None?
@@ -336,30 +354,30 @@
     def revert_files(self, file_paths):
         self._run_git(['checkout', 'HEAD'] + file_paths)
 
-    def _assert_can_squash(self, working_directory_is_clean):
-        squash = Git.read_git_config('webkit-patch.commit-should-always-squash', cwd=self.checkout_root)
+    def _assert_can_squash(self, has_working_directory_changes):
+        squash = self.read_git_config('webkit-patch.commit-should-always-squash', cwd=self.checkout_root, executive=self._executive)
         should_squash = squash and squash.lower() == "true"
 
         if not should_squash:
             # Only warn if there are actually multiple commits to squash.
             num_local_commits = len(self.local_commits())
-            if num_local_commits > 1 or (num_local_commits > 0 and not working_directory_is_clean):
-                raise AmbiguousCommitError(num_local_commits, working_directory_is_clean)
+            if num_local_commits > 1 or (num_local_commits > 0 and has_working_directory_changes):
+                raise AmbiguousCommitError(num_local_commits, has_working_directory_changes)
 
     def commit_with_message(self, message, username=None, password=None, git_commit=None, force_squash=False, changed_files=None):
         # Username is ignored during Git commits.
-        working_directory_is_clean = self.working_directory_is_clean()
+        has_working_directory_changes = self.has_working_directory_changes()
 
         if git_commit:
             # Special-case HEAD.. to mean working-copy changes only.
             if git_commit.upper() == 'HEAD..':
-                if working_directory_is_clean:
+                if not has_working_directory_changes:
                     raise ScriptError(message="The working copy is not modified. --git-commit=HEAD.. only commits working copy changes.")
                 self.commit_locally_with_message(message)
                 return self._commit_on_branch(message, 'HEAD', username=username, password=password)
 
             # Need working directory changes to be committed so we can checkout the merge branch.
-            if not working_directory_is_clean:
+            if has_working_directory_changes:
                 # FIXME: webkit-patch land will modify the ChangeLogs to correct the reviewer.
                 # That will modify the working-copy and cause us to hit this error.
                 # The ChangeLog modification could be made to modify the existing local commit.
@@ -367,7 +385,7 @@
             return self._commit_on_branch(message, git_commit, username=username, password=password)
 
         if not force_squash:
-            self._assert_can_squash(working_directory_is_clean)
+            self._assert_can_squash(has_working_directory_changes)
         self._run_git(['reset', '--soft', self.remote_merge_base()])
         self.commit_locally_with_message(message)
         return self.push_local_commits_to_server(username=username, password=password)
@@ -403,12 +421,12 @@
             self._run_git(['commit', '-m', message])
             output = self.push_local_commits_to_server(username=username, password=password)
         except Exception, e:
-            log("COMMIT FAILED: " + str(e))
+            _log.warning("COMMIT FAILED: " + str(e))
             output = "Commit failed."
             commit_succeeded = False
         finally:
             # And then swap back to the original branch and clean up.
-            self.clean_working_directory()
+            self.discard_working_directory_changes()
             self._run_git(['checkout', '-q', branch_name])
             self.delete_branch(MERGE_BRANCH_NAME)
 
@@ -437,7 +455,7 @@
 
     def remote_branch_ref(self):
         # Use references so that we can avoid collisions, e.g. we don't want to operate on refs/heads/trunk if it exists.
-        remote_branch_refs = Git.read_git_config('svn-remote.svn.fetch', cwd=self.checkout_root)
+        remote_branch_refs = self.read_git_config('svn-remote.svn.fetch', cwd=self.checkout_root, executive=self._executive)
         if not remote_branch_refs:
             remote_master_ref = 'refs/remotes/origin/master'
             if not self._branch_ref_exists(remote_master_ref):
@@ -454,8 +472,8 @@
 
     def push_local_commits_to_server(self, username=None, password=None):
         dcommit_command = ['svn', 'dcommit']
-        if (not username or not password) and not self.has_authorization_for_realm(SVN.svn_server_realm):
-            raise AuthenticationError(SVN.svn_server_host, prompt_for_password=True)
+        if (not username or not password) and not self.has_authorization_for_realm(self.svn_server_realm):
+            raise AuthenticationError(self.svn_server_host, prompt_for_password=True)
         if username:
             dcommit_command.extend(["--username", username])
         output = self._run_git(dcommit_command, error_handler=commit_error_handler, input=password)
diff --git a/Tools/Scripts/webkitpy/common/checkout/scm/scm.py b/Tools/Scripts/webkitpy/common/checkout/scm/scm.py
index 815e750..11e7ddb 100644
--- a/Tools/Scripts/webkitpy/common/checkout/scm/scm.py
+++ b/Tools/Scripts/webkitpy/common/checkout/scm/scm.py
@@ -31,11 +31,13 @@
 
 import logging
 import re
+import sys
 
-from webkitpy.common.system.deprecated_logging import error, log
 from webkitpy.common.system.executive import Executive, ScriptError
 from webkitpy.common.system.filesystem import FileSystem
 
+_log = logging.getLogger(__name__)
+
 
 class CheckoutNeedsUpdate(ScriptError):
     def __init__(self, script_args, exit_code, output, cwd):
@@ -88,25 +90,6 @@
     def script_path(self, script_name):
         return self._filesystem.join(self.scripts_directory(), script_name)
 
-    def ensure_clean_working_directory(self, force_clean):
-        if self.working_directory_is_clean():
-            return
-        if not force_clean:
-            print self.run(self.status_command(), error_handler=Executive.ignore_error, cwd=self.checkout_root)
-            raise ScriptError(message="Working directory has modifications, pass --force-clean or --no-clean to continue.")
-        log("Cleaning working directory")
-        self.clean_working_directory()
-
-    def ensure_no_local_commits(self, force):
-        if not self.supports_local_commits():
-            return
-        commits = self.local_commits()
-        if not len(commits):
-            return
-        if not force:
-            error("Working directory has local commits, pass --force-clean to continue.")
-        self.discard_local_commits()
-
     def run_status_and_extract_filenames(self, status_command, status_regexp):
         filenames = []
         # We run with cwd=self.checkout_root so that returned-paths are root-relative.
@@ -137,19 +120,13 @@
     def in_working_directory(cls, path, executive=None):
         SCM._subclass_must_implement()
 
-    def find_checkout_root(path):
+    def find_checkout_root(self, path):
         SCM._subclass_must_implement()
 
     @staticmethod
     def commit_success_regexp():
         SCM._subclass_must_implement()
 
-    def working_directory_is_clean(self):
-        self._subclass_must_implement()
-
-    def clean_working_directory(self):
-        self._subclass_must_implement()
-
     def status_command(self):
         self._subclass_must_implement()
 
@@ -190,6 +167,10 @@
         return self.svn_revision(self.checkout_root)
 
     def svn_revision(self, path):
+        """Returns the latest svn revision found in the checkout."""
+        self._subclass_must_implement()
+
+    def timestamp_of_revision(self, path, revision):
         self._subclass_must_implement()
 
     def create_patch(self, git_commit=None, changed_files=None):
@@ -228,20 +209,41 @@
     def svn_blame(self, path):
         self._subclass_must_implement()
 
+    def has_working_directory_changes(self):
+        self._subclass_must_implement()
+
+    def discard_working_directory_changes(self):
+        self._subclass_must_implement()
+
+    #--------------------------------------------------------------------------
     # Subclasses must indicate if they support local commits,
     # but the SCM baseclass will only call local_commits methods when this is true.
     @staticmethod
     def supports_local_commits():
         SCM._subclass_must_implement()
 
-    def remote_merge_base():
+    def local_commits(self):
+        return []
+
+    def has_local_commits(self):
+        return len(self.local_commits()) > 0
+
+    def discard_local_commits(self):
+        return
+
+    def remote_merge_base(self):
         SCM._subclass_must_implement()
 
     def commit_locally_with_message(self, message):
-        error("Your source control manager does not support local commits.")
+        _log.error("Your source control manager does not support local commits.")
+        sys.exit(1)
 
-    def discard_local_commits(self):
-        pass
+    def local_changes_exist(self):
+        return (self.supports_local_commits() and self.has_local_commits()) or self.has_working_directory_changes()
 
-    def local_commits(self):
-        return []
+    def discard_local_changes(self):
+        if self.has_working_directory_changes():
+            self.discard_working_directory_changes()
+
+        if self.has_local_commits():
+            self.discard_local_commits()
diff --git a/Tools/Scripts/webkitpy/common/checkout/scm/scm_mock.py b/Tools/Scripts/webkitpy/common/checkout/scm/scm_mock.py
index 9dd01e8..b701c34 100644
--- a/Tools/Scripts/webkitpy/common/checkout/scm/scm_mock.py
+++ b/Tools/Scripts/webkitpy/common/checkout/scm/scm_mock.py
@@ -26,6 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+from webkitpy.common.checkout.scm import CommitMessage
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.executive_mock import MockExecutive
 
@@ -45,13 +46,22 @@
         if return_exit_code:
             return 0
 
-    def ensure_clean_working_directory(self, force_clean):
+    def has_working_directory_changes(self):
+        return False
+
+    def discard_working_directory_changes(self):
         pass
 
     def supports_local_commits(self):
         return True
 
-    def ensure_no_local_commits(self, force_clean):
+    def has_local_commits(self):
+        return False
+
+    def discard_local_commits(self):
+        pass
+
+    def discard_local_changes(self):
         pass
 
     def exists(self, path):
@@ -74,6 +84,9 @@
     def svn_revision(self, path):
         return '5678'
 
+    def timestamp_of_revision(self, path, revision):
+        return '2013-02-01 08:48:05 +0000'
+
     def create_patch(self, git_commit, changed_files=None):
         return "Patch1"
 
diff --git a/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py b/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py
index 802fe2c..215edd1 100644
--- a/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py
+++ b/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py
@@ -40,7 +40,7 @@
 import subprocess
 import tempfile
 import time
-import unittest
+import unittest2 as unittest
 import urllib
 import shutil
 
@@ -49,14 +49,15 @@
 from webkitpy.common.config.committers import Committer  # FIXME: This should not be needed
 from webkitpy.common.net.bugzilla import Attachment # FIXME: This should not be needed
 from webkitpy.common.system.executive import Executive, ScriptError
+from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.system.executive_mock import MockExecutive
-
 from .git import Git, AmbiguousCommitError
 from .detection import detect_scm_system
 from .scm import SCM, CheckoutNeedsUpdate, commit_error_handler, AuthenticationError
 from .svn import SVN
 
+
 # We cache the mock SVN repo so that we don't create it again for each call to an SVNTest or GitTest test_ method.
 # We store it in a global variable so that we can delete this cached repo on exit(3).
 # FIXME: Remove this once we migrate to Python 2.7. Unittest in Python 2.7 supports module-specific setup and teardown functions.
@@ -125,7 +126,7 @@
 
 
 # Exists to share svn repository creation code between the git and svn tests
-class SVNTestRepository:
+class SVNTestRepository(object):
     @classmethod
     def _svn_add(cls, path):
         run_command(["svn", "add", path])
@@ -248,7 +249,7 @@
         command_returns_non_zero = ['/bin/sh', '--invalid-option']
         # Test when the input pipe process fails.
         input_process = subprocess.Popen(command_returns_non_zero, stdout=subprocess.PIPE, stderr=self.dev_null)
-        self.assertTrue(input_process.poll() != 0)
+        self.assertNotEqual(input_process.poll(), 0)
         self.assertRaises(ScriptError, run_command, ['grep', 'bar'], input=input_process.stdout)
 
         # Test when the run_command process fails.
@@ -299,18 +300,18 @@
 
     def _shared_test_changed_files(self):
         write_into_file_at_path("test_file", "changed content")
-        self.assertEqual(self.scm.changed_files(), ["test_file"])
+        self.assertItemsEqual(self.scm.changed_files(), ["test_file"])
         write_into_file_at_path("test_dir/test_file3", "new stuff")
-        self.assertEqual(self.scm.changed_files(), ["test_dir/test_file3", "test_file"])
+        self.assertItemsEqual(self.scm.changed_files(), ["test_dir/test_file3", "test_file"])
         old_cwd = os.getcwd()
         os.chdir("test_dir")
         # Validate that changed_files does not change with our cwd, see bug 37015.
-        self.assertEqual(self.scm.changed_files(), ["test_dir/test_file3", "test_file"])
+        self.assertItemsEqual(self.scm.changed_files(), ["test_dir/test_file3", "test_file"])
         os.chdir(old_cwd)
 
     def _shared_test_added_files(self):
         write_into_file_at_path("test_file", "changed content")
-        self.assertEqual(self.scm.added_files(), [])
+        self.assertItemsEqual(self.scm.added_files(), [])
 
         write_into_file_at_path("added_file", "new stuff")
         self.scm.add("added_file")
@@ -327,11 +328,11 @@
         added_files = self.scm.added_files()
         if "added_dir" in added_files:
             added_files.remove("added_dir")
-        self.assertEqual(added_files, ["added_dir/added_file2", "added_file", "added_file3", "added_file4"])
+        self.assertItemsEqual(added_files, ["added_dir/added_file2", "added_file", "added_file3", "added_file4"])
 
-        # Test also to make sure clean_working_directory removes added files
-        self.scm.clean_working_directory()
-        self.assertEqual(self.scm.added_files(), [])
+        # Test also to make sure discard_working_directory_changes removes added files
+        self.scm.discard_working_directory_changes()
+        self.assertItemsEqual(self.scm.added_files(), [])
         self.assertFalse(os.path.exists("added_file"))
         self.assertFalse(os.path.exists("added_file3"))
         self.assertFalse(os.path.exists("added_file4"))
@@ -342,9 +343,9 @@
         changed_files = self.scm.changed_files_for_revision(3)
         if "test_dir" in changed_files:
             changed_files.remove("test_dir")
-        self.assertEqual(changed_files, ["test_dir/test_file3", "test_file"])
-        self.assertEqual(sorted(self.scm.changed_files_for_revision(4)), sorted(["test_file", "test_file2"]))  # Git and SVN return different orders.
-        self.assertEqual(self.scm.changed_files_for_revision(2), ["test_file"])
+        self.assertItemsEqual(changed_files, ["test_dir/test_file3", "test_file"])
+        self.assertItemsEqual(self.scm.changed_files_for_revision(4), ["test_file", "test_file2"])  # Git and SVN return different orders.
+        self.assertItemsEqual(self.scm.changed_files_for_revision(2), ["test_file"])
 
     def _shared_test_contents_at_revision(self):
         self.assertEqual(self.scm.contents_at_revision("test_file", 3), "test1test2")
@@ -362,7 +363,7 @@
         self.assertRaises(ScriptError, self.scm.contents_at_revision, "does_not_exist", 2)
 
     def _shared_test_revisions_changing_file(self):
-        self.assertEqual(self.scm.revisions_changing_file("test_file"), [5, 4, 3, 2])
+        self.assertItemsEqual(self.scm.revisions_changing_file("test_file"), [5, 4, 3, 2])
         self.assertRaises(ScriptError, self.scm.revisions_changing_file, "non_existent_file")
 
     def _shared_test_committer_email_for_revision(self):
@@ -377,10 +378,10 @@
     def _shared_test_diff_for_revision(self):
         # Patch formats are slightly different between svn and git, so just regexp for things we know should be there.
         r3_patch = self.scm.diff_for_revision(4)
-        self.assertTrue(re.search('test3', r3_patch))
-        self.assertFalse(re.search('test4', r3_patch))
-        self.assertTrue(re.search('test2', r3_patch))
-        self.assertTrue(re.search('test2', self.scm.diff_for_revision(3)))
+        self.assertRegexpMatches(r3_patch, 'test3')
+        self.assertNotRegexpMatches(r3_patch, 'test4')
+        self.assertRegexpMatches(r3_patch, 'test2')
+        self.assertRegexpMatches(self.scm.diff_for_revision(3), 'test2')
 
     def _shared_test_svn_apply_git_patch(self):
         self._setup_webkittools_scripts_symlink(self.scm)
@@ -409,7 +410,7 @@
         added = read_from_path('fizzbuzz7.gif', encoding=None)
         self.assertEqual(512, len(added))
         self.assertTrue(added.startswith('GIF89a'))
-        self.assertTrue('fizzbuzz7.gif' in self.scm.changed_files())
+        self.assertIn('fizzbuzz7.gif', self.scm.changed_files())
 
         # The file already exists.
         self.assertRaises(ScriptError, self.checkout.apply_patch, self._create_patch(git_binary_addition))
@@ -436,7 +437,7 @@
         self.checkout.apply_patch(self._create_patch(git_binary_modification))
         modified = read_from_path('fizzbuzz7.gif', encoding=None)
         self.assertEqual('foobar\n', modified)
-        self.assertTrue('fizzbuzz7.gif' in self.scm.changed_files())
+        self.assertIn('fizzbuzz7.gif', self.scm.changed_files())
 
         # Applying the same modification should fail.
         self.assertRaises(ScriptError, self.checkout.apply_patch, self._create_patch(git_binary_modification))
@@ -454,7 +455,7 @@
 """
         self.checkout.apply_patch(self._create_patch(git_binary_deletion))
         self.assertFalse(os.path.exists('fizzbuzz7.gif'))
-        self.assertFalse('fizzbuzz7.gif' in self.scm.changed_files())
+        self.assertNotIn('fizzbuzz7.gif', self.scm.changed_files())
 
         # Cannot delete again.
         self.assertRaises(ScriptError, self.checkout.apply_patch, self._create_patch(git_binary_deletion))
@@ -463,15 +464,15 @@
         os.mkdir("added_dir")
         write_into_file_at_path("added_dir/added_file", "new stuff")
         self.scm.add("added_dir/added_file")
-        self.assertTrue("added_dir/added_file" in self.scm.added_files())
+        self.assertIn("added_dir/added_file", self.scm.added_files())
 
     def _shared_test_delete_recursively(self):
         os.mkdir("added_dir")
         write_into_file_at_path("added_dir/added_file", "new stuff")
         self.scm.add("added_dir/added_file")
-        self.assertTrue("added_dir/added_file" in self.scm.added_files())
+        self.assertIn("added_dir/added_file", self.scm.added_files())
         self.scm.delete("added_dir/added_file")
-        self.assertFalse("added_dir" in self.scm.added_files())
+        self.assertNotIn("added_dir", self.scm.added_files())
 
     def _shared_test_delete_recursively_or_not(self):
         os.mkdir("added_dir")
@@ -479,10 +480,10 @@
         write_into_file_at_path("added_dir/another_added_file", "more new stuff")
         self.scm.add("added_dir/added_file")
         self.scm.add("added_dir/another_added_file")
-        self.assertTrue("added_dir/added_file" in self.scm.added_files())
-        self.assertTrue("added_dir/another_added_file" in self.scm.added_files())
+        self.assertIn("added_dir/added_file", self.scm.added_files())
+        self.assertIn("added_dir/another_added_file", self.scm.added_files())
         self.scm.delete("added_dir/added_file")
-        self.assertTrue("added_dir/another_added_file" in self.scm.added_files())
+        self.assertIn("added_dir/another_added_file", self.scm.added_files())
 
     def _shared_test_exists(self, scm, commit_function):
         os.chdir(scm.checkout_root)
@@ -615,17 +616,18 @@
         self._setup_webkittools_scripts_symlink(self.scm)
         self.checkout.apply_patch(self._create_patch(one_line_overlap_patch))
         expected_changelog_contents = "%s\n%s" % (self._set_date_and_reviewer(one_line_overlap_entry), changelog_contents)
-        self.assertEquals(read_from_path('ChangeLog'), expected_changelog_contents)
+        self.assertEqual(read_from_path('ChangeLog'), expected_changelog_contents)
 
         self.scm.revert_files(['ChangeLog'])
         self.checkout.apply_patch(self._create_patch(two_line_overlap_patch))
         expected_changelog_contents = "%s\n%s" % (self._set_date_and_reviewer(two_line_overlap_entry), changelog_contents)
-        self.assertEquals(read_from_path('ChangeLog'), expected_changelog_contents)
+        self.assertEqual(read_from_path('ChangeLog'), expected_changelog_contents)
 
     def setUp(self):
         SVNTestRepository.setup(self)
         os.chdir(self.svn_checkout_path)
         self.scm = detect_scm_system(self.svn_checkout_path)
+        self.scm.svn_server_realm = None
         # For historical reasons, we test some checkout code here too.
         self.checkout = Checkout(self.scm)
 
@@ -661,9 +663,8 @@
         self.assertEqual("%s\n" % os.path.realpath(scm.checkout_root), patch_contents) # Add a \n because echo adds a \n.
 
     def test_detection(self):
-        scm = detect_scm_system(self.svn_checkout_path)
-        self.assertEqual(scm.display_name(), "svn")
-        self.assertEqual(scm.supports_local_commits(), False)
+        self.assertEqual(self.scm.display_name(), "svn")
+        self.assertEqual(self.scm.supports_local_commits(), False)
 
     def test_apply_small_binary_patch(self):
         patch_contents = """Index: test_file.swf
@@ -687,15 +688,14 @@
         self.assertEqual(actual_contents, expected_contents)
 
     def test_apply_svn_patch(self):
-        scm = detect_scm_system(self.svn_checkout_path)
         patch = self._create_patch(_svn_diff("-r5:4"))
-        self._setup_webkittools_scripts_symlink(scm)
-        Checkout(scm).apply_patch(patch)
+        self._setup_webkittools_scripts_symlink(self.scm)
+        Checkout(self.scm).apply_patch(patch)
 
     def test_commit_logs(self):
         # Commits have dates and usernames in them, so we can't just direct compare.
-        self.assertTrue(re.search('fourth commit', self.scm.last_svn_commit_log()))
-        self.assertTrue(re.search('second commit', self.scm.svn_commit_log(3)))
+        self.assertRegexpMatches(self.scm.last_svn_commit_log(), 'fourth commit')
+        self.assertRegexpMatches(self.scm.svn_commit_log(3), 'second commit')
 
     def _shared_test_commit_with_message(self, username=None):
         write_into_file_at_path('test_file', 'more test content')
@@ -716,7 +716,12 @@
         self._shared_test_commit_with_message("dbates@webkit.org")
 
     def test_commit_without_authorization(self):
-        self.scm.has_authorization_for_realm = lambda realm: False
+        # FIXME: https://bugs.webkit.org/show_bug.cgi?id=111669
+        # This test ends up looking in the actal $HOME/.subversion for authorization,
+        # which makes it fragile. For now, set it to use a realm that won't be authorized,
+        # but we should really plumb through a fake_home_dir here like we do in
+        # test_has_authorization_for_realm.
+        self.scm.svn_server_realm = '<http://svn.example.com:80> Example'
         self.assertRaises(AuthenticationError, self._shared_test_commit_with_message)
 
     def test_has_authorization_for_realm_using_credentials_with_passtype(self):
@@ -756,13 +761,12 @@
         self.assertTrue(self._test_has_authorization_for_realm_using_credentials(SVN.svn_server_realm, credentials))
 
     def _test_has_authorization_for_realm_using_credentials(self, realm, credentials):
-        scm = detect_scm_system(self.svn_checkout_path)
         fake_home_dir = tempfile.mkdtemp(suffix="fake_home_dir")
         svn_config_dir_path = os.path.join(fake_home_dir, ".subversion")
         os.mkdir(svn_config_dir_path)
         fake_webkit_auth_file = os.path.join(svn_config_dir_path, "fake_webkit_auth_file")
         write_into_file_at_path(fake_webkit_auth_file, credentials)
-        result = scm.has_authorization_for_realm(realm, home_directory=fake_home_dir)
+        result = self.scm.has_authorization_for_realm(realm, home_directory=fake_home_dir)
         os.remove(fake_webkit_auth_file)
         os.rmdir(svn_config_dir_path)
         os.rmdir(fake_home_dir)
@@ -783,11 +787,10 @@
         self.assertFalse(self._test_has_authorization_for_realm_using_credentials(SVN.svn_server_realm, credentials))
 
     def test_not_have_authorization_for_realm_when_missing_credentials_file(self):
-        scm = detect_scm_system(self.svn_checkout_path)
         fake_home_dir = tempfile.mkdtemp(suffix="fake_home_dir")
         svn_config_dir_path = os.path.join(fake_home_dir, ".subversion")
         os.mkdir(svn_config_dir_path)
-        self.assertFalse(scm.has_authorization_for_realm(SVN.svn_server_realm, home_directory=fake_home_dir))
+        self.assertFalse(self.scm.has_authorization_for_realm(SVN.svn_server_realm, home_directory=fake_home_dir))
         os.rmdir(svn_config_dir_path)
         os.rmdir(fake_home_dir)
 
@@ -824,13 +827,13 @@
     def test_delete(self):
         os.chdir(self.svn_checkout_path)
         self.scm.delete("test_file")
-        self.assertTrue("test_file" in self.scm.deleted_files())
+        self.assertIn("test_file", self.scm.deleted_files())
 
     def test_delete_list(self):
         os.chdir(self.svn_checkout_path)
         self.scm.delete_list(["test_file", "test_file2"])
-        self.assertTrue("test_file" in self.scm.deleted_files())
-        self.assertTrue("test_file2" in self.scm.deleted_files())
+        self.assertIn("test_file", self.scm.deleted_files())
+        self.assertIn("test_file2", self.scm.deleted_files())
 
     def test_delete_recursively(self):
         self._shared_test_delete_recursively()
@@ -867,8 +870,8 @@
 
         write_into_file_at_path("test_file", "changed content")
         diff = self.scm.diff_for_file('test_file')
-        self.assertTrue("-some content" in diff)
-        self.assertTrue("+changed content" in diff)
+        self.assertIn("-some content", diff)
+        self.assertIn("+changed content", diff)
 
     def clean_bogus_dir(self):
         self.bogus_dir = self.scm._bogus_dir_name()
@@ -892,7 +895,7 @@
         write_into_file_at_path(svn_root_lock_path, "", "utf-8")
         # webkit-patch uses a Checkout object and runs update-webkit, just use svn update here.
         self.assertRaises(ScriptError, run_command, ['svn', 'update'])
-        self.scm.clean_working_directory()
+        self.scm.discard_working_directory_changes()
         self.assertFalse(os.path.exists(svn_root_lock_path))
         run_command(['svn', 'update'])  # Should succeed and not raise.
 
@@ -946,7 +949,7 @@
         scm.commit_locally_with_message('message')
 
         patch = scm.create_patch()
-        self.assertFalse(re.search(r'Subversion Revision:', patch))
+        self.assertNotRegexpMatches(patch, r'Subversion Revision:')
 
     def test_orderfile(self):
         os.mkdir("Tools")
@@ -1008,7 +1011,7 @@
 
     def test_head_svn_revision(self):
         scm = detect_scm_system(self.untracking_checkout_path)
-        # If we cloned a git repo tracking an SVG repo, this would give the same result as
+        # If we cloned a git repo tracking an SVN repo, this would give the same result as
         # self._shared_test_head_svn_revision().
         self.assertEqual(scm.head_svn_revision(), '')
 
@@ -1019,8 +1022,8 @@
         scm.commit_locally_with_message('message')
 
         patch = scm.create_patch()
-        self.assertFalse(re.search(r'rename from ', patch))
-        self.assertFalse(re.search(r'rename to ', patch))
+        self.assertNotRegexpMatches(patch, r'rename from ')
+        self.assertNotRegexpMatches(patch, r'rename to ')
 
 
 class GitSVNTest(SCMTest):
@@ -1042,6 +1045,7 @@
         SVNTestRepository.setup(self)
         self._setup_git_checkout()
         self.scm = detect_scm_system(self.git_checkout_path)
+        self.scm.svn_server_realm = None
         # For historical reasons, we test some checkout code here too.
         self.checkout = Checkout(self.scm)
 
@@ -1050,9 +1054,8 @@
         self._tear_down_git_checkout()
 
     def test_detection(self):
-        scm = detect_scm_system(self.git_checkout_path)
-        self.assertEqual(scm.display_name(), "git")
-        self.assertEqual(scm.supports_local_commits(), True)
+        self.assertEqual(self.scm.display_name(), "git")
+        self.assertEqual(self.scm.supports_local_commits(), True)
 
     def test_read_git_config(self):
         key = 'test.git-config'
@@ -1085,7 +1088,7 @@
         run_command(['git', 'checkout', '-b', 'bar'])
         self.scm.delete_branch(new_branch)
 
-        self.assertFalse(re.search(r'foo', run_command(['git', 'branch'])))
+        self.assertNotRegexpMatches(run_command(['git', 'branch']), r'foo')
 
     def test_remote_merge_base(self):
         # Diff to merge-base should include working-copy changes,
@@ -1096,8 +1099,8 @@
         diff_to_common_base = _git_diff(self.scm.remote_branch_ref() + '..')
         diff_to_merge_base = _git_diff(self.scm.remote_merge_base())
 
-        self.assertFalse(re.search(r'foo', diff_to_common_base))
-        self.assertTrue(re.search(r'foo', diff_to_merge_base))
+        self.assertNotRegexpMatches(diff_to_common_base, r'foo')
+        self.assertRegexpMatches(diff_to_merge_base, r'foo')
 
     def test_rebase_in_progress(self):
         svn_test_file = os.path.join(self.svn_checkout_path, 'test_file')
@@ -1111,45 +1114,39 @@
         # --quiet doesn't make git svn silent, so use run_silent to redirect output
         self.assertRaises(ScriptError, run_silent, ['git', 'svn', '--quiet', 'rebase']) # Will fail due to a conflict leaving us mid-rebase.
 
-        scm = detect_scm_system(self.git_checkout_path)
-        self.assertTrue(scm.rebase_in_progress())
+        self.assertTrue(self.scm.rebase_in_progress())
 
         # Make sure our cleanup works.
-        scm.clean_working_directory()
-        self.assertFalse(scm.rebase_in_progress())
+        self.scm.discard_working_directory_changes()
+        self.assertFalse(self.scm.rebase_in_progress())
 
         # Make sure cleanup doesn't throw when no rebase is in progress.
-        scm.clean_working_directory()
+        self.scm.discard_working_directory_changes()
 
     def test_commitish_parsing(self):
-        scm = detect_scm_system(self.git_checkout_path)
-
         # Multiple revisions are cherry-picked.
-        self.assertEqual(len(scm.commit_ids_from_commitish_arguments(['HEAD~2'])), 1)
-        self.assertEqual(len(scm.commit_ids_from_commitish_arguments(['HEAD', 'HEAD~2'])), 2)
+        self.assertEqual(len(self.scm.commit_ids_from_commitish_arguments(['HEAD~2'])), 1)
+        self.assertEqual(len(self.scm.commit_ids_from_commitish_arguments(['HEAD', 'HEAD~2'])), 2)
 
         # ... is an invalid range specifier
-        self.assertRaises(ScriptError, scm.commit_ids_from_commitish_arguments, ['trunk...HEAD'])
+        self.assertRaises(ScriptError, self.scm.commit_ids_from_commitish_arguments, ['trunk...HEAD'])
 
     def test_commitish_order(self):
-        scm = detect_scm_system(self.git_checkout_path)
-
         commit_range = 'HEAD~3..HEAD'
 
-        actual_commits = scm.commit_ids_from_commitish_arguments([commit_range])
+        actual_commits = self.scm.commit_ids_from_commitish_arguments([commit_range])
         expected_commits = []
         expected_commits += reversed(run_command(['git', 'rev-list', commit_range]).splitlines())
 
         self.assertEqual(actual_commits, expected_commits)
 
     def test_apply_git_patch(self):
-        scm = detect_scm_system(self.git_checkout_path)
         # We carefullly pick a diff which does not have a directory addition
         # as currently svn-apply will error out when trying to remove directories
         # in Git: https://bugs.webkit.org/show_bug.cgi?id=34871
         patch = self._create_patch(_git_diff('HEAD..HEAD^'))
-        self._setup_webkittools_scripts_symlink(scm)
-        Checkout(scm).apply_patch(patch)
+        self._setup_webkittools_scripts_symlink(self.scm)
+        Checkout(self.scm).apply_patch(patch)
 
     def test_commit_text_parsing(self):
         write_into_file_at_path('test_file', 'more test content')
@@ -1159,12 +1156,11 @@
     def test_commit_with_message_working_copy_only(self):
         write_into_file_at_path('test_file_commit1', 'more test content')
         run_command(['git', 'add', 'test_file_commit1'])
-        scm = detect_scm_system(self.git_checkout_path)
-        commit_text = scm.commit_with_message("yet another test commit")
+        commit_text = self.scm.commit_with_message("yet another test commit")
 
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
 
     def _local_commit(self, filename, contents, message):
         write_into_file_at_path(filename, contents)
@@ -1192,117 +1188,107 @@
 
     def test_revisions_changing_files_with_local_commit(self):
         self._one_local_commit()
-        self.assertEquals(self.scm.revisions_changing_file('test_file_commit1'), [])
+        self.assertItemsEqual(self.scm.revisions_changing_file('test_file_commit1'), [])
 
     def test_commit_with_message(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
-        self.assertRaises(AmbiguousCommitError, scm.commit_with_message, "yet another test commit")
-        commit_text = scm.commit_with_message("yet another test commit", force_squash=True)
+        self.assertRaises(AmbiguousCommitError, self.scm.commit_with_message, "yet another test commit")
+        commit_text = self.scm.commit_with_message("yet another test commit", force_squash=True)
 
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertTrue(re.search(r'test_file_commit2', svn_log))
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
+        self.assertRegexpMatches(svn_log, r'test_file_commit2')
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
 
     def test_commit_with_message_git_commit(self):
         self._two_local_commits()
 
-        scm = detect_scm_system(self.git_checkout_path)
-        commit_text = scm.commit_with_message("another test commit", git_commit="HEAD^")
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        commit_text = self.scm.commit_with_message("another test commit", git_commit="HEAD^")
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
 
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
-        self.assertFalse(re.search(r'test_file_commit2', svn_log))
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
+        self.assertNotRegexpMatches(svn_log, r'test_file_commit2')
 
     def test_commit_with_message_git_commit_range(self):
         self._three_local_commits()
 
-        scm = detect_scm_system(self.git_checkout_path)
-        commit_text = scm.commit_with_message("another test commit", git_commit="HEAD~2..HEAD")
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        commit_text = self.scm.commit_with_message("another test commit", git_commit="HEAD~2..HEAD")
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
 
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertFalse(re.search(r'test_file_commit0', svn_log))
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
-        self.assertTrue(re.search(r'test_file_commit2', svn_log))
+        self.assertNotRegexpMatches(svn_log, r'test_file_commit0')
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
+        self.assertRegexpMatches(svn_log, r'test_file_commit2')
 
     def test_commit_with_message_only_local_commit(self):
         self._one_local_commit()
-        scm = detect_scm_system(self.git_checkout_path)
-        commit_text = scm.commit_with_message("another test commit")
+        commit_text = self.scm.commit_with_message("another test commit")
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
 
     def test_commit_with_message_multiple_local_commits_and_working_copy(self):
         self._two_local_commits()
         write_into_file_at_path('test_file_commit1', 'working copy change')
-        scm = detect_scm_system(self.git_checkout_path)
 
-        self.assertRaises(AmbiguousCommitError, scm.commit_with_message, "another test commit")
-        commit_text = scm.commit_with_message("another test commit", force_squash=True)
+        self.assertRaises(AmbiguousCommitError, self.scm.commit_with_message, "another test commit")
+        commit_text = self.scm.commit_with_message("another test commit", force_squash=True)
 
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertTrue(re.search(r'test_file_commit2', svn_log))
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
+        self.assertRegexpMatches(svn_log, r'test_file_commit2')
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
 
     def test_commit_with_message_git_commit_and_working_copy(self):
         self._two_local_commits()
         write_into_file_at_path('test_file_commit1', 'working copy change')
-        scm = detect_scm_system(self.git_checkout_path)
-        self.assertRaises(ScriptError, scm.commit_with_message, "another test commit", git_commit="HEAD^")
+        self.assertRaises(ScriptError, self.scm.commit_with_message, "another test commit", git_commit="HEAD^")
 
     def test_commit_with_message_multiple_local_commits_always_squash(self):
+        run_command(['git', 'config', 'webkit-patch.commit-should-always-squash', 'true'])
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        scm._assert_can_squash = lambda working_directory_is_clean: True
-        commit_text = scm.commit_with_message("yet another test commit")
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        commit_text = self.scm.commit_with_message("yet another test commit")
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
 
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertTrue(re.search(r'test_file_commit2', svn_log))
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
+        self.assertRegexpMatches(svn_log, r'test_file_commit2')
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
 
     def test_commit_with_message_multiple_local_commits(self):
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        self.assertRaises(AmbiguousCommitError, scm.commit_with_message, "yet another test commit")
-        commit_text = scm.commit_with_message("yet another test commit", force_squash=True)
+        self.assertRaises(AmbiguousCommitError, self.scm.commit_with_message, "yet another test commit")
+        commit_text = self.scm.commit_with_message("yet another test commit", force_squash=True)
 
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
 
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertTrue(re.search(r'test_file_commit2', svn_log))
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
+        self.assertRegexpMatches(svn_log, r'test_file_commit2')
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
 
     def test_commit_with_message_not_synced(self):
         run_command(['git', 'checkout', '-b', 'my-branch', 'trunk~3'])
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        self.assertRaises(AmbiguousCommitError, scm.commit_with_message, "another test commit")
-        commit_text = scm.commit_with_message("another test commit", force_squash=True)
+        self.assertRaises(AmbiguousCommitError, self.scm.commit_with_message, "another test commit")
+        commit_text = self.scm.commit_with_message("another test commit", force_squash=True)
 
-        self.assertEqual(scm.svn_revision_from_commit_text(commit_text), '6')
+        self.assertEqual(self.scm.svn_revision_from_commit_text(commit_text), '6')
 
         svn_log = run_command(['git', 'svn', 'log', '--limit=1', '--verbose'])
-        self.assertFalse(re.search(r'test_file2', svn_log))
-        self.assertTrue(re.search(r'test_file_commit2', svn_log))
-        self.assertTrue(re.search(r'test_file_commit1', svn_log))
+        self.assertNotRegexpMatches(svn_log, r'test_file2')
+        self.assertRegexpMatches(svn_log, r'test_file_commit2')
+        self.assertRegexpMatches(svn_log, r'test_file_commit1')
 
     def test_commit_with_message_not_synced_with_conflict(self):
         run_command(['git', 'checkout', '-b', 'my-branch', 'trunk~3'])
         self._local_commit('test_file2', 'asdf', 'asdf commit')
 
-        scm = detect_scm_system(self.git_checkout_path)
         # There's a conflict between trunk and the test_file2 modification.
-        self.assertRaises(ScriptError, scm.commit_with_message, "another test commit", force_squash=True)
+        self.assertRaises(ScriptError, self.scm.commit_with_message, "another test commit", force_squash=True)
 
     def test_upstream_branch(self):
         run_command(['git', 'checkout', '-t', '-b', 'my-branch'])
         run_command(['git', 'checkout', '-t', '-b', 'my-second-branch'])
-        self.assertEquals(self.scm._upstream_branch(), 'my-branch')
+        self.assertEqual(self.scm._upstream_branch(), 'my-branch')
 
     def test_remote_branch_ref(self):
         self.assertEqual(self.scm.remote_branch_ref(), 'refs/remotes/trunk')
@@ -1318,96 +1304,85 @@
 
     def test_create_patch_local_plus_working_copy(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch()
-        self.assertTrue(re.search(r'test_file_commit1', patch))
-        self.assertTrue(re.search(r'test_file_commit2', patch))
+        patch = self.scm.create_patch()
+        self.assertRegexpMatches(patch, r'test_file_commit1')
+        self.assertRegexpMatches(patch, r'test_file_commit2')
 
     def test_create_patch(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch()
-        self.assertTrue(re.search(r'test_file_commit2', patch))
-        self.assertTrue(re.search(r'test_file_commit1', patch))
-        self.assertTrue(re.search(r'Subversion Revision: 5', patch))
+        patch = self.scm.create_patch()
+        self.assertRegexpMatches(patch, r'test_file_commit2')
+        self.assertRegexpMatches(patch, r'test_file_commit1')
+        self.assertRegexpMatches(patch, r'Subversion Revision: 5')
 
     def test_create_patch_after_merge(self):
         run_command(['git', 'checkout', '-b', 'dummy-branch', 'trunk~3'])
         self._one_local_commit()
         run_command(['git', 'merge', 'trunk'])
 
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch()
-        self.assertTrue(re.search(r'test_file_commit1', patch))
-        self.assertTrue(re.search(r'Subversion Revision: 5', patch))
+        patch = self.scm.create_patch()
+        self.assertRegexpMatches(patch, r'test_file_commit1')
+        self.assertRegexpMatches(patch, r'Subversion Revision: 5')
 
     def test_create_patch_with_changed_files(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch(changed_files=['test_file_commit2'])
-        self.assertTrue(re.search(r'test_file_commit2', patch))
+        patch = self.scm.create_patch(changed_files=['test_file_commit2'])
+        self.assertRegexpMatches(patch, r'test_file_commit2')
 
     def test_create_patch_with_rm_and_changed_files(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
         os.remove('test_file_commit1')
-        patch = scm.create_patch()
-        patch_with_changed_files = scm.create_patch(changed_files=['test_file_commit1', 'test_file_commit2'])
-        self.assertEquals(patch, patch_with_changed_files)
+        patch = self.scm.create_patch()
+        patch_with_changed_files = self.scm.create_patch(changed_files=['test_file_commit1', 'test_file_commit2'])
+        self.assertEqual(patch, patch_with_changed_files)
 
     def test_create_patch_git_commit(self):
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch(git_commit="HEAD^")
-        self.assertTrue(re.search(r'test_file_commit1', patch))
-        self.assertFalse(re.search(r'test_file_commit2', patch))
+        patch = self.scm.create_patch(git_commit="HEAD^")
+        self.assertRegexpMatches(patch, r'test_file_commit1')
+        self.assertNotRegexpMatches(patch, r'test_file_commit2')
 
     def test_create_patch_git_commit_range(self):
         self._three_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch(git_commit="HEAD~2..HEAD")
-        self.assertFalse(re.search(r'test_file_commit0', patch))
-        self.assertTrue(re.search(r'test_file_commit2', patch))
-        self.assertTrue(re.search(r'test_file_commit1', patch))
+        patch = self.scm.create_patch(git_commit="HEAD~2..HEAD")
+        self.assertNotRegexpMatches(patch, r'test_file_commit0')
+        self.assertRegexpMatches(patch, r'test_file_commit2')
+        self.assertRegexpMatches(patch, r'test_file_commit1')
 
     def test_create_patch_working_copy_only(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch(git_commit="HEAD....")
-        self.assertFalse(re.search(r'test_file_commit1', patch))
-        self.assertTrue(re.search(r'test_file_commit2', patch))
+        patch = self.scm.create_patch(git_commit="HEAD....")
+        self.assertNotRegexpMatches(patch, r'test_file_commit1')
+        self.assertRegexpMatches(patch, r'test_file_commit2')
 
     def test_create_patch_multiple_local_commits(self):
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch()
-        self.assertTrue(re.search(r'test_file_commit2', patch))
-        self.assertTrue(re.search(r'test_file_commit1', patch))
+        patch = self.scm.create_patch()
+        self.assertRegexpMatches(patch, r'test_file_commit2')
+        self.assertRegexpMatches(patch, r'test_file_commit1')
 
     def test_create_patch_not_synced(self):
         run_command(['git', 'checkout', '-b', 'my-branch', 'trunk~3'])
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        patch = scm.create_patch()
-        self.assertFalse(re.search(r'test_file2', patch))
-        self.assertTrue(re.search(r'test_file_commit2', patch))
-        self.assertTrue(re.search(r'test_file_commit1', patch))
+        patch = self.scm.create_patch()
+        self.assertNotRegexpMatches(patch, r'test_file2')
+        self.assertRegexpMatches(patch, r'test_file_commit2')
+        self.assertRegexpMatches(patch, r'test_file_commit1')
 
     def test_create_binary_patch(self):
         # Create a git binary patch and check the contents.
-        scm = detect_scm_system(self.git_checkout_path)
         test_file_name = 'binary_file'
         test_file_path = os.path.join(self.git_checkout_path, test_file_name)
         file_contents = ''.join(map(chr, range(256)))
         write_into_file_at_path(test_file_path, file_contents, encoding=None)
         run_command(['git', 'add', test_file_name])
-        patch = scm.create_patch()
-        self.assertTrue(re.search(r'\nliteral 0\n', patch))
-        self.assertTrue(re.search(r'\nliteral 256\n', patch))
+        patch = self.scm.create_patch()
+        self.assertRegexpMatches(patch, r'\nliteral 0\n')
+        self.assertRegexpMatches(patch, r'\nliteral 256\n')
 
         # Check if we can apply the created patch.
         run_command(['git', 'rm', '-f', test_file_name])
-        self._setup_webkittools_scripts_symlink(scm)
+        self._setup_webkittools_scripts_symlink(self.scm)
         self.checkout.apply_patch(self._create_patch(patch))
         self.assertEqual(file_contents, read_from_path(test_file_path, encoding=None))
 
@@ -1415,73 +1390,67 @@
         write_into_file_at_path(test_file_path, file_contents, encoding=None)
         run_command(['git', 'add', test_file_name])
         run_command(['git', 'commit', '-m', 'binary diff'])
-        patch_from_local_commit = scm.create_patch('HEAD')
-        self.assertTrue(re.search(r'\nliteral 0\n', patch_from_local_commit))
-        self.assertTrue(re.search(r'\nliteral 256\n', patch_from_local_commit))
+
+        patch_from_local_commit = self.scm.create_patch('HEAD')
+        self.assertRegexpMatches(patch_from_local_commit, r'\nliteral 0\n')
+        self.assertRegexpMatches(patch_from_local_commit, r'\nliteral 256\n')
 
     def test_changed_files_local_plus_working_copy(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
-        files = scm.changed_files()
-        self.assertTrue('test_file_commit1' in files)
-        self.assertTrue('test_file_commit2' in files)
+        files = self.scm.changed_files()
+        self.assertIn('test_file_commit1', files)
+        self.assertIn('test_file_commit2', files)
 
         # working copy should *not* be in the list.
-        files = scm.changed_files('trunk..')
-        self.assertTrue('test_file_commit1' in files)
-        self.assertFalse('test_file_commit2' in files)
+        files = self.scm.changed_files('trunk..')
+        self.assertIn('test_file_commit1', files)
+        self.assertNotIn('test_file_commit2', files)
 
         # working copy *should* be in the list.
-        files = scm.changed_files('trunk....')
-        self.assertTrue('test_file_commit1' in files)
-        self.assertTrue('test_file_commit2' in files)
+        files = self.scm.changed_files('trunk....')
+        self.assertIn('test_file_commit1', files)
+        self.assertIn('test_file_commit2', files)
 
     def test_changed_files_git_commit(self):
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        files = scm.changed_files(git_commit="HEAD^")
-        self.assertTrue('test_file_commit1' in files)
-        self.assertFalse('test_file_commit2' in files)
+        files = self.scm.changed_files(git_commit="HEAD^")
+        self.assertIn('test_file_commit1', files)
+        self.assertNotIn('test_file_commit2', files)
 
     def test_changed_files_git_commit_range(self):
         self._three_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        files = scm.changed_files(git_commit="HEAD~2..HEAD")
-        self.assertTrue('test_file_commit0' not in files)
-        self.assertTrue('test_file_commit1' in files)
-        self.assertTrue('test_file_commit2' in files)
+        files = self.scm.changed_files(git_commit="HEAD~2..HEAD")
+        self.assertNotIn('test_file_commit0', files)
+        self.assertIn('test_file_commit1', files)
+        self.assertIn('test_file_commit2', files)
 
     def test_changed_files_working_copy_only(self):
         self._one_local_commit_plus_working_copy_changes()
-        scm = detect_scm_system(self.git_checkout_path)
-        files = scm.changed_files(git_commit="HEAD....")
-        self.assertFalse('test_file_commit1' in files)
-        self.assertTrue('test_file_commit2' in files)
+        files = self.scm.changed_files(git_commit="HEAD....")
+        self.assertNotIn('test_file_commit1', files)
+        self.assertIn('test_file_commit2', files)
 
     def test_changed_files_multiple_local_commits(self):
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        files = scm.changed_files()
-        self.assertTrue('test_file_commit2' in files)
-        self.assertTrue('test_file_commit1' in files)
+        files = self.scm.changed_files()
+        self.assertIn('test_file_commit2', files)
+        self.assertIn('test_file_commit1', files)
 
     def test_changed_files_not_synced(self):
         run_command(['git', 'checkout', '-b', 'my-branch', 'trunk~3'])
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        files = scm.changed_files()
-        self.assertFalse('test_file2' in files)
-        self.assertTrue('test_file_commit2' in files)
-        self.assertTrue('test_file_commit1' in files)
+        files = self.scm.changed_files()
+        self.assertNotIn('test_file2', files)
+        self.assertIn('test_file_commit2', files)
+        self.assertIn('test_file_commit1', files)
 
     def test_changed_files_not_synced(self):
         run_command(['git', 'checkout', '-b', 'my-branch', 'trunk~3'])
         self._two_local_commits()
-        scm = detect_scm_system(self.git_checkout_path)
-        files = scm.changed_files()
-        self.assertFalse('test_file2' in files)
-        self.assertTrue('test_file_commit2' in files)
-        self.assertTrue('test_file_commit1' in files)
+        files = self.scm.changed_files()
+        self.assertNotIn('test_file2', files)
+        self.assertIn('test_file_commit2', files)
+        self.assertIn('test_file_commit1', files)
 
     def test_changed_files(self):
         self._shared_test_changed_files()
@@ -1499,15 +1468,15 @@
 
         # equivalent to 'git diff my-branch..HEAD, should not include working changes
         files = self.scm.changed_files(git_commit='UPSTREAM..')
-        self.assertFalse('test_file_commit1' in files)
-        self.assertTrue('test_file_commit2' in files)
-        self.assertFalse('test_file_commit0' in files)
+        self.assertNotIn('test_file_commit1', files)
+        self.assertIn('test_file_commit2', files)
+        self.assertNotIn('test_file_commit0', files)
 
         # equivalent to 'git diff my-branch', *should* include working changes
         files = self.scm.changed_files(git_commit='UPSTREAM....')
-        self.assertFalse('test_file_commit1' in files)
-        self.assertTrue('test_file_commit2' in files)
-        self.assertTrue('test_file_commit0' in files)
+        self.assertNotIn('test_file_commit1', files)
+        self.assertIn('test_file_commit2', files)
+        self.assertIn('test_file_commit0', files)
 
     def test_contents_at_revision(self):
         self._shared_test_contents_at_revision()
@@ -1527,13 +1496,13 @@
     def test_delete(self):
         self._two_local_commits()
         self.scm.delete('test_file_commit1')
-        self.assertTrue("test_file_commit1" in self.scm.deleted_files())
+        self.assertIn("test_file_commit1", self.scm.deleted_files())
 
     def test_delete_list(self):
         self._two_local_commits()
         self.scm.delete_list(["test_file_commit1", "test_file_commit2"])
-        self.assertTrue("test_file_commit1" in self.scm.deleted_files())
-        self.assertTrue("test_file_commit2" in self.scm.deleted_files())
+        self.assertIn("test_file_commit1", self.scm.deleted_files())
+        self.assertIn("test_file_commit2", self.scm.deleted_files())
 
     def test_delete_recursively(self):
         self._shared_test_delete_recursively()
@@ -1546,8 +1515,7 @@
 
     def test_to_object_name(self):
         relpath = 'test_file_commit1'
-        fullpath = os.path.join(self.git_checkout_path, relpath)
-        self._two_local_commits()
+        fullpath = os.path.realpath(os.path.join(self.git_checkout_path, relpath))
         self.assertEqual(relpath, self.scm.to_object_name(fullpath))
 
     def test_show_head(self):
@@ -1568,36 +1536,43 @@
 
         diff = self.scm.diff_for_file('test_file_commit1')
         cached_diff = self.scm.diff_for_file('test_file_commit1')
-        self.assertTrue("+Updated" in diff)
-        self.assertTrue("-more test content" in diff)
+        self.assertIn("+Updated", diff)
+        self.assertIn("-more test content", diff)
 
         self.scm.add('test_file_commit1')
 
         cached_diff = self.scm.diff_for_file('test_file_commit1')
-        self.assertTrue("+Updated" in cached_diff)
-        self.assertTrue("-more test content" in cached_diff)
+        self.assertIn("+Updated", cached_diff)
+        self.assertIn("-more test content", cached_diff)
 
     def test_exists(self):
-        scm = detect_scm_system(self.git_checkout_path)
-        self._shared_test_exists(scm, scm.commit_locally_with_message)
+        self._shared_test_exists(self.scm, self.scm.commit_locally_with_message)
 
 
 # We need to split off more of these SCM tests to use mocks instead of the filesystem.
 # This class is the first part of that.
 class GitTestWithMock(unittest.TestCase):
+    maxDiff = None
+
     def make_scm(self, logging_executive=False):
         # We do this should_log dance to avoid logging when Git.__init__ runs sysctl on mac to check for 64-bit support.
-        scm = Git(cwd=None, executive=MockExecutive())
+        scm = Git(cwd=".", executive=MockExecutive(), filesystem=MockFileSystem())
+        scm.read_git_config = lambda *args, **kw: "MOCKKEY:MOCKVALUE"
         scm._executive._should_log = logging_executive
         return scm
 
     def test_create_patch(self):
         scm = self.make_scm(logging_executive=True)
-        expected_stderr = "MOCK run_command: ['git', 'merge-base', u'refs/remotes/origin/master', 'HEAD'], cwd=%(checkout)s\nMOCK run_command: ['git', 'diff', '--binary', '--no-ext-diff', '--full-index', '-M', 'MOCK output of child process', '--'], cwd=%(checkout)s\nMOCK run_command: ['git', 'log', '-25'], cwd=None\n" % {'checkout': scm.checkout_root}
-        OutputCapture().assert_outputs(self, scm.create_patch, expected_stderr=expected_stderr)
+        expected_stderr = """\
+MOCK run_command: ['git', 'merge-base', 'MOCKVALUE', 'HEAD'], cwd=%(checkout)s
+MOCK run_command: ['git', 'diff', '--binary', '--no-color', '--no-ext-diff', '--full-index', '--no-renames', '', 'MOCK output of child process', '--'], cwd=%(checkout)s
+MOCK run_command: ['git', 'rev-parse', '--show-toplevel'], cwd=%(checkout)s
+MOCK run_command: ['git', 'log', '-1', '--grep=git-svn-id:', '--date=iso', './MOCK output of child process/MOCK output of child process'], cwd=%(checkout)s
+""" % {'checkout': scm.checkout_root}
+        OutputCapture().assert_outputs(self, scm.create_patch, expected_logs=expected_stderr)
 
     def test_push_local_commits_to_server_with_username_and_password(self):
-        self.assertEquals(self.make_scm().push_local_commits_to_server(username='dbates@webkit.org', password='blah'), "MOCK output of child process")
+        self.assertEqual(self.make_scm().push_local_commits_to_server(username='dbates@webkit.org', password='blah'), "MOCK output of child process")
 
     def test_push_local_commits_to_server_without_username_and_password(self):
         self.assertRaises(AuthenticationError, self.make_scm().push_local_commits_to_server)
@@ -1608,5 +1583,14 @@
     def test_push_local_commits_to_server_without_username_and_with_password(self):
         self.assertRaises(AuthenticationError, self.make_scm().push_local_commits_to_server, {'password': 'blah'})
 
-if __name__ == '__main__':
-    unittest.main()
+    def test_timestamp_of_revision(self):
+        scm = self.make_scm()
+        scm.find_checkout_root = lambda path: ''
+        scm._run_git = lambda args: 'Date: 2013-02-08 08:05:49 +0000'
+        self.assertEqual(scm.timestamp_of_revision('some-path', '12345'), '2013-02-08T08:05:49Z')
+
+        scm._run_git = lambda args: 'Date: 2013-02-08 01:02:03 +0130'
+        self.assertEqual(scm.timestamp_of_revision('some-path', '12345'), '2013-02-07T23:32:03Z')
+
+        scm._run_git = lambda args: 'Date: 2013-02-08 01:55:21 -0800'
+        self.assertEqual(scm.timestamp_of_revision('some-path', '12345'), '2013-02-08T09:55:21Z')
diff --git a/Tools/Scripts/webkitpy/common/checkout/scm/svn.py b/Tools/Scripts/webkitpy/common/checkout/scm/svn.py
index 25b7e3b..8646a5c 100644
--- a/Tools/Scripts/webkitpy/common/checkout/scm/svn.py
+++ b/Tools/Scripts/webkitpy/common/checkout/scm/svn.py
@@ -29,23 +29,32 @@
 
 import logging
 import os
+import random
 import re
 import shutil
+import string
 import sys
+import tempfile
 
 from webkitpy.common.memoized import memoized
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.executive import Executive, ScriptError
 
 from .scm import AuthenticationError, SCM, commit_error_handler
 
-
 _log = logging.getLogger(__name__)
 
 
 # A mixin class that represents common functionality for SVN and Git-SVN.
-class SVNRepository:
+class SVNRepository(object):
+    # FIXME: These belong in common.config.urls
+    svn_server_host = "svn.webkit.org"
+    svn_server_realm = "<http://svn.webkit.org:80> Mac OS Forge"
+
     def has_authorization_for_realm(self, realm, home_directory=os.getenv("HOME")):
+        # If we are working on a file:// repository realm will be None
+        if realm is None:
+            return True
+        # ignore false positives for methods implemented in the mixee class. pylint: disable=E1101
         # Assumes find and grep are installed.
         if not os.path.isdir(os.path.join(home_directory, ".subversion")):
             return False
@@ -63,9 +72,6 @@
 
 
 class SVN(SCM, SVNRepository):
-    # FIXME: These belong in common.config.urls
-    svn_server_host = "svn.webkit.org"
-    svn_server_realm = "<http://svn.webkit.org:80> Mac OS Forge"
 
     executable_name = "svn"
 
@@ -75,8 +81,7 @@
         SCM.__init__(self, cwd, **kwargs)
         self._bogus_dir = None
         if patch_directories == []:
-            # FIXME: ScriptError is for Executive, this should probably be a normal Exception.
-            raise ScriptError(script_args=svn_info_args, message='Empty list of patch directories passed to SCM.__init__')
+            raise Exception(message='Empty list of patch directories passed to SCM.__init__')
         elif patch_directories == None:
             self._patch_directories = [self._filesystem.relpath(cwd, self.checkout_root)]
         else:
@@ -107,7 +112,7 @@
         match = re.search("^%s: (?P<value>.+)$" % field_name, info_output, re.MULTILINE)
         if not match:
             raise ScriptError(script_args=svn_info_args, message='svn info did not contain a %s.' % field_name)
-        return match.group('value')
+        return match.group('value').rstrip('\r')
 
     def find_checkout_root(self, path):
         uuid = self.find_uuid(path)
@@ -135,10 +140,11 @@
     def svn_version(self):
         return self._run_svn(['--version', '--quiet'])
 
-    def working_directory_is_clean(self):
-        return self._run_svn(["diff"], cwd=self.checkout_root, decode_output=False) == ""
+    def has_working_directory_changes(self):
+        # FIXME: What about files which are not committed yet?
+        return self._run_svn(["diff"], cwd=self.checkout_root, decode_output=False) != ""
 
-    def clean_working_directory(self):
+    def discard_working_directory_changes(self):
         # Make sure there are no locks lying around from a previously aborted svn invocation.
         # This is slightly dangerous, as it's possible the user is running another svn process
         # on this checkout at the same time.  However, it's much more likely that we're running
@@ -240,6 +246,13 @@
     def svn_revision(self, path):
         return self.value_from_svn_info(path, 'Revision')
 
+    def timestamp_of_revision(self, path, revision):
+        # We use --xml to get timestamps like 2013-02-08T08:18:04.964409Z
+        repository_root = self.value_from_svn_info(self.checkout_root, 'Repository Root')
+        info_output = Executive().run_command([self.executable_name, 'log', '-r', revision, '--xml', repository_root], cwd=path).rstrip()
+        match = re.search(r"^<date>(?P<value>.+)</date>\r?$", info_output, re.MULTILINE)
+        return match.group('value')
+
     # FIXME: This method should be on Checkout.
     def create_patch(self, git_commit=None, changed_files=None):
         """Returns a byte array (str()) representing the patch file.
@@ -267,11 +280,12 @@
         return self._run_svn(['diff', '-c', revision])
 
     def _bogus_dir_name(self):
+        rnd = ''.join(random.sample(string.ascii_letters, 5))
         if sys.platform.startswith("win"):
             parent_dir = tempfile.gettempdir()
         else:
             parent_dir = sys.path[0]  # tempdir is not secure.
-        return os.path.join(parent_dir, "temp_svn_config")
+        return os.path.join(parent_dir, "temp_svn_config_" + rnd)
 
     def _setup_bogus_dir(self, log):
         self._bogus_dir = self._bogus_dir_name()
@@ -310,8 +324,8 @@
     def apply_reverse_diff(self, revision):
         # '-c -revision' applies the inverse diff of 'revision'
         svn_merge_args = ['merge', '--non-interactive', '-c', '-%s' % revision, self._repository_url()]
-        log("WARNING: svn merge has been known to take more than 10 minutes to complete.  It is recommended you use git for rollouts.")
-        log("Running 'svn %s'" % " ".join(svn_merge_args))
+        _log.warning("svn merge has been known to take more than 10 minutes to complete.  It is recommended you use git for rollouts.")
+        _log.debug("Running 'svn %s'" % " ".join(svn_merge_args))
         # FIXME: Should this use cwd=self.checkout_root?
         self._run_svn(svn_merge_args)
 
diff --git a/Tools/Scripts/webkitpy/common/config/committers.py b/Tools/Scripts/webkitpy/common/config/committers.py
index 36df3db..81153c1 100644
--- a/Tools/Scripts/webkitpy/common/config/committers.py
+++ b/Tools/Scripts/webkitpy/common/config/committers.py
@@ -30,6 +30,7 @@
 # WebKit's Python module for committer and reviewer validation.
 
 from webkitpy.common.editdistance import edit_distance
+import fnmatch
 
 class Account(object):
     def __init__(self, name, email_or_emails, irc_nickname_or_nicknames=None):
@@ -69,6 +70,18 @@
                 return True
         return False
 
+    def matches_glob(self, glob_string):
+        if fnmatch.fnmatch(self.full_name, glob_string):
+            return True
+        if self.irc_nicknames:
+            for nickname in self.irc_nicknames:
+                if fnmatch.fnmatch(nickname, glob_string):
+                    return True
+        for email in self.emails:
+            if fnmatch.fnmatch(email, glob_string):
+                return True
+        return False
+
 
 class Contributor(Account):
     def __init__(self, name, email_or_emails, irc_nickname=None):
@@ -98,6 +111,7 @@
     Account("David Levin", ["levin+threading@chromium.org"], ""),
     Account("David Levin", ["levin+watchlist@chromium.org"], ""),
     Account("Kent Tamura", ["tkent+wkapi@chromium.org"], ""),
+    Account("Mike West", ["mkwst+watchlist@chromium.org"], ""),
 ]
 
 
@@ -109,66 +123,68 @@
 contributors_who_are_not_committers = [
     Contributor("Adobe Bug Tracker", "WebkitBugTracker@adobe.com"),
     Contributor("Aharon Lanin", "aharon@google.com"),
+    Contributor("Alan Cutter", "alancutter@chromium.org", "alancutter"),
     Contributor("Alan Stearns", "stearns@adobe.com", "astearns"),
     Contributor("Alejandro Pineiro", "apinheiro@igalia.com"),
     Contributor("Alexey Marinichev", ["amarinichev@chromium.org", "amarinichev@google.com"], "amarinichev"),
     Contributor("Andras Piroska", "pandras@inf.u-szeged.hu", "andris88"),
-    Contributor("Andrei Bucur", "abucur@adobe.com", "abucur"),
-    Contributor("Anne van Kesteren", "annevankesteren+webkit@gmail.com", "annevk"),
+    Contributor("Anne van Kesteren", "annevk@annevk.nl", "annevk"),
     Contributor("Annie Sullivan", "sullivan@chromium.org", "annie"),
+    Contributor("Anton Vayvod", "avayvod@chromium.org", "avayvod"),
     Contributor("Aryeh Gregor", "ayg@aryeh.name", "AryehGregor"),
     Contributor("Balazs Ankes", "bank@inf.u-szeged.hu", "abalazs"),
+    Contributor("Bem Jones-Bey", "bjonesbe@adobe.com", "bemjb"),
     Contributor("Brian Salomon", "bsalomon@google.com"),
+    Contributor("Christian Biesinger", "cbiesinger@chromium.org", "cbiesinger"),
     Contributor("Commit Queue", "commit-queue@webkit.org"),
     Contributor("Daniel Sievers", "sievers@chromium.org"),
     Contributor("David Dorwin", "ddorwin@chromium.org", "ddorwin"),
     Contributor("David Reveman", "reveman@chromium.org", "reveman"),
     Contributor("Dongsung Huang", "luxtella@company100.net", "Huang"),
     Contributor("Douglas Davidson", "ddavidso@apple.com"),
+    Contributor("Douglas Stockwell", "dstockwell@chromium.org", "dstockwell"),
     Contributor("Edward O'Connor", "eoconnor@apple.com", "hober"),
-    Contributor("Elliott Sprehn", "esprehn@chromium.org", "esprehn"),
     Contributor("Eric Penner", "epenner@chromium.org", "epenner"),
     Contributor("Felician Marton", ["felician@inf.u-szeged.hu", "marton.felician.zoltan@stud.u-szeged.hu"], "Felician"),
     Contributor("Finnur Thorarinsson", ["finnur@chromium.org", "finnur.webkit@gmail.com"], "finnur"),
     Contributor("Forms Bugs", "forms-bugs@chromium.org"),
-    Contributor("Glenn Adams", "glenn@skynav.com", "gasubic"),
     Contributor("Gabor Ballabas", "gaborb@inf.u-szeged.hu", "bgabor"),
     Contributor("Grace Kloba", "klobag@chromium.org", "klobag"),
     Contributor("Greg Simon", "gregsimon@chromium.org", "gregsimon"),
-    Contributor("Gregg Tavares", ["gman@google.com", "gman@chromium.org"], "gman"),
     Contributor("Hao Zheng", "zhenghao@chromium.org"),
     Contributor("Harald Alvestrand", "hta@google.com", "hta"),
     Contributor("Ian Hickson", "ian@hixie.ch", "hixie"),
-    Contributor("Janos Badics", "jbadics@inf.u-szeged.hu", "dicska"),
+    Contributor("Jae Hyun Park", "jae.park@company100.net", "jaepark"),
     Contributor("Jonathan Backer", "backer@chromium.org", "backer"),
     Contributor("Jeff Timanus", ["twiz@chromium.org", "twiz@google.com"], "twiz"),
     Contributor("Jing Zhao", "jingzhao@chromium.org"),
-    Contributor("Joanmarie Diggs", "jdiggs@igalia.com"),
     Contributor("John Bates", ["jbates@google.com", "jbates@chromium.org"], "jbates"),
     Contributor("John Bauman", ["jbauman@chromium.org", "jbauman@google.com"], "jbauman"),
     Contributor("John Mellor", "johnme@chromium.org", "johnme"),
     Contributor("Kulanthaivel Palanichamy", "kulanthaivel@codeaurora.org", "kvel"),
-    Contributor("Kiran Muppala", "cmuppala@apple.com", "kiranm"),
+    Contributor("Koji Hara", "kojih@chromium.org", "kojih"),
+    Contributor("Koji Ishii", "kojiishi@gmail.com"),
+    Contributor("Michael Pruett", "michael@68k.org", "mpruett"),
     Contributor("Mihai Balan", "mibalan@adobe.com", "miChou"),
+    Contributor("Mihai Maerean", "mmaerean@adobe.com", "mmaerean"),
     Contributor("Min Qin", "qinmin@chromium.org"),
     Contributor("Nandor Huszka", "hnandor@inf.u-szeged.hu", "hnandor"),
+    Contributor("Nils Barth", "nbarth@chromium.org", "nbarth"),
     Contributor("Oliver Varga", ["voliver@inf.u-szeged.hu", "Varga.Oliver@stud.u-szeged.hu"], "TwistO"),
     Contributor("Peter Gal", "galpeter@inf.u-szeged.hu", "elecro"),
     Contributor("Peter Linss", "peter.linss@hp.com", "plinss"),
-    Contributor("Pravin D", "pravind.2k4@gmail.com", "pravind"),
     Contributor("Radar WebKit Bug Importer", "webkit-bug-importer@group.apple.com"),
     Contributor("Raul Hudea", "rhudea@adobe.com", "rhudea"),
     Contributor("Roland Takacs", "rtakacs@inf.u-szeged.hu", "rtakacs"),
-    Contributor(u"Sami Ky\u00f6stil\u00e4", "skyostil@chromium.org", "skyostil"),
-    Contributor("Szilard Ledan-Muntean", "szledan@inf.u-szeged.hu", "szledan"),
     Contributor("Tab Atkins", ["tabatkins@google.com", "jackalmage@gmail.com"], "tabatkins"),
     Contributor("Tamas Czene", ["tczene@inf.u-szeged.hu", "Czene.Tamas@stud.u-szeged.hu"], "tczene"),
     Contributor("Tien-Ren Chen", "trchen@chromium.org", "trchen"),
+    Contributor("Tim 'mithro' Ansell", "mithro@mithis.com", "mithro"),
+    Contributor("Tim Volodine", "timvolodine@chromium.org", "timvolodine"),
     Contributor("WebKit Review Bot", "webkit.review.bot@gmail.com", "sheriff-bot"),
     Contributor("Web Components Team", "webcomponents-bugzilla@chromium.org"),
     Contributor("Wyatt Carss", ["wcarss@chromium.org", "wcarss@google.com"], "wcarss"),
     Contributor("Zeev Lieber", "zlieber@chromium.org"),
-    Contributor("Zoltan Arvai", "zarvai@inf.u-szeged.hu", "azbest_hu"),
     Contributor("Zsolt Feher", "feherzs@inf.u-szeged.hu", "Smith"),
 ]
 
@@ -181,6 +197,7 @@
 
 committers_unable_to_review = [
     Committer("Aaron Boodman", "aa@chromium.org", "aboodman"),
+    Committer("Aaron Colwell", "acolwell@chromium.org", "acolwell"),
     Committer("Adam Bergkvist", "adam.bergkvist@ericsson.com", "adambe"),
     Committer("Adam Kallai", "kadam@inf.u-szeged.hu", "kadam"),
     Committer("Adam Klein", "adamk@chromium.org", "aklein"),
@@ -193,25 +210,28 @@
     Committer("Alexandre Elias", ["aelias@chromium.org", "aelias@google.com"], "aelias"),
     Committer("Alexandru Chiculita", "achicu@adobe.com", "achicu"),
     Committer("Alice Boxhall", "aboxhall@chromium.org", "aboxhall"),
-    Committer("Allan Sandfeld Jensen", ["allan.jensen@digia.com", "kde@carewolf.com", "sandfeld@kde.org", "allan.jensen@nokia.com"], "carewolf"),
     Committer("Alok Priyadarshi", "alokp@chromium.org", "alokp"),
     Committer("Ami Fischman", ["fischman@chromium.org", "fischman@google.com"], "fischman"),
     Committer("Amruth Raj", "amruthraj@motorola.com", "amruthraj"),
     Committer("Andre Boule", "aboule@apple.com"),
+    Committer("Andrei Bucur", "abucur@adobe.com", "abucur"),
     Committer("Andrei Popescu", "andreip@google.com", "andreip"),
     Committer("Andrew Wellington", ["andrew@webkit.org", "proton@wiretapped.net"], "proton"),
     Committer("Andrew Scherkus", "scherkus@chromium.org", "scherkus"),
+    Committer("Andrey Adaykin", "aandrey@chromium.org", "aandrey"),
     Committer("Andrey Kosyakov", "caseq@chromium.org", "caseq"),
     Committer("Andras Becsi", ["abecsi@webkit.org", "andras.becsi@digia.com"], "bbandix"),
     Committer("Andy Wingo", "wingo@igalia.com", "wingo"),
     Committer("Anna Cavender", "annacc@chromium.org", "annacc"),
     Committer("Anthony Ricaud", "rik@webkit.org", "rik"),
     Committer("Antoine Labour", "piman@chromium.org", "piman"),
+    Committer("Antoine Quint", "graouts@apple.com", "graouts"),
     Committer("Anton D'Auria", "adauria@apple.com", "antonlefou"),
     Committer("Anton Muhin", "antonm@chromium.org", "antonm"),
     Committer("Arko Saha", "arko@motorola.com", "arkos"),
     Committer("Arvid Nilsson", "anilsson@rim.com", "anilsson"),
     Committer("Balazs Kelemen", "kbalazs@webkit.org", "kbalazs"),
+    Committer("Bear Travis", "betravis@adobe.com", "betravis"),
     Committer("Ben Murdoch", "benm@google.com", "benm"),
     Committer("Ben Wells", "benwells@chromium.org", "benwells"),
     Committer("Benjamin C Meyer", ["ben@meyerhome.net", "ben@webkit.org", "bmeyer@rim.com"], "icefox"),
@@ -220,6 +240,7 @@
     Committer("Bill Budge", ["bbudge@chromium.org", "bbudge@gmail.com"], "bbudge"),
     Committer("Brett Wilson", "brettw@chromium.org", "brettx"),
     Committer("Bruno de Oliveira Abinader", ["bruno.abinader@basyskom.com", "brunoabinader@gmail.com"], "abinader"),
+    Committer("Byungwoo Lee", ["bw80.lee@samsung.com", "bw80.lee@gmail.com"], "byungwoo"),
     Committer("Cameron McCormack", ["cam@mcc.id.au", "cam@webkit.org"], "heycam"),
     Committer("Carol Szabo", ["carol@webkit.org", "carol.szabo@nokia.com"], "cszabo1"),
     Committer("Cary Clark", ["caryclark@google.com", "caryclark@chromium.org"], "caryclark"),
@@ -229,6 +250,8 @@
     Committer("Chris Guillory", ["ctguil@chromium.org", "chris.guillory@google.com"], "ctguil"),
     Committer("Chris Petersen", "cpetersen@apple.com", "cpetersen"),
     Committer("Christian Dywan", ["christian@twotoasts.de", "christian@webkit.org", "christian@lanedo.com"]),
+    Committer("Christophe Dumez", ["dchris@gmail.com", "ch.dumez@sisa.samsung.com"], "cdumez"),
+    Committer("Claudio Saavedra", "csaavedra@igalia.com", "claudio___"),
     Committer("Collin Jackson", "collinj@webkit.org", "collinjackson"),
     Committer("Cris Neckar", "cdn@chromium.org", "cneckar"),
     Committer("Dan Winship", "danw@gnome.org", "danw"),
@@ -241,16 +264,19 @@
     Committer("David Smith", ["catfish.man@gmail.com", "dsmith@webkit.org"], "catfishman"),
     Committer("Diego Gonzalez", ["diegohcg@webkit.org", "diego.gonzalez@openbossa.org"], "diegohcg"),
     Committer("Dinu Jacob", "dinu.s.jacob@intel.com", "dsjacob"),
+    Committer("Dmitry Gorbik", "dgorbik@apple.com", "dgorbik"),
     Committer("Dmitry Lomov", ["dslomov@google.com", "dslomov@chromium.org"], "dslomov"),
     Committer("Dominic Cooney", ["dominicc@chromium.org", "dominicc@google.com"], "dominicc"),
     Committer("Dominic Mazzoni", ["dmazzoni@google.com", "dmazzoni@chromium.org"], "dmazzoni"),
     Committer(u"Dominik R\u00f6ttsches", ["dominik.rottsches@intel.com", "d-r@roettsches.de"], "drott"),
+    Committer("Dongwoo Joshua Im", ["dw.im@samsung.com", "dwim79@gmail.com"], "dwim"),
     Committer("Drew Wilson", "atwilson@chromium.org", "atwilson"),
     Committer("Eli Fidler", ["eli@staikos.net", "efidler@rim.com"], "efidler"),
     Committer("Elliot Poger", "epoger@chromium.org", "epoger"),
     Committer("Erik Arvidsson", "arv@chromium.org", "arv"),
     Committer("Eric Roman", "eroman@chromium.org", "eroman"),
     Committer("Eric Uhrhane", "ericu@chromium.org", "ericu"),
+    Committer("Eugene Klyuchnikov", "eustas@chromium.org", "eustas"),
     Committer("Evan Martin", "evan@chromium.org", "evmar"),
     Committer("Evan Stade", "estade@chromium.org", "estade"),
     Committer("Fady Samuel", "fsamuel@chromium.org", "fsamuel"),
@@ -261,9 +287,12 @@
     Committer("Gabor Rapcsanyi", ["rgabor@webkit.org", "rgabor@inf.u-szeged.hu"], "rgabor"),
     Committer("Gavin Peters", ["gavinp@chromium.org", "gavinp@webkit.org", "gavinp@google.com"], "gavinp"),
     Committer("Girish Ramakrishnan", ["girish@forwardbias.in", "ramakrishnan.girish@gmail.com"], "girishr"),
+    Committer("Glenn Adams", "glenn@skynav.com", "gasubic"),
     Committer("Graham Dennis", ["Graham.Dennis@gmail.com", "gdennis@webkit.org"]),
     Committer("Greg Bolsinga", "bolsinga@apple.com"),
+    Committer("Gregg Tavares", ["gman@chromium.org", "gman@google.com"], "gman"),
     Committer("Grzegorz Czajkowski", "g.czajkowski@samsung.com", "grzegorz"),
+    Committer("Hans Muller", "giles_joplin@yahoo.com", "hansmuller"),
     Committer("Hans Wennborg", "hans@chromium.org", "hwennborg"),
     Committer("Hayato Ito", "hayato@chromium.org", "hayato"),
     Committer("Hironori Bono", "hbono@chromium.org", "hbono"),
@@ -281,6 +310,7 @@
     Committer("James Hawkins", ["jhawkins@chromium.org", "jhawkins@google.com"], "jhawkins"),
     Committer("James Kozianski", ["koz@chromium.org", "koz@google.com"], "koz"),
     Committer("James Simonsen", "simonjam@chromium.org", "simonjam"),
+    Committer("Janos Badics", "jbadics@inf.u-szeged.hu", "dicska"),
     Committer("Jarred Nicholls", ["jarred@webkit.org", "jarred@sencha.com"], "jarrednicholls"),
     Committer("Jason Liu", ["jason.liu@torchmobile.com.cn", "jasonliuwebkit@gmail.com"], "jasonliu"),
     Committer("Jay Civelli", "jcivelli@chromium.org", "jcivelli"),
@@ -288,17 +318,17 @@
     Committer("Jeffrey Pfau", ["jeffrey@endrift.com", "jpfau@apple.com"], "jpfau"),
     Committer("Jenn Braithwaite", "jennb@chromium.org", "jennb"),
     Committer("Jens Alfke", ["snej@chromium.org", "jens@apple.com"]),
-    Committer("Jer Noble", "jer.noble@apple.com", "jernoble"),
     Committer("Jeremy Moskovich", ["playmobil@google.com", "jeremy@chromium.org"], "jeremymos"),
     Committer("Jesus Sanchez-Palencia", ["jesus@webkit.org", "jesus.palencia@openbossa.org"], "jeez_"),
     Committer("Jia Pu", "jpu@apple.com"),
+    Committer("Joanmarie Diggs", "jdiggs@igalia.com", "joanie"),
     Committer("Joe Thomas", "joethomas@motorola.com", "joethomas"),
     Committer("John Abd-El-Malek", "jam@chromium.org", "jam"),
     Committer("John Gregg", ["johnnyg@google.com", "johnnyg@chromium.org"], "johnnyg"),
     Committer("John Knottenbelt", "jknotten@chromium.org", "jknotten"),
     Committer("Johnny Ding", ["jnd@chromium.org", "johnnyding.webkit@gmail.com"], "johnnyding"),
     Committer("Jon Lee", "jonlee@apple.com", "jonlee"),
-    Committer("Jonathan Dong", ["jonathan.dong@torchmobile.com.cn"], "jondong"),
+    Committer("Jonathan Dong", ["jonathan.dong.webkit@gmail.com"], "jondong"),
     Committer("Joone Hur", ["joone@webkit.org", "joone.hur@intel.com"], "joone"),
     Committer("Joost de Valk", ["joost@webkit.org", "webkit-dev@joostdevalk.nl"], "Altha"),
     Committer("Joshua Bell", ["jsbell@chromium.org", "jsbell@google.com"], "jsbell"),
@@ -306,6 +336,8 @@
     Committer("Jungshik Shin", "jshin@chromium.org"),
     Committer("Justin Novosad", ["junov@google.com", "junov@chromium.org"], "junov"),
     Committer("Justin Schuh", "jschuh@chromium.org", "jschuh"),
+    Committer("Kangil Han", ["kangil.han@samsung.com", "kangil.han@gmail.com"], "kangil"),
+    Committer("Karen Grunberg", "kareng@chromium.org", "kareng"),
     Committer("Kaustubh Atrawalkar", ["kaustubh@motorola.com"], "silverroots"),
     Committer("Keishi Hattori", "keishi@webkit.org", "keishi"),
     Committer("Kelly Norton", "knorton@alum.mit.edu"),
@@ -317,6 +349,7 @@
     Committer(u"Kim Gr\u00f6nholm", "kim.1.gronholm@nokia.com"),
     Committer("Kimmo Kinnunen", ["kimmo.t.kinnunen@nokia.com", "kimmok@iki.fi", "ktkinnun@webkit.org"], "kimmok"),
     Committer("Kinuko Yasuda", "kinuko@chromium.org", "kinuko"),
+    Committer("Kiran Muppala", "cmuppala@apple.com", "kiranm"),
     Committer("Konrad Piascik", "kpiascik@rim.com", "kpiascik"),
     Committer("Kristof Kosztyo", "kkristof@inf.u-szeged.hu", "kkristof"),
     Committer("Krzysztof Kowalczyk", "kkowalczyk@gmail.com"),
@@ -325,6 +358,7 @@
     Committer("Leandro Gracia Gil", "leandrogracia@chromium.org", "leandrogracia"),
     Committer("Leandro Pereira", ["leandro@profusion.mobi", "leandro@webkit.org"], "acidx"),
     Committer("Leo Yang", ["leoyang@rim.com", "leoyang@webkit.org", "leoyang.webkit@gmail.com"], "leoyang"),
+    Committer("Li Yin", ["li.yin@intel.com"], "liyin"),
     Committer("Lucas De Marchi", ["demarchi@webkit.org", "lucas.demarchi@profusion.mobi"], "demarchi"),
     Committer("Lucas Forschler", ["lforschler@apple.com"], "lforschler"),
     Committer("Luciano Wolf", "luciano.wolf@openbossa.org", "luck"),
@@ -332,15 +366,18 @@
     Committer("Mads Ager", "ager@chromium.org"),
     Committer("Mahesh Kulkarni", ["mahesh.kulkarni@nokia.com", "maheshk@webkit.org"], "maheshk"),
     Committer("Marcus Voltis Bulach", "bulach@chromium.org"),
-    Committer("Mario Sanchez Prada", ["msanchez@igalia.com", "mario@webkit.org"], "msanchez"),
+    Committer("Mario Sanchez Prada", ["mario@webkit.org", "mario.prada@samsung.com"], "msanchez"),
     Committer("Mark Lam", "mark.lam@apple.com", "mlam"),
+    Committer("Mark Pilgrim", "pilgrim@chromium.org", "pilgrim_google"),
     Committer("Mary Wu", ["mary.wu@torchmobile.com.cn", "wwendy2007@gmail.com"], "marywu"),
     Committer("Matt Delaney", "mdelaney@apple.com"),
+    Committer("Matt Falkenhagen", "falken@chromium.org", "falken"),
     Committer("Matt Lilek", ["mlilek@apple.com", "webkit@mattlilek.com", "pewtermoose@webkit.org"], "pewtermoose"),
     Committer("Matt Perry", "mpcomplete@chromium.org"),
+    Committer("Max Vujovic", ["mvujovic@adobe.com", "maxvujovic@gmail.com"], "mvujovic"),
     Committer("Maxime Britto", ["maxime.britto@gmail.com", "britto@apple.com"]),
     Committer("Maxime Simon", ["simon.maxime@gmail.com", "maxime.simon@webkit.org"], "maxime.simon"),
-    Committer(u"Michael Br\u00fcning", ["michaelbruening@gmail.com", "michael.bruning@digia.com", "michael.bruning@nokia.com"], "mibrunin"),
+    Committer(u"Michael Br\u00fcning", ["michael.bruning@digia.com", "michaelbruening@gmail.com"], "mibrunin"),
     Committer("Michael Nordman", "michaeln@google.com", "michaeln"),
     Committer("Michelangelo De Simone", "michelangelo@webkit.org", "michelangelo"),
     Committer("Mihnea Ovidenie", "mihnea@adobe.com", "mihnea"),
@@ -351,47 +388,55 @@
     Committer("Mike Thole", ["mthole@mikethole.com", "mthole@apple.com"]),
     Committer("Mike West", ["mkwst@chromium.org", "mike@mikewest.org"], "mkwst"),
     Committer("Mikhail Naganov", "mnaganov@chromium.org"),
+    Committer("Mikhail Pozdnyakov", "mikhail.pozdnyakov@intel.com", "MPozdnyakov"),
     Committer("Naoki Takano", ["honten@chromium.org", "takano.naoki@gmail.com"], "honten"),
     Committer("Nat Duca", ["nduca@chromium.org", "nduca@google.com"], "nduca"),
     Committer("Nayan Kumar K", ["nayankk@motorola.com", "nayankk@gmail.com"], "xc0ffee"),
-    Committer("Nico Weber", ["thakis@chromium.org", "thakis@google.com"], "thakis"),
+    Committer("Nima Ghanavatian", ["nghanavatian@rim.com", "nima.ghanavatian@gmail.com"], "nghanavatian"),
     Committer("Noel Gordon", ["noel.gordon@gmail.com", "noel@chromium.org", "noel@google.com"], "noel"),
+    Committer("Pablo Flouret", ["pablof@motorola.com", "pf@parb.es"], "pablof"),
     Committer("Pam Greene", "pam@chromium.org", "pamg"),
     Committer("Patrick Gansterer", ["paroga@paroga.com", "paroga@webkit.org"], "paroga"),
     Committer("Pavel Podivilov", "podivilov@chromium.org", "podivilov"),
     Committer("Peter Beverloo", ["peter@chromium.org", "peter@webkit.org", "beverloo@google.com"], "beverloo"),
     Committer("Peter Kasting", ["pkasting@google.com", "pkasting@chromium.org"], "pkasting"),
     Committer("Peter Varga", ["pvarga@webkit.org", "pvarga@inf.u-szeged.hu"], "stampho"),
-    Committer("Philip Rogers", ["pdr@google.com", "pdr@chromium.org"], "pdr"),
     Committer("Pierre d'Herbemont", ["pdherbemont@free.fr", "pdherbemont@apple.com"], "pdherbemont"),
     Committer("Pierre-Olivier Latour", "pol@apple.com", "pol"),
     Committer("Pierre Rossi", "pierre.rossi@gmail.com", "elproxy"),
     Committer("Pratik Solanki", "psolanki@apple.com", "psolanki"),
+    Committer("Pravin D", ["pravind@webkit.org", "pravin.d@samsung.com"], "pravind"),
     Committer("Qi Zhang", "qi.zhang02180@gmail.com", "qi"),
     Committer("Rafael Antognolli", "antognolli@profusion.mobi", "antognolli"),
     Committer("Rafael Brandao", "rafael.lobo@openbossa.org", "rafaelbrandao"),
     Committer("Rafael Weinstein", "rafaelw@chromium.org", "rafaelw"),
     Committer("Raphael Kubo da Costa", ["rakuco@webkit.org", "rakuco@FreeBSD.org", "raphael.kubo.da.costa@intel.com"], "rakuco"),
     Committer("Ravi Kasibhatla", "ravi.kasibhatla@motorola.com", "kphanee"),
+    Committer("Raymond Toy", ["rtoy@google.com", "rtoy@chromium.org"], "rtoy"),
     Committer("Renata Hodovan", "reni@webkit.org", "reni"),
-    Committer("Robert Hogan", ["robert@webkit.org", "robert@roberthogan.net", "lists@roberthogan.net"], "mwenge"),
+    Committer("Robert Hogan", ["robert@webkit.org", "robert@roberthogan.net", "lists@roberthogan.net"], "rhogan"),
     Committer("Robert Kroeger", "rjkroege@chromium.org", "rjkroege"),
     Committer("Roger Fong", "roger_fong@apple.com", "rfong"),
     Committer("Roland Steiner", "rolandsteiner@chromium.org"),
-    Committer("Ryuan Choi", "ryuan.choi@samsung.com", "ryuan"),
+    Committer("Ryuan Choi", ["ryuan.choi@samsung.com", "ryuan.choi@gmail.com"],"ryuan"),
+    Committer("Sadrul Habib Chowdhury", "sadrul@chromium.org", ["sadrul", "sadrulhc"]),
+    Committer(u"Sami Ky\u00f6stil\u00e4", "skyostil@chromium.org", "skyostil"),
     Committer("Satish Sampath", "satish@chromium.org"),
     Committer("Scott Violet", "sky@chromium.org", "sky"),
     Committer("Sergio Villar Senin", ["svillar@igalia.com", "sergio@webkit.org"], "svillar"),
     Committer("Shawn Singh", "shawnsingh@chromium.org", "shawnsingh"),
     Committer("Shinya Kawanaka", "shinyak@chromium.org", "shinyak"),
     Committer("Siddharth Mathur", "siddharth.mathur@nokia.com", "simathur"),
+    Committer("Silvia Pfeiffer", "silviapf@chromium.org", "silvia"),
     Committer("Simon Pena", "spena@igalia.com", "spenap"),
-    Committer("Stephen Chenney", "schenney@chromium.org", "schenney"),
     Committer("Steve Lacey", "sjl@chromium.org", "stevela"),
+    Committer("Sudarsana Nagineni", ["naginenis@gmail.com", "sudarsana.nagineni@linux.intel.com", "sudarsana.nagineni@intel.com"], "babu"),
+    Committer("Szilard Ledan-Muntean", "szledan@inf.u-szeged.hu", "szledan"),
     Committer("Taiju Tsuiki", "tzik@chromium.org", "tzik"),
     Committer("Takashi Sakamoto", "tasak@google.com", "tasak"),
-    Committer("Takashi Toyoshima", "toyoshim@chromium.org", "toyoshim"),
+    Committer("Takashi Toyoshima", ["toyoshim@chromium.org", "toyoshim+watchlist@chromium.org"], "toyoshim"),
     Committer("Terry Anderson", "tdanderson@chromium.org", "tdanderson"),
+    Committer("Thiago Marcos P. Santos", ["tmpsantos@gmail.com", "thiago.santos@intel.com"], "tmpsantos"),
     Committer("Thomas Sepez", "tsepez@chromium.org", "tsepez"),
     Committer("Tom Hudson", ["tomhudson@google.com", "tomhudson@chromium.org"], "tomhudson"),
     Committer("Tom Zakrajsek", "tomz@codeaurora.org", "tomz"),
@@ -400,25 +445,30 @@
     Committer("Tristan O'Tierney", ["tristan@otierney.net", "tristan@apple.com"]),
     Committer("Vangelis Kokkevis", "vangelis@chromium.org", "vangelis"),
     Committer("Viatcheslav Ostapenko", ["ostap73@gmail.com", "v.ostapenko@samsung.com", "v.ostapenko@sisa.samsung.com"], "ostap"),
-    Committer("Victor Carbune", "victor@rosedu.org", "vcarbune"),
+    Committer("Victor Carbune", ["vcarbune@chromium.org", "victor@rosedu.org"], "vcarbune"),
     Committer("Victor Wang", "victorw@chromium.org", "victorw"),
     Committer("Victoria Kirst", ["vrk@chromium.org", "vrk@google.com"], "vrk"),
     Committer("Vincent Scheib", "scheib@chromium.org", "scheib"),
+    Committer("Vineet Chaudhary", "rgf748@motorola.com", "vineetc"),
     Committer("Vitaly Repeshko", "vitalyr@chromium.org"),
+    Committer("Vivek Galatage", ["vivekg@webkit.org", "vivek.vg@samsung.com"], "vivekg"),
     Committer("William Siegrist", "wsiegrist@apple.com", "wms"),
     Committer("W. James MacLean", "wjmaclean@chromium.org", "seumas"),
     Committer("Xianzhu Wang", ["wangxianzhu@chromium.org", "phnixwxz@gmail.com", "wangxianzhu@google.com"], "wangxianzhu"),
+    Committer("Xiaohai Wei", ["james.wei@intel.com", "wistoch@chromium.org"], "wistoch"),
     Committer("Xiaomei Ji", "xji@chromium.org", "xji"),
-    Committer("Yael Aharon", ["yael.aharon.m@gmail.com", "yael@webkit.org"], "yael"),
+    Committer("Xingnan Wang", "xingnan.wang@intel.com", "xingnan"),
+    Committer("Yael Aharon", "yael@webkit.org", "yael"),
     Committer("Yaar Schnitman", ["yaar@chromium.org", "yaar@google.com"]),
-    Committer("Yi Shen", ["yi.4.shen@nokia.com", "shenyi2006@gmail.com"]),
-    Committer("Yongjun Zhang", ["yongjun.zhang@nokia.com", "yongjun_zhang@apple.com"]),
+    Committer("Yi Shen", ["max.hong.shen@gmail.com", "yi.shen@sisa.samsung.com", "yi.4.shen@nokia.com"]),
+    Committer("Yongjun Zhang", ["yongjun_zhang@apple.com", "yongjun.zhang@nokia.com"]),
     Committer("Yoshifumi Inoue", "yosin@chromium.org", "yosin"),
     Committer("Yuqiang Xian", "yuqiang.xian@intel.com"),
     Committer("Yuzo Fujishima", "yuzo@google.com", "yuzo"),
     Committer("Zalan Bujtas", ["zbujtas@gmail.com", "zalan.bujtas@nokia.com"], "zalan"),
     Committer("Zeno Albisser", ["zeno@webkit.org", "zeno.albisser@nokia.com"], "zalbisser"),
     Committer("Zhenyao Mo", "zmo@google.com", "zhenyao"),
+    Committer("Zoltan Arvai", "zarvai@inf.u-szeged.hu", "azbest_hu"),
     Committer("Zoltan Horvath", ["zoltan@webkit.org", "hzoltan@inf.u-szeged.hu", "horvath.zoltan.6@stud.u-szeged.hu"], "zoltan"),
     Committer(u"\u017dan Dober\u0161ek", "zandobersek@gmail.com", "zdobersek"),
 ]
@@ -442,11 +492,12 @@
     Reviewer("Alexey Proskuryakov", ["ap@webkit.org", "ap@apple.com"], "ap"),
     Reviewer("Alexis Menard", ["alexis@webkit.org", "menard@kde.org"], "darktears"),
     Reviewer("Alice Liu", "alice.liu@apple.com", "aliu"),
+    Reviewer("Allan Sandfeld Jensen", ["allan.jensen@digia.com", "kde@carewolf.com", "sandfeld@kde.org", "allan.jensen@nokia.com"], "carewolf"),
     Reviewer("Alp Toker", ["alp@nuanti.com", "alp@atoker.com", "alp@webkit.org"], "alp"),
     Reviewer("Anders Carlsson", ["andersca@apple.com", "acarlsson@apple.com"], "andersca"),
-    Reviewer("Andreas Kling", ["kling@webkit.org", "awesomekling@apple.com", "andreas.kling@nokia.com"], "kling"),
+    Reviewer("Andreas Kling", ["akling@apple.com", "kling@webkit.org", "awesomekling@apple.com", "andreas.kling@nokia.com"], "kling"),
     Reviewer("Andy Estes", "aestes@apple.com", "estes"),
-    Reviewer("Antonio Gomes", ["tonikitoo@webkit.org", "agomes@rim.com"], "tonikitoo"),
+    Reviewer("Antonio Gomes", ["tonikitoo@webkit.org", "a1.gomes@sisa.samsung.com", "antonio.netto@samsung.com", "agomes@rim.com", "antonio.gomes@openbossa.org"], "tonikitoo"),
     Reviewer("Antti Koivisto", ["koivisto@iki.fi", "antti@apple.com", "antti.j.koivisto@nokia.com"], "anttik"),
     Reviewer("Ariya Hidayat", ["ariya.hidayat@gmail.com", "ariya@sencha.com", "ariya@webkit.org"], "ariya"),
     Reviewer("Benjamin Poulain", ["benjamin@webkit.org", "benjamin.poulain@nokia.com", "ikipou@gmail.com"], "benjaminp"),
@@ -454,7 +505,7 @@
     Reviewer("Brady Eidson", "beidson@apple.com", "bradee-oh"),
     Reviewer("Brent Fulgham", "bfulgham@webkit.org", "bfulgham"),
     Reviewer("Brian Weinstein", "bweinstein@apple.com", "bweinstein"),
-    Reviewer("Caio Marcelo de Oliveira Filho", ["cmarcelo@webkit.org", "caio.oliveira@openbossa.org"], "cmarcelo"),
+    Reviewer("Caio Marcelo de Oliveira Filho", ["cmarcelo@webkit.org", "cmarcelo@gmail.com", "caio.oliveira@openbossa.org"], "cmarcelo"),
     Reviewer("Cameron Zwarich", ["zwarich@apple.com", "cwzwarich@apple.com", "cwzwarich@webkit.org"]),
     Reviewer("Carlos Garcia Campos", ["cgarcia@igalia.com", "carlosgc@gnome.org", "carlosgc@webkit.org"], "KaL"),
     Reviewer("Chang Shu", ["cshu@webkit.org", "c.shu@sisa.samsung.com"], "cshu"),
@@ -479,6 +530,7 @@
     Reviewer("Dmitry Titov", "dimich@chromium.org", "dimich"),
     Reviewer("Don Melton", "gramps@apple.com", "gramps"),
     Reviewer("Dumitru Daniliuc", "dumi@chromium.org", "dumi"),
+    Reviewer("Elliott Sprehn", ["esprehn@chromium.org", "esprehn+autocc@chromium.org"], "esprehn"),
     Reviewer("Emil A Eklund", "eae@chromium.org", "eae"),
     Reviewer("Enrica Casucci", "enrica@apple.com", "enrica"),
     Reviewer("Eric Carlson", "eric.carlson@apple.com", "eric_carlson"),
@@ -489,10 +541,11 @@
     Reviewer("George Staikos", ["staikos@kde.org", "staikos@webkit.org"]),
     Reviewer("Gustavo Noronha Silva", ["gns@gnome.org", "kov@webkit.org", "gustavo.noronha@collabora.co.uk", "gustavo.noronha@collabora.com"], "kov"),
     Reviewer("Gyuyoung Kim", ["gyuyoung.kim@samsung.com", "gyuyoung.kim@webkit.org"], "gyuyoung"),
-    Reviewer("Hajime Morita", ["morrita@google.com", "morrita@chromium.org"], "morrita"),
+    Reviewer("Hajime Morrita", ["morrita@google.com", "morrita@chromium.org"], "morrita"),
     Reviewer("Holger Freyther", ["zecke@selfish.org", "zecke@webkit.org"], "zecke"),
     Reviewer("James Robinson", ["jamesr@chromium.org", "jamesr@google.com"], "jamesr"),
     Reviewer("Jan Alonzo", ["jmalonzo@gmail.com", "jmalonzo@webkit.org"], "janm"),
+    Reviewer("Jer Noble", "jer.noble@apple.com", "jernoble"),
     Reviewer("Jeremy Orlow", ["jorlow@webkit.org", "jorlow@chromium.org"], "jorlow"),
     Reviewer("Jessie Berlin", ["jberlin@webkit.org", "jberlin@apple.com"], "jessieberlin"),
     Reviewer("Jian Li", "jianli@chromium.org", "jianli"),
@@ -512,7 +565,7 @@
     Reviewer("Kevin McCullough", "kmccullough@apple.com", "maculloch"),
     Reviewer("Kevin Ollivier", ["kevino@theolliviers.com", "kevino@webkit.org"], "kollivier"),
     Reviewer("Lars Knoll", ["lars@trolltech.com", "lars@kde.org", "lars.knoll@nokia.com"], "lars"),
-    Reviewer("Laszlo Gombos", ["laszlo.gombos@webkit.org", "l.gombos@samsung.com", "laszlo.1.gombos@nokia.com"], "lgombos"),
+    Reviewer("Laszlo Gombos", ["laszlo.gombos@webkit.org", "l.gombos@samsung.com", "laszlo.gombos@gmail.com", "laszlo.1.gombos@nokia.com"], "lgombos"),
     Reviewer("Levi Weintraub", ["leviw@chromium.org", "leviw@google.com", "lweintraub@apple.com"], "leviw"),
     Reviewer("Luiz Agostini", ["luiz@webkit.org", "luiz.agostini@openbossa.org"], "lca"),
     Reviewer("Maciej Stachowiak", "mjs@apple.com", "othermaciej"),
@@ -522,11 +575,13 @@
     Reviewer("Michael Saboff", "msaboff@apple.com", "msaboff"),
     Reviewer("Mihai Parparita", "mihaip@chromium.org", "mihaip"),
     Reviewer("Nate Chapin", "japhet@chromium.org", ["japhet", "natechapin"]),
+    Reviewer("Nico Weber", ["thakis@chromium.org", "thakis@google.com"], "thakis"),
     Reviewer("Nikolas Zimmermann", ["zimmermann@kde.org", "zimmermann@physik.rwth-aachen.de", "zimmermann@webkit.org", "nzimmermann@rim.com"], "wildfox"),
-    Reviewer("Noam Rosenthal", "noam.rosenthal@nokia.com", "noamr"),
-    Reviewer("Ojan Vafai", "ojan@chromium.org", "ojan"),
+    Reviewer("Noam Rosenthal", ["noam@webkit.org", "noam.rosenthal@nokia.com"], "noamr"),
+    Reviewer("Ojan Vafai", ["ojan@chromium.org", "ojan.autocc@gmail.com"], "ojan"),
     Reviewer("Oliver Hunt", "oliver@apple.com", "olliej"),
     Reviewer("Pavel Feldman", ["pfeldman@chromium.org", "pfeldman@google.com"], "pfeldman"),
+    Reviewer("Philip Rogers", ["pdr@google.com", "pdr@chromium.org"], "pdr"),
     Reviewer("Philippe Normand", ["pnormand@igalia.com", "philn@webkit.org", "philn@igalia.com"], ["philn-tp", "pnormand"]),
     Reviewer("Richard Williamson", "rjw@apple.com", "rjw"),
     Reviewer("Rob Buis", ["rwlbuis@gmail.com", "rwlbuis@webkit.org", "rbuis@rim.com"], "rwlbuis"),
@@ -536,8 +591,9 @@
     Reviewer("Simon Fraser", "simon.fraser@apple.com", "smfr"),
     Reviewer("Simon Hausmann", ["hausmann@webkit.org", "hausmann@kde.org", "simon.hausmann@digia.com"], "tronical"),
     Reviewer("Stephanie Lewis", "slewis@apple.com", "sundiamonde"),
+    Reviewer("Stephen Chenney", "schenney@chromium.org", "schenney"),
     Reviewer("Stephen White", "senorblanco@chromium.org", "senorblanco"),
-    Reviewer("Steve Block", "steveblock@google.com", "steveblock"),
+    Reviewer("Steve Block", ["steveblock@chromium.org", "steveblock@google.com"], "steveblock"),
     Reviewer("Steve Falkenburg", "sfalken@apple.com", "sfalken"),
     Reviewer("Tim Omernick", "timo@apple.com"),
     Reviewer("Timothy Hatcher", ["timothy@apple.com", "timothy@hatcher.name"], "xenon"),
@@ -548,7 +604,7 @@
     Reviewer("Vicki Murley", "vicki@apple.com"),
     Reviewer("Vsevolod Vlasov", "vsevik@chromium.org", "vsevik"),
     Reviewer("Xan Lopez", ["xan.lopez@gmail.com", "xan@gnome.org", "xan@webkit.org", "xlopez@igalia.com"], "xan"),
-    Reviewer("Yong Li", ["yoli@rim.com", "yong.li.webkit@gmail.com"], "yoli"),
+    Reviewer("Yong Li", ["yong.li.webkit@outlook.com"], "yoli"),
     Reviewer("Yury Semikhatsky", "yurys@chromium.org", "yurys"),
     Reviewer("Yuta Kitamura", "yutak@chromium.org", "yutak"),
     Reviewer("Zack Rusin", "zack@kde.org", "zackr"),
@@ -634,7 +690,8 @@
         return None
 
     def contributors_by_search_string(self, string):
-        return filter(lambda contributor: contributor.contains_string(string), self.contributors())
+        glob_matches = filter(lambda contributor: contributor.matches_glob(string), self.contributors())
+        return glob_matches or filter(lambda contributor: contributor.contains_string(string), self.contributors())
 
     def contributors_by_email_username(self, string):
         string = string + '@'
diff --git a/Tools/Scripts/webkitpy/common/config/committers_unittest.py b/Tools/Scripts/webkitpy/common/config/committers_unittest.py
index 1c8c86a..ce9335b 100644
--- a/Tools/Scripts/webkitpy/common/config/committers_unittest.py
+++ b/Tools/Scripts/webkitpy/common/config/committers_unittest.py
@@ -25,7 +25,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 from webkitpy.common.config.committers import Account, CommitterList, Contributor, Committer, Reviewer
 
 class CommittersTest(unittest.TestCase):
@@ -51,7 +51,7 @@
         # Test valid committer, reviewer and contributor lookup
         self.assertEqual(committer_list.committer_by_name("Test One"), committer)
         self.assertEqual(committer_list.committer_by_name("Test Two"), reviewer)
-        self.assertEqual(committer_list.committer_by_name("Test Three"), None)
+        self.assertIsNone(committer_list.committer_by_name("Test Three"))
         self.assertEqual(committer_list.contributor_by_name("Test Three"), contributor)
         self.assertEqual(committer_list.contributor_by_name("test one"), committer)
         self.assertEqual(committer_list.contributor_by_name("test two"), reviewer)
@@ -62,21 +62,21 @@
 
         # Test lookup by login email address
         self.assertEqual(committer_list.account_by_login('zero@test.com'), account)
-        self.assertEqual(committer_list.account_by_login('zero@gmail.com'), None)
+        self.assertIsNone(committer_list.account_by_login('zero@gmail.com'))
         self.assertEqual(committer_list.account_by_login('one@test.com'), committer)
         self.assertEqual(committer_list.account_by_login('two@test.com'), reviewer)
-        self.assertEqual(committer_list.account_by_login('Two@rad.com'), None)
-        self.assertEqual(committer_list.account_by_login('so_two@gmail.com'), None)
+        self.assertIsNone(committer_list.account_by_login('Two@rad.com'))
+        self.assertIsNone(committer_list.account_by_login('so_two@gmail.com'))
 
         # Test that a known committer is not returned during reviewer lookup
-        self.assertEqual(committer_list.reviewer_by_email('one@test.com'), None)
-        self.assertEqual(committer_list.reviewer_by_email('three@test.com'), None)
+        self.assertIsNone(committer_list.reviewer_by_email('one@test.com'))
+        self.assertIsNone(committer_list.reviewer_by_email('three@test.com'))
         # and likewise that a known contributor is not returned for committer lookup.
-        self.assertEqual(committer_list.committer_by_email('three@test.com'), None)
+        self.assertIsNone(committer_list.committer_by_email('three@test.com'))
 
         # Test that unknown email address fail both committer and reviewer lookup
-        self.assertEqual(committer_list.committer_by_email('bar@bar.com'), None)
-        self.assertEqual(committer_list.reviewer_by_email('bar@bar.com'), None)
+        self.assertIsNone(committer_list.committer_by_email('bar@bar.com'))
+        self.assertIsNone(committer_list.reviewer_by_email('bar@bar.com'))
 
         # Test that emails returns a list.
         self.assertEqual(committer.emails, ['one@test.com'])
@@ -95,6 +95,8 @@
         self.assertEqual(committer_list.contributors_by_search_string('test'), [contributor, committer, reviewer])
         self.assertEqual(committer_list.contributors_by_search_string('rad'), [reviewer])
         self.assertEqual(committer_list.contributors_by_search_string('Two'), [reviewer])
+        self.assertEqual(committer_list.contributors_by_search_string('otherfour'), [contributor_with_two_nicknames])
+        self.assertEqual(committer_list.contributors_by_search_string('*otherfour*'), [contributor_with_two_nicknames, contributor_with_same_email_username])
 
         self.assertEqual(committer_list.contributors_by_email_username("one"), [committer])
         self.assertEqual(committer_list.contributors_by_email_username("four"), [])
diff --git a/Tools/Scripts/webkitpy/common/config/committervalidator.py b/Tools/Scripts/webkitpy/common/config/committervalidator.py
index 6cec3da..89a4866 100644
--- a/Tools/Scripts/webkitpy/common/config/committervalidator.py
+++ b/Tools/Scripts/webkitpy/common/config/committervalidator.py
@@ -78,18 +78,20 @@
                                        attachment_id,
                                        additional_comment_text=None):
         comment_text = "Rejecting attachment %s from commit-queue." % attachment_id
+        if additional_comment_text:
+            comment_text += "\n\n%s" % additional_comment_text
         self.host.bugs.set_flag_on_attachment(attachment_id,
                                               "commit-queue",
                                               "-",
-                                              comment_text,
-                                              additional_comment_text)
+                                              comment_text)
 
     def reject_patch_from_review_queue(self,
                                        attachment_id,
                                        additional_comment_text=None):
         comment_text = "Rejecting attachment %s from review queue." % attachment_id
+        if additional_comment_text:
+            comment_text += "\n\n%s" % additional_comment_text
         self.host.bugs.set_flag_on_attachment(attachment_id,
                                               'review',
                                               '-',
-                                              comment_text,
-                                              additional_comment_text)
+                                              comment_text)
diff --git a/Tools/Scripts/webkitpy/common/config/committervalidator_unittest.py b/Tools/Scripts/webkitpy/common/config/committervalidator_unittest.py
index 232f077..e8aa887 100644
--- a/Tools/Scripts/webkitpy/common/config/committervalidator_unittest.py
+++ b/Tools/Scripts/webkitpy/common/config/committervalidator_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
 from .committervalidator import CommitterValidator
@@ -41,4 +41,4 @@
 - If you do not have review rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.
 
 - If you have review rights please correct the error in Tools/Scripts/webkitpy/common/config/committers.py by adding yourself to the file (no review needed).  The commit-queue restarts itself every 2 hours.  After restart the commit-queue will correctly respect your review rights."""
-        self.assertEqual(validator._flag_permission_rejection_message("foo@foo.com", "review"), expected_messsage)
+        self.assertMultiLineEqual(validator._flag_permission_rejection_message("foo@foo.com", "review"), expected_messsage)
diff --git a/Tools/Scripts/webkitpy/common/config/contributionareas.py b/Tools/Scripts/webkitpy/common/config/contributionareas.py
index 61a7488..b48df2a 100644
--- a/Tools/Scripts/webkitpy/common/config/contributionareas.py
+++ b/Tools/Scripts/webkitpy/common/config/contributionareas.py
@@ -180,9 +180,6 @@
     def names(self):
         return [area.name() for area in self._contribution_areas]
 
-    def names(self):
-        return [area.name() for area in self._contribution_areas]
-
     def _split_path(self, path):
         result = []
         while path and len(path):
diff --git a/Tools/Scripts/webkitpy/common/config/contributionareas_unittest.py b/Tools/Scripts/webkitpy/common/config/contributionareas_unittest.py
index c3960d9..17d4fe7 100644
--- a/Tools/Scripts/webkitpy/common/config/contributionareas_unittest.py
+++ b/Tools/Scripts/webkitpy/common/config/contributionareas_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from .contributionareas import _Intersection
 from .contributionareas import _Area
diff --git a/Tools/Scripts/webkitpy/common/config/ports.py b/Tools/Scripts/webkitpy/common/config/ports.py
index 884380e..5c7bea0 100644
--- a/Tools/Scripts/webkitpy/common/config/ports.py
+++ b/Tools/Scripts/webkitpy/common/config/ports.py
@@ -38,6 +38,9 @@
 class DeprecatedPort(object):
     results_directory = "/tmp/layout-test-results"
 
+    # Subclasses must override
+    port_flag_name = None
+
     # FIXME: This is only used by BotInfo.
     def name(self):
         return self.__class__
@@ -63,6 +66,7 @@
             "chromium-xvfb": ChromiumXVFBPort,
             "gtk": GtkPort,
             "mac": MacPort,
+            "mac-wk2": MacWK2Port,
             "win": WinPort,
             "qt": QtPort,
             "efl": EflPort,
@@ -113,20 +117,29 @@
     def run_perl_unittests_command(self):
         return self.script_shell_command("test-webkitperl")
 
-    def layout_tests_results_path(self):
-        return os.path.join(self.results_directory, "full_results.json")
-
-    def unit_tests_results_path(self):
-        return os.path.join(self.results_directory, "webkit_unit_tests_output.xml")
+    def run_bindings_tests_command(self):
+        return self.script_shell_command("run-bindings-tests")
 
 
 class MacPort(DeprecatedPort):
     port_flag_name = "mac"
 
 
+class MacWK2Port(DeprecatedPort):
+    port_flag_name = "mac-wk2"
+
+    def run_webkit_tests_command(self):
+        command = super(MacWK2Port, self).run_webkit_tests_command()
+        command.append("-2")
+        return command
+
+
 class WinPort(DeprecatedPort):
     port_flag_name = "win"
 
+    def run_bindings_tests_command(self):
+        return None
+
 
 class GtkPort(DeprecatedPort):
     port_flag_name = "gtk"
@@ -135,6 +148,7 @@
         command = super(GtkPort, self).build_webkit_command(build_style=build_style)
         command.append("--gtk")
         command.append("--update-gtk")
+        command.append("--no-webkit2")
         command.append(super(GtkPort, self).makeArgs())
         return command
 
diff --git a/Tools/Scripts/webkitpy/common/config/ports_mock.py b/Tools/Scripts/webkitpy/common/config/ports_mock.py
index 1d14311..779796c 100644
--- a/Tools/Scripts/webkitpy/common/config/ports_mock.py
+++ b/Tools/Scripts/webkitpy/common/config/ports_mock.py
@@ -28,17 +28,9 @@
 
 
 class MockPort(object):
-    results_directory = "/mock-results"
-
     def name(self):
         return "MockPort"
 
-    def layout_tests_results_path(self):
-        return "/mock-results/full_results.json"
-
-    def unit_tests_results_path(self):
-        return "/mock-results/webkit_unit_tests_output.xml"
-
     def check_webkit_style_command(self):
         return ["mock-check-webkit-style"]
 
@@ -65,3 +57,6 @@
 
     def run_webkit_tests_command(self):
         return ['mock-run-webkit-tests']
+
+    def run_bindings_tests_command(self):
+        return ['mock-run-bindings-tests']
diff --git a/Tools/Scripts/webkitpy/common/config/ports_unittest.py b/Tools/Scripts/webkitpy/common/config/ports_unittest.py
index 2720523..a434211 100644
--- a/Tools/Scripts/webkitpy/common/config/ports_unittest.py
+++ b/Tools/Scripts/webkitpy/common/config/ports_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2009, Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,50 +26,46 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.config.ports import *
 
 
 class DeprecatedPortTest(unittest.TestCase):
     def test_mac_port(self):
-        self.assertEquals(MacPort().flag(), "--port=mac")
-        self.assertEquals(MacPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("run-webkit-tests"))
-        self.assertEquals(MacPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit"))
-        self.assertEquals(MacPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug"])
-        self.assertEquals(MacPort().build_webkit_command(build_style="release"), DeprecatedPort().script_shell_command("build-webkit") + ["--release"])
+        self.assertEqual(MacPort().flag(), "--port=mac")
+        self.assertEqual(MacPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("run-webkit-tests"))
+        self.assertEqual(MacPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit"))
+        self.assertEqual(MacPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug"])
+        self.assertEqual(MacPort().build_webkit_command(build_style="release"), DeprecatedPort().script_shell_command("build-webkit") + ["--release"])
 
     def test_gtk_port(self):
-        self.assertEquals(GtkPort().flag(), "--port=gtk")
-        self.assertEquals(GtkPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("run-webkit-tests") + ["--gtk"])
-        self.assertEquals(GtkPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--gtk", "--update-gtk", DeprecatedPort().makeArgs()])
-        self.assertEquals(GtkPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--gtk", "--update-gtk", DeprecatedPort().makeArgs()])
+        self.assertEqual(GtkPort().flag(), "--port=gtk")
+        self.assertEqual(GtkPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("run-webkit-tests") + ["--gtk"])
+        self.assertEqual(GtkPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--gtk", "--update-gtk", "--no-webkit2", DeprecatedPort().makeArgs()])
+        self.assertEqual(GtkPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--gtk", "--update-gtk", "--no-webkit2", DeprecatedPort().makeArgs()])
 
     def test_efl_port(self):
-        self.assertEquals(EflPort().flag(), "--port=efl")
-        self.assertEquals(EflPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--efl", "--update-efl", DeprecatedPort().makeArgs()])
-        self.assertEquals(EflPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--efl", "--update-efl", DeprecatedPort().makeArgs()])
+        self.assertEqual(EflPort().flag(), "--port=efl")
+        self.assertEqual(EflPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--efl", "--update-efl", DeprecatedPort().makeArgs()])
+        self.assertEqual(EflPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--efl", "--update-efl", DeprecatedPort().makeArgs()])
 
     def test_qt_port(self):
-        self.assertEquals(QtPort().flag(), "--port=qt")
-        self.assertEquals(QtPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("run-webkit-tests"))
-        self.assertEquals(QtPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--qt", DeprecatedPort().makeArgs()])
-        self.assertEquals(QtPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--qt", DeprecatedPort().makeArgs()])
+        self.assertEqual(QtPort().flag(), "--port=qt")
+        self.assertEqual(QtPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("run-webkit-tests"))
+        self.assertEqual(QtPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--qt", DeprecatedPort().makeArgs()])
+        self.assertEqual(QtPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--qt", DeprecatedPort().makeArgs()])
 
     def test_chromium_port(self):
-        self.assertEquals(ChromiumPort().flag(), "--port=chromium")
-        self.assertEquals(ChromiumPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("new-run-webkit-tests") + ["--chromium", "--skip-failing-tests"])
-        self.assertEquals(ChromiumPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--chromium", "--update-chromium"])
-        self.assertEquals(ChromiumPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--chromium", "--update-chromium"])
-        self.assertEquals(ChromiumPort().update_webkit_command(), DeprecatedPort().script_shell_command("update-webkit") + ["--chromium"])
+        self.assertEqual(ChromiumPort().flag(), "--port=chromium")
+        self.assertEqual(ChromiumPort().run_webkit_tests_command(), DeprecatedPort().script_shell_command("new-run-webkit-tests") + ["--chromium", "--skip-failing-tests"])
+        self.assertEqual(ChromiumPort().build_webkit_command(), DeprecatedPort().script_shell_command("build-webkit") + ["--chromium", "--update-chromium"])
+        self.assertEqual(ChromiumPort().build_webkit_command(build_style="debug"), DeprecatedPort().script_shell_command("build-webkit") + ["--debug", "--chromium", "--update-chromium"])
+        self.assertEqual(ChromiumPort().update_webkit_command(), DeprecatedPort().script_shell_command("update-webkit") + ["--chromium"])
 
     def test_chromium_android_port(self):
-        self.assertEquals(ChromiumAndroidPort().build_webkit_command(), ChromiumPort().build_webkit_command() + ["--chromium-android"])
-        self.assertEquals(ChromiumAndroidPort().update_webkit_command(), ChromiumPort().update_webkit_command() + ["--chromium-android"])
+        self.assertEqual(ChromiumAndroidPort().build_webkit_command(), ChromiumPort().build_webkit_command() + ["--chromium-android"])
+        self.assertEqual(ChromiumAndroidPort().update_webkit_command(), ChromiumPort().update_webkit_command() + ["--chromium-android"])
 
     def test_chromium_xvfb_port(self):
-        self.assertEquals(ChromiumXVFBPort().run_webkit_tests_command(), ['xvfb-run'] + DeprecatedPort().script_shell_command('new-run-webkit-tests') + ['--chromium', '--skip-failing-tests'])
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertEqual(ChromiumXVFBPort().run_webkit_tests_command(), ['xvfb-run'] + DeprecatedPort().script_shell_command('new-run-webkit-tests') + ['--chromium', '--skip-failing-tests'])
diff --git a/Tools/Scripts/webkitpy/common/config/urls.py b/Tools/Scripts/webkitpy/common/config/urls.py
index 88ad373..31575c1 100644
--- a/Tools/Scripts/webkitpy/common/config/urls.py
+++ b/Tools/Scripts/webkitpy/common/config/urls.py
@@ -56,6 +56,8 @@
 buildbot_url = "http://build.webkit.org"
 chromium_buildbot_url = "http://build.chromium.org/p/chromium.webkit"
 
+chromium_webkit_sheriff_url = "http://build.chromium.org/p/chromium.webkit/sheriff_webkit.js"
+
 omahaproxy_url = "http://omahaproxy.appspot.com/"
 
 def parse_bug_id(string):
diff --git a/Tools/Scripts/webkitpy/common/config/urls_unittest.py b/Tools/Scripts/webkitpy/common/config/urls_unittest.py
index 2b94b86..c1a082c 100644
--- a/Tools/Scripts/webkitpy/common/config/urls_unittest.py
+++ b/Tools/Scripts/webkitpy/common/config/urls_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from .urls import parse_bug_id, parse_attachment_id
 
@@ -34,28 +34,28 @@
 class URLsTest(unittest.TestCase):
     def test_parse_bug_id(self):
         # FIXME: These would be all better as doctests
-        self.assertEquals(12345, parse_bug_id("http://webkit.org/b/12345"))
-        self.assertEquals(12345, parse_bug_id("foo\n\nhttp://webkit.org/b/12345\nbar\n\n"))
-        self.assertEquals(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345"))
-        self.assertEquals(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345&ctype=xml"))
-        self.assertEquals(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345&ctype=xml&excludefield=attachmentdata"))
-        self.assertEquals(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345excludefield=attachmentdata&ctype=xml"))
+        self.assertEqual(12345, parse_bug_id("http://webkit.org/b/12345"))
+        self.assertEqual(12345, parse_bug_id("foo\n\nhttp://webkit.org/b/12345\nbar\n\n"))
+        self.assertEqual(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345"))
+        self.assertEqual(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345&ctype=xml"))
+        self.assertEqual(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345&ctype=xml&excludefield=attachmentdata"))
+        self.assertEqual(12345, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?id=12345excludefield=attachmentdata&ctype=xml"))
 
         # Our url parser is super-fragile, but at least we're testing it.
-        self.assertEquals(None, parse_bug_id("http://www.webkit.org/b/12345"))
-        self.assertEquals(None, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&id=12345"))
-        self.assertEquals(None, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&id=12345&excludefield=attachmentdata"))
-        self.assertEquals(None, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&excludefield=attachmentdata&id=12345"))
-        self.assertEquals(None, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?excludefield=attachmentdata&ctype=xml&id=12345"))
-        self.assertEquals(None, parse_bug_id("http://bugs.webkit.org/show_bug.cgi?excludefield=attachmentdata&id=12345&ctype=xml"))
+        self.assertIsNone(parse_bug_id("http://www.webkit.org/b/12345"))
+        self.assertIsNone(parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&id=12345"))
+        self.assertIsNone(parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&id=12345&excludefield=attachmentdata"))
+        self.assertIsNone(parse_bug_id("http://bugs.webkit.org/show_bug.cgi?ctype=xml&excludefield=attachmentdata&id=12345"))
+        self.assertIsNone(parse_bug_id("http://bugs.webkit.org/show_bug.cgi?excludefield=attachmentdata&ctype=xml&id=12345"))
+        self.assertIsNone(parse_bug_id("http://bugs.webkit.org/show_bug.cgi?excludefield=attachmentdata&id=12345&ctype=xml"))
 
     def test_parse_attachment_id(self):
-        self.assertEquals(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=review"))
-        self.assertEquals(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=edit"))
-        self.assertEquals(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=prettypatch"))
-        self.assertEquals(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=diff"))
+        self.assertEqual(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=review"))
+        self.assertEqual(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=edit"))
+        self.assertEqual(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=prettypatch"))
+        self.assertEqual(12345, parse_attachment_id("https://bugs.webkit.org/attachment.cgi?id=12345&action=diff"))
 
         # Direct attachment links are hosted from per-bug subdomains:
-        self.assertEquals(12345, parse_attachment_id("https://bug-23456-attachments.webkit.org/attachment.cgi?id=12345"))
+        self.assertEqual(12345, parse_attachment_id("https://bug-23456-attachments.webkit.org/attachment.cgi?id=12345"))
         # Make sure secure attachment URLs work too.
-        self.assertEquals(12345, parse_attachment_id("https://bug-23456-attachments.webkit.org/attachment.cgi?id=12345&t=Bqnsdkl9fs"))
+        self.assertEqual(12345, parse_attachment_id("https://bug-23456-attachments.webkit.org/attachment.cgi?id=12345&t=Bqnsdkl9fs"))
diff --git a/Tools/Scripts/webkitpy/common/config/watchlist b/Tools/Scripts/webkitpy/common/config/watchlist
old mode 100755
new mode 100644
index 854a812..fd66cb4
--- a/Tools/Scripts/webkitpy/common/config/watchlist
+++ b/Tools/Scripts/webkitpy/common/config/watchlist
@@ -1,5 +1,3 @@
-#  -*- mode: Python;-*-
-#
 # When editing this file, please run the following command to make sure you
 # haven't introduced any syntax errors:
 #
@@ -17,7 +15,11 @@
         },
         "ChromiumPublicApi": {
             "filename": r"Source/WebKit/chromium/public/"
-                        r"|Source/Platform/chromium/public/",
+                        r"|Source/Platform/chromium/public/"
+                        r"|Tools/DumpRenderTree/chromium/TestRunner/public",
+        },
+        "ChromiumTestRunner": {
+            "filename": r"Tools/DumpRenderTree/chromium/TestRunner",
         },
         "AppleMacPublicApi": {
             "filename": r"Source/WebCore/bindings/objc/PublicDOMInterfaces.h"
@@ -29,9 +31,20 @@
                         r"|Source/WebCore/html/shadow/(SliderThumbElement|TextControlInnerElements)\."
                         r"|Source/WebCore/rendering/Render(FileUploadControl|ListBox|MenuList|Slider|TextControl.*)\."
         },
+        "Geolocation": {
+            "filename": r"Source/WebCore/Modules/geolocation/"
+                        r"|Source/WebCore/page/GeolocationClient.h"
+                        r"|Source/WebCore/bindings/js/JSGeolocationCustom.cpp"
+                        r"|Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp"
+                        r"|Source/WebCore/platform/mock/GeolocationClientMock.(h|cpp)"
+                        r"|Source/WebKit2/WebProcess/Geolocation/",
+        },
         "GStreamerGraphics": {
             "filename": r"Source/WebCore/platform/graphics/gstreamer/",
         },
+        "GStreamerAudio": {
+            "filename": r"Source/WebCore/platform/audio/gstreamer/",
+        },
         "WebIDL": {
             "filename": r"Source/WebCore/(?!inspector)(?!testing).*\.idl"
         },
@@ -95,6 +108,18 @@
         "Rendering": {
             "filename": r"Source/WebCore/rendering/",
         },
+        "RenderLayers": {
+            "filename": r"Source/WebCore/rendering/RenderLayer*",
+        },
+        "GraphicsLayer": {
+            "filename": r"Source/WebCore/platform/graphics/GraphicsLayer*",
+        },
+        "CoreAnimation": {
+            "filename": r"Source/WebCore/platform/graphics/ca/",
+        },
+        "Animation": {
+            "filename": r"Source/WebCore/page/animation/",
+        },
         "StyleChecker": {
             "filename": r"Tools/Scripts/webkitpy/style/",
         },
@@ -114,8 +139,12 @@
         },
         "QtGraphics": {
             "filename": r"Source/WebCore/platform/graphics/qt/"
-                        r"|Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/"
-                        r"|Source/WebKit2/UIProcess/CoordinatedGraphics",
+        },
+        "CoordinatedGraphics": {
+            "filename": r"Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/"
+                        r"|Source/WebKit2/UIProcess/CoordinatedGraphics/"
+                        r"|Source/WebKit2/Shared/CoordinatedGraphics/"
+                        r"|Source/WebCore/platform/graphics/surfaces/",
         },
         "TextureMapper": {
             "filename": r"Source/WebCore/platform/graphics/texmap/",
@@ -146,6 +175,12 @@
         "CSS": {
             "filename": r"Source/WebCore/css/",
         },
+        "DOM": {
+            "filename": r"Source/WebCore/dom/",
+        },
+        "HTML": {
+            "filename": r"Source/WebCore/html/",
+        },
         "DOMAttributes": {
             "filename": r"Source/WebCore/dom/.*Attr.*"
                         r"|Source/WebCore/dom/NamedNodeMap\.(cpp|h|idl)"
@@ -259,8 +294,10 @@
                         r"|Source/WebCore/rendering/svg",
         },
         "WebInspectorAPI": {
-            "filename": r"Source/WebCore/inspector/*.json"
-                        r"|Source/WebCore/inspector/*.idl",
+            "filename": r"Source/WebCore/inspector/InjectedScriptSource.js"
+                        r"|Source/WebCore/inspector/.+\.json"
+                        r"|Source/WebCore/inspector/.+\.idl"
+                        r"|Source/WebCore/page/Console.idl",
         },
         "WebSocket": {
             "filename": r"Source/WebCore/Modules/websockets"
@@ -280,21 +317,78 @@
         },
         "Harfbuzz": {
             "filename": r"Source/WebCore/platform/graphics/harfbuzz",
-        }
+        },
+        "PerformanceTests": {
+            "filename": r"PerformanceTests"
+                        r"|Tools/Scripts/webkitpy/performance_tests",
+        },
+        "GtkBuildSystem": {
+            "filename": r"configure.ac"
+                        r"|.*GNUmakefile.(am|features.am.in)",
+        },
+        "ConsoleUsage": {
+            "more": r"[Aa]ddConsoleMessage|reportException|logExceptionToConsole|addMessage|printErrorMessage"
+        },
+        "ContentSecurityPolicyUsage": {
+            "more": r"[Cc]ontentSecurityPolicy(?!\.(h|cpp))",
+        },
+        "ContentSecurityPolicyFiles": {
+            "filename": r"Source/WebCore/page/(Content|DOM)SecurityPolicy\."
+                        r"|LayoutTests/http/tests/security/contentSecurityPolicy"
+        },
+        "RegionsDevelopment": {
+            "filename": r"Source/WebCore/rendering/RenderRegion\.(h|cpp)"
+                        r"|Source/WebCore/rendering/RenderFlowThread\.(h|cpp)"
+                        r"|Source/WebCore/rendering/FlowThreadController\.(h|cpp)"
+                        r"|Source/WebCore/rendering/RenderRegionSet\.(h|cpp)"
+                        r"|Source/WebCore/rendering/RenderNamedFlowThread\.(h|cpp)"
+                        r"|Source/WebCore/rendering/RenderBoxRegionInfo\.h"
+                        r"|Source/WebCore/dom/WebKitNamedFlow\.(h|cpp|idl)"
+                        r"|Source/WebCore/dom/(DOM)?NamedFlowCollection\.(h|cpp|idl)"
+                        r"|Source/WebCore/css/WebKitCSSRegionRule\.(h|cpp|idl)"
+                        r"|LayoutTests/fast/regions",
+        },
+        "RegionsExpectationsMore": {
+            "filename": r"LayoutTests/platform/.*TestExpectations",
+            "more": r"fast/regions/.*\.html",
+        },
+        "RegionsExpectationsLess": {
+            "filename": r"LayoutTests/platform/.*TestExpectations",
+            "less": r"fast/regions/.*\.html",
+        },
+        "RegionsUsage": {
+            "more": r"(RenderRegion|RenderFlowThread|RenderNamedFlowThread)(?!\.(h|cpp))",
+        },
+        "IndexedDB": {
+            "filename": r"Source/WebCore/Modules/indexeddb"
+                        r"|Source/WebCore/bindings/.*IDB.*\.(h|cpp)"
+                        r"|Source/WebCore/bindings/.*SerializedScriptValue.*\.(h|cpp)"
+                        r"|Source/WebKit/chromium/.*IDB.*\.(h|cpp)"
+                        r"|Source/WebCore/platform/leveldb"
+                        r"|LayoutTests/storage/indexeddb"
+                        r"|LayoutTests/platform/.*/storage/indexeddb",
+        },
     },
     "CC_RULES": {
         # Note: All email addresses listed must be registered with bugzilla.
         # Specifically, levin@chromium.org and levin+threading@chromium.org are
         # two different accounts as far as bugzilla is concerned.
-        "Accessibility": [ "cfleizach@apple.com", "dmazzoni@google.com", "apinheiro@igalia.com", "jdiggs@igalia.com" ],
+        "Accessibility": [ "cfleizach@apple.com", "dmazzoni@google.com", "apinheiro@igalia.com", "jdiggs@igalia.com", "aboxhall@chromium.org" ],
+        "Animation" : [ "simon.fraser@apple.com", "dino@apple.com", "dstockwell@chromium.org" ],
         "AppleMacPublicApi": [ "timothy@apple.com" ],
         "Battery": [ "gyuyoung.kim@samsung.com" ],
         "BlackBerry": [ "mifenton@rim.com", "rwlbuis@gmail.com", "tonikitoo@webkit.org" ],
         "Cairo": [ "dominik.rottsches@intel.com" ],
         "CMake": [ "rakuco@webkit.org", "gyuyoung.kim@samsung.com" ],
-        "CSS": [ "alexis@webkit.org", "macpherson@chromium.org", "cmarcelo@webkit.org"],
+        "CoordinatedGraphics" : [ "noam@webkit.org", "zeno@webkit.org", "cmarcelo@webkit.org", "luiz@webkit.org" ],
+        "ConsoleUsage" : [ "mkwst+watchlist@chromium.org" ],
+        "ContentSecurityPolicyFiles|ContentSecurityPolicyUsage" : [ "mkwst+watchlist@chromium.org" ],
+        "CoreAnimation" : [ "simon.fraser@apple.com" ],
+        "CSS": [ "alexis@webkit.org", "macpherson@chromium.org", "ojan.autocc@gmail.com", "esprehn+autocc@chromium.org"],
         "ChromiumGraphics": [ "jamesr@chromium.org", "cc-bugs@chromium.org" ],
         "ChromiumPublicApi": [ "abarth@webkit.org", "dglazkov@chromium.org", "fishd@chromium.org", "jamesr@chromium.org", "tkent+wkapi@chromium.org" ],
+        "ChromiumTestRunner": [ "jochen@chromium.org" ],
+        "DOM": [ "ojan.autocc@gmail.com", "esprehn+autocc@chromium.org" ],
         "DOMAttributes": [ "cmarcelo@webkit.org", ],
         "EFL": [ "rakuco@webkit.org", "gyuyoung.kim@samsung.com" ],
         "EFLWebKit2PlatformSpecific": [ "gyuyoung.kim@samsung.com", "rakuco@webkit.org" ],
@@ -303,43 +397,52 @@
         "Filters": [ "dino@apple.com" ],
         "Forms": [ "tkent@chromium.org", "mifenton@rim.com" ],
         "FrameLoader": [ "abarth@webkit.org", "japhet@chromium.org" ],
+        "Geolocation": [ "benjamin@webkit.org" ],
+        "GraphicsLayer": [ "simon.fraser@apple.com" ],
         "GStreamerGraphics": [ "alexis@webkit.org", "pnormand@igalia.com", "gns@gnome.org", "mrobinson@webkit.org" ],
+        "GStreamerAudio": [ "pnormand@igalia.com" ],
+        "GtkBuildSystem": [ "zandobersek@gmail.com" ],
         "GtkWebKit2PublicAPI": [ "cgarcia@igalia.com", "gns@gnome.org", "mrobinson@webkit.org" ],
         "Harfbuzz": [ "dominik.rottsches@intel.com" ],
+        "HTML": [ "ojan.autocc@gmail.com", "esprehn+autocc@chromium.org" ],
+        "IndexedDB": [ "alecflett@chromium.org", "dgrogan@chromium.org", "jsbell@chromium.org" ],
         "Loader": [ "japhet@chromium.org" ],
         "MathML": [ "dbarton@mathscribe.com" ],
-        "Media": [ "feature-media-reviews@chromium.org", "eric.carlson@apple.com" ],
+        "Media": [ "feature-media-reviews@chromium.org", "eric.carlson@apple.com", "jer.noble@apple.com" ],
         "MediaStream": [ "tommyw@google.com", "hta@google.com" ],
         "NetworkInfo": [ "gyuyoung.kim@samsung.com" ],
-        "OpenGL" : [ "noam.rosenthal@nokia.com", "dino@apple.com" ],
+        "OpenGL" : [ "noam@webkit.org", "dino@apple.com" ],
+        "PerformanceTests": [ "rniwa@webkit.org" ],
         "QtBuildSystem" : [ "vestbo@webkit.org", "abecsi@webkit.org" ],
-        "QtGraphics" : [ "noam.rosenthal@nokia.com" ],
+        "QtGraphics" : [ "noam@webkit.org" ],
         "QtWebKit2PlatformSpecific": [ "alexis@webkit.org", "cmarcelo@webkit.org", "abecsi@webkit.org" ],
         "QtWebKit2PublicAPI": [ "alexis@webkit.org", "cmarcelo@webkit.org", "abecsi@webkit.org" ],
-        "Rendering": [ "eric@webkit.org" ],
+        "RegionsDevelopment|RegionsExpectationsMore|RegionsExpectationsLess|RegionsUsage": [ "WebkitBugTracker@adobe.com" ],
+        "Rendering": [ "eric@webkit.org", "ojan.autocc@gmail.com", "esprehn+autocc@chromium.org" ],
+        "RenderLayers" : [ "simon.fraser@apple.com" ],
         "SVG": ["schenney@chromium.org", "pdr@google.com", "fmalita@chromium.org", "dominik.rottsches@intel.com" ],
         "SVNScripts": [ "dbates@webkit.org" ],
-        "ScrollingCoordinator": [ "andersca@apple.com", "jamesr@chromium.org", "tonikitoo@webkit.org" ],
+        "ScrollingCoordinator": [ "andersca@apple.com", "jamesr@chromium.org", "tonikitoo@webkit.org", "cmarcelo@webkit.org", "luiz@webkit.org" ],
         "SecurityCritical": [ "abarth@webkit.org" ],
-        "SkiaGraphics": [ "senorblanco@chromium.org" ],
+        "SkiaGraphics": [ "senorblanco@chromium.org", "junov@google.com" ],
         "Selectors": [ "allan.jensen@digia.com" ],
         "SoupNetwork": [ "rakuco@webkit.org", "gns@gnome.org", "mrobinson@webkit.org", "danw@gnome.org" ],
         "StyleChecker": [ "levin@chromium.org", ],
-        "TestFailures": [ "abarth@webkit.org", "dglazkov@chromium.org" ],
-        "TextureMapper" : [ "noam.rosenthal@nokia.com" ],
+        "TestFailures": [ "abarth@webkit.org", "dglazkov@chromium.org", "ojan.autocc@gmail.com" ],
+        "TextureMapper" : [ "noam@webkit.org", "cmarcelo@webkit.org", "luiz@webkit.org" ],
         "ThreadingFiles|ThreadingUsage": [ "levin+threading@chromium.org", ],
         "TouchAdjustment" : [ "allan.jensen@digia.com" ],
         "V8Bindings|BindingsScripts": [ "abarth@webkit.org", "japhet@chromium.org", "haraken@chromium.org" ],
-        "WTF": [ "benjamin@webkit.org",],
+        "WTF": [ "benjamin@webkit.org", "ojan.autocc@gmail.com", "cmarcelo@webkit.org" ],
         "WatchListScript": [ "levin+watchlist@chromium.org", ],
         "WebGL": [ "dino@apple.com" ],
-        "WebIDL": [ "abarth@webkit.org", "ojan@chromium.org" ],
-        "WebInspectorAPI": [ "timothy@apple.com", "joepeck@webkit.org" ],
+        "WebIDL": [ "abarth@webkit.org", "ojan.autocc@gmail.com", "esprehn+autocc@chromium.org" ],
+        "WebInspectorAPI": [ "timothy@apple.com", "joepeck@webkit.org", "graouts@apple.com" ],
         "WebKitGTKTranslations": [ "gns@gnome.org", "mrobinson@webkit.org" ],
-        "WebSocket": [ "yutak@chromium.org" ],
-        "XSS": [ "dbates@webkit.org" ],
+        "WebSocket": [ "yutak@chromium.org", "toyoshim+watchlist@chromium.org" ],
+        "XSS": [ "dbates@webkit.org", "ojan.autocc@gmail.com" ],
         "webkitperl": [ "dbates@webkit.org" ],
-        "webkitpy": [ "abarth@webkit.org", "ojan@chromium.org", "dpranke@chromium.org" ],
+        "webkitpy": [ "abarth@webkit.org", "dpranke@chromium.org", "eric@webkit.org" ],
     },
     "MESSAGE_RULES": {
         "ChromiumPublicApi": [ "Please wait for approval from abarth@webkit.org, dglazkov@chromium.org, "
diff --git a/Tools/Scripts/webkitpy/common/editdistance_unittest.py b/Tools/Scripts/webkitpy/common/editdistance_unittest.py
index 4ae6441..1f67572 100644
--- a/Tools/Scripts/webkitpy/common/editdistance_unittest.py
+++ b/Tools/Scripts/webkitpy/common/editdistance_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.editdistance import edit_distance
 
diff --git a/Tools/Scripts/webkitpy/common/find_files.py b/Tools/Scripts/webkitpy/common/find_files.py
index 32ce4d1..7a10120 100644
--- a/Tools/Scripts/webkitpy/common/find_files.py
+++ b/Tools/Scripts/webkitpy/common/find_files.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -44,8 +43,10 @@
 will be included into the result if the callback returns True.
 The callback has to take three arguments: filesystem, dirname and filename."""
 
+import itertools
 
-def find(filesystem, base_dir, paths=None, skipped_directories=None, file_filter=None):
+
+def find(filesystem, base_dir, paths=None, skipped_directories=None, file_filter=None, directory_sort_key=None):
     """Finds the set of tests under a given list of sub-paths.
 
     Args:
@@ -57,34 +58,27 @@
 
     paths = paths or ['*']
     skipped_directories = skipped_directories or set(['.svn', '_svn'])
-    return _normalized_find(filesystem, _normalize(filesystem, base_dir, paths), skipped_directories, file_filter)
+    return _normalized_find(filesystem, _normalize(filesystem, base_dir, paths), skipped_directories, file_filter, directory_sort_key)
 
 
 def _normalize(filesystem, base_dir, paths):
     return [filesystem.normpath(filesystem.join(base_dir, path)) for path in paths]
 
 
-def _normalized_find(filesystem, paths, skipped_directories, file_filter):
+def _normalized_find(filesystem, paths, skipped_directories, file_filter, directory_sort_key):
     """Finds the set of tests under the list of paths.
 
     Args:
       paths: a list of absolute path expressions to search.
           Glob patterns are ok.
     """
-    paths_to_walk = set()
 
-    for path in paths:
-        # If there's an * in the name, assume it's a glob pattern.
-        if path.find('*') > -1:
-            filenames = filesystem.glob(path)
-            paths_to_walk.update(filenames)
-        else:
-            paths_to_walk.add(path)
+    paths_to_walk = itertools.chain(*(filesystem.glob(path) for path in paths))
 
-    # FIXME: I'm not sure there's much point in this being a set. A list would probably be faster.
-    all_files = set()
-    for path in paths_to_walk:
-        files = filesystem.files_under(path, skipped_directories, file_filter)
-        all_files.update(set(files))
+    def sort_by_directory_key(files_list):
+        if directory_sort_key:
+            files_list.sort(key=directory_sort_key)
+        return files_list
 
+    all_files = itertools.chain(*(sort_by_directory_key(filesystem.files_under(path, skipped_directories, file_filter)) for path in paths_to_walk))
     return all_files
diff --git a/Tools/Scripts/webkitpy/common/find_files_unittest.py b/Tools/Scripts/webkitpy/common/find_files_unittest.py
index 75beaf0..4c0a7cd 100644
--- a/Tools/Scripts/webkitpy/common/find_files_unittest.py
+++ b/Tools/Scripts/webkitpy/common/find_files_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.filesystem import FileSystem
 import find_files
@@ -43,7 +43,7 @@
 
 class TestWinNormalize(unittest.TestCase):
     def assert_filesystem_normalizes(self, filesystem):
-        self.assertEquals(find_files._normalize(filesystem, "c:\\foo",
+        self.assertEqual(find_files._normalize(filesystem, "c:\\foo",
             ['fast/html', 'fast/canvas/*', 'compositing/foo.html']),
             ['c:\\foo\\fast\html', 'c:\\foo\\fast\canvas\*', 'c:\\foo\compositing\\foo.html'])
 
@@ -59,7 +59,3 @@
         if sys.platform != 'win32':
             return
         self.assert_filesystem_normalizes(FileSystem())
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/host_mock.py b/Tools/Scripts/webkitpy/common/host_mock.py
index 8b508bf..daf5b35 100644
--- a/Tools/Scripts/webkitpy/common/host_mock.py
+++ b/Tools/Scripts/webkitpy/common/host_mock.py
@@ -40,10 +40,10 @@
 
 
 class MockHost(MockSystemHost):
-    def __init__(self, log_executive=False, executive_throws_when_run=None, initialize_scm_by_default=True):
+    def __init__(self, log_executive=False, executive_throws_when_run=None, initialize_scm_by_default=True, web=None):
         MockSystemHost.__init__(self, log_executive, executive_throws_when_run)
         add_unit_tests_to_mock_filesystem(self.filesystem)
-        self.web = MockWeb()
+        self.web = web or MockWeb()
 
         self._checkout = MockCheckout()
         self._scm = None
diff --git a/Tools/Scripts/webkitpy/common/lru_cache.py b/Tools/Scripts/webkitpy/common/lru_cache.py
index 4178d0f..02a3d1c 100644
--- a/Tools/Scripts/webkitpy/common/lru_cache.py
+++ b/Tools/Scripts/webkitpy/common/lru_cache.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/common/lru_cache_unittest.py b/Tools/Scripts/webkitpy/common/lru_cache_unittest.py
index 44a09e6..96ca209 100644
--- a/Tools/Scripts/webkitpy/common/lru_cache_unittest.py
+++ b/Tools/Scripts/webkitpy/common/lru_cache_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -25,7 +24,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common import lru_cache
 
@@ -92,7 +91,3 @@
     def test_set_again(self):
         self.lru['key_1'] = 'item_4'
         self.assertEqual(set(self.lru.items()), set([('key_1', 'item_4'), ('key_3', 'item_3'), ('key_2', 'item_2')]))
-
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/memoized_unittest.py b/Tools/Scripts/webkitpy/common/memoized_unittest.py
index dd7c793..af406df 100644
--- a/Tools/Scripts/webkitpy/common/memoized_unittest.py
+++ b/Tools/Scripts/webkitpy/common/memoized_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.memoized import memoized
 
diff --git a/Tools/Scripts/webkitpy/common/message_pool.py b/Tools/Scripts/webkitpy/common/message_pool.py
index 2e1e85e..03056cf 100644
--- a/Tools/Scripts/webkitpy/common/message_pool.py
+++ b/Tools/Scripts/webkitpy/common/message_pool.py
@@ -184,7 +184,7 @@
             pass
 
 
-class WorkerException(Exception):
+class WorkerException(BaseException):
     """Raised when we receive an unexpected/unknown exception from a worker."""
     pass
 
diff --git a/Tools/Scripts/webkitpy/common/multiprocessing_bootstrap.py b/Tools/Scripts/webkitpy/common/multiprocessing_bootstrap.py
old mode 100755
new mode 100644
index 1189776..366c413
--- a/Tools/Scripts/webkitpy/common/multiprocessing_bootstrap.py
+++ b/Tools/Scripts/webkitpy/common/multiprocessing_bootstrap.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2011 Google Inc. All rights reserved.
 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
 #
@@ -58,7 +57,8 @@
     # doesn't need to do it and their process id as reported by
     # subprocess.Popen is not jhbuild's.
     if '--gtk' in sys.argv[1:] and os.path.exists(os.path.join(script_dir, '..', '..', 'WebKitBuild', 'Dependencies')):
-        cmd.insert(1, os.path.join(script_dir, '..', 'gtk', 'run-with-jhbuild'))
+        prefix = [os.path.join(script_dir, '..', 'jhbuild', 'jhbuild-wrapper'), '--gtk', 'run']
+        cmd = prefix + cmd
 
     proc = subprocess.Popen(cmd, env=env)
     try:
diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/attachment.py b/Tools/Scripts/webkitpy/common/net/bugzilla/attachment.py
index 6e10d65..c749a15 100644
--- a/Tools/Scripts/webkitpy/common/net/bugzilla/attachment.py
+++ b/Tools/Scripts/webkitpy/common/net/bugzilla/attachment.py
@@ -28,8 +28,11 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.common.memoized import memoized
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class Attachment(object):
@@ -102,7 +105,7 @@
                             "%s_by_email" % flag)(email)
         if committer:
             return committer
-        log("Warning, attachment %s on bug %s has invalid %s (%s)" % (
+        _log.warning("Warning, attachment %s on bug %s has invalid %s (%s)" % (
                  self._attachment_dictionary['id'],
                  self._attachment_dictionary['bug_id'], flag, email))
 
diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
index 4bf8ec6..70caef3 100644
--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
@@ -28,6 +28,8 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import re
+
 from .attachment import Attachment
 
 
@@ -123,3 +125,12 @@
                 return True
         return False
 
+    def commit_revision(self):
+        # Sort the comments in reverse order as we want the latest committed revision.
+        r = re.compile("Committed r(?P<svn_revision>\d+)")
+        for comment in sorted(self.comments(), reverse=True):
+            rev = r.search(comment['text'])
+            if rev:
+                return int(rev.group('svn_revision'))
+
+        return None
diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bug_unittest.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bug_unittest.py
index f20c601..b90b915 100644
--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bug_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bug_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from .bug import Bug
 
@@ -45,3 +45,39 @@
                   bugzilla=None)
         self.assertTrue(bug.is_in_comments("Message3."))
         self.assertFalse(bug.is_in_comments("Message."))
+
+    def test_commit_revision(self):
+        bug = Bug({"comments": []}, bugzilla=None)
+        self.assertEqual(bug.commit_revision(), None)
+
+        bug = Bug({"comments": [
+            {"text": "Comment 1"},
+            {"text": "Comment 2"},
+            ]}, bugzilla=None)
+        self.assertEqual(bug.commit_revision(), None)
+
+        bug = Bug({"comments": [
+            {"text": "Committed r138776: <http://trac.webkit.org/changeset/138776>"},
+            ]}, bugzilla=None)
+        self.assertEqual(bug.commit_revision(), 138776)
+
+        bug = Bug({"comments": [
+            {"text": "(From update of attachment 181269) Clearing flags on attachment: 181269 Committed r138776: <http://trac.webkit.org/changeset/138776>"},
+            ]}, bugzilla=None)
+        self.assertEqual(bug.commit_revision(), 138776)
+
+        bug = Bug({"comments": [
+            {"text": "Comment before"},
+            {"text": "(From update of attachment 181269) Clearing flags on attachment: 181269 Committed r138776: <http://trac.webkit.org/changeset/138776>"},
+            {"text": "Comment after"},
+            ]}, bugzilla=None)
+        self.assertEqual(bug.commit_revision(), 138776)
+
+        bug = Bug({"comments": [
+            {"text": "Comment before"},
+            {"text": "(From update of attachment 181269) Clearing flags on attachment: 181269 Committed r138776: <http://trac.webkit.org/changeset/138776>"},
+            {"text": "Comment Middle"},
+            {"text": "(From update of attachment 181280) Clearing flags on attachment: 181280 Committed r138976: <http://trac.webkit.org/changeset/138976>"},
+            {"text": "Comment After"},
+            ]}, bugzilla=None)
+        self.assertEqual(bug.commit_revision(), 138976)
diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py
index 651e1b3..8fe63a3 100644
--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py
+++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla.py
@@ -30,6 +30,7 @@
 #
 # WebKit's Python module for interacting with Bugzilla
 
+import logging
 import mimetypes
 import re
 import StringIO
@@ -41,13 +42,14 @@
 from .attachment import Attachment
 from .bug import Bug
 
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.config import committers
 import webkitpy.common.config.urls as config_urls
 from webkitpy.common.net.credentials import Credentials
 from webkitpy.common.system.user import User
 from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup, BeautifulStoneSoup, SoupStrainer
 
+_log = logging.getLogger(__name__)
+
 
 class EditUsersParser(object):
     def __init__(self):
@@ -435,7 +437,7 @@
 
     def _fetch_bug_page(self, bug_id):
         bug_url = self.bug_url_for_bug_id(bug_id, xml=True)
-        log("Fetching: %s" % bug_url)
+        _log.info("Fetching: %s" % bug_url)
         return self.browser.open(bug_url)
 
     def fetch_bug_dictionary(self, bug_id):
@@ -472,7 +474,7 @@
         self.authenticate()
 
         attachment_url = self.attachment_url_for_id(attachment_id, 'edit')
-        log("Fetching: %s" % attachment_url)
+        _log.info("Fetching: %s" % attachment_url)
         page = self.browser.open(attachment_url)
         return self._parse_bug_id_from_attachment_page(page)
 
@@ -503,7 +505,7 @@
             attempts += 1
             username, password = credentials.read_credentials()
 
-            log("Logging in as %s..." % username)
+            _log.info("Logging in as %s..." % username)
             self.browser.open(config_urls.bug_server_url +
                               "index.cgi?GoAheadAndLogIn=1")
             self.browser.select_form(name="login")
@@ -519,7 +521,7 @@
                 errorMessage = "Bugzilla login failed: %s" % match.group(1)
                 # raise an exception only if this was the last attempt
                 if attempts < 5:
-                    log(errorMessage)
+                    _log.error(errorMessage)
                 else:
                     raise Exception(errorMessage)
             else:
@@ -532,10 +534,10 @@
             user = self.committers.account_by_email(self.username)
             mark_for_commit_queue = True
             if not user:
-                log("Your Bugzilla login is not listed in committers.py. Uploading with cq? instead of cq+")
+                _log.warning("Your Bugzilla login is not listed in committers.py. Uploading with cq? instead of cq+")
                 mark_for_landing = False
             elif not user.can_commit:
-                log("You're not a committer yet or haven't updated committers.py yet. Uploading with cq? instead of cq+")
+                _log.warning("You're not a committer yet or haven't updated committers.py yet. Uploading with cq? instead of cq+")
                 mark_for_landing = False
 
         if mark_for_landing:
@@ -585,14 +587,14 @@
 
     def add_attachment_to_bug(self, bug_id, file_or_string, description, filename=None, comment_text=None, mimetype=None):
         self.authenticate()
-        log('Adding attachment "%s" to %s' % (description, self.bug_url_for_bug_id(bug_id)))
+        _log.info('Adding attachment "%s" to %s' % (description, self.bug_url_for_bug_id(bug_id)))
         self.browser.open(self.add_attachment_url(bug_id))
         self.browser.select_form(name="entryform")
         file_object = self._file_object_for_upload(file_or_string)
         filename = filename or self._filename_for_upload(file_object, bug_id)
         self._fill_attachment_form(description, file_object, filename=filename, mimetype=mimetype)
         if comment_text:
-            log(comment_text)
+            _log.info(comment_text)
             self.browser['comment'] = comment_text
         self.browser.submit()
 
@@ -607,7 +609,7 @@
                          mark_for_commit_queue=False,
                          mark_for_landing=False):
         self.authenticate()
-        log('Adding patch "%s" to %s' % (description, self.bug_url_for_bug_id(bug_id)))
+        _log.info('Adding patch "%s" to %s' % (description, self.bug_url_for_bug_id(bug_id)))
 
         self.browser.open(self.add_attachment_url(bug_id))
         self.browser.select_form(name="entryform")
@@ -621,7 +623,7 @@
                                    is_patch=True,
                                    filename=filename)
         if comment_text:
-            log(comment_text)
+            _log.info(comment_text)
             self.browser['comment'] = comment_text
         self.browser.submit()
 
@@ -658,7 +660,7 @@
                    mark_for_commit_queue=False):
         self.authenticate()
 
-        log('Creating bug with title "%s"' % bug_title)
+        _log.info('Creating bug with title "%s"' % bug_title)
         self.browser.open(config_urls.bug_server_url + "enter_bug.cgi?product=WebKit")
         self.browser.select_form(name="Create")
         component_items = self.browser.find_control('component').items
@@ -694,8 +696,8 @@
         response = self.browser.submit()
 
         bug_id = self._check_create_bug_response(response.read())
-        log("Bug %s created." % bug_id)
-        log("%sshow_bug.cgi?id=%s" % (config_urls.bug_server_url, bug_id))
+        _log.info("Bug %s created." % bug_id)
+        _log.info("%sshow_bug.cgi?id=%s" % (config_urls.bug_server_url, bug_id))
         return bug_id
 
     def _find_select_element_for_flag(self, flag_name):
@@ -714,7 +716,7 @@
         comment_text = "Clearing flags on attachment: %s" % attachment_id
         if additional_comment_text:
             comment_text += "\n\n%s" % additional_comment_text
-        log(comment_text)
+        _log.info(comment_text)
 
         self.browser.open(self.attachment_url_for_id(attachment_id, 'edit'))
         self.browser.select_form(nr=1)
@@ -727,18 +729,12 @@
                                attachment_id,
                                flag_name,
                                flag_value,
-                               comment_text=None,
-                               additional_comment_text=None):
+                               comment_text=None):
         # FIXME: We need a way to test this function on a live bugzilla
         # instance.
 
         self.authenticate()
-
-        # FIXME: additional_comment_text seems useless and should be merged into comment-text.
-        if additional_comment_text:
-            comment_text += "\n\n%s" % additional_comment_text
-        log(comment_text)
-
+        _log.info(comment_text)
         self.browser.open(self.attachment_url_for_id(attachment_id, 'edit'))
         self.browser.select_form(nr=1)
 
@@ -754,7 +750,7 @@
     def obsolete_attachment(self, attachment_id, comment_text=None):
         self.authenticate()
 
-        log("Obsoleting attachment: %s" % attachment_id)
+        _log.info("Obsoleting attachment: %s" % attachment_id)
         self.browser.open(self.attachment_url_for_id(attachment_id, 'edit'))
         self.browser.select_form(nr=1)
         self.browser.find_control('isobsolete').items[0].selected = True
@@ -762,7 +758,7 @@
         self._find_select_element_for_flag('review').value = ("X",)
         self._find_select_element_for_flag('commit-queue').value = ("X",)
         if comment_text:
-            log(comment_text)
+            _log.info(comment_text)
             # Bugzilla has two textareas named 'comment', one is somehow
             # hidden.  We want the first.
             self.browser.set_value(comment_text, name='comment', nr=0)
@@ -771,7 +767,7 @@
     def add_cc_to_bug(self, bug_id, email_address_list):
         self.authenticate()
 
-        log("Adding %s to the CC list for bug %s" % (email_address_list, bug_id))
+        _log.info("Adding %s to the CC list for bug %s" % (email_address_list, bug_id))
         self.browser.open(self.bug_url_for_bug_id(bug_id))
         self.browser.select_form(name="changeform")
         self.browser["newcc"] = ", ".join(email_address_list)
@@ -780,7 +776,7 @@
     def post_comment_to_bug(self, bug_id, comment_text, cc=None):
         self.authenticate()
 
-        log("Adding comment to bug %s" % bug_id)
+        _log.info("Adding comment to bug %s" % bug_id)
         self.browser.open(self.bug_url_for_bug_id(bug_id))
         self.browser.select_form(name="changeform")
         self.browser["comment"] = comment_text
@@ -791,7 +787,7 @@
     def close_bug_as_fixed(self, bug_id, comment_text=None):
         self.authenticate()
 
-        log("Closing bug %s as fixed" % bug_id)
+        _log.info("Closing bug %s as fixed" % bug_id)
         self.browser.open(self.bug_url_for_bug_id(bug_id))
         self.browser.select_form(name="changeform")
         if comment_text:
@@ -809,21 +805,17 @@
         if not assignee:
             assignee = self.username
 
-        log("Assigning bug %s to %s" % (bug_id, assignee))
+        _log.info("Assigning bug %s to %s" % (bug_id, assignee))
         self.browser.open(self.bug_url_for_bug_id(bug_id))
         self.browser.select_form(name="changeform")
 
         if not self._has_control(self.browser, "assigned_to"):
-            log("""Failed to assign bug to you (can't find assigned_to) control.
-Do you have EditBugs privileges at bugs.webkit.org?
-https://bugs.webkit.org/userprefs.cgi?tab=permissions
-
-If not, you should email webkit-committers@lists.webkit.org or ask in #webkit
-for someone to add EditBugs to your bugs.webkit.org account.""")
+            _log.warning("""Failed to assign bug to you (can't find assigned_to) control.
+Ignore this message if you don't have EditBugs privileges (https://bugs.webkit.org/userprefs.cgi?tab=permissions)""")
             return
 
         if comment_text:
-            log(comment_text)
+            _log.info(comment_text)
             self.browser["comment"] = comment_text
         self.browser["assigned_to"] = assignee
         self.browser.submit()
@@ -831,10 +823,10 @@
     def reopen_bug(self, bug_id, comment_text):
         self.authenticate()
 
-        log("Re-opening bug %s" % bug_id)
+        _log.info("Re-opening bug %s" % bug_id)
         # Bugzilla requires a comment when re-opening a bug, so we know it will
         # never be None.
-        log(comment_text)
+        _log.info(comment_text)
         self.browser.open(self.bug_url_for_bug_id(bug_id))
         self.browser.select_form(name="changeform")
         bug_status = self.browser.find_control("bug_status", type="select")
@@ -851,6 +843,6 @@
         else:
             # FIXME: This logic is slightly backwards.  We won't print this
             # message if the bug is already open with state "UNCONFIRMED".
-            log("Did not reopen bug %s, it appears to already be open with status %s." % (bug_id, bug_status.value))
+            _log.info("Did not reopen bug %s, it appears to already be open with status %s." % (bug_id, bug_status.value))
         self.browser['comment'] = comment_text
         self.browser.submit()
diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_mock.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_mock.py
index 71b080c..2447ed2 100644
--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_mock.py
+++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_mock.py
@@ -27,12 +27,13 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import datetime
+import logging
 
 from .bug import Bug
 from .attachment import Attachment
 from webkitpy.common.config.committers import CommitterList, Reviewer
 
-from webkitpy.common.system.deprecated_logging import log
+_log = logging.getLogger(__name__)
 
 
 def _id_to_object_dictionary(*objects):
@@ -328,15 +329,15 @@
                    blocked=None,
                    mark_for_review=False,
                    mark_for_commit_queue=False):
-        log("MOCK create_bug")
-        log("bug_title: %s" % bug_title)
-        log("bug_description: %s" % bug_description)
+        _log.info("MOCK create_bug")
+        _log.info("bug_title: %s" % bug_title)
+        _log.info("bug_description: %s" % bug_description)
         if component:
-            log("component: %s" % component)
+            _log.info("component: %s" % component)
         if cc:
-            log("cc: %s" % cc)
+            _log.info("cc: %s" % cc)
         if blocked:
-            log("blocked: %s" % blocked)
+            _log.info("blocked: %s" % blocked)
         return 60001
 
     def quips(self):
@@ -374,32 +375,31 @@
         return "%s/%s%s" % (self.bug_server_url, attachment_id, action_param)
 
     def reassign_bug(self, bug_id, assignee=None, comment_text=None):
-        log("MOCK reassign_bug: bug_id=%s, assignee=%s" % (bug_id, assignee))
+        _log.info("MOCK reassign_bug: bug_id=%s, assignee=%s" % (bug_id, assignee))
         if comment_text:
-            log("-- Begin comment --")
-            log(comment_text)
-            log("-- End comment --")
+            _log.info("-- Begin comment --")
+            _log.info(comment_text)
+            _log.info("-- End comment --")
 
     def set_flag_on_attachment(self,
                                attachment_id,
                                flag_name,
                                flag_value,
-                               comment_text=None,
-                               additional_comment_text=None):
-        log("MOCK setting flag '%s' to '%s' on attachment '%s' with comment '%s' and additional comment '%s'" % (
-            flag_name, flag_value, attachment_id, comment_text, additional_comment_text))
+                               comment_text=None):
+        _log.info("MOCK setting flag '%s' to '%s' on attachment '%s' with comment '%s'" % (
+                  flag_name, flag_value, attachment_id, comment_text))
 
     def post_comment_to_bug(self, bug_id, comment_text, cc=None):
-        log("MOCK bug comment: bug_id=%s, cc=%s\n--- Begin comment ---\n%s\n--- End comment ---\n" % (
-            bug_id, cc, comment_text))
+        _log.info("MOCK bug comment: bug_id=%s, cc=%s\n--- Begin comment ---\n%s\n--- End comment ---\n" % (
+                  bug_id, cc, comment_text))
 
     def add_attachment_to_bug(self, bug_id, file_or_string, description, filename=None, comment_text=None, mimetype=None):
-        log("MOCK add_attachment_to_bug: bug_id=%s, description=%s filename=%s mimetype=%s" %
-            (bug_id, description, filename, mimetype))
+        _log.info("MOCK add_attachment_to_bug: bug_id=%s, description=%s filename=%s mimetype=%s" %
+                  (bug_id, description, filename, mimetype))
         if comment_text:
-            log("-- Begin comment --")
-            log(comment_text)
-            log("-- End comment --")
+            _log.info("-- Begin comment --")
+            _log.info(comment_text)
+            _log.info("-- End comment --")
 
     def add_patch_to_bug(self,
                          bug_id,
@@ -409,12 +409,12 @@
                          mark_for_review=False,
                          mark_for_commit_queue=False,
                          mark_for_landing=False):
-        log("MOCK add_patch_to_bug: bug_id=%s, description=%s, mark_for_review=%s, mark_for_commit_queue=%s, mark_for_landing=%s" %
-            (bug_id, description, mark_for_review, mark_for_commit_queue, mark_for_landing))
+        _log.info("MOCK add_patch_to_bug: bug_id=%s, description=%s, mark_for_review=%s, mark_for_commit_queue=%s, mark_for_landing=%s" %
+                  (bug_id, description, mark_for_review, mark_for_commit_queue, mark_for_landing))
         if comment_text:
-            log("-- Begin comment --")
-            log(comment_text)
-            log("-- End comment --")
+            _log.info("-- Begin comment --")
+            _log.info(comment_text)
+            _log.info("-- End comment --")
 
     def add_cc_to_bug(self, bug_id, ccs):
         pass
@@ -423,7 +423,7 @@
         pass
 
     def reopen_bug(self, bug_id, message):
-        log("MOCK reopen_bug %s with comment '%s'" % (bug_id, message))
+        _log.info("MOCK reopen_bug %s with comment '%s'" % (bug_id, message))
 
     def close_bug_as_fixed(self, bug_id, message):
         pass
diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py
index 6108b5e..09efbee 100644
--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bugzilla_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 import datetime
 import StringIO
 
@@ -85,16 +85,16 @@
     def test_url_creation(self):
         # FIXME: These would be all better as doctests
         bugs = Bugzilla()
-        self.assertEquals(None, bugs.bug_url_for_bug_id(None))
-        self.assertEquals(None, bugs.short_bug_url_for_bug_id(None))
-        self.assertEquals(None, bugs.attachment_url_for_id(None))
+        self.assertIsNone(bugs.bug_url_for_bug_id(None))
+        self.assertIsNone(bugs.short_bug_url_for_bug_id(None))
+        self.assertIsNone(bugs.attachment_url_for_id(None))
 
     def test_parse_bug_id(self):
         # Test that we can parse the urls we produce.
         bugs = Bugzilla()
-        self.assertEquals(12345, urls.parse_bug_id(bugs.short_bug_url_for_bug_id(12345)))
-        self.assertEquals(12345, urls.parse_bug_id(bugs.bug_url_for_bug_id(12345)))
-        self.assertEquals(12345, urls.parse_bug_id(bugs.bug_url_for_bug_id(12345, xml=True)))
+        self.assertEqual(12345, urls.parse_bug_id(bugs.short_bug_url_for_bug_id(12345)))
+        self.assertEqual(12345, urls.parse_bug_id(bugs.bug_url_for_bug_id(12345)))
+        self.assertEqual(12345, urls.parse_bug_id(bugs.bug_url_for_bug_id(12345, xml=True)))
 
     _bug_xml = """
     <bug>
@@ -198,10 +198,10 @@
     # FIXME: This should move to a central location and be shared by more unit tests.
     def _assert_dictionaries_equal(self, actual, expected):
         # Make sure we aren't parsing more or less than we expect
-        self.assertEquals(sorted(actual.keys()), sorted(expected.keys()))
+        self.assertItemsEqual(actual.keys(), expected.keys())
 
         for key, expected_value in expected.items():
-            self.assertEquals(actual[key], expected_value, ("Failure for key: %s: Actual='%s' Expected='%s'" % (key, actual[key], expected_value)))
+            self.assertEqual(actual[key], expected_value, ("Failure for key: %s: Actual='%s' Expected='%s'" % (key, actual[key], expected_value)))
 
     def test_parse_bug_dictionary_from_xml(self):
         bug = Bugzilla()._parse_bug_dictionary_from_xml(self._single_bug_xml)
@@ -217,10 +217,10 @@
     def test_parse_bugs_from_xml(self):
         bugzilla = Bugzilla()
         bugs = bugzilla._parse_bugs_from_xml(self._sample_multi_bug_xml)
-        self.assertEquals(len(bugs), 2)
-        self.assertEquals(bugs[0].id(), self._expected_example_bug_parsing['id'])
+        self.assertEqual(len(bugs), 2)
+        self.assertEqual(bugs[0].id(), self._expected_example_bug_parsing['id'])
         bugs = bugzilla._parse_bugs_from_xml("")
-        self.assertEquals(len(bugs), 0)
+        self.assertEqual(len(bugs), 0)
 
     # This could be combined into test_bug_parsing later if desired.
     def test_attachment_parsing(self):
@@ -244,14 +244,14 @@
 
     def test_attachment_detail_bug_parsing(self):
         bugzilla = Bugzilla()
-        self.assertEquals(27314, bugzilla._parse_bug_id_from_attachment_page(self._sample_attachment_detail_page))
+        self.assertEqual(27314, bugzilla._parse_bug_id_from_attachment_page(self._sample_attachment_detail_page))
 
     def test_add_cc_to_bug(self):
         bugzilla = Bugzilla()
         bugzilla.browser = MockBrowser()
         bugzilla.authenticate = lambda: None
-        expected_stderr = "Adding ['adam@example.com'] to the CC list for bug 42\n"
-        OutputCapture().assert_outputs(self, bugzilla.add_cc_to_bug, [42, ["adam@example.com"]], expected_stderr=expected_stderr)
+        expected_logs = "Adding ['adam@example.com'] to the CC list for bug 42\n"
+        OutputCapture().assert_outputs(self, bugzilla.add_cc_to_bug, [42, ["adam@example.com"]], expected_logs=expected_logs)
 
     def _mock_control_item(self, name):
         mock_item = Mock()
@@ -264,23 +264,23 @@
         mock_control.value = [item_names[selected_index]] if item_names else None
         return lambda name, type: mock_control
 
-    def _assert_reopen(self, item_names=None, selected_index=None, extra_stderr=None):
+    def _assert_reopen(self, item_names=None, selected_index=None, extra_logs=None):
         bugzilla = Bugzilla()
         bugzilla.browser = MockBrowser()
         bugzilla.authenticate = lambda: None
 
         mock_find_control = self._mock_find_control(item_names, selected_index)
         bugzilla.browser.find_control = mock_find_control
-        expected_stderr = "Re-opening bug 42\n['comment']\n"
-        if extra_stderr:
-            expected_stderr += extra_stderr
-        OutputCapture().assert_outputs(self, bugzilla.reopen_bug, [42, ["comment"]], expected_stderr=expected_stderr)
+        expected_logs = "Re-opening bug 42\n['comment']\n"
+        if extra_logs:
+            expected_logs += extra_logs
+        OutputCapture().assert_outputs(self, bugzilla.reopen_bug, [42, ["comment"]], expected_logs=expected_logs)
 
     def test_reopen_bug(self):
         self._assert_reopen(item_names=["REOPENED", "RESOLVED", "CLOSED"], selected_index=1)
         self._assert_reopen(item_names=["UNCONFIRMED", "RESOLVED", "CLOSED"], selected_index=1)
-        extra_stderr = "Did not reopen bug 42, it appears to already be open with status ['NEW'].\n"
-        self._assert_reopen(item_names=["NEW", "RESOLVED"], selected_index=0, extra_stderr=extra_stderr)
+        extra_logs = "Did not reopen bug 42, it appears to already be open with status ['NEW'].\n"
+        self._assert_reopen(item_names=["NEW", "RESOLVED"], selected_index=0, extra_logs=extra_logs)
 
     def test_file_object_for_upload(self):
         bugzilla = Bugzilla()
@@ -408,7 +408,7 @@
 """
 
     def _assert_result_count(self, queries, html, count):
-        self.assertEquals(queries._parse_result_count(html), count)
+        self.assertEqual(queries._parse_result_count(html), count)
 
     def test_parse_result_count(self):
         queries = BugzillaQueries(None)
@@ -420,12 +420,12 @@
 
     def test_request_page_parsing(self):
         queries = BugzillaQueries(None)
-        self.assertEquals([40511, 40722, 40723], queries._parse_attachment_ids_request_query(self._sample_request_page))
+        self.assertEqual([40511, 40722, 40723], queries._parse_attachment_ids_request_query(self._sample_request_page))
 
     def test_quip_page_parsing(self):
         queries = BugzillaQueries(None)
         expected_quips = ["Everything should be made as simple as possible, but not simpler. - Albert Einstein", "Good artists copy. Great artists steal. - Pablo Picasso", u"\u00e7gua mole em pedra dura, tanto bate at\u008e que fura."]
-        self.assertEquals(expected_quips, queries._parse_quips(self._sample_quip_page))
+        self.assertEqual(expected_quips, queries._parse_quips(self._sample_quip_page))
 
     def test_load_query(self):
         queries = BugzillaQueries(Mock())
@@ -482,7 +482,7 @@
     def _assert_login_userid_pairs(self, results_page, expected_logins):
         parser = EditUsersParser()
         logins = parser.login_userid_pairs_from_edit_user_results(results_page)
-        self.assertEquals(logins, expected_logins)
+        self.assertEqual(logins, expected_logins)
 
     def test_logins_from_editusers_results(self):
         self._assert_login_userid_pairs(self._example_user_results, [("abarth@webkit.org", 1234)])
diff --git a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py
index adb5a3d..4951596 100644
--- a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py
+++ b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot.py
@@ -85,10 +85,6 @@
     def fetch_layout_test_results(self, results_url):
         # FIXME: This should cache that the result was a 404 and stop hitting the network.
         results_file = NetworkTransaction(convert_404_to_None=True).run(lambda: self._fetch_file_from_results(results_url, "full_results.json"))
-        if not results_file:
-            results_file = NetworkTransaction(convert_404_to_None=True).run(lambda: self._fetch_file_from_results(results_url, "results.html"))
-
-        # results_from_string accepts either ORWT html or NRWT json.
         return LayoutTestResults.results_from_string(results_file)
 
     def url_encoded_name(self):
@@ -135,6 +131,7 @@
                 return form.find_control("username")
             except Exception, e:
                 return False
+        # ignore false positives for missing Browser methods - pylint: disable=E1102
         self._browser.open(self.url())
         self._browser.select_form(predicate=predicate)
         self._browser["username"] = username
diff --git a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_mock.py b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_mock.py
index f8ec49b..d20bdb7 100644
--- a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_mock.py
+++ b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_mock.py
@@ -26,6 +26,10 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
+_log = logging.getLogger(__name__)
+
 
 class MockBuild(object):
     def __init__(self, build_number, revision, is_green):
@@ -53,7 +57,7 @@
         return self.accumulated_results_url()
 
     def force_build(self, username, comments):
-        log("MOCK: force_build: name=%s, username=%s, comments=%s" % (
+        _log.info("MOCK: force_build: name=%s, username=%s, comments=%s" % (
             self._name, username, comments))
 
 
diff --git a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py
index 69f8648..26b7b97 100644
--- a/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/buildbot/buildbot_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.layouttestresults import LayoutTestResults
 from webkitpy.common.net.buildbot import BuildBot, Builder, Build
@@ -71,14 +71,14 @@
         self.assertEqual(regression_window.failing_build().revision(), 1004)
 
         regression_window = self.builder.find_regression_window(self.builder.build(10), look_back_limit=2)
-        self.assertEqual(regression_window.build_before_failure(), None)
+        self.assertIsNone(regression_window.build_before_failure())
         self.assertEqual(regression_window.failing_build().revision(), 1008)
 
     def test_none_build(self):
         self.builder._fetch_build = lambda build_number: None
         regression_window = self.builder.find_regression_window(self.builder.build(10))
-        self.assertEqual(regression_window.build_before_failure(), None)
-        self.assertEqual(regression_window.failing_build(), None)
+        self.assertIsNone(regression_window.build_before_failure())
+        self.assertIsNone(regression_window.failing_build())
 
     def test_flaky_tests(self):
         self._install_fetch_build(lambda build_number: ["test1"] if build_number % 2 else ["test2"])
@@ -106,12 +106,12 @@
 
     def test_find_blameworthy_regression_window(self):
         self.assertEqual(self.builder.find_blameworthy_regression_window(10).revisions(), [1004])
-        self.assertEqual(self.builder.find_blameworthy_regression_window(10, look_back_limit=2), None)
+        self.assertIsNone(self.builder.find_blameworthy_regression_window(10, look_back_limit=2))
         # Flakey test avoidance requires at least 2 red builds:
-        self.assertEqual(self.builder.find_blameworthy_regression_window(4), None)
+        self.assertIsNone(self.builder.find_blameworthy_regression_window(4))
         self.assertEqual(self.builder.find_blameworthy_regression_window(4, avoid_flakey_tests=False).revisions(), [1004])
         # Green builder:
-        self.assertEqual(self.builder.find_blameworthy_regression_window(3), None)
+        self.assertIsNone(self.builder.find_blameworthy_regression_window(3))
 
     def test_build_caching(self):
         self.assertEqual(self.builder.build(10), self.builder.build(10))
@@ -148,7 +148,7 @@
             }
             return build_dictionary
         buildbot._fetch_build_dictionary = mock_fetch_build_dictionary
-        self.assertNotEqual(builder._fetch_build(1), None)
+        self.assertIsNotNone(builder._fetch_build(1))
 
 
 class BuildTest(unittest.TestCase):
@@ -158,7 +158,7 @@
         builder._fetch_file_from_results = lambda results_url, file_name: None
         build = Build(builder, None, None, None)
         # Test that layout_test_results() returns None if the fetch fails.
-        self.assertEqual(build.layout_test_results(), None)
+        self.assertIsNone(build.layout_test_results())
 
 
 class BuildBotTest(unittest.TestCase):
@@ -232,10 +232,10 @@
             builder = buildbot._parse_builder_status_from_row(status_row)
 
             # Make sure we aren't parsing more or less than we expect
-            self.assertEquals(builder.keys(), expected_parsing.keys())
+            self.assertEqual(builder.keys(), expected_parsing.keys())
 
             for key, expected_value in expected_parsing.items():
-                self.assertEquals(builder[key], expected_value, ("Builder %d parse failure for key: %s: Actual='%s' Expected='%s'" % (x, key, builder[key], expected_value)))
+                self.assertEqual(builder[key], expected_value, ("Builder %d parse failure for key: %s: Actual='%s' Expected='%s'" % (x, key, builder[key], expected_value)))
 
     def test_builder_with_name(self):
         buildbot = BuildBot()
@@ -263,16 +263,16 @@
         self.assertEqual(build.url(), "http://build.webkit.org/builders/Test%20Builder/builds/10")
         self.assertEqual(build.results_url(), "http://build.webkit.org/results/Test%20Builder/r20%20%2810%29")
         self.assertEqual(build.revision(), 20)
-        self.assertEqual(build.is_green(), True)
+        self.assertTrue(build.is_green())
 
         build = build.previous_build()
         self.assertEqual(build.builder(), builder)
         self.assertEqual(build.url(), "http://build.webkit.org/builders/Test%20Builder/builds/9")
         self.assertEqual(build.results_url(), "http://build.webkit.org/results/Test%20Builder/r18%20%289%29")
         self.assertEqual(build.revision(), 18)
-        self.assertEqual(build.is_green(), False)
+        self.assertFalse(build.is_green())
 
-        self.assertEqual(builder.build(None), None)
+        self.assertIsNone(builder.build(None))
 
     _example_directory_listing = '''
 <h1>Directory listing for /results/SnowLeopard Intel Leaks/</h1>
@@ -464,7 +464,7 @@
         b = Builder('builder', BuildBot())
         b._fetch_build = self._fetch_build
         b._fetch_revision_to_build_map = self._fetch_revision_to_build_map
-        self.assertEquals("correct build", b.latest_cached_build())
+        self.assertEqual("correct build", b.latest_cached_build())
 
     def results_url(self):
         return "some-url"
@@ -472,8 +472,4 @@
     def test_results_zip_url(self):
         b = Build(None, 123, 123, False)
         b.results_url = self.results_url
-        self.assertEquals("some-url.zip", b.results_zip_url())
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertEqual("some-url.zip", b.results_zip_url())
diff --git a/Tools/Scripts/webkitpy/common/net/credentials.py b/Tools/Scripts/webkitpy/common/net/credentials.py
index 21aeaea..7038b7e 100644
--- a/Tools/Scripts/webkitpy/common/net/credentials.py
+++ b/Tools/Scripts/webkitpy/common/net/credentials.py
@@ -29,6 +29,7 @@
 #
 # Python module for reading stored web credentials from the OS.
 
+import logging
 import os
 import platform
 import re
@@ -36,7 +37,6 @@
 from webkitpy.common.checkout.scm import Git
 from webkitpy.common.system.executive import Executive, ScriptError
 from webkitpy.common.system.user import User
-from webkitpy.common.system.deprecated_logging import log
 
 try:
     # Use keyring, a cross platform keyring interface, as a fallback:
@@ -45,6 +45,8 @@
 except ImportError:
     keyring = None
 
+_log = logging.getLogger(__name__)
+
 
 class Credentials(object):
     _environ_prefix = "webkit_bugzilla_"
@@ -98,15 +100,15 @@
         if username:
             security_command += ["-a", username]
 
-        log("Reading Keychain for %s account and password.  "
-            "Click \"Allow\" to continue..." % self.host)
+        _log.info("Reading Keychain for %s account and password.  "
+                  "Click \"Allow\" to continue..." % self.host)
         try:
             return self.executive.run_command(security_command)
         except ScriptError:
             # Failed to either find a keychain entry or somekind of OS-related
             # error occured (for instance, couldn't find the /usr/sbin/security
             # command).
-            log("Could not find a keychain entry for %s." % self.host)
+            _log.error("Could not find a keychain entry for %s." % self.host)
             return None
 
     def _credentials_from_keychain(self, username=None):
diff --git a/Tools/Scripts/webkitpy/common/net/credentials_unittest.py b/Tools/Scripts/webkitpy/common/net/credentials_unittest.py
index a797e3d..beafa58 100644
--- a/Tools/Scripts/webkitpy/common/net/credentials_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/credentials_unittest.py
@@ -28,7 +28,7 @@
 
 import os
 import tempfile
-import unittest
+import unittest2 as unittest
 from webkitpy.common.net.credentials import Credentials
 from webkitpy.common.system.executive import Executive
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -92,7 +92,7 @@
             def _is_mac_os_x(self):
                 return False
         credentials = FakeCredentials("bugs.webkit.org")
-        self.assertEqual(credentials._is_mac_os_x(), False)
+        self.assertFalse(credentials._is_mac_os_x())
         self.assertEqual(credentials._credentials_from_keychain("foo"), ["foo", None])
 
     def test_security_output_parse(self):
@@ -109,15 +109,15 @@
         # by the test case CredentialsTest._assert_security_call (below).
         outputCapture = OutputCapture()
         outputCapture.capture_output()
-        self.assertEqual(credentials._run_security_tool(), None)
+        self.assertIsNone(credentials._run_security_tool())
         outputCapture.restore_output()
 
     def _assert_security_call(self, username=None):
         executive_mock = Mock()
         credentials = MockedCredentials("example.com", executive=executive_mock)
 
-        expected_stderr = "Reading Keychain for example.com account and password.  Click \"Allow\" to continue...\n"
-        OutputCapture().assert_outputs(self, credentials._run_security_tool, [username], expected_stderr=expected_stderr)
+        expected_logs = "Reading Keychain for example.com account and password.  Click \"Allow\" to continue...\n"
+        OutputCapture().assert_outputs(self, credentials._run_security_tool, [username], expected_logs=expected_logs)
 
         security_args = ["/usr/bin/security", "find-internet-password", "-g", "-s", "example.com"]
         if username:
@@ -135,8 +135,8 @@
         os.environ['WEBKIT_BUGZILLA_USERNAME'] = "foo"
         os.environ['WEBKIT_BUGZILLA_PASSWORD'] = "bar"
         username, password = credentials._credentials_from_environment()
-        self.assertEquals(username, "foo")
-        self.assertEquals(password, "bar")
+        self.assertEqual(username, "foo")
+        self.assertEqual(password, "bar")
         os.environ = saved_environ
 
     def test_read_credentials_without_git_repo(self):
@@ -206,7 +206,3 @@
             # FIXME: Using read_credentials here seems too broad as higher-priority
             # credential source could be affected by the user's environment.
             self.assertEqual(credentials.read_credentials(FakeUser), ("test@webkit.org", "NOMNOMNOM"))
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/net/failuremap_unittest.py b/Tools/Scripts/webkitpy/common/net/failuremap_unittest.py
index 9a66d9e..0bede97 100644
--- a/Tools/Scripts/webkitpy/common/net/failuremap_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/failuremap_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.buildbot import Build
 from webkitpy.common.net.failuremap import *
@@ -54,27 +54,27 @@
 
     def test_failing_revisions(self):
         failure_map = self._make_failure_map()
-        self.assertEquals(failure_map.failing_revisions(), [1234, 1235])
+        self.assertEqual(failure_map.failing_revisions(), [1234, 1235])
 
     def test_new_failures(self):
         failure_map = self._make_failure_map()
         failure_map.filter_out_old_failures(lambda revision: False)
-        self.assertEquals(failure_map.failing_revisions(), [1234, 1235])
+        self.assertEqual(failure_map.failing_revisions(), [1234, 1235])
 
     def test_new_failures_with_old_revisions(self):
         failure_map = self._make_failure_map()
         failure_map.filter_out_old_failures(lambda revision: revision == 1234)
-        self.assertEquals(failure_map.failing_revisions(), [])
+        self.assertEqual(failure_map.failing_revisions(), [])
 
     def test_new_failures_with_more_old_revisions(self):
         failure_map = self._make_failure_map()
         failure_map.filter_out_old_failures(lambda revision: revision == 1235)
-        self.assertEquals(failure_map.failing_revisions(), [1234])
+        self.assertEqual(failure_map.failing_revisions(), [1234])
 
     def test_tests_failing_for(self):
         failure_map = self._make_failure_map()
-        self.assertEquals(failure_map.tests_failing_for(1234), [u'test1'])
+        self.assertEqual(failure_map.tests_failing_for(1234), [u'test1'])
 
     def test_failing_tests(self):
         failure_map = self._make_failure_map()
-        self.assertEquals(failure_map.failing_tests(), set([u'test1']))
+        self.assertEqual(failure_map.failing_tests(), set([u'test1']))
diff --git a/Tools/Scripts/webkitpy/common/net/file_uploader.py b/Tools/Scripts/webkitpy/common/net/file_uploader.py
index 9b220b0..871295b 100644
--- a/Tools/Scripts/webkitpy/common/net/file_uploader.py
+++ b/Tools/Scripts/webkitpy/common/net/file_uploader.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/common/net/irc/irc_mock.py b/Tools/Scripts/webkitpy/common/net/irc/irc_mock.py
index 734be06..b2ae071 100644
--- a/Tools/Scripts/webkitpy/common/net/irc/irc_mock.py
+++ b/Tools/Scripts/webkitpy/common/net/irc/irc_mock.py
@@ -26,12 +26,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.common.system.deprecated_logging import log
+import logging
+
+_log = logging.getLogger(__name__)
 
 
 class MockIRC(object):
     def post(self, message):
-        log("MOCK: irc.post: %s" % message)
+        _log.info("MOCK: irc.post: %s" % message)
 
     def disconnect(self):
-        log("MOCK: irc.disconnect")
+        _log.info("MOCK: irc.disconnect")
diff --git a/Tools/Scripts/webkitpy/common/net/irc/ircproxy.py b/Tools/Scripts/webkitpy/common/net/irc/ircproxy.py
index 13348b4..521f6f7 100644
--- a/Tools/Scripts/webkitpy/common/net/irc/ircproxy.py
+++ b/Tools/Scripts/webkitpy/common/net/irc/ircproxy.py
@@ -26,11 +26,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 import threading
 
 from webkitpy.common.net.irc.ircbot import IRCBot
 from webkitpy.common.thread.threadedmessagequeue import ThreadedMessageQueue
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class _IRCThread(threading.Thread):
@@ -48,7 +50,7 @@
 
 class IRCProxy(object):
     def __init__(self, irc_delegate, irc_bot=IRCBot):
-        log("Connecting to IRC")
+        _log.info("Connecting to IRC")
         self._message_queue = ThreadedMessageQueue()
         self._child_thread = _IRCThread(self._message_queue, irc_delegate, irc_bot)
         self._child_thread.start()
@@ -57,6 +59,6 @@
         self._message_queue.post(message)
 
     def disconnect(self):
-        log("Disconnecting from IRC...")
+        _log.info("Disconnecting from IRC...")
         self._message_queue.stop()
         self._child_thread.join()
diff --git a/Tools/Scripts/webkitpy/common/net/irc/ircproxy_unittest.py b/Tools/Scripts/webkitpy/common/net/irc/ircproxy_unittest.py
index b44ce40..639979a 100644
--- a/Tools/Scripts/webkitpy/common/net/irc/ircproxy_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/irc/ircproxy_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.irc.ircproxy import IRCProxy
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -39,5 +39,5 @@
             proxy.post("hello")
             proxy.disconnect()
 
-        expected_stderr = "Connecting to IRC\nDisconnecting from IRC...\n"
-        OutputCapture().assert_outputs(self, fun, expected_stderr=expected_stderr)
+        expected_logs = "Connecting to IRC\nDisconnecting from IRC...\n"
+        OutputCapture().assert_outputs(self, fun, expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/common/net/layouttestresults.py b/Tools/Scripts/webkitpy/common/net/layouttestresults.py
index f0d807e..b8cb157 100644
--- a/Tools/Scripts/webkitpy/common/net/layouttestresults.py
+++ b/Tools/Scripts/webkitpy/common/net/layouttestresults.py
@@ -25,16 +25,16 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# A module for parsing results.html files generated by old-run-webkit-tests
-# This class is one big hack and only needs to exist until we transition to new-run-webkit-tests.
+
+import logging
 
 from webkitpy.common.net.resultsjsonparser import ResultsJSONParser
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup, SoupStrainer
 from webkitpy.layout_tests.models import test_results
 from webkitpy.layout_tests.models import test_failures
 
+_log = logging.getLogger(__name__)
+
 
 # FIXME: This should be unified with all the layout test results code in the layout_tests package
 # This doesn't belong in common.net, but we don't have a better place for it yet.
@@ -42,88 +42,6 @@
     return "LayoutTests/%s" % test_name
 
 
-class ORWTResultsHTMLParser(object):
-    """This class knows how to parse old-run-webkit-tests results.html files."""
-
-    stderr_key = u'Tests that had stderr output:'
-    fail_key = u'Tests where results did not match expected results:'
-    timeout_key = u'Tests that timed out:'
-    # FIXME: This may need to be made aware of WebKitTestRunner results for WebKit2.
-    crash_key = u'Tests that caused the DumpRenderTree tool to crash:'
-    missing_key = u'Tests that had no expected results (probably new):'
-    webprocess_crash_key = u'Tests that caused the Web process to crash:'
-
-    expected_keys = [
-        stderr_key,
-        fail_key,
-        crash_key,
-        webprocess_crash_key,
-        timeout_key,
-        missing_key,
-    ]
-
-    @classmethod
-    def _failures_from_fail_row(self, row):
-        # Look at all anchors in this row, and guess what type
-        # of new-run-webkit-test failures they equate to.
-        failures = set()
-        test_name = None
-        for anchor in row.findAll("a"):
-            anchor_text = unicode(anchor.string)
-            if not test_name:
-                test_name = anchor_text
-                continue
-            if anchor_text in ["expected image", "image diffs"] or '%' in anchor_text:
-                failures.add(test_failures.FailureImageHashMismatch())
-            elif anchor_text in ["expected", "actual", "diff", "pretty diff"]:
-                failures.add(test_failures.FailureTextMismatch())
-            else:
-                log("Unhandled link text in results.html parsing: %s.  Please file a bug against webkitpy." % anchor_text)
-        # FIXME: Its possible the row contained no links due to ORWT brokeness.
-        # We should probably assume some type of failure anyway.
-        return failures
-
-    @classmethod
-    def _failures_from_row(cls, row, table_title):
-        if table_title == cls.fail_key:
-            return cls._failures_from_fail_row(row)
-        if table_title == cls.crash_key:
-            return [test_failures.FailureCrash()]
-        if table_title == cls.webprocess_crash_key:
-            return [test_failures.FailureCrash(process_name="WebProcess")]
-        if table_title == cls.timeout_key:
-            return [test_failures.FailureTimeout()]
-        if table_title == cls.missing_key:
-            return [test_failures.FailureMissingResult(), test_failures.FailureMissingImageHash(), test_failures.FailureMissingImage()]
-        return None
-
-    @classmethod
-    def _test_result_from_row(cls, row, table_title):
-        test_name = unicode(row.find("a").string)
-        failures = cls._failures_from_row(row, table_title)
-        # TestResult is a class designed to work with new-run-webkit-tests.
-        # old-run-webkit-tests does not save quite enough information in results.html for us to parse.
-        # FIXME: It's unclear if test_name should include LayoutTests or not.
-        return test_results.TestResult(test_name, failures)
-
-    @classmethod
-    def _parse_results_table(cls, table):
-        table_title = unicode(table.findPreviousSibling("p").string)
-        if table_title not in cls.expected_keys:
-            # This Exception should only ever be hit if run-webkit-tests changes its results.html format.
-            raise Exception("Unhandled title: %s" % table_title)
-        # Ignore stderr failures.  Everyone ignores them anyway.
-        if table_title == cls.stderr_key:
-            return []
-        # FIXME: We might end with two TestResults object for the same test if it appears in more than one row.
-        return [cls._test_result_from_row(row, table_title) for row in table.findAll("tr")]
-
-    @classmethod
-    def parse_results_html(cls, page):
-        tables = BeautifulSoup(page).findAll("table")
-        return sum([cls._parse_results_table(table) for table in tables], [])
-
-
 # FIXME: This should be unified with ResultsSummary or other NRWT layout tests code
 # in the layout_tests package.
 # This doesn't belong in common.net, but we don't have a better place for it yet.
@@ -132,12 +50,8 @@
     def results_from_string(cls, string):
         if not string:
             return None
-        # For now we try to parse first as json, then as results.html
-        # eventually we will remove the html fallback support.
         test_results = ResultsJSONParser.parse_results_json(string)
         if not test_results:
-            test_results = ORWTResultsHTMLParser.parse_results_html(string)
-        if not test_results:
             return None
         return cls(test_results)
 
@@ -147,7 +61,7 @@
         self._unit_test_failures = []
 
     # FIXME: run-webkit-tests should store the --exit-after-N-failures value
-    # (or some indication of early exit) somewhere in the results.html/results.json
+    # (or some indication of early exit) somewhere in the results.json
     # file.  Until it does, callers should set the limit to
     # --exit-after-N-failures value used in that run.  Consumers of LayoutTestResults
     # may use that value to know if absence from the failure list means PASS.
diff --git a/Tools/Scripts/webkitpy/common/net/layouttestresults_unittest.py b/Tools/Scripts/webkitpy/common/net/layouttestresults_unittest.py
index 939a56a..ea4e927 100644
--- a/Tools/Scripts/webkitpy/common/net/layouttestresults_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/layouttestresults_unittest.py
@@ -26,121 +26,22 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
-from webkitpy.common.net.layouttestresults import LayoutTestResults, ORWTResultsHTMLParser
+from webkitpy.common.net.layouttestresults import LayoutTestResults
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.layout_tests.models import test_results
 from webkitpy.layout_tests.models import test_failures
 from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup
 
 
-class ORWTResultsHTMLParserTest(unittest.TestCase):
-    _example_results_html = """
-<html>
-<head>
-<title>Layout Test Results</title>
-</head>
-<body>
-<p>Tests that had stderr output:</p>
-<table>
-<tr>
-<td><a href="/var/lib/buildbot/build/gtk-linux-64-release/build/LayoutTests/accessibility/aria-activedescendant-crash.html">accessibility/aria-activedescendant-crash.html</a></td>
-<td><a href="accessibility/aria-activedescendant-crash-stderr.txt">stderr</a></td>
-</tr>
-<td><a href="/var/lib/buildbot/build/gtk-linux-64-release/build/LayoutTests/http/tests/security/canvas-remote-read-svg-image.html">http/tests/security/canvas-remote-read-svg-image.html</a></td>
-<td><a href="http/tests/security/canvas-remote-read-svg-image-stderr.txt">stderr</a></td>
-</tr>
-</table><p>Tests that had no expected results (probably new):</p>
-<table>
-<tr>
-<td><a href="/var/lib/buildbot/build/gtk-linux-64-release/build/LayoutTests/fast/repaint/no-caret-repaint-in-non-content-editable-element.html">fast/repaint/no-caret-repaint-in-non-content-editable-element.html</a></td>
-<td><a href="fast/repaint/no-caret-repaint-in-non-content-editable-element-actual.txt">result</a></td>
-</tr>
-</table></body>
-</html>
-"""
-
-    _example_results_html_with_failing_tests = """
-<html>
-<head>
-<title>Layout Test Results</title>
-</head>
-<body>
-<p>Tests where results did not match expected results:</p>
-<table>
-<tr>
-<td><a href="http://trac.webkit.org/export/91245/trunk/LayoutTests/compositing/plugins/composited-plugin.html">compositing/plugins/composited-plugin.html</a></td>
-<td>
-<a href="compositing/plugins/composited-plugin-expected.txt">expected</a>
-</td>
-<td>
-<a href="compositing/plugins/composited-plugin-actual.txt">actual</a>
-</td>
-<td>
-<a href="compositing/plugins/composited-plugin-diffs.txt">diff</a>
-</td>
-<td>
-<a href="compositing/plugins/composited-plugin-pretty-diff.html">pretty diff</a>
-</td>
-</tr>
-</table>
-<p>Tests that had stderr output:</p>
-<table>
-<tr>
-<td><a href="/var/lib/buildbot/build/gtk-linux-64-release/build/LayoutTests/accessibility/aria-activedescendant-crash.html">accessibility/aria-activedescendant-crash.html</a></td>
-<td><a href="accessibility/aria-activedescendant-crash-stderr.txt">stderr</a></td>
-</tr>
-<td><a href="/var/lib/buildbot/build/gtk-linux-64-release/build/LayoutTests/http/tests/security/canvas-remote-read-svg-image.html">http/tests/security/canvas-remote-read-svg-image.html</a></td>
-<td><a href="http/tests/security/canvas-remote-read-svg-image-stderr.txt">stderr</a></td>
-</tr>
-</table><p>Tests that had no expected results (probably new):</p>
-<table>
-<tr>
-<td><a href="/var/lib/buildbot/build/gtk-linux-64-release/build/LayoutTests/fast/repaint/no-caret-repaint-in-non-content-editable-element.html">fast/repaint/no-caret-repaint-in-non-content-editable-element.html</a></td>
-<td><a href="fast/repaint/no-caret-repaint-in-non-content-editable-element-actual.txt">result</a></td>
-</tr>
-</table></body>
-</html>
-"""
-
-    def test_parse_layout_test_results(self):
-        failures = [test_failures.FailureMissingResult(), test_failures.FailureMissingImageHash(), test_failures.FailureMissingImage()]
-        testname = 'fast/repaint/no-caret-repaint-in-non-content-editable-element.html'
-        expected_results = [test_results.TestResult(testname, failures)]
-
-        results = ORWTResultsHTMLParser.parse_results_html(self._example_results_html)
-        self.assertEqual(expected_results, results)
-
-
-    def test_failures_from_fail_row(self):
-        row = BeautifulSoup("<tr><td><a>test.hml</a></td><td><a>expected image</a></td><td><a>25%</a></td></tr>")
-        test_name = unicode(row.find("a").string)
-        # Even if the caller has already found the test name, findAll inside _failures_from_fail_row will see it again.
-        failures = OutputCapture().assert_outputs(self, ORWTResultsHTMLParser._failures_from_fail_row, [row])
-        self.assertEqual(len(failures), 1)
-        self.assertEqual(type(sorted(failures)[0]), test_failures.FailureImageHashMismatch)
-
-        row = BeautifulSoup("<tr><td><a>test.hml</a><a>foo</a></td></tr>")
-        expected_stderr = "Unhandled link text in results.html parsing: foo.  Please file a bug against webkitpy.\n"
-        OutputCapture().assert_outputs(self, ORWTResultsHTMLParser._failures_from_fail_row, [row], expected_stderr=expected_stderr)
-
-
 class LayoutTestResultsTest(unittest.TestCase):
-
     def test_set_failure_limit_count(self):
         results = LayoutTestResults([])
-        self.assertEquals(results.failure_limit_count(), None)
+        self.assertIsNone(results.failure_limit_count())
         results.set_failure_limit_count(10)
-        self.assertEquals(results.failure_limit_count(), 10)
+        self.assertEqual(results.failure_limit_count(), 10)
 
     def test_results_from_string(self):
-        self.assertEqual(LayoutTestResults.results_from_string(None), None)
-        self.assertEqual(LayoutTestResults.results_from_string(""), None)
-        results = LayoutTestResults.results_from_string(ORWTResultsHTMLParserTest._example_results_html)
-        self.assertEqual(len(results.failing_tests()), 1)
-
-    def test_tests_matching_failure_types(self):
-        results = LayoutTestResults.results_from_string(ORWTResultsHTMLParserTest._example_results_html_with_failing_tests)
-        failing_tests = results.tests_matching_failure_types([test_failures.FailureTextMismatch])
-        self.assertEqual(len(results.failing_tests()), 2)
+        self.assertIsNone(LayoutTestResults.results_from_string(None))
+        self.assertIsNone(LayoutTestResults.results_from_string(""))
diff --git a/Tools/Scripts/webkitpy/common/net/networktransaction.py b/Tools/Scripts/webkitpy/common/net/networktransaction.py
index 03b1432..60acaab 100644
--- a/Tools/Scripts/webkitpy/common/net/networktransaction.py
+++ b/Tools/Scripts/webkitpy/common/net/networktransaction.py
@@ -30,9 +30,6 @@
 import time
 import urllib2
 
-from webkitpy.common.system.deprecated_logging import log
-
-
 _log = logging.getLogger(__name__)
 
 
diff --git a/Tools/Scripts/webkitpy/common/net/networktransaction_unittest.py b/Tools/Scripts/webkitpy/common/net/networktransaction_unittest.py
index 3302dec..67439f0 100644
--- a/Tools/Scripts/webkitpy/common/net/networktransaction_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/networktransaction_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.networktransaction import NetworkTransaction, NetworkTimeout
 from webkitpy.common.system.logtesting import LoggingTestCase
diff --git a/Tools/Scripts/webkitpy/common/net/omahaproxy_unittest.py b/Tools/Scripts/webkitpy/common/net/omahaproxy_unittest.py
index f3e5be3..80ba982 100644
--- a/Tools/Scripts/webkitpy/common/net/omahaproxy_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/omahaproxy_unittest.py
@@ -29,7 +29,7 @@
 
 # Unit test for omahaproxy.py
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.omahaproxy import OmahaProxy
 
@@ -128,12 +128,9 @@
         revisions = omahaproxy.get_revisions()
         self.assertEqual(len(revisions), 5)
         for revision in revisions:
-            self.assertTrue("commit" in revision)
-            self.assertTrue("channel" in revision)
-            self.assertTrue("platform" in revision)
-            self.assertTrue("date" in revision)
+            self.assertIn("commit", revision)
+            self.assertIn("channel", revision)
+            self.assertIn("platform", revision)
+            self.assertIn("date", revision)
             self.assertEqual(len(revision.keys()), 4)
         self.assertEqual(revisions, self.expected_revisions)
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/net/resultsjsonparser.py b/Tools/Scripts/webkitpy/common/net/resultsjsonparser.py
index 42ce56a..1a2a70f 100644
--- a/Tools/Scripts/webkitpy/common/net/resultsjsonparser.py
+++ b/Tools/Scripts/webkitpy/common/net/resultsjsonparser.py
@@ -26,16 +26,17 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-
 import json
+import logging
 
 from webkitpy.common.memoized import memoized
-from webkitpy.common.system.deprecated_logging import log
 # FIXME: common should never import from new-run-webkit-tests, one of these files needs to move.
 from webkitpy.layout_tests.layout_package import json_results_generator
 from webkitpy.layout_tests.models import test_expectations, test_results, test_failures
 from webkitpy.layout_tests.models.test_expectations import TestExpectations
 
+_log = logging.getLogger(__name__)
+
 
 # These are helper functions for navigating the results json structure.
 def for_each_test(tree, handler, prefix=''):
@@ -83,7 +84,7 @@
     def _tokenize(self, results_string):
         tokens = map(TestExpectations.expectation_from_string, results_string.split(' '))
         if None in tokens:
-            log("Unrecognized result in %s" % results_string)
+            _log.warning("Unrecognized result in %s" % results_string)
         return set(tokens)
 
     @memoized
@@ -123,7 +124,7 @@
         elif actual == test_expectations.MISSING:
             return [test_failures.FailureMissingResult(), test_failures.FailureMissingImageHash(), test_failures.FailureMissingImage()]
         else:
-            log("Failed to handle: %s" % self._result_dict['actual'])
+            _log.warning("Failed to handle: %s" % self._result_dict['actual'])
             return []
 
     def _failures(self):
diff --git a/Tools/Scripts/webkitpy/common/net/resultsjsonparser_unittest.py b/Tools/Scripts/webkitpy/common/net/resultsjsonparser_unittest.py
index 867379f..aaeb5dc 100644
--- a/Tools/Scripts/webkitpy/common/net/resultsjsonparser_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/resultsjsonparser_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.resultsjsonparser import ResultsJSONParser
 from webkitpy.layout_tests.models import test_results
diff --git a/Tools/Scripts/webkitpy/common/net/statusserver.py b/Tools/Scripts/webkitpy/common/net/statusserver.py
index 2bda1ce..197387a 100644
--- a/Tools/Scripts/webkitpy/common/net/statusserver.py
+++ b/Tools/Scripts/webkitpy/common/net/statusserver.py
@@ -29,7 +29,6 @@
 # This the client designed to talk to Tools/QueueStatusServer.
 
 from webkitpy.common.net.networktransaction import NetworkTransaction
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.thirdparty.BeautifulSoup import BeautifulSoup
 
 import logging
@@ -41,7 +40,7 @@
 
 class StatusServer:
     # FIXME: This should probably move to common.config.urls.
-    default_host = "queues.webkit.org"
+    default_host = "webkit-commit-queue.appspot.com"
 
     def __init__(self, host=default_host, browser=None, bot_id=None):
         self.set_host(host)
@@ -145,11 +144,11 @@
         return NetworkTransaction().run(lambda: self._post_work_items_to_server(queue_name, work_items))
 
     def update_status(self, queue_name, status, patch=None, results_file=None):
-        log(status)
+        _log.info(status)
         return NetworkTransaction().run(lambda: self._post_status_to_server(queue_name, status, patch, results_file))
 
     def update_svn_revision(self, svn_revision_number, broken_bot):
-        log("SVN revision: %s broke %s" % (svn_revision_number, broken_bot))
+        _log.info("SVN revision: %s broke %s" % (svn_revision_number, broken_bot))
         return NetworkTransaction().run(lambda: self._post_svn_revision_to_server(svn_revision_number, broken_bot))
 
     def _fetch_url(self, url):
diff --git a/Tools/Scripts/webkitpy/common/net/statusserver_mock.py b/Tools/Scripts/webkitpy/common/net/statusserver_mock.py
index 69d1ae8..22fa12f 100644
--- a/Tools/Scripts/webkitpy/common/net/statusserver_mock.py
+++ b/Tools/Scripts/webkitpy/common/net/statusserver_mock.py
@@ -26,7 +26,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.common.system.deprecated_logging import log
+import logging
+
+_log = logging.getLogger(__name__)
 
 
 class MockStatusServer(object):
@@ -48,17 +50,17 @@
         return self._work_items.pop(0)
 
     def release_work_item(self, queue_name, patch):
-        log("MOCK: release_work_item: %s %s" % (queue_name, patch.id()))
+        _log.info("MOCK: release_work_item: %s %s" % (queue_name, patch.id()))
 
     def update_work_items(self, queue_name, work_items):
         self._work_items = work_items
-        log("MOCK: update_work_items: %s %s" % (queue_name, work_items))
+        _log.info("MOCK: update_work_items: %s %s" % (queue_name, work_items))
 
     def submit_to_ews(self, patch_id):
-        log("MOCK: submit_to_ews: %s" % (patch_id))
+        _log.info("MOCK: submit_to_ews: %s" % (patch_id))
 
     def update_status(self, queue_name, status, patch=None, results_file=None):
-        log("MOCK: update_status: %s %s" % (queue_name, status))
+        _log.info("MOCK: update_status: %s %s" % (queue_name, status))
         return 187
 
     def update_svn_revision(self, svn_revision, broken_bot):
diff --git a/Tools/Scripts/webkitpy/common/net/statusserver_unittest.py b/Tools/Scripts/webkitpy/common/net/statusserver_unittest.py
index 1f0afd0..91a42c9 100644
--- a/Tools/Scripts/webkitpy/common/net/statusserver_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/statusserver_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.statusserver import StatusServer
 from webkitpy.common.system.outputcapture import OutputCaptureTestCaseBase
diff --git a/Tools/Scripts/webkitpy/common/net/unittestresults.py b/Tools/Scripts/webkitpy/common/net/unittestresults.py
index bb82b05..b616c09 100644
--- a/Tools/Scripts/webkitpy/common/net/unittestresults.py
+++ b/Tools/Scripts/webkitpy/common/net/unittestresults.py
@@ -26,9 +26,10 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 import xml.dom.minidom
 
-from webkitpy.common.system.deprecated_logging import log
+_log = logging.getLogger(__name__)
 
 
 class UnitTestResults(object):
@@ -46,5 +47,5 @@
                     failures.append("%s.%s" % (classname, testname))
             return failures
         except xml.parsers.expat.ExpatError, e:
-            log("XML error %s parsing unit test output" % str(e))
+            _log.error("XML error %s parsing unit test output" % str(e))
             return None
diff --git a/Tools/Scripts/webkitpy/common/net/unittestresults_unittest.py b/Tools/Scripts/webkitpy/common/net/unittestresults_unittest.py
index f885206..2271392 100644
--- a/Tools/Scripts/webkitpy/common/net/unittestresults_unittest.py
+++ b/Tools/Scripts/webkitpy/common/net/unittestresults_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from unittestresults import UnitTestResults
 
@@ -34,10 +34,10 @@
 class UnitTestResultsTest(unittest.TestCase):
 
     def test_nostring(self):
-        self.assertEquals(None, UnitTestResults.results_from_string(None))
+        self.assertIsNone(UnitTestResults.results_from_string(None))
 
     def test_emptystring(self):
-        self.assertEquals(None, UnitTestResults.results_from_string(""))
+        self.assertIsNone(UnitTestResults.results_from_string(""))
 
     def test_nofailures(self):
         no_failures_xml = """<?xml version="1.0" encoding="UTF-8"?>
@@ -48,7 +48,7 @@
     <testcase name="CrashIfSettingUnsetRowIndex" status="run" time="0.123" classname="RenderTableCellDeathTest" />
   </testsuite>
 </testsuites>"""
-        self.assertEquals([], UnitTestResults.results_from_string(no_failures_xml))
+        self.assertEqual([], UnitTestResults.results_from_string(no_failures_xml))
 
     def test_onefailure(self):
         one_failure_xml = """<?xml version="1.0" encoding="UTF-8"?>
@@ -66,7 +66,7 @@
   </testsuite>
 </testsuites>"""
         expected = ["WebFrameTest.FAILS_DivAutoZoomParamsTest"]
-        self.assertEquals(expected, UnitTestResults.results_from_string(one_failure_xml))
+        self.assertEqual(expected, UnitTestResults.results_from_string(one_failure_xml))
 
     def test_multiple_failures_per_test(self):
         multiple_failures_per_test_xml = """<?xml version="1.0" encoding="UTF-8"?>
@@ -91,8 +91,4 @@
   </testsuite>
 </testsuites>"""
         expected = ["ClassOne.TestOne", "ClassTwo.TestTwo"]
-        self.assertEquals(expected, UnitTestResults.results_from_string(multiple_failures_per_test_xml))
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertEqual(expected, UnitTestResults.results_from_string(multiple_failures_per_test_xml))
diff --git a/Tools/Scripts/webkitpy/common/net/web_mock.py b/Tools/Scripts/webkitpy/common/net/web_mock.py
index 423573c..b53cb66 100644
--- a/Tools/Scripts/webkitpy/common/net/web_mock.py
+++ b/Tools/Scripts/webkitpy/common/net/web_mock.py
@@ -30,11 +30,14 @@
 
 
 class MockWeb(object):
-    def __init__(self):
+    def __init__(self, urls=None):
+        self.urls = urls or {}
         self.urls_fetched = []
 
     def get_binary(self, url, convert_404_to_None=False):
         self.urls_fetched.append(url)
+        if url in self.urls:
+            return self.urls[url]
         return "MOCK Web result, convert 404 to None=%s" % convert_404_to_None
 
 
diff --git a/Tools/Scripts/webkitpy/common/newstringio.py b/Tools/Scripts/webkitpy/common/newstringio.py
index f6d08ec..7748d50 100644
--- a/Tools/Scripts/webkitpy/common/newstringio.py
+++ b/Tools/Scripts/webkitpy/common/newstringio.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,10 +28,10 @@
 
 """'with'-compliant StringIO implementation."""
 
-import StringIO
+import StringIO as OldStringIO
 
 
-class StringIO(StringIO.StringIO):
+class StringIO(OldStringIO.StringIO):
     def __enter__(self):
         return self
 
diff --git a/Tools/Scripts/webkitpy/common/newstringio_unittest.py b/Tools/Scripts/webkitpy/common/newstringio_unittest.py
index 1ee2fb9..6704722 100644
--- a/Tools/Scripts/webkitpy/common/newstringio_unittest.py
+++ b/Tools/Scripts/webkitpy/common/newstringio_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,7 +28,7 @@
 
 """Unit tests for newstringio module."""
 
-import unittest
+import unittest2 as unittest
 
 import newstringio
 
@@ -39,6 +38,3 @@
         with newstringio.StringIO("foo") as f:
             contents = f.read()
         self.assertEqual(contents, "foo")
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/prettypatch_unittest.py b/Tools/Scripts/webkitpy/common/prettypatch_unittest.py
index 37fa844..3ae1c43 100644
--- a/Tools/Scripts/webkitpy/common/prettypatch_unittest.py
+++ b/Tools/Scripts/webkitpy/common/prettypatch_unittest.py
@@ -28,7 +28,7 @@
 
 import os.path
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive import Executive
 from webkitpy.common.prettypatch import PrettyPatch
@@ -77,7 +77,7 @@
         pretty_patch = PrettyPatch(Executive(), self._webkit_root())
         pretty = pretty_patch.pretty_diff(self._diff_with_multiple_encodings)
         self.assertTrue(pretty)  # We got some output
-        self.assertTrue(isinstance(pretty, str))  # It's a byte array, not unicode
+        self.assertIsInstance(pretty, str)  # It's a byte array, not unicode
 
     def test_pretty_print_empty_string(self):
         if not self.check_ruby():
diff --git a/Tools/Scripts/webkitpy/common/read_checksum_from_png.py b/Tools/Scripts/webkitpy/common/read_checksum_from_png.py
index 70a0502..7431f47 100644
--- a/Tools/Scripts/webkitpy/common/read_checksum_from_png.py
+++ b/Tools/Scripts/webkitpy/common/read_checksum_from_png.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/common/read_checksum_from_png_unittest.py b/Tools/Scripts/webkitpy/common/read_checksum_from_png_unittest.py
index defbbf8..751f7af 100644
--- a/Tools/Scripts/webkitpy/common/read_checksum_from_png_unittest.py
+++ b/Tools/Scripts/webkitpy/common/read_checksum_from_png_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -23,7 +22,7 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import StringIO
-import unittest
+import unittest2 as unittest
 from webkitpy.common import read_checksum_from_png
 
 
@@ -32,13 +31,9 @@
         # Test a file with the comment.
         filehandle = StringIO.StringIO('''\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03 \x00\x00\x02X\x08\x02\x00\x00\x00\x15\x14\x15'\x00\x00\x00)tEXtchecksum\x003c4134fe2739880353f91c5b84cadbaaC\xb8?\xec\x00\x00\x16\xfeIDATx\x9c\xed\xdd[\x8cU\xe5\xc1\xff\xf15T\x18\x0ea,)\xa6\x80XZ<\x10\n\xd6H\xc4V\x88}\xb5\xa9\xd6r\xd5\x0bki0\xa6\xb5ih\xd2\xde\x98PHz\xd1\x02=\\q#\x01\x8b\xa5rJ\x8b\x88i\xacM\xc5h\x8cbMk(\x1ez@!\x0c\xd5\xd2\xc2\xb44\x1c\x848\x1dF(\xeb\x7f\xb1\xff\xd9\xef~g\xd6\xde3\xe0o\x10\xec\xe7sa6{\xd6z\xd6\xb3\xd7\xf3\xa8_7\xdbM[Y\x96\x05\x00\x009\xc3\xde\xeb\t\x00\x00\xbc\xdf\x08,\x00\x800\x81\x05\x00\x10&\xb0\x00\x00\xc2\x04\x16\x00@\x98\xc0\x02\x00\x08\x13X\x00\x00a\x02\x0b\x00 Lx01\x00\x84\t,\x00\x800\x81\x05\x00\x10\xd64\xb0\xda\x9a\xdb\xb6m\xdb\xb4i\xd3\xfa\x9fr\xf3\xcd7\x0f\xe5T\x07\xe5\xd4\xa9''')
         checksum = read_checksum_from_png.read_checksum(filehandle)
-        self.assertEquals('3c4134fe2739880353f91c5b84cadbaa', checksum)
+        self.assertEqual('3c4134fe2739880353f91c5b84cadbaa', checksum)
 
         # Test a file without the comment.
         filehandle = StringIO.StringIO('''\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03 \x00\x00\x02X\x08\x02\x00\x00\x00\x15\x14\x15'\x00\x00\x16\xfeIDATx\x9c\xed\xdd[\x8cU\xe5\xc1\xff\xf15T\x18\x0ea,)\xa6\x80XZ<\x10\n\xd6H\xc4V\x88}\xb5\xa9\xd6r\xd5\x0bki0\xa6\xb5ih\xd2\xde\x98PHz\xd1\x02=\\q#\x01\x8b\xa5rJ\x8b\x88i\xacM\xc5h\x8cbMk(\x1ez@!\x0c\xd5\xd2\xc2\xb44\x1c\x848\x1dF(\xeb\x7f\xb1\xff\xd9\xef~g\xd6\xde3\xe0o\x10\xec\xe7sa6{\xd6z\xd6\xb3\xd7\xf3\xa8_7\xdbM[Y\x96\x05\x00\x009\xc3\xde\xeb\t\x00\x00\xbc\xdf\x08,\x00\x800\x81\x05\x00\x10&\xb0\x00\x00\xc2\x04\x16\x00@\x98\xc0\x02\x00\x08\x13X\x00\x00a\x02\x0b\x00 Lx01\x00\x84\t,\x00\x800\x81\x05\x00\x10\xd64\xb0\xda\x9a\xdb\xb6m\xdb\xb4i\xd3\xfa\x9fr\xf3\xcd7\x0f\xe5T\x07\xe5\xd4\xa9S\x8b\x17/\x1e?~\xfc\xf8\xf1\xe3\xef\xbf\xff\xfe\xf7z:M5\xbb\x87\x17\xcbUZ\x8f|V\xd7\xbd\x10\xb6\xcd{b\x88\xf6j\xb3\x9b?\x14\x9b\xa1>\xe6\xf9\xd9\xcf\x00\x17\x93''')
         checksum = read_checksum_from_png.read_checksum(filehandle)
-        self.assertEquals(None, checksum)
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertIsNone(checksum)
diff --git a/Tools/Scripts/webkitpy/common/system/autoinstall.py b/Tools/Scripts/webkitpy/common/system/autoinstall.py
old mode 100755
new mode 100644
index f3045f8..e5f1b54
--- a/Tools/Scripts/webkitpy/common/system/autoinstall.py
+++ b/Tools/Scripts/webkitpy/common/system/autoinstall.py
@@ -35,6 +35,7 @@
 import logging
 import os
 import shutil
+import stat
 import sys
 import tarfile
 import tempfile
@@ -146,7 +147,7 @@
         # The tempfile.mkdtemp() method function requires that the
         # directory corresponding to the "dir" parameter already exist
         # if it is not None.
-        scratch_dir = tempfile.mkdtemp(prefix=prefix, dir=self._temp_dir)
+        scratch_dir = tempfile.mkdtemp(prefix=prefix.replace('/', '.'), dir=self._temp_dir)
         return scratch_dir
 
     def _create_scratch_directory(self, target_name):
@@ -173,7 +174,7 @@
         return scratch_dir
 
     def _url_downloaded_path(self, target_name):
-        return os.path.join(self._target_dir, ".%s.url" % target_name)
+        return os.path.join(self._target_dir, ".%s.url" % target_name.replace('/', '_'))
 
     def _is_downloaded(self, target_name, url):
         version_path = self._url_downloaded_path(target_name)
@@ -283,17 +284,27 @@
         return new_path
 
     def _download_to_stream(self, url, stream):
-        try:
-            netstream = urllib.urlopen(url)
-        except IOError, err:
-            # Append existing Error message to new Error.
-            message = ('Could not download Python modules from URL "%s".\n'
-                       " Make sure you are connected to the internet.\n"
-                       " You must be connected to the internet when "
-                       "downloading needed modules for the first time.\n"
-                       " --> Inner message: %s"
-                       % (url, err))
-            raise IOError(message)
+        failures = 0
+        while True:
+            try:
+                netstream = urllib.urlopen(url)
+                break
+            except IOError, err:
+                # Try multiple times
+                if failures < 5:
+                    _log.warning("Failed to download %s, %s retrying" % (
+                        url, err))
+                    failures += 1
+                    continue
+
+                # Append existing Error message to new Error.
+                message = ('Could not download Python modules from URL "%s".\n'
+                           " Make sure you are connected to the internet.\n"
+                           " You must be connected to the internet when "
+                           "downloading needed modules for the first time.\n"
+                           " --> Inner message: %s"
+                           % (url, err))
+                raise IOError(message)
         code = 200
         if hasattr(netstream, "getcode"):
             code = netstream.getcode()
@@ -319,8 +330,7 @@
 
         return target_path
 
-    def _install(self, scratch_dir, package_name, target_path, url,
-                 url_subpath):
+    def _install(self, scratch_dir, package_name, target_path, url, url_subpath, files_to_remove):
         """Install a python package from an URL.
 
         This internal method overwrites the target path if the target
@@ -335,9 +345,16 @@
         else:
             source_path = os.path.join(path, url_subpath)
 
+        for filename in files_to_remove:
+            path = os.path.join(source_path, filename.replace('/', os.sep))
+            if os.path.exists(path):
+                # Pre-emptively change the permissions to #0777 to try and work around win32 permissions issues.
+                os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+                os.remove(path)
+
         if os.path.exists(target_path):
             if os.path.isdir(target_path):
-                shutil.rmtree(target_path)
+                shutil.rmtree(target_path, ignore_errors=True)
             else:
                 os.remove(target_path)
 
@@ -354,7 +371,7 @@
         self._record_url_downloaded(package_name, url)
 
     def install(self, url, should_refresh=False, target_name=None,
-                url_subpath=None):
+                url_subpath=None, files_to_remove=None):
         """Install a python package from an URL.
 
         Args:
@@ -382,10 +399,11 @@
             url_subpath = os.path.normpath(url_subpath)
             target_name = os.path.basename(url_subpath)
 
-        target_path = os.path.join(self._target_dir, target_name)
+        target_path = os.path.join(self._target_dir, target_name.replace('/', os.sep))
         if not should_refresh and self._is_downloaded(target_name, url):
             return False
 
+        files_to_remove = files_to_remove or []
         package_name = target_name.replace(os.sep, '.')
         _log.info("Auto-installing package: %s" % package_name)
 
@@ -399,7 +417,8 @@
                           target_path=target_path,
                           scratch_dir=scratch_dir,
                           url=url,
-                          url_subpath=url_subpath)
+                          url_subpath=url_subpath,
+                          files_to_remove=files_to_remove)
         except Exception, err:
             # Append existing Error message to new Error.
             message = ("Error auto-installing the %s package to:\n"
@@ -408,7 +427,7 @@
                        % (target_name, target_path, err))
             raise Exception(message)
         finally:
-            shutil.rmtree(scratch_dir)
+            shutil.rmtree(scratch_dir, ignore_errors=True)
         _log.debug('Auto-installed %s to:' % url)
         _log.debug('    "%s"' % target_path)
         return True
diff --git a/Tools/Scripts/webkitpy/common/system/crashlogs_unittest.py b/Tools/Scripts/webkitpy/common/system/crashlogs_unittest.py
index 1f5c40a..ada5d0e 100644
--- a/Tools/Scripts/webkitpy/common/system/crashlogs_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/crashlogs_unittest.py
@@ -21,7 +21,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.crashlogs import CrashLogs
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -69,13 +69,6 @@
 """.format(process_name=process_name, pid=pid)
 
 class CrashLogsTest(unittest.TestCase):
-    def assertLinesEqual(self, a, b):
-        if hasattr(self, 'assertMultiLineEqual'):
-            self.assertMultiLineEqual(a, b)
-        else:
-            self.assertEqual(a.splitlines(), b.splitlines())
-
-
     def test_find_log_darwin(self):
         if not SystemHost().platform.is_mac():
             return
@@ -95,15 +88,15 @@
         filesystem = MockFileSystem(files)
         crash_logs = CrashLogs(MockSystemHost(filesystem=filesystem))
         log = crash_logs.find_newest_log("DumpRenderTree")
-        self.assertLinesEqual(log, newer_mock_crash_report)
+        self.assertMultiLineEqual(log, newer_mock_crash_report)
         log = crash_logs.find_newest_log("DumpRenderTree", 28529)
-        self.assertLinesEqual(log, newer_mock_crash_report)
+        self.assertMultiLineEqual(log, newer_mock_crash_report)
         log = crash_logs.find_newest_log("DumpRenderTree", 28530)
-        self.assertLinesEqual(log, mock_crash_report)
+        self.assertMultiLineEqual(log, mock_crash_report)
         log = crash_logs.find_newest_log("DumpRenderTree", 28531)
-        self.assertEqual(log, None)
+        self.assertIsNone(log)
         log = crash_logs.find_newest_log("DumpRenderTree", newer_than=1.0)
-        self.assertEqual(log, None)
+        self.assertIsNone(log)
 
         def bad_read(path):
             raise IOError('IOError: No such file or directory')
@@ -113,10 +106,10 @@
 
         filesystem.read_text_file = bad_read
         log = crash_logs.find_newest_log("DumpRenderTree", 28531, include_errors=True)
-        self.assertTrue('IOError: No such file or directory' in log)
+        self.assertIn('IOError: No such file or directory', log)
 
         filesystem = MockFileSystem(files)
         crash_logs = CrashLogs(MockSystemHost(filesystem=filesystem))
         filesystem.mtime = bad_mtime
         log = crash_logs.find_newest_log("DumpRenderTree", newer_than=1.0, include_errors=True)
-        self.assertTrue('OSError: No such file or directory' in log)
+        self.assertIn('OSError: No such file or directory', log)
diff --git a/Tools/Scripts/webkitpy/common/system/deprecated_logging_unittest.py b/Tools/Scripts/webkitpy/common/system/deprecated_logging_unittest.py
deleted file mode 100644
index 3778162..0000000
--- a/Tools/Scripts/webkitpy/common/system/deprecated_logging_unittest.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (C) 2009 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#    * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#    * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#    * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-import os
-import StringIO
-import tempfile
-import unittest
-
-from webkitpy.common.system.executive import ScriptError
-from webkitpy.common.system.deprecated_logging import *
-
-class LoggingTest(unittest.TestCase):
-
-    def assert_log_equals(self, log_input, expected_output):
-        original_stderr = sys.stderr
-        test_stderr = StringIO.StringIO()
-        sys.stderr = test_stderr
-
-        try:
-            log(log_input)
-            actual_output = test_stderr.getvalue()
-        finally:
-            sys.stderr = original_stderr
-
-        self.assertEquals(actual_output, expected_output, "log(\"%s\") expected: %s actual: %s" % (log_input, expected_output, actual_output))
-
-    def test_log(self):
-        self.assert_log_equals("test", "test\n")
-
-        # Test that log() does not throw an exception when passed an object instead of a string.
-        self.assert_log_equals(ScriptError(message="ScriptError"), "ScriptError\n")
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/system/environment_unittest.py b/Tools/Scripts/webkitpy/common/system/environment_unittest.py
index 6558b51..2868a65 100644
--- a/Tools/Scripts/webkitpy/common/system/environment_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/environment_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from .environment import Environment
 
diff --git a/Tools/Scripts/webkitpy/common/system/executive.py b/Tools/Scripts/webkitpy/common/system/executive.py
index b1d2390..3b3b7ef 100644
--- a/Tools/Scripts/webkitpy/common/system/executive.py
+++ b/Tools/Scripts/webkitpy/common/system/executive.py
@@ -37,7 +37,7 @@
 import sys
 import time
 
-from webkitpy.common.system.deprecated_logging import tee
+from webkitpy.common.system.outputtee import Tee
 from webkitpy.common.system.filesystem import FileSystem
 
 
@@ -46,14 +46,6 @@
 
 class ScriptError(Exception):
 
-    # This is a custom List.__str__ implementation to allow size limiting.
-    def _string_from_args(self, args, limit=100):
-        args_string = unicode(args)
-        # We could make this much fancier, but for now this is OK.
-        if len(args_string) > limit:
-            return args_string[:limit - 3] + "..."
-        return args_string
-
     def __init__(self,
                  message=None,
                  script_args=None,
@@ -61,7 +53,7 @@
                  output=None,
                  cwd=None):
         if not message:
-            message = 'Failed to run "%s"' % self._string_from_args(script_args)
+            message = 'Failed to run "%s"' % repr(script_args)
             if exit_code:
                 message += " exit_code: %d" % exit_code
             if cwd:
@@ -101,9 +93,6 @@
         return sys.platform not in ('win32', 'cygwin')
 
     def _run_command_with_teed_output(self, args, teed_output, **kwargs):
-        args = map(unicode, args)  # Popen will throw an exception if args are non-strings (like int())
-        args = map(self._encode_argument_if_needed, args)
-
         child_process = self.popen(args,
                                    stdout=self.PIPE,
                                    stderr=self.STDOUT,
@@ -135,7 +124,7 @@
         if quiet:
             dev_null = open(os.devnull, "w")  # FIXME: Does this need an encoding?
             tee_stdout = dev_null
-        child_stdout = tee(child_out_file, tee_stdout)
+        child_stdout = Tee(child_out_file, tee_stdout)
         exit_code = self._run_command_with_teed_output(args, child_stdout, **kwargs)
         if quiet:
             dev_null.close()
@@ -307,6 +296,13 @@
         while self.check_running_pid(pid):
             time.sleep(0.25)
 
+    def wait_limited(self, pid, limit_in_seconds=None, check_frequency_in_seconds=None):
+        seconds_left = limit_in_seconds or 10
+        sleep_length = check_frequency_in_seconds or 1
+        while seconds_left > 0 and self.check_running_pid(pid):
+            seconds_left -= sleep_length
+            time.sleep(sleep_length)
+
     def _windows_image_name(self, process_name):
         name, extension = os.path.splitext(process_name)
         if not extension:
@@ -315,6 +311,17 @@
             process_name = "%s.exe" % name
         return process_name
 
+    def interrupt(self, pid):
+        interrupt_signal = signal.SIGINT
+        # FIXME: The python docs seem to imply that platform == 'win32' may need to use signal.CTRL_C_EVENT
+        # http://docs.python.org/2/library/signal.html
+        try:
+            os.kill(pid, interrupt_signal)
+        except OSError:
+            # Silently ignore when the pid doesn't exist.
+            # It's impossible for callers to avoid race conditions with process shutdown.
+            pass
+
     def kill_all(self, process_name):
         """Attempts to kill processes matching process_name.
         Will fail silently if no process are found."""
@@ -365,9 +372,10 @@
             input = input.encode(self._child_process_encoding())
         return (self.PIPE, input)
 
-    def _command_for_printing(self, args):
+    def command_for_printing(self, args):
         """Returns a print-ready string representing command args.
         The string should be copy/paste ready for execution in a shell."""
+        args = self._stringify_args(args)
         escaped_args = []
         for arg in args:
             if isinstance(arg, unicode):
@@ -390,8 +398,6 @@
         """Popen wrapper for convenience and to work around python bugs."""
         assert(isinstance(args, list) or isinstance(args, tuple))
         start_time = time.time()
-        args = map(unicode, args)  # Popen will throw an exception if args are non-strings (like int())
-        args = map(self._encode_argument_if_needed, args)
 
         stdin, string_to_communicate = self._compute_stdin(input)
         stderr = self.STDOUT if return_stderr else None
@@ -413,7 +419,7 @@
         # http://bugs.python.org/issue1731717
         exit_code = process.wait()
 
-        _log.debug('"%s" took %.2fs' % (self._command_for_printing(args), time.time() - start_time))
+        _log.debug('"%s" took %.2fs' % (self.command_for_printing(args), time.time() - start_time))
 
         if return_exit_code:
             return exit_code
@@ -457,8 +463,23 @@
             return argument
         return argument.encode(self._child_process_encoding())
 
-    def popen(self, *args, **kwargs):
-        return subprocess.Popen(*args, **kwargs)
+    def _stringify_args(self, args):
+        # Popen will throw an exception if args are non-strings (like int())
+        string_args = map(unicode, args)
+        # The Windows implementation of Popen cannot handle unicode strings. :(
+        return map(self._encode_argument_if_needed, string_args)
+
+    # The only required arugment to popen is named "args", the rest are optional keyword arguments.
+    def popen(self, args, **kwargs):
+        # FIXME: We should always be stringifying the args, but callers who pass shell=True
+        # expect that the exact bytes passed will get passed to the shell (even if they're wrongly encoded).
+        # shell=True is wrong for many other reasons, and we should remove this
+        # hack as soon as we can fix all callers to not use shell=True.
+        if kwargs.get('shell') == True:
+            string_args = args
+        else:
+            string_args = self._stringify_args(args)
+        return subprocess.Popen(string_args, **kwargs)
 
     def run_in_parallel(self, command_lines_and_cwds, processes=None):
         """Runs a list of (cmd_line list, cwd string) tuples in parallel and returns a list of (retcode, stdout, stderr) tuples."""
diff --git a/Tools/Scripts/webkitpy/common/system/executive_mock.py b/Tools/Scripts/webkitpy/common/system/executive_mock.py
index c261353..48a9bc1 100644
--- a/Tools/Scripts/webkitpy/common/system/executive_mock.py
+++ b/Tools/Scripts/webkitpy/common/system/executive_mock.py
@@ -26,12 +26,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 import os
 import StringIO
 
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.executive import ScriptError
 
+_log = logging.getLogger(__name__)
+
 
 class MockProcess(object):
     def __init__(self, stdout='MOCK STDOUT\n', stderr=''):
@@ -71,7 +73,7 @@
             if process_name_filter(process_name):
                 running_pids.append(process_pid)
 
-        log("MOCK running_pids: %s" % running_pids)
+        _log.info("MOCK running_pids: %s" % running_pids)
         return running_pids
 
     def run_and_throw_if_fail(self, args, quiet=False, cwd=None, env=None):
@@ -79,11 +81,15 @@
             env_string = ""
             if env:
                 env_string = ", env=%s" % env
-            log("MOCK run_and_throw_if_fail: %s, cwd=%s%s" % (args, cwd, env_string))
+            _log.info("MOCK run_and_throw_if_fail: %s, cwd=%s%s" % (args, cwd, env_string))
         if self._should_throw_when_run.intersection(args):
             raise ScriptError("Exception for %s" % args, output="MOCK command output")
         return "MOCK output of child process"
 
+    def command_for_printing(self, args):
+        string_args = map(unicode, args)
+        return " ".join(string_args)
+
     def run_command(self,
                     args,
                     cwd=None,
@@ -104,8 +110,12 @@
             input_string = ""
             if input:
                 input_string = ", input=%s" % input
-            log("MOCK run_command: %s, cwd=%s%s%s" % (args, cwd, env_string, input_string))
+            _log.info("MOCK run_command: %s, cwd=%s%s%s" % (args, cwd, env_string, input_string))
         output = "MOCK output of child process"
+
+        if self._should_throw_when_run.intersection(args):
+            raise ScriptError("Exception for %s" % args, output="MOCK command output")
+
         if self._should_throw:
             raise ScriptError("MOCK ScriptError", output=output)
         return output
@@ -128,7 +138,7 @@
             env_string = ""
             if env:
                 env_string = ", env=%s" % env
-            log("MOCK popen: %s%s%s" % (args, cwd_string, env_string))
+            _log.info("MOCK popen: %s%s%s" % (args, cwd_string, env_string))
         if not self._proc:
             self._proc = MockProcess()
         return self._proc
@@ -168,7 +178,7 @@
         self.calls.append(args)
         assert(isinstance(args, list) or isinstance(args, tuple))
         if self._exception:
-            raise self._exception
+            raise self._exception  # pylint: disable=E0702
         if self._run_command_fn:
             return self._run_command_fn(args)
         if return_exit_code:
diff --git a/Tools/Scripts/webkitpy/common/system/executive_unittest.py b/Tools/Scripts/webkitpy/common/system/executive_unittest.py
index 57c5573..f71201a 100644
--- a/Tools/Scripts/webkitpy/common/system/executive_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/executive_unittest.py
@@ -33,34 +33,36 @@
 import subprocess
 import sys
 import time
-import unittest
 
 # Since we execute this script directly as part of the unit tests, we need to ensure
 # that Tools/Scripts is in sys.path for the next imports to work correctly.
 script_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
 if script_dir not in sys.path:
     sys.path.append(script_dir)
+third_party_py = os.path.join(script_dir, "webkitpy", "thirdparty", "autoinstalled")
+if third_party_py not in sys.path:
+    sys.path.append(third_party_py)
+
+import unittest2 as unittest
 
 from webkitpy.common.system.executive import Executive, ScriptError
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 
 
 class ScriptErrorTest(unittest.TestCase):
-    def test_string_from_args(self):
-        error = ScriptError()
-        self.assertEquals(error._string_from_args(None), 'None')
-        self.assertEquals(error._string_from_args([]), '[]')
-        self.assertEquals(error._string_from_args(map(str, range(30))), "['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17'...")
-
     def test_message_with_output(self):
         error = ScriptError('My custom message!', '', -1)
-        self.assertEquals(error.message_with_output(), 'My custom message!')
+        self.assertEqual(error.message_with_output(), 'My custom message!')
         error = ScriptError('My custom message!', '', -1, 'My output.')
-        self.assertEquals(error.message_with_output(), 'My custom message!\n\nMy output.')
+        self.assertEqual(error.message_with_output(), 'My custom message!\n\nMy output.')
         error = ScriptError('', 'my_command!', -1, 'My output.', '/Users/username/blah')
-        self.assertEquals(error.message_with_output(), 'Failed to run "my_command!" exit_code: -1 cwd: /Users/username/blah\n\nMy output.')
+        self.assertEqual(error.message_with_output(), 'Failed to run "\'my_command!\'" exit_code: -1 cwd: /Users/username/blah\n\nMy output.')
         error = ScriptError('', 'my_command!', -1, 'ab' + '1' * 499)
-        self.assertEquals(error.message_with_output(), 'Failed to run "my_command!" exit_code: -1\n\nLast 500 characters of output:\nb' + '1' * 499)
+        self.assertEqual(error.message_with_output(), 'Failed to run "\'my_command!\'" exit_code: -1\n\nLast 500 characters of output:\nb' + '1' * 499)
+
+    def test_message_with_tuple(self):
+        error = ScriptError('', ('my', 'command'), -1, 'My output.', '/Users/username/blah')
+        self.assertEqual(error.message_with_output(), 'Failed to run "(\'my\', \'command\')" exit_code: -1 cwd: /Users/username/blah\n\nMy output.')
 
 def never_ending_command():
     """Arguments for a command that will never end (useful for testing process
@@ -104,7 +106,7 @@
     def test_run_command_with_bad_command(self):
         def run_bad_command():
             Executive().run_command(["foo_bar_command_blah"], error_handler=Executive.ignore_error, return_exit_code=True)
-        self.failUnlessRaises(OSError, run_bad_command)
+        self.assertRaises(OSError, run_bad_command)
 
     def test_run_command_args_type(self):
         executive = Executive()
@@ -113,6 +115,17 @@
         executive.run_command(command_line('echo', 'foo'))
         executive.run_command(tuple(command_line('echo', 'foo')))
 
+    def test_auto_stringify_args(self):
+        executive = Executive()
+        executive.run_command(command_line('echo', 1))
+        executive.popen(command_line('echo', 1), stdout=executive.PIPE).wait()
+        self.assertEqual('echo 1', executive.command_for_printing(['echo', 1]))
+
+    def test_popen_args(self):
+        executive = Executive()
+        # Explicitly naming the 'args' argument should not thow an exception.
+        executive.popen(args=command_line('echo', 1), stdout=executive.PIPE).wait()
+
     def test_run_command_with_unicode(self):
         """Validate that it is safe to pass unicode() objects
         to Executive.run* methods, and they will return unicode()
@@ -133,24 +146,24 @@
         executive = Executive()
 
         output = executive.run_command(command_line('cat'), input=unicode_tor_input)
-        self.assertEquals(output, unicode_tor_output)
+        self.assertEqual(output, unicode_tor_output)
 
         output = executive.run_command(command_line('echo', unicode_tor_input))
-        self.assertEquals(output, unicode_tor_output)
+        self.assertEqual(output, unicode_tor_output)
 
         output = executive.run_command(command_line('echo', unicode_tor_input), decode_output=False)
-        self.assertEquals(output, encoded_tor)
+        self.assertEqual(output, encoded_tor)
 
         # Make sure that str() input also works.
         output = executive.run_command(command_line('cat'), input=encoded_tor, decode_output=False)
-        self.assertEquals(output, encoded_tor)
+        self.assertEqual(output, encoded_tor)
 
         # FIXME: We should only have one run* method to test
         output = executive.run_and_throw_if_fail(command_line('echo', unicode_tor_input), quiet=True)
-        self.assertEquals(output, unicode_tor_output)
+        self.assertEqual(output, unicode_tor_output)
 
         output = executive.run_and_throw_if_fail(command_line('echo', unicode_tor_input), quiet=True, decode_output=False)
-        self.assertEquals(output, encoded_tor)
+        self.assertEqual(output, encoded_tor)
 
     def serial_test_kill_process(self):
         executive = Executive()
@@ -161,11 +174,11 @@
         if sys.platform == "win32":
             # FIXME: https://bugs.webkit.org/show_bug.cgi?id=54790
             # We seem to get either 0 or 1 here for some reason.
-            self.assertTrue(process.wait() in (0, 1))
+            self.assertIn(process.wait(), (0, 1))
         elif sys.platform == "cygwin":
             # FIXME: https://bugs.webkit.org/show_bug.cgi?id=98196
             # cygwin seems to give us either SIGABRT or SIGKILL
-            self.assertTrue(process.wait() in (-signal.SIGABRT, -signal.SIGKILL))
+            self.assertIn(process.wait(), (-signal.SIGABRT, -signal.SIGKILL))
         else:
             expected_exit_code = -signal.SIGKILL
             self.assertEqual(process.wait(), expected_exit_code)
@@ -176,7 +189,7 @@
     def serial_test_kill_all(self):
         executive = Executive()
         process = subprocess.Popen(never_ending_command(), stdout=subprocess.PIPE)
-        self.assertEqual(process.poll(), None)  # Process is running
+        self.assertIsNone(process.poll())  # Process is running
         executive.kill_all(never_ending_command()[0])
         # Note: Can't use a ternary since signal.SIGTERM is undefined for sys.platform == "win32"
         if sys.platform == "cygwin":
@@ -185,7 +198,7 @@
         elif sys.platform == "win32":
             # FIXME: https://bugs.webkit.org/show_bug.cgi?id=54790
             # We seem to get either 0 or 1 here for some reason.
-            self.assertTrue(process.wait() in (0, 1))
+            self.assertIn(process.wait(), (0, 1))
         else:
             expected_exit_code = -signal.SIGTERM
             self.assertEqual(process.wait(), expected_exit_code)
@@ -218,7 +231,7 @@
 
         executive = Executive()
         pids = executive.running_pids()
-        self.assertTrue(os.getpid() in pids)
+        self.assertIn(os.getpid(), pids)
 
     def serial_test_run_in_parallel(self):
         # We run this test serially to avoid overloading the machine and throwing off the timing.
@@ -236,8 +249,8 @@
         command_outputs = Executive().run_in_parallel(commands, processes=NUM_PROCESSES)
         done = time.time()
         self.assertTrue(done - start < NUM_PROCESSES * DELAY_SECS)
-        self.assertEquals([output[1] for output in command_outputs], ["hello\n"] * NUM_PROCESSES)
-        self.assertEquals([],  multiprocessing.active_children())
+        self.assertEqual([output[1] for output in command_outputs], ["hello\n"] * NUM_PROCESSES)
+        self.assertEqual([],  multiprocessing.active_children())
 
     def test_run_in_parallel_assert_nonempty(self):
         self.assertRaises(AssertionError, Executive().run_in_parallel, [])
diff --git a/Tools/Scripts/webkitpy/common/system/file_lock.py b/Tools/Scripts/webkitpy/common/system/file_lock.py
index c542777..3ca8b3c 100644
--- a/Tools/Scripts/webkitpy/common/system/file_lock.py
+++ b/Tools/Scripts/webkitpy/common/system/file_lock.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 #
 # All rights reserved.
diff --git a/Tools/Scripts/webkitpy/common/system/file_lock_integrationtest.py b/Tools/Scripts/webkitpy/common/system/file_lock_integrationtest.py
index 5cd27d1..7b1b426 100644
--- a/Tools/Scripts/webkitpy/common/system/file_lock_integrationtest.py
+++ b/Tools/Scripts/webkitpy/common/system/file_lock_integrationtest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 #
 # All rights reserved.
@@ -26,7 +25,7 @@
 
 import os
 import tempfile
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.file_lock import FileLock
 
diff --git a/Tools/Scripts/webkitpy/common/system/file_lock_mock.py b/Tools/Scripts/webkitpy/common/system/file_lock_mock.py
index e2c1d5c..f53081d 100644
--- a/Tools/Scripts/webkitpy/common/system/file_lock_mock.py
+++ b/Tools/Scripts/webkitpy/common/system/file_lock_mock.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2012 Google Inc. All rights reserved.
 #
 # All rights reserved.
@@ -30,7 +29,7 @@
         pass
 
     def acquire_lock(self):
-        pass
+        return True
 
     def release_lock(self):
-        pass
+        return True
diff --git a/Tools/Scripts/webkitpy/common/system/filesystem_mock.py b/Tools/Scripts/webkitpy/common/system/filesystem_mock.py
index d87fe1b..ee0664e 100644
--- a/Tools/Scripts/webkitpy/common/system/filesystem_mock.py
+++ b/Tools/Scripts/webkitpy/common/system/filesystem_mock.py
@@ -108,9 +108,9 @@
         if not self.exists(source):
             self._raise_not_found(source)
         if self.isdir(source):
-            raise IOError(errno.EISDIR, source, os.strerror(errno.ISDIR))
+            raise IOError(errno.EISDIR, source, os.strerror(errno.EISDIR))
         if self.isdir(destination):
-            raise IOError(errno.EISDIR, destination, os.strerror(errno.ISDIR))
+            raise IOError(errno.EISDIR, destination, os.strerror(errno.EISDIR))
         if not self.exists(self.dirname(destination)):
             raise IOError(errno.ENOENT, destination, os.strerror(errno.ENOENT))
 
@@ -395,7 +395,7 @@
     def splitext(self, path):
         idx = path.rfind('.')
         if idx == -1:
-            idx = 0
+            idx = len(path)
         return (path[0:idx], path[idx:])
 
 
@@ -452,7 +452,7 @@
 
 class ReadableTextFileObject(ReadableBinaryFileObject):
     def __init__(self, fs, path, data):
-        super(ReadableTextFileObject, self).__init__(fs, path, StringIO.StringIO(data))
+        super(ReadableTextFileObject, self).__init__(fs, path, StringIO.StringIO(data.decode("utf-8")))
 
     def close(self):
         self.data.close()
diff --git a/Tools/Scripts/webkitpy/common/system/filesystem_mock_unittest.py b/Tools/Scripts/webkitpy/common/system/filesystem_mock_unittest.py
index 2a6ccbf..a598332 100644
--- a/Tools/Scripts/webkitpy/common/system/filesystem_mock_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/filesystem_mock_unittest.py
@@ -28,7 +28,7 @@
 
 import os
 import re
-import unittest
+import unittest2 as unittest
 
 
 from webkitpy.common.system import filesystem_mock
@@ -52,7 +52,7 @@
             else:
                 expected = good_fn(test)
                 actual = test_fn(test)
-            self.assertEquals(expected, actual, 'given %s, expected %s, got %s' % (repr(test), repr(expected), repr(actual)))
+            self.assertEqual(expected, actual, 'given %s, expected %s, got %s' % (repr(test), repr(expected), repr(actual)))
 
     def test_join(self):
         self.quick_check(self.fs.join,
@@ -82,7 +82,3 @@
                          'foo/../bar',
                          'foo/../bar/baz',
                          '../foo')
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/system/filesystem_unittest.py b/Tools/Scripts/webkitpy/common/system/filesystem_unittest.py
index e6d1e42..26389e7 100644
--- a/Tools/Scripts/webkitpy/common/system/filesystem_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/filesystem_unittest.py
@@ -35,7 +35,7 @@
 import stat
 import sys
 import tempfile
-import unittest
+import unittest2 as unittest
 
 from filesystem import FileSystem
 
@@ -60,19 +60,19 @@
 
     def test_glob__trailing_asterisk(self):
         self.fs.chdir(self.generic_test_dir)
-        self.assertEquals(set(self.fs.glob('fo*')), set(['foo.txt', 'foobar', 'foodir']))
+        self.assertEqual(set(self.fs.glob('fo*')), set(['foo.txt', 'foobar', 'foodir']))
 
     def test_glob__leading_asterisk(self):
         self.fs.chdir(self.generic_test_dir)
-        self.assertEquals(set(self.fs.glob('*xt')), set(['foo.txt']))
+        self.assertEqual(set(self.fs.glob('*xt')), set(['foo.txt']))
 
     def test_glob__middle_asterisk(self):
         self.fs.chdir(self.generic_test_dir)
-        self.assertEquals(set(self.fs.glob('f*r')), set(['foobar', 'foodir']))
+        self.assertEqual(set(self.fs.glob('f*r')), set(['foobar', 'foodir']))
 
     def test_glob__period_is_escaped(self):
         self.fs.chdir(self.generic_test_dir)
-        self.assertEquals(set(self.fs.glob('foo.*')), set(['foo.txt']))
+        self.assertEqual(set(self.fs.glob('foo.*')), set(['foo.txt']))
 
 class RealFileSystemTest(unittest.TestCase, GenericFileSystemTests):
     def setUp(self):
@@ -94,7 +94,7 @@
         if sys.platform == 'win32':
             newdir = 'c:\\'
         fs.chdir(newdir)
-        self.assertEquals(fs.getcwd(), newdir)
+        self.assertEqual(fs.getcwd(), newdir)
         fs.chdir(cwd)
 
     def test_chdir__notexists(self):
@@ -246,15 +246,11 @@
 
         fs = FileSystem()
         self.assertTrue(fs.remove('filename', remove_with_exception))
-        self.assertEquals(-1, RealFileSystemTest._remove_failures)
+        self.assertEqual(-1, RealFileSystemTest._remove_failures)
 
     def test_sep(self):
         fs = FileSystem()
 
-        self.assertEquals(fs.sep, os.sep)
-        self.assertEquals(fs.join("foo", "bar"),
+        self.assertEqual(fs.sep, os.sep)
+        self.assertEqual(fs.join("foo", "bar"),
                           os.path.join("foo", "bar"))
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/system/logtesting.py b/Tools/Scripts/webkitpy/common/system/logtesting.py
index e361cb5..1aba172 100644
--- a/Tools/Scripts/webkitpy/common/system/logtesting.py
+++ b/Tools/Scripts/webkitpy/common/system/logtesting.py
@@ -32,7 +32,7 @@
 """
 
 import logging
-import unittest
+import unittest2 as unittest
 
 
 class TestLogStream(object):
@@ -72,7 +72,7 @@
         messages: A list of log message strings.
 
         """
-        self._test_case.assertEquals(messages, self.messages)
+        self._test_case.assertEqual(messages, self.messages)
 
 
 class LogTesting(object):
diff --git a/Tools/Scripts/webkitpy/common/system/logutils_unittest.py b/Tools/Scripts/webkitpy/common/system/logutils_unittest.py
index 72789eb..252ebf4 100644
--- a/Tools/Scripts/webkitpy/common/system/logutils_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/logutils_unittest.py
@@ -24,7 +24,7 @@
 
 import logging
 import os
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.logtesting import LogTesting
 from webkitpy.common.system.logtesting import TestLogStream
@@ -37,7 +37,7 @@
 
     def test_get_logger_in_webkitpy(self):
         logger = logutils.get_logger(__file__)
-        self.assertEquals(logger.name, "webkitpy.common.system.logutils_unittest")
+        self.assertEqual(logger.name, "webkitpy.common.system.logutils_unittest")
 
     def test_get_logger_not_in_webkitpy(self):
         # Temporarily change the working directory so that we
@@ -47,10 +47,10 @@
         os.chdir(root_dir)
 
         logger = logutils.get_logger("/Tools/Scripts/test-webkitpy")
-        self.assertEquals(logger.name, "test-webkitpy")
+        self.assertEqual(logger.name, "test-webkitpy")
 
         logger = logutils.get_logger("/Tools/Scripts/test-webkitpy.py")
-        self.assertEquals(logger.name, "test-webkitpy")
+        self.assertEqual(logger.name, "test-webkitpy")
 
         os.chdir(working_directory)
 
diff --git a/Tools/Scripts/webkitpy/common/system/outputcapture.py b/Tools/Scripts/webkitpy/common/system/outputcapture.py
index 78a12f0..893b5e5 100644
--- a/Tools/Scripts/webkitpy/common/system/outputcapture.py
+++ b/Tools/Scripts/webkitpy/common/system/outputcapture.py
@@ -29,8 +29,8 @@
 # Class for unittest support.  Used for capturing stderr/stdout.
 
 import logging
+import unittest  # Don't use unittest2 here as the autoinstaller may not have it yet.
 import sys
-import unittest
 from StringIO import StringIO
 
 
@@ -94,15 +94,22 @@
         finally:
             (stdout_string, stderr_string, logs_string) = self.restore_output()
 
-        testcase.assertEqual(stdout_string, expected_stdout)
-        testcase.assertEqual(stderr_string, expected_stderr)
+        if hasattr(testcase, 'assertMultiLineEqual'):
+            testassert = testcase.assertMultiLineEqual
+        else:
+            testassert = testcase.assertEqual
+
+        testassert(stdout_string, expected_stdout)
+        testassert(stderr_string, expected_stderr)
         if expected_logs is not None:
-            testcase.assertEqual(logs_string, expected_logs)
+            testassert(logs_string, expected_logs)
         # This is a little strange, but I don't know where else to return this information.
         return return_value
 
 
 class OutputCaptureTestCaseBase(unittest.TestCase):
+    maxDiff = None
+
     def setUp(self):
         unittest.TestCase.setUp(self)
         self.output_capture = OutputCapture()
@@ -115,7 +122,7 @@
         unittest.TestCase.tearDown(self)
 
     def assertStdout(self, expected_stdout):
-        self.assertEquals(expected_stdout, self.__captured_stdout.getvalue())
+        self.assertEqual(expected_stdout, self.__captured_stdout.getvalue())
 
     def assertStderr(self, expected_stderr):
-        self.assertEquals(expected_stderr, self.__captured_stderr.getvalue())
+        self.assertEqual(expected_stderr, self.__captured_stderr.getvalue())
diff --git a/Tools/Scripts/webkitpy/common/system/outputcapture_unittest.py b/Tools/Scripts/webkitpy/common/system/outputcapture_unittest.py
index da4347c..7ef2e24 100644
--- a/Tools/Scripts/webkitpy/common/system/outputcapture_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/outputcapture_unittest.py
@@ -21,7 +21,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import logging
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 
@@ -43,7 +43,7 @@
         actual_stdout, actual_stderr, actual_logs = self.output.restore_output()
         self.assertEqual('', actual_stdout)
         self.assertEqual('', actual_stderr)
-        self.assertEqual(expected_logs, actual_logs)
+        self.assertMultiLineEqual(expected_logs, actual_logs)
 
     def test_initial_log_level(self):
         self.output.capture_output()
diff --git a/Tools/Scripts/webkitpy/common/system/deprecated_logging.py b/Tools/Scripts/webkitpy/common/system/outputtee.py
similarity index 88%
rename from Tools/Scripts/webkitpy/common/system/deprecated_logging.py
rename to Tools/Scripts/webkitpy/common/system/outputtee.py
index 1375354..12366e8 100644
--- a/Tools/Scripts/webkitpy/common/system/deprecated_logging.py
+++ b/Tools/Scripts/webkitpy/common/system/outputtee.py
@@ -1,10 +1,10 @@
 # Copyright (c) 2009, Google Inc. All rights reserved.
 # Copyright (c) 2009 Apple Inc. All rights reserved.
-# 
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -14,7 +14,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,26 +26,14 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# WebKit's Python module for logging
-# This module is now deprecated in favor of python's built-in logging.py.
 
 import codecs
 import os
 import sys
 
 
-def log(string):
-    print >> sys.stderr, string
-
-
-def error(string):
-    log("ERROR: %s" % string)
-    sys.exit(1)
-
-
 # Simple class to split output between multiple destinations
-class tee:
+class Tee:
     def __init__(self, *files):
         self.files = files
 
@@ -84,8 +72,8 @@
             self._original_stdout = sys.stdout
             self._original_stderr = sys.stderr
         if files and len(files):
-            sys.stdout = tee(self._original_stdout, *files)
-            sys.stderr = tee(self._original_stderr, *files)
+            sys.stdout = Tee(self._original_stdout, *files)
+            sys.stderr = Tee(self._original_stderr, *files)
         else:
             sys.stdout = self._original_stdout
             sys.stderr = self._original_stderr
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/Scripts/webkitpy/common/system/outputtee_unittest.py
similarity index 63%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/Scripts/webkitpy/common/system/outputtee_unittest.py
index f06f94e..8d06916 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/Scripts/webkitpy/common/system/outputtee_unittest.py
@@ -1,19 +1,19 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyright (C) 2012 Zan Dobersek <zandobersek@gmail.com>
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
-#     * Redistributions of source code must retain the above copyright
+#
+#    * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
+#    * Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
+#    * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,18 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+import StringIO
+import unittest2 as unittest
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+from webkitpy.common.system.outputtee import Tee, OutputTee
+
+
+class SimpleTeeTest(unittest.TestCase):
+    def test_simple_tee(self):
+        file1, file2 = StringIO.StringIO(), StringIO.StringIO()
+        tee = Tee(file1, file2)
+        tee.write("foo bar\n")
+        tee.write("baz\n")
+
+        self.assertEqual(file1.getvalue(), "foo bar\nbaz\n")
+        self.assertEqual(file2.getvalue(), file1.getvalue())
diff --git a/Tools/Scripts/webkitpy/common/system/path_unittest.py b/Tools/Scripts/webkitpy/common/system/path_unittest.py
index 954d32d..118546e 100644
--- a/Tools/Scripts/webkitpy/common/system/path_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/path_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 import sys
 
 from webkitpy.common.system.systemhost import SystemHost
@@ -41,28 +41,28 @@
     def test_abspath_to_uri_cygwin(self):
         if sys.platform != 'cygwin':
             return
-        self.assertEquals(path.abspath_to_uri(self.platforminfo(), '/cygdrive/c/foo/bar.html'),
+        self.assertEqual(path.abspath_to_uri(self.platforminfo(), '/cygdrive/c/foo/bar.html'),
                           'file:///C:/foo/bar.html')
 
     def test_abspath_to_uri_unixy(self):
-        self.assertEquals(path.abspath_to_uri(MockPlatformInfo(), "/foo/bar.html"),
+        self.assertEqual(path.abspath_to_uri(MockPlatformInfo(), "/foo/bar.html"),
                           'file:///foo/bar.html')
 
     def test_abspath_to_uri_win(self):
         if sys.platform != 'win32':
             return
-        self.assertEquals(path.abspath_to_uri(self.platforminfo(), 'c:\\foo\\bar.html'),
+        self.assertEqual(path.abspath_to_uri(self.platforminfo(), 'c:\\foo\\bar.html'),
                          'file:///c:/foo/bar.html')
 
     def test_abspath_to_uri_escaping_unixy(self):
-        self.assertEquals(path.abspath_to_uri(MockPlatformInfo(), '/foo/bar + baz%?.html'),
+        self.assertEqual(path.abspath_to_uri(MockPlatformInfo(), '/foo/bar + baz%?.html'),
                          'file:///foo/bar%20+%20baz%25%3F.html')
 
         # Note that you can't have '?' in a filename on windows.
     def test_abspath_to_uri_escaping_cygwin(self):
         if sys.platform != 'cygwin':
             return
-        self.assertEquals(path.abspath_to_uri(self.platforminfo(), '/cygdrive/c/foo/bar + baz%.html'),
+        self.assertEqual(path.abspath_to_uri(self.platforminfo(), '/cygdrive/c/foo/bar + baz%.html'),
                           'file:///C:/foo/bar%20+%20baz%25.html')
 
     def test_stop_cygpath_subprocess(self):
diff --git a/Tools/Scripts/webkitpy/common/system/platforminfo.py b/Tools/Scripts/webkitpy/common/system/platforminfo.py
index b2451f5..582e199 100644
--- a/Tools/Scripts/webkitpy/common/system/platforminfo.py
+++ b/Tools/Scripts/webkitpy/common/system/platforminfo.py
@@ -155,7 +155,7 @@
 
     def _win_version_tuple_from_cmd(self):
         # Note that this should only ever be called on windows, so this should always work.
-        ver_output = self._executive.run_command(['cmd', '/c', 'ver'])
+        ver_output = self._executive.run_command(['cmd', '/c', 'ver'], decode_output=False)
         match_object = re.search(r'(?P<major>\d)\.(?P<minor>\d)\.(?P<build>\d+)', ver_output)
         assert match_object, 'cmd returned an unexpected version string: ' + ver_output
         return tuple(map(int, match_object.groups()))
diff --git a/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py b/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py
index a2b4255..bdb0f86 100644
--- a/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py
@@ -28,7 +28,7 @@
 
 import platform
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive import Executive
 from webkitpy.common.system.executive_mock import MockExecutive, MockExecutive2
@@ -79,12 +79,12 @@
         self.assertNotEquals(info.os_version, '')
         self.assertNotEquals(info.display_name(), '')
         self.assertTrue(info.is_mac() or info.is_win() or info.is_linux() or info.is_freebsd())
-        self.assertNotEquals(info.terminal_width(), None)
+        self.assertIsNotNone(info.terminal_width())
 
         if info.is_mac():
             self.assertTrue(info.total_bytes_memory() > 0)
         else:
-            self.assertEquals(info.total_bytes_memory(), None)
+            self.assertIsNone(info.total_bytes_memory())
 
     def test_os_name_and_wrappers(self):
         info = self.make_info(fake_sys('linux2'))
@@ -100,28 +100,28 @@
         self.assertFalse(info.is_freebsd())
 
         info = self.make_info(fake_sys('darwin'), fake_platform('10.6.3'))
-        self.assertEquals(info.os_name, 'mac')
+        self.assertEqual(info.os_name, 'mac')
         self.assertFalse(info.is_linux())
         self.assertTrue(info.is_mac())
         self.assertFalse(info.is_win())
         self.assertFalse(info.is_freebsd())
 
         info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])))
-        self.assertEquals(info.os_name, 'win')
+        self.assertEqual(info.os_name, 'win')
         self.assertFalse(info.is_linux())
         self.assertFalse(info.is_mac())
         self.assertTrue(info.is_win())
         self.assertFalse(info.is_freebsd())
 
         info = self.make_info(fake_sys('cygwin'), executive=fake_executive('6.1.7600'))
-        self.assertEquals(info.os_name, 'win')
+        self.assertEqual(info.os_name, 'win')
         self.assertFalse(info.is_linux())
         self.assertFalse(info.is_mac())
         self.assertTrue(info.is_win())
         self.assertFalse(info.is_freebsd())
 
         info = self.make_info(fake_sys('freebsd8'))
-        self.assertEquals(info.os_name, 'freebsd')
+        self.assertEqual(info.os_name, 'freebsd')
         self.assertFalse(info.is_linux())
         self.assertFalse(info.is_mac())
         self.assertFalse(info.is_win())
@@ -131,28 +131,28 @@
 
     def test_os_version(self):
         self.assertRaises(AssertionError, self.make_info, fake_sys('darwin'), fake_platform('10.4.3'))
-        self.assertEquals(self.make_info(fake_sys('darwin'), fake_platform('10.5.1')).os_version, 'leopard')
-        self.assertEquals(self.make_info(fake_sys('darwin'), fake_platform('10.6.1')).os_version, 'snowleopard')
-        self.assertEquals(self.make_info(fake_sys('darwin'), fake_platform('10.7.1')).os_version, 'lion')
-        self.assertEquals(self.make_info(fake_sys('darwin'), fake_platform('10.8.1')).os_version, 'mountainlion')
-        self.assertEquals(self.make_info(fake_sys('darwin'), fake_platform('10.9.0')).os_version, 'future')
+        self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.5.1')).os_version, 'leopard')
+        self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.6.1')).os_version, 'snowleopard')
+        self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.7.1')).os_version, 'lion')
+        self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.8.1')).os_version, 'mountainlion')
+        self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.9.0')).os_version, 'future')
 
-        self.assertEquals(self.make_info(fake_sys('linux2')).os_version, 'lucid')
+        self.assertEqual(self.make_info(fake_sys('linux2')).os_version, 'lucid')
 
-        self.assertEquals(self.make_info(fake_sys('freebsd8'), fake_platform('', '8.3-PRERELEASE')).os_version, '8.3-PRERELEASE')
-        self.assertEquals(self.make_info(fake_sys('freebsd9'), fake_platform('', '9.0-RELEASE')).os_version, '9.0-RELEASE')
+        self.assertEqual(self.make_info(fake_sys('freebsd8'), fake_platform('', '8.3-PRERELEASE')).os_version, '8.3-PRERELEASE')
+        self.assertEqual(self.make_info(fake_sys('freebsd9'), fake_platform('', '9.0-RELEASE')).os_version, '9.0-RELEASE')
 
         self.assertRaises(AssertionError, self.make_info, fake_sys('win32', tuple([5, 0, 1234])))
-        self.assertEquals(self.make_info(fake_sys('win32', tuple([6, 2, 1234]))).os_version, 'future')
-        self.assertEquals(self.make_info(fake_sys('win32', tuple([6, 1, 7600]))).os_version, '7sp0')
-        self.assertEquals(self.make_info(fake_sys('win32', tuple([6, 0, 1234]))).os_version, 'vista')
-        self.assertEquals(self.make_info(fake_sys('win32', tuple([5, 1, 1234]))).os_version, 'xp')
+        self.assertEqual(self.make_info(fake_sys('win32', tuple([6, 2, 1234]))).os_version, 'future')
+        self.assertEqual(self.make_info(fake_sys('win32', tuple([6, 1, 7600]))).os_version, '7sp0')
+        self.assertEqual(self.make_info(fake_sys('win32', tuple([6, 0, 1234]))).os_version, 'vista')
+        self.assertEqual(self.make_info(fake_sys('win32', tuple([5, 1, 1234]))).os_version, 'xp')
 
         self.assertRaises(AssertionError, self.make_info, fake_sys('win32'), executive=fake_executive('5.0.1234'))
-        self.assertEquals(self.make_info(fake_sys('cygwin'), executive=fake_executive('6.2.1234')).os_version, 'future')
-        self.assertEquals(self.make_info(fake_sys('cygwin'), executive=fake_executive('6.1.7600')).os_version, '7sp0')
-        self.assertEquals(self.make_info(fake_sys('cygwin'), executive=fake_executive('6.0.1234')).os_version, 'vista')
-        self.assertEquals(self.make_info(fake_sys('cygwin'), executive=fake_executive('5.1.1234')).os_version, 'xp')
+        self.assertEqual(self.make_info(fake_sys('cygwin'), executive=fake_executive('6.2.1234')).os_version, 'future')
+        self.assertEqual(self.make_info(fake_sys('cygwin'), executive=fake_executive('6.1.7600')).os_version, '7sp0')
+        self.assertEqual(self.make_info(fake_sys('cygwin'), executive=fake_executive('6.0.1234')).os_version, 'vista')
+        self.assertEqual(self.make_info(fake_sys('cygwin'), executive=fake_executive('5.1.1234')).os_version, 'xp')
 
     def test_display_name(self):
         info = self.make_info(fake_sys('darwin'))
@@ -169,17 +169,13 @@
 
     def test_total_bytes_memory(self):
         info = self.make_info(fake_sys('darwin'), fake_platform('10.6.3'), fake_executive('1234'))
-        self.assertEquals(info.total_bytes_memory(), 1234)
+        self.assertEqual(info.total_bytes_memory(), 1234)
 
         info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])))
-        self.assertEquals(info.total_bytes_memory(), None)
+        self.assertIsNone(info.total_bytes_memory())
 
         info = self.make_info(fake_sys('linux2'))
-        self.assertEquals(info.total_bytes_memory(), None)
+        self.assertIsNone(info.total_bytes_memory())
 
         info = self.make_info(fake_sys('freebsd9'))
-        self.assertEquals(info.total_bytes_memory(), None)
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertIsNone(info.total_bytes_memory())
diff --git a/Tools/Scripts/webkitpy/common/system/profiler.py b/Tools/Scripts/webkitpy/common/system/profiler.py
new file mode 100644
index 0000000..0208cf8
--- /dev/null
+++ b/Tools/Scripts/webkitpy/common/system/profiler.py
@@ -0,0 +1,210 @@
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the Google name nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+import re
+import itertools
+
+_log = logging.getLogger(__name__)
+
+
+class ProfilerFactory(object):
+    @classmethod
+    def create_profiler(cls, host, executable_path, output_dir, profiler_name=None, identifier=None):
+        profilers = cls.profilers_for_platform(host.platform)
+        if not profilers:
+            return None
+        profiler_name = profiler_name or cls.default_profiler_name(host.platform)
+        profiler_class = next(itertools.ifilter(lambda profiler: profiler.name == profiler_name, profilers), None)
+        if not profiler_class:
+            return None
+        return profilers[0](host, executable_path, output_dir, identifier)
+
+    @classmethod
+    def default_profiler_name(cls, platform):
+        profilers = cls.profilers_for_platform(platform)
+        return profilers[0].name if profilers else None
+
+    @classmethod
+    def profilers_for_platform(cls, platform):
+        # GooglePProf requires TCMalloc/google-perftools, but is available everywhere.
+        profilers_by_os_name = {
+            'mac': [IProfiler, Sample, GooglePProf],
+            'linux': [Perf, GooglePProf],
+            # Note: freebsd, win32 have no profilers defined yet, thus --profile will be ignored
+            # by default, but a profiler can be selected with --profiler=PROFILER explicitly.
+        }
+        return profilers_by_os_name.get(platform.os_name, [])
+
+
+class Profiler(object):
+    # Used by ProfilerFactory to lookup a profiler from the --profiler=NAME option.
+    name = None
+
+    def __init__(self, host, executable_path, output_dir, identifier=None):
+        self._host = host
+        self._executable_path = executable_path
+        self._output_dir = output_dir
+        self._identifier = "test"
+        self._host.filesystem.maybe_make_directory(self._output_dir)
+
+    def adjusted_environment(self, env):
+        return env
+
+    def attach_to_pid(self, pid):
+        pass
+
+    def profile_after_exit(self):
+        pass
+
+
+class SingleFileOutputProfiler(Profiler):
+    def __init__(self, host, executable_path, output_dir, output_suffix, identifier=None):
+        super(SingleFileOutputProfiler, self).__init__(host, executable_path, output_dir, identifier)
+        # FIXME: Currently all reports are kept as test.*, until we fix that, search up to 1000 names before giving up.
+        self._output_path = self._host.workspace.find_unused_filename(self._output_dir, self._identifier, output_suffix, search_limit=1000)
+        assert(self._output_path)
+
+
+class GooglePProf(SingleFileOutputProfiler):
+    name = 'pprof'
+
+    def __init__(self, host, executable_path, output_dir, identifier=None):
+        super(GooglePProf, self).__init__(host, executable_path, output_dir, "pprof", identifier)
+
+    def adjusted_environment(self, env):
+        env['CPUPROFILE'] = self._output_path
+        return env
+
+    def _first_ten_lines_of_profile(self, pprof_output):
+        match = re.search("^Total:[^\n]*\n((?:[^\n]*\n){0,10})", pprof_output, re.MULTILINE)
+        return match.group(1) if match else None
+
+    def _pprof_path(self):
+        # FIXME: We should have code to find the right google-pprof executable, some Googlers have
+        # google-pprof installed as "pprof" on their machines for them.
+        return '/usr/bin/google-pprof'
+
+    def profile_after_exit(self):
+        # google-pprof doesn't check its arguments, so we have to.
+        if not (self._host.filesystem.exists(self._output_path)):
+            print "Failed to gather profile, %s does not exist." % self._output_path
+            return
+
+        pprof_args = [self._pprof_path(), '--text', self._executable_path, self._output_path]
+        profile_text = self._host.executive.run_command(pprof_args)
+        print "First 10 lines of pprof --text:"
+        print self._first_ten_lines_of_profile(profile_text)
+        print "http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html documents output."
+        print
+        print "To interact with the the full profile, including produce graphs:"
+        print ' '.join([self._pprof_path(), self._executable_path, self._output_path])
+
+
+class Perf(SingleFileOutputProfiler):
+    name = 'perf'
+
+    def __init__(self, host, executable_path, output_dir, identifier=None):
+        super(Perf, self).__init__(host, executable_path, output_dir, "data", identifier)
+        self._perf_process = None
+        self._pid_being_profiled = None
+
+    def _perf_path(self):
+        # FIXME: We may need to support finding the perf binary in other locations.
+        return 'perf'
+
+    def attach_to_pid(self, pid):
+        assert(not self._perf_process and not self._pid_being_profiled)
+        self._pid_being_profiled = pid
+        cmd = [self._perf_path(), "record", "--call-graph", "--pid", pid, "--output", self._output_path]
+        self._perf_process = self._host.executive.popen(cmd)
+
+    def _first_ten_lines_of_profile(self, perf_output):
+        match = re.search("^#[^\n]*\n((?: [^\n]*\n){1,10})", perf_output, re.MULTILINE)
+        return match.group(1) if match else None
+
+    def profile_after_exit(self):
+        # Perf doesn't automatically watch the attached pid for death notifications,
+        # so we have to do it for it, and then tell it its time to stop sampling. :(
+        self._host.executive.wait_limited(self._pid_being_profiled, limit_in_seconds=10)
+        perf_exitcode = self._perf_process.poll()
+        if perf_exitcode is None:  # This should always be the case, unless perf error'd out early.
+            self._host.executive.interrupt(self._perf_process.pid)
+
+        perf_exitcode = self._perf_process.wait()
+        if perf_exitcode not in (0, -2):  # The exit code should always be -2, as we're always interrupting perf.
+            print "'perf record' failed (exit code: %i), can't process results:" % perf_exitcode
+            return
+
+        perf_args = [self._perf_path(), 'report', '--call-graph', 'none', '--input', self._output_path]
+        print "First 10 lines of 'perf report --call-graph=none':"
+
+        print " ".join(perf_args)
+        perf_output = self._host.executive.run_command(perf_args)
+        print self._first_ten_lines_of_profile(perf_output)
+
+        print "To view the full profile, run:"
+        print ' '.join([self._perf_path(), 'report', '-i', self._output_path])
+        print  # An extra line between tests looks nicer.
+
+
+class Sample(SingleFileOutputProfiler):
+    name = 'sample'
+
+    def __init__(self, host, executable_path, output_dir, identifier=None):
+        super(Sample, self).__init__(host, executable_path, output_dir, "txt", identifier)
+        self._profiler_process = None
+
+    def attach_to_pid(self, pid):
+        cmd = ["sample", pid, "-mayDie", "-file", self._output_path]
+        self._profiler_process = self._host.executive.popen(cmd)
+
+    def profile_after_exit(self):
+        self._profiler_process.wait()
+
+
+class IProfiler(SingleFileOutputProfiler):
+    name = 'iprofiler'
+
+    def __init__(self, host, executable_path, output_dir, identifier=None):
+        super(IProfiler, self).__init__(host, executable_path, output_dir, "dtps", identifier)
+        self._profiler_process = None
+
+    def attach_to_pid(self, pid):
+        # FIXME: iprofiler requires us to pass the directory separately
+        # from the basename of the file, with no control over the extension.
+        fs = self._host.filesystem
+        cmd = ["iprofiler", "-timeprofiler", "-a", pid,
+                "-d", fs.dirname(self._output_path), "-o", fs.splitext(fs.basename(self._output_path))[0]]
+        # FIXME: Consider capturing instead of letting instruments spam to stderr directly.
+        self._profiler_process = self._host.executive.popen(cmd)
+
+    def profile_after_exit(self):
+        # It seems like a nicer user experiance to wait on the profiler to exit to prevent
+        # it from spewing to stderr at odd times.
+        self._profiler_process.wait()
diff --git a/Tools/Scripts/webkitpy/common/system/profiler_unittest.py b/Tools/Scripts/webkitpy/common/system/profiler_unittest.py
new file mode 100644
index 0000000..22bc2df
--- /dev/null
+++ b/Tools/Scripts/webkitpy/common/system/profiler_unittest.py
@@ -0,0 +1,103 @@
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest2 as unittest
+
+from webkitpy.common.system.platforminfo_mock import MockPlatformInfo
+from webkitpy.common.system.systemhost_mock import MockSystemHost
+
+from .profiler import ProfilerFactory, GooglePProf
+
+
+class ProfilerFactoryTest(unittest.TestCase):
+    def _assert_default_profiler_name(self, os_name, expected_profiler_name):
+        profiler_name = ProfilerFactory.default_profiler_name(MockPlatformInfo(os_name))
+        self.assertEqual(profiler_name, expected_profiler_name)
+
+    def test_default_profilers(self):
+        self._assert_default_profiler_name('mac', 'iprofiler')
+        self._assert_default_profiler_name('linux', 'perf')
+        self._assert_default_profiler_name('win32', None)
+        self._assert_default_profiler_name('freebsd', None)
+
+    def test_default_profiler_output(self):
+        host = MockSystemHost()
+        self.assertFalse(host.filesystem.exists("/tmp/output"))
+
+        # Default mocks are Mac, so iprofile should be default.
+        profiler = ProfilerFactory.create_profiler(host, '/bin/executable', '/tmp/output')
+        self.assertTrue(host.filesystem.exists("/tmp/output"))
+        self.assertEqual(profiler._output_path, "/tmp/output/test.dtps")
+
+        # Linux defaults to perf.
+        host.platform.os_name = 'linux'
+        profiler = ProfilerFactory.create_profiler(host, '/bin/executable', '/tmp/output')
+        self.assertEqual(profiler._output_path, "/tmp/output/test.data")
+
+
+class GooglePProfTest(unittest.TestCase):
+    def test_pprof_output_regexp(self):
+        pprof_output = """
+sometimes
+there
+is
+junk before the total line
+
+
+Total: 3770 samples
+      76   2.0%   2.0%      104   2.8% lookup (inline)
+      60   1.6%   3.6%       60   1.6% FL_SetPrevious (inline)
+      56   1.5%   5.1%       56   1.5% MaskPtr (inline)
+      51   1.4%   6.4%      222   5.9% WebCore::HTMLTokenizer::nextToken
+      42   1.1%   7.6%       47   1.2% WTF::Vector::shrinkCapacity
+      35   0.9%   8.5%       35   0.9% WTF::RefPtr::get (inline)
+      33   0.9%   9.4%       43   1.1% append (inline)
+      29   0.8%  10.1%       67   1.8% WTF::StringImpl::deref (inline)
+      29   0.8%  10.9%      100   2.7% add (inline)
+      28   0.7%  11.6%       28   0.7% WebCore::QualifiedName::localName (inline)
+      25   0.7%  12.3%       27   0.7% WebCore::Private::addChildNodesToDeletionQueue
+      24   0.6%  12.9%       24   0.6% __memcpy_ssse3_back
+      23   0.6%  13.6%       23   0.6% intHash (inline)
+      23   0.6%  14.2%       76   2.0% tcmalloc::FL_Next
+      23   0.6%  14.8%       95   2.5% tcmalloc::FL_Push
+      22   0.6%  15.4%       22   0.6% WebCore::MarkupTokenizerBase::InputStreamPreprocessor::peek (inline)
+"""
+        expected_first_ten_lines = """      76   2.0%   2.0%      104   2.8% lookup (inline)
+      60   1.6%   3.6%       60   1.6% FL_SetPrevious (inline)
+      56   1.5%   5.1%       56   1.5% MaskPtr (inline)
+      51   1.4%   6.4%      222   5.9% WebCore::HTMLTokenizer::nextToken
+      42   1.1%   7.6%       47   1.2% WTF::Vector::shrinkCapacity
+      35   0.9%   8.5%       35   0.9% WTF::RefPtr::get (inline)
+      33   0.9%   9.4%       43   1.1% append (inline)
+      29   0.8%  10.1%       67   1.8% WTF::StringImpl::deref (inline)
+      29   0.8%  10.9%      100   2.7% add (inline)
+      28   0.7%  11.6%       28   0.7% WebCore::QualifiedName::localName (inline)
+"""
+        host = MockSystemHost()
+        profiler = GooglePProf(host, '/bin/executable', '/tmp/output')
+        self.assertEqual(profiler._first_ten_lines_of_profile(pprof_output), expected_first_ten_lines)
diff --git a/Tools/Scripts/webkitpy/common/system/stack_utils_unittest.py b/Tools/Scripts/webkitpy/common/system/stack_utils_unittest.py
index 625acf2..3050adc 100644
--- a/Tools/Scripts/webkitpy/common/system/stack_utils_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/stack_utils_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system import outputcapture
 from webkitpy.common.system import stack_utils
@@ -42,11 +42,11 @@
     def test_find_thread_stack_found(self):
         thread_id = current_thread_id()
         found_stack = stack_utils._find_thread_stack(thread_id)
-        self.assertNotEqual(found_stack, None)
+        self.assertIsNotNone(found_stack)
 
     def test_find_thread_stack_not_found(self):
         found_stack = stack_utils._find_thread_stack(0)
-        self.assertEqual(found_stack, None)
+        self.assertIsNone(found_stack)
 
     def test_log_thread_state(self):
         msgs = []
diff --git a/Tools/Scripts/webkitpy/common/system/user_mock.py b/Tools/Scripts/webkitpy/common/system/user_mock.py
index 16f79a0..d17ea9a 100644
--- a/Tools/Scripts/webkitpy/common/system/user_mock.py
+++ b/Tools/Scripts/webkitpy/common/system/user_mock.py
@@ -26,7 +26,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.common.system.deprecated_logging import log
+import logging
+
+_log = logging.getLogger(__name__)
 
 
 class MockUser(object):
@@ -52,7 +54,7 @@
         pass
 
     def confirm(self, message=None, default='y'):
-        log(message)
+        _log.info(message)
         return default == 'y'
 
     def can_open_url(self):
@@ -61,6 +63,6 @@
     def open_url(self, url):
         self.opened_urls.append(url)
         if url.startswith("file://"):
-            log("MOCK: user.open_url: file://...")
+            _log.info("MOCK: user.open_url: file://...")
             return
-        log("MOCK: user.open_url: %s" % url)
+        _log.info("MOCK: user.open_url: %s" % url)
diff --git a/Tools/Scripts/webkitpy/common/system/user_unittest.py b/Tools/Scripts/webkitpy/common/system/user_unittest.py
index 86b9db7..49810b2 100644
--- a/Tools/Scripts/webkitpy/common/system/user_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/user_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.system.user import User
@@ -120,12 +120,12 @@
             expected, inputs = test_case
 
             def mock_raw_input(message):
-                self.assertEquals(expected[0], message)
+                self.assertEqual(expected[0], message)
                 return inputs[1]
 
             result = User().confirm(default=inputs[0],
                                     raw_input=mock_raw_input)
-            self.assertEquals(expected[1], result)
+            self.assertEqual(expected[1], result)
 
     def test_warn_if_application_is_xcode(self):
         output = OutputCapture()
diff --git a/Tools/Scripts/webkitpy/common/system/workspace.py b/Tools/Scripts/webkitpy/common/system/workspace.py
index 6868376..1d92aca 100644
--- a/Tools/Scripts/webkitpy/common/system/workspace.py
+++ b/Tools/Scripts/webkitpy/common/system/workspace.py
@@ -67,7 +67,7 @@
         try:
             self._executive.run_command(['zip', '-9', '-r', zip_path, '.'], cwd=source_path)
         except ScriptError, e:
-            _log.error("Workspace.create_zip failed:\n%s" % e.message_with_output())
+            _log.error("Workspace.create_zip failed in %s:\n%s" % (source_path, e.message_with_output()))
             return None
 
         return zip_class(zip_path)
diff --git a/Tools/Scripts/webkitpy/common/system/workspace_mock.py b/Tools/Scripts/webkitpy/common/system/workspace_mock.py
index 005f86c..02a5f4c 100644
--- a/Tools/Scripts/webkitpy/common/system/workspace_mock.py
+++ b/Tools/Scripts/webkitpy/common/system/workspace_mock.py
@@ -32,4 +32,6 @@
         return "%s/%s.%s" % (directory, name, extension)
 
     def create_zip(self, zip_path, source_path):
+        self.zip_path = zip_path
+        self.source_path = source_path
         return object()  # Something that is not None
diff --git a/Tools/Scripts/webkitpy/common/system/workspace_unittest.py b/Tools/Scripts/webkitpy/common/system/workspace_unittest.py
index 49094ac..8262f6c 100644
--- a/Tools/Scripts/webkitpy/common/system/workspace_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/workspace_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -50,18 +50,23 @@
 
     def test_create_zip(self):
         workspace = Workspace(None, MockExecutive(should_log=True))
-        expected_stderr = "MOCK run_command: ['zip', '-9', '-r', '/zip/path', '.'], cwd=/source/path\n"
+        expected_logs = "MOCK run_command: ['zip', '-9', '-r', '/zip/path', '.'], cwd=/source/path\n"
         class MockZipFile(object):
             def __init__(self, path):
                 self.filename = path
-        archive = OutputCapture().assert_outputs(self, workspace.create_zip, ["/zip/path", "/source/path", MockZipFile], expected_stderr=expected_stderr)
+        archive = OutputCapture().assert_outputs(self, workspace.create_zip, ["/zip/path", "/source/path", MockZipFile], expected_logs=expected_logs)
         self.assertEqual(archive.filename, "/zip/path")
 
     def test_create_zip_exception(self):
         workspace = Workspace(None, MockExecutive(should_log=True, should_throw=True))
-        expected_stderr = "MOCK run_command: ['zip', '-9', '-r', '/zip/path', '.'], cwd=/source/path\n"
+        expected_logs = """MOCK run_command: ['zip', '-9', '-r', '/zip/path', '.'], cwd=/source/path
+Workspace.create_zip failed in /source/path:
+MOCK ScriptError
+
+MOCK output of child process
+"""
         class MockZipFile(object):
             def __init__(self, path):
                 self.filename = path
-        archive = OutputCapture().assert_outputs(self, workspace.create_zip, ["/zip/path", "/source/path", MockZipFile], expected_stderr=expected_stderr)
-        self.assertEqual(archive, None)
+        archive = OutputCapture().assert_outputs(self, workspace.create_zip, ["/zip/path", "/source/path", MockZipFile], expected_logs=expected_logs)
+        self.assertIsNone(archive)
diff --git a/Tools/Scripts/webkitpy/common/system/zipfileset_unittest.py b/Tools/Scripts/webkitpy/common/system/zipfileset_unittest.py
index 16a74cb..1a0603c 100644
--- a/Tools/Scripts/webkitpy/common/system/zipfileset_unittest.py
+++ b/Tools/Scripts/webkitpy/common/system/zipfileset_unittest.py
@@ -23,7 +23,7 @@
 
 import shutil
 import tempfile
-import unittest
+import unittest2 as unittest
 import zipfile
 
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -67,15 +67,15 @@
 
     def test_open(self):
         file = self._zip.open('a/b/some-other-file')
-        self.assertEquals('a/b/some-other-file', file.name())
-        self.assertEquals('other contents', file.contents())
+        self.assertEqual('a/b/some-other-file', file.name())
+        self.assertEqual('other contents', file.contents())
 
     def test_close(self):
         zipfileset = ZipFileSet('blah', self._filesystem, self.make_fake_zip)
         zipfileset.close()
 
     def test_read(self):
-        self.assertEquals('contents', self._zip.read('some-file'))
+        self.assertEqual('contents', self._zip.read('some-file'))
 
     def test_extract(self):
         self._filesystem.maybe_make_directory('/some-dir')
@@ -92,7 +92,3 @@
 
     def test_namelist(self):
         self.assertTrue('some-file' in self._zip.namelist())
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/common/thread/messagepump_unittest.py b/Tools/Scripts/webkitpy/common/thread/messagepump_unittest.py
index f731db2..1a46772 100644
--- a/Tools/Scripts/webkitpy/common/thread/messagepump_unittest.py
+++ b/Tools/Scripts/webkitpy/common/thread/messagepump_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.thread.messagepump import MessagePump, MessagePumpDelegate
 from webkitpy.common.thread.threadedmessagequeue import ThreadedMessageQueue
diff --git a/Tools/Scripts/webkitpy/common/thread/threadedmessagequeue_unittest.py b/Tools/Scripts/webkitpy/common/thread/threadedmessagequeue_unittest.py
index cb67c1e..dbb8a2e 100644
--- a/Tools/Scripts/webkitpy/common/thread/threadedmessagequeue_unittest.py
+++ b/Tools/Scripts/webkitpy/common/thread/threadedmessagequeue_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.thread.threadedmessagequeue import ThreadedMessageQueue
 
diff --git a/Tools/Scripts/webkitpy/common/version_check.py b/Tools/Scripts/webkitpy/common/version_check.py
index 6acc9b4..c050544 100644
--- a/Tools/Scripts/webkitpy/common/version_check.py
+++ b/Tools/Scripts/webkitpy/common/version_check.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/common/watchlist/amountchangedpattern_unittest.py b/Tools/Scripts/webkitpy/common/watchlist/amountchangedpattern_unittest.py
index 7ae45fa..b222d3a 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/amountchangedpattern_unittest.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/amountchangedpattern_unittest.py
@@ -31,7 +31,7 @@
 
 
 import re
-import unittest
+import unittest2 as unittest
 
 
 from webkitpy.common.watchlist.amountchangedpattern import AmountChangedPattern
diff --git a/Tools/Scripts/webkitpy/common/watchlist/changedlinepattern_unittest.py b/Tools/Scripts/webkitpy/common/watchlist/changedlinepattern_unittest.py
index 1f2aeda..2f5fd68 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/changedlinepattern_unittest.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/changedlinepattern_unittest.py
@@ -29,7 +29,7 @@
 '''Unit tests for changedlinepattern.py.'''
 
 import re
-import unittest
+import unittest2 as unittest
 
 
 from webkitpy.common.watchlist.changedlinepattern import ChangedLinePattern
diff --git a/Tools/Scripts/webkitpy/common/watchlist/filenamepattern_unittest.py b/Tools/Scripts/webkitpy/common/watchlist/filenamepattern_unittest.py
index 0afdf30..2b51dd6 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/filenamepattern_unittest.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/filenamepattern_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import re
-import unittest
+import unittest2 as unittest
 
 
 from webkitpy.common.watchlist.filenamepattern import FilenamePattern
diff --git a/Tools/Scripts/webkitpy/common/watchlist/watchlist_mock.py b/Tools/Scripts/webkitpy/common/watchlist/watchlist_mock.py
index 2fd2f88..cbbf071 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/watchlist_mock.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/watchlist_mock.py
@@ -26,10 +26,12 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.common.system.deprecated_logging import log
+import logging
+
+_log = logging.getLogger(__name__)
 
 
 class MockWatchList(object):
     def determine_cc_and_messages(self, diff):
-        log("MockWatchList: determine_cc_and_messages")
+        _log.info("MockWatchList: determine_cc_and_messages")
         return {'cc_list': ['abarth@webkit.org', 'eric@webkit.org', 'levin@chromium.org'], 'messages': ['Message1.', 'Message2.'], }
diff --git a/Tools/Scripts/webkitpy/common/watchlist/watchlist_unittest.py b/Tools/Scripts/webkitpy/common/watchlist/watchlist_unittest.py
index 09010b2..dd7b083 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/watchlist_unittest.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/watchlist_unittest.py
@@ -28,7 +28,7 @@
 
 '''Unit tests for watchlist.py.'''
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.checkout.diff_test_data import DIFF_TEST_DATA
 from webkitpy.common.watchlist.watchlistparser import WatchListParser
@@ -52,7 +52,7 @@
             '        ],'
            '    },'
             '}')
-        self.assertEquals(set([]), watch_list.find_matching_definitions(DIFF_TEST_DATA))
+        self.assertEqual(set([]), watch_list.find_matching_definitions(DIFF_TEST_DATA))
 
     def test_filename_definition(self):
         watch_list = self._watch_list_parser.parse(
@@ -68,7 +68,7 @@
             '        ],'
            '    },'
             '}')
-        self.assertEquals(set(['WatchList1']), watch_list.find_matching_definitions(DIFF_TEST_DATA))
+        self.assertEqual(set(['WatchList1']), watch_list.find_matching_definitions(DIFF_TEST_DATA))
 
     def test_cc_rules_simple(self):
         watch_list = self._watch_list_parser.parse(
@@ -85,7 +85,7 @@
            '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': ['levin@chromium.org'],
                 'messages': [],
                 }, cc_and_messages)
@@ -109,7 +109,7 @@
             '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': ['levin@chromium.org'],
                 'messages': [],
                 }, cc_and_messages)
@@ -136,7 +136,7 @@
             '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': ['levin@chromium.org'],
                 'messages': ['msg1', 'msg2'],
                 }, cc_and_messages)
@@ -163,7 +163,7 @@
             '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': [],
                 'messages': [],
                 }, cc_and_messages)
@@ -185,7 +185,7 @@
             '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': ['eric@webkit.org'],
                 'messages': [],
                 }, cc_and_messages)
@@ -207,7 +207,7 @@
             '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': ['abarth@webkit.org'],
                 'messages': [],
                 }, cc_and_messages)
@@ -236,7 +236,7 @@
             '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': ['levin@chromium.org'],
                 'messages': ["Test message."],
                 }, cc_and_messages)
@@ -271,7 +271,7 @@
             '    },'
             '}')
         cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
-        self.assertEquals({
+        self.assertEqual({
                 'cc_list': ['eric@webkit.org'],
                 'messages': ["This is a test message."],
                 }, cc_and_messages)
diff --git a/Tools/Scripts/webkitpy/common/watchlist/watchlistparser.py b/Tools/Scripts/webkitpy/common/watchlist/watchlistparser.py
index c72eab3..bc00c54 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/watchlistparser.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/watchlistparser.py
@@ -152,7 +152,7 @@
             # modifying a list while iterating through it leads to undefined behavior.
             intructions_copy = cc_rule.instructions()[:]
             for email in intructions_copy:
-                if not accounts.account_by_login(email):
+                if not accounts.account_by_email(email):
                     cc_rule.remove_instruction(email)
                     self._log_error("The email alias %s which is in the watchlist is not listed as a contributor in committers.py" % email)
                     continue
diff --git a/Tools/Scripts/webkitpy/common/watchlist/watchlistparser_unittest.py b/Tools/Scripts/webkitpy/common/watchlist/watchlistparser_unittest.py
index 3bd4dc2..d06a72d 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/watchlistparser_unittest.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/watchlistparser_unittest.py
@@ -185,6 +185,23 @@
                                        expected_logs='The email alias levin+bad+email@chromium.org which is'
                                        + ' in the watchlist is not listed as a contributor in committers.py\n')
 
+    def test_cc_rule_with_secondary_email(self):
+        # FIXME: We should provide a mock of CommitterList so that we can test this on fake data.
+        watch_list = (
+            '{'
+            '    "DEFINITIONS": {'
+            '        "WatchList1": {'
+            '            "filename": r".*\\MyFileName\\.cpp",'
+            '        },'
+            '     },'
+            '    "CC_RULES": {'
+            '        "WatchList1": ["ojan.autocc@gmail.com"],'
+            '     },'
+            '}')
+
+        OutputCapture().assert_outputs(self, self._watch_list_parser.parse, args=[watch_list],
+                                       expected_logs='')
+
     def test_empty_message_rule(self):
         watch_list = (
             '{'
diff --git a/Tools/Scripts/webkitpy/common/watchlist/watchlistrule_unittest.py b/Tools/Scripts/webkitpy/common/watchlist/watchlistrule_unittest.py
index 92aaf34..d926887 100644
--- a/Tools/Scripts/webkitpy/common/watchlist/watchlistrule_unittest.py
+++ b/Tools/Scripts/webkitpy/common/watchlist/watchlistrule_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-import unittest
+import unittest2 as unittest
 from webkitpy.common.watchlist.watchlistrule import WatchListRule
 
 
diff --git a/Tools/Scripts/webkitpy/common/webkit_finder.py b/Tools/Scripts/webkitpy/common/webkit_finder.py
new file mode 100644
index 0000000..7b9c014
--- /dev/null
+++ b/Tools/Scripts/webkitpy/common/webkit_finder.py
@@ -0,0 +1,65 @@
+# Copyright (c) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+class WebKitFinder(object):
+    def __init__(self, filesystem):
+        self._filesystem = filesystem
+        self._webkit_base = None
+
+    def webkit_base(self):
+        """Returns the absolute path to the top of the WebKit tree.
+
+        Raises an AssertionError if the top dir can't be determined."""
+        # Note: This code somewhat duplicates the code in
+        # scm.find_checkout_root(). However, that code only works if the top
+        # of the SCM repository also matches the top of the WebKit tree. Some SVN users
+        # (the chromium test bots, for example), might only check out subdirectories like
+        # Tools/Scripts. This code will also work if there is no SCM system at all.
+        if not self._webkit_base:
+            self._webkit_base = self._webkit_base
+            module_path = self._filesystem.path_to_module(self.__module__)
+            tools_index = module_path.rfind('Tools')
+            assert tools_index != -1, "could not find location of this checkout from %s" % module_path
+            self._webkit_base = self._filesystem.normpath(module_path[0:tools_index - 1])
+        return self._webkit_base
+
+    def path_from_webkit_base(self, *comps):
+        return self._filesystem.join(self.webkit_base(), *comps)
+
+    def path_to_script(self, script_name):
+        """Returns the relative path to the script from the top of the WebKit tree."""
+        # This is intentionally relative in order to force callers to consider what
+        # their current working directory is (and change to the top of the tree if necessary).
+        return self._filesystem.join("Tools", "Scripts", script_name)
+
+    def layout_tests_dir(self):
+        return self.path_from_webkit_base('LayoutTests')
+
+    def perf_tests_dir(self):
+        return self.path_from_webkit_base('PerformanceTests')
diff --git a/Tools/Scripts/webkitpy/common/webkitunittest.py b/Tools/Scripts/webkitpy/common/webkitunittest.py
index 7b650a1..dd61523 100644
--- a/Tools/Scripts/webkitpy/common/webkitunittest.py
+++ b/Tools/Scripts/webkitpy/common/webkitunittest.py
@@ -29,7 +29,7 @@
 '''Basic unit test functionality.'''
 
 import re
-import unittest
+import unittest2 as unittest
 
 
 class TestCase(unittest.TestCase):
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_finder.py b/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_finder.py
index 6447c8f..429aedd 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_finder.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_finder.py
@@ -47,7 +47,6 @@
         paths = self._strip_test_dir_prefixes(args)
         if options.test_list:
             paths += self._strip_test_dir_prefixes(self._read_test_names_from_file(options.test_list, self._port.TEST_PATH_SEPARATOR))
-        paths = set(paths)
         test_files = self._port.tests(paths)
         return (paths, test_files)
 
@@ -108,7 +107,7 @@
             tests_to_skip = set()
         elif self._options.skipped != 'always':
             # make sure we're explicitly running any tests passed on the command line; equivalent to 'default'.
-            tests_to_skip -= paths
+            tests_to_skip -= set(paths)
 
         # unless of course we don't want to run the HTTP tests :)
         if not self._options.http:
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py b/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py
index 17cbe31..6ee6655 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py
@@ -28,12 +28,12 @@
 
 import logging
 import math
-import re
 import threading
 import time
 
 from webkitpy.common import message_pool
 from webkitpy.layout_tests.controllers import single_test_runner
+from webkitpy.layout_tests.models.test_run_results import TestRunResults
 from webkitpy.layout_tests.models import test_expectations
 from webkitpy.layout_tests.models import test_failures
 from webkitpy.layout_tests.models import test_results
@@ -61,57 +61,47 @@
 
 
 class LayoutTestRunner(object):
-    def __init__(self, options, port, printer, results_directory, expectations, test_is_slow_fn):
+    def __init__(self, options, port, printer, results_directory, test_is_slow_fn):
         self._options = options
         self._port = port
         self._printer = printer
         self._results_directory = results_directory
-        self._expectations = None
         self._test_is_slow = test_is_slow_fn
-        self._sharder = Sharder(self._port.split_test, self._port.TEST_PATH_SEPARATOR, self._options.max_locked_shards)
+        self._sharder = Sharder(self._port.split_test, self._options.max_locked_shards)
+        self._filesystem = self._port.host.filesystem
 
-        self._current_result_summary = None
+        self._expectations = None
+        self._test_inputs = []
         self._needs_http = None
         self._needs_websockets = None
         self._retrying = False
-        self._test_files_list = []
-        self._all_results = []
-        self._group_stats = {}
-        self._worker_stats = {}
-        self._filesystem = self._port.host.filesystem
 
-    def test_key(self, test_name):
-        return self._sharder.test_key(test_name)
+        self._current_run_results = None
+        self._remaining_locked_shards = []
+        self._has_http_lock = False
 
-    def run_tests(self, test_inputs, expectations, result_summary, num_workers, needs_http, needs_websockets, retrying):
-        """Returns a tuple of (interrupted, keyboard_interrupted, thread_timings, test_timings, individual_test_timings):
-            interrupted is whether the run was interrupted
-            keyboard_interrupted is whether the interruption was because someone typed Ctrl^C
-            thread_timings is a list of dicts with the total runtime
-                of each thread with 'name', 'num_tests', 'total_time' properties
-            test_timings is a list of timings for each sharded subdirectory
-                of the form [time, directory_name, num_tests]
-            individual_test_timings is a list of run times for each test
-                in the form {filename:filename, test_run_time:test_run_time}
-            result_summary: summary object to populate with the results
-        """
-        self._current_result_summary = result_summary
+    def run_tests(self, expectations, test_inputs, tests_to_skip, num_workers, needs_http, needs_websockets, retrying):
         self._expectations = expectations
+        self._test_inputs = test_inputs
         self._needs_http = needs_http
         self._needs_websockets = needs_websockets
         self._retrying = retrying
-        self._test_files_list = [test_input.test_name for test_input in test_inputs]
-        self._printer.num_tests = len(self._test_files_list)
+
+        # FIXME: rename all variables to test_run_results or some such ...
+        run_results = TestRunResults(self._expectations, len(test_inputs) + len(tests_to_skip))
+        self._current_run_results = run_results
+        self._remaining_locked_shards = []
+        self._has_http_lock = False
+        self._printer.num_tests = len(test_inputs)
         self._printer.num_completed = 0
 
-        self._all_results = []
-        self._group_stats = {}
-        self._worker_stats = {}
-        self._has_http_lock = False
-        self._remaining_locked_shards = []
+        if not retrying:
+            self._printer.print_expected(run_results, self._expectations.get_tests_with_result_type)
 
-        keyboard_interrupted = False
-        interrupted = False
+        for test_name in set(tests_to_skip):
+            result = test_results.TestResult(test_name)
+            result.type = test_expectations.SKIP
+            run_results.add(result, expected=True, test_is_slow=self._test_is_slow(test_name))
 
         self._printer.write_update('Sharding tests ...')
         locked_shards, unlocked_shards = self._sharder.shard_tests(test_inputs, int(self._options.child_processes), self._options.fully_parallel)
@@ -133,28 +123,27 @@
         self._printer.print_workers_and_shards(num_workers, len(all_shards), len(locked_shards))
 
         if self._options.dry_run:
-            return (keyboard_interrupted, interrupted, self._worker_stats.values(), self._group_stats, self._all_results)
+            return run_results
 
         self._printer.write_update('Starting %s ...' % grammar.pluralize('worker', num_workers))
 
         try:
             with message_pool.get(self, self._worker_factory, num_workers, self._port.worker_startup_delay_secs(), self._port.host) as pool:
                 pool.run(('test_list', shard.name, shard.test_inputs) for shard in all_shards)
+        except TestRunInterruptedException, e:
+            _log.warning(e.reason)
+            run_results.interrupted = True
         except KeyboardInterrupt:
             self._printer.flush()
             self._printer.writeln('Interrupted, exiting ...')
-            keyboard_interrupted = True
-        except TestRunInterruptedException, e:
-            _log.warning(e.reason)
-            interrupted = True
+            raise
         except Exception, e:
             _log.debug('%s("%s") raised, exiting' % (e.__class__.__name__, str(e)))
             raise
         finally:
             self.stop_servers_with_lock()
 
-        # FIXME: should this be a class instead of a tuple?
-        return (interrupted, keyboard_interrupted, self._worker_stats.values(), self._group_stats, self._all_results)
+        return run_results
 
     def _worker_factory(self, worker_connection):
         results_directory = self._results_directory
@@ -163,37 +152,37 @@
             results_directory = self._filesystem.join(self._results_directory, 'retries')
         return Worker(worker_connection, results_directory, self._options)
 
-    def _mark_interrupted_tests_as_skipped(self, result_summary):
-        for test_name in self._test_files_list:
-            if test_name not in result_summary.results:
-                result = test_results.TestResult(test_name, [test_failures.FailureEarlyExit()])
+    def _mark_interrupted_tests_as_skipped(self, run_results):
+        for test_input in self._test_inputs:
+            if test_input.test_name not in run_results.results_by_name:
+                result = test_results.TestResult(test_input.test_name, [test_failures.FailureEarlyExit()])
                 # FIXME: We probably need to loop here if there are multiple iterations.
                 # FIXME: Also, these results are really neither expected nor unexpected. We probably
                 # need a third type of result.
-                result_summary.add(result, expected=False, test_is_slow=self._test_is_slow(test_name))
+                run_results.add(result, expected=False, test_is_slow=self._test_is_slow(test_input.test_name))
 
-    def _interrupt_if_at_failure_limits(self, result_summary):
+    def _interrupt_if_at_failure_limits(self, run_results):
         # Note: The messages in this method are constructed to match old-run-webkit-tests
         # so that existing buildbot grep rules work.
-        def interrupt_if_at_failure_limit(limit, failure_count, result_summary, message):
+        def interrupt_if_at_failure_limit(limit, failure_count, run_results, message):
             if limit and failure_count >= limit:
-                message += " %d tests run." % (result_summary.expected + result_summary.unexpected)
-                self._mark_interrupted_tests_as_skipped(result_summary)
+                message += " %d tests run." % (run_results.expected + run_results.unexpected)
+                self._mark_interrupted_tests_as_skipped(run_results)
                 raise TestRunInterruptedException(message)
 
         interrupt_if_at_failure_limit(
             self._options.exit_after_n_failures,
-            result_summary.unexpected_failures,
-            result_summary,
-            "Exiting early after %d failures." % result_summary.unexpected_failures)
+            run_results.unexpected_failures,
+            run_results,
+            "Exiting early after %d failures." % run_results.unexpected_failures)
         interrupt_if_at_failure_limit(
             self._options.exit_after_n_crashes_or_timeouts,
-            result_summary.unexpected_crashes + result_summary.unexpected_timeouts,
-            result_summary,
+            run_results.unexpected_crashes + run_results.unexpected_timeouts,
+            run_results,
             # This differs from ORWT because it does not include WebProcess crashes.
-            "Exiting early after %d crashes and %d timeouts." % (result_summary.unexpected_crashes, result_summary.unexpected_timeouts))
+            "Exiting early after %d crashes and %d timeouts." % (run_results.unexpected_crashes, run_results.unexpected_timeouts))
 
-    def _update_summary_with_result(self, result_summary, result):
+    def _update_summary_with_result(self, run_results, result):
         if result.type == test_expectations.SKIP:
             exp_str = got_str = 'SKIP'
             expected = True
@@ -202,11 +191,11 @@
             exp_str = self._expectations.get_expectations_string(result.test_name)
             got_str = self._expectations.expectation_to_string(result.type)
 
-        result_summary.add(result, expected, self._test_is_slow(result.test_name))
+        run_results.add(result, expected, self._test_is_slow(result.test_name))
 
         self._printer.print_finished_test(result, expected, exp_str, got_str)
 
-        self._interrupt_if_at_failure_limits(result_summary)
+        self._interrupt_if_at_failure_limits(run_results)
 
     def start_servers_with_lock(self, number_of_servers):
         self._printer.write_update('Acquiring http lock ...')
@@ -240,9 +229,7 @@
     def _handle_started_test(self, worker_name, test_input, test_timeout_sec):
         self._printer.print_started_test(test_input.test_name)
 
-    def _handle_finished_test_list(self, worker_name, list_name, num_tests, elapsed_time):
-        self._group_stats[list_name] = (num_tests, elapsed_time)
-
+    def _handle_finished_test_list(self, worker_name, list_name):
         def find(name, test_lists):
             for i in range(len(test_lists)):
                 if test_lists[i].name == name:
@@ -255,12 +242,8 @@
             if not self._remaining_locked_shards and not self._port.requires_http_server():
                 self.stop_servers_with_lock()
 
-    def _handle_finished_test(self, worker_name, result, elapsed_time, log_messages=[]):
-        self._worker_stats.setdefault(worker_name, {'name': worker_name, 'num_tests': 0, 'total_time': 0})
-        self._worker_stats[worker_name]['total_time'] += elapsed_time
-        self._worker_stats[worker_name]['num_tests'] += 1
-        self._all_results.append(result)
-        self._update_summary_with_result(self._current_result_summary, result)
+    def _handle_finished_test(self, worker_name, result, log_messages=[]):
+        self._update_summary_with_result(self._current_run_results, result)
 
 
 class Worker(object):
@@ -278,8 +261,7 @@
         self._batch_count = None
         self._filesystem = None
         self._driver = None
-        self._tests_run_file = None
-        self._tests_run_filename = None
+        self._num_tests = 0
 
     def __del__(self):
         self.stop()
@@ -294,16 +276,12 @@
 
         self._batch_count = 0
         self._batch_size = self._options.batch_size or 0
-        tests_run_filename = self._filesystem.join(self._results_directory, "tests_run%d.txt" % self._worker_number)
-        self._tests_run_file = self._filesystem.open_text_file_for_writing(tests_run_filename)
 
     def handle(self, name, source, test_list_name, test_inputs):
         assert name == 'test_list'
-        start_time = time.time()
         for test_input in test_inputs:
-            self._run_test(test_input)
-        elapsed_time = time.time() - start_time
-        self._caller.post('finished_test_list', test_list_name, len(test_inputs), elapsed_time)
+            self._run_test(test_input, test_list_name)
+        self._caller.post('finished_test_list', test_list_name)
 
     def _update_test_input(self, test_input):
         if test_input.reference_files is None:
@@ -314,7 +292,7 @@
         else:
             test_input.should_run_pixel_test = self._port.should_run_as_pixel_test(test_input)
 
-    def _run_test(self, test_input):
+    def _run_test(self, test_input, shard_name):
         self._batch_count += 1
 
         stop_when_done = False
@@ -328,18 +306,19 @@
         self._caller.post('started_test', test_input, test_timeout_sec)
 
         result = self._run_test_with_timeout(test_input, test_timeout_sec, stop_when_done)
+        result.shard_name = shard_name
+        result.worker_name = self._name
+        result.total_run_time = time.time() - start
+        result.test_number = self._num_tests
+        self._num_tests += 1
 
-        elapsed_time = time.time() - start
-        self._caller.post('finished_test', result, elapsed_time)
+        self._caller.post('finished_test', result)
 
         self._clean_up_after_test(test_input, result)
 
     def stop(self):
         _log.debug("%s cleaning up" % self._name)
         self._kill_driver()
-        if self._tests_run_file:
-            self._tests_run_file.close()
-            self._tests_run_file = None
 
     def _timeout(self, test_input):
         """Compute the appropriate timeout value for a test."""
@@ -373,7 +352,6 @@
 
     def _clean_up_after_test(self, test_input, result):
         test_name = test_input.test_name
-        self._tests_run_file.write(test_name + "\n")
 
         if result.failures:
             # Check and kill DumpRenderTree if we need to.
@@ -454,8 +432,8 @@
         return self._run_single_test(self._driver, test_input, stop_when_done)
 
     def _run_single_test(self, driver, test_input, stop_when_done):
-        return single_test_runner.run_single_test(self._port, self._options,
-            test_input, driver, self._name, stop_when_done)
+        return single_test_runner.run_single_test(self._port, self._options, self._results_directory,
+            self._name, driver, test_input, stop_when_done)
 
 
 class TestShard(object):
@@ -474,9 +452,8 @@
 
 
 class Sharder(object):
-    def __init__(self, test_split_fn, test_path_separator, max_locked_shards):
+    def __init__(self, test_split_fn, max_locked_shards):
         self._split = test_split_fn
-        self._sep = test_path_separator
         self._max_locked_shards = max_locked_shards
 
     def shard_tests(self, test_inputs, num_workers, fully_parallel):
@@ -603,29 +580,3 @@
             some_shards, remaining_shards = split_at(remaining_shards, num_old_per_new)
             new_shards.append(TestShard('%s_%d' % (shard_name_prefix, len(new_shards) + 1), extract_and_flatten(some_shards)))
         return new_shards
-
-    def test_key(self, test_name):
-        """Turns a test name into a list with two sublists, the natural key of the
-        dirname, and the natural key of the basename.
-
-        This can be used when sorting paths so that files in a directory.
-        directory are kept together rather than being mixed in with files in
-        subdirectories."""
-        dirname, basename = self._split(test_name)
-        return (self.natural_sort_key(dirname + self._sep), self.natural_sort_key(basename))
-
-    @staticmethod
-    def natural_sort_key(string_to_split):
-        """ Turns a string into a list of string and number chunks, i.e. "z23a" -> ["z", 23, "a"]
-
-        This can be used to implement "natural sort" order. See:
-        http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html
-        http://nedbatchelder.com/blog/200712.html#e20071211T054956
-        """
-        def tryint(val):
-            try:
-                return int(val)
-            except ValueError:
-                return val
-
-        return [tryint(chunk) for chunk in re.split('(\d+)', string_to_split)]
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py b/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py
index 4efa4e0..362747d 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2012 Google Inc. All rights reserved.
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 #
@@ -28,16 +27,18 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
+from webkitpy.common.system.systemhost_mock import MockSystemHost
 from webkitpy.layout_tests import run_webkit_tests
+from webkitpy.layout_tests.controllers.layout_test_runner import LayoutTestRunner, Sharder, TestRunInterruptedException
 from webkitpy.layout_tests.models import test_expectations
 from webkitpy.layout_tests.models import test_failures
-from webkitpy.layout_tests.models.result_summary import ResultSummary
+from webkitpy.layout_tests.models.test_run_results import TestRunResults
 from webkitpy.layout_tests.models.test_input import TestInput
 from webkitpy.layout_tests.models.test_results import TestResult
-from webkitpy.layout_tests.controllers.layout_test_runner import LayoutTestRunner, Sharder, TestRunInterruptedException
+from webkitpy.layout_tests.port.test import TestPort
 
 
 TestExpectations = test_expectations.TestExpectations
@@ -47,6 +48,9 @@
     num_completed = 0
     num_tests = 0
 
+    def print_expected(self, run_results, get_tests_with_result_type):
+        pass
+
     def print_workers_and_shards(self, num_workers, num_shards, num_locked_shards):
         pass
 
@@ -68,21 +72,21 @@
 
 class LockCheckingRunner(LayoutTestRunner):
     def __init__(self, port, options, printer, tester, http_lock):
-        super(LockCheckingRunner, self).__init__(options, port, printer, port.results_directory(), TestExpectations(port, []), lambda test_name: False)
+        super(LockCheckingRunner, self).__init__(options, port, printer, port.results_directory(), lambda test_name: False)
         self._finished_list_called = False
         self._tester = tester
         self._should_have_http_lock = http_lock
 
     def handle_finished_list(self, source, list_name, num_tests, elapsed_time):
         if not self._finished_list_called:
-            self._tester.assertEquals(list_name, 'locked_tests')
+            self._tester.assertEqual(list_name, 'locked_tests')
             self._tester.assertTrue(self._remaining_locked_shards)
             self._tester.assertTrue(self._has_http_lock is self._should_have_http_lock)
 
         super(LockCheckingRunner, self).handle_finished_list(source, list_name, num_tests, elapsed_time)
 
         if not self._finished_list_called:
-            self._tester.assertEquals(self._remaining_locked_shards, [])
+            self._tester.assertEqual(self._remaining_locked_shards, [])
             self._tester.assertFalse(self._has_http_lock)
             self._finished_list_called = True
 
@@ -97,13 +101,10 @@
         port = port or host.port_factory.get(options.platform, options=options)
         return LockCheckingRunner(port, options, FakePrinter(), self, True)
 
-    def _result_summary(self, runner, tests):
-        return ResultSummary(TestExpectations(runner._port, tests), tests, 1, set())
-
     def _run_tests(self, runner, tests):
         test_inputs = [TestInput(test, 6000) for test in tests]
         expectations = TestExpectations(runner._port, tests)
-        runner.run_tests(test_inputs, expectations, self._result_summary(runner, tests),
+        runner.run_tests(expectations, test_inputs, set(),
             num_workers=1, needs_http=any('http' in test for test in tests), needs_websockets=any(['websocket' in test for test in tests]), retrying=False)
 
     def test_http_locking(self):
@@ -119,29 +120,29 @@
         runner._options.exit_after_n_failures = None
         runner._options.exit_after_n_crashes_or_times = None
         test_names = ['passes/text.html', 'passes/image.html']
-        runner._test_files_list = test_names
+        runner._test_inputs = [TestInput(test_name, 6000) for test_name in test_names]
 
-        result_summary = self._result_summary(runner, test_names)
-        result_summary.unexpected_failures = 100
-        result_summary.unexpected_crashes = 50
-        result_summary.unexpected_timeouts = 50
+        run_results = TestRunResults(TestExpectations(runner._port, test_names), len(test_names))
+        run_results.unexpected_failures = 100
+        run_results.unexpected_crashes = 50
+        run_results.unexpected_timeouts = 50
         # No exception when the exit_after* options are None.
-        runner._interrupt_if_at_failure_limits(result_summary)
+        runner._interrupt_if_at_failure_limits(run_results)
 
         # No exception when we haven't hit the limit yet.
         runner._options.exit_after_n_failures = 101
         runner._options.exit_after_n_crashes_or_timeouts = 101
-        runner._interrupt_if_at_failure_limits(result_summary)
+        runner._interrupt_if_at_failure_limits(run_results)
 
         # Interrupt if we've exceeded either limit:
         runner._options.exit_after_n_crashes_or_timeouts = 10
-        self.assertRaises(TestRunInterruptedException, runner._interrupt_if_at_failure_limits, result_summary)
-        self.assertEquals(result_summary.results['passes/text.html'].type, test_expectations.SKIP)
-        self.assertEquals(result_summary.results['passes/image.html'].type, test_expectations.SKIP)
+        self.assertRaises(TestRunInterruptedException, runner._interrupt_if_at_failure_limits, run_results)
+        self.assertEqual(run_results.results_by_name['passes/text.html'].type, test_expectations.SKIP)
+        self.assertEqual(run_results.results_by_name['passes/image.html'].type, test_expectations.SKIP)
 
         runner._options.exit_after_n_crashes_or_timeouts = None
         runner._options.exit_after_n_failures = 10
-        exception = self.assertRaises(TestRunInterruptedException, runner._interrupt_if_at_failure_limits, result_summary)
+        exception = self.assertRaises(TestRunInterruptedException, runner._interrupt_if_at_failure_limits, run_results)
 
     def test_update_summary_with_result(self):
         # Reftests expected to be image mismatch should be respected when pixel_tests=False.
@@ -151,17 +152,17 @@
         expectations = TestExpectations(runner._port, tests=[test])
         runner._expectations = expectations
 
-        result_summary = ResultSummary(expectations, [test], 1, set())
+        run_results = TestRunResults(expectations, 1)
         result = TestResult(test_name=test, failures=[test_failures.FailureReftestMismatchDidNotOccur()], reftest_type=['!='])
-        runner._update_summary_with_result(result_summary, result)
-        self.assertEquals(1, result_summary.expected)
-        self.assertEquals(0, result_summary.unexpected)
+        runner._update_summary_with_result(run_results, result)
+        self.assertEqual(1, run_results.expected)
+        self.assertEqual(0, run_results.unexpected)
 
-        result_summary = ResultSummary(expectations, [test], 1, set())
+        run_results = TestRunResults(expectations, 1)
         result = TestResult(test_name=test, failures=[], reftest_type=['=='])
-        runner._update_summary_with_result(result_summary, result)
-        self.assertEquals(0, result_summary.expected)
-        self.assertEquals(1, result_summary.unexpected)
+        runner._update_summary_with_result(run_results, result)
+        self.assertEqual(0, run_results.expected)
+        self.assertEqual(1, run_results.unexpected)
 
     def test_servers_started(self):
 
@@ -189,31 +190,31 @@
         runner._needs_http = True
         runner._needs_websockets = False
         runner.start_servers_with_lock(number_of_servers=4)
-        self.assertEquals(self.http_started, True)
-        self.assertEquals(self.websocket_started, False)
+        self.assertEqual(self.http_started, True)
+        self.assertEqual(self.websocket_started, False)
         runner.stop_servers_with_lock()
-        self.assertEquals(self.http_stopped, True)
-        self.assertEquals(self.websocket_stopped, False)
+        self.assertEqual(self.http_stopped, True)
+        self.assertEqual(self.websocket_stopped, False)
 
         self.http_started = self.http_stopped = self.websocket_started = self.websocket_stopped = False
         runner._needs_http = True
         runner._needs_websockets = True
         runner.start_servers_with_lock(number_of_servers=4)
-        self.assertEquals(self.http_started, True)
-        self.assertEquals(self.websocket_started, True)
+        self.assertEqual(self.http_started, True)
+        self.assertEqual(self.websocket_started, True)
         runner.stop_servers_with_lock()
-        self.assertEquals(self.http_stopped, True)
-        self.assertEquals(self.websocket_stopped, True)
+        self.assertEqual(self.http_stopped, True)
+        self.assertEqual(self.websocket_stopped, True)
 
         self.http_started = self.http_stopped = self.websocket_started = self.websocket_stopped = False
         runner._needs_http = False
         runner._needs_websockets = False
         runner.start_servers_with_lock(number_of_servers=4)
-        self.assertEquals(self.http_started, False)
-        self.assertEquals(self.websocket_started, False)
+        self.assertEqual(self.http_started, False)
+        self.assertEqual(self.websocket_started, False)
         runner.stop_servers_with_lock()
-        self.assertEquals(self.http_stopped, False)
-        self.assertEquals(self.websocket_stopped, False)
+        self.assertEqual(self.http_stopped, False)
+        self.assertEqual(self.websocket_stopped, False)
 
 
 class SharderTests(unittest.TestCase):
@@ -235,21 +236,17 @@
         return TestInput(test_file, requires_lock=(test_file.startswith('http') or test_file.startswith('perf')))
 
     def get_shards(self, num_workers, fully_parallel, test_list=None, max_locked_shards=1):
-        def split(test_name):
-            idx = test_name.rfind('/')
-            if idx != -1:
-                return (test_name[0:idx], test_name[idx + 1:])
-
-        self.sharder = Sharder(split, '/', max_locked_shards)
+        port = TestPort(MockSystemHost())
+        self.sharder = Sharder(port.split_test, max_locked_shards)
         test_list = test_list or self.test_list
         return self.sharder.shard_tests([self.get_test_input(test) for test in test_list], num_workers, fully_parallel)
 
     def assert_shards(self, actual_shards, expected_shard_names):
-        self.assertEquals(len(actual_shards), len(expected_shard_names))
+        self.assertEqual(len(actual_shards), len(expected_shard_names))
         for i, shard in enumerate(actual_shards):
             expected_shard_name, expected_test_names = expected_shard_names[i]
-            self.assertEquals(shard.name, expected_shard_name)
-            self.assertEquals([test_input.test_name for test_input in shard.test_inputs],
+            self.assertEqual(shard.name, expected_shard_name)
+            self.assertEqual([test_input.test_name for test_input in shard.test_inputs],
                               expected_test_names)
 
     def test_shard_by_dir(self):
@@ -307,14 +304,14 @@
     def test_shard_in_two_has_no_locked_shards(self):
         locked, unlocked = self.get_shards(num_workers=1, fully_parallel=False,
              test_list=['animations/keyframe.html'])
-        self.assertEquals(len(locked), 0)
-        self.assertEquals(len(unlocked), 1)
+        self.assertEqual(len(locked), 0)
+        self.assertEqual(len(unlocked), 1)
 
     def test_shard_in_two_has_no_unlocked_shards(self):
         locked, unlocked = self.get_shards(num_workers=1, fully_parallel=False,
              test_list=['http/tests/websocket/tests/unicode.htm'])
-        self.assertEquals(len(locked), 1)
-        self.assertEquals(len(unlocked), 0)
+        self.assertEqual(len(locked), 1)
+        self.assertEqual(len(unlocked), 0)
 
     def test_multiple_locked_shards(self):
         locked, unlocked = self.get_shards(num_workers=4, fully_parallel=False, max_locked_shards=2)
@@ -335,48 +332,3 @@
                'http/tests/websocket/tests/websocket-protocol-ignored.html',
                'http/tests/xmlhttprequest/supported-xml-content-types.html',
                'perf/object-keys.html'])])
-
-
-class NaturalCompareTest(unittest.TestCase):
-    def assert_cmp(self, x, y, result):
-        self.assertEquals(cmp(Sharder.natural_sort_key(x), Sharder.natural_sort_key(y)), result)
-
-    def test_natural_compare(self):
-        self.assert_cmp('a', 'a', 0)
-        self.assert_cmp('ab', 'a', 1)
-        self.assert_cmp('a', 'ab', -1)
-        self.assert_cmp('', '', 0)
-        self.assert_cmp('', 'ab', -1)
-        self.assert_cmp('1', '2', -1)
-        self.assert_cmp('2', '1', 1)
-        self.assert_cmp('1', '10', -1)
-        self.assert_cmp('2', '10', -1)
-        self.assert_cmp('foo_1.html', 'foo_2.html', -1)
-        self.assert_cmp('foo_1.1.html', 'foo_2.html', -1)
-        self.assert_cmp('foo_1.html', 'foo_10.html', -1)
-        self.assert_cmp('foo_2.html', 'foo_10.html', -1)
-        self.assert_cmp('foo_23.html', 'foo_10.html', 1)
-        self.assert_cmp('foo_23.html', 'foo_100.html', -1)
-
-
-class KeyCompareTest(unittest.TestCase):
-    def setUp(self):
-        def split(test_name):
-            idx = test_name.rfind('/')
-            if idx != -1:
-                return (test_name[0:idx], test_name[idx + 1:])
-
-        self.sharder = Sharder(split, '/', 1)
-
-    def assert_cmp(self, x, y, result):
-        self.assertEquals(cmp(self.sharder.test_key(x), self.sharder.test_key(y)), result)
-
-    def test_test_key(self):
-        self.assert_cmp('/a', '/a', 0)
-        self.assert_cmp('/a', '/b', -1)
-        self.assert_cmp('/a2', '/a10', -1)
-        self.assert_cmp('/a2/foo', '/a10/foo', -1)
-        self.assert_cmp('/a/foo11', '/a/foo2', 1)
-        self.assert_cmp('/ab', '/a/a/b', -1)
-        self.assert_cmp('/a/a/b', '/ab', 1)
-        self.assert_cmp('/foo-bar/baz', '/foo/baz', -1)
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py b/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
index 636edd2..5ef2882 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 #
@@ -35,29 +34,21 @@
 create a final report.
 """
 
-import errno
+import json
 import logging
-import math
-import Queue
 import random
-import re
 import sys
 import time
 
-from webkitpy.common import message_pool
 from webkitpy.layout_tests.controllers.layout_test_finder import LayoutTestFinder
-from webkitpy.layout_tests.controllers.layout_test_runner import LayoutTestRunner, TestRunInterruptedException, WorkerException
+from webkitpy.layout_tests.controllers.layout_test_runner import LayoutTestRunner
 from webkitpy.layout_tests.controllers.test_result_writer import TestResultWriter
 from webkitpy.layout_tests.layout_package import json_layout_results_generator
 from webkitpy.layout_tests.layout_package import json_results_generator
 from webkitpy.layout_tests.models import test_expectations
 from webkitpy.layout_tests.models import test_failures
-from webkitpy.layout_tests.models import test_results
+from webkitpy.layout_tests.models import test_run_results
 from webkitpy.layout_tests.models.test_input import TestInput
-from webkitpy.layout_tests.models.result_summary import ResultSummary
-from webkitpy.layout_tests.views import printing
-
-from webkitpy.tool import grammar
 
 _log = logging.getLogger(__name__)
 
@@ -67,192 +58,6 @@
 TestExpectations = test_expectations.TestExpectations
 
 
-def interpret_test_failures(port, test_name, failures):
-    """Interpret test failures and returns a test result as dict.
-
-    Args:
-        port: interface to port-specific hooks
-        test_name: test name relative to layout_tests directory
-        failures: list of test failures
-    Returns:
-        A dictionary like {'is_missing_text': True, ...}
-    """
-    test_dict = {}
-    failure_types = [type(failure) for failure in failures]
-    # FIXME: get rid of all this is_* values once there is a 1:1 map between
-    # TestFailure type and test_expectations.EXPECTATION.
-    if test_failures.FailureMissingAudio in failure_types:
-        test_dict['is_missing_audio'] = True
-
-    if test_failures.FailureMissingResult in failure_types:
-        test_dict['is_missing_text'] = True
-
-    if test_failures.FailureMissingImage in failure_types or test_failures.FailureMissingImageHash in failure_types:
-        test_dict['is_missing_image'] = True
-
-    for failure in failures:
-        if isinstance(failure, test_failures.FailureImageHashMismatch) or isinstance(failure, test_failures.FailureReftestMismatch):
-            test_dict['image_diff_percent'] = failure.diff_percent
-
-    return test_dict
-
-
-def use_trac_links_in_results_html(port_obj):
-    # We only use trac links on the buildbots.
-    # Use existence of builder_name as a proxy for knowing we're on a bot.
-    return port_obj.get_option("builder_name")
-
-
-# FIXME: This should be on the Manager class (since that's the only caller)
-# or split off from Manager onto another helper class, but should not be a free function.
-# Most likely this should be made into its own class, and this super-long function
-# split into many helper functions.
-def summarize_results(port_obj, expectations, result_summary, retry_summary, test_timings, only_unexpected, interrupted):
-    """Summarize failing results as a dict.
-
-    FIXME: split this data structure into a separate class?
-
-    Args:
-        port_obj: interface to port-specific hooks
-        expectations: test_expectations.TestExpectations object
-        result_summary: summary object from initial test runs
-        retry_summary: summary object from final test run of retried tests
-        test_timings: a list of TestResult objects which contain test runtimes in seconds
-        only_unexpected: whether to return a summary only for the unexpected results
-    Returns:
-        A dictionary containing a summary of the unexpected results from the
-        run, with the following fields:
-        'version': a version indicator
-        'fixable': The number of fixable tests (NOW - PASS)
-        'skipped': The number of skipped tests (NOW & SKIPPED)
-        'num_regressions': The number of non-flaky failures
-        'num_flaky': The number of flaky failures
-        'num_missing': The number of tests with missing results
-        'num_passes': The number of unexpected passes
-        'tests': a dict of tests -> {'expected': '...', 'actual': '...'}
-    """
-    results = {}
-    results['version'] = 3
-
-    tbe = result_summary.tests_by_expectation
-    tbt = result_summary.tests_by_timeline
-    results['fixable'] = len(tbt[test_expectations.NOW] - tbe[test_expectations.PASS])
-    results['skipped'] = len(tbt[test_expectations.NOW] & tbe[test_expectations.SKIP])
-
-    num_passes = 0
-    num_flaky = 0
-    num_missing = 0
-    num_regressions = 0
-    keywords = {}
-    for expecation_string, expectation_enum in TestExpectations.EXPECTATIONS.iteritems():
-        keywords[expectation_enum] = expecation_string.upper()
-
-    for modifier_string, modifier_enum in TestExpectations.MODIFIERS.iteritems():
-        keywords[modifier_enum] = modifier_string.upper()
-
-    tests = {}
-    original_results = result_summary.unexpected_results if only_unexpected else result_summary.results
-
-    for test_name, result in original_results.iteritems():
-        # Note that if a test crashed in the original run, we ignore
-        # whether or not it crashed when we retried it (if we retried it),
-        # and always consider the result not flaky.
-        expected = expectations.get_expectations_string(test_name)
-        result_type = result.type
-        actual = [keywords[result_type]]
-
-        if result_type == test_expectations.SKIP:
-            continue
-
-        test_dict = {}
-        if result.has_stderr:
-            test_dict['has_stderr'] = True
-
-        if result.reftest_type:
-            test_dict.update(reftest_type=list(result.reftest_type))
-
-        if expectations.has_modifier(test_name, test_expectations.WONTFIX):
-            test_dict['wontfix'] = True
-
-        if result_type == test_expectations.PASS:
-            num_passes += 1
-            # FIXME: include passing tests that have stderr output.
-            if expected == 'PASS':
-                continue
-        elif result_type == test_expectations.CRASH:
-            num_regressions += 1
-        elif result_type == test_expectations.MISSING:
-            if test_name in result_summary.unexpected_results:
-                num_missing += 1
-        elif test_name in result_summary.unexpected_results:
-            if test_name not in retry_summary.unexpected_results:
-                actual.extend(expectations.get_expectations_string(test_name).split(" "))
-                num_flaky += 1
-            else:
-                retry_result_type = retry_summary.unexpected_results[test_name].type
-                if result_type != retry_result_type:
-                    actual.append(keywords[retry_result_type])
-                    num_flaky += 1
-                else:
-                    num_regressions += 1
-
-        test_dict['expected'] = expected
-        test_dict['actual'] = " ".join(actual)
-        # FIXME: Set this correctly once https://webkit.org/b/37739 is fixed
-        # and only set it if there actually is stderr data.
-
-        test_dict.update(interpret_test_failures(port_obj, test_name, result.failures))
-
-        # Store test hierarchically by directory. e.g.
-        # foo/bar/baz.html: test_dict
-        # foo/bar/baz1.html: test_dict
-        #
-        # becomes
-        # foo: {
-        #     bar: {
-        #         baz.html: test_dict,
-        #         baz1.html: test_dict
-        #     }
-        # }
-        parts = test_name.split('/')
-        current_map = tests
-        for i, part in enumerate(parts):
-            if i == (len(parts) - 1):
-                current_map[part] = test_dict
-                break
-            if part not in current_map:
-                current_map[part] = {}
-            current_map = current_map[part]
-
-    results['tests'] = tests
-    results['num_passes'] = num_passes
-    results['num_flaky'] = num_flaky
-    results['num_missing'] = num_missing
-    results['num_regressions'] = num_regressions
-    results['uses_expectations_file'] = port_obj.uses_test_expectations_file()
-    results['interrupted'] = interrupted  # Does results.html have enough information to compute this itself? (by checking total number of results vs. total number of tests?)
-    results['layout_tests_dir'] = port_obj.layout_tests_dir()
-    results['has_wdiff'] = port_obj.wdiff_available()
-    results['has_pretty_patch'] = port_obj.pretty_patch_available()
-    results['pixel_tests_enabled'] = port_obj.get_option('pixel_tests')
-
-    try:
-        # We only use the svn revision for using trac links in the results.html file,
-        # Don't do this by default since it takes >100ms.
-        # FIXME: Do we really need to populate this both here and in the json_results_generator?
-        if use_trac_links_in_results_html(port_obj):
-            port_obj.host.initialize_scm()
-            results['revision'] = port_obj.host.scm().head_svn_revision()
-    except Exception, e:
-        _log.warn("Failed to determine svn revision for checkout (cwd: %s, webkit_base: %s), leaving 'revision' key blank in full_results.json.\n%s" % (port_obj._filesystem.getcwd(), port_obj.path_from_webkit_base(), e))
-        # Handle cases where we're running outside of version control.
-        import traceback
-        _log.debug('Failed to learn head svn revision:')
-        _log.debug(traceback.format_exc())
-        results['revision'] = ""
-
-    return results
-
 
 class Manager(object):
     """A class for managing running a series of tests on a series of layout
@@ -281,12 +86,9 @@
         # self._websocket_secure_server = websocket_server.PyWebSocket(
         #        options.results_directory, use_tls=True, port=9323)
 
-        self._paths = set()
-        self._test_names = None
-        self._retrying = False
         self._results_directory = self._port.results_directory()
         self._finder = LayoutTestFinder(self._port, self._options)
-        self._runner = LayoutTestRunner(self._options, self._port, self._printer, self._results_directory, self._expectations, self._test_is_slow)
+        self._runner = LayoutTestRunner(self._options, self._port, self._printer, self._results_directory, self._test_is_slow)
 
     def _collect_tests(self, args):
         return self._finder.find_tests(self._options, args)
@@ -297,41 +99,28 @@
     def _is_websocket_test(self, test):
         return self.WEBSOCKET_SUBDIR in test
 
-    def _http_tests(self):
-        return set(test for test in self._test_names if self._is_http_test(test))
-
-    def _websocket_tests(self):
-        return set(test for test in self._test_files if self._is_websocket(test))
+    def _http_tests(self, test_names):
+        return set(test for test in test_names if self._is_http_test(test))
 
     def _is_perf_test(self, test):
         return self.PERF_SUBDIR == test or (self.PERF_SUBDIR + self._port.TEST_PATH_SEPARATOR) in test
 
-    def _prepare_lists(self):
-        tests_to_skip = self._finder.skip_tests(self._paths, self._test_names, self._expectations, self._http_tests())
-        self._test_names = list(set(self._test_names) - tests_to_skip)
+    def _prepare_lists(self, paths, test_names):
+        tests_to_skip = self._finder.skip_tests(paths, test_names, self._expectations, self._http_tests(test_names))
+        tests_to_run = [test for test in test_names if test not in tests_to_skip]
 
         # Create a sorted list of test files so the subset chunk,
         # if used, contains alphabetically consecutive tests.
-        if self._options.randomize_order:
-            random.shuffle(self._test_names)
-        else:
-            self._test_names.sort(key=self._runner.test_key)
+        if self._options.order == 'natural':
+            tests_to_run.sort(key=self._port.test_key)
+        elif self._options.order == 'random':
+            random.shuffle(tests_to_run)
 
-        self._test_names, tests_in_other_chunks = self._finder.split_into_chunks(self._test_names)
+        tests_to_run, tests_in_other_chunks = self._finder.split_into_chunks(tests_to_run)
         self._expectations.add_skipped_tests(tests_in_other_chunks)
         tests_to_skip.update(tests_in_other_chunks)
 
-        if self._options.repeat_each > 1:
-            list_with_repetitions = []
-            for test in self._test_names:
-                list_with_repetitions += ([test] * self._options.repeat_each)
-            self._test_names = list_with_repetitions
-
-        if self._options.iterations > 1:
-            self._test_names = self._test_names * self._options.iterations
-
-        iterations = self._options.repeat_each * self._options.iterations
-        return ResultSummary(self._expectations, set(self._test_names), iterations, tests_to_skip)
+        return tests_to_run, tests_to_skip
 
     def _test_input_for_file(self, test_file):
         return TestInput(test_file,
@@ -348,12 +137,12 @@
     def _test_is_slow(self, test_file):
         return self._expectations.has_modifier(test_file, test_expectations.SLOW)
 
-    def needs_servers(self):
-        return any(self._test_requires_lock(test_name) for test_name in self._test_names) and self._options.http
+    def needs_servers(self, test_names):
+        return any(self._test_requires_lock(test_name) for test_name in test_names) and self._options.http
 
-    def _set_up_run(self):
+    def _set_up_run(self, test_names):
         self._printer.write_update("Checking build ...")
-        if not self._port.check_build(self.needs_servers()):
+        if not self._port.check_build(self.needs_servers(test_names)):
             _log.error("Build check failed")
             return False
 
@@ -366,7 +155,7 @@
         # Check that the system dependencies (themes, fonts, ...) are correct.
         if not self._options.nocheck_sys_deps:
             self._printer.write_update("Checking system dependencies ...")
-            if not self._port.check_sys_deps(self.needs_servers()):
+            if not self._port.check_sys_deps(self.needs_servers(test_names)):
                 self._port.stop_helper()
                 return False
 
@@ -380,110 +169,119 @@
         return True
 
     def run(self, args):
-        """Run all our tests on all our test files and return the number of unexpected results (0 == success)."""
+        """Run the tests and return a RunDetails object with the results."""
         self._printer.write_update("Collecting tests ...")
         try:
-            self._paths, self._test_names = self._collect_tests(args)
-        except IOError as exception:
+            paths, test_names = self._collect_tests(args)
+        except IOError:
             # This is raised if --test-list doesn't exist
-            return -1
+            return test_run_results.RunDetails(exit_code=-1)
 
         self._printer.write_update("Parsing expectations ...")
-        self._expectations = test_expectations.TestExpectations(self._port, self._test_names)
+        self._expectations = test_expectations.TestExpectations(self._port, test_names)
 
-        num_all_test_files_found = len(self._test_names)
-        result_summary = self._prepare_lists()
+        tests_to_run, tests_to_skip = self._prepare_lists(paths, test_names)
+        self._printer.print_found(len(test_names), len(tests_to_run), self._options.repeat_each, self._options.iterations)
 
         # Check to make sure we're not skipping every test.
-        if not self._test_names:
+        if not tests_to_run:
             _log.critical('No tests to run.')
-            return -1
+            return test_run_results.RunDetails(exit_code=-1)
 
-        self._printer.print_found(num_all_test_files_found, len(self._test_names), self._options.repeat_each, self._options.iterations)
-        self._printer.print_expected(result_summary, self._expectations.get_tests_with_result_type)
-
-        if not self._set_up_run():
-            return -1
+        if not self._set_up_run(tests_to_run):
+            return test_run_results.RunDetails(exit_code=-1)
 
         start_time = time.time()
+        enabled_pixel_tests_in_retry = False
+        try:
+            initial_results = self._run_tests(tests_to_run, tests_to_skip, self._options.repeat_each, self._options.iterations,
+                int(self._options.child_processes), retrying=False)
 
-        interrupted, keyboard_interrupted, thread_timings, test_timings, individual_test_timings = \
-            self._run_tests(self._test_names, result_summary, int(self._options.child_processes))
+            tests_to_retry = self._tests_to_retry(initial_results, include_crashes=self._port.should_retry_crashes())
+            if self._options.retry_failures and tests_to_retry and not initial_results.interrupted:
+                enabled_pixel_tests_in_retry = self._force_pixel_tests_if_needed()
 
-        # We exclude the crashes from the list of results to retry, because
-        # we want to treat even a potentially flaky crash as an error.
+                _log.info('')
+                _log.info("Retrying %d unexpected failure(s) ..." % len(tests_to_retry))
+                _log.info('')
+                retry_results = self._run_tests(tests_to_retry, tests_to_skip=set(), repeat_each=1, iterations=1,
+                    num_workers=1, retrying=True)
 
-        failures = self._get_failures(result_summary, include_crashes=self._port.should_retry_crashes(), include_missing=False)
-        retry_summary = result_summary
-        while (len(failures) and self._options.retry_failures and not self._retrying and not interrupted and not keyboard_interrupted):
-            _log.info('')
-            _log.info("Retrying %d unexpected failure(s) ..." % len(failures))
-            _log.info('')
-            self._retrying = True
-            retry_summary = ResultSummary(self._expectations, failures.keys(), 1, set())
-            # Note that we intentionally ignore the return value here.
-            self._run_tests(failures.keys(), retry_summary, 1)
-            failures = self._get_failures(retry_summary, include_crashes=True, include_missing=True)
+                if enabled_pixel_tests_in_retry:
+                    self._options.pixel_tests = False
+            else:
+                retry_results = None
+        finally:
+            self._clean_up_run()
 
         end_time = time.time()
 
         # Some crash logs can take a long time to be written out so look
         # for new logs after the test run finishes.
-        self._look_for_new_crash_logs(result_summary, start_time)
-        self._look_for_new_crash_logs(retry_summary, start_time)
-        self._clean_up_run()
+        _log.debug("looking for new crash logs")
+        self._look_for_new_crash_logs(initial_results, start_time)
+        if retry_results:
+            self._look_for_new_crash_logs(retry_results, start_time)
 
-        unexpected_results = summarize_results(self._port, self._expectations, result_summary, retry_summary, individual_test_timings, only_unexpected=True, interrupted=interrupted)
+        _log.debug("summarizing results")
+        summarized_results = test_run_results.summarize_results(self._port, self._expectations, initial_results, retry_results, enabled_pixel_tests_in_retry)
+        self._printer.print_results(end_time - start_time, initial_results, summarized_results)
 
-        self._printer.print_results(end_time - start_time, thread_timings, test_timings, individual_test_timings, result_summary, unexpected_results)
-
-        # Re-raise a KeyboardInterrupt if necessary so the caller can handle it.
-        if keyboard_interrupted:
-            raise KeyboardInterrupt
-
-        # FIXME: remove record_results. It's just used for testing. There's no need
-        # for it to be a commandline argument.
-        if (self._options.record_results and not self._options.dry_run and not keyboard_interrupted):
-            self._port.print_leaks_summary()
-            # Write the same data to log files and upload generated JSON files to appengine server.
-            summarized_results = summarize_results(self._port, self._expectations, result_summary, retry_summary, individual_test_timings, only_unexpected=False, interrupted=interrupted)
-            self._upload_json_files(summarized_results, result_summary, individual_test_timings)
-
-        # Write the summary to disk (results.html) and display it if requested.
         if not self._options.dry_run:
-            self._copy_results_html_file()
-            if self._options.show_results:
-                self._show_results_html_file(result_summary)
+            self._port.print_leaks_summary()
+            self._upload_json_files(summarized_results, initial_results)
 
-        return self._port.exit_code_from_summarized_results(unexpected_results)
+            results_path = self._filesystem.join(self._results_directory, "results.html")
+            self._copy_results_html_file(results_path)
+            if self._options.show_results and (initial_results.unexpected_results_by_name or
+                                               (self._options.full_results_html and initial_results.total_failures)):
+                self._port.show_results_html_file(results_path)
 
-    def _run_tests(self, tests, result_summary, num_workers):
-        test_inputs = [self._test_input_for_file(test) for test in tests]
-        needs_http = self._port.requires_http_server() or any(self._is_http_test(test) for test in tests)
-        needs_websockets = any(self._is_websocket_test(test) for test in tests)
-        return self._runner.run_tests(test_inputs, self._expectations, result_summary, num_workers, needs_http, needs_websockets, self._retrying)
+        return test_run_results.RunDetails(self._port.exit_code_from_summarized_results(summarized_results),
+                                           summarized_results, initial_results, retry_results, enabled_pixel_tests_in_retry)
+
+    def _run_tests(self, tests_to_run, tests_to_skip, repeat_each, iterations, num_workers, retrying):
+        needs_http = self._port.requires_http_server() or any(self._is_http_test(test) for test in tests_to_run)
+        needs_websockets = any(self._is_websocket_test(test) for test in tests_to_run)
+
+        test_inputs = []
+        for _ in xrange(iterations):
+            for test in tests_to_run:
+                for _ in xrange(repeat_each):
+                    test_inputs.append(self._test_input_for_file(test))
+        return self._runner.run_tests(self._expectations, test_inputs, tests_to_skip, num_workers, needs_http, needs_websockets, retrying)
 
     def _clean_up_run(self):
-        """Restores the system after we're done running tests."""
-        _log.debug("flushing stdout")
+        _log.debug("Flushing stdout")
         sys.stdout.flush()
-        _log.debug("flushing stderr")
+        _log.debug("Flushing stderr")
         sys.stderr.flush()
-        _log.debug("stopping helper")
+        _log.debug("Stopping helper")
         self._port.stop_helper()
-        _log.debug("cleaning up port")
+        _log.debug("Cleaning up port")
         self._port.clean_up_test_run()
 
-    def _look_for_new_crash_logs(self, result_summary, start_time):
+    def _force_pixel_tests_if_needed(self):
+        if self._options.pixel_tests:
+            return False
+
+        _log.debug("Restarting helper")
+        self._port.stop_helper()
+        self._options.pixel_tests = True
+        self._port.start_helper()
+
+        return True
+
+    def _look_for_new_crash_logs(self, run_results, start_time):
         """Since crash logs can take a long time to be written out if the system is
            under stress do a second pass at the end of the test run.
 
-           result_summary: the results of the test run
+           run_results: the results of the test run
            start_time: time the tests started at.  We're looking for crash
                logs after that time.
         """
         crashed_processes = []
-        for test, result in result_summary.unexpected_results.iteritems():
+        for test, result in run_results.unexpected_results_by_name.iteritems():
             if (result.type != test_expectations.CRASH):
                 continue
             for failure in result.failures:
@@ -491,6 +289,12 @@
                     continue
                 crashed_processes.append([test, failure.process_name, failure.pid])
 
+        sample_files = self._port.look_for_new_samples(crashed_processes, start_time)
+        if sample_files:
+            for test, sample_file in sample_files.iteritems():
+                writer = TestResultWriter(self._port._filesystem, self._port, self._port.results_directory(), test)
+                writer.copy_sample_file(sample_file)
+
         crash_logs = self._port.look_for_new_crash_logs(crashed_processes, start_time)
         if crash_logs:
             for test, crash_log in crash_logs.iteritems():
@@ -509,53 +313,31 @@
             if self._filesystem.isdir(self._filesystem.join(layout_tests_dir, dirname)):
                 self._filesystem.rmtree(self._filesystem.join(self._results_directory, dirname))
 
-    def _get_failures(self, result_summary, include_crashes, include_missing):
-        """Filters a dict of results and returns only the failures.
+    def _tests_to_retry(self, run_results, include_crashes):
+        return [result.test_name for result in run_results.unexpected_results_by_name.values() if
+                   ((result.type != test_expectations.PASS) and
+                    (result.type != test_expectations.MISSING) and
+                    (result.type != test_expectations.CRASH or include_crashes))]
 
-        Args:
-          result_summary: the results of the test run
-          include_crashes: whether crashes are included in the output.
-            We use False when finding the list of failures to retry
-            to see if the results were flaky. Although the crashes may also be
-            flaky, we treat them as if they aren't so that they're not ignored.
-        Returns:
-          a dict of files -> results
-        """
-        failed_results = {}
-        for test, result in result_summary.unexpected_results.iteritems():
-            if (result.type == test_expectations.PASS or
-                (result.type == test_expectations.CRASH and not include_crashes) or
-                (result.type == test_expectations.MISSING and not include_missing)):
-                continue
-            failed_results[test] = result.type
-
-        return failed_results
-
-    def _char_for_result(self, result):
-        result = result.lower()
-        if result in TestExpectations.EXPECTATIONS:
-            result_enum_value = TestExpectations.EXPECTATIONS[result]
-        else:
-            result_enum_value = TestExpectations.MODIFIERS[result]
-        return json_layout_results_generator.JSONLayoutResultsGenerator.FAILURE_TO_CHAR[result_enum_value]
-
-    def _upload_json_files(self, summarized_results, result_summary, individual_test_timings):
+    def _upload_json_files(self, summarized_results, initial_results):
         """Writes the results of the test run as JSON files into the results
         dir and upload the files to the appengine server.
 
         Args:
-          unexpected_results: dict of unexpected results
           summarized_results: dict of results
-          result_summary: full summary object
-          individual_test_timings: list of test times (used by the flakiness
-            dashboard).
+          initial_results: full summary object
         """
         _log.debug("Writing JSON files in %s." % self._results_directory)
 
-        times_trie = json_results_generator.test_timings_trie(self._port, individual_test_timings)
+        # FIXME: Upload stats.json to the server and delete times_ms.
+        times_trie = json_results_generator.test_timings_trie(self._port, initial_results.results_by_name.values())
         times_json_path = self._filesystem.join(self._results_directory, "times_ms.json")
         json_results_generator.write_json(self._filesystem, times_trie, times_json_path)
 
+        stats_trie = self._stats_trie(initial_results)
+        stats_path = self._filesystem.join(self._results_directory, "stats.json")
+        self._filesystem.write_text_file(stats_path, json.dumps(stats_trie))
+
         full_results_path = self._filesystem.join(self._results_directory, "full_results.json")
         # We write full_results.json out as jsonp because we need to load it from a file url and Chromium doesn't allow that.
         json_results_generator.write_json(self._filesystem, summarized_results, full_results_path, callback="ADD_RESULTS")
@@ -563,14 +345,15 @@
         generator = json_layout_results_generator.JSONLayoutResultsGenerator(
             self._port, self._options.builder_name, self._options.build_name,
             self._options.build_number, self._results_directory,
-            BUILDER_BASE_URL, individual_test_timings,
-            self._expectations, result_summary, self._test_names,
+            BUILDER_BASE_URL,
+            self._expectations, initial_results,
             self._options.test_results_server,
             "layout-tests",
             self._options.master_name)
 
         _log.debug("Finished writing JSON files.")
 
+
         json_files = ["incremental_results.json", "full_results.json", "times_ms.json"]
 
         generator.upload_json_files(json_files)
@@ -582,31 +365,23 @@
         self._filesystem.remove(times_json_path)
         self._filesystem.remove(incremental_results_path)
 
-    def _num_digits(self, num):
-        """Returns the number of digits needed to represent the length of a
-        sequence."""
-        ndigits = 1
-        if len(num):
-            ndigits = int(math.log10(len(num))) + 1
-        return ndigits
-
-    def _copy_results_html_file(self):
+    def _copy_results_html_file(self, destination_path):
         base_dir = self._port.path_from_webkit_base('LayoutTests', 'fast', 'harness')
         results_file = self._filesystem.join(base_dir, 'results.html')
-        # FIXME: What should we do if this doesn't exist (e.g., in unit tests)?
+        # Note that the results.html template file won't exist when we're using a MockFileSystem during unit tests,
+        # so make sure it exists before we try to copy it.
         if self._filesystem.exists(results_file):
-            self._filesystem.copyfile(results_file, self._filesystem.join(self._results_directory, "results.html"))
+            self._filesystem.copyfile(results_file, destination_path)
 
-    def _show_results_html_file(self, result_summary):
-        """Shows the results.html page."""
-        if self._options.full_results_html:
-            test_files = result_summary.failures.keys()
-        else:
-            unexpected_failures = self._get_failures(result_summary, include_crashes=True, include_missing=True)
-            test_files = unexpected_failures.keys()
+    def _stats_trie(self, initial_results):
+        def _worker_number(worker_name):
+            return int(worker_name.split('/')[1]) if worker_name else -1
 
-        if not len(test_files):
-            return
-
-        results_filename = self._filesystem.join(self._results_directory, "results.html")
-        self._port.show_results_html_file(results_filename)
+        stats = {}
+        for result in initial_results.results_by_name.values():
+            if result.type != test_expectations.SKIP:
+                stats[result.test_name] = {'results': (_worker_number(result.worker_name), result.test_number, result.pid, int(result.test_run_time * 1000), int(result.total_run_time * 1000))}
+        stats_trie = {}
+        for name, value in stats.iteritems():
+            json_results_generator.add_path_to_trie(name, value, stats_trie)
+        return stats_trie
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/manager_unittest.py b/Tools/Scripts/webkitpy/layout_tests/controllers/manager_unittest.py
index e94d133..4a81548 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/manager_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/manager_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 #
@@ -32,173 +31,60 @@
 
 import sys
 import time
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
-from webkitpy.layout_tests.controllers.manager import Manager, interpret_test_failures, summarize_results
+from webkitpy.layout_tests.controllers.manager import Manager
 from webkitpy.layout_tests.models import test_expectations
-from webkitpy.layout_tests.models import test_failures
-from webkitpy.layout_tests.models import test_results
-from webkitpy.layout_tests.models.result_summary import ResultSummary
+from webkitpy.layout_tests.models.test_run_results import TestRunResults
 from webkitpy.thirdparty.mock import Mock
 from webkitpy.tool.mocktool import MockOptions
 
 
 class ManagerTest(unittest.TestCase):
     def test_needs_servers(self):
-        def get_manager_with_tests(test_names):
+        def get_manager():
             port = Mock()  # FIXME: Use a tighter mock.
             port.TEST_PATH_SEPARATOR = '/'
             manager = Manager(port, options=MockOptions(http=True, max_locked_shards=1), printer=Mock())
-            manager._test_names = test_names
             return manager
 
-        manager = get_manager_with_tests(['fast/html'])
-        self.assertFalse(manager.needs_servers())
+        manager = get_manager()
+        self.assertFalse(manager.needs_servers(['fast/html']))
 
-        manager = get_manager_with_tests(['http/tests/misc'])
-        self.assertTrue(manager.needs_servers())
+        manager = get_manager()
+        self.assertTrue(manager.needs_servers(['http/tests/misc']))
 
     def integration_test_needs_servers(self):
-        def get_manager_with_tests(test_names):
+        def get_manager():
             host = MockHost()
             port = host.port_factory.get()
             manager = Manager(port, options=MockOptions(test_list=None, http=True, max_locked_shards=1), printer=Mock())
-            manager._collect_tests(test_names)
             return manager
 
-        manager = get_manager_with_tests(['fast/html'])
-        self.assertFalse(manager.needs_servers())
+        manager = get_manager()
+        self.assertFalse(manager.needs_servers(['fast/html']))
 
-        manager = get_manager_with_tests(['http/tests/mime'])
-        self.assertTrue(manager.needs_servers())
+        manager = get_manager()
+        self.assertTrue(manager.needs_servers(['http/tests/mime']))
 
         if sys.platform == 'win32':
-            manager = get_manager_with_tests(['fast\\html'])
-            self.assertFalse(manager.needs_servers())
+            manager = get_manager()
+            self.assertFalse(manager.needs_servers(['fast\\html']))
 
-            manager = get_manager_with_tests(['http\\tests\\mime'])
-            self.assertTrue(manager.needs_servers())
+            manager = get_manager()
+            self.assertTrue(manager.needs_servers(['http\\tests\\mime']))
 
     def test_look_for_new_crash_logs(self):
-        def get_manager_with_tests(test_names):
+        def get_manager():
             host = MockHost()
             port = host.port_factory.get('test-mac-leopard')
             manager = Manager(port, options=MockOptions(test_list=None, http=True, max_locked_shards=1), printer=Mock())
-            manager._collect_tests(test_names)
             return manager
         host = MockHost()
         port = host.port_factory.get('test-mac-leopard')
         tests = ['failures/expected/crash.html']
         expectations = test_expectations.TestExpectations(port, tests)
-        rs = ResultSummary(expectations, tests, 1, set())
-        manager = get_manager_with_tests(tests)
-        manager._look_for_new_crash_logs(rs, time.time())
-
-
-class ResultSummaryTest(unittest.TestCase):
-
-    def setUp(self):
-        host = MockHost()
-        self.port = host.port_factory.get(port_name='test')
-
-    def test_interpret_test_failures(self):
-        test_dict = interpret_test_failures(self.port, 'foo/reftest.html',
-            [test_failures.FailureImageHashMismatch(diff_percent=0.42)])
-        self.assertEqual(test_dict['image_diff_percent'], 0.42)
-
-        test_dict = interpret_test_failures(self.port, 'foo/reftest.html',
-            [test_failures.FailureReftestMismatch(self.port.abspath_for_test('foo/reftest-expected.html'))])
-        self.assertTrue('image_diff_percent' in test_dict)
-
-        test_dict = interpret_test_failures(self.port, 'foo/reftest.html',
-            [test_failures.FailureReftestMismatchDidNotOccur(self.port.abspath_for_test('foo/reftest-expected-mismatch.html'))])
-        self.assertEqual(len(test_dict), 0)
-
-        test_dict = interpret_test_failures(self.port, 'foo/audio-test.html',
-            [test_failures.FailureMissingAudio()])
-        self.assertTrue('is_missing_audio' in test_dict)
-
-        test_dict = interpret_test_failures(self.port, 'foo/text-test.html',
-            [test_failures.FailureMissingResult()])
-        self.assertTrue('is_missing_text' in test_dict)
-
-        test_dict = interpret_test_failures(self.port, 'foo/pixel-test.html',
-            [test_failures.FailureMissingImage()])
-        self.assertTrue('is_missing_image' in test_dict)
-
-        test_dict = interpret_test_failures(self.port, 'foo/pixel-test.html',
-            [test_failures.FailureMissingImageHash()])
-        self.assertTrue('is_missing_image' in test_dict)
-
-    def get_result(self, test_name, result_type=test_expectations.PASS, run_time=0):
-        failures = []
-        if result_type == test_expectations.TIMEOUT:
-            failures = [test_failures.FailureTimeout()]
-        elif result_type == test_expectations.CRASH:
-            failures = [test_failures.FailureCrash()]
-        return test_results.TestResult(test_name, failures=failures, test_run_time=run_time)
-
-    def get_result_summary(self, port, test_names, expectations_str):
-        port.expectations_dict = lambda: {'': expectations_str}
-        expectations = test_expectations.TestExpectations(port, test_names)
-        return test_names, ResultSummary(expectations, test_names, 1, set()), expectations
-
-    # FIXME: Use this to test more of summarize_results. This was moved from printing_unittest.py.
-    def summarized_results(self, port, expected, passing, flaky, extra_tests=[], extra_expectations=None):
-        tests = ['passes/text.html', 'failures/expected/timeout.html', 'failures/expected/crash.html', 'failures/expected/wontfix.html']
-        if extra_tests:
-            tests.extend(extra_tests)
-
-        expectations = ''
-        if extra_expectations:
-            expectations += extra_expectations
-
-        test_is_slow = False
-        paths, rs, exp = self.get_result_summary(port, tests, expectations)
-        if expected:
-            rs.add(self.get_result('passes/text.html', test_expectations.PASS), expected, test_is_slow)
-            rs.add(self.get_result('failures/expected/timeout.html', test_expectations.TIMEOUT), expected, test_is_slow)
-            rs.add(self.get_result('failures/expected/crash.html', test_expectations.CRASH), expected, test_is_slow)
-        elif passing:
-            rs.add(self.get_result('passes/text.html'), expected, test_is_slow)
-            rs.add(self.get_result('failures/expected/timeout.html'), expected, test_is_slow)
-            rs.add(self.get_result('failures/expected/crash.html'), expected, test_is_slow)
-        else:
-            rs.add(self.get_result('passes/text.html', test_expectations.TIMEOUT), expected, test_is_slow)
-            rs.add(self.get_result('failures/expected/timeout.html', test_expectations.CRASH), expected, test_is_slow)
-            rs.add(self.get_result('failures/expected/crash.html', test_expectations.TIMEOUT), expected, test_is_slow)
-
-        for test in extra_tests:
-            rs.add(self.get_result(test, test_expectations.CRASH), expected, test_is_slow)
-
-        retry = rs
-        if flaky:
-            paths, retry, exp = self.get_result_summary(port, tests, expectations)
-            retry.add(self.get_result('passes/text.html'), True, test_is_slow)
-            retry.add(self.get_result('failures/expected/timeout.html'), True, test_is_slow)
-            retry.add(self.get_result('failures/expected/crash.html'), True, test_is_slow)
-        unexpected_results = summarize_results(port, exp, rs, retry, test_timings={}, only_unexpected=True, interrupted=False)
-        expected_results = summarize_results(port, exp, rs, retry, test_timings={}, only_unexpected=False, interrupted=False)
-        return expected_results, unexpected_results
-
-    def test_no_svn_revision(self):
-        host = MockHost(initialize_scm_by_default=False)
-        port = host.port_factory.get('test')
-        expected_results, unexpected_results = self.summarized_results(port, expected=False, passing=False, flaky=False)
-        self.assertTrue('revision' not in unexpected_results)
-
-    def test_svn_revision(self):
-        host = MockHost(initialize_scm_by_default=False)
-        port = host.port_factory.get('test')
-        port._options.builder_name = 'dummy builder'
-        expected_results, unexpected_results = self.summarized_results(port, expected=False, passing=False, flaky=False)
-        self.assertNotEquals(unexpected_results['revision'], '')
-
-    def test_summarized_results_wontfix(self):
-        host = MockHost()
-        port = host.port_factory.get('test')
-        port._options.builder_name = 'dummy builder'
-        port._filesystem.write_text_file(port._filesystem.join(port.layout_tests_dir(), "failures/expected/wontfix.html"), "Dummy test contents")
-        expected_results, unexpected_results = self.summarized_results(port, expected=False, passing=False, flaky=False, extra_tests=['failures/expected/wontfix.html'], extra_expectations='Bug(x) failures/expected/wontfix.html [ WontFix ]\n')
-        self.assertTrue(expected_results['tests']['failures']['expected']['wontfix.html']['wontfix'])
+        run_results = TestRunResults(expectations, len(tests))
+        manager = get_manager()
+        manager._look_for_new_crash_logs(run_results, time.time())
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py b/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py
index 28e9d63..b794d31 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py
@@ -41,18 +41,19 @@
 _log = logging.getLogger(__name__)
 
 
-def run_single_test(port, options, test_input, driver, worker_name, stop_when_done):
-    runner = SingleTestRunner(options, port, driver, test_input, worker_name, stop_when_done)
+def run_single_test(port, options, results_directory, worker_name, driver, test_input, stop_when_done):
+    runner = SingleTestRunner(port, options, results_directory, worker_name, driver, test_input, stop_when_done)
     return runner.run()
 
 
 class SingleTestRunner(object):
     (ALONGSIDE_TEST, PLATFORM_DIR, VERSION_DIR, UPDATE) = ('alongside', 'platform', 'version', 'update')
 
-    def __init__(self, options, port, driver, test_input, worker_name, stop_when_done):
-        self._options = options
+    def __init__(self, port, options, results_directory, worker_name, driver, test_input, stop_when_done):
         self._port = port
         self._filesystem = port.host.filesystem
+        self._options = options
+        self._results_directory = results_directory
         self._driver = driver
         self._timeout = test_input.timeout
         self._worker_name = worker_name
@@ -114,17 +115,17 @@
         test_result = self._compare_output(expected_driver_output, driver_output)
         if self._options.new_test_results:
             self._add_missing_baselines(test_result, driver_output)
-        test_result_writer.write_test_result(self._filesystem, self._port, self._test_name, driver_output, expected_driver_output, test_result.failures)
+        test_result_writer.write_test_result(self._filesystem, self._port, self._results_directory, self._test_name, driver_output, expected_driver_output, test_result.failures)
         return test_result
 
     def _run_rebaseline(self):
         driver_output = self._driver.run_test(self._driver_input(), self._stop_when_done)
         failures = self._handle_error(driver_output)
-        test_result_writer.write_test_result(self._filesystem, self._port, self._test_name, driver_output, None, failures)
+        test_result_writer.write_test_result(self._filesystem, self._port, self._results_directory, self._test_name, driver_output, None, failures)
         # FIXME: It the test crashed or timed out, it might be better to avoid
         # to write new baselines.
         self._overwrite_baselines(driver_output)
-        return TestResult(self._test_name, failures, driver_output.test_time, driver_output.has_stderr())
+        return TestResult(self._test_name, failures, driver_output.test_time, driver_output.has_stderr(), pid=driver_output.pid)
 
     _render_tree_dump_pattern = re.compile(r"^layer at \(\d+,\d+\) size \d+x\d+\n")
 
@@ -217,13 +218,13 @@
         if driver_output.crash:
             # Don't continue any more if we already have a crash.
             # In case of timeouts, we continue since we still want to see the text and image output.
-            return TestResult(self._test_name, failures, driver_output.test_time, driver_output.has_stderr())
+            return TestResult(self._test_name, failures, driver_output.test_time, driver_output.has_stderr(), pid=driver_output.pid)
 
         failures.extend(self._compare_text(expected_driver_output.text, driver_output.text))
         failures.extend(self._compare_audio(expected_driver_output.audio, driver_output.audio))
         if self._should_run_pixel_test:
             failures.extend(self._compare_image(expected_driver_output, driver_output))
-        return TestResult(self._test_name, failures, driver_output.test_time, driver_output.has_stderr())
+        return TestResult(self._test_name, failures, driver_output.test_time, driver_output.has_stderr(), pid=driver_output.pid)
 
     def _compare_text(self, expected_text, actual_text):
         failures = []
@@ -293,8 +294,10 @@
         # Note that sorting by the expectation sorts "!=" before "==" so this is easy to do.
 
         putAllMismatchBeforeMatch = sorted
+        reference_test_names = []
         for expectation, reference_filename in putAllMismatchBeforeMatch(self._reference_files):
             reference_test_name = self._port.relative_test_filename(reference_filename)
+            reference_test_names.append(reference_test_name)
             reference_output = self._driver.run_test(DriverInput(reference_test_name, self._timeout, None, should_run_pixel_test=True), self._stop_when_done)
             test_result = self._compare_output_with_reference(reference_output, test_output, reference_filename, expectation == '!=')
 
@@ -303,9 +306,9 @@
             total_test_time += test_result.test_run_time
 
         assert(reference_output)
-        test_result_writer.write_test_result(self._filesystem, self._port, self._test_name, test_output, reference_output, test_result.failures)
+        test_result_writer.write_test_result(self._filesystem, self._port, self._results_directory, self._test_name, test_output, reference_output, test_result.failures)
         reftest_type = set([reference_file[0] for reference_file in self._reference_files])
-        return TestResult(self._test_name, test_result.failures, total_test_time + test_result.test_run_time, test_result.has_stderr, reftest_type=reftest_type)
+        return TestResult(self._test_name, test_result.failures, total_test_time + test_result.test_run_time, test_result.has_stderr, reftest_type=reftest_type, pid=test_result.pid, references=reference_test_names)
 
     def _compare_output_with_reference(self, reference_driver_output, actual_driver_output, reference_filename, mismatch):
         total_test_time = reference_driver_output.test_time + actual_driver_output.test_time
@@ -317,7 +320,7 @@
             return TestResult(self._test_name, failures, total_test_time, has_stderr)
         failures.extend(self._handle_error(reference_driver_output, reference_filename=reference_filename))
         if failures:
-            return TestResult(self._test_name, failures, total_test_time, has_stderr)
+            return TestResult(self._test_name, failures, total_test_time, has_stderr, pid=actual_driver_output.pid)
 
         if not reference_driver_output.image_hash and not actual_driver_output.image_hash:
             failures.append(test_failures.FailureReftestNoImagesGenerated(reference_filename))
@@ -336,4 +339,4 @@
             else:
                 _log.warning("  %s -> ref test hashes didn't match but diff passed" % self._test_name)
 
-        return TestResult(self._test_name, failures, total_test_time, has_stderr)
+        return TestResult(self._test_name, failures, total_test_time, has_stderr, pid=actual_driver_output.pid)
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer.py b/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer.py
index be178ab..23e44d5 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer.py
@@ -35,10 +35,10 @@
 _log = logging.getLogger(__name__)
 
 
-def write_test_result(filesystem, port, test_name, driver_output,
+def write_test_result(filesystem, port, results_directory, test_name, driver_output,
                       expected_driver_output, failures):
     """Write the test result to the result output directory."""
-    root_output_dir = port.results_directory()
+    root_output_dir = results_directory
     writer = TestResultWriter(filesystem, port, root_output_dir, test_name)
 
     if driver_output.error:
@@ -92,6 +92,7 @@
     FILENAME_SUFFIX_DIFF = "-diff"
     FILENAME_SUFFIX_STDERR = "-stderr"
     FILENAME_SUFFIX_CRASH_LOG = "-crash-log"
+    FILENAME_SUFFIX_SAMPLE = "-sample"
     FILENAME_SUFFIX_WDIFF = "-wdiff.html"
     FILENAME_SUFFIX_PRETTY_PATCH = "-pretty-diff.html"
     FILENAME_SUFFIX_IMAGE_DIFF = "-diff.png"
@@ -166,6 +167,10 @@
         filename = self.output_filename(self.FILENAME_SUFFIX_CRASH_LOG + ".txt")
         self._write_text_file(filename, crash_log)
 
+    def copy_sample_file(self, sample_file):
+        filename = self.output_filename(self.FILENAME_SUFFIX_SAMPLE + ".txt")
+        self._filesystem.copyfile(sample_file, filename)
+
     def write_text_files(self, actual_text, expected_text):
         self.write_output_files(".txt", actual_text, expected_text)
 
diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py b/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py
index dfd6041..313e8f0 100644
--- a/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/controllers/test_result_writer_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -24,7 +23,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
 from webkitpy.layout_tests.controllers import test_result_writer
@@ -51,10 +50,6 @@
         driver_output1 = DriverOutput('text1', 'image1', 'imagehash1', 'audio1')
         driver_output2 = DriverOutput('text2', 'image2', 'imagehash2', 'audio2')
         failures = [test_failures.FailureReftestMismatch(test_reference_file)]
-        test_result_writer.write_test_result(host.filesystem, ImageDiffTestPort(host), test_name,
+        test_result_writer.write_test_result(host.filesystem, ImageDiffTestPort(host), port.results_directory(), test_name,
                                              driver_output1, driver_output2, failures)
         self.assertEqual([0], used_tolerance_values)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py b/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py
index f277c93..a635f6e 100644
--- a/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py
+++ b/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py
@@ -52,14 +52,13 @@
 
     def __init__(self, port, builder_name, build_name, build_number,
         results_file_base_path, builder_base_url,
-        test_timings, expectations, result_summary, all_tests,
+        expectations, run_results,
         test_results_server=None, test_type="", master_name=""):
         """Modifies the results.json file. Grabs it off the archive directory
         if it is not found locally.
 
         Args:
-          result_summary: ResultsSummary object storing the summary of the test
-              results.
+          run_results: TestRunResults object storing the details of the test run.
         """
         super(JSONLayoutResultsGenerator, self).__init__(
             port, builder_name, build_name, build_number, results_file_base_path,
@@ -68,10 +67,9 @@
 
         self._expectations = expectations
 
-        self._result_summary = result_summary
-        self._failures = dict((test_name, result_summary.results[test_name].type) for test_name in result_summary.failures)
-        self._all_tests = all_tests
-        self._test_timings = dict((test_tuple.test_name, test_tuple.test_run_time) for test_tuple in test_timings)
+        self._run_results = run_results
+        self._failures = dict((test_name, run_results.results_by_name[test_name].type) for test_name in run_results.failures_by_name)
+        self._test_timings = run_results.results_by_name
 
         self.generate_json_output()
 
@@ -99,7 +97,7 @@
     def _get_test_timing(self, test_name):
         if test_name in self._test_timings:
             # Floor for now to get time in seconds.
-            return int(self._test_timings[test_name])
+            return int(self._test_timings[test_name].test_run_time)
         return 0
 
     # override
@@ -108,7 +106,7 @@
 
     # override
     def _get_modifier_char(self, test_name):
-        if test_name not in self._all_tests:
+        if test_name not in self._run_results.results_by_name:
             return self.NO_DATA_RESULT
 
         if test_name in self._failures:
@@ -122,12 +120,12 @@
 
     # override
     def _insert_failure_summaries(self, results_for_builder):
-        summary = self._result_summary
+        run_results = self._run_results
 
         self._insert_item_into_raw_list(results_for_builder,
-            len((set(summary.failures.keys()) |
-                summary.tests_by_expectation[test_expectations.SKIP]) &
-                summary.tests_by_timeline[test_expectations.NOW]),
+            len((set(run_results.failures_by_name.keys()) |
+                run_results.tests_by_expectation[test_expectations.SKIP]) &
+                run_results.tests_by_timeline[test_expectations.NOW]),
             self.FIXABLE_COUNT)
         self._insert_item_into_raw_list(results_for_builder,
             self._get_failure_summary_entry(test_expectations.NOW),
@@ -154,23 +152,22 @@
         """Creates a summary object to insert into the JSON.
 
         Args:
-          summary   ResultSummary object with test results
           timeline  current test_expectations timeline to build entry for
                     (e.g., test_expectations.NOW, etc.)
         """
         entry = {}
-        summary = self._result_summary
-        timeline_tests = summary.tests_by_timeline[timeline]
+        run_results = self._run_results
+        timeline_tests = run_results.tests_by_timeline[timeline]
         entry[self.SKIP_RESULT] = len(
-            summary.tests_by_expectation[test_expectations.SKIP] &
+            run_results.tests_by_expectation[test_expectations.SKIP] &
             timeline_tests)
         entry[self.PASS_RESULT] = len(
-            summary.tests_by_expectation[test_expectations.PASS] &
+            run_results.tests_by_expectation[test_expectations.PASS] &
             timeline_tests)
-        for failure_type in summary.tests_by_expectation.keys():
+        for failure_type in run_results.tests_by_expectation.keys():
             if failure_type not in self.FAILURE_TO_CHAR:
                 continue
-            count = len(summary.tests_by_expectation[failure_type] &
+            count = len(run_results.tests_by_expectation[failure_type] &
                         timeline_tests)
             entry[self.FAILURE_TO_CHAR[failure_type]] = count
         return entry
diff --git a/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py b/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py
index 73834f0..a18bc99 100644
--- a/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py
+++ b/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py
@@ -526,11 +526,12 @@
         for (name, path) in self._svn_repositories:
             # Note: for JSON file's backward-compatibility we use 'chrome' rather
             # than 'chromium' here.
-            if name == 'chromium':
-                name = 'chrome'
+            lowercase_name = name.lower()
+            if lowercase_name == 'chromium':
+                lowercase_name = 'chrome'
             self._insert_item_into_raw_list(results_for_builder,
                 self._get_svn_revision(path),
-                name + 'Revision')
+                lowercase_name + 'Revision')
 
         self._insert_item_into_raw_list(results_for_builder,
             int(time.time()),
diff --git a/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py b/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py
index f04300f..ffd7f20 100644
--- a/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 import json
 import optparse
 import random
@@ -123,12 +123,12 @@
         # Aliasing to a short name for better access to its constants.
         JRG = json_results_generator.JSONResultsGeneratorBase
 
-        self.assertTrue(JRG.VERSION_KEY in json)
-        self.assertTrue(self.builder_name in json)
+        self.assertIn(JRG.VERSION_KEY, json)
+        self.assertIn(self.builder_name, json)
 
         buildinfo = json[self.builder_name]
-        self.assertTrue(JRG.FIXABLE in buildinfo)
-        self.assertTrue(JRG.TESTS in buildinfo)
+        self.assertIn(JRG.FIXABLE, buildinfo)
+        self.assertIn(JRG.TESTS, buildinfo)
         self.assertEqual(len(buildinfo[JRG.BUILD_NUMBERS]), num_runs)
         self.assertEqual(buildinfo[JRG.BUILD_NUMBERS][0], self.build_number)
 
@@ -181,7 +181,7 @@
         nodes = path.split("/")
         sub_trie = trie
         for node in nodes:
-            self.assertTrue(node in sub_trie)
+            self.assertIn(node, sub_trie)
             sub_trie = sub_trie[node]
         return sub_trie
 
@@ -229,7 +229,3 @@
         }
 
         self.assertEqual(json.dumps(trie), json.dumps(expected_trie))
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations.py b/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations.py
new file mode 100644
index 0000000..52aa7b9
--- /dev/null
+++ b/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations.py
@@ -0,0 +1,111 @@
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+import optparse
+import signal
+import traceback
+
+from webkitpy.common.host import Host
+from webkitpy.layout_tests.models import test_expectations
+from webkitpy.layout_tests.port import platform_options
+
+
+# This mirrors what the shell normally does.
+INTERRUPTED_EXIT_STATUS = signal.SIGINT + 128
+
+# This is a randomly chosen exit code that can be tested against to
+# indicate that an unexpected exception occurred.
+EXCEPTIONAL_EXIT_STATUS = 254
+
+_log = logging.getLogger(__name__)
+
+
+def lint(host, options, logging_stream):
+    logger = logging.getLogger()
+    logger.setLevel(logging.INFO)
+    handler = logging.StreamHandler(logging_stream)
+    logger.addHandler(handler)
+
+    try:
+        ports_to_lint = [host.port_factory.get(name) for name in host.port_factory.all_port_names(options.platform)]
+        files_linted = set()
+        lint_failed = False
+
+        for port_to_lint in ports_to_lint:
+            expectations_dict = port_to_lint.expectations_dict()
+
+            # FIXME: This won't work if multiple ports share a TestExpectations file but support different modifiers in the file.
+            for expectations_file in expectations_dict.keys():
+                if expectations_file in files_linted:
+                    continue
+
+                try:
+                    test_expectations.TestExpectations(port_to_lint,
+                        expectations_to_lint={expectations_file: expectations_dict[expectations_file]})
+                except test_expectations.ParseError as e:
+                    lint_failed = True
+                    _log.error('')
+                    for warning in e.warnings:
+                        _log.error(warning)
+                    _log.error('')
+                files_linted.add(expectations_file)
+
+        if lint_failed:
+            _log.error('Lint failed.')
+            return -1
+
+        _log.info('Lint succeeded.')
+        return 0
+    finally:
+        logger.removeHandler(handler)
+
+
+def main(argv, _, stderr):
+    parser = optparse.OptionParser(option_list=platform_options(use_globs=True))
+    options, _ = parser.parse_args(argv)
+
+    if options.platform and 'test' in options.platform:
+        # It's a bit lame to import mocks into real code, but this allows the user
+        # to run tests against the test platform interactively, which is useful for
+        # debugging test failures.
+        from webkitpy.common.host_mock import MockHost
+        host = MockHost()
+    else:
+        host = Host()
+
+    try:
+        exit_status = lint(host, options, stderr)
+    except KeyboardInterrupt:
+        exit_status = INTERRUPTED_EXIT_STATUS
+    except Exception as e:
+        print >> stderr, '\n%s raised: %s' % (e.__class__.__name__, str(e))
+        traceback.print_exc(file=stderr)
+        exit_status = EXCEPTIONAL_EXIT_STATUS
+
+    return exit_status
diff --git a/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py b/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py
new file mode 100644
index 0000000..4728029
--- /dev/null
+++ b/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py
@@ -0,0 +1,157 @@
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import optparse
+import StringIO
+import unittest2 as unittest
+
+from webkitpy.common.host_mock import MockHost
+from webkitpy.layout_tests import lint_test_expectations
+
+
+class FakePort(object):
+    def __init__(self, host, name, path):
+        self.host = host
+        self.name = name
+        self.path = path
+
+    def test_configuration(self):
+        return None
+
+    def expectations_dict(self):
+        self.host.ports_parsed.append(self.name)
+        return {self.path: ''}
+
+    def skipped_layout_tests(self, _):
+        return set([])
+
+    def all_test_configurations(self):
+        return []
+
+    def configuration_specifier_macros(self):
+        return []
+
+    def get_option(self, _, val):
+        return val
+
+    def path_to_generic_test_expectations_file(self):
+        return ''
+
+class FakeFactory(object):
+    def __init__(self, host, ports):
+        self.host = host
+        self.ports = {}
+        for port in ports:
+            self.ports[port.name] = port
+
+    def get(self, port_name, *args, **kwargs):  # pylint: disable=W0613,E0202
+        return self.ports[port_name]
+
+    def all_port_names(self, platform=None):  # pylint: disable=W0613,E0202
+        return sorted(self.ports.keys())
+
+
+class LintTest(unittest.TestCase):
+    def test_all_configurations(self):
+        host = MockHost()
+        host.ports_parsed = []
+        host.port_factory = FakeFactory(host, (FakePort(host, 'a', 'path-to-a'),
+                                               FakePort(host, 'b', 'path-to-b'),
+                                               FakePort(host, 'b-win', 'path-to-b')))
+
+        logging_stream = StringIO.StringIO()
+        options = optparse.Values({'platform': None})
+        res = lint_test_expectations.lint(host, options, logging_stream)
+        self.assertEqual(res, 0)
+        self.assertEqual(host.ports_parsed, ['a', 'b', 'b-win'])
+
+    def test_lint_test_files(self):
+        logging_stream = StringIO.StringIO()
+        options = optparse.Values({'platform': 'test-mac-leopard'})
+        host = MockHost()
+
+        # pylint appears to complain incorrectly about the method overrides pylint: disable=E0202,C0322
+        # FIXME: incorrect complaints about spacing pylint: disable=C0322
+        host.port_factory.all_port_names = lambda platform=None: [platform]
+
+        res = lint_test_expectations.lint(host, options, logging_stream)
+
+        self.assertEqual(res, 0)
+        self.assertIn('Lint succeeded', logging_stream.getvalue())
+
+    def test_lint_test_files__errors(self):
+        options = optparse.Values({'platform': 'test', 'debug_rwt_logging': False})
+        host = MockHost()
+
+        # FIXME: incorrect complaints about spacing pylint: disable=C0322
+        port = host.port_factory.get(options.platform, options=options)
+        port.expectations_dict = lambda: {'foo': '-- syntax error1', 'bar': '-- syntax error2'}
+
+        host.port_factory.get = lambda platform, options=None: port
+        host.port_factory.all_port_names = lambda platform=None: [port.name()]
+
+        logging_stream = StringIO.StringIO()
+
+        res = lint_test_expectations.lint(host, options, logging_stream)
+
+        self.assertEqual(res, -1)
+        self.assertIn('Lint failed', logging_stream.getvalue())
+        self.assertIn('foo:1', logging_stream.getvalue())
+        self.assertIn('bar:1', logging_stream.getvalue())
+
+
+class MainTest(unittest.TestCase):
+    def test_success(self):
+        orig_lint_fn = lint_test_expectations.lint
+
+        # unused args pylint: disable=W0613
+        def interrupting_lint(host, options, logging_stream):
+            raise KeyboardInterrupt
+
+        def successful_lint(host, options, logging_stream):
+            return 0
+
+        def exception_raising_lint(host, options, logging_stream):
+            assert False
+
+        stdout = StringIO.StringIO()
+        stderr = StringIO.StringIO()
+        try:
+            lint_test_expectations.lint = interrupting_lint
+            res = lint_test_expectations.main([], stdout, stderr)
+            self.assertEqual(res, lint_test_expectations.INTERRUPTED_EXIT_STATUS)
+
+            lint_test_expectations.lint = successful_lint
+            res = lint_test_expectations.main(['--platform', 'test'], stdout, stderr)
+            self.assertEqual(res, 0)
+
+            lint_test_expectations.lint = exception_raising_lint
+            res = lint_test_expectations.main([], stdout, stderr)
+            self.assertEqual(res, lint_test_expectations.EXCEPTIONAL_EXIT_STATUS)
+        finally:
+            lint_test_expectations.lint = orig_lint_fn
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/result_summary.py b/Tools/Scripts/webkitpy/layout_tests/models/result_summary.py
deleted file mode 100644
index 5bb5010..0000000
--- a/Tools/Scripts/webkitpy/layout_tests/models/result_summary.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-from webkitpy.layout_tests.models.test_expectations import TestExpectations, SKIP, CRASH, TIMEOUT
-
-
-class ResultSummary(object):
-    def __init__(self, expectations, test_files, iterations, expected_skips):
-        self.total = len(test_files) * iterations
-        self.remaining = self.total
-        self.expectations = expectations
-        self.expected = 0
-        self.unexpected = 0
-        self.unexpected_failures = 0
-        self.unexpected_crashes = 0
-        self.unexpected_timeouts = 0
-        self.total_tests_by_expectation = {}
-        self.tests_by_expectation = {}
-        self.tests_by_timeline = {}
-        self.results = {}
-        self.unexpected_results = {}
-        self.failures = {}
-        self.total_failures = 0
-        self.expected_skips = 0
-        self.total_tests_by_expectation[SKIP] = len(expected_skips)
-        self.tests_by_expectation[SKIP] = expected_skips
-        for expectation in TestExpectations.EXPECTATIONS.values():
-            self.tests_by_expectation[expectation] = set()
-            self.total_tests_by_expectation[expectation] = 0
-        for timeline in TestExpectations.TIMELINES.values():
-            self.tests_by_timeline[timeline] = expectations.get_tests_with_timeline(timeline)
-        self.slow_tests = set()
-
-    def add(self, test_result, expected, test_is_slow):
-        self.total_tests_by_expectation[test_result.type] += 1
-        self.tests_by_expectation[test_result.type].add(test_result.test_name)
-        self.results[test_result.test_name] = test_result
-        self.remaining -= 1
-        if len(test_result.failures):
-            self.total_failures += 1
-            self.failures[test_result.test_name] = test_result.failures
-        if expected:
-            self.expected += 1
-            if test_result.type == SKIP:
-                self.expected_skips += 1
-        else:
-            self.unexpected_results[test_result.test_name] = test_result
-            self.unexpected += 1
-            if len(test_result.failures):
-                self.unexpected_failures += 1
-            if test_result.type == CRASH:
-                self.unexpected_crashes += 1
-            elif test_result.type == TIMEOUT:
-                self.unexpected_timeouts += 1
-        if test_is_slow:
-            self.slow_tests.add(test_result.test_name)
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py b/Tools/Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py
index 5c43b6a..1a7d375 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.models.test_configuration import *
 
@@ -51,41 +51,41 @@
         result_config_dict = {}
         for category, specifier in config.items():
             result_config_dict[category] = specifier
-        self.assertEquals({'version': 'xp', 'architecture': 'x86', 'build_type': 'release'}, result_config_dict)
+        self.assertEqual({'version': 'xp', 'architecture': 'x86', 'build_type': 'release'}, result_config_dict)
 
     def test_keys(self):
         config = TestConfiguration('xp', 'x86', 'release')
         result_config_keys = []
         for category in config.keys():
             result_config_keys.append(category)
-        self.assertEquals(set(['version', 'architecture', 'build_type']), set(result_config_keys))
+        self.assertEqual(set(['version', 'architecture', 'build_type']), set(result_config_keys))
 
     def test_str(self):
         config = TestConfiguration('xp', 'x86', 'release')
-        self.assertEquals('<xp, x86, release>', str(config))
+        self.assertEqual('<xp, x86, release>', str(config))
 
     def test_repr(self):
         config = TestConfiguration('xp', 'x86', 'release')
-        self.assertEquals("TestConfig(version='xp', architecture='x86', build_type='release')", repr(config))
+        self.assertEqual("TestConfig(version='xp', architecture='x86', build_type='release')", repr(config))
 
     def test_hash(self):
         config_dict = {}
         config_dict[TestConfiguration('xp', 'x86', 'release')] = True
-        self.assertTrue(TestConfiguration('xp', 'x86', 'release') in config_dict)
+        self.assertIn(TestConfiguration('xp', 'x86', 'release'), config_dict)
         self.assertTrue(config_dict[TestConfiguration('xp', 'x86', 'release')])
 
         def query_unknown_key():
             return config_dict[TestConfiguration('xp', 'x86', 'debug')]
 
         self.assertRaises(KeyError, query_unknown_key)
-        self.assertTrue(TestConfiguration('xp', 'x86', 'release') in config_dict)
-        self.assertFalse(TestConfiguration('xp', 'x86', 'debug') in config_dict)
+        self.assertIn(TestConfiguration('xp', 'x86', 'release'), config_dict)
+        self.assertNotIn(TestConfiguration('xp', 'x86', 'debug'), config_dict)
         configs_list = [TestConfiguration('xp', 'x86', 'release'), TestConfiguration('xp', 'x86', 'debug'), TestConfiguration('xp', 'x86', 'debug')]
-        self.assertEquals(len(configs_list), 3)
-        self.assertEquals(len(set(configs_list)), 2)
+        self.assertEqual(len(configs_list), 3)
+        self.assertEqual(len(set(configs_list)), 2)
 
     def test_eq(self):
-        self.assertEquals(TestConfiguration('xp', 'x86', 'release'), TestConfiguration('xp', 'x86', 'release'))
+        self.assertEqual(TestConfiguration('xp', 'x86', 'release'), TestConfiguration('xp', 'x86', 'release'))
         self.assertNotEquals(TestConfiguration('xp', 'x86', 'release'), TestConfiguration('xp', 'x86', 'debug'))
 
     def test_values(self):
@@ -93,7 +93,7 @@
         result_config_values = []
         for value in config.values():
             result_config_values.append(value)
-        self.assertEquals(set(['xp', 'x86', 'release']), set(result_config_values))
+        self.assertEqual(set(['xp', 'x86', 'release']), set(result_config_values))
 
 
 class SpecifierSorterTest(unittest.TestCase):
@@ -103,48 +103,48 @@
 
     def test_init(self):
         sorter = SpecifierSorter()
-        self.assertEquals(sorter.category_for_specifier('control'), None)
+        self.assertIsNone(sorter.category_for_specifier('control'))
         sorter = SpecifierSorter(self._all_test_configurations)
-        self.assertEquals(sorter.category_for_specifier('xp'), 'version')
+        self.assertEqual(sorter.category_for_specifier('xp'), 'version')
         sorter = SpecifierSorter(self._all_test_configurations, MOCK_MACROS)
-        self.assertEquals(sorter.category_for_specifier('mac'), 'version')
+        self.assertEqual(sorter.category_for_specifier('mac'), 'version')
 
     def test_add_specifier(self):
         sorter = SpecifierSorter()
-        self.assertEquals(sorter.category_for_specifier('control'), None)
+        self.assertIsNone(sorter.category_for_specifier('control'))
         sorter.add_specifier('version', 'control')
-        self.assertEquals(sorter.category_for_specifier('control'), 'version')
+        self.assertEqual(sorter.category_for_specifier('control'), 'version')
         sorter.add_specifier('version', 'one')
-        self.assertEquals(sorter.category_for_specifier('one'), 'version')
+        self.assertEqual(sorter.category_for_specifier('one'), 'version')
         sorter.add_specifier('architecture', 'renaissance')
-        self.assertEquals(sorter.category_for_specifier('one'), 'version')
-        self.assertEquals(sorter.category_for_specifier('renaissance'), 'architecture')
+        self.assertEqual(sorter.category_for_specifier('one'), 'version')
+        self.assertEqual(sorter.category_for_specifier('renaissance'), 'architecture')
 
     def test_add_macros(self):
         sorter = SpecifierSorter(self._all_test_configurations)
         sorter.add_macros(MOCK_MACROS)
-        self.assertEquals(sorter.category_for_specifier('mac'), 'version')
-        self.assertEquals(sorter.category_for_specifier('win'), 'version')
-        self.assertEquals(sorter.category_for_specifier('x86'), 'architecture')
+        self.assertEqual(sorter.category_for_specifier('mac'), 'version')
+        self.assertEqual(sorter.category_for_specifier('win'), 'version')
+        self.assertEqual(sorter.category_for_specifier('x86'), 'architecture')
 
     def test_category_priority(self):
         sorter = SpecifierSorter(self._all_test_configurations)
-        self.assertEquals(sorter.category_priority('version'), 0)
-        self.assertEquals(sorter.category_priority('build_type'), 2)
+        self.assertEqual(sorter.category_priority('version'), 0)
+        self.assertEqual(sorter.category_priority('build_type'), 2)
 
     def test_specifier_priority(self):
         sorter = SpecifierSorter(self._all_test_configurations)
-        self.assertEquals(sorter.specifier_priority('x86'), 1)
-        self.assertEquals(sorter.specifier_priority('snowleopard'), 0)
+        self.assertEqual(sorter.specifier_priority('x86'), 1)
+        self.assertEqual(sorter.specifier_priority('snowleopard'), 0)
 
     def test_sort_specifiers(self):
         sorter = SpecifierSorter(self._all_test_configurations, MOCK_MACROS)
-        self.assertEquals(sorter.sort_specifiers(set()), [])
-        self.assertEquals(sorter.sort_specifiers(set(['x86'])), ['x86'])
-        self.assertEquals(sorter.sort_specifiers(set(['x86', 'win7'])), ['win7', 'x86'])
-        self.assertEquals(sorter.sort_specifiers(set(['x86', 'debug', 'win7'])), ['win7', 'x86', 'debug'])
-        self.assertEquals(sorter.sort_specifiers(set(['snowleopard', 'x86', 'debug', 'win7'])), ['snowleopard', 'win7', 'x86', 'debug'])
-        self.assertEquals(sorter.sort_specifiers(set(['x86', 'mac', 'debug', 'win7'])), ['mac', 'win7', 'x86', 'debug'])
+        self.assertEqual(sorter.sort_specifiers(set()), [])
+        self.assertEqual(sorter.sort_specifiers(set(['x86'])), ['x86'])
+        self.assertEqual(sorter.sort_specifiers(set(['x86', 'win7'])), ['win7', 'x86'])
+        self.assertEqual(sorter.sort_specifiers(set(['x86', 'debug', 'win7'])), ['win7', 'x86', 'debug'])
+        self.assertEqual(sorter.sort_specifiers(set(['snowleopard', 'x86', 'debug', 'win7'])), ['snowleopard', 'win7', 'x86', 'debug'])
+        self.assertEqual(sorter.sort_specifiers(set(['x86', 'mac', 'debug', 'win7'])), ['mac', 'win7', 'x86', 'debug'])
 
 
 class TestConfigurationConverterTest(unittest.TestCase):
@@ -153,28 +153,28 @@
         unittest.TestCase.__init__(self, testFunc)
 
     def test_symmetric_difference(self):
-        self.assertEquals(TestConfigurationConverter.symmetric_difference([set(['a', 'b']), set(['b', 'c'])]), set(['a', 'c']))
-        self.assertEquals(TestConfigurationConverter.symmetric_difference([set(['a', 'b']), set(['b', 'c']), set(['b', 'd'])]), set(['a', 'c', 'd']))
+        self.assertEqual(TestConfigurationConverter.symmetric_difference([set(['a', 'b']), set(['b', 'c'])]), set(['a', 'c']))
+        self.assertEqual(TestConfigurationConverter.symmetric_difference([set(['a', 'b']), set(['b', 'c']), set(['b', 'd'])]), set(['a', 'c', 'd']))
 
     def test_to_config_set(self):
         converter = TestConfigurationConverter(self._all_test_configurations)
 
-        self.assertEquals(converter.to_config_set(set()), self._all_test_configurations)
+        self.assertEqual(converter.to_config_set(set()), self._all_test_configurations)
 
-        self.assertEquals(converter.to_config_set(set(['foo'])), set())
+        self.assertEqual(converter.to_config_set(set(['foo'])), set())
 
-        self.assertEquals(converter.to_config_set(set(['xp', 'foo'])), set())
+        self.assertEqual(converter.to_config_set(set(['xp', 'foo'])), set())
 
         errors = []
-        self.assertEquals(converter.to_config_set(set(['xp', 'foo']), errors), set())
-        self.assertEquals(errors, ["Unrecognized modifier 'foo'"])
+        self.assertEqual(converter.to_config_set(set(['xp', 'foo']), errors), set())
+        self.assertEqual(errors, ["Unrecognized modifier 'foo'"])
 
-        self.assertEquals(converter.to_config_set(set(['xp', 'x86_64'])), set())
+        self.assertEqual(converter.to_config_set(set(['xp', 'x86_64'])), set())
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_config_set(set(['xp', 'release'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['xp', 'release'])), configs_to_match)
 
         configs_to_match = set([
             TestConfiguration('snowleopard', 'x86', 'release'),
@@ -184,13 +184,13 @@
             TestConfiguration('lucid', 'x86', 'release'),
             TestConfiguration('lucid', 'x86_64', 'release'),
        ])
-        self.assertEquals(converter.to_config_set(set(['release'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['release'])), configs_to_match)
 
         configs_to_match = set([
              TestConfiguration('lucid', 'x86_64', 'release'),
              TestConfiguration('lucid', 'x86_64', 'debug'),
         ])
-        self.assertEquals(converter.to_config_set(set(['x86_64'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['x86_64'])), configs_to_match)
 
         configs_to_match = set([
             TestConfiguration('lucid', 'x86_64', 'release'),
@@ -200,7 +200,7 @@
             TestConfiguration('snowleopard', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'debug'),
         ])
-        self.assertEquals(converter.to_config_set(set(['lucid', 'snowleopard'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['lucid', 'snowleopard'])), configs_to_match)
 
         configs_to_match = set([
             TestConfiguration('lucid', 'x86', 'release'),
@@ -208,14 +208,14 @@
             TestConfiguration('snowleopard', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'debug'),
         ])
-        self.assertEquals(converter.to_config_set(set(['lucid', 'snowleopard', 'x86'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['lucid', 'snowleopard', 'x86'])), configs_to_match)
 
         configs_to_match = set([
             TestConfiguration('lucid', 'x86_64', 'release'),
             TestConfiguration('lucid', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_config_set(set(['lucid', 'snowleopard', 'release'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['lucid', 'snowleopard', 'release'])), configs_to_match)
 
     def test_macro_expansion(self):
         converter = TestConfigurationConverter(self._all_test_configurations, MOCK_MACROS)
@@ -225,7 +225,7 @@
             TestConfiguration('vista', 'x86', 'release'),
             TestConfiguration('win7', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_config_set(set(['win', 'release'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['win', 'release'])), configs_to_match)
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -234,7 +234,7 @@
             TestConfiguration('lucid', 'x86', 'release'),
             TestConfiguration('lucid', 'x86_64', 'release'),
         ])
-        self.assertEquals(converter.to_config_set(set(['win', 'lucid', 'release'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['win', 'lucid', 'release'])), configs_to_match)
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -242,30 +242,30 @@
             TestConfiguration('win7', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_config_set(set(['win', 'mac', 'release'])), configs_to_match)
+        self.assertEqual(converter.to_config_set(set(['win', 'mac', 'release'])), configs_to_match)
 
     def test_to_specifier_lists(self):
         converter = TestConfigurationConverter(self._all_test_configurations, MOCK_MACROS)
 
-        self.assertEquals(converter.to_specifiers_list(set(self._all_test_configurations)), [[]])
-        self.assertEquals(converter.to_specifiers_list(set()), [])
+        self.assertEqual(converter.to_specifiers_list(set(self._all_test_configurations)), [[]])
+        self.assertEqual(converter.to_specifiers_list(set()), [])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['release', 'xp'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['release', 'xp'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
             TestConfiguration('xp', 'x86', 'debug'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['xp'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['xp'])])
 
         configs_to_match = set([
             TestConfiguration('lucid', 'x86_64', 'debug'),
             TestConfiguration('xp', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['release', 'xp']), set(['debug', 'x86_64', 'linux'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['release', 'xp']), set(['debug', 'x86_64', 'linux'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -275,7 +275,7 @@
             TestConfiguration('lucid', 'x86_64', 'debug'),
             TestConfiguration('lucid', 'x86', 'debug'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['release', 'xp']), set(['debug', 'linux'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['release', 'xp']), set(['debug', 'linux'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -285,13 +285,13 @@
             TestConfiguration('lucid', 'x86', 'release'),
             TestConfiguration('lucid', 'x86_64', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['release'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['release'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['xp', 'mac', 'release'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['xp', 'mac', 'release'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -300,26 +300,26 @@
             TestConfiguration('win7', 'x86', 'debug'),
             TestConfiguration('lucid', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['win7']), set(['release', 'linux', 'x86']), set(['release', 'xp', 'mac'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['win7']), set(['release', 'linux', 'x86']), set(['release', 'xp', 'mac'])])
 
     def test_macro_collapsing(self):
         macros = {'foo': ['bar', 'baz'], 'people': ['bob', 'alice', 'john']}
 
         specifiers_list = [set(['john', 'godzilla', 'bob', 'alice'])]
         TestConfigurationConverter.collapse_macros(macros, specifiers_list)
-        self.assertEquals(specifiers_list, [set(['people', 'godzilla'])])
+        self.assertEqual(specifiers_list, [set(['people', 'godzilla'])])
 
         specifiers_list = [set(['john', 'godzilla', 'alice'])]
         TestConfigurationConverter.collapse_macros(macros, specifiers_list)
-        self.assertEquals(specifiers_list, [set(['john', 'godzilla', 'alice', 'godzilla'])])
+        self.assertEqual(specifiers_list, [set(['john', 'godzilla', 'alice', 'godzilla'])])
 
         specifiers_list = [set(['bar', 'godzilla', 'baz', 'bob', 'alice', 'john'])]
         TestConfigurationConverter.collapse_macros(macros, specifiers_list)
-        self.assertEquals(specifiers_list, [set(['foo', 'godzilla', 'people'])])
+        self.assertEqual(specifiers_list, [set(['foo', 'godzilla', 'people'])])
 
         specifiers_list = [set(['bar', 'godzilla', 'baz', 'bob']), set(['bar', 'baz']), set(['people', 'alice', 'bob', 'john'])]
         TestConfigurationConverter.collapse_macros(macros, specifiers_list)
-        self.assertEquals(specifiers_list, [set(['bob', 'foo', 'godzilla']), set(['foo']), set(['people'])])
+        self.assertEqual(specifiers_list, [set(['bob', 'foo', 'godzilla']), set(['foo']), set(['people'])])
 
     def test_converter_macro_collapsing(self):
         converter = TestConfigurationConverter(self._all_test_configurations, MOCK_MACROS)
@@ -329,7 +329,7 @@
             TestConfiguration('vista', 'x86', 'release'),
             TestConfiguration('win7', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['win', 'release'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['win', 'release'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -338,7 +338,7 @@
             TestConfiguration('lucid', 'x86', 'release'),
             TestConfiguration('lucid', 'x86_64', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['win', 'linux', 'release'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['win', 'linux', 'release'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -346,7 +346,7 @@
             TestConfiguration('win7', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['win', 'mac', 'release'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['win', 'mac', 'release'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
@@ -354,16 +354,16 @@
             TestConfiguration('win7', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['win', 'mac', 'release'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['win', 'mac', 'release'])])
 
         configs_to_match = set([
             TestConfiguration('xp', 'x86', 'release'),
             TestConfiguration('vista', 'x86', 'release'),
             TestConfiguration('win7', 'x86', 'release'),
         ])
-        self.assertEquals(converter.to_specifiers_list(configs_to_match), [set(['win', 'release'])])
+        self.assertEqual(converter.to_specifiers_list(configs_to_match), [set(['win', 'release'])])
 
     def test_specifier_converter_access(self):
         specifier_sorter = TestConfigurationConverter(self._all_test_configurations, MOCK_MACROS).specifier_sorter()
-        self.assertEquals(specifier_sorter.category_for_specifier('snowleopard'), 'version')
-        self.assertEquals(specifier_sorter.category_for_specifier('mac'), 'version')
+        self.assertEqual(specifier_sorter.category_for_specifier('snowleopard'), 'version')
+        self.assertEqual(specifier_sorter.category_for_specifier('mac'), 'version')
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py b/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
index 2342596..f5c977e 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -330,6 +329,8 @@
             elif state == 'expectations':
                 if token in ('Rebaseline', 'Skip', 'Slow', 'WontFix'):
                     modifiers.append(token.upper())
+                elif token not in cls._expectation_tokens:
+                    warnings.append('Unrecognized expectation "%s"' % token)
                 else:
                     expectations.append(cls._expectation_tokens.get(token, token))
             elif state == 'name_found':
@@ -345,12 +346,12 @@
             elif state not in ('name_found', 'done'):
                 warnings.append('Missing a "]"')
 
-        if 'WONTFIX' in modifiers and 'SKIP' not in modifiers:
+        if 'WONTFIX' in modifiers and 'SKIP' not in modifiers and not expectations:
             modifiers.append('SKIP')
 
         if 'SKIP' in modifiers and expectations:
             # FIXME: This is really a semantic warning and shouldn't be here. Remove when we drop the old syntax.
-            warnings.append('A test marked Skip or WontFix must not have other expectations.')
+            warnings.append('A test marked Skip must not have other expectations.')
         elif not expectations:
             if 'SKIP' not in modifiers and 'REBASELINE' not in modifiers and 'SLOW' not in modifiers:
                 modifiers.append('SKIP')
@@ -755,7 +756,8 @@
                     'text': TEXT,
                     'timeout': TIMEOUT,
                     'crash': CRASH,
-                    'missing': MISSING}
+                    'missing': MISSING,
+                    'skip': SKIP}
 
     # (aggregated by category, pass/fail/skip, type)
     EXPECTATION_DESCRIPTIONS = {SKIP: 'skipped',
@@ -840,7 +842,7 @@
     # FIXME: This constructor does too much work. We should move the actual parsing of
     # the expectations into separate routines so that linting and handling overrides
     # can be controlled separately, and the constructor can be more of a no-op.
-    def __init__(self, port, tests=None, include_overrides=True, expectations_to_lint=None):
+    def __init__(self, port, tests=None, include_generic=True, include_overrides=True, expectations_to_lint=None):
         self._full_test_list = tests
         self._test_config = port.test_configuration()
         self._is_lint_mode = expectations_to_lint is not None
@@ -848,16 +850,32 @@
         self._parser = TestExpectationParser(port, tests, self._is_lint_mode)
         self._port = port
         self._skipped_tests_warnings = []
+        self._expectations = []
 
         expectations_dict = expectations_to_lint or port.expectations_dict()
-        self._expectations = self._parser.parse(expectations_dict.keys()[0], expectations_dict.values()[0])
-        self._add_expectations(self._expectations)
 
-        if len(expectations_dict) > 1 and include_overrides:
-            for name in expectations_dict.keys()[1:]:
-                expectations = self._parser.parse(name, expectations_dict[name])
+        expectations_dict_index = 0
+        # Populate generic expectations (if enabled by include_generic).
+        if port.path_to_generic_test_expectations_file() in expectations_dict:
+            if include_generic:
+                expectations = self._parser.parse(expectations_dict.keys()[expectations_dict_index], expectations_dict.values()[expectations_dict_index])
                 self._add_expectations(expectations)
                 self._expectations += expectations
+            expectations_dict_index += 1
+
+        # Populate default port expectations (always enabled).
+        if len(expectations_dict) > expectations_dict_index:
+            expectations = self._parser.parse(expectations_dict.keys()[expectations_dict_index], expectations_dict.values()[expectations_dict_index])
+            self._add_expectations(expectations)
+            self._expectations += expectations
+            expectations_dict_index += 1
+
+        # Populate override expectations (if enabled by include_overrides).
+        while len(expectations_dict) > expectations_dict_index and include_overrides:
+            expectations = self._parser.parse(expectations_dict.keys()[expectations_dict_index], expectations_dict.values()[expectations_dict_index])
+            self._add_expectations(expectations)
+            self._expectations += expectations
+            expectations_dict_index += 1
 
         # FIXME: move ignore_tests into port.skipped_layout_tests()
         self.add_skipped_tests(port.skipped_layout_tests(tests).union(set(port.get_option('ignore_tests', []))))
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py b/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py
index d78ae3f..966a4a6 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -84,7 +83,7 @@
         self._exp = TestExpectations(self._port, self.get_basic_tests(), expectations_to_lint=expectations_to_lint)
 
     def assert_exp(self, test, result):
-        self.assertEquals(self._exp.get_expectations(self.get_test(test)),
+        self.assertEqual(self._exp.get_expectations(self.get_test(test)),
                           set([result]))
 
     def assert_bad_expectations(self, expectations, overrides=None):
@@ -109,29 +108,29 @@
 
     def test_result_was_expected(self):
         # test basics
-        self.assertEquals(TestExpectations.result_was_expected(PASS, set([PASS]), test_needs_rebaselining=False, test_is_skipped=False), True)
-        self.assertEquals(TestExpectations.result_was_expected(FAIL, set([PASS]), test_needs_rebaselining=False, test_is_skipped=False), False)
+        self.assertEqual(TestExpectations.result_was_expected(PASS, set([PASS]), test_needs_rebaselining=False, test_is_skipped=False), True)
+        self.assertEqual(TestExpectations.result_was_expected(FAIL, set([PASS]), test_needs_rebaselining=False, test_is_skipped=False), False)
 
         # test handling of SKIPped tests and results
-        self.assertEquals(TestExpectations.result_was_expected(SKIP, set([CRASH]), test_needs_rebaselining=False, test_is_skipped=True), True)
-        self.assertEquals(TestExpectations.result_was_expected(SKIP, set([CRASH]), test_needs_rebaselining=False, test_is_skipped=False), False)
+        self.assertEqual(TestExpectations.result_was_expected(SKIP, set([CRASH]), test_needs_rebaselining=False, test_is_skipped=True), True)
+        self.assertEqual(TestExpectations.result_was_expected(SKIP, set([CRASH]), test_needs_rebaselining=False, test_is_skipped=False), False)
 
         # test handling of MISSING results and the REBASELINE modifier
-        self.assertEquals(TestExpectations.result_was_expected(MISSING, set([PASS]), test_needs_rebaselining=True, test_is_skipped=False), True)
-        self.assertEquals(TestExpectations.result_was_expected(MISSING, set([PASS]), test_needs_rebaselining=False, test_is_skipped=False), False)
+        self.assertEqual(TestExpectations.result_was_expected(MISSING, set([PASS]), test_needs_rebaselining=True, test_is_skipped=False), True)
+        self.assertEqual(TestExpectations.result_was_expected(MISSING, set([PASS]), test_needs_rebaselining=False, test_is_skipped=False), False)
 
     def test_remove_pixel_failures(self):
-        self.assertEquals(TestExpectations.remove_pixel_failures(set([FAIL])), set([FAIL]))
-        self.assertEquals(TestExpectations.remove_pixel_failures(set([PASS])), set([PASS]))
-        self.assertEquals(TestExpectations.remove_pixel_failures(set([IMAGE])), set([PASS]))
-        self.assertEquals(TestExpectations.remove_pixel_failures(set([FAIL])), set([FAIL]))
-        self.assertEquals(TestExpectations.remove_pixel_failures(set([PASS, IMAGE, CRASH])), set([PASS, CRASH]))
+        self.assertEqual(TestExpectations.remove_pixel_failures(set([FAIL])), set([FAIL]))
+        self.assertEqual(TestExpectations.remove_pixel_failures(set([PASS])), set([PASS]))
+        self.assertEqual(TestExpectations.remove_pixel_failures(set([IMAGE])), set([PASS]))
+        self.assertEqual(TestExpectations.remove_pixel_failures(set([FAIL])), set([FAIL]))
+        self.assertEqual(TestExpectations.remove_pixel_failures(set([PASS, IMAGE, CRASH])), set([PASS, CRASH]))
 
     def test_suffixes_for_expectations(self):
-        self.assertEquals(TestExpectations.suffixes_for_expectations(set([FAIL])), set(['txt', 'png', 'wav']))
-        self.assertEquals(TestExpectations.suffixes_for_expectations(set([IMAGE])), set(['png']))
-        self.assertEquals(TestExpectations.suffixes_for_expectations(set([FAIL, IMAGE, CRASH])), set(['txt', 'png', 'wav']))
-        self.assertEquals(TestExpectations.suffixes_for_expectations(set()), set())
+        self.assertEqual(TestExpectations.suffixes_for_expectations(set([FAIL])), set(['txt', 'png', 'wav']))
+        self.assertEqual(TestExpectations.suffixes_for_expectations(set([IMAGE])), set(['png']))
+        self.assertEqual(TestExpectations.suffixes_for_expectations(set([FAIL, IMAGE, CRASH])), set(['txt', 'png', 'wav']))
+        self.assertEqual(TestExpectations.suffixes_for_expectations(set()), set())
 
     def test_category_expectations(self):
         # This test checks unknown tests are not present in the
@@ -152,7 +151,7 @@
 
     def test_get_expectations_string(self):
         self.parse_exp(self.get_basic_expectations())
-        self.assertEquals(self._exp.get_expectations_string(
+        self.assertEqual(self._exp.get_expectations_string(
                           self.get_test('failures/expected/text.html')),
                           'FAIL')
 
@@ -261,9 +260,9 @@
         exp = TestExpectations(port, ['failures/expected/text.html'], expectations_to_lint=expectations_to_lint)
 
         # Check that the expectation is for BUG_DUMMY SKIP : ... [ Pass ]
-        self.assertEquals(exp.get_modifiers('failures/expected/text.html'),
+        self.assertEqual(exp.get_modifiers('failures/expected/text.html'),
                           [TestExpectationParser.DUMMY_BUG_MODIFIER, TestExpectationParser.SKIP_MODIFIER, TestExpectationParser.WONTFIX_MODIFIER])
-        self.assertEquals(exp.get_expectations('failures/expected/text.html'), set([PASS]))
+        self.assertEqual(exp.get_expectations('failures/expected/text.html'), set([PASS]))
 
     def test_skipped_tests_work(self):
         self.check(expectations='', overrides=None, skips=['failures/expected/text.html'])
@@ -317,13 +316,13 @@
         filename = 'TestExpectations'
         line_number = 1
         expectation_line = TestExpectationParser._tokenize_line(filename, line, line_number)
-        self.assertEquals(expectation_line.warnings, warnings)
-        self.assertEquals(expectation_line.name, name)
-        self.assertEquals(expectation_line.filename, filename)
-        self.assertEquals(expectation_line.line_number, line_number)
+        self.assertEqual(expectation_line.warnings, warnings)
+        self.assertEqual(expectation_line.name, name)
+        self.assertEqual(expectation_line.filename, filename)
+        self.assertEqual(expectation_line.line_number, line_number)
         if not warnings:
-            self.assertEquals(expectation_line.modifiers, modifiers)
-            self.assertEquals(expectation_line.expectations, expectations)
+            self.assertEqual(expectation_line.modifiers, modifiers)
+            self.assertEqual(expectation_line.expectations, expectations)
 
     def test_bare_name(self):
         self.assert_tokenize_exp('foo.html', modifiers=['SKIP'], expectations=['PASS'])
@@ -347,7 +346,7 @@
         self.assert_tokenize_exp('[ Foo ] foo.html ', modifiers=['Foo', 'SKIP'], expectations=['PASS'])
 
     def test_unknown_expectation(self):
-        self.assert_tokenize_exp('foo.html [ Audio ]', expectations=['Audio'])
+        self.assert_tokenize_exp('foo.html [ Audio ]', warnings=['Unrecognized expectation "Audio"'])
 
     def test_skip(self):
         self.assert_tokenize_exp('foo.html [ Skip ]', modifiers=['SKIP'], expectations=['PASS'])
@@ -357,6 +356,8 @@
 
     def test_wontfix(self):
         self.assert_tokenize_exp('foo.html [ WontFix ]', modifiers=['WONTFIX', 'SKIP'], expectations=['PASS'])
+        self.assert_tokenize_exp('foo.html [ WontFix ImageOnlyFailure ]', modifiers=['WONTFIX'], expectations=['IMAGE'])
+        self.assert_tokenize_exp('foo.html [ WontFix Pass Failure ]', modifiers=['WONTFIX'], expectations=['PASS', 'FAIL'])
 
     def test_blank_line(self):
         self.assert_tokenize_exp('', name=None)
@@ -378,7 +379,7 @@
             self.parse_exp('BUG1234 failures/expected/text.html [ Failure ]', is_lint_mode=True)
             self.fail('should have raised an error about a bad bug identifier')
         except ParseError, exp:
-            self.assertEquals(len(exp.warnings), 1)
+            self.assertEqual(len(exp.warnings), 1)
 
     def test_missing_bugid(self):
         self.parse_exp('failures/expected/text.html [ Failure ]')
@@ -389,19 +390,19 @@
         self.parse_exp('failures/expected/text.html [ Failure ]')
         line = self._exp._model.get_expectation_line('failures/expected/text.html')
         self.assertFalse(line.is_invalid())
-        self.assertEquals(line.warnings, ['Test lacks BUG modifier.'])
+        self.assertEqual(line.warnings, ['Test lacks BUG modifier.'])
 
     def test_skip_and_wontfix(self):
-        # Skip and WontFix are not allowed to have other expectations as well, because those
+        # Skip is not allowed to have other expectations as well, because those
         # expectations won't be exercised and may become stale .
         self.parse_exp('failures/expected/text.html [ Failure Skip ]')
         self.assertTrue(self._exp.has_warnings())
 
         self.parse_exp('failures/expected/text.html [ Crash WontFix ]')
-        self.assertTrue(self._exp.has_warnings())
+        self.assertFalse(self._exp.has_warnings())
 
         self.parse_exp('failures/expected/text.html [ Pass WontFix ]')
-        self.assertTrue(self._exp.has_warnings())
+        self.assertFalse(self._exp.has_warnings())
 
     def test_slow_and_timeout(self):
         # A test cannot be SLOW and expected to TIMEOUT.
@@ -692,11 +693,12 @@
         add_line(set([TestConfiguration('xp', 'x86', 'release')]), True)
         add_line(set([TestConfiguration('xp', 'x86', 'release'), TestConfiguration('xp', 'x86', 'debug')]), False)
         serialized = TestExpectations.list_to_string(lines, self._converter)
-        self.assertEquals(serialized, "Bug(x) [ XP Release ] Yay [ ImageOnlyFailure ]\nBug(x) [ XP ] Yay [ ImageOnlyFailure ]")
+        self.assertEqual(serialized, "Bug(x) [ XP Release ] Yay [ ImageOnlyFailure ]\nBug(x) [ XP ] Yay [ ImageOnlyFailure ]")
         serialized = TestExpectations.list_to_string(lines, self._converter, reconstitute_only_these=reconstitute_only_these)
-        self.assertEquals(serialized, "Bug(x) [ XP Release ] Yay [ ImageOnlyFailure ]\nNay")
+        self.assertEqual(serialized, "Bug(x) [ XP Release ] Yay [ ImageOnlyFailure ]\nNay")
 
-    def test_string_whitespace_stripping(self):
+    def disabled_test_string_whitespace_stripping(self):
+        # FIXME: Re-enable this test once we rework the code to no longer support the old syntax.
         self.assert_round_trip('\n', '')
         self.assert_round_trip('  [ FOO ] bar [ BAZ ]', '[ FOO ] bar [ BAZ ]')
         self.assert_round_trip('[ FOO ]    bar [ BAZ ]', '[ FOO ] bar [ BAZ ]')
@@ -704,7 +706,3 @@
         self.assert_round_trip('[ FOO ] bar [        BAZ ]  # Qux.', '[ FOO ] bar [ BAZ ] # Qux.')
         self.assert_round_trip('[ FOO ]       bar [    BAZ ]  # Qux.', '[ FOO ] bar [ BAZ ] # Qux.')
         self.assert_round_trip('[ FOO ]       bar     [    BAZ ]  # Qux.', '[ FOO ] bar [ BAZ ] # Qux.')
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_failures.py b/Tools/Scripts/webkitpy/layout_tests/models/test_failures.py
index 402b30a..52b7208 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_failures.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_failures.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_failures_unittest.py b/Tools/Scripts/webkitpy/layout_tests/models/test_failures_unittest.py
index 1c8f029..ea9a2e8 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_failures_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_failures_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.models.test_failures import *
 
@@ -36,7 +36,7 @@
         failure_obj = cls()
         s = failure_obj.dumps()
         new_failure_obj = TestFailure.loads(s)
-        self.assertTrue(isinstance(new_failure_obj, cls))
+        self.assertIsInstance(new_failure_obj, cls)
 
         self.assertEqual(failure_obj, new_failure_obj)
 
@@ -69,5 +69,5 @@
         self.assertEqual(len(crash_set), 2)
 
     def test_crashes(self):
-        self.assertEquals(FailureCrash().message(), 'DumpRenderTree crashed')
-        self.assertEquals(FailureCrash(process_name='foo', pid=1234).message(), 'foo crashed [pid=1234]')
+        self.assertEqual(FailureCrash().message(), 'DumpRenderTree crashed')
+        self.assertEqual(FailureCrash(process_name='foo', pid=1234).message(), 'foo crashed [pid=1234]')
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_input.py b/Tools/Scripts/webkitpy/layout_tests/models/test_input.py
index 56f2d52..58c84ab 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_input.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_input.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 #
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_results.py b/Tools/Scripts/webkitpy/layout_tests/models/test_results.py
index 6b9db55..d6fd10b 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_results.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_results.py
@@ -38,15 +38,24 @@
     def loads(string):
         return cPickle.loads(string)
 
-    def __init__(self, test_name, failures=None, test_run_time=None, has_stderr=False, reftest_type=[]):
+    def __init__(self, test_name, failures=None, test_run_time=None, has_stderr=False, reftest_type=None, pid=None, references=None):
         self.test_name = test_name
         self.failures = failures or []
-        self.test_run_time = test_run_time or 0
+        self.test_run_time = test_run_time or 0  # The time taken to execute the test itself.
         self.has_stderr = has_stderr
-        self.reftest_type = reftest_type
+        self.reftest_type = reftest_type or []
+        self.pid = pid
+        self.references = references or []
+
         # FIXME: Setting this in the constructor makes this class hard to mutate.
         self.type = test_failures.determine_result_type(failures)
 
+        # These are set by the worker, not by the driver, so they are not passed to the constructor.
+        self.worker_name = ''
+        self.shard_name = ''
+        self.total_run_time = 0  # The time taken to run the test plus any references, compute diffs, etc.
+        self.test_number = None
+
     def __eq__(self, other):
         return (self.test_name == other.test_name and
                 self.failures == other.failures and
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_results_unittest.py b/Tools/Scripts/webkitpy/layout_tests/models/test_results_unittest.py
index 80d8a47..e1bb2f2 100644
--- a/Tools/Scripts/webkitpy/layout_tests/models/test_results_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_results_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.models.test_results import TestResult
 
@@ -44,7 +44,7 @@
                             test_run_time=1.1)
         s = result.dumps()
         new_result = TestResult.loads(s)
-        self.assertTrue(isinstance(new_result, TestResult))
+        self.assertIsInstance(new_result, TestResult)
 
         self.assertEqual(new_result, result)
 
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_run_results.py b/Tools/Scripts/webkitpy/layout_tests/models/test_run_results.py
new file mode 100644
index 0000000..3af1224
--- /dev/null
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_run_results.py
@@ -0,0 +1,260 @@
+# Copyright (C) 2010 Google Inc. All rights reserved.
+# Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+
+from webkitpy.layout_tests.models import test_expectations
+from webkitpy.layout_tests.models import test_failures
+
+
+_log = logging.getLogger(__name__)
+
+
+class TestRunResults(object):
+    def __init__(self, expectations, num_tests):
+        self.total = num_tests
+        self.remaining = self.total
+        self.expectations = expectations
+        self.expected = 0
+        self.unexpected = 0
+        self.unexpected_failures = 0
+        self.unexpected_crashes = 0
+        self.unexpected_timeouts = 0
+        self.tests_by_expectation = {}
+        self.tests_by_timeline = {}
+        self.results_by_name = {}  # Map of test name to the last result for the test.
+        self.all_results = []  # All results from a run, including every iteration of every test.
+        self.unexpected_results_by_name = {}
+        self.failures_by_name = {}
+        self.total_failures = 0
+        self.expected_skips = 0
+        for expectation in test_expectations.TestExpectations.EXPECTATIONS.values():
+            self.tests_by_expectation[expectation] = set()
+        for timeline in test_expectations.TestExpectations.TIMELINES.values():
+            self.tests_by_timeline[timeline] = expectations.get_tests_with_timeline(timeline)
+        self.slow_tests = set()
+        self.interrupted = False
+
+    def add(self, test_result, expected, test_is_slow):
+        self.tests_by_expectation[test_result.type].add(test_result.test_name)
+        self.results_by_name[test_result.test_name] = test_result
+        if test_result.type != test_expectations.SKIP:
+            self.all_results.append(test_result)
+        self.remaining -= 1
+        if len(test_result.failures):
+            self.total_failures += 1
+            self.failures_by_name[test_result.test_name] = test_result.failures
+        if expected:
+            self.expected += 1
+            if test_result.type == test_expectations.SKIP:
+                self.expected_skips += 1
+        else:
+            self.unexpected_results_by_name[test_result.test_name] = test_result
+            self.unexpected += 1
+            if len(test_result.failures):
+                self.unexpected_failures += 1
+            if test_result.type == test_expectations.CRASH:
+                self.unexpected_crashes += 1
+            elif test_result.type == test_expectations.TIMEOUT:
+                self.unexpected_timeouts += 1
+        if test_is_slow:
+            self.slow_tests.add(test_result.test_name)
+
+
+class RunDetails(object):
+    def __init__(self, exit_code, summarized_results=None, initial_results=None, retry_results=None, enabled_pixel_tests_in_retry=False):
+        self.exit_code = exit_code
+        self.summarized_results = summarized_results
+        self.initial_results = initial_results
+        self.retry_results = retry_results
+        self.enabled_pixel_tests_in_retry = enabled_pixel_tests_in_retry
+
+
+def _interpret_test_failures(failures):
+    test_dict = {}
+    failure_types = [type(failure) for failure in failures]
+    # FIXME: get rid of all this is_* values once there is a 1:1 map between
+    # TestFailure type and test_expectations.EXPECTATION.
+    if test_failures.FailureMissingAudio in failure_types:
+        test_dict['is_missing_audio'] = True
+
+    if test_failures.FailureMissingResult in failure_types:
+        test_dict['is_missing_text'] = True
+
+    if test_failures.FailureMissingImage in failure_types or test_failures.FailureMissingImageHash in failure_types:
+        test_dict['is_missing_image'] = True
+
+    if 'image_diff_percent' not in test_dict:
+        for failure in failures:
+            if isinstance(failure, test_failures.FailureImageHashMismatch) or isinstance(failure, test_failures.FailureReftestMismatch):
+                test_dict['image_diff_percent'] = failure.diff_percent
+
+    return test_dict
+
+
+def summarize_results(port_obj, expectations, initial_results, retry_results, enabled_pixel_tests_in_retry):
+    """Returns a dictionary containing a summary of the test runs, with the following fields:
+        'version': a version indicator
+        'fixable': The number of fixable tests (NOW - PASS)
+        'skipped': The number of skipped tests (NOW & SKIPPED)
+        'num_regressions': The number of non-flaky failures
+        'num_flaky': The number of flaky failures
+        'num_missing': The number of tests with missing results
+        'num_passes': The number of unexpected passes
+        'tests': a dict of tests -> {'expected': '...', 'actual': '...'}
+    """
+    results = {}
+    results['version'] = 3
+
+    tbe = initial_results.tests_by_expectation
+    tbt = initial_results.tests_by_timeline
+    results['fixable'] = len(tbt[test_expectations.NOW] - tbe[test_expectations.PASS])
+    results['skipped'] = len(tbt[test_expectations.NOW] & tbe[test_expectations.SKIP])
+
+    num_passes = 0
+    num_flaky = 0
+    num_missing = 0
+    num_regressions = 0
+    keywords = {}
+    for expecation_string, expectation_enum in test_expectations.TestExpectations.EXPECTATIONS.iteritems():
+        keywords[expectation_enum] = expecation_string.upper()
+
+    for modifier_string, modifier_enum in test_expectations.TestExpectations.MODIFIERS.iteritems():
+        keywords[modifier_enum] = modifier_string.upper()
+
+    tests = {}
+
+    for test_name, result in initial_results.results_by_name.iteritems():
+        # Note that if a test crashed in the original run, we ignore
+        # whether or not it crashed when we retried it (if we retried it),
+        # and always consider the result not flaky.
+        expected = expectations.get_expectations_string(test_name)
+        result_type = result.type
+        actual = [keywords[result_type]]
+
+        if result_type == test_expectations.SKIP:
+            continue
+
+        test_dict = {}
+        if result.has_stderr:
+            test_dict['has_stderr'] = True
+
+        if result.reftest_type:
+            test_dict.update(reftest_type=list(result.reftest_type))
+
+        if expectations.has_modifier(test_name, test_expectations.WONTFIX):
+            test_dict['wontfix'] = True
+
+        if result_type == test_expectations.PASS:
+            num_passes += 1
+            # FIXME: include passing tests that have stderr output.
+            if expected == 'PASS':
+                continue
+        elif result_type == test_expectations.CRASH:
+            if test_name in initial_results.unexpected_results_by_name:
+                num_regressions += 1
+        elif result_type == test_expectations.MISSING:
+            if test_name in initial_results.unexpected_results_by_name:
+                num_missing += 1
+        elif test_name in initial_results.unexpected_results_by_name:
+            if retry_results and test_name not in retry_results.unexpected_results_by_name:
+                actual.extend(expectations.get_expectations_string(test_name).split(" "))
+                num_flaky += 1
+            elif retry_results:
+                retry_result_type = retry_results.unexpected_results_by_name[test_name].type
+                if result_type != retry_result_type:
+                    if enabled_pixel_tests_in_retry and result_type == test_expectations.TEXT and retry_result_type == test_expectations.IMAGE_PLUS_TEXT:
+                        num_regressions += 1
+                    else:
+                        num_flaky += 1
+                    actual.append(keywords[retry_result_type])
+                else:
+                    num_regressions += 1
+            else:
+                num_regressions += 1
+
+        test_dict['expected'] = expected
+        test_dict['actual'] = " ".join(actual)
+
+        test_dict.update(_interpret_test_failures(result.failures))
+
+        if retry_results:
+            retry_result = retry_results.unexpected_results_by_name.get(test_name)
+            if retry_result:
+                test_dict.update(_interpret_test_failures(retry_result.failures))
+
+        # Store test hierarchically by directory. e.g.
+        # foo/bar/baz.html: test_dict
+        # foo/bar/baz1.html: test_dict
+        #
+        # becomes
+        # foo: {
+        #     bar: {
+        #         baz.html: test_dict,
+        #         baz1.html: test_dict
+        #     }
+        # }
+        parts = test_name.split('/')
+        current_map = tests
+        for i, part in enumerate(parts):
+            if i == (len(parts) - 1):
+                current_map[part] = test_dict
+                break
+            if part not in current_map:
+                current_map[part] = {}
+            current_map = current_map[part]
+
+    results['tests'] = tests
+    results['num_passes'] = num_passes
+    results['num_flaky'] = num_flaky
+    results['num_missing'] = num_missing
+    results['num_regressions'] = num_regressions
+    results['uses_expectations_file'] = port_obj.uses_test_expectations_file()
+    results['interrupted'] = initial_results.interrupted  # Does results.html have enough information to compute this itself? (by checking total number of results vs. total number of tests?)
+    results['layout_tests_dir'] = port_obj.layout_tests_dir()
+    results['has_wdiff'] = port_obj.wdiff_available()
+    results['has_pretty_patch'] = port_obj.pretty_patch_available()
+    results['pixel_tests_enabled'] = port_obj.get_option('pixel_tests')
+
+    try:
+        # We only use the svn revision for using trac links in the results.html file,
+        # Don't do this by default since it takes >100ms.
+        # FIXME: Do we really need to populate this both here and in the json_results_generator?
+        if port_obj.get_option("builder_name"):
+            port_obj.host.initialize_scm()
+            results['revision'] = port_obj.host.scm().head_svn_revision()
+    except Exception, e:
+        _log.warn("Failed to determine svn revision for checkout (cwd: %s, webkit_base: %s), leaving 'revision' key blank in full_results.json.\n%s" % (port_obj._filesystem.getcwd(), port_obj.path_from_webkit_base(), e))
+        # Handle cases where we're running outside of version control.
+        import traceback
+        _log.debug('Failed to learn head svn revision:')
+        _log.debug(traceback.format_exc())
+        results['revision'] = ""
+
+    return results
diff --git a/Tools/Scripts/webkitpy/layout_tests/models/test_run_results_unittest.py b/Tools/Scripts/webkitpy/layout_tests/models/test_run_results_unittest.py
new file mode 100644
index 0000000..c0d9265
--- /dev/null
+++ b/Tools/Scripts/webkitpy/layout_tests/models/test_run_results_unittest.py
@@ -0,0 +1,135 @@
+# Copyright (C) 2010 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest2 as unittest
+
+from webkitpy.common.host_mock import MockHost
+from webkitpy.layout_tests.models import test_expectations
+from webkitpy.layout_tests.models import test_failures
+from webkitpy.layout_tests.models import test_results
+from webkitpy.layout_tests.models import test_run_results
+
+
+def get_result(test_name, result_type=test_expectations.PASS, run_time=0):
+    failures = []
+    if result_type == test_expectations.TIMEOUT:
+        failures = [test_failures.FailureTimeout()]
+    elif result_type == test_expectations.AUDIO:
+        failures = [test_failures.FailureAudioMismatch()]
+    elif result_type == test_expectations.CRASH:
+        failures = [test_failures.FailureCrash()]
+    return test_results.TestResult(test_name, failures=failures, test_run_time=run_time)
+
+
+def run_results(port):
+    tests = ['passes/text.html', 'failures/expected/timeout.html', 'failures/expected/crash.html', 'failures/expected/hang.html',
+             'failures/expected/audio.html']
+    expectations = test_expectations.TestExpectations(port, tests)
+    return test_run_results.TestRunResults(expectations, len(tests))
+
+
+def summarized_results(port, expected, passing, flaky):
+    test_is_slow = False
+
+    initial_results = run_results(port)
+    if expected:
+        initial_results.add(get_result('passes/text.html', test_expectations.PASS), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/audio.html', test_expectations.AUDIO), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/timeout.html', test_expectations.TIMEOUT), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/crash.html', test_expectations.CRASH), expected, test_is_slow)
+    elif passing:
+        initial_results.add(get_result('passes/text.html'), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/audio.html'), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/timeout.html'), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/crash.html'), expected, test_is_slow)
+    else:
+        initial_results.add(get_result('passes/text.html', test_expectations.TIMEOUT), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/audio.html', test_expectations.AUDIO), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/timeout.html', test_expectations.CRASH), expected, test_is_slow)
+        initial_results.add(get_result('failures/expected/crash.html', test_expectations.TIMEOUT), expected, test_is_slow)
+
+        # we only list hang.html here, since normally this is WontFix
+        initial_results.add(get_result('failures/expected/hang.html', test_expectations.TIMEOUT), expected, test_is_slow)
+
+    if flaky:
+        retry_results = run_results(port)
+        retry_results.add(get_result('passes/text.html'), True, test_is_slow)
+        retry_results.add(get_result('failures/expected/timeout.html'), True, test_is_slow)
+        retry_results.add(get_result('failures/expected/crash.html'), True, test_is_slow)
+    else:
+        retry_results = None
+
+    return test_run_results.summarize_results(port, initial_results.expectations, initial_results, retry_results, enabled_pixel_tests_in_retry=False)
+
+
+class InterpretTestFailuresTest(unittest.TestCase):
+    def setUp(self):
+        host = MockHost()
+        self.port = host.port_factory.get(port_name='test')
+
+    def test_interpret_test_failures(self):
+        test_dict = test_run_results._interpret_test_failures([test_failures.FailureImageHashMismatch(diff_percent=0.42)])
+        self.assertEqual(test_dict['image_diff_percent'], 0.42)
+
+        test_dict = test_run_results._interpret_test_failures([test_failures.FailureReftestMismatch(self.port.abspath_for_test('foo/reftest-expected.html'))])
+        self.assertIn('image_diff_percent', test_dict)
+
+        test_dict = test_run_results._interpret_test_failures([test_failures.FailureReftestMismatchDidNotOccur(self.port.abspath_for_test('foo/reftest-expected-mismatch.html'))])
+        self.assertEqual(len(test_dict), 0)
+
+        test_dict = test_run_results._interpret_test_failures([test_failures.FailureMissingAudio()])
+        self.assertIn('is_missing_audio', test_dict)
+
+        test_dict = test_run_results._interpret_test_failures([test_failures.FailureMissingResult()])
+        self.assertIn('is_missing_text', test_dict)
+
+        test_dict = test_run_results._interpret_test_failures([test_failures.FailureMissingImage()])
+        self.assertIn('is_missing_image', test_dict)
+
+        test_dict = test_run_results._interpret_test_failures([test_failures.FailureMissingImageHash()])
+        self.assertIn('is_missing_image', test_dict)
+
+
+class SummarizedResultsTest(unittest.TestCase):
+    def setUp(self):
+        host = MockHost(initialize_scm_by_default=False)
+        self.port = host.port_factory.get(port_name='test')
+
+    def test_no_svn_revision(self):
+        summary = summarized_results(self.port, expected=False, passing=False, flaky=False)
+        self.assertNotIn('revision', summary)
+
+    def test_svn_revision(self):
+        self.port._options.builder_name = 'dummy builder'
+        summary = summarized_results(self.port, expected=False, passing=False, flaky=False)
+        self.assertNotEquals(summary['revision'], '')
+
+    def test_summarized_results_wontfix(self):
+        self.port._options.builder_name = 'dummy builder'
+        summary = summarized_results(self.port, expected=False, passing=False, flaky=False)
+        self.assertTrue(summary['tests']['failures']['expected']['hang.html']['wontfix'])
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/__init__.py b/Tools/Scripts/webkitpy/layout_tests/port/__init__.py
index 6365b4c..b2a5084 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/__init__.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/apple.py b/Tools/Scripts/webkitpy/layout_tests/port/apple.py
index 4b97f41..9290bca 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/apple.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/apple.py
@@ -49,19 +49,27 @@
     # It's possible that Apple would want to fix this code to work better with those results.
     FUTURE_VERSION = 'future'  # FIXME: This whole 'future' thing feels like a hack.
 
+    # overridden in subclasses
+    VERSION_FALLBACK_ORDER = []
+    ARCHITECTURES = []
+
     @classmethod
     def determine_full_port_name(cls, host, options, port_name):
-        # If the port_name matches the (badly named) cls.port_name, that
-        # means that they passed 'mac' or 'win' and didn't specify a version.
-        # That convention means that we're supposed to use the version currently
-        # being run, so this won't work if you're not on mac or win (respectively).
-        # If you're not on the o/s in question, you must specify a full version or -future (cf. above).
-        if port_name == cls.port_name:
-            assert port_name == host.platform.os_name
-            return cls.port_name + '-' + host.platform.os_version
-        if port_name == cls.port_name + '-wk2':
-            assert port_name == host.platform.os_name + '-wk2'
-            return cls.port_name + '-' + host.platform.os_version + '-wk2'
+        options = options or {}
+        if port_name in (cls.port_name, cls.port_name + '-wk2'):
+            # If the port_name matches the (badly named) cls.port_name, that
+            # means that they passed 'mac' or 'win' and didn't specify a version.
+            # That convention means that we're supposed to use the version currently
+            # being run, so this won't work if you're not on mac or win (respectively).
+            # If you're not on the o/s in question, you must specify a full version or -future (cf. above).
+            assert host.platform.os_name in port_name, "%s is not in %s!" % (host.platform.os_name, port_name)
+            if port_name == cls.port_name and not getattr(options, 'webkit_test_runner', False):
+                port_name = cls.port_name + '-' + host.platform.os_version
+            else:
+                port_name = cls.port_name + '-' + host.platform.os_version + '-wk2'
+        elif getattr(options, 'webkit_test_runner', False) and  '-wk2' not in port_name:
+            port_name += '-wk2'
+
         return port_name
 
     def _strip_port_name_prefix(self, port_name):
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/base.py b/Tools/Scripts/webkitpy/layout_tests/port/base.py
old mode 100755
new mode 100644
index ea1e9d0..0811c9f
--- a/Tools/Scripts/webkitpy/layout_tests/port/base.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/base.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -54,6 +53,7 @@
 from webkitpy.common.system import path
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.common.system.systemhost import SystemHost
+from webkitpy.common.webkit_finder import WebKitFinder
 from webkitpy.layout_tests.models.test_configuration import TestConfiguration
 from webkitpy.layout_tests.port import config as port_config
 from webkitpy.layout_tests.port import driver
@@ -88,15 +88,17 @@
     def determine_full_port_name(cls, host, options, port_name):
         """Return a fully-specified port name that can be used to construct objects."""
         # Subclasses will usually override this.
-        return cls.port_name
+        options = options or {}
+        assert port_name.startswith(cls.port_name)
+        if getattr(options, 'webkit_test_runner', False) and not '-wk2' in port_name:
+            return port_name + '-wk2'
+        return port_name
 
-    def __init__(self, host, port_name=None, options=None, config=None, **kwargs):
+    def __init__(self, host, port_name, options=None, **kwargs):
 
         # This value may be different from cls.port_name by having version modifiers
         # and other fields appended to it (for example, 'qt-arm' or 'mac-wk2').
-
-        # FIXME: port_name should be a required parameter. It isn't yet because lots of tests need to be updatd.
-        self._name = port_name or self.port_name
+        self._name = port_name
 
         # These are default values that should be overridden in a subclasses.
         self._version = ''
@@ -107,10 +109,14 @@
         # options defined on it.
         self._options = options or optparse.Values()
 
+        if self._name and '-wk2' in self._name:
+            self._options.webkit_test_runner = True
+
         self.host = host
         self._executive = host.executive
         self._filesystem = host.filesystem
-        self._config = config or port_config.Config(self._executive, self._filesystem, self.port_name)
+        self._webkit_finder = WebKitFinder(host.filesystem)
+        self._config = port_config.Config(self._executive, self._filesystem, self.port_name)
 
         self._helper = None
         self._http_server = None
@@ -148,6 +154,9 @@
     def additional_drt_flag(self):
         return []
 
+    def supports_per_test_timeout(self):
+        return False
+
     def default_pixel_tests(self):
         # FIXME: Disable until they are run by default on build.webkit.org.
         return False
@@ -571,12 +580,14 @@
                         reftest_list.append((expectation, path))
             return reftest_list
 
-        return reftest_list.get(self._filesystem.join(self.layout_tests_dir(), test_name), [])
+        return reftest_list.get(self._filesystem.join(self.layout_tests_dir(), test_name), [])  # pylint: disable=E1103
 
     def tests(self, paths):
         """Return the list of tests found. Both generic and platform-specific tests matching paths should be returned."""
         expanded_paths = self._expanded_paths(paths)
-        return self._real_tests(expanded_paths).union(self._virtual_tests(expanded_paths, self.populated_virtual_test_suites()))
+        tests = self._real_tests(expanded_paths)
+        tests.extend(self._virtual_tests(expanded_paths, self.populated_virtual_test_suites()))
+        return tests
 
     def _expanded_paths(self, paths):
         expanded_paths = []
@@ -594,16 +605,17 @@
     def _real_tests(self, paths):
         # When collecting test cases, skip these directories
         skipped_directories = set(['.svn', '_svn', 'resources', 'script-tests', 'reference', 'reftest'])
-        files = find_files.find(self._filesystem, self.layout_tests_dir(), paths, skipped_directories, Port._is_test_file)
-        return set([self.relative_test_filename(f) for f in files])
+        files = find_files.find(self._filesystem, self.layout_tests_dir(), paths, skipped_directories, Port._is_test_file, self.test_key)
+        return [self.relative_test_filename(f) for f in files]
 
     # When collecting test cases, we include any file with these extensions.
     _supported_file_extensions = set(['.html', '.shtml', '.xml', '.xhtml', '.pl',
                                       '.htm', '.php', '.svg', '.mht'])
 
     @staticmethod
+    # If any changes are made here be sure to update the isUsedInReftest method in old-run-webkit-tests as well.
     def is_reference_html_file(filesystem, dirname, filename):
-        if filename.startswith('ref-') or filename.endswith('notref-'):
+        if filename.startswith('ref-') or filename.startswith('notref-'):
             return True
         filename_wihout_ext, unused = filesystem.splitext(filename)
         for suffix in ['-expected', '-expected-mismatch', '-ref', '-notref']:
@@ -621,6 +633,31 @@
     def _is_test_file(filesystem, dirname, filename):
         return Port._has_supported_extension(filesystem, filename) and not Port.is_reference_html_file(filesystem, dirname, filename)
 
+    def test_key(self, test_name):
+        """Turns a test name into a list with two sublists, the natural key of the
+        dirname, and the natural key of the basename.
+
+        This can be used when sorting paths so that files in a directory.
+        directory are kept together rather than being mixed in with files in
+        subdirectories."""
+        dirname, basename = self.split_test(test_name)
+        return (self._natural_sort_key(dirname + self.TEST_PATH_SEPARATOR), self._natural_sort_key(basename))
+
+    def _natural_sort_key(self, string_to_split):
+        """ Turns a string into a list of string and number chunks, i.e. "z23a" -> ["z", 23, "a"]
+
+        This can be used to implement "natural sort" order. See:
+        http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html
+        http://nedbatchelder.com/blog/200712.html#e20071211T054956
+        """
+        def tryint(val):
+            try:
+                return int(val)
+            except ValueError:
+                return val
+
+        return [tryint(chunk) for chunk in re.split('(\d+)', string_to_split)]
+
     def test_dirs(self):
         """Returns the list of top-level test directories."""
         layout_tests_dir = self.layout_tests_dir()
@@ -683,17 +720,21 @@
         """
         self._filesystem.write_binary_file(baseline_path, data)
 
-    @memoized
+    # FIXME: update callers to create a finder and call it instead of these next five routines (which should be protected).
+    def webkit_base(self):
+        return self._webkit_finder.webkit_base()
+
+    def path_from_webkit_base(self, *comps):
+        return self._webkit_finder.path_from_webkit_base(*comps)
+
+    def path_to_script(self, script_name):
+        return self._webkit_finder.path_to_script(script_name)
+
     def layout_tests_dir(self):
-        """Return the absolute path to the top of the LayoutTests directory."""
-        return self._filesystem.normpath(self.path_from_webkit_base('LayoutTests'))
+        return self._webkit_finder.layout_tests_dir()
 
     def perf_tests_dir(self):
-        """Return the absolute path to the top of the PerformanceTests directory."""
-        return self.path_from_webkit_base('PerformanceTests')
-
-    def webkit_base(self):
-        return self._filesystem.abspath(self.path_from_webkit_base('.'))
+        return self._webkit_finder.perf_tests_dir()
 
     def skipped_layout_tests(self, test_list):
         """Returns tests skipped outside of the TestExpectations files."""
@@ -764,10 +805,9 @@
     def set_option_default(self, name, default_value):
         return self._options.ensure_value(name, default_value)
 
-    def path_from_webkit_base(self, *comps):
-        """Returns the full path to path made by joining the top of the
-        WebKit source tree and the list of path components in |*comps|."""
-        return self._config.path_from_webkit_base(*comps)
+    @memoized
+    def path_to_generic_test_expectations_file(self):
+        return self._filesystem.join(self.layout_tests_dir(), 'TestExpectations')
 
     @memoized
     def path_to_test_expectations_file(self):
@@ -795,12 +835,6 @@
         else:
             return self.host.filesystem.abspath(filename)
 
-    def relative_perf_test_filename(self, filename):
-        if filename.startswith(self.perf_tests_dir()):
-            return self.host.filesystem.relpath(filename, self.perf_tests_dir())
-        else:
-            return self.host.filesystem.abspath(filename)
-
     @memoized
     def abspath_for_test(self, test_name):
         """Returns the full path to the file for a given test name. This is the
@@ -871,6 +905,9 @@
             # Most ports (?):
             'WEBKIT_TESTFONTS',
             'WEBKITOUTPUTDIR',
+
+            # Chromium:
+            'CHROME_DEVEL_SANDBOX',
         ]
         for variable in variables_to_copy:
             self._copy_value_from_environ_if_set(clean_env, variable)
@@ -1037,29 +1074,34 @@
                 _log.warning("additional_expectations path '%s' does not exist" % path)
         return expectations
 
-    def expectations_files(self):
+    def _port_specific_expectations_files(self):
         # Unlike baseline_search_path, we only want to search [WK2-PORT, PORT-VERSION, PORT] and any directories
         # included via --additional-platform-directory, not the full casade.
         search_paths = [self.port_name]
-        if self.name() != self.port_name:
-            search_paths.append(self.name())
+
+        non_wk2_name = self.name().replace('-wk2', '')
+        if non_wk2_name != self.port_name:
+            search_paths.append(non_wk2_name)
 
         if self.get_option('webkit_test_runner'):
             # Because nearly all of the skipped tests for WebKit 2 are due to cross-platform
             # issues, all wk2 ports share a skipped list under platform/wk2.
-            search_paths.extend([self._wk2_port_name(), "wk2"])
+            search_paths.extend(["wk2", self._wk2_port_name()])
 
         search_paths.extend(self.get_option("additional_platform_directory", []))
 
         return [self._filesystem.join(self._webkit_baseline_path(d), 'TestExpectations') for d in search_paths]
 
+    def expectations_files(self):
+        return [self.path_to_generic_test_expectations_file()] + self._port_specific_expectations_files()
+
     def repository_paths(self):
         """Returns a list of (repository_name, repository_path) tuples of its depending code base.
-        By default it returns a list that only contains a ('webkit', <webkitRepossitoryPath>) tuple."""
+        By default it returns a list that only contains a ('WebKit', <webkitRepositoryPath>) tuple."""
 
-        # We use LayoutTest directory here because webkit_base isn't a part webkit repository in Chromium port
+        # We use LayoutTest directory here because webkit_base isn't a part of WebKit repository in Chromium port
         # where turnk isn't checked out as a whole.
-        return [('webkit', self.layout_tests_dir())]
+        return [('WebKit', self.layout_tests_dir())]
 
     _WDIFF_DEL = '##WDIFF_DEL##'
     _WDIFF_ADD = '##WDIFF_ADD##'
@@ -1177,13 +1219,17 @@
     def _is_debian_based(self):
         return self._filesystem.exists('/etc/debian_version')
 
+    def _apache_version(self):
+        config = self._executive.run_command([self._path_to_apache(), '-v'])
+        return re.sub(r'(?:.|\n)*Server version: Apache/(\d+\.\d+)(?:.|\n)*', r'\1', config)
+
     # We pass sys_platform into this method to make it easy to unit test.
     def _apache_config_file_name_for_platform(self, sys_platform):
         if sys_platform == 'cygwin':
             return 'cygwin-httpd.conf'  # CYGWIN is the only platform to still use Apache 1.3.
         if sys_platform.startswith('linux'):
             if self._is_redhat_based():
-                return 'fedora-httpd.conf'  # This is an Apache 2.x config file despite the naming.
+                return 'fedora-httpd-' + self._apache_version() + '.conf'
             if self._is_debian_based():
                 return 'apache2-debian-httpd.conf'
         # All platforms use apache2 except for CYGWIN (and Mac OS X Tiger and prior, which we no longer support).
@@ -1297,6 +1343,9 @@
     def look_for_new_crash_logs(self, crashed_processes, start_time):
         pass
 
+    def look_for_new_samples(self, unresponsive_processes, start_time):
+        pass
+
     def sample_process(self, name, pid):
         pass
 
@@ -1320,14 +1369,14 @@
         return suites
 
     def _virtual_tests(self, paths, suites):
-        virtual_tests = set()
+        virtual_tests = list()
         for suite in suites:
             if paths:
                 for test in suite.tests:
                     if any(test.startswith(p) for p in paths):
-                        virtual_tests.add(test)
+                        virtual_tests.append(test)
             else:
-                virtual_tests.update(set(suite.tests.keys()))
+                virtual_tests.extend(suite.tests.keys())
         return virtual_tests
 
     def lookup_virtual_test_base(self, test_name):
@@ -1373,12 +1422,12 @@
         return config_args
 
     def _run_script(self, script_name, args=None, include_configuration_arguments=True, decode_output=True, env=None):
-        run_script_command = [self._config.script_path(script_name)]
+        run_script_command = [self.path_to_script(script_name)]
         if include_configuration_arguments:
             run_script_command.extend(self._arguments_for_configuration())
         if args:
             run_script_command.extend(args)
-        output = self._executive.run_command(run_script_command, cwd=self._config.webkit_base_dir(), decode_output=decode_output, env=env)
+        output = self._executive.run_command(run_script_command, cwd=self.webkit_base(), decode_output=decode_output, env=env)
         _log.debug('Output of %s:\n%s' % (run_script_command, output))
         return output
 
@@ -1465,7 +1514,7 @@
             "MathMLElement": ["mathml"],
             "GraphicsLayer": ["compositing"],
             "WebCoreHas3DRendering": ["animations/3d", "transforms/3d"],
-            "WebGLShader": ["fast/canvas/webgl", "compositing/webgl", "http/tests/canvas/webgl"],
+            "WebGLShader": ["fast/canvas/webgl", "compositing/webgl", "http/tests/canvas/webgl", "webgl"],
             "MHTMLArchive": ["mhtml"],
             "CSSVariableValue": ["fast/css/variables", "inspector/styles/variables"],
         }
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py
index 1fe75cc..7685695 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py
@@ -30,7 +30,7 @@
 import optparse
 import sys
 import tempfile
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive import Executive, ScriptError
 from webkitpy.common.system import executive_mock
@@ -45,22 +45,19 @@
 from webkitpy.layout_tests.port import Port, Driver, DriverOutput
 from webkitpy.layout_tests.port.test import add_unit_tests_to_mock_filesystem, TestPort
 
-import config
-import config_mock
-
 class PortTest(unittest.TestCase):
-    def make_port(self, executive=None, with_tests=False, **kwargs):
+    def make_port(self, executive=None, with_tests=False, port_name=None, **kwargs):
         host = MockSystemHost()
         if executive:
             host.executive = executive
         if with_tests:
             add_unit_tests_to_mock_filesystem(host.filesystem)
             return TestPort(host, **kwargs)
-        return Port(host, **kwargs)
+        return Port(host, port_name or 'baseport', **kwargs)
 
     def test_default_child_processes(self):
         port = self.make_port()
-        self.assertNotEquals(port.default_child_processes(), None)
+        self.assertIsNotNone(port.default_child_processes())
 
     def test_format_wdiff_output_as_html(self):
         output = "OUTPUT %s %s %s" % (Port._WDIFF_DEL, Port._WDIFF_ADD, Port._WDIFF_END)
@@ -183,16 +180,11 @@
 
         # And make sure we actually get diff output.
         diff = port.diff_text('foo', 'bar', 'exp.txt', 'act.txt')
-        self.assertTrue('foo' in diff)
-        self.assertTrue('bar' in diff)
-        self.assertTrue('exp.txt' in diff)
-        self.assertTrue('act.txt' in diff)
-        self.assertFalse('nosuchthing' in diff)
-
-    def test_default_configuration_notfound(self):
-        # Test that we delegate to the config object properly.
-        port = self.make_port(config=config_mock.MockConfig(default_configuration='default'))
-        self.assertEqual(port.default_configuration(), 'default')
+        self.assertIn('foo', diff)
+        self.assertIn('bar', diff)
+        self.assertIn('exp.txt', diff)
+        self.assertIn('act.txt', diff)
+        self.assertNotIn('nosuchthing', diff)
 
     def test_setup_test_run(self):
         port = self.make_port()
@@ -204,8 +196,8 @@
         port.host.filesystem.write_text_file(port.layout_tests_dir() + '/canvas/test', '')
         port.host.filesystem.write_text_file(port.layout_tests_dir() + '/css2.1/test', '')
         dirs = port.test_dirs()
-        self.assertTrue('canvas' in dirs)
-        self.assertTrue('css2.1' in dirs)
+        self.assertIn('canvas', dirs)
+        self.assertIn('css2.1', dirs)
 
     def test_skipped_perf_tests(self):
         port = self.make_port()
@@ -231,7 +223,7 @@
 
     def test_get_option__unset(self):
         port = self.make_port()
-        self.assertEqual(port.get_option('foo'), None)
+        self.assertIsNone(port.get_option('foo'))
 
     def test_get_option__default(self):
         port = self.make_port()
@@ -268,7 +260,7 @@
         port = self.make_port(port_name='foo')
         port.expectations_files = lambda: ['/mock-checkout/LayoutTests/platform/exists/TestExpectations', '/mock-checkout/LayoutTests/platform/nonexistant/TestExpectations']
         port._filesystem.write_text_file('/mock-checkout/LayoutTests/platform/exists/TestExpectations', '')
-        self.assertEquals('\n'.join(port.expectations_dict().keys()), '/mock-checkout/LayoutTests/platform/exists/TestExpectations')
+        self.assertEqual('\n'.join(port.expectations_dict().keys()), '/mock-checkout/LayoutTests/platform/exists/TestExpectations')
 
     def test_additional_expectations(self):
         port = self.make_port(port_name='foo')
@@ -279,19 +271,19 @@
         port._filesystem.write_text_file(
             '/tmp/additional-expectations-2.txt', 'content2\n')
 
-        self.assertEquals('\n'.join(port.expectations_dict().values()), '')
+        self.assertEqual('\n'.join(port.expectations_dict().values()), '')
 
         port._options.additional_expectations = [
             '/tmp/additional-expectations-1.txt']
-        self.assertEquals('\n'.join(port.expectations_dict().values()), '\ncontent1\n')
+        self.assertEqual('\n'.join(port.expectations_dict().values()), '\ncontent1\n')
 
         port._options.additional_expectations = [
             '/tmp/nonexistent-file', '/tmp/additional-expectations-1.txt']
-        self.assertEquals('\n'.join(port.expectations_dict().values()), '\ncontent1\n')
+        self.assertEqual('\n'.join(port.expectations_dict().values()), '\ncontent1\n')
 
         port._options.additional_expectations = [
             '/tmp/additional-expectations-1.txt', '/tmp/additional-expectations-2.txt']
-        self.assertEquals('\n'.join(port.expectations_dict().values()), '\ncontent1\n\ncontent2\n')
+        self.assertEqual('\n'.join(port.expectations_dict().values()), '\ncontent1\n\ncontent2\n')
 
     def test_additional_env_var(self):
         port = self.make_port(options=optparse.Values({'additional_env_var': ['FOO=BAR', 'BAR=FOO']}))
@@ -328,12 +320,12 @@
     def test_find_with_skipped_directories(self):
         port = self.make_port(with_tests=True)
         tests = port.tests(['userscripts'])
-        self.assertTrue('userscripts/resources/iframe.html' not in tests)
+        self.assertNotIn('userscripts/resources/iframe.html', tests)
 
     def test_find_with_skipped_directories_2(self):
         port = self.make_port(with_tests=True)
         tests = port.tests(['userscripts/resources'])
-        self.assertEqual(tests, set([]))
+        self.assertEqual(tests, [])
 
     def test_is_test_file(self):
         filesystem = MockFileSystem()
@@ -440,20 +432,20 @@
     def test_tests(self):
         port = self.make_port(with_tests=True)
         tests = port.tests([])
-        self.assertTrue('passes/text.html' in tests)
-        self.assertTrue('virtual/passes/text.html' in tests)
+        self.assertIn('passes/text.html', tests)
+        self.assertIn('virtual/passes/text.html', tests)
 
         tests = port.tests(['passes'])
-        self.assertTrue('passes/text.html' in tests)
-        self.assertTrue('passes/passes/test-virtual-passes.html' in tests)
-        self.assertFalse('virtual/passes/text.html' in tests)
+        self.assertIn('passes/text.html', tests)
+        self.assertIn('passes/passes/test-virtual-passes.html', tests)
+        self.assertNotIn('virtual/passes/text.html', tests)
 
         tests = port.tests(['virtual/passes'])
-        self.assertFalse('passes/text.html' in tests)
-        self.assertTrue('virtual/passes/test-virtual-passes.html' in tests)
-        self.assertTrue('virtual/passes/passes/test-virtual-passes.html' in tests)
-        self.assertFalse('virtual/passes/test-virtual-virtual/passes.html' in tests)
-        self.assertFalse('virtual/passes/virtual/passes/test-virtual-passes.html' in tests)
+        self.assertNotIn('passes/text.html', tests)
+        self.assertIn('virtual/passes/test-virtual-passes.html', tests)
+        self.assertIn('virtual/passes/passes/test-virtual-passes.html', tests)
+        self.assertNotIn('virtual/passes/test-virtual-virtual/passes.html', tests)
+        self.assertNotIn('virtual/passes/virtual/passes/test-virtual-passes.html', tests)
 
     def test_build_path(self):
         port = self.make_port(options=optparse.Values({'build_directory': '/my-build-directory/'}))
@@ -463,5 +455,45 @@
         port = self.make_port()
         self.assertEqual(port.requires_http_server(), False)
 
-if __name__ == '__main__':
-    unittest.main()
+
+class NaturalCompareTest(unittest.TestCase):
+    def setUp(self):
+        self._port = TestPort(MockSystemHost())
+
+    def assert_cmp(self, x, y, result):
+        self.assertEqual(cmp(self._port._natural_sort_key(x), self._port._natural_sort_key(y)), result)
+
+    def test_natural_compare(self):
+        self.assert_cmp('a', 'a', 0)
+        self.assert_cmp('ab', 'a', 1)
+        self.assert_cmp('a', 'ab', -1)
+        self.assert_cmp('', '', 0)
+        self.assert_cmp('', 'ab', -1)
+        self.assert_cmp('1', '2', -1)
+        self.assert_cmp('2', '1', 1)
+        self.assert_cmp('1', '10', -1)
+        self.assert_cmp('2', '10', -1)
+        self.assert_cmp('foo_1.html', 'foo_2.html', -1)
+        self.assert_cmp('foo_1.1.html', 'foo_2.html', -1)
+        self.assert_cmp('foo_1.html', 'foo_10.html', -1)
+        self.assert_cmp('foo_2.html', 'foo_10.html', -1)
+        self.assert_cmp('foo_23.html', 'foo_10.html', 1)
+        self.assert_cmp('foo_23.html', 'foo_100.html', -1)
+
+
+class KeyCompareTest(unittest.TestCase):
+    def setUp(self):
+        self._port = TestPort(MockSystemHost())
+
+    def assert_cmp(self, x, y, result):
+        self.assertEqual(cmp(self._port.test_key(x), self._port.test_key(y)), result)
+
+    def test_test_key(self):
+        self.assert_cmp('/a', '/a', 0)
+        self.assert_cmp('/a', '/b', -1)
+        self.assert_cmp('/a2', '/a10', -1)
+        self.assert_cmp('/a2/foo', '/a10/foo', -1)
+        self.assert_cmp('/a/foo11', '/a/foo2', 1)
+        self.assert_cmp('/ab', '/a/a/b', -1)
+        self.assert_cmp('/a/a/b', '/ab', 1)
+        self.assert_cmp('/foo-bar/baz', '/foo/baz', -1)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/builders.py b/Tools/Scripts/webkitpy/layout_tests/port/builders.py
index 155ac89..cdc9e5b 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/builders.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/builders.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -34,7 +33,7 @@
 
 # In this dictionary, each item stores:
 # * port_name -- a fully qualified port name
-# * specifiers -- a set of specifiers, representing configurations covered by this builder.
+# * is_debug -- whether we are using a debug build
 # * move_overwritten_baselines_to -- (optional) list of platform directories that we will copy an existing
 #      baseline to before pulling down a new baseline during rebaselining. This is useful
 #      for bringing up a new port, for example when adding a Lion was the most recent Mac version and
@@ -47,44 +46,44 @@
 
 _exact_matches = {
     # These builders are on build.chromium.org.
-    "WebKit XP": {"port_name": "chromium-win-xp", "specifiers": set(["xp", "release"])},
-    "WebKit Win7": {"port_name": "chromium-win-win7", "specifiers": set(["win7", "release"])},
-    "WebKit Win7 (dbg)(1)": {"port_name": "chromium-win-win7", "specifiers": set(["win7", "debug"])},
-    "WebKit Win7 (dbg)(2)": {"port_name": "chromium-win-win7", "specifiers": set(["win7", "debug"])},
-    "WebKit Linux": {"port_name": "chromium-linux-x86_64", "specifiers": set(["linux", "x86_64", "release"])},
-    "WebKit Linux 32": {"port_name": "chromium-linux-x86", "specifiers": set(["linux", "x86"])},
-    "WebKit Linux (dbg)": {"port_name": "chromium-linux-x86_64", "specifiers": set(["linux", "debug"])},
-    "WebKit Mac10.6": {"port_name": "chromium-mac-snowleopard", "specifiers": set(["snowleopard"])},
-    "WebKit Mac10.6 (dbg)": {"port_name": "chromium-mac-snowleopard", "specifiers": set(["snowleopard", "debug"])},
-    "WebKit Mac10.7": {"port_name": "chromium-mac-lion", "specifiers": set(["lion", "release"])},
-    "WebKit Mac10.7 (dbg)": {"port_name": "chromium-mac-lion", "specifiers": set(["lion", "debug"])},
-    "WebKit Mac10.8": {"port_name": "chromium-mac-mountainlion", "specifiers": set(["mountainlion", "release"]),
-                       "move_overwritten_baselines_to": ["chromium-mac-lion"]},
+    "WebKit XP": {"port_name": "chromium-win-xp", "is_debug": False},
+    "WebKit Win7": {"port_name": "chromium-win-win7", "is_debug": False},
+    "WebKit Win7 (dbg)(1)": {"port_name": "chromium-win-win7", "is_debug": True},
+    "WebKit Win7 (dbg)(2)": {"port_name": "chromium-win-win7", "is_debug": True},
+    "WebKit Linux": {"port_name": "chromium-linux-x86_64", "is_debug": False},
+    "WebKit Linux 32": {"port_name": "chromium-linux-x86", "is_debug": False},
+    "WebKit Linux (dbg)": {"port_name": "chromium-linux-x86_64", "is_debug": True},
+    "WebKit Mac10.6": {"port_name": "chromium-mac-snowleopard", "is_debug": False},
+    "WebKit Mac10.6 (dbg)": {"port_name": "chromium-mac-snowleopard", "is_debug": True},
+    "WebKit Mac10.7": {"port_name": "chromium-mac-lion", "is_debug": False},
+    "WebKit Mac10.7 (dbg)": {"port_name": "chromium-mac-lion", "is_debug": True},
+    "WebKit Mac10.8": {"port_name": "chromium-mac-mountainlion", "is_debug": False},
 
     # These builders are on build.webkit.org.
-    "Apple MountainLion Release WK1 (Tests)": {"port_name": "mac-mountainlion", "specifiers": set(["mountainlion"]), "rebaseline_override_dir": "mac"},
-    "Apple MountainLion Debug WK1 (Tests)": {"port_name": "mac-mountainlion", "specifiers": set(["mountainlion", "debug"]), "rebaseline_override_dir": "mac"},
-    "Apple MountainLion Release WK2 (Tests)": {"port_name": "mac-mountainlion", "specifiers": set(["mountainlion", "wk2"]), "rebaseline_override_dir": "mac"},
-    "Apple MountainLion Debug WK2 (Tests)": {"port_name": "mac-mountainlion", "specifiers": set(["mountainlion", "wk2", "debug"]), "rebaseline_override_dir": "mac"},
-    "Apple Lion Release WK1 (Tests)": {"port_name": "mac-lion", "specifiers": set(["lion"])},
-    "Apple Lion Debug WK1 (Tests)": {"port_name": "mac-lion", "specifiers": set(["lion", "debug"])},
-    "Apple Lion Release WK2 (Tests)": {"port_name": "mac-lion", "specifiers": set(["lion", "wk2"])},
-    "Apple Lion Debug WK2 (Tests)": {"port_name": "mac-lion", "specifiers": set(["lion", "wk2", "debug"])},
+    "Apple MountainLion Release WK1 (Tests)": {"port_name": "mac-mountainlion", "is_debug": False, "rebaseline_override_dir": "mac"},
+    "Apple MountainLion Debug WK1 (Tests)": {"port_name": "mac-mountainlion", "is_debug": True, "rebaseline_override_dir": "mac"},
+    "Apple MountainLion Release WK2 (Tests)": {"port_name": "mac-mountainlion-wk2", "is_debug": False, "rebaseline_override_dir": "mac"},
+    "Apple MountainLion Debug WK2 (Tests)": {"port_name": "mac-mountainlion-wk2", "is_debug": True, "rebaseline_override_dir": "mac"},
+    "Apple Lion Release WK1 (Tests)": {"port_name": "mac-lion", "is_debug": False},
+    "Apple Lion Debug WK1 (Tests)": {"port_name": "mac-lion", "is_debug": True},
+    "Apple Lion Release WK2 (Tests)": {"port_name": "mac-lion-wk2", "is_debug": False},
+    "Apple Lion Debug WK2 (Tests)": {"port_name": "mac-lion-wk2", "is_debug": True},
 
-    "Apple Win XP Debug (Tests)": {"port_name": "win-xp", "specifiers": set(["win", "debug"])},
+    "Apple Win XP Debug (Tests)": {"port_name": "win-xp", "is_debug": True},
     # FIXME: Remove rebaseline_override_dir once there is an Apple buildbot that corresponds to platform/win.
-    "Apple Win 7 Release (Tests)": {"port_name": "win-7sp0", "specifiers": set(["win"]), "rebaseline_override_dir": "win"},
+    "Apple Win 7 Release (Tests)": {"port_name": "win-7sp0", "is_debug": False, "rebaseline_override_dir": "win"},
 
-    "GTK Linux 32-bit Release": {"port_name": "gtk", "specifiers": set(["gtk", "x86", "release"])},
-    "GTK Linux 64-bit Debug": {"port_name": "gtk", "specifiers": set(["gtk", "x86_64", "debug"])},
-    "GTK Linux 64-bit Release": {"port_name": "gtk", "specifiers": set(["gtk", "x86_64", "release"])},
-    "GTK Linux 64-bit Release WK2 (Tests)": {"port_name": "gtk", "specifiers": set(["gtk", "x86_64", "wk2", "release"])},
+    "GTK Linux 32-bit Release": {"port_name": "gtk", "is_debug": False},
+    "GTK Linux 64-bit Debug": {"port_name": "gtk", "is_debug": True},
+    "GTK Linux 64-bit Release": {"port_name": "gtk", "is_debug": False},
+    "GTK Linux 64-bit Release WK2 (Tests)": {"port_name": "gtk-wk2", "is_debug": False},
 
     # FIXME: Remove rebaseline_override_dir once there are Qt bots for all the platform/qt-* directories.
-    "Qt Linux Release": {"port_name": "qt-linux", "specifiers": set(["win", "linux", "mac"]), "rebaseline_override_dir": "qt"},
+    "Qt Linux Release": {"port_name": "qt-linux", "is_debug": False, "rebaseline_override_dir": "qt"},
 
-    "EFL Linux 64-bit Debug": {"port_name": "efl", "specifiers": set(["efl", "debug"])},
-    "EFL Linux 64-bit Release": {"port_name": "efl", "specifiers": set(["efl", "release"])},
+    "EFL Linux 64-bit Release": {"port_name": "efl", "is_debug": False},
+    "EFL Linux 64-bit Release WK2": {"port_name": "efl-wk2", "is_debug": False},
+    "EFL Linux 64-bit Debug WK2": {"port_name": "efl-wk2", "is_debug": True},
 }
 
 
@@ -122,10 +121,6 @@
     return sorted(set(map(lambda x: x["port_name"], _exact_matches.values()) + _ports_without_builders))
 
 
-def coverage_specifiers_for_builder_name(builder_name):
-    return _exact_matches[builder_name].get("specifiers", set())
-
-
 def rebaseline_override_dir(builder_name):
     return _exact_matches[builder_name].get("rebaseline_override_dir", None)
 
@@ -144,10 +139,14 @@
 
 
 def builder_name_for_port_name(target_port_name):
+    debug_builder_name = None
     for builder_name, builder_info in _exact_matches.items():
-        if builder_info['port_name'] == target_port_name and 'debug' not in builder_info['specifiers']:
-            return builder_name
-    return None
+        if builder_info['port_name'] == target_port_name:
+            if builder_info['is_debug']:
+                debug_builder_name = builder_name
+            else:
+                return builder_name
+    return debug_builder_name
 
 
 def builder_path_for_port_name(port_name):
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/builders_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/builders_unittest.py
index 1550df4..77551b9 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/builders_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/builders_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import builders
-import unittest
+import unittest2 as unittest
 
 
 class BuildersTest(unittest.TestCase):
@@ -38,7 +38,4 @@
             '(.) ': '____',
         }
         for name, expected in tests.items():
-            self.assertEquals(expected, builders.builder_path_from_name(name))
-
-if __name__ == '__main__':
-    unittest.main()
+            self.assertEqual(expected, builders.builder_path_from_name(name))
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium.py
old mode 100755
new mode 100644
index a69f5a8..aa4d30c
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -42,6 +41,7 @@
 from webkitpy.common.system.path import cygpath
 from webkitpy.layout_tests.models.test_configuration import TestConfiguration
 from webkitpy.layout_tests.port.base import Port, VirtualTestSuite
+from webkitpy.layout_tests.port.http_lock import HttpLock
 
 
 _log = logging.getLogger(__name__)
@@ -77,20 +77,30 @@
 
     DEFAULT_BUILD_DIRECTORIES = ('out',)
 
+    # overridden in subclasses.
+    FALLBACK_PATHS = {}
+
     @classmethod
     def _static_build_path(cls, filesystem, build_directory, chromium_base, webkit_base, configuration, comps):
         if build_directory:
             return filesystem.join(build_directory, configuration, *comps)
 
+        hits = []
         for directory in cls.DEFAULT_BUILD_DIRECTORIES:
             base_dir = filesystem.join(chromium_base, directory, configuration)
-            if filesystem.exists(base_dir):
-                return filesystem.join(base_dir, *comps)
+            path = filesystem.join(base_dir, *comps)
+            if filesystem.exists(path):
+                hits.append((filesystem.mtime(path), path))
 
         for directory in cls.DEFAULT_BUILD_DIRECTORIES:
             base_dir = filesystem.join(webkit_base, directory, configuration)
-            if filesystem.exists(base_dir):
-                return filesystem.join(base_dir, *comps)
+            path = filesystem.join(base_dir, *comps)
+            if filesystem.exists(path):
+                hits.append((filesystem.mtime(path), path))
+
+        if hits:
+            hits.sort(reverse=True)
+            return hits[0][1]  # Return the newest file found.
 
         # We have to default to something, so pick the last one.
         return filesystem.join(base_dir, *comps)
@@ -275,11 +285,8 @@
             "ff_aac_decoder": ["webaudio/codec-tests/aac"],
         }
 
-    def skipped_layout_tests(self, test_list):
-        # FIXME: Merge w/ WebKitPort.skipped_layout_tests()
-        return set(self._skipped_tests_for_unsupported_features(test_list))
-
     def setup_test_run(self):
+        super(ChromiumPort, self).setup_test_run()
         # Delete the disk cache if any to ensure a clean test run.
         dump_render_tree_binary_path = self._path_to_driver()
         cachedir = self._filesystem.dirname(dump_render_tree_binary_path)
@@ -343,7 +350,7 @@
     def warn_if_bug_missing_in_test_expectations(self):
         return True
 
-    def expectations_files(self):
+    def _port_specific_expectations_files(self):
         paths = [self.path_to_test_expectations_file()]
         skia_expectations_path = self.path_from_chromium_base('skia', 'skia_test_expectations.txt')
         # FIXME: we should probably warn if this file is missing in some situations.
@@ -358,15 +365,24 @@
 
     def repository_paths(self):
         repos = super(ChromiumPort, self).repository_paths()
-        repos.append(('chromium', self.path_from_chromium_base('build')))
+        repos.append(('Chromium', self.path_from_chromium_base('build')))
         return repos
 
     def _get_crash_log(self, name, pid, stdout, stderr, newer_than):
         if stderr and 'AddressSanitizer' in stderr:
-            asan_filter_path = self.path_from_chromium_base('tools', 'valgrind', 'asan', 'asan_symbolize.py')
-            if self._filesystem.exists(asan_filter_path):
-                output = self._executive.run_command([asan_filter_path], input=stderr, decode_output=False)
-                stderr = self._executive.run_command(['c++filt'], input=output, decode_output=False)
+            # Running the AddressSanitizer take a lot of memory, so we need to
+            # serialize access to it across all the concurrently running drivers.
+            lock = HttpLock(lock_path=None, lock_file_prefix='WebKitASAN.lock.',
+                            filesystem=self._filesystem, executive=self._executive,
+                            name='ASAN')
+            try:
+                lock.wait_for_httpd_lock()
+                asan_filter_path = self.path_from_chromium_base('tools', 'valgrind', 'asan', 'asan_symbolize.py')
+                if self._filesystem.exists(asan_filter_path):
+                    output = self._executive.run_command([asan_filter_path], input=stderr, decode_output=False)
+                    stderr = self._executive.run_command(['c++filt'], input=output, decode_output=False)
+            finally:
+                lock.cleanup_http_lock()
 
         return super(ChromiumPort, self)._get_crash_log(name, pid, stdout, stderr, newer_than)
 
@@ -393,6 +409,12 @@
             VirtualTestSuite('platform/chromium/virtual/deferred/fast/images',
                              'fast/images',
                              ['--enable-deferred-image-decoding', '--enable-per-tile-painting', '--force-compositing-mode']),
+            VirtualTestSuite('platform/chromium/virtual/gpu/compositedscrolling/overflow',
+                             'compositing/overflow',
+                             ['--enable-accelerated-overflow-scroll']),
+            VirtualTestSuite('platform/chromium/virtual/gpu/compositedscrolling/scrollbars',
+                             'scrollbars',
+                             ['--enable-accelerated-overflow-scroll']),
         ]
 
     #
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py
index b8ac55a..b095463 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -31,6 +30,7 @@
 import logging
 import os
 import re
+import sys
 import subprocess
 import threading
 import time
@@ -39,11 +39,10 @@
 from webkitpy.layout_tests.port import driver
 from webkitpy.layout_tests.port import factory
 from webkitpy.layout_tests.port import server_process
-
+from webkitpy.common.system.profiler import SingleFileOutputProfiler
 
 _log = logging.getLogger(__name__)
 
-
 # The root directory for test resources, which has the same structure as the
 # source root directory of Chromium.
 # This path is defined in Chromium's base/test/test_support_android.cc.
@@ -62,13 +61,17 @@
 DRT_APP_PACKAGE = 'org.chromium.native_test'
 DRT_ACTIVITY_FULL_NAME = DRT_APP_PACKAGE + '/.ChromeNativeTestActivity'
 DRT_APP_CACHE_DIR = DEVICE_DRT_DIR + 'cache/'
+DRT_LIBRARY_NAME = 'libDumpRenderTree.so'
 
 SCALING_GOVERNORS_PATTERN = "/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"
+KPTR_RESTRICT_PATH = "/proc/sys/kernel/kptr_restrict"
 
 # All the test cases are still served to DumpRenderTree through file protocol,
 # but we use a file-to-http feature to bridge the file request to host's http
 # server to get the real test files and corresponding resources.
-TEST_PATH_PREFIX = '/all-tests'
+# See webkit/support/platform_support_android.cc for the other side of this bridge.
+PERF_TEST_PATH_PREFIX = '/all-perf-tests'
+LAYOUT_TEST_PATH_PREFIX = '/all-tests'
 
 # All ports the Android forwarder to forward.
 # 8000, 8080 and 8443 are for http/https tests.
@@ -129,7 +132,8 @@
 # 1. as a virtual path in file urls that will be bridged to HTTP.
 # 2. pointing to some files that are pushed to the device for tests that
 # don't work on file-over-http (e.g. blob protocol tests).
-DEVICE_LAYOUT_TESTS_DIR = DEVICE_SOURCE_ROOT_DIR + 'third_party/WebKit/LayoutTests/'
+DEVICE_WEBKIT_BASE_DIR = DEVICE_SOURCE_ROOT_DIR + 'third_party/WebKit/'
+DEVICE_LAYOUT_TESTS_DIR = DEVICE_WEBKIT_BASE_DIR + 'LayoutTests/'
 
 # Test resources that need to be accessed as files directly.
 # Each item can be the relative path of a directory or a file.
@@ -146,12 +150,20 @@
     'compositing/resources/video.mp4',
 ]
 
+# List of test resources from webkit platform. These resources will be copied to the external storage.
+WEBKIT_PLATFORM_RESOURCES_TO_PUSH = [
+    'third_party/hyphen/hyph_en_US.dic',
+]
+
 MD5SUM_DEVICE_FILE_NAME = 'md5sum_bin'
 MD5SUM_DEVICE_PATH = '/data/local/tmp/' + MD5SUM_DEVICE_FILE_NAME
 
 class ChromiumAndroidPort(chromium.ChromiumPort):
     port_name = 'chromium-android'
 
+    # Avoid initializing the adb path [worker count]+1 times by storing it as a static member.
+    _adb_path = None
+
     FALLBACK_PATHS = [
         'chromium-android',
         'chromium-linux',
@@ -205,8 +217,8 @@
 
     def check_build(self, needs_http):
         result = super(ChromiumAndroidPort, self).check_build(needs_http)
-        result = self._check_file_exists(self._path_to_md5sum(), 'md5sum utility') and result
-        result = self._check_file_exists(self._path_to_forwarder(), 'forwarder utility') and result
+        result = self._check_file_exists(self.path_to_md5sum(), 'md5sum utility') and result
+        result = self._check_file_exists(self.path_to_forwarder(), 'forwarder utility') and result
         if not result:
             _log.error('For complete Android build requirements, please see:')
             _log.error('')
@@ -227,12 +239,12 @@
                 return False
         return True
 
-    def expectations_files(self):
+    def _port_specific_expectations_files(self):
         # LayoutTests/platform/chromium-android/TestExpectations should contain only the rules to
         # skip tests for the features not supported or not testable on Android.
         # Other rules should be in LayoutTests/platform/chromium/TestExpectations.
         android_expectations_file = self.path_from_webkit_base('LayoutTests', 'platform', 'chromium-android', 'TestExpectations')
-        return super(ChromiumAndroidPort, self).expectations_files() + [android_expectations_file]
+        return super(ChromiumAndroidPort, self)._port_specific_expectations_files() + [android_expectations_file]
 
     def requires_http_server(self):
         """Chromium Android runs tests on devices, and uses the HTTP server to
@@ -242,7 +254,8 @@
     def start_http_server(self, additional_dirs=None, number_of_servers=0):
         if not additional_dirs:
             additional_dirs = {}
-        additional_dirs[TEST_PATH_PREFIX] = self.layout_tests_dir()
+        additional_dirs[PERF_TEST_PATH_PREFIX] = self.perf_tests_dir()
+        additional_dirs[LAYOUT_TEST_PATH_PREFIX] = self.layout_tests_dir()
         super(ChromiumAndroidPort, self).start_http_server(additional_dirs, number_of_servers)
 
     def create_driver(self, worker_number, no_timeout=False):
@@ -256,6 +269,32 @@
         # Override to return the actual DumpRenderTree command line.
         return self.create_driver(0)._drt_cmd_line(self.get_option('pixel_tests'), [])
 
+    def path_to_adb(self):
+        if ChromiumAndroidPort._adb_path:
+            return ChromiumAndroidPort._adb_path
+
+        provided_adb_path = self.path_from_chromium_base('third_party', 'android_tools', 'sdk', 'platform-tools', 'adb')
+
+        path_version = self._determine_adb_version('adb')
+        provided_version = self._determine_adb_version(provided_adb_path)
+        assert provided_version, 'The checked in Android SDK is missing. Are you sure you ran update-webkit --chromium-android?'
+
+        if not path_version:
+            ChromiumAndroidPort._adb_path = provided_adb_path
+        elif provided_version > path_version:
+            _log.warning('The "adb" version in your path is older than the one checked in, consider updating your local Android SDK. Using the checked in one.')
+            ChromiumAndroidPort._adb_path = provided_adb_path
+        else:
+            ChromiumAndroidPort._adb_path = 'adb'
+
+        return ChromiumAndroidPort._adb_path
+
+    def path_to_forwarder(self):
+        return self._build_path('forwarder')
+
+    def path_to_md5sum(self):
+        return self._build_path(MD5SUM_DEVICE_FILE_NAME)
+
     # Overridden private functions.
 
     def _build_path(self, *comps):
@@ -276,12 +315,6 @@
     def _path_to_helper(self):
         return None
 
-    def _path_to_forwarder(self):
-        return self._build_path('forwarder')
-
-    def _path_to_md5sum(self):
-        return self._build_path(MD5SUM_DEVICE_FILE_NAME)
-
     def _path_to_image_diff(self):
         return self._host_port._path_to_image_diff()
 
@@ -305,10 +338,21 @@
 
     # Local private functions.
 
+    def _determine_adb_version(self, adb_path):
+        re_version = re.compile('^.*version ([\d\.]+)$')
+        try:
+            output = self._executive.run_command([adb_path, 'version'], error_handler=self._executive.ignore_error)
+        except OSError:
+            return None
+        result = re_version.match(output)
+        if not output or not result:
+            return None
+        return [int(n) for n in result.group(1).split('.')]
+
     def _get_devices(self):
         if not self._devices:
             re_device = re.compile('^([a-zA-Z0-9_:.-]+)\tdevice$', re.MULTILINE)
-            result = self._executive.run_command(['adb', 'devices'], error_handler=self._executive.ignore_error)
+            result = self._executive.run_command([self.path_to_adb(), 'devices'], error_handler=self._executive.ignore_error)
             self._devices = re_device.findall(result)
             if not self._devices:
                 raise AssertionError('No devices attached. Result of "adb devices": %s' % result)
@@ -321,6 +365,130 @@
         return devices[worker_number]
 
 
+class AndroidPerf(SingleFileOutputProfiler):
+    _cached_perf_host_path = None
+    _have_searched_for_perf_host = False
+
+    def __init__(self, host, executable_path, output_dir, adb_path, device_serial, symfs_path, kallsyms_path, identifier=None):
+        super(AndroidPerf, self).__init__(host, executable_path, output_dir, "data", identifier)
+        self._device_serial = device_serial
+        self._adb_command = [adb_path, '-s', self._device_serial]
+        self._perf_process = None
+        self._symfs_path = symfs_path
+        self._kallsyms_path = kallsyms_path
+
+    def check_configuration(self):
+        # Check that perf is installed
+        if not self._file_exists_on_device('/system/bin/perf'):
+            print "Cannot find /system/bin/perf on device %s" % self._device_serial
+            return False
+        # Check that the device is a userdebug build (or at least has the necessary libraries).
+        if self._run_adb_command(['shell', 'getprop', 'ro.build.type']).strip() != 'userdebug':
+            print "Device %s is not flashed with a userdebug build of Android" % self._device_serial
+            return False
+        # FIXME: Check that the binary actually is perf-able (has stackframe pointers)?
+        # objdump -s a function and make sure it modifies the fp?
+        # Instruct users to rebuild after export GYP_DEFINES="profiling=1 $GYP_DEFINES"
+        return True
+
+    def print_setup_instructions(self):
+        print """
+perf on android requires a 'userdebug' build of Android, see:
+http://source.android.com/source/building-devices.html"
+
+The perf command can be built from:
+https://android.googlesource.com/platform/external/linux-tools-perf/
+and requires libefl, libebl, libdw, and libdwfl available in:
+https://android.googlesource.com/platform/external/elfutils/
+
+DumpRenderTree must be built with profiling=1, make sure you've done:
+export GYP_DEFINES="profiling=1 $GYP_DEFINES"
+update-webkit --chromium-android
+build-webkit --chromium-android
+
+Googlers should read:
+http://goto.google.com/cr-android-perf-howto
+"""
+
+    def _file_exists_on_device(self, full_file_path):
+        assert full_file_path.startswith('/')
+        return self._run_adb_command(['shell', 'ls', full_file_path]).strip() == full_file_path
+
+    def _run_adb_command(self, cmd):
+        return self._host.executive.run_command(self._adb_command + cmd)
+
+    def attach_to_pid(self, pid):
+        assert(pid)
+        assert(self._perf_process == None)
+        # FIXME: This can't be a fixed timeout!
+        cmd = self._adb_command + ['shell', 'perf', 'record', '-g', '-p', pid, 'sleep', 30]
+        self._perf_process = self._host.executive.popen(cmd)
+
+    def _perf_version_string(self, perf_path):
+        try:
+            return self._host.executive.run_command([perf_path, '--version'])
+        except:
+            return None
+
+    def _find_perfhost_binary(self):
+        perfhost_version = self._perf_version_string('perfhost_linux')
+        if perfhost_version:
+            return 'perfhost_linux'
+        perf_version = self._perf_version_string('perf')
+        if perf_version:
+            return 'perf'
+        return None
+
+    def _perfhost_path(self):
+        if self._have_searched_for_perf_host:
+            return self._cached_perf_host_path
+        self._have_searched_for_perf_host = True
+        self._cached_perf_host_path = self._find_perfhost_binary()
+        return self._cached_perf_host_path
+
+    def _first_ten_lines_of_profile(self, perf_output):
+        match = re.search("^#[^\n]*\n((?: [^\n]*\n){1,10})", perf_output, re.MULTILINE)
+        return match.group(1) if match else None
+
+    def profile_after_exit(self):
+        perf_exitcode = self._perf_process.wait()
+        if perf_exitcode != 0:
+            print "Perf failed (exit code: %i), can't process results." % perf_exitcode
+            return
+        self._run_adb_command(['pull', '/data/perf.data', self._output_path])
+
+        perfhost_path = self._perfhost_path()
+        perfhost_report_command = [
+            'report',
+            '--input', self._output_path,
+            '--symfs', self._symfs_path,
+            '--kallsyms', self._kallsyms_path,
+        ]
+        if perfhost_path:
+            perfhost_args = [perfhost_path] + perfhost_report_command + ['--call-graph', 'none']
+            perf_output = self._host.executive.run_command(perfhost_args)
+            # We could save off the full -g report to a file if users found that useful.
+            print self._first_ten_lines_of_profile(perf_output)
+        else:
+            print """
+Failed to find perfhost_linux binary, can't process samples from the device.
+
+perfhost_linux can be built from:
+https://android.googlesource.com/platform/external/linux-tools-perf/
+also, modern versions of perf (available from apt-get install goobuntu-kernel-tools-common)
+may also be able to process the perf.data files from the device.
+
+Googlers should read:
+http://goto.google.com/cr-android-perf-howto
+for instructions on installing pre-built copies of perfhost_linux
+http://crbug.com/165250 discusses making these pre-built binaries externally available.
+"""
+
+        perfhost_display_patch = perfhost_path if perfhost_path else 'perfhost_linux'
+        print "To view the full profile, run:"
+        print ' '.join([perfhost_display_patch] + perfhost_report_command)
+
+
 class ChromiumAndroidDriver(driver.Driver):
     def __init__(self, port, worker_number, pixel_tests, no_timeout=False):
         super(ChromiumAndroidDriver, self).__init__(port, worker_number, pixel_tests, no_timeout)
@@ -333,15 +501,74 @@
         self._forwarder_process = None
         self._has_setup = False
         self._original_governors = {}
+        self._original_kptr_restrict = None
         self._device_serial = port._get_device_serial(worker_number)
-        self._adb_command = ['adb', '-s', self._device_serial]
+        self._adb_command_base = None
+
+        # FIXME: If we taught ProfileFactory about "target" devices we could
+        # just use the logic in Driver instead of duplicating it here.
+        if self._port.get_option("profile"):
+            # FIXME: This should be done once, instead of per-driver!
+            symfs_path = self._find_or_create_symfs()
+            kallsyms_path = self._update_kallsyms_cache(symfs_path)
+            # FIXME: We should pass this some sort of "Bridge" object abstraction around ADB instead of a path/device pair.
+            self._profiler = AndroidPerf(self._port.host, self._port._path_to_driver(), self._port.results_directory(),
+                self._port.path_to_adb(), self._device_serial, symfs_path, kallsyms_path)
+            # FIXME: This is a layering violation and should be moved to Port.check_sys_deps
+            # once we have an abstraction around an adb_path/device_serial pair to make it
+            # easy to make these class methods on AndroidPerf.
+            if not self._profiler.check_configuration():
+                self._profiler.print_setup_instructions()
+                sys.exit(1)
+        else:
+            self._profiler = None
 
     def __del__(self):
         self._teardown_performance()
         super(ChromiumAndroidDriver, self).__del__()
 
+    def _update_kallsyms_cache(self, output_dir):
+        kallsyms_name = "%s-kallsyms" % self._device_serial
+        kallsyms_cache_path = self._port.host.filesystem.join(output_dir, kallsyms_name)
+
+        self._restart_adb_as_root()
+
+        saved_kptr_restrict = self._run_adb_command(['shell', 'cat', KPTR_RESTRICT_PATH]).strip()
+        self._run_adb_command(['shell', 'echo', '0', '>', KPTR_RESTRICT_PATH])
+
+        print "Updating kallsyms file (%s) from device" % kallsyms_cache_path
+        self._pull_from_device("/proc/kallsyms", kallsyms_cache_path)
+
+        self._run_adb_command(['shell', 'echo', saved_kptr_restrict, '>', KPTR_RESTRICT_PATH])
+
+        return kallsyms_cache_path
+
+    def _find_or_create_symfs(self):
+        environment = self._port.host.copy_current_environment()
+        env = environment.to_dictionary()
+        fs = self._port.host.filesystem
+
+        if 'ANDROID_SYMFS' in env:
+            symfs_path = env['ANDROID_SYMFS']
+        else:
+            symfs_path = fs.join(self._port.results_directory(), 'symfs')
+            print "ANDROID_SYMFS not set, using %s" % symfs_path
+
+        # find the installed path, and the path of the symboled built library
+        # FIXME: We should get the install path from the device!
+        symfs_library_path = fs.join(symfs_path, "data/app-lib/%s-1/%s" % (DRT_APP_PACKAGE, DRT_LIBRARY_NAME))
+        built_library_path = self._port._build_path('lib', DRT_LIBRARY_NAME)
+        assert(fs.exists(built_library_path))
+
+        # FIXME: Ideally we'd check the sha1's first and make a soft-link instead of copying (since we probably never care about windows).
+        print "Updating symfs libary (%s) from built copy (%s)" % (symfs_library_path, built_library_path)
+        fs.maybe_make_directory(fs.dirname(symfs_library_path))
+        fs.copyfile(built_library_path, symfs_library_path)
+
+        return symfs_path
+
     def _setup_md5sum_and_push_data_if_needed(self):
-        self._md5sum_path = self._port._path_to_md5sum()
+        self._md5sum_path = self._port.path_to_md5sum()
         if not self._file_exists_on_device(MD5SUM_DEVICE_PATH):
             if not self._push_to_device(self._md5sum_path, MD5SUM_DEVICE_PATH):
                 raise AssertionError('Could not push md5sum to device')
@@ -349,15 +576,17 @@
         self._push_executable()
         self._push_fonts()
         self._push_test_resources()
+        self._push_platform_resources()
 
     def _setup_test(self):
         if self._has_setup:
             return
 
+        self._restart_adb_as_root()
         self._setup_md5sum_and_push_data_if_needed()
         self._has_setup = True
-        self._run_adb_command(['root'])
         self._setup_performance()
+
         # Required by webkit_support::GetWebKitRootDirFilePath().
         # Other directories will be created automatically by adb push.
         self._run_adb_command(['shell', 'mkdir', '-p', DEVICE_SOURCE_ROOT_DIR + 'chrome'])
@@ -388,7 +617,7 @@
     def _push_file_if_needed(self, host_file, device_file):
         assert os.path.exists(host_file)
         device_hashes = self._extract_hashes_from_md5sum_output(
-                self._port.host.executive.popen(self._adb_command + ['shell', MD5SUM_DEVICE_PATH, device_file],
+                self._port.host.executive.popen(self._adb_command() + ['shell', MD5SUM_DEVICE_PATH, device_file],
                                                 stdout=subprocess.PIPE).stdout)
         host_hashes = self._extract_hashes_from_md5sum_output(
                 self._port.host.executive.popen(args=['%s_host' % self._md5sum_path, host_file],
@@ -398,7 +627,7 @@
         self._push_to_device(host_file, device_file)
 
     def _push_executable(self):
-        self._push_file_if_needed(self._port._path_to_forwarder(), DEVICE_FORWARDER_PATH)
+        self._push_file_if_needed(self._port.path_to_forwarder(), DEVICE_FORWARDER_PATH)
         self._push_file_if_needed(self._port._build_path('DumpRenderTree.pak'), DEVICE_DRT_DIR + 'DumpRenderTree.pak')
         self._push_file_if_needed(self._port._build_path('DumpRenderTree_resources'), DEVICE_DRT_DIR + 'DumpRenderTree_resources')
         self._push_file_if_needed(self._port._build_path('android_main_fonts.xml'), DEVICE_DRT_DIR + 'android_main_fonts.xml')
@@ -424,13 +653,29 @@
         for resource in TEST_RESOURCES_TO_PUSH:
             self._push_file_if_needed(self._port.layout_tests_dir() + '/' + resource, DEVICE_LAYOUT_TESTS_DIR + resource)
 
+    def _push_platform_resources(self):
+        self._log_debug('Pushing platform resources')
+        external_storage = self._port._filesystem.join(self._run_adb_command(['shell', 'echo $EXTERNAL_STORAGE']).strip(), 'Source', 'WebKit', 'chromium')
+        for resource in WEBKIT_PLATFORM_RESOURCES_TO_PUSH:
+            self._push_file_if_needed(self._port._chromium_base_dir(self._port._filesystem) + '/' + resource, external_storage + '/' + resource)
+
+    def _restart_adb_as_root(self):
+        output = self._run_adb_command(['root'])
+        if 'adbd is already running as root' in output:
+            return
+        elif not 'restarting adbd as root' in output:
+            self._log_error('Unrecognized output from adb root: %s' % output)
+
+        # Regardless the output, give the device a moment to come back online.
+        self._run_adb_command(['wait-for-device'])
+
     def _run_adb_command(self, cmd, ignore_error=False):
         self._log_debug('Run adb command: ' + str(cmd))
         if ignore_error:
             error_handler = self._port._executive.ignore_error
         else:
             error_handler = None
-        result = self._port._executive.run_command(self._adb_command + cmd, error_handler=error_handler)
+        result = self._port._executive.run_command(self._adb_command() + cmd, error_handler=error_handler)
         # Limit the length to avoid too verbose output of commands like 'adb logcat' and 'cat /data/tombstones/tombstone01'
         # whose outputs are normally printed in later logs.
         self._log_debug('Run adb result: ' + result[:80])
@@ -488,10 +733,6 @@
             self._run_adb_command(['shell', 'echo', original_content, '>', file])
         self._original_governors = {}
 
-    def _command_wrapper(cls, wrapper_option):
-        # Ignore command wrapper which is not applicable on Android.
-        return []
-
     def _get_crash_log(self, stdout, stderr, newer_than):
         if not stdout:
             stdout = ''
@@ -504,7 +745,7 @@
     def cmd_line(self, pixel_tests, per_test_args):
         # The returned command line is used to start _server_process. In our case, it's an interactive 'adb shell'.
         # The command line passed to the DRT process is returned by _drt_cmd_line() instead.
-        return self._adb_command + ['shell']
+        return self._adb_command() + ['shell']
 
     def _file_exists_on_device(self, full_file_path):
         assert full_file_path.startswith('/')
@@ -567,7 +808,7 @@
 
         self._log_debug('Starting forwarder')
         self._forwarder_process = self._port._server_process_constructor(
-            self._port, 'Forwarder', self._adb_command + ['shell', '%s -D %s' % (DEVICE_FORWARDER_PATH, FORWARD_PORTS)])
+            self._port, 'Forwarder', self._adb_command() + ['shell', '%s -D %s' % (DEVICE_FORWARDER_PATH, FORWARD_PORTS)])
         self._forwarder_process.start()
 
         self._run_adb_command(['logcat', '-c'])
@@ -589,13 +830,13 @@
         # Start a process to read from the stdout fifo of the DumpRenderTree app and print to stdout.
         self._log_debug('Redirecting stdout to ' + self._out_fifo_path)
         self._read_stdout_process = self._port._server_process_constructor(
-            self._port, 'ReadStdout', self._adb_command + ['shell', 'cat', self._out_fifo_path])
+            self._port, 'ReadStdout', self._adb_command() + ['shell', 'cat', self._out_fifo_path])
         self._read_stdout_process.start()
 
         # Start a process to read from the stderr fifo of the DumpRenderTree app and print to stdout.
         self._log_debug('Redirecting stderr to ' + self._err_fifo_path)
         self._read_stderr_process = self._port._server_process_constructor(
-            self._port, 'ReadStderr', self._adb_command + ['shell', 'cat', self._err_fifo_path])
+            self._port, 'ReadStderr', self._adb_command() + ['shell', 'cat', self._err_fifo_path])
         self._read_stderr_process.start()
 
         self._log_debug('Redirecting stdin to ' + self._in_fifo_path)
@@ -630,10 +871,23 @@
             # deadlock and killed the fifo reading/writing processes.
             _log.error('Failed to start DumpRenderTree: \n%s' % output)
             return False
-        else:
-            # Inform the deadlock detector that the startup is successful without deadlock.
-            normal_startup_event.set()
-            return True
+
+        # Inform the deadlock detector that the startup is successful without deadlock.
+        normal_startup_event.set()
+        return True
+
+    def _pid_from_android_ps_output(self, ps_output, package_name):
+        # ps output seems to be fixed width, we only care about the name and the pid
+        # u0_a72    21630 125   947920 59364 ffffffff 400beee4 S org.chromium.native_test
+        for line in ps_output.split('\n'):
+            if line.find(DRT_APP_PACKAGE) != -1:
+                match = re.match(r'\S+\s+(\d+)', line)
+                return int(match.group(1))
+
+    def _pid_on_target(self):
+        # FIXME: There must be a better way to do this than grepping ps output!
+        ps_output = self._run_adb_command(['shell', 'ps'])
+        return self._pid_from_android_ps_output(ps_output, DRT_APP_PACKAGE)
 
     def stop(self):
         self._run_adb_command(['shell', 'am', 'force-stop', DRT_APP_PACKAGE])
@@ -659,10 +913,10 @@
     def _command_from_driver_input(self, driver_input):
         command = super(ChromiumAndroidDriver, self)._command_from_driver_input(driver_input)
         if command.startswith('/'):
-            # Convert the host file path to a device file path. See comment of
-            # DEVICE_LAYOUT_TESTS_DIR for details.
+            fs = self._port._filesystem
             # FIXME: what happens if command lies outside of the layout_tests_dir on the host?
-            command = DEVICE_LAYOUT_TESTS_DIR + self._port.relative_test_filename(command)
+            relative_test_filename = fs.relpath(command, fs.dirname(self._port.layout_tests_dir()))
+            command = DEVICE_WEBKIT_BASE_DIR + relative_test_filename
         return command
 
     def _read_prompt(self, deadline):
@@ -673,3 +927,8 @@
                 if last_char in ('#', '$'):
                     return
             last_char = current_char
+
+    def _adb_command(self):
+        if not self._adb_command_base:
+            self._adb_command_base = [self._port.path_to_adb(), '-s', self._device_serial]
+        return self._adb_command_base
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py
index fce69c6..f34bbcd 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_android_unittest.py
@@ -29,7 +29,7 @@
 import optparse
 import StringIO
 import time
-import unittest
+import unittest2 as unittest
 import sys
 
 from webkitpy.common.system import executive_mock
@@ -42,6 +42,7 @@
 from webkitpy.layout_tests.port import driver_unittest
 from webkitpy.tool.mocktool import MockOptions
 
+
 class MockRunCommand(object):
     def __init__(self):
         self._mock_logcat = ''
@@ -50,10 +51,12 @@
         self._mock_ls_tombstones = ''
 
     def mock_run_command_fn(self, args):
-        if args[0] != 'adb':
+        if not args[0].endswith('adb'):
             return ''
         if args[1] == 'devices':
             return self._mock_devices_output
+        if args[1] == 'version':
+            return 'version 1.0'
 
         assert len(args) > 3
         assert args[1] == '-s'
@@ -119,11 +122,11 @@
 
     def test_attributes(self):
         port = self.make_port()
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path('chromium-android'))
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path('chromium-android'))
 
     def test_default_timeout_ms(self):
-        self.assertEquals(self.make_port(options=optparse.Values({'configuration': 'Release'})).default_timeout_ms(), 10000)
-        self.assertEquals(self.make_port(options=optparse.Values({'configuration': 'Debug'})).default_timeout_ms(), 10000)
+        self.assertEqual(self.make_port(options=optparse.Values({'configuration': 'Release'})).default_timeout_ms(), 10000)
+        self.assertEqual(self.make_port(options=optparse.Values({'configuration': 'Debug'})).default_timeout_ms(), 10000)
 
     def test_expectations_files(self):
         # FIXME: override this test temporarily while we're still upstreaming the android port and
@@ -138,14 +141,14 @@
     def test_get_devices_one_device(self):
         port = self.make_port()
         self.mock_run_command.mock_one_device()
-        self.assertEquals(self.mock_run_command._mock_devices, port._get_devices())
-        self.assertEquals(1, port.default_child_processes())
+        self.assertEqual(self.mock_run_command._mock_devices, port._get_devices())
+        self.assertEqual(1, port.default_child_processes())
 
     def test_get_devices_two_devices(self):
         port = self.make_port()
         self.mock_run_command.mock_two_devices()
-        self.assertEquals(self.mock_run_command._mock_devices, port._get_devices())
-        self.assertEquals(2, port.default_child_processes())
+        self.assertEqual(self.mock_run_command._mock_devices, port._get_devices())
+        self.assertEqual(2, port.default_child_processes())
 
     def test_get_device_serial_no_device(self):
         port = self.make_port()
@@ -155,19 +158,19 @@
     def test_get_device_serial_one_device(self):
         port = self.make_port()
         self.mock_run_command.mock_one_device()
-        self.assertEquals(self.mock_run_command._mock_devices[0], port._get_device_serial(0))
+        self.assertEqual(self.mock_run_command._mock_devices[0], port._get_device_serial(0))
         self.assertRaises(AssertionError, port._get_device_serial, 1)
 
     def test_get_device_serial_two_devices(self):
         port = self.make_port()
         self.mock_run_command.mock_two_devices()
-        self.assertEquals(self.mock_run_command._mock_devices[0], port._get_device_serial(0))
-        self.assertEquals(self.mock_run_command._mock_devices[1], port._get_device_serial(1))
+        self.assertEqual(self.mock_run_command._mock_devices[0], port._get_device_serial(0))
+        self.assertEqual(self.mock_run_command._mock_devices[1], port._get_device_serial(1))
         self.assertRaises(AssertionError, port._get_device_serial, 2)
 
     def test_must_require_http_server(self):
         port = self.make_port()
-        self.assertEquals(port.requires_http_server(), True)
+        self.assertEqual(port.requires_http_server(), True)
 
 
 class ChromiumAndroidDriverTest(unittest.TestCase):
@@ -181,13 +184,13 @@
 
     def test_get_last_stacktrace(self):
         self.mock_run_command.mock_no_tombstone_dir()
-        self.assertEquals(self.driver._get_last_stacktrace(), '')
+        self.assertEqual(self.driver._get_last_stacktrace(), '')
 
         self.mock_run_command.mock_no_tombstone_file()
-        self.assertEquals(self.driver._get_last_stacktrace(), '')
+        self.assertEqual(self.driver._get_last_stacktrace(), '')
 
         self.mock_run_command.mock_ten_tombstones()
-        self.assertEquals(self.driver._get_last_stacktrace(),
+        self.assertEqual(self.driver._get_last_stacktrace(),
                           '-rw------- 1000 1000 45316 2012-04-27 16:33 tombstone_03\n'
                           '/data/tombstones/tombstone_03\nmock_contents\n')
 
@@ -196,7 +199,7 @@
         self.mock_run_command.mock_ten_tombstones()
         self.driver._crashed_process_name = 'foo'
         self.driver._crashed_pid = 1234
-        self.assertEquals(self.driver._get_crash_log('out bar\nout baz\n', 'err bar\nerr baz\n', newer_than=None),
+        self.assertEqual(self.driver._get_crash_log('out bar\nout baz\n', 'err bar\nerr baz\n', newer_than=None),
             ('err bar\n'
              'err baz\n'
              '********* [123456789ABCDEF0] Tombstone file:\n'
@@ -217,7 +220,7 @@
 
         self.driver._crashed_process_name = None
         self.driver._crashed_pid = None
-        self.assertEquals(self.driver._get_crash_log(None, None, newer_than=None),
+        self.assertEqual(self.driver._get_crash_log(None, None, newer_than=None),
             ('********* [123456789ABCDEF0] Tombstone file:\n'
              '-rw------- 1000 1000 45316 2012-04-27 16:33 tombstone_03\n'
              '/data/tombstones/tombstone_03\n'
@@ -232,29 +235,82 @@
 
     def test_cmd_line(self):
         cmd_line = self.driver.cmd_line(True, ['anything'])
-        self.assertEquals(['adb', '-s', self.mock_run_command._mock_devices[0], 'shell'], cmd_line)
+        self.assertEqual(['adb', '-s', self.mock_run_command._mock_devices[0], 'shell'], cmd_line)
 
     def test_drt_cmd_line(self):
         cmd_line = self.driver._drt_cmd_line(True, ['--a'])
-        self.assertTrue('--a' in cmd_line)
-        self.assertTrue('--create-stdin-fifo' in cmd_line)
-        self.assertTrue('--separate-stderr-fifo' in cmd_line)
+        self.assertIn('--a', cmd_line)
+        self.assertIn('--create-stdin-fifo', cmd_line)
+        self.assertIn('--separate-stderr-fifo', cmd_line)
 
     def test_read_prompt(self):
         self.driver._server_process = driver_unittest.MockServerProcess(lines=['root@android:/ # '])
-        self.assertEquals(self.driver._read_prompt(time.time() + 1), None)
+        self.assertIsNone(self.driver._read_prompt(time.time() + 1))
         self.driver._server_process = driver_unittest.MockServerProcess(lines=['$ '])
-        self.assertEquals(self.driver._read_prompt(time.time() + 1), None)
+        self.assertIsNone(self.driver._read_prompt(time.time() + 1))
 
     def test_command_from_driver_input(self):
         driver_input = driver.DriverInput('foo/bar/test.html', 10, 'checksum', True)
         expected_command = "/data/local/tmp/third_party/WebKit/LayoutTests/foo/bar/test.html'--pixel-test'checksum\n"
         if (sys.platform != "cygwin"):
-            self.assertEquals(self.driver._command_from_driver_input(driver_input), expected_command)
+            self.assertEqual(self.driver._command_from_driver_input(driver_input), expected_command)
 
         driver_input = driver.DriverInput('http/tests/foo/bar/test.html', 10, 'checksum', True)
         expected_command = "http://127.0.0.1:8000/foo/bar/test.html'--pixel-test'checksum\n"
-        self.assertEquals(self.driver._command_from_driver_input(driver_input), expected_command)
+        self.assertEqual(self.driver._command_from_driver_input(driver_input), expected_command)
+
+    def test_pid_from_android_ps_output(self):
+        # FIXME: Use a larger blob of ps output.
+        ps_output = """u0_a72    21630 125   947920 59364 ffffffff 400beee4 S org.chromium.native_test"""
+        pid = self.driver._pid_from_android_ps_output(ps_output, "org.chromium.native_test")
+        self.assertEqual(pid, 21630)
+
+
+class AndroidPerfTest(unittest.TestCase):
+    def test_perf_output_regexp(self):
+        perf_output = """[kernel.kallsyms] with build id 5a20f6299bdb955a2f07711bb7f65cd706fe7469 not found, continuing without symbols
+Failed to open /tmp/perf-14168.map, continuing without symbols
+Kernel address maps (/proc/{kallsyms,modules}) were restricted.
+
+Check /proc/sys/kernel/kptr_restrict before running 'perf record'.
+
+As no suitable kallsyms nor vmlinux was found, kernel samples
+can't be resolved.
+
+Samples in kernel modules can't be resolved as well.
+
+# Events: 31K cycles
+#
+# Overhead          Command                Shared Object
+# ........  ...............  ...........................  .....................................................................................................................................................................
+#
+    16.18%   DumpRenderTree  perf-14168.map               [.] 0x21270ac0cf43
+    12.72%   DumpRenderTree  DumpRenderTree               [.] v8::internal::JSObject::GetElementWithInterceptor(v8::internal::Object*, unsigned int)
+     8.28%   DumpRenderTree  DumpRenderTree               [.] v8::internal::LoadPropertyWithInterceptorOnly(v8::internal::Arguments, v8::internal::Isolate*)
+     5.60%   DumpRenderTree  DumpRenderTree               [.] WTF::AtomicString WebCore::v8StringToWebCoreString<WTF::AtomicString>(v8::Handle<v8::String>, WebCore::ExternalMode)
+     4.60%   DumpRenderTree  DumpRenderTree               [.] WebCore::WeakReferenceMap<void, v8::Object>::get(void*)
+     3.99%   DumpRenderTree  DumpRenderTree               [.] _ZNK3WTF7HashMapIPNS_16AtomicStringImplEPN7WebCore7ElementENS_7PtrHashIS2_EENS_10HashTraitsIS2_EENS8_IS5_EEE3getERKS2_.isra.98
+     3.69%   DumpRenderTree  DumpRenderTree               [.] WebCore::DocumentV8Internal::getElementByIdCallback(v8::Arguments const&)
+     3.23%   DumpRenderTree  DumpRenderTree               [.] WebCore::V8ParameterBase::prepareBase()
+     2.83%   DumpRenderTree  DumpRenderTree               [.] WTF::AtomicString::add(unsigned short const*, unsigned int)
+     2.73%   DumpRenderTree  DumpRenderTree               [.] WebCore::DocumentV8Internal::getElementsByTagNameCallback(v8::Arguments const&)
+     2.47%   DumpRenderTree  DumpRenderTree               [.] _ZN2v86Object27GetPointerFromInternalFieldEi.constprop.439
+     2.43%   DumpRenderTree  DumpRenderTree               [.] v8::internal::Isolate::SetCurrentVMState(v8::internal::StateTag)
+"""
+        expected_first_ten_lines = """    16.18%   DumpRenderTree  perf-14168.map               [.] 0x21270ac0cf43
+    12.72%   DumpRenderTree  DumpRenderTree               [.] v8::internal::JSObject::GetElementWithInterceptor(v8::internal::Object*, unsigned int)
+     8.28%   DumpRenderTree  DumpRenderTree               [.] v8::internal::LoadPropertyWithInterceptorOnly(v8::internal::Arguments, v8::internal::Isolate*)
+     5.60%   DumpRenderTree  DumpRenderTree               [.] WTF::AtomicString WebCore::v8StringToWebCoreString<WTF::AtomicString>(v8::Handle<v8::String>, WebCore::ExternalMode)
+     4.60%   DumpRenderTree  DumpRenderTree               [.] WebCore::WeakReferenceMap<void, v8::Object>::get(void*)
+     3.99%   DumpRenderTree  DumpRenderTree               [.] _ZNK3WTF7HashMapIPNS_16AtomicStringImplEPN7WebCore7ElementENS_7PtrHashIS2_EENS_10HashTraitsIS2_EENS8_IS5_EEE3getERKS2_.isra.98
+     3.69%   DumpRenderTree  DumpRenderTree               [.] WebCore::DocumentV8Internal::getElementByIdCallback(v8::Arguments const&)
+     3.23%   DumpRenderTree  DumpRenderTree               [.] WebCore::V8ParameterBase::prepareBase()
+     2.83%   DumpRenderTree  DumpRenderTree               [.] WTF::AtomicString::add(unsigned short const*, unsigned int)
+     2.73%   DumpRenderTree  DumpRenderTree               [.] WebCore::DocumentV8Internal::getElementsByTagNameCallback(v8::Arguments const&)
+"""
+        host = MockSystemHost()
+        profiler = chromium_android.AndroidPerf(host, '/bin/executable', '/tmp/output', 'adb-path', 'device-serial', '/tmp/symfs', '/tmp/kallsyms', 'foo')
+        self.assertEqual(profiler._first_ten_lines_of_profile(perf_output), expected_first_ten_lines)
 
 
 class ChromiumAndroidDriverTwoDriversTest(unittest.TestCase):
@@ -268,10 +324,10 @@
         driver1 = chromium_android.ChromiumAndroidDriver(port, worker_number=1, pixel_tests=True)
 
         cmd_line0 = driver0.cmd_line(True, ['anything'])
-        self.assertEquals(['adb', '-s', mock_run_command._mock_devices[0], 'shell'], cmd_line0)
+        self.assertEqual(['adb', '-s', mock_run_command._mock_devices[0], 'shell'], cmd_line0)
 
         cmd_line1 = driver1.cmd_line(True, ['anything'])
-        self.assertEquals(['adb', '-s', mock_run_command._mock_devices[1], 'shell'], cmd_line1)
+        self.assertEqual(['adb', '-s', mock_run_command._mock_devices[1], 'shell'], cmd_line1)
 
 
 class ChromiumAndroidTwoPortsTest(unittest.TestCase):
@@ -286,9 +342,5 @@
                 MockSystemHost(executive=MockExecutive2(run_command_fn=mock_run_command.mock_run_command_fn)),
                 'chromium-android', options=options)
         cmd_line = port1.driver_cmd_line()
-        self.assertEquals(cmd_line.count('--encode-binary'), 1)
-        self.assertEquals(cmd_line.count('--enable-hardware-gpu'), 1)
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertEqual(cmd_line.count('--encode-binary'), 1)
+        self.assertEqual(cmd_line.count('--enable-hardware-gpu'), 1)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux.py
index 7c37fd1..1d88db7 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,6 +28,7 @@
 
 import logging
 
+from webkitpy.common.webkit_finder import WebKitFinder
 from webkitpy.layout_tests.port import chromium
 from webkitpy.layout_tests.port import config
 
@@ -61,7 +61,7 @@
     def _determine_driver_path_statically(cls, host, options):
         config_object = config.Config(host.executive, host.filesystem)
         build_directory = getattr(options, 'build_directory', None)
-        webkit_base = config_object.path_from_webkit_base()
+        webkit_base = WebKitFinder(host.filesystem).webkit_base()
         chromium_base = cls._chromium_base_dir(host.filesystem)
         if hasattr(options, 'configuration') and options.configuration:
             configuration = options.configuration
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux_unittest.py
index 169c2f4..308d02f 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_linux_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system import executive_mock
 from webkitpy.common.system.systemhost_mock import MockSystemHost
@@ -47,7 +47,7 @@
             host.executive = executive_mock.MockExecutive2(file_output)
 
         port = self.make_port(host, port_name=port_name)
-        self.assertEquals(port.architecture(), expected_architecture)
+        self.assertEqual(port.architecture(), expected_architecture)
         if expected_architecture == 'x86':
             self.assertTrue(port.baseline_path().endswith('chromium-linux-x86'))
             self.assertTrue(port.baseline_search_path()[0].endswith('chromium-linux-x86'))
@@ -74,14 +74,14 @@
     def test_determine_architecture_fails(self):
         # Test that we default to 'x86' if the driver doesn't exist.
         port = self.make_port()
-        self.assertEquals(port.architecture(), 'x86_64')
+        self.assertEqual(port.architecture(), 'x86_64')
 
         # Test that we default to 'x86' on an unknown architecture.
         host = MockSystemHost()
         host.filesystem.exists = lambda x: True
         host.executive = executive_mock.MockExecutive2('win32')
         port = self.make_port(host=host)
-        self.assertEquals(port.architecture(), 'x86_64')
+        self.assertEqual(port.architecture(), 'x86_64')
 
         # Test that we raise errors if something weird happens.
         host.executive = executive_mock.MockExecutive2(exception=AssertionError)
@@ -99,10 +99,6 @@
         options = MockOptions(configuration='Release', build_directory='foo')
         self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/out/Release'], 'foo/Release')
 
-        # Test that we look in a chromium directory before the webkit directory.
-        options = MockOptions(configuration='Release', build_directory=None)
-        self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/out/Release', '/mock-checkout/out/Release'], '/mock-checkout/Source/WebKit/chromium/out/Release')
-
         # Test that we prefer the legacy dir over the new dir.
         options = MockOptions(configuration='Release', build_directory=None)
         self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/sconsbuild/Release', '/mock-checkout/Source/WebKit/chromium/out/Release'], '/mock-checkout/Source/WebKit/chromium/sconsbuild/Release')
@@ -112,7 +108,4 @@
         self.assertTrue(self.make_port(options=MockOptions(driver_name='OtherDriver'))._path_to_driver().endswith('OtherDriver'))
 
     def test_path_to_image_diff(self):
-        self.assertEquals(self.make_port()._path_to_image_diff(), '/mock-checkout/out/Release/ImageDiff')
-
-if __name__ == '__main__':
-    port_testcase.main()
+        self.assertEqual(self.make_port()._path_to_image_diff(), '/mock-checkout/out/Release/ImageDiff')
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac.py
index 21b7e31..39de529 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -92,14 +91,6 @@
     def operating_system(self):
         return 'mac'
 
-    def expectations_files(self):
-        # FIXME: This is a temporary hack while getting the 10.8 baselines up to date.
-        # See https://bugs.webkit.org/show_bug.cgi?id=99505
-        files = super(ChromiumMacPort, self).expectations_files()
-        if self.name() == 'chromium-mac-mountainlion':
-            files.append(self._filesystem.join(self._webkit_baseline_path(self.name()), 'TestExpectations'))
-        return files
-
     #
     # PROTECTED METHODS
     #
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py
index b02af5c..bf2ff8f 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_mac_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.port import chromium_mac
 from webkitpy.layout_tests.port import chromium_port_testcase
@@ -41,7 +41,7 @@
 
     def assert_name(self, port_name, os_version_string, expected):
         port = self.make_port(os_version=os_version_string, port_name=port_name)
-        self.assertEquals(expected, port.name())
+        self.assertEqual(expected, port.name())
 
     def test_versions(self):
         self.assertTrue(self.make_port().name() in ('chromium-mac-snowleopard', 'chromium-mac-lion', 'chromium-mac-mountainlion', 'chromium-mac-future'))
@@ -64,16 +64,16 @@
 
     def test_baseline_path(self):
         port = self.make_port(port_name='chromium-mac-snowleopard')
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path('chromium-mac-snowleopard'))
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path('chromium-mac-snowleopard'))
 
         port = self.make_port(port_name='chromium-mac-lion')
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path('chromium-mac-lion'))
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path('chromium-mac-lion'))
 
         port = self.make_port(port_name='chromium-mac-mountainlion')
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path('chromium-mac'))
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path('chromium-mac'))
 
         port = self.make_port(port_name='chromium-mac-future')
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path('chromium-mac'))
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path('chromium-mac'))
 
     def test_operating_system(self):
         self.assertEqual('mac', self.make_port().operating_system())
@@ -87,24 +87,25 @@
         options = MockOptions(configuration='Release', build_directory='foo')
         self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/out/Release'], 'foo/Release')
 
-        # Test that we look in a chromium directory before the webkit directory.
-        options = MockOptions(configuration='Release', build_directory=None)
-        self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/out/Release', '/mock-checkout/out/Release'], '/mock-checkout/Source/WebKit/chromium/out/Release')
-
         # Test that we prefer the legacy dir over the new dir.
         options = MockOptions(configuration='Release', build_directory=None)
         self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/xcodebuild/Release', '/mock-checkout/Source/WebKit/chromium/out/Release'], '/mock-checkout/Source/WebKit/chromium/xcodebuild/Release')
 
+    def test_build_path_timestamps(self):
+        options = MockOptions(configuration='Release', build_directory=None)
+        port = self.make_port(options=options)
+        port.host.filesystem.maybe_make_directory('/mock-checkout/out/Release')
+        port.host.filesystem.maybe_make_directory('/mock-checkout/xcodebuild/Release')
+        # Check with 'out' being newer.
+        port.host.filesystem.mtime = lambda f: 5 if '/out/' in f else 4
+        self.assertEqual(port._build_path(), '/mock-checkout/out/Release')
+        # Check with 'xcodebuild' being newer.
+        port.host.filesystem.mtime = lambda f: 5 if '/xcodebuild/' in f else 4
+        self.assertEqual(port._build_path(), '/mock-checkout/xcodebuild/Release')
+
     def test_driver_name_option(self):
         self.assertTrue(self.make_port()._path_to_driver().endswith('DumpRenderTree'))
         self.assertTrue(self.make_port(options=MockOptions(driver_name='OtherDriver'))._path_to_driver().endswith('OtherDriver'))
 
     def test_path_to_image_diff(self):
-        self.assertEquals(self.make_port()._path_to_image_diff(), '/mock-checkout/out/Release/ImageDiff')
-
-    def test_ml_expectations(self):
-        self.assertTrue(self.make_port(port_name='chromium-mac-mountainlion').expectations_files()[-1].endswith('-mountainlion/TestExpectations'))
-        self.assertFalse(self.make_port(port_name='chromium-mac-lion').expectations_files()[-1].endswith('-mountainlion/TestExpectations'))
-
-if __name__ == '__main__':
-    port_testcase.main()
+        self.assertEqual(self.make_port()._path_to_image_diff(), '/mock-checkout/out/Release/ImageDiff')
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py
index a082a13..f151ced 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_port_testcase.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system import logtesting
 from webkitpy.common.system.executive_mock import MockExecutive2
@@ -51,16 +51,16 @@
     def test_default_max_locked_shards(self):
         port = self.make_port()
         port.default_child_processes = lambda: 16
-        self.assertEquals(port.default_max_locked_shards(), 4)
+        self.assertEqual(port.default_max_locked_shards(), 4)
         port.default_child_processes = lambda: 2
-        self.assertEquals(port.default_max_locked_shards(), 1)
+        self.assertEqual(port.default_max_locked_shards(), 1)
 
     def test_default_timeout_ms(self):
-        self.assertEquals(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 6000)
-        self.assertEquals(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 12000)
+        self.assertEqual(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 6000)
+        self.assertEqual(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 12000)
 
     def test_default_pixel_tests(self):
-        self.assertEquals(self.make_port().default_pixel_tests(), True)
+        self.assertEqual(self.make_port().default_pixel_tests(), True)
 
     def test_missing_symbol_to_skipped_tests(self):
         # Test that we get the chromium skips and not the webkit default skips
@@ -72,7 +72,7 @@
     def test_all_test_configurations(self):
         """Validate the complete set of configurations this port knows about."""
         port = self.make_port()
-        self.assertEquals(set(port.all_test_configurations()), set([
+        self.assertEqual(set(port.all_test_configurations()), set([
             TestConfiguration('icecreamsandwich', 'x86', 'debug'),
             TestConfiguration('icecreamsandwich', 'x86', 'release'),
             TestConfiguration('snowleopard', 'x86', 'debug'),
@@ -103,7 +103,7 @@
     class TestAndroidPort(chromium_android.ChromiumAndroidPort):
         def __init__(self, options=None):
             options = options or MockOptions()
-            chromium_win.ChromiumAndroidPort.__init__(self, MockSystemHost(os_name='android', os_version='icecreamsandwich'), 'chromium-android', options=options)
+            chromium_android.ChromiumAndroidPort.__init__(self, MockSystemHost(os_name='android', os_version='icecreamsandwich'), 'chromium-android', options=options)
 
         def default_configuration(self):
             self.default_configuration_called = True
@@ -130,12 +130,12 @@
     def test_default_configuration(self):
         mock_options = MockOptions()
         port = ChromiumPortTestCase.TestLinuxPort(options=mock_options)
-        self.assertEquals(mock_options.configuration, 'default')
+        self.assertEqual(mock_options.configuration, 'default')  # pylint: disable=E1101
         self.assertTrue(port.default_configuration_called)
 
         mock_options = MockOptions(configuration=None)
         port = ChromiumPortTestCase.TestLinuxPort(mock_options)
-        self.assertEquals(mock_options.configuration, 'default')
+        self.assertEqual(mock_options.configuration, 'default')  # pylint: disable=E1101
         self.assertTrue(port.default_configuration_called)
 
     def test_diff_image(self):
@@ -152,11 +152,11 @@
 
         # Images are different.
         port._executive = MockExecutive2(run_command_fn=mock_run_command)
-        self.assertEquals(mock_image_diff, port.diff_image("EXPECTED", "ACTUAL")[0])
+        self.assertEqual(mock_image_diff, port.diff_image("EXPECTED", "ACTUAL")[0])
 
         # Images are the same.
         port._executive = MockExecutive2(exit_code=0)
-        self.assertEquals(None, port.diff_image("EXPECTED", "ACTUAL")[0])
+        self.assertEqual(None, port.diff_image("EXPECTED", "ACTUAL")[0])
 
         # There was some error running image_diff.
         port._executive = MockExecutive2(exit_code=2)
@@ -170,12 +170,13 @@
     def test_diff_image_crashed(self):
         port = ChromiumPortTestCase.TestLinuxPort()
         port._executive = MockExecutive2(exit_code=2)
-        self.assertEquals(port.diff_image("EXPECTED", "ACTUAL"), (None, 0, 'image diff returned an exit code of 2'))
+        self.assertEqual(port.diff_image("EXPECTED", "ACTUAL"), (None, 0, 'image diff returned an exit code of 2'))
 
     def test_expectations_files(self):
         port = self.make_port()
         port.port_name = 'chromium'
 
+        generic_path = port.path_to_generic_test_expectations_file()
         expectations_path = port.path_to_test_expectations_file()
         chromium_overrides_path = port.path_from_chromium_base(
             'webkit', 'tools', 'layout_tests', 'test_expectations.txt')
@@ -185,15 +186,15 @@
         port._filesystem.write_text_file(skia_overrides_path, 'dummay text')
 
         port._options.builder_name = 'DUMMY_BUILDER_NAME'
-        self.assertEquals(port.expectations_files(), [expectations_path, skia_overrides_path, chromium_overrides_path])
+        self.assertEqual(port.expectations_files(), [generic_path, expectations_path, skia_overrides_path, chromium_overrides_path])
 
         port._options.builder_name = 'builder (deps)'
-        self.assertEquals(port.expectations_files(), [expectations_path, skia_overrides_path, chromium_overrides_path])
+        self.assertEqual(port.expectations_files(), [generic_path, expectations_path, skia_overrides_path, chromium_overrides_path])
 
         # A builder which does NOT observe the Chromium test_expectations,
         # but still observes the Skia test_expectations...
         port._options.builder_name = 'builder'
-        self.assertEquals(port.expectations_files(), [expectations_path, skia_overrides_path])
+        self.assertEqual(port.expectations_files(), [generic_path, expectations_path, skia_overrides_path])
 
     def test_expectations_ordering(self):
         # since we don't implement self.port_name in ChromiumPort.
@@ -217,7 +218,3 @@
             'ERROR: To override, invoke with --nocheck-sys-deps\n',
             'ERROR: \n',
             'ERROR: testing output failure\n'])
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_unittest.py
index 87de41c..c6c50df 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_unittest.py
@@ -28,12 +28,10 @@
 
 import StringIO
 import time
-import unittest
 
 from webkitpy.common.system import logtesting
 from webkitpy.common.system.executive_mock import MockExecutive2
 from webkitpy.common.system.systemhost_mock import MockSystemHost
-from webkitpy.layout_tests.port.config_mock import MockConfig
 from webkitpy.thirdparty.mock import Mock
 from webkitpy.tool.mocktool import MockOptions
 
@@ -63,7 +61,3 @@
             'ERROR: To override, invoke with --nocheck-sys-deps\n',
             'ERROR: \n',
             'ERROR: testing output failure\n'])
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py
old mode 100755
new mode 100644
index 3266c39..31e10c5
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py
index dc184fc..2c51598 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/chromium_win_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import os
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system import outputcapture
 from webkitpy.common.system.executive_mock import MockExecutive
@@ -59,22 +59,22 @@
     def test_setup_environ_for_server_cygpath(self):
         port = self.make_port()
         env = port.setup_environ_for_server(port.driver_name())
-        self.assertEquals(env['CYGWIN_PATH'], '/mock-checkout/Source/WebKit/chromium/third_party/cygwin/bin')
+        self.assertEqual(env['CYGWIN_PATH'], '/mock-checkout/Source/WebKit/chromium/third_party/cygwin/bin')
 
     def test_setup_environ_for_server_register_cygwin(self):
         port = self.make_port(options=MockOptions(register_cygwin=True, results_directory='/'))
         port._executive = MockExecutive(should_log=True)
-        expected_stderr = "MOCK run_command: ['/mock-checkout/Source/WebKit/chromium/third_party/cygwin/setup_mount.bat'], cwd=None\n"
+        expected_logs = "MOCK run_command: ['/mock-checkout/Source/WebKit/chromium/third_party/cygwin/setup_mount.bat'], cwd=None\n"
         output = outputcapture.OutputCapture()
-        output.assert_outputs(self, port.setup_environ_for_server, expected_stderr=expected_stderr)
+        output.assert_outputs(self, port.setup_environ_for_server, expected_logs=expected_logs)
 
     def assert_name(self, port_name, os_version_string, expected):
         port = self.make_port(port_name=port_name, os_version=os_version_string)
-        self.assertEquals(expected, port.name())
+        self.assertEqual(expected, port.name())
 
     def test_versions(self):
         port = self.make_port()
-        self.assertTrue(port.name() in ('chromium-win-xp', 'chromium-win-win7'))
+        self.assertIn(port.name(), ('chromium-win-xp', 'chromium-win-win7'))
 
         self.assert_name(None, 'xp', 'chromium-win-xp')
         self.assert_name('chromium-win', 'xp', 'chromium-win-xp')
@@ -92,10 +92,10 @@
 
     def test_baseline_path(self):
         port = self.make_port(port_name='chromium-win-xp')
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path('chromium-win-xp'))
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path('chromium-win-xp'))
 
         port = self.make_port(port_name='chromium-win-win7')
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path('chromium-win'))
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path('chromium-win'))
 
     def test_build_path(self):
         # Test that optional paths are used regardless of whether they exist.
@@ -106,14 +106,22 @@
         options = MockOptions(configuration='Release', build_directory='foo')
         self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/out/Release'], 'foo/Release')
 
-        # Test that we look in a chromium directory before the webkit directory.
-        options = MockOptions(configuration='Release', build_directory=None)
-        self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/out/Release', '/mock-checkout/out/Release'], '/mock-checkout/Source/WebKit/chromium/out/Release')
-
         # Test that we prefer the legacy dir over the new dir.
         options = MockOptions(configuration='Release', build_directory=None)
         self.assert_build_path(options, ['/mock-checkout/Source/WebKit/chromium/build/Release', '/mock-checkout/Source/WebKit/chromium/out'], '/mock-checkout/Source/WebKit/chromium/build/Release')
 
+    def test_build_path_timestamps(self):
+        options = MockOptions(configuration='Release', build_directory=None)
+        port = self.make_port(options=options)
+        port.host.filesystem.maybe_make_directory('/mock-checkout/out/Release')
+        port.host.filesystem.maybe_make_directory('/mock-checkout/build/Release')
+        # Check with 'out' being newer.
+        port.host.filesystem.mtime = lambda f: 5 if '/out/' in f else 4
+        self.assertEqual(port._build_path(), '/mock-checkout/out/Release')
+        # Check with 'build' being newer.
+        port.host.filesystem.mtime = lambda f: 5 if '/build/' in f else 4
+        self.assertEqual(port._build_path(), '/mock-checkout/build/Release')
+
     def test_operating_system(self):
         self.assertEqual('win', self.make_port().operating_system())
 
@@ -122,4 +130,4 @@
         self.assertTrue(self.make_port(options=MockOptions(driver_name='OtherDriver'))._path_to_driver().endswith('OtherDriver.exe'))
 
     def test_path_to_image_diff(self):
-        self.assertEquals(self.make_port()._path_to_image_diff(), '/mock-checkout/out/Release/ImageDiff.exe')
+        self.assertEqual(self.make_port()._path_to_image_diff(), '/mock-checkout/out/Release/ImageDiff.exe')
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/config.py b/Tools/Scripts/webkitpy/layout_tests/port/config.py
index dd8f331..8c89353 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/config.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/config.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,14 +28,14 @@
 
 """Wrapper objects for WebKit-specific utility routines."""
 
-# FIXME: This file needs to be unified with common/checkout/scm.py and
-# common/config/ports.py .
+# FIXME: This file needs to be unified with common/config/ports.py .
 
-from webkitpy.common.system import logutils
-from webkitpy.common.system import executive
+import logging
+
+from webkitpy.common import webkit_finder
 
 
-_log = logutils.get_logger(__file__)
+_log = logging.getLogger(__name__)
 
 #
 # FIXME: This is used to record if we've already hit the filesystem to look
@@ -64,7 +63,7 @@
     def __init__(self, executive, filesystem, port_implementation=None):
         self._executive = executive
         self._filesystem = filesystem
-        self._webkit_base_dir = None
+        self._webkit_finder = webkit_finder.WebKitFinder(self._filesystem)
         self._default_configuration = None
         self._build_directories = {}
         self._port_implementation = port_implementation
@@ -81,8 +80,8 @@
             flags.append('--' + self._port_implementation)
 
         if not self._build_directories.get(configuration):
-            args = ["perl", self.script_path("webkit-build-directory")] + flags
-            output = self._executive.run_command(args, cwd=self.webkit_base_dir(), return_stderr=False).rstrip()
+            args = ["perl", self._webkit_finder.path_to_script("webkit-build-directory")] + flags
+            output = self._executive.run_command(args, cwd=self._webkit_finder.webkit_base(), return_stderr=False).rstrip()
             parts = output.split("\n")
             self._build_directories[configuration] = parts[0]
 
@@ -111,32 +110,6 @@
             _log.warn("Scripts may fail.  See 'set-webkit-configuration --help'.")
         return self._default_configuration
 
-    def path_from_webkit_base(self, *comps):
-        return self._filesystem.join(self.webkit_base_dir(), *comps)
-
-    # FIXME: We should only have one implementation of this logic,
-    # if scm.find_checkout_root() is broken for Chromium, we should fix (or at least wrap) it!
-    def webkit_base_dir(self):
-        """Returns the absolute path to the top of the WebKit tree.
-
-        Raises an AssertionError if the top dir can't be determined."""
-        # Note: this code somewhat duplicates the code in
-        # scm.find_checkout_root(). However, that code only works if the top
-        # of the SCM repository also matches the top of the WebKit tree. The
-        # Chromium ports, for example, only check out subdirectories like
-        # Tools/Scripts, and so we still have to do additional work
-        # to find the top of the tree.
-        #
-        # This code will also work if there is no SCM system at all.
-        if not self._webkit_base_dir:
-            config_module_path = self._filesystem.path_to_module(self.__module__)
-            self._webkit_base_dir = config_module_path[0:config_module_path.find('Tools') - 1]
-        return self._webkit_base_dir
-
-    def script_path(self, script_name):
-        # This is intentionally relative. Callers should pass the checkout_root/webkit_base_dir to run_command as the cwd.
-        return self._filesystem.join("Tools", "Scripts", script_name)
-
     def _determine_configuration(self):
         # This mirrors the logic in webkitdirs.pm:determineConfiguration().
         #
@@ -162,7 +135,7 @@
             configuration_path = self._filesystem.join(self.build_directory(None), "Configuration")
             if not self._filesystem.exists(configuration_path):
                 return None
-        except (OSError, executive.ScriptError):
+        except:
             return None
 
         return self._filesystem.read_text_file(configuration_path).rstrip()
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/config_mock.py b/Tools/Scripts/webkitpy/layout_tests/port/config_mock.py
deleted file mode 100644
index 5476e4b..0000000
--- a/Tools/Scripts/webkitpy/layout_tests/port/config_mock.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2010 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Wrapper objects for WebKit-specific utility routines."""
-
-from webkitpy.common.system.filesystem_mock import MockFileSystem
-
-
-class MockConfig(object):
-    _FLAGS_FROM_CONFIGURATIONS = {
-        "Debug": "--debug",
-        "Release": "--release",
-    }
-
-    def __init__(self, filesystem=None, default_configuration='Release', port_implementation=None):
-        self._filesystem = filesystem or MockFileSystem()
-        self._default_configuration = default_configuration
-        self._port_implmentation = port_implementation
-
-    def flag_for_configuration(self, configuration):
-        return self._FLAGS_FROM_CONFIGURATIONS[configuration]
-
-    def build_directory(self, configuration):
-        return "/mock-build"
-
-    def build_dumprendertree(self, configuration):
-        return True
-
-    def default_configuration(self):
-        return self._default_configuration
-
-    def path_from_webkit_base(self, *comps):
-        # FIXME: This could use self._filesystem.join, but that doesn't handle empty lists.
-        return self.webkit_base_dir() + "/" + "/".join(list(comps))
-
-    def script_path(self, script_name):
-        # This is intentionally relative. Callers should pass the checkout_root/webkit_base_dir to run_command as the cwd.
-        return self._filesystem.join("Tools", "Scripts", script_name)
-
-    def webkit_base_dir(self):
-        return "/mock-checkout"
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/config_standalone.py b/Tools/Scripts/webkitpy/layout_tests/port/config_standalone.py
index 5b04831..274a07b 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/config_standalone.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/config_standalone.py
@@ -33,7 +33,6 @@
 this test when we remove the global configuration cache in config.py."""
 
 import os
-import unittest
 import sys
 
 
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/config_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/config_unittest.py
index 96ba5ff..27c83ee 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/config_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/config_unittest.py
@@ -28,13 +28,14 @@
 
 import os
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive import Executive, ScriptError
-from webkitpy.common.system.executive_mock import MockExecutive, MockExecutive2
+from webkitpy.common.system.executive_mock import MockExecutive2
 from webkitpy.common.system.filesystem import FileSystem
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
+from webkitpy.common.webkit_finder import WebKitFinder
 
 import config
 
@@ -131,12 +132,11 @@
         e = Executive()
         fs = FileSystem()
         c = config.Config(e, fs)
-        script = c.path_from_webkit_base('Tools', 'Scripts', 'webkitpy', 'layout_tests', 'port', 'config_standalone.py')
+        script = WebKitFinder(fs).path_from_webkit_base('Tools', 'Scripts', 'webkitpy', 'layout_tests', 'port', 'config_standalone.py')
 
         # Note: don't use 'Release' here, since that's the normal default.
         expected = 'Debug'
 
-        # FIXME: Why are we running a python subprocess here??
         args = [sys.executable, script, '--mock', expected]
         actual = e.run_command(args).rstrip()
         self.assertEqual(actual, expected)
@@ -156,33 +156,3 @@
         c = self.make_config(exception=ScriptError())
         actual = c.default_configuration()
         self.assertEqual(actual, 'Release')
-
-    def test_path_from_webkit_base(self):
-        c = config.Config(MockExecutive(), MockFileSystem())
-        self.assertTrue(c.path_from_webkit_base('foo'))
-
-    def test_webkit_base_dir(self):
-        # FIXME: We use a real filesystem here. Should this move to a mocked one?
-        executive = Executive()
-        filesystem = FileSystem()
-        c = config.Config(executive, filesystem)
-        base_dir = c.webkit_base_dir()
-        self.assertTrue(base_dir)
-        self.assertNotEqual(base_dir[-1], '/')
-
-        # FIXME: Once we use a MockFileSystem for this test we don't need to save the orig_cwd.
-        orig_cwd = filesystem.getcwd()
-        if sys.platform == 'win32':
-            filesystem.chdir(os.environ['USERPROFILE'])
-        else:
-            filesystem.chdir(os.environ['HOME'])
-        c = config.Config(executive, filesystem)
-        try:
-            base_dir_2 = c.webkit_base_dir()
-            self.assertEqual(base_dir, base_dir_2)
-        finally:
-            filesystem.chdir(orig_cwd)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/driver.py b/Tools/Scripts/webkitpy/layout_tests/port/driver.py
index 7993d05..5858f55 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/driver.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/driver.py
@@ -36,6 +36,7 @@
 import os
 
 from webkitpy.common.system import path
+from webkitpy.common.system.profiler import ProfilerFactory
 
 
 _log = logging.getLogger(__name__)
@@ -77,7 +78,7 @@
 
     def __init__(self, text, image, image_hash, audio, crash=False,
             test_time=0, measurements=None, timeout=False, error='', crashed_process_name='??',
-            crashed_pid=None, crash_log=None):
+            crashed_pid=None, crash_log=None, pid=None):
         # FIXME: Args could be renamed to better clarify what they do.
         self.text = text
         self.image = image  # May be empty-string if the test crashes.
@@ -92,6 +93,7 @@
         self.measurements = measurements
         self.timeout = timeout
         self.error = error  # stderr output
+        self.pid = pid
 
     def has_stderr(self):
         return bool(self.error)
@@ -140,6 +142,12 @@
         self._server_process = None
 
         self._measurements = {}
+        if self._port.get_option("profile"):
+            profiler_name = self._port.get_option("profiler")
+            self._profiler = ProfilerFactory.create_profiler(self._port.host,
+                self._port._path_to_driver(), self._port.results_directory(), profiler_name)
+        else:
+            self._profiler = None
 
     def __del__(self):
         self.stop()
@@ -151,7 +159,7 @@
         the driver in an indeterminate state. The upper layers of the program
         are responsible for cleaning up and ensuring things are okay.
 
-        Returns a DriverOuput object.
+        Returns a DriverOutput object.
         """
         start_time = time.time()
         self.start(driver_input.should_run_pixel_test, driver_input.args)
@@ -168,6 +176,7 @@
 
         crashed = self.has_crashed()
         timed_out = self._server_process.timed_out
+        pid = self._server_process.pid()
 
         if stop_when_done or crashed or timed_out:
             # We call stop() even if we crashed or timed out in order to get any remaining stdout/stderr output.
@@ -199,7 +208,7 @@
             crash=crashed, test_time=time.time() - test_begin_time, measurements=self._measurements,
             timeout=timed_out, error=self.error_from_test,
             crashed_process_name=self._crashed_process_name,
-            crashed_pid=self._crashed_pid, crash_log=crash_log)
+            crashed_pid=self._crashed_pid, crash_log=crash_log, pid=pid)
 
     def _get_crash_log(self, stdout, stderr, newer_than):
         return self._port._get_crash_log(self._crashed_process_name, self._crashed_pid, stdout, stderr, newer_than)
@@ -269,12 +278,9 @@
         # into run_test() directly.
         if not self._server_process:
             self._start(pixel_tests, per_test_args)
+            self._run_post_start_tasks()
 
-    def _start(self, pixel_tests, per_test_args):
-        self.stop()
-        self._driver_tempdir = self._port._filesystem.mkdtemp(prefix='%s-' % self._port.driver_name())
-        server_name = self._port.driver_name()
-        environment = self._port.setup_environ_for_server(server_name)
+    def _setup_environ_for_driver(self, environment):
         environment['DYLD_LIBRARY_PATH'] = self._port._build_path()
         environment['DYLD_FRAMEWORK_PATH'] = self._port._build_path()
         # FIXME: We're assuming that WebKitTestRunner checks this DumpRenderTree-named environment variable.
@@ -282,15 +288,36 @@
         environment['LOCAL_RESOURCE_ROOT'] = self._port.layout_tests_dir()
         if 'WEBKITOUTPUTDIR' in os.environ:
             environment['WEBKITOUTPUTDIR'] = os.environ['WEBKITOUTPUTDIR']
+        if self._profiler:
+            environment = self._profiler.adjusted_environment(environment)
+        return environment
+
+    def _start(self, pixel_tests, per_test_args):
+        self.stop()
+        self._driver_tempdir = self._port._filesystem.mkdtemp(prefix='%s-' % self._port.driver_name())
+        server_name = self._port.driver_name()
+        environment = self._port.setup_environ_for_server(server_name)
+        environment = self._setup_environ_for_driver(environment)
         self._crashed_process_name = None
         self._crashed_pid = None
         self._server_process = self._port._server_process_constructor(self._port, server_name, self.cmd_line(pixel_tests, per_test_args), environment)
         self._server_process.start()
 
+    def _run_post_start_tasks(self):
+        # Remote drivers may override this to delay post-start tasks until the server has ack'd.
+        if self._profiler:
+            self._profiler.attach_to_pid(self._pid_on_target())
+
+    def _pid_on_target(self):
+        # Remote drivers will override this method to return the pid on the device.
+        return self._server_process.pid()
+
     def stop(self):
         if self._server_process:
             self._server_process.stop(self._port.driver_stop_timeout())
             self._server_process = None
+            if self._profiler:
+                self._profiler.profile_after_exit()
 
         if self._driver_tempdir:
             self._port._filesystem.rmtree(str(self._driver_tempdir))
@@ -335,6 +362,7 @@
             _log.debug('%s crash, pid = %s, error_line = %s' % (self._crashed_process_name, str(pid), error_line))
             if error_line.startswith("#PROCESS UNRESPONSIVE - "):
                 self._subprocess_was_unresponsive = True
+                self._port.sample_process(self._crashed_process_name, self._crashed_pid)
                 # We want to show this since it's not a regular crash and probably we don't have a crash log.
                 self.error_from_test += error_line
             return True
@@ -354,6 +382,8 @@
         assert not driver_input.image_hash or driver_input.should_run_pixel_test
 
         # ' is the separator between arguments.
+        if self._port.supports_per_test_timeout():
+            command += "'--timeout'%s" % driver_input.timeout
         if driver_input.should_run_pixel_test:
             command += "'--pixel-test"
         if driver_input.image_hash:
@@ -514,16 +544,6 @@
 
         return self._running_drivers[cmd_line_key].run_test(driver_input, stop_when_done)
 
-    def start(self):
-        # FIXME: Callers shouldn't normally call this, since this routine
-        # may not be specifying the correct combination of pixel test and
-        # per_test args.
-        #
-        # The only reason we have this routine at all is so the perftestrunner
-        # can pause before running a test; it might be better to push that
-        # into run_test() directly.
-        self._driver.start(self._port.get_option('pixel_tests'), [])
-
     def has_crashed(self):
         return any(driver.has_crashed() for driver in self._running_drivers.values())
 
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/driver_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/driver_unittest.py
index 5b11ade..32173a8 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/driver_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/driver_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.systemhost_mock import MockSystemHost
 
@@ -36,6 +36,8 @@
 # FIXME: remove the dependency on TestWebKitPort
 from webkitpy.layout_tests.port.port_testcase import TestWebKitPort
 
+from webkitpy.tool.mocktool import MockOptions
+
 
 class DriverOutputTest(unittest.TestCase):
     def test_strip_metrics(self):
@@ -80,7 +82,9 @@
 
 class DriverTest(unittest.TestCase):
     def make_port(self):
-        return Port(MockSystemHost())
+        port = Port(MockSystemHost(), 'test', MockOptions(configuration='Release'))
+        port._config.build_directory = lambda configuration: '/mock-build'
+        return port
 
     def _assert_wrapper(self, wrapper_string, expected_wrapper):
         wrapper = Driver(self.make_port(), None, pixel_tests=False)._command_wrapper(wrapper_string)
@@ -119,9 +123,9 @@
             "#EOF",
         ])
         content_block = driver._read_block(0)
-        self.assertEquals(content_block.content_type, 'my_type')
-        self.assertEquals(content_block.encoding, 'none')
-        self.assertEquals(content_block.content_hash, 'foobar')
+        self.assertEqual(content_block.content_type, 'my_type')
+        self.assertEqual(content_block.encoding, 'none')
+        self.assertEqual(content_block.content_hash, 'foobar')
         driver._server_process = None
 
     def test_read_binary_block(self):
@@ -136,10 +140,10 @@
             "#EOF",
         ])
         content_block = driver._read_block(0)
-        self.assertEquals(content_block.content_type, 'image/png')
-        self.assertEquals(content_block.content_hash, 'actual')
-        self.assertEquals(content_block.content, '12345678\n')
-        self.assertEquals(content_block.decoded_content, '12345678\n')
+        self.assertEqual(content_block.content_type, 'image/png')
+        self.assertEqual(content_block.content_hash, 'actual')
+        self.assertEqual(content_block.content, '12345678\n')
+        self.assertEqual(content_block.decoded_content, '12345678\n')
         driver._server_process = None
 
     def test_read_base64_block(self):
@@ -154,16 +158,17 @@
             'MTIzNDU2NzgK#EOF',
         ])
         content_block = driver._read_block(0)
-        self.assertEquals(content_block.content_type, 'image/png')
-        self.assertEquals(content_block.content_hash, 'actual')
-        self.assertEquals(content_block.encoding, 'base64')
-        self.assertEquals(content_block.content, 'MTIzNDU2NzgK')
-        self.assertEquals(content_block.decoded_content, '12345678\n')
+        self.assertEqual(content_block.content_type, 'image/png')
+        self.assertEqual(content_block.content_hash, 'actual')
+        self.assertEqual(content_block.encoding, 'base64')
+        self.assertEqual(content_block.content, 'MTIzNDU2NzgK')
+        self.assertEqual(content_block.decoded_content, '12345678\n')
 
     def test_no_timeout(self):
         port = TestWebKitPort()
+        port._config.build_directory = lambda configuration: '/mock-build'
         driver = Driver(port, 0, pixel_tests=True, no_timeout=True)
-        self.assertEquals(driver.cmd_line(True, []), ['/mock-build/DumpRenderTree', '--no-timeout', '-'])
+        self.assertEqual(driver.cmd_line(True, []), ['/mock-build/DumpRenderTree', '--no-timeout', '-'])
 
     def test_check_for_driver_crash(self):
         port = TestWebKitPort()
@@ -186,10 +191,10 @@
                 pass
 
         def assert_crash(driver, error_line, crashed, name, pid, unresponsive=False):
-            self.assertEquals(driver._check_for_driver_crash(error_line), crashed)
-            self.assertEquals(driver._crashed_process_name, name)
-            self.assertEquals(driver._crashed_pid, pid)
-            self.assertEquals(driver._subprocess_was_unresponsive, unresponsive)
+            self.assertEqual(driver._check_for_driver_crash(error_line), crashed)
+            self.assertEqual(driver._crashed_process_name, name)
+            self.assertEqual(driver._crashed_pid, pid)
+            self.assertEqual(driver._subprocess_was_unresponsive, unresponsive)
             driver.stop()
 
         driver._server_process = FakeServerProcess(False)
@@ -234,8 +239,8 @@
     def test_creating_a_port_does_not_write_to_the_filesystem(self):
         port = TestWebKitPort()
         driver = Driver(port, 0, pixel_tests=True)
-        self.assertEquals(port._filesystem.written_files, {})
-        self.assertEquals(port._filesystem.last_tmpdir, None)
+        self.assertEqual(port._filesystem.written_files, {})
+        self.assertEqual(port._filesystem.last_tmpdir, None)
 
     def test_stop_cleans_up_properly(self):
         port = TestWebKitPort()
@@ -262,7 +267,3 @@
         driver = Driver(port, 0, pixel_tests=True)
         driver.start(True, [])
         self.assertTrue(driver._server_process.started)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/efl.py b/Tools/Scripts/webkitpy/layout_tests/port/efl.py
index 0c9acd8..0896634 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/efl.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/efl.py
@@ -34,31 +34,41 @@
 from webkitpy.layout_tests.port.pulseaudio_sanitizer import PulseAudioSanitizer
 from webkitpy.layout_tests.port.xvfbdriver import XvfbDriver
 
-class EflPort(Port, PulseAudioSanitizer):
+
+class EflPort(Port):
     port_name = 'efl'
 
     def __init__(self, *args, **kwargs):
         super(EflPort, self).__init__(*args, **kwargs)
 
-        self._jhbuild_wrapper_path = self.path_from_webkit_base('Tools', 'efl', 'run-with-jhbuild')
+        self._jhbuild_wrapper_path = [self.path_from_webkit_base('Tools', 'jhbuild', 'jhbuild-wrapper'), '--efl', 'run']
 
-        self.set_option_default('wrapper', self._jhbuild_wrapper_path)
+        self.set_option_default('wrapper', ' '.join(self._jhbuild_wrapper_path))
         self.webprocess_cmd_prefix = self.get_option('webprocess_cmd_prefix')
 
+        self._pulseaudio_sanitizer = PulseAudioSanitizer()
+
     def _port_flag_for_scripts(self):
         return "--efl"
 
     def setup_test_run(self):
-        self._unload_pulseaudio_module()
+        super(EflPort, self).setup_test_run()
+        self._pulseaudio_sanitizer.unload_pulseaudio_module()
 
     def setup_environ_for_server(self, server_name=None):
         env = super(EflPort, self).setup_environ_for_server(server_name)
+
         # If DISPLAY environment variable is unset in the system
         # e.g. on build bot, remove DISPLAY variable from the dictionary
         if not 'DISPLAY' in os.environ:
             del env['DISPLAY']
+
         env['TEST_RUNNER_INJECTED_BUNDLE_FILENAME'] = self._build_path('lib', 'libTestRunnerInjectedBundle.so')
         env['TEST_RUNNER_PLUGIN_PATH'] = self._build_path('lib')
+
+        # Silence GIO warnings about using the "memory" GSettings backend.
+        env['GSETTINGS_BACKEND'] = 'memory'
+
         if self.webprocess_cmd_prefix:
             env['WEB_PROCESS_CMD_PREFIX'] = self.webprocess_cmd_prefix
 
@@ -73,7 +83,7 @@
 
     def clean_up_test_run(self):
         super(EflPort, self).clean_up_test_run()
-        self._restore_pulseaudio_module()
+        self._pulseaudio_sanitizer.restore_pulseaudio_module()
 
     def _generate_all_test_configurations(self):
         return [TestConfiguration(version=self._version, architecture='x86', build_type=build_type) for build_type in self.ALL_BUILD_TYPES]
@@ -88,7 +98,7 @@
         return self._build_path('bin', 'ImageDiff')
 
     def _image_diff_command(self, *args, **kwargs):
-        return [self._jhbuild_wrapper_path] + super(EflPort, self)._image_diff_command(*args, **kwargs)
+        return self._jhbuild_wrapper_path + super(EflPort, self)._image_diff_command(*args, **kwargs)
 
     def _path_to_webcore_library(self):
         static_path = self._build_path('lib', 'libwebcore_efl.a')
@@ -108,7 +118,7 @@
     def default_baseline_search_path(self):
         return map(self._webkit_baseline_path, self._search_paths())
 
-    def expectations_files(self):
+    def _port_specific_expectations_files(self):
         # FIXME: We should be able to use the default algorithm here.
         return list(reversed([self._filesystem.join(self._webkit_baseline_path(p), 'TestExpectations') for p in self._search_paths()]))
 
@@ -121,3 +131,6 @@
         # FIXME: old-run-webkit-tests also added ["-graphicssystem", "raster", "-style", "windows"]
         # FIXME: old-run-webkit-tests converted results_filename path for cygwin.
         self._run_script("run-launcher", run_launcher_args)
+
+    def check_sys_deps(self, needs_http):
+        return super(EflPort, self).check_sys_deps(needs_http) and XvfbDriver.check_xvfb(self)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/efl_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/efl_unittest.py
index d9851b3..503afda 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/efl_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/efl_unittest.py
@@ -24,20 +24,27 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
+from webkitpy.common.system.executive_mock import MockExecutive
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.layout_tests.port.efl import EflPort
+from webkitpy.layout_tests.port.pulseaudio_sanitizer_mock import PulseAudioSanitizerMock
 from webkitpy.layout_tests.port import port_testcase
-from webkitpy.common.system.executive_mock import MockExecutive
 
 
 class EflPortTest(port_testcase.PortTestCase):
     port_name = 'efl'
     port_maker = EflPort
 
+    # Additionally mocks out the PulseAudioSanitizer methods.
+    def make_port(self, host=None, port_name=None, options=None, os_name=None, os_version=None, **kwargs):
+        port = super(EflPortTest, self).make_port(host, port_name, options, os_name, os_version, **kwargs)
+        port._pulseaudio_sanitizer = PulseAudioSanitizerMock()
+        return port
+
     def test_show_results_html_file(self):
         port = self.make_port()
         port._executive = MockExecutive(should_log=True)
-        expected_stderr = "MOCK run_command: ['Tools/Scripts/run-launcher', '--release', '--efl', 'file://test.html'], cwd=/mock-checkout\n"
-        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK run_command: ['Tools/Scripts/run-launcher', '--release', '--efl', 'file://test.html'], cwd=/mock-checkout\n"
+        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/factory.py b/Tools/Scripts/webkitpy/layout_tests/port/factory.py
index ad7c644..902ee22 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/factory.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/factory.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
index 2980c2d..363b7b9 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.tool.mocktool import MockOptions
 from webkitpy.common.system.systemhost_mock import MockSystemHost
@@ -54,7 +54,7 @@
     def assert_port(self, port_name=None, os_name=None, os_version=None, options=None, cls=None):
         host = MockSystemHost(os_name=os_name, os_version=os_version)
         port = factory.PortFactory(host).get(port_name, options=options)
-        self.assertTrue(isinstance(port, cls))
+        self.assertIsInstance(port, cls)
 
     def test_mac(self):
         self.assert_port(port_name='mac-lion', cls=mac.MacPort)
@@ -105,9 +105,5 @@
         self.assertRaises(NotImplementedError, factory.PortFactory(MockSystemHost(os_name='vms')).get)
 
     def test_get_from_builder_name(self):
-        self.assertEquals(factory.PortFactory(MockSystemHost()).get_from_builder_name('WebKit Mac10.7').name(),
+        self.assertEqual(factory.PortFactory(MockSystemHost()).get_from_builder_name('WebKit Mac10.7').name(),
                           'chromium-mac-lion')
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/gtk.py b/Tools/Scripts/webkitpy/layout_tests/port/gtk.py
index 3d82027..d2d799e 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/gtk.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/gtk.py
@@ -35,9 +35,13 @@
 from webkitpy.layout_tests.port.xvfbdriver import XvfbDriver
 
 
-class GtkPort(Port, PulseAudioSanitizer):
+class GtkPort(Port):
     port_name = "gtk"
 
+    def __init__(self, *args, **kwargs):
+        super(GtkPort, self).__init__(*args, **kwargs)
+        self._pulseaudio_sanitizer = PulseAudioSanitizer()
+
     def warn_if_bug_missing_in_test_expectations(self):
         return True
 
@@ -48,20 +52,17 @@
         return XvfbDriver
 
     def default_timeout_ms(self):
-        # For now, use the base Port's default timeout value in case of WebKitTestRunner.
-        if self.get_option('webkit_test_runner'):
-            return super(GtkPort, self).default_timeout_ms()
-
         if self.get_option('configuration') == 'Debug':
             return 12 * 1000
         return 6 * 1000
 
     def setup_test_run(self):
-        self._unload_pulseaudio_module()
+        super(GtkPort, self).setup_test_run()
+        self._pulseaudio_sanitizer.unload_pulseaudio_module()
 
     def clean_up_test_run(self):
         super(GtkPort, self).clean_up_test_run()
-        self._restore_pulseaudio_module()
+        self._pulseaudio_sanitizer.restore_pulseaudio_module()
 
     def setup_environ_for_server(self, server_name=None):
         environment = super(GtkPort, self).setup_environ_for_server(server_name)
@@ -71,9 +72,7 @@
         environment['TEST_RUNNER_INJECTED_BUNDLE_FILENAME'] = self._build_path('Libraries', 'libTestRunnerInjectedBundle.la')
         environment['TEST_RUNNER_TEST_PLUGIN_PATH'] = self._build_path('TestNetscapePlugin', '.libs')
         environment['WEBKIT_INSPECTOR_PATH'] = self._build_path('Programs', 'resources', 'inspector')
-        environment['AUDIO_RESOURCES_PATH'] = self._filesystem.join(self._config.webkit_base_dir(),
-                                                                    'Source', 'WebCore', 'platform',
-                                                                    'audio', 'resources')
+        environment['AUDIO_RESOURCES_PATH'] = self.path_from_webkit_base('Source', 'WebCore', 'platform', 'audio', 'resources')
         self._copy_value_from_environ_if_set(environment, 'WEBKITOUTPUTDIR')
         return environment
 
@@ -102,6 +101,22 @@
                 return full_library
         return None
 
+    def _search_paths(self):
+        search_paths = []
+        if self.get_option('webkit_test_runner'):
+            search_paths.extend([self.port_name + '-wk2', 'wk2'])
+        else:
+            search_paths.append(self.port_name + '-wk1')
+        search_paths.append(self.port_name)
+        search_paths.extend(self.get_option("additional_platform_directory", []))
+        return search_paths
+
+    def default_baseline_search_path(self):
+        return map(self._webkit_baseline_path, self._search_paths())
+
+    def _port_specific_expectations_files(self):
+        return [self._filesystem.join(self._webkit_baseline_path(p), 'TestExpectations') for p in reversed(self._search_paths())]
+
     # FIXME: We should find a way to share this implmentation with Gtk,
     # or teach run-launcher how to call run-safari and move this down to Port.
     def show_results_html_file(self, results_filename):
@@ -112,13 +127,15 @@
         # FIXME: old-run-webkit-tests converted results_filename path for cygwin.
         self._run_script("run-launcher", run_launcher_args)
 
+    def check_sys_deps(self, needs_http):
+        return super(GtkPort, self).check_sys_deps(needs_http) and XvfbDriver.check_xvfb(self)
+
     def _get_gdb_output(self, coredump_path):
-        cmd = ['gdb', '-ex', 'thread apply all bt', '--batch', str(self._path_to_driver()), coredump_path]
+        cmd = ['gdb', '-ex', 'thread apply all bt 1024', '--batch', str(self._path_to_driver()), coredump_path]
         proc = subprocess.Popen(cmd, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        proc.wait()
-        errors = [l.strip().decode('utf8', 'ignore') for l in proc.stderr.readlines()]
-        trace = proc.stdout.read().decode('utf8', 'ignore')
-        return (trace, errors)
+        stdout, stderr = proc.communicate()
+        errors = [l.strip().decode('utf8', 'ignore') for l in stderr.splitlines()]
+        return (stdout.decode('utf8', 'ignore'), errors)
 
     def _get_crash_log(self, name, pid, stdout, stderr, newer_than):
         pid_representation = str(pid or '<unknown>')
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/gtk_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/gtk_unittest.py
index f1df6bf..7d24bb3 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/gtk_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/gtk_unittest.py
@@ -26,16 +26,17 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 import sys
 import os
 
+from webkitpy.common.system.executive_mock import MockExecutive
+from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.layout_tests.port.gtk import GtkPort
+from webkitpy.layout_tests.port.pulseaudio_sanitizer_mock import PulseAudioSanitizerMock
 from webkitpy.layout_tests.port import port_testcase
-from webkitpy.common.system.executive_mock import MockExecutive
 from webkitpy.thirdparty.mock import Mock
-from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.tool.mocktool import MockOptions
 
 
@@ -43,23 +44,42 @@
     port_name = 'gtk'
     port_maker = GtkPort
 
+    # Additionally mocks out the PulseAudioSanitizer methods.
+    def make_port(self, host=None, port_name=None, options=None, os_name=None, os_version=None, **kwargs):
+        port = super(GtkPortTest, self).make_port(host, port_name, options, os_name, os_version, **kwargs)
+        port._pulseaudio_sanitizer = PulseAudioSanitizerMock()
+        return port
+
+    def test_default_baseline_search_path(self):
+        port = self.make_port()
+        self.assertEqual(port.default_baseline_search_path(), ['/mock-checkout/LayoutTests/platform/gtk-wk1',
+            '/mock-checkout/LayoutTests/platform/gtk'])
+
+        port = self.make_port(options=MockOptions(webkit_test_runner=True))
+        self.assertEqual(port.default_baseline_search_path(), ['/mock-checkout/LayoutTests/platform/gtk-wk2',
+            '/mock-checkout/LayoutTests/platform/wk2', '/mock-checkout/LayoutTests/platform/gtk'])
+
+    def test_port_specific_expectations_files(self):
+        port = self.make_port()
+        self.assertEqual(port.expectations_files(), ['/mock-checkout/LayoutTests/TestExpectations',
+            '/mock-checkout/LayoutTests/platform/gtk/TestExpectations',
+            '/mock-checkout/LayoutTests/platform/gtk-wk1/TestExpectations'])
+
+        port = self.make_port(options=MockOptions(webkit_test_runner=True))
+        self.assertEqual(port.expectations_files(), ['/mock-checkout/LayoutTests/TestExpectations',
+            '/mock-checkout/LayoutTests/platform/gtk/TestExpectations',
+            '/mock-checkout/LayoutTests/platform/wk2/TestExpectations',
+            '/mock-checkout/LayoutTests/platform/gtk-wk2/TestExpectations'])
+
     def test_show_results_html_file(self):
         port = self.make_port()
         port._executive = MockExecutive(should_log=True)
-        expected_stderr = "MOCK run_command: ['Tools/Scripts/run-launcher', '--release', '--gtk', 'file://test.html'], cwd=/mock-checkout\n"
-        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK run_command: ['Tools/Scripts/run-launcher', '--release', '--gtk', 'file://test.html'], cwd=/mock-checkout\n"
+        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_logs=expected_logs)
 
     def test_default_timeout_ms(self):
-        self.assertEquals(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 6000)
-        self.assertEquals(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 12000)
-        self.assertEquals(self.make_port(options=MockOptions(webkit_test_runner=True, configuration='Debug')).default_timeout_ms(), 80000)
-        self.assertEquals(self.make_port(options=MockOptions(webkit_test_runner=True, configuration='Release')).default_timeout_ms(), 80000)
-
-    def assertLinesEqual(self, a, b):
-        if hasattr(self, 'assertMultiLineEqual'):
-            self.assertMultiLineEqual(a, b)
-        else:
-            self.assertEqual(a.splitlines(), b.splitlines())
+        self.assertEqual(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 6000)
+        self.assertEqual(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 12000)
 
     def test_get_crash_log(self):
         core_directory = os.environ.get('WEBKIT_CORE_DUMPS_DIRECTORY', '/path/to/coredumps')
@@ -83,8 +103,8 @@
         port._get_gdb_output = mock_empty_crash_log
         stderr, log = port._get_crash_log("DumpRenderTree", 28529, "", "", newer_than=None)
         self.assertEqual(stderr, "")
-        self.assertLinesEqual(log, mock_empty_crash_log)
+        self.assertMultiLineEqual(log, mock_empty_crash_log)
 
         stderr, log = port._get_crash_log("DumpRenderTree", 28529, "", "", newer_than=0.0)
         self.assertEqual(stderr, "")
-        self.assertLinesEqual(log, mock_empty_crash_log)
+        self.assertMultiLineEqual(log, mock_empty_crash_log)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/http_lock.py b/Tools/Scripts/webkitpy/layout_tests/port/http_lock.py
index c2eece3..bdde37e 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/http_lock.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/http_lock.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 # Copyright (C) 2010 Andras Becsi (abecsi@inf.u-szeged.hu), University of Szeged
 #
@@ -25,6 +24,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+# FIXME: rename this file, and add more text about how this is
+# different from the base file_lock class.
+
 """This class helps to block NRWT threads when more NRWTs run
 perf, http and websocket tests in a same time."""
 
@@ -43,7 +45,7 @@
 
 
 class HttpLock(object):
-    def __init__(self, lock_path, lock_file_prefix="WebKitHttpd.lock.", guard_lock="WebKit.lock", filesystem=None, executive=None):
+    def __init__(self, lock_path, lock_file_prefix="WebKitHttpd.lock.", guard_lock="WebKit.lock", filesystem=None, executive=None, name='HTTP'):
         self._executive = executive or Executive()
         self._filesystem = filesystem or FileSystem()
         self._lock_path = lock_path
@@ -55,6 +57,7 @@
         self._guard_lock_file = self._filesystem.join(self._lock_path, guard_lock)
         self._guard_lock = FileLock(self._guard_lock_file)
         self._process_lock_file_name = ""
+        self._name = name
 
     def cleanup_http_lock(self):
         """Delete the lock file if exists."""
@@ -124,11 +127,11 @@
         """Create a lock file and wait until it's turn comes. If something goes wrong
         it wont do any locking."""
         if not self._create_lock_file():
-            _log.debug("Warning, http locking failed!")
+            _log.debug("Warning, %s locking failed!" % self._name)
             return
 
         # FIXME: This can hang forever!
         while self._current_lock_pid() != os.getpid():
             time.sleep(1)
 
-        _log.debug("HTTP lock acquired")
+        _log.debug("%s lock acquired" % self._name)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/http_lock_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/http_lock_unittest.py
index fbf2d9d..25af12f 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/http_lock_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/http_lock_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 #
 # All rights reserved.
@@ -26,7 +25,7 @@
 
 from http_lock import HttpLock
 import os  # Used for os.getpid()
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.executive_mock import MockExecutive
@@ -88,7 +87,7 @@
         # FIXME: Once Executive wraps getpid, we can mock this and not use a real pid.
         current_pid = os.getpid()
         self.http_lock._filesystem.write_text_file(self.lock_file_name, str(current_pid))
-        self.assertEquals(self.http_lock._current_lock_pid(), current_pid)
+        self.assertEqual(self.http_lock._current_lock_pid(), current_pid)
 
     def test_extract_lock_number(self):
         lock_file_list = (
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/image_diff.py b/Tools/Scripts/webkitpy/layout_tests/port/image_diff.py
index 72d061f..25feaba 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/image_diff.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/image_diff.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 # Copyright (C) 2010 Gabor Rapcsanyi <rgabor@inf.u-szeged.hu>, University of Szeged
 # Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/image_diff_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/image_diff_unittest.py
old mode 100755
new mode 100644
index 46cc98a..b5b427b
--- a/Tools/Scripts/webkitpy/layout_tests/port/image_diff_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/image_diff_unittest.py
@@ -28,7 +28,7 @@
 
 """Unit testing base class for Port implementations."""
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.port.server_process_mock import MockServerProcess
 from webkitpy.layout_tests.port.image_diff import ImageDiffer
@@ -49,9 +49,9 @@
     def test_diff_image_failed(self):
         port = FakePort(['diff: 100% failed\n'])
         image_differ = ImageDiffer(port)
-        self.assertEquals(image_differ.diff_image('foo', 'bar', 0.1), ('', 100.0, None))
+        self.assertEqual(image_differ.diff_image('foo', 'bar', 0.1), ('', 100.0, None))
 
     def test_diff_image_passed(self):
         port = FakePort(['diff: 0% passed\n'])
         image_differ = ImageDiffer(port)
-        self.assertEquals(image_differ.diff_image('foo', 'bar', 0.1), (None, 0, None))
+        self.assertEqual(image_differ.diff_image('foo', 'bar', 0.1), (None, 0, None))
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/leakdetector_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/leakdetector_unittest.py
index 7628bb7..f2daec9 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/leakdetector_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/leakdetector_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.port.leakdetector import LeakDetector
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -51,7 +51,7 @@
         detector._callstacks_to_exclude_from_leaks = lambda: ['foo bar', 'BAZ']
         detector._types_to_exlude_from_leaks = lambda: ['abcdefg', 'hi jklmno']
         expected_args = ['--exclude-callstack=foo bar', '--exclude-callstack=BAZ', '--exclude-type=abcdefg', '--exclude-type=hi jklmno', 1234]
-        self.assertEquals(detector._leaks_args(1234), expected_args)
+        self.assertEqual(detector._leaks_args(1234), expected_args)
 
     example_leaks_output = """Process 5122: 663744 nodes malloced for 78683 KB
 Process 5122: 337301 leaks for 6525216 total leaked bytes.
@@ -110,18 +110,18 @@
 """
 
     def test_parse_leaks_output(self):
-        self.assertEquals(self._make_detector()._parse_leaks_output(self.example_leaks_output), (337301, 0, 6525216))
-        self.assertEquals(self._make_detector()._parse_leaks_output(self.example_leaks_output_with_exclusions), (282, 17, 21920))
+        self.assertEqual(self._make_detector()._parse_leaks_output(self.example_leaks_output), (337301, 0, 6525216))
+        self.assertEqual(self._make_detector()._parse_leaks_output(self.example_leaks_output_with_exclusions), (282, 17, 21920))
 
     def test_leaks_files_in_directory(self):
         detector = self._make_detector()
-        self.assertEquals(detector.leaks_files_in_directory('/bogus-directory'), [])
+        self.assertEqual(detector.leaks_files_in_directory('/bogus-directory'), [])
         detector._filesystem = MockFileSystem({
             '/mock-results/DumpRenderTree-1234-leaks.txt': '',
             '/mock-results/DumpRenderTree-23423-leaks.txt': '',
             '/mock-results/DumpRenderTree-823-leaks.txt': '',
         })
-        self.assertEquals(len(detector.leaks_files_in_directory('/mock-results')), 3)
+        self.assertEqual(len(detector.leaks_files_in_directory('/mock-results')), 3)
 
     def test_count_total_bytes_and_unique_leaks(self):
         detector = self._make_detector()
@@ -138,7 +138,7 @@
         leak_files = ['/mock-results/DumpRenderTree-1234-leaks.txt', '/mock-results/DumpRenderTree-1235-leaks.txt']
         expected_stdout = "MOCK _run_script: parse-malloc-history ['--merge-depth', 5, '/mock-results/DumpRenderTree-1234-leaks.txt', '/mock-results/DumpRenderTree-1235-leaks.txt']\n"
         results_tuple = OutputCapture().assert_outputs(self, detector.count_total_bytes_and_unique_leaks, [leak_files], expected_stdout=expected_stdout)
-        self.assertEquals(results_tuple, ("5,888 bytes", 2))
+        self.assertEqual(results_tuple, ("5,888 bytes", 2))
 
     def test_count_total_leaks(self):
         detector = self._make_detector()
@@ -149,4 +149,4 @@
             '/mock-results/DumpRenderTree-823-leaks.txt': 'Process 12356: 23412 leaks for 18 total leaked bytes.\n',
         })
         leak_file_paths = ['/mock-results/DumpRenderTree-1234-leaks.txt', '/mock-results/DumpRenderTree-23423-leaks.txt', '/mock-results/DumpRenderTree-823-leaks.txt']
-        self.assertEquals(detector.count_total_leaks(leak_file_paths), 35765)
+        self.assertEqual(detector.count_total_leaks(leak_file_paths), 35765)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/mac.py b/Tools/Scripts/webkitpy/layout_tests/port/mac.py
index e6fd5bd..031a239 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/mac.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/mac.py
@@ -1,5 +1,5 @@
 # Copyright (C) 2011 Google Inc. All rights reserved.
-# Copyright (C) 2012 Apple Inc. All rights reserved.
+# Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -29,9 +29,6 @@
 
 import logging
 import os
-import re
-import subprocess
-import sys
 import time
 
 from webkitpy.common.system.crashlogs import CrashLogs
@@ -68,6 +65,9 @@
             return 350 * 1000
         return super(MacPort, self).default_timeout_ms()
 
+    def supports_per_test_timeout(self):
+        return True
+
     def _build_driver_flags(self):
         return ['ARCHS=i386'] if self.architecture() == 'x86' else []
 
@@ -76,15 +76,18 @@
         return True
 
     def default_baseline_search_path(self):
-        if self._name.endswith(self.FUTURE_VERSION):
+        name = self._name.replace('-wk2', '')
+        if name.endswith(self.FUTURE_VERSION):
             fallback_names = [self.port_name]
         else:
-            fallback_names = self.VERSION_FALLBACK_ORDER[self.VERSION_FALLBACK_ORDER.index(self._name):-1] + [self.port_name]
+            fallback_names = self.VERSION_FALLBACK_ORDER[self.VERSION_FALLBACK_ORDER.index(name):-1] + [self.port_name]
         if self.get_option('webkit_test_runner'):
-            fallback_names.insert(0, self._wk2_port_name())
-            # Note we do not add 'wk2' here, even though it's included in _skipped_search_paths().
+            fallback_names = [self._wk2_port_name(), 'wk2'] + fallback_names
         return map(self._webkit_baseline_path, fallback_names)
 
+    def _port_specific_expectations_files(self):
+        return list(reversed([self._filesystem.join(self._webkit_baseline_path(p), 'TestExpectations') for p in self.baseline_search_path()]))
+
     def setup_environ_for_server(self, server_name=None):
         env = super(MacPort, self).setup_environ_for_server(server_name)
         if server_name == self.driver_name():
@@ -107,10 +110,8 @@
         return self._version == "lion"
 
     def default_child_processes(self):
-        # FIXME: The Printer isn't initialized when this is called, so using _log would just show an unitialized logger error.
-
         if self._version == "snowleopard":
-            print >> sys.stderr, "Cannot run tests in parallel on Snow Leopard due to rdar://problem/10621525."
+            _log.warning("Cannot run tests in parallel on Snow Leopard due to rdar://problem/10621525.")
             return 1
 
         default_count = super(MacPort, self).default_child_processes()
@@ -127,12 +128,12 @@
         overhead = 2048 * 1024 * 1024  # Assume we need 2GB free for the O/S
         supportable_instances = max((total_memory - overhead) / bytes_per_drt, 1)  # Always use one process, even if we don't have space for it.
         if supportable_instances < default_count:
-            print >> sys.stderr, "This machine could support %s child processes, but only has enough memory for %s." % (default_count, supportable_instances)
+            _log.warning("This machine could support %s child processes, but only has enough memory for %s." % (default_count, supportable_instances))
         return min(supportable_instances, default_count)
 
     def _build_java_test_support(self):
         java_tests_path = self._filesystem.join(self.layout_tests_dir(), "java")
-        build_java = ["/usr/bin/make", "-C", java_tests_path]
+        build_java = [self.make_command(), "-C", java_tests_path]
         if self._executive.run_command(build_java, return_exit_code=True):  # Paths are absolute, so we don't need to set a cwd.
             _log.error("Failed to build Java support files: %s" % build_java)
             return False
@@ -168,8 +169,8 @@
         # We don't use self._run_script() because we don't want to wait for the script
         # to exit and we want the output to show up on stdout in case there are errors
         # launching the browser.
-        self._executive.popen([self._config.script_path('run-safari')] + self._arguments_for_configuration() + ['--no-saved-state', '-NSOpen', results_filename],
-            cwd=self._config.webkit_base_dir(), stdout=file(os.devnull), stderr=file(os.devnull))
+        self._executive.popen([self.path_to_script('run-safari')] + self._arguments_for_configuration() + ['--no-saved-state', '-NSOpen', results_filename],
+            cwd=self.webkit_base(), stdout=file(os.devnull), stderr=file(os.devnull))
 
     # FIXME: The next two routines turn off the http locking in order
     # to work around failures on the bots caused when the slave restarts.
@@ -188,6 +189,9 @@
     def release_http_lock(self):
         pass
 
+    def sample_file_path(self, name, pid):
+        return self._filesystem.join(self.results_directory(), "{0}-{1}-sample.txt".format(name, pid))
+
     def _get_crash_log(self, name, pid, stdout, stderr, newer_than, time_fn=None, sleep_fn=None, wait_for_log=True):
         # Note that we do slow-spin here and wait, since it appears the time
         # ReportCrash takes to actually write and flush the file varies when there are
@@ -224,16 +228,25 @@
         crash_logs = {}
         for (test_name, process_name, pid) in crashed_processes:
             # Passing None for output.  This is a second pass after the test finished so
-            # if the output had any loggine we would have already collected it.
+            # if the output had any logging we would have already collected it.
             crash_log = self._get_crash_log(process_name, pid, None, None, start_time, wait_for_log=False)[1]
             if not crash_log:
                 continue
             crash_logs[test_name] = crash_log
         return crash_logs
 
+    def look_for_new_samples(self, unresponsive_processes, start_time):
+        sample_files = {}
+        for (test_name, process_name, pid) in unresponsive_processes:
+            sample_file = self.sample_file_path(process_name, pid)
+            if not self._filesystem.isfile(sample_file):
+                continue
+            sample_files[test_name] = sample_file
+        return sample_files
+
     def sample_process(self, name, pid):
         try:
-            hang_report = self._filesystem.join(self.results_directory(), "%s-%s.sample.txt" % (name, pid))
+            hang_report = self.sample_file_path(name, pid)
             self._executive.run_command([
                 "/usr/bin/sample",
                 pid,
@@ -242,8 +255,8 @@
                 "-file",
                 hang_report,
             ])
-        except ScriptError, e:
-            _log.warning('Unable to sample process.')
+        except ScriptError as e:
+            _log.warning('Unable to sample process:' + str(e))
 
     def _path_to_helper(self):
         binary_name = 'LayoutTestHelper'
@@ -253,9 +266,8 @@
         helper_path = self._path_to_helper()
         if helper_path:
             _log.debug("Starting layout helper %s" % helper_path)
-            # Note: Not thread safe: http://bugs.python.org/issue2320
             self._helper = self._executive.popen([helper_path],
-                stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=None)
+                stdin=self._executive.PIPE, stdout=self._executive.PIPE, stderr=None)
             is_ready = self._helper.stdout.readline()
             if not is_ready.startswith('ready'):
                 _log.error("LayoutTestHelper failed to be ready")
@@ -269,12 +281,17 @@
                 self._helper.wait()
             except IOError, e:
                 _log.debug("IOError raised while stopping helper: %s" % str(e))
-                pass
             self._helper = None
 
+    def make_command(self):
+        return self.xcrun_find('make', '/usr/bin/make')
+
     def nm_command(self):
+        return self.xcrun_find('nm', 'nm')
+
+    def xcrun_find(self, command, fallback):
         try:
-            return self._executive.run_command(['xcrun', '-find', 'nm']).rstrip()
-        except ScriptError, e:
-            _log.warn("xcrun failed; falling back to 'nm'.")
-            return 'nm'
+            return self._executive.run_command(['xcrun', '-find', command]).rstrip()
+        except ScriptError:
+            _log.warn("xcrun failed; falling back to '%s'." % fallback)
+            return fallback
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/mac_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/mac_unittest.py
index c2b26b2..3faf9c1 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/mac_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/mac_unittest.py
@@ -47,7 +47,7 @@
 
     def test_default_timeout_ms(self):
         super(MacTest, self).test_default_timeout_ms()
-        self.assertEquals(self.make_port(options=MockOptions(guard_malloc=True)).default_timeout_ms(), 350000)
+        self.assertEqual(self.make_port(options=MockOptions(guard_malloc=True)).default_timeout_ms(), 350000)
 
 
     example_skipped_file = u"""
@@ -77,7 +77,7 @@
     def assert_name(self, port_name, os_version_string, expected):
         host = MockSystemHost(os_name='mac', os_version=os_version_string)
         port = self.make_port(host=host, port_name=port_name)
-        self.assertEquals(expected, port.name())
+        self.assertEqual(expected, port.name())
 
     def test_tests_for_other_platforms(self):
         platforms = ['mac', 'chromium-linux', 'mac-snowleopard']
@@ -87,9 +87,9 @@
         port._filesystem = MockFileSystem(dirs=platform_dir_paths)
 
         dirs_to_skip = port._tests_for_other_platforms()
-        self.assertTrue('platform/chromium-linux' in dirs_to_skip)
-        self.assertFalse('platform/mac' in dirs_to_skip)
-        self.assertFalse('platform/mac-snowleopard' in dirs_to_skip)
+        self.assertIn('platform/chromium-linux', dirs_to_skip)
+        self.assertNotIn('platform/mac', dirs_to_skip)
+        self.assertNotIn('platform/mac-snowleopard', dirs_to_skip)
 
     def test_version(self):
         port = self.make_port()
@@ -115,14 +115,14 @@
     def test_setup_environ_for_server(self):
         port = self.make_port(options=MockOptions(leaks=True, guard_malloc=True))
         env = port.setup_environ_for_server(port.driver_name())
-        self.assertEquals(env['MallocStackLogging'], '1')
-        self.assertEquals(env['DYLD_INSERT_LIBRARIES'], '/usr/lib/libgmalloc.dylib')
+        self.assertEqual(env['MallocStackLogging'], '1')
+        self.assertEqual(env['DYLD_INSERT_LIBRARIES'], '/usr/lib/libgmalloc.dylib')
 
     def _assert_search_path(self, port_name, baseline_path, search_paths, use_webkit2=False):
         port = self.make_port(port_name=port_name, options=MockOptions(webkit_test_runner=use_webkit2))
         absolute_search_paths = map(port._webkit_baseline_path, search_paths)
-        self.assertEquals(port.baseline_path(), port._webkit_baseline_path(baseline_path))
-        self.assertEquals(port.baseline_search_path(), absolute_search_paths)
+        self.assertEqual(port.baseline_path(), port._webkit_baseline_path(baseline_path))
+        self.assertEqual(port.baseline_search_path(), absolute_search_paths)
 
     def test_baseline_search_path(self):
         # Note that we don't need total coverage here, just path coverage, since this is all data driven.
@@ -130,17 +130,17 @@
         self._assert_search_path('mac-lion', 'mac-lion', ['mac-lion', 'mac'])
         self._assert_search_path('mac-mountainlion', 'mac', ['mac'])
         self._assert_search_path('mac-future', 'mac', ['mac'])
-        self._assert_search_path('mac-snowleopard', 'mac-wk2', ['mac-wk2', 'mac-snowleopard', 'mac-lion', 'mac'], use_webkit2=True)
-        self._assert_search_path('mac-lion', 'mac-wk2', ['mac-wk2', 'mac-lion', 'mac'], use_webkit2=True)
-        self._assert_search_path('mac-mountainlion', 'mac-wk2', ['mac-wk2', 'mac'], use_webkit2=True)
-        self._assert_search_path('mac-future', 'mac-wk2', ['mac-wk2', 'mac'], use_webkit2=True)
+        self._assert_search_path('mac-snowleopard', 'mac-wk2', ['mac-wk2', 'wk2', 'mac-snowleopard', 'mac-lion', 'mac'], use_webkit2=True)
+        self._assert_search_path('mac-lion', 'mac-wk2', ['mac-wk2', 'wk2', 'mac-lion', 'mac'], use_webkit2=True)
+        self._assert_search_path('mac-mountainlion', 'mac-wk2', ['mac-wk2', 'wk2', 'mac'], use_webkit2=True)
+        self._assert_search_path('mac-future', 'mac-wk2', ['mac-wk2', 'wk2', 'mac'], use_webkit2=True)
 
     def test_show_results_html_file(self):
         port = self.make_port()
         # Delay setting a should_log executive to avoid logging from MacPort.__init__.
         port._executive = MockExecutive(should_log=True)
-        expected_stderr = "MOCK popen: ['Tools/Scripts/run-safari', '--release', '--no-saved-state', '-NSOpen', 'test.html'], cwd=/mock-checkout\n"
-        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK popen: ['Tools/Scripts/run-safari', '--release', '--no-saved-state', '-NSOpen', 'test.html'], cwd=/mock-checkout\n"
+        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_logs=expected_logs)
 
     def test_operating_system(self):
         self.assertEqual('mac', self.make_port().operating_system())
@@ -152,20 +152,20 @@
 
         bytes_for_drt = 200 * 1024 * 1024
         port.host.platform.total_bytes_memory = lambda: bytes_for_drt
-        expected_stderr = "This machine could support 2 child processes, but only has enough memory for 1.\n"
-        child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_stderr=expected_stderr)
+        expected_logs = "This machine could support 2 child processes, but only has enough memory for 1.\n"
+        child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_logs=expected_logs)
         self.assertEqual(child_processes, 1)
 
         # Make sure that we always use one process, even if we don't have the memory for it.
         port.host.platform.total_bytes_memory = lambda: bytes_for_drt - 1
-        expected_stderr = "This machine could support 2 child processes, but only has enough memory for 1.\n"
-        child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_stderr=expected_stderr)
+        expected_logs = "This machine could support 2 child processes, but only has enough memory for 1.\n"
+        child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_logs=expected_logs)
         self.assertEqual(child_processes, 1)
 
         # SnowLeopard has a CFNetwork bug which causes crashes if we execute more than one copy of DRT at once.
         port = self.make_port(port_name='mac-snowleopard')
-        expected_stderr = "Cannot run tests in parallel on Snow Leopard due to rdar://problem/10621525.\n"
-        child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_stderr=expected_stderr)
+        expected_logs = "Cannot run tests in parallel on Snow Leopard due to rdar://problem/10621525.\n"
+        child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_logs=expected_logs)
         self.assertEqual(child_processes, 1)
 
     def test_get_crash_log(self):
@@ -221,7 +221,7 @@
 
         port = self.make_port()
         port._executive = MockExecutive2(run_command_fn=logging_run_command)
-        expected_stdout = "['/usr/bin/sample', 42, 10, 10, '-file', '/mock-build/layout-test-results/test-42.sample.txt']\n"
+        expected_stdout = "['/usr/bin/sample', 42, 10, 10, '-file', '/mock-build/layout-test-results/test-42-sample.txt']\n"
         OutputCapture().assert_outputs(self, port.sample_process, args=['test', 42], expected_stdout=expected_stdout)
 
     def test_sample_process_throws_exception(self):
@@ -240,18 +240,18 @@
             self.args = args
 
         port._run_script = run_script
-        self.assertEquals(port.architecture(), 'x86')
+        self.assertEqual(port.architecture(), 'x86')
         port._build_driver()
-        self.assertEquals(self.args, ['ARCHS=i386'])
+        self.assertEqual(self.args, ['ARCHS=i386'])
 
     def test_64bit(self):
         # Apple Mac port is 64-bit by default
         port = self.make_port()
-        self.assertEquals(port.architecture(), 'x86_64')
+        self.assertEqual(port.architecture(), 'x86_64')
 
         def run_script(script, args=None, env=None):
             self.args = args
 
         port._run_script = run_script
         port._build_driver()
-        self.assertEquals(self.args, [])
+        self.assertEqual(self.args, [])
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/mock_drt.py b/Tools/Scripts/webkitpy/layout_tests/port/mock_drt.py
index a2106fd..50a9a20 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/mock_drt.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/mock_drt.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -125,6 +124,9 @@
     def release_http_lock(self):
         pass
 
+    def show_results_html_file(self, results_filename):
+        pass
+
 
 def main(argv, host, stdin, stdout, stderr):
     """Run the tests."""
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py
old mode 100755
new mode 100644
index 1ac051a..bd285ef
--- a/Tools/Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/mock_drt_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -30,7 +29,7 @@
 """Unit tests for MockDRT."""
 
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common import newstringio
 from webkitpy.common.system.systemhost_mock import MockSystemHost
@@ -257,7 +256,7 @@
                         '\n',
                         '#EOF\n'],
             host=host)
-        self.assertEquals(host.filesystem.written_files,
+        self.assertEqual(host.filesystem.written_files,
             {'/tmp/png_result0.png': 'image_checksum\x8a-pngtEXtchecksum\x00image_checksum-checksum'})
 
     def test_test_shell_parse_options(self):
@@ -265,4 +264,4 @@
             '--pixel-tests=/tmp/png_result0.png'])
         self.assertTrue(options.test_shell)
         self.assertTrue(options.pixel_tests)
-        self.assertEquals(options.pixel_path, '/tmp/png_result0.png')
+        self.assertEqual(options.pixel_path, '/tmp/png_result0.png')
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py b/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py
old mode 100755
new mode 100644
index b036f4b..df480d4
--- a/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/port_testcase.py
@@ -34,14 +34,13 @@
 import socket
 import sys
 import time
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive_mock import MockExecutive
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.system.systemhost_mock import MockSystemHost
 from webkitpy.layout_tests.port.base import Port
-from webkitpy.layout_tests.port.config_mock import MockConfig
 from webkitpy.layout_tests.port.server_process_mock import MockServerProcess
 from webkitpy.layout_tests.servers import http_server_base
 from webkitpy.tool.mocktool import MockOptions
@@ -51,13 +50,13 @@
 class TestWebKitPort(Port):
     port_name = "testwebkitport"
 
-    def __init__(self, symbols_string=None,
+    def __init__(self, port_name=None, symbols_string=None,
                  expectations_file=None, skips_file=None, host=None, config=None,
                  **kwargs):
+        port_name = port_name or TestWebKitPort.port_name
         self.symbols_string = symbols_string  # Passing "" disables all staticly-detectable features.
         host = host or MockSystemHost()
-        config = config or MockConfig()
-        super(TestWebKitPort, self).__init__(host=host, config=config, **kwargs)
+        super(TestWebKitPort, self).__init__(host, port_name=port_name, **kwargs)
 
     def all_test_configurations(self):
         return [self.test_configuration()]
@@ -81,28 +80,30 @@
     os_name = None
     os_version = None
     port_maker = TestWebKitPort
+    port_name = None
 
-    def make_port(self, host=None, port_name=None, options=None, os_name=None, os_version=None, config=None, **kwargs):
+    def make_port(self, host=None, port_name=None, options=None, os_name=None, os_version=None, **kwargs):
         host = host or MockSystemHost(os_name=(os_name or self.os_name), os_version=(os_version or self.os_version))
         options = options or MockOptions(configuration='Release')
-        config = config or MockConfig(filesystem=host.filesystem, default_configuration='Release')
         port_name = port_name or self.port_name
         port_name = self.port_maker.determine_full_port_name(host, options, port_name)
-        return self.port_maker(host, port_name, options=options, config=config, **kwargs)
+        port = self.port_maker(host, port_name, options=options, **kwargs)
+        port._config.build_directory = lambda configuration: '/mock-build'
+        return port
 
     def test_default_max_locked_shards(self):
         port = self.make_port()
         port.default_child_processes = lambda: 16
-        self.assertEquals(port.default_max_locked_shards(), 1)
+        self.assertEqual(port.default_max_locked_shards(), 1)
         port.default_child_processes = lambda: 2
-        self.assertEquals(port.default_max_locked_shards(), 1)
+        self.assertEqual(port.default_max_locked_shards(), 1)
 
     def test_default_timeout_ms(self):
-        self.assertEquals(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 35000)
-        self.assertEquals(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 35000)
+        self.assertEqual(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 35000)
+        self.assertEqual(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 35000)
 
     def test_default_pixel_tests(self):
-        self.assertEquals(self.make_port().default_pixel_tests(), False)
+        self.assertEqual(self.make_port().default_pixel_tests(), False)
 
     def test_driver_cmd_line(self):
         port = self.make_port()
@@ -114,9 +115,6 @@
         self.assertTrue('--foo=bar' in cmd_line)
         self.assertTrue('--foo=baz' in cmd_line)
 
-    def test_expectations_files(self):
-        self.assertNotEquals(self.make_port().expectations_files(), [])
-
     def test_uses_apache(self):
         self.assertTrue(self.make_port()._uses_apache())
 
@@ -270,18 +268,18 @@
 
         port._server_process_constructor = make_proc
         port.setup_test_run()
-        self.assertEquals(port.diff_image('foo', 'bar'), ('', 100.0, None))
-        self.assertEquals(self.proc.cmd[1:3], ["--tolerance", "0.1"])
+        self.assertEqual(port.diff_image('foo', 'bar'), ('', 100.0, None))
+        self.assertEqual(self.proc.cmd[1:3], ["--tolerance", "0.1"])
 
-        self.assertEquals(port.diff_image('foo', 'bar', None), ('', 100.0, None))
-        self.assertEquals(self.proc.cmd[1:3], ["--tolerance", "0.1"])
+        self.assertEqual(port.diff_image('foo', 'bar', None), ('', 100.0, None))
+        self.assertEqual(self.proc.cmd[1:3], ["--tolerance", "0.1"])
 
-        self.assertEquals(port.diff_image('foo', 'bar', 0), ('', 100.0, None))
-        self.assertEquals(self.proc.cmd[1:3], ["--tolerance", "0"])
+        self.assertEqual(port.diff_image('foo', 'bar', 0), ('', 100.0, None))
+        self.assertEqual(self.proc.cmd[1:3], ["--tolerance", "0"])
 
         port.clean_up_test_run()
         self.assertTrue(self.proc.stopped)
-        self.assertEquals(port._image_differ, None)
+        self.assertEqual(port._image_differ, None)
 
     def test_diff_image_crashed(self):
         port = self.make_port()
@@ -293,7 +291,7 @@
 
         port._server_process_constructor = make_proc
         port.setup_test_run()
-        self.assertEquals(port.diff_image('foo', 'bar'), ('', 0, 'ImageDiff crashed\n'))
+        self.assertEqual(port.diff_image('foo', 'bar'), ('', 0, 'ImageDiff crashed\n'))
         port.clean_up_test_run()
 
     def test_check_wdiff(self):
@@ -389,13 +387,13 @@
 
     def test_get_crash_log(self):
         port = self.make_port()
-        self.assertEquals(port._get_crash_log(None, None, None, None, newer_than=None),
+        self.assertEqual(port._get_crash_log(None, None, None, None, newer_than=None),
            (None,
             'crash log for <unknown process name> (pid <unknown>):\n'
             'STDOUT: <empty>\n'
             'STDERR: <empty>\n'))
 
-        self.assertEquals(port._get_crash_log('foo', 1234, 'out bar\nout baz', 'err bar\nerr baz\n', newer_than=None),
+        self.assertEqual(port._get_crash_log('foo', 1234, 'out bar\nout baz', 'err bar\nerr baz\n', newer_than=None),
             ('err bar\nerr baz\n',
              'crash log for foo (pid 1234):\n'
              'STDOUT: out bar\n'
@@ -403,13 +401,13 @@
              'STDERR: err bar\n'
              'STDERR: err baz\n'))
 
-        self.assertEquals(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=None),
+        self.assertEqual(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=None),
             ('foo\xa6bar',
              u'crash log for foo (pid 1234):\n'
              u'STDOUT: foo\ufffdbar\n'
              u'STDERR: foo\ufffdbar\n'))
 
-        self.assertEquals(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=1.0),
+        self.assertEqual(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=1.0),
             ('foo\xa6bar',
              u'crash log for foo (pid 1234):\n'
              u'STDOUT: foo\ufffdbar\n'
@@ -419,14 +417,15 @@
         port = self.make_port(options=options)
         for directory in dirs:
             port.host.filesystem.maybe_make_directory(directory)
-        self.assertEquals(port._build_path(), expected_path)
+        self.assertEqual(port._build_path(), expected_path)
 
     def test_expectations_ordering(self):
         port = self.make_port()
         for path in port.expectations_files():
             port._filesystem.write_text_file(path, '')
         ordered_dict = port.expectations_dict()
-        self.assertEquals(port.path_to_test_expectations_file(), ordered_dict.keys()[0])
+        self.assertEqual(port.path_to_generic_test_expectations_file(), ordered_dict.keys()[0])
+        self.assertEqual(port.path_to_test_expectations_file(), ordered_dict.keys()[1])
 
         options = MockOptions(additional_expectations=['/tmp/foo', '/tmp/bar'])
         port = self.make_port(options=options)
@@ -435,8 +434,8 @@
         port._filesystem.write_text_file('/tmp/foo', 'foo')
         port._filesystem.write_text_file('/tmp/bar', 'bar')
         ordered_dict = port.expectations_dict()
-        self.assertEquals(ordered_dict.keys()[-2:], options.additional_expectations)
-        self.assertEquals(ordered_dict.values()[-2:], ['foo', 'bar'])
+        self.assertEqual(ordered_dict.keys()[-2:], options.additional_expectations)  # pylint: disable=E1101
+        self.assertEqual(ordered_dict.values()[-2:], ['foo', 'bar'])
 
     def test_path_to_test_expectations_file(self):
         port = TestWebKitPort()
@@ -460,12 +459,13 @@
             "fast/canvas/webgl",  # Requires WebGLShader
             "compositing/webgl",  # Requires WebGLShader
             "http/tests/canvas/webgl",  # Requires WebGLShader
+            "webgl",  # Requires WebGLShader
             "mhtml",  # Requires MHTMLArchive
             "fast/css/variables",  # Requires CSS Variables
             "inspector/styles/variables",  # Requires CSS Variables
         ])
 
-        result_directories = set(TestWebKitPort(symbols_string, None)._skipped_tests_for_unsupported_features(test_list=['mathml/foo.html']))
+        result_directories = set(TestWebKitPort(symbols_string=symbols_string)._skipped_tests_for_unsupported_features(test_list=['mathml/foo.html']))
         self.assertEqual(result_directories, expected_directories)
 
         # Test that the nm string parsing actually works:
@@ -475,14 +475,14 @@
 000000000124f670 s __ZZN7WebCore13GraphicsLayer13addChildBelowEPS0_S1_E19__PRETTY_FUNCTION__
 """
         # Note 'compositing' is not in the list of skipped directories (hence the parsing of GraphicsLayer worked):
-        expected_directories = set(['mathml', 'transforms/3d', 'compositing/webgl', 'fast/canvas/webgl', 'animations/3d', 'mhtml', 'http/tests/canvas/webgl', 'fast/css/variables', 'inspector/styles/variables'])
-        result_directories = set(TestWebKitPort(symbols_string, None)._skipped_tests_for_unsupported_features(test_list=['mathml/foo.html']))
+        expected_directories = set(['mathml', 'transforms/3d', 'compositing/webgl', 'fast/canvas/webgl', 'animations/3d', 'webgl', 'mhtml', 'http/tests/canvas/webgl', 'fast/css/variables', 'inspector/styles/variables'])
+        result_directories = set(TestWebKitPort(symbols_string=symbols_string)._skipped_tests_for_unsupported_features(test_list=['mathml/foo.html']))
         self.assertEqual(result_directories, expected_directories)
 
     def test_skipped_directories_for_features(self):
         supported_features = ["Accelerated Compositing", "Foo Feature"]
         expected_directories = set(["animations/3d", "transforms/3d"])
-        port = TestWebKitPort(None, supported_features)
+        port = TestWebKitPort(supported_features=supported_features)
         port._runtime_feature_list = lambda: supported_features
         result_directories = set(port._skipped_tests_for_unsupported_features(test_list=["animations/3d/foo.html"]))
         self.assertEqual(result_directories, expected_directories)
@@ -490,17 +490,17 @@
     def test_skipped_directories_for_features_no_matching_tests_in_test_list(self):
         supported_features = ["Accelerated Compositing", "Foo Feature"]
         expected_directories = set([])
-        result_directories = set(TestWebKitPort(None, supported_features)._skipped_tests_for_unsupported_features(test_list=['foo.html']))
+        result_directories = set(TestWebKitPort(supported_features=supported_features)._skipped_tests_for_unsupported_features(test_list=['foo.html']))
         self.assertEqual(result_directories, expected_directories)
 
     def test_skipped_tests_for_unsupported_features_empty_test_list(self):
         supported_features = ["Accelerated Compositing", "Foo Feature"]
         expected_directories = set([])
-        result_directories = set(TestWebKitPort(None, supported_features)._skipped_tests_for_unsupported_features(test_list=None))
+        result_directories = set(TestWebKitPort(supported_features=supported_features)._skipped_tests_for_unsupported_features(test_list=None))
         self.assertEqual(result_directories, expected_directories)
 
     def test_skipped_layout_tests(self):
-        self.assertEqual(TestWebKitPort(None, None).skipped_layout_tests(test_list=[]), set(['media']))
+        self.assertEqual(TestWebKitPort().skipped_layout_tests(test_list=[]), set(['media']))
 
     def test_expectations_files(self):
         port = TestWebKitPort()
@@ -508,16 +508,17 @@
         def platform_dirs(port):
             return [port.host.filesystem.basename(port.host.filesystem.dirname(f)) for f in port.expectations_files()]
 
-        self.assertEqual(platform_dirs(port), ['testwebkitport'])
+        self.assertEqual(platform_dirs(port), ['LayoutTests', 'testwebkitport'])
 
-        port._name = "testwebkitport-version"
-        self.assertEqual(platform_dirs(port), ['testwebkitport', 'testwebkitport-version'])
+        port = TestWebKitPort(port_name="testwebkitport-version")
+        self.assertEqual(platform_dirs(port), ['LayoutTests', 'testwebkitport', 'testwebkitport-version'])
 
-        port._options = MockOptions(webkit_test_runner=True)
-        self.assertEqual(platform_dirs(port), ['testwebkitport', 'testwebkitport-version', 'testwebkitport-wk2', 'wk2'])
+        port = TestWebKitPort(port_name="testwebkitport-version-wk2")
+        self.assertEqual(platform_dirs(port), ['LayoutTests', 'testwebkitport', 'testwebkitport-version', 'wk2', 'testwebkitport-wk2'])
 
-        port._options = MockOptions(additional_platform_directory=["internal-testwebkitport"])
-        self.assertEqual(platform_dirs(port), ['testwebkitport', 'testwebkitport-version', 'internal-testwebkitport'])
+        port = TestWebKitPort(port_name="testwebkitport-version",
+                              options=MockOptions(additional_platform_directory=["internal-testwebkitport"]))
+        self.assertEqual(platform_dirs(port), ['LayoutTests', 'testwebkitport', 'testwebkitport-version', 'internal-testwebkitport'])
 
     def test_root_option(self):
         port = TestWebKitPort()
@@ -538,31 +539,36 @@
         # Delay setting _executive to avoid logging during construction
         port._executive = MockExecutive(should_log=True)
         port._options = MockOptions(configuration="Release")  # This should not be necessary, but I think TestWebKitPort is actually reading from disk (and thus detects the current configuration).
-        expected_stderr = "MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\n"
-        self.assertTrue(output.assert_outputs(self, port._build_driver, expected_stderr=expected_stderr, expected_logs=''))
+        expected_logs = "MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\n"
+        self.assertTrue(output.assert_outputs(self, port._build_driver, expected_logs=expected_logs))
 
         # Make sure when passed --webkit-test-runner we build the right tool.
         port._options = MockOptions(webkit_test_runner=True, configuration="Release")
-        expected_stderr = "MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\nMOCK run_command: ['Tools/Scripts/build-webkittestrunner', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\n"
-        self.assertTrue(output.assert_outputs(self, port._build_driver, expected_stderr=expected_stderr, expected_logs=''))
+        expected_logs = "MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\nMOCK run_command: ['Tools/Scripts/build-webkittestrunner', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\n"
+        self.assertTrue(output.assert_outputs(self, port._build_driver, expected_logs=expected_logs))
 
         # Make sure we show the build log when --verbose is passed, which we simulate by setting the logging level to DEBUG.
         output.set_log_level(logging.DEBUG)
         port._options = MockOptions(configuration="Release")
-        expected_stderr = "MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\n"
-        expected_logs = "Output of ['Tools/Scripts/build-dumprendertree', '--release']:\nMOCK output of child process\n"
-        self.assertTrue(output.assert_outputs(self, port._build_driver, expected_stderr=expected_stderr, expected_logs=expected_logs))
+        expected_logs = """MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}
+Output of ['Tools/Scripts/build-dumprendertree', '--release']:
+MOCK output of child process
+"""
+        self.assertTrue(output.assert_outputs(self, port._build_driver, expected_logs=expected_logs))
         output.set_log_level(logging.INFO)
 
         # Make sure that failure to build returns False.
         port._executive = MockExecutive(should_log=True, should_throw=True)
         # Because WK2 currently has to build both webkittestrunner and DRT, if DRT fails, that's the only one it tries.
-        expected_stderr = "MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}\n"
-        expected_logs = "MOCK ScriptError\n\nMOCK output of child process\n"
-        self.assertFalse(output.assert_outputs(self, port._build_driver, expected_stderr=expected_stderr, expected_logs=expected_logs))
+        expected_logs = """MOCK run_command: ['Tools/Scripts/build-dumprendertree', '--release'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'MOCK_ENVIRON_COPY': '1'}
+MOCK ScriptError
+
+MOCK output of child process
+"""
+        self.assertFalse(output.assert_outputs(self, port._build_driver, expected_logs=expected_logs))
 
     def _assert_config_file_for_platform(self, port, platform, config_file):
-        self.assertEquals(port._apache_config_file_name_for_platform(platform), config_file)
+        self.assertEqual(port._apache_config_file_name_for_platform(platform), config_file)
 
     def test_linux_distro_detection(self):
         port = TestWebKitPort()
@@ -585,7 +591,8 @@
         self._assert_config_file_for_platform(port, 'linux3', 'apache2-httpd.conf')
 
         port._is_redhat_based = lambda: True
-        self._assert_config_file_for_platform(port, 'linux2', 'fedora-httpd.conf')
+        port._apache_version = lambda: '2.2'
+        self._assert_config_file_for_platform(port, 'linux2', 'fedora-httpd-2.2.conf')
 
         port = TestWebKitPort()
         port._is_debian_based = lambda: True
@@ -604,19 +611,19 @@
             self.assertRaises(IOError, port._path_to_apache_config_file)
             port._filesystem.write_text_file('/existing/httpd.conf', 'Hello, world!')
             os.environ['WEBKIT_HTTP_SERVER_CONF_PATH'] = '/existing/httpd.conf'
-            self.assertEquals(port._path_to_apache_config_file(), '/existing/httpd.conf')
+            self.assertEqual(port._path_to_apache_config_file(), '/existing/httpd.conf')
         finally:
             os.environ = saved_environ.copy()
 
         # Mock out _apache_config_file_name_for_platform to ignore the passed sys.platform value.
         port._apache_config_file_name_for_platform = lambda platform: 'httpd.conf'
-        self.assertEquals(port._path_to_apache_config_file(), '/mock-checkout/LayoutTests/http/conf/httpd.conf')
+        self.assertEqual(port._path_to_apache_config_file(), '/mock-checkout/LayoutTests/http/conf/httpd.conf')
 
         # Check that even if we mock out _apache_config_file_name, the environment variable takes precedence.
         saved_environ = os.environ.copy()
         try:
             os.environ['WEBKIT_HTTP_SERVER_CONF_PATH'] = '/existing/httpd.conf'
-            self.assertEquals(port._path_to_apache_config_file(), '/existing/httpd.conf')
+            self.assertEqual(port._path_to_apache_config_file(), '/existing/httpd.conf')
         finally:
             os.environ = saved_environ.copy()
 
@@ -646,4 +653,4 @@
 
     def test_additional_platform_directory(self):
         port = self.make_port(options=MockOptions(additional_platform_directory=['/tmp/foo']))
-        self.assertEquals(port.baseline_search_path()[0], '/tmp/foo')
+        self.assertEqual(port.baseline_search_path()[0], '/tmp/foo')
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer.py b/Tools/Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer.py
index f4574a9..465b921 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer.py
@@ -37,7 +37,7 @@
 
 # Shared by GTK and EFL for pulseaudio sanitizing before running tests.
 class PulseAudioSanitizer:
-    def _unload_pulseaudio_module(self):
+    def unload_pulseaudio_module(self):
         # Unload pulseaudio's module-stream-restore, since it remembers
         # volume settings from different runs, and could affect
         # multimedia tests results
@@ -71,7 +71,7 @@
                         _log.debug('Unable to parse module index. Please check if your pulseaudio-utils version is too old.')
                 return
 
-    def _restore_pulseaudio_module(self):
+    def restore_pulseaudio_module(self):
         # If pulseaudio's module-stream-restore was previously unloaded,
         # restore it back. We shouldn't need extra checks here, since an
         # index != -1 here means we successfully unloaded it previously.
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer_mock.py
similarity index 74%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer_mock.py
index f06f94e..88a962a 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/pulseaudio_sanitizer_mock.py
@@ -1,19 +1,19 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyrigth (C) 2013 Zan Dobersek <zandobersek@gmail.com>
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
+#     * Neither the Google name nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,10 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+class PulseAudioSanitizerMock:
+    def unload_pulseaudio_module(self):
+        pass
+
+    def restore_pulseaudio_module(self):
+        pass
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/qt.py b/Tools/Scripts/webkitpy/layout_tests/port/qt.py
index 55f13ee..4840725 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/qt.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/qt.py
@@ -80,6 +80,9 @@
         # The Qt port builds DRT as part of the main build step
         return True
 
+    def supports_per_test_timeout(self):
+        return True
+
     def _path_to_driver(self):
         return self._build_path('bin/%s' % self.driver_name())
 
@@ -90,7 +93,7 @@
         if self.operating_system() == 'mac':
             return self._build_path('lib/QtWebKitWidgets.framework/QtWebKitWidgets')
         else:
-            return self._build_path('lib/libQtWebKitWidgets.so')
+            return self._build_path('lib/libQt5WebKitWidgets.so')
 
     def _modules_to_search_for_symbols(self):
         # We search in every library to be reliable in the case of building with CONFIG+=force_static_libs_as_shared.
@@ -115,10 +118,12 @@
         return version
 
     def _search_paths(self):
+        #                 qt-5.0-mac-wk2
+        #                /
         # qt-5.0-wk1    qt-5.0-wk2
         #            \/
-        #         qt-5.0    qt-4.8
-        #                \/
+        #         qt-5.0
+        #                \
         #    (qt-linux|qt-mac|qt-win)
         #                |
         #               qt
@@ -126,13 +131,13 @@
         version = self.qt_version()
         if '5.0' in version:
             if self.get_option('webkit_test_runner'):
+                if self.operating_system() == 'mac':
+                    search_paths.append('qt-5.0-mac-wk2')
                 search_paths.append('qt-5.0-wk2')
             else:
                 search_paths.append('qt-5.0-wk1')
-        if '4.8' in version:
-            search_paths.append('qt-4.8')
-        elif version:
-            search_paths.append('qt-5.0')
+        search_paths.append('qt-5.0')
+
         search_paths.append(self.port_name + '-' + self.operating_system())
         search_paths.append(self.port_name)
         return search_paths
@@ -140,13 +145,13 @@
     def default_baseline_search_path(self):
         return map(self._webkit_baseline_path, self._search_paths())
 
-    def expectations_files(self):
+    def _port_specific_expectations_files(self):
         paths = self._search_paths()
         if self.get_option('webkit_test_runner'):
             paths.append('wk2')
 
         # expectations_files() uses the directories listed in _search_paths reversed.
-        # e.g. qt -> qt-linux -> qt-4.8
+        # e.g. qt -> qt-linux -> qt-5.0 -> qt-5.0-wk1
         return list(reversed([self._filesystem.join(self._webkit_baseline_path(p), 'TestExpectations') for p in paths]))
 
     def setup_environ_for_server(self, server_name=None):
@@ -182,3 +187,6 @@
             return False
         return result
 
+    # Qt port is not ready for parallel testing, see https://bugs.webkit.org/show_bug.cgi?id=77730 for details.
+    def default_child_processes(self):
+        return 1
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/qt_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/qt_unittest.py
index cf09bd8..2adfbc1 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/qt_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/qt_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 import os
 from copy import deepcopy
 
@@ -42,15 +42,7 @@
     port_name = 'qt-mac'
     port_maker = QtPort
     search_paths_cases = [
-        {'search_paths':['qt-4.8', 'qt-mac', 'qt'], 'os_name':'mac', 'use_webkit2':False, 'qt_version':'4.8'},
-        {'search_paths':['qt-4.8', 'qt-win', 'qt'], 'os_name':'win', 'use_webkit2':False, 'qt_version':'4.8'},
-        {'search_paths':['qt-4.8', 'qt-linux', 'qt'], 'os_name':'linux', 'use_webkit2':False, 'qt_version':'4.8'},
-
-        {'search_paths':['qt-4.8', 'qt-mac', 'qt'], 'os_name':'mac', 'use_webkit2':False},
-        {'search_paths':['qt-4.8', 'qt-win', 'qt'], 'os_name':'win', 'use_webkit2':False},
-        {'search_paths':['qt-4.8', 'qt-linux', 'qt'], 'os_name':'linux', 'use_webkit2':False},
-
-        {'search_paths':['qt-5.0-wk2', 'qt-5.0', 'qt-mac', 'qt'], 'os_name':'mac', 'use_webkit2':True, 'qt_version':'5.0'},
+        {'search_paths':['qt-5.0-mac-wk2', 'qt-5.0-wk2', 'qt-5.0', 'qt-mac', 'qt'], 'os_name':'mac', 'use_webkit2':True, 'qt_version':'5.0'},
         {'search_paths':['qt-5.0-wk2', 'qt-5.0', 'qt-win', 'qt'], 'os_name':'win', 'use_webkit2':True, 'qt_version':'5.0'},
         {'search_paths':['qt-5.0-wk2', 'qt-5.0', 'qt-linux', 'qt'], 'os_name':'linux', 'use_webkit2':True, 'qt_version':'5.0'},
 
@@ -59,7 +51,7 @@
         {'search_paths':['qt-5.0-wk1', 'qt-5.0', 'qt-linux', 'qt'], 'os_name':'linux', 'use_webkit2':False, 'qt_version':'5.0'},
     ]
 
-    def _assert_search_path(self, search_paths, os_name, use_webkit2=False, qt_version='4.8'):
+    def _assert_search_path(self, search_paths, os_name, use_webkit2=False, qt_version='5.0'):
         # FIXME: Port constructors should not "parse" the port name, but
         # rather be passed components (directly or via setters).  Once
         # we fix that, this method will need a re-write.
@@ -69,9 +61,9 @@
         port = self.make_port(host=host, qt_version=qt_version, port_name=port_name,
                               options=MockOptions(webkit_test_runner=use_webkit2, platform='qt'))
         absolute_search_paths = map(port._webkit_baseline_path, search_paths)
-        self.assertEquals(port.baseline_search_path(), absolute_search_paths)
+        self.assertEqual(port.baseline_search_path(), absolute_search_paths)
 
-    def _assert_expectations_files(self, search_paths, os_name, use_webkit2=False, qt_version='4.8'):
+    def _assert_expectations_files(self, search_paths, os_name, use_webkit2=False, qt_version='5.0'):
         # FIXME: Port constructors should not "parse" the port name, but
         # rather be passed components (directly or via setters).  Once
         # we fix that, this method will need a re-write.
@@ -80,11 +72,9 @@
         port_name = 'qt-' + os_name
         port = self.make_port(host=host, qt_version=qt_version, port_name=port_name,
                               options=MockOptions(webkit_test_runner=use_webkit2, platform='qt'))
-        self.assertEquals(port.expectations_files(), search_paths)
+        self.assertEqual(port.expectations_files(), search_paths)
 
     def _qt_version(self, qt_version):
-        if qt_version in '4.8':
-            return 'QMake version 2.01a\nUsing Qt version 4.8.0 in /usr/local/Trolltech/Qt-4.8.2/lib'
         if qt_version in '5.0':
             return 'QMake version 2.01a\nUsing Qt version 5.0.0 in /usr/local/Trolltech/Qt-5.0.0/lib'
 
@@ -97,20 +87,21 @@
             expectations_case = deepcopy(case)
             if expectations_case['use_webkit2']:
                 expectations_case['search_paths'].append("wk2")
+            expectations_case['search_paths'].append('')
             expectations_case['search_paths'].reverse()
-            expectations_case['search_paths'] = map(lambda path: '/mock-checkout/LayoutTests/platform/%s/TestExpectations' % (path), expectations_case['search_paths'])
+            expectations_case['search_paths'] = map(lambda path: '/mock-checkout/LayoutTests/TestExpectations' if not path else '/mock-checkout/LayoutTests/platform/%s/TestExpectations' % (path), expectations_case['search_paths'])
             self._assert_expectations_files(**expectations_case)
 
     def test_show_results_html_file(self):
         port = self.make_port()
         port._executive = MockExecutive(should_log=True)
-        expected_stderr = "MOCK run_command: ['Tools/Scripts/run-launcher', '--release', '--qt', 'file://test.html'], cwd=/mock-checkout\n"
-        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK run_command: ['Tools/Scripts/run-launcher', '--release', '--qt', 'file://test.html'], cwd=/mock-checkout\n"
+        OutputCapture().assert_outputs(self, port.show_results_html_file, ["test.html"], expected_logs=expected_logs)
 
     def test_setup_environ_for_server(self):
         port = self.make_port()
         env = port.setup_environ_for_server(port.driver_name())
-        self.assertEquals(env['QTWEBKIT_PLUGIN_PATH'], '/mock-build/lib/plugins')
+        self.assertEqual(env['QTWEBKIT_PLUGIN_PATH'], '/mock-build/lib/plugins')
 
     def test_operating_system(self):
         self.assertEqual('linux', self.make_port(port_name='qt-linux', os_name='linux').operating_system())
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/server_process.py b/Tools/Scripts/webkitpy/layout_tests/port/server_process.py
index 8f0cda9..7ce1e06 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/server_process.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/server_process.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/server_process_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/server_process_unittest.py
index 7a5ac45..97376aa 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/server_process_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/server_process_unittest.py
@@ -28,7 +28,7 @@
 
 import sys
 import time
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.port.factory import PortFactory
 from webkitpy.layout_tests.port import server_process
@@ -104,23 +104,23 @@
         proc = server_process.ServerProcess(port, 'python', cmd)
         proc.write('')
 
-        self.assertEquals(proc.poll(), None)
+        self.assertEqual(proc.poll(), None)
         self.assertFalse(proc.has_crashed())
 
         # check that doing a read after an expired deadline returns
         # nothing immediately.
         line = proc.read_stdout_line(now - 1)
-        self.assertEquals(line, None)
+        self.assertEqual(line, None)
 
         # FIXME: This part appears to be flaky. line should always be non-None.
         # FIXME: https://bugs.webkit.org/show_bug.cgi?id=88280
         line = proc.read_stdout_line(now + 1.0)
         if line:
-            self.assertEquals(line.strip(), "stdout")
+            self.assertEqual(line.strip(), "stdout")
 
         line = proc.read_stderr_line(now + 1.0)
         if line:
-            self.assertEquals(line.strip(), "stderr")
+            self.assertEqual(line.strip(), "stderr")
 
         proc.stop(0)
 
@@ -140,13 +140,13 @@
         server_process = FakeServerProcess(port_obj=port_obj, name="test", cmd=["test"])
         server_process.write("should break")
         self.assertTrue(server_process.has_crashed())
-        self.assertNotEquals(server_process.pid(), None)
-        self.assertEquals(server_process._proc, None)
-        self.assertEquals(server_process.broken_pipes, [server_process.stdin])
+        self.assertIsNotNone(server_process.pid())
+        self.assertIsNone(server_process._proc)
+        self.assertEqual(server_process.broken_pipes, [server_process.stdin])
 
         port_obj.host.platform.os_name = 'mac'
         server_process = FakeServerProcess(port_obj=port_obj, name="test", cmd=["test"])
         server_process.write("should break")
         self.assertTrue(server_process.has_crashed())
-        self.assertEquals(server_process._proc, None)
-        self.assertEquals(server_process.broken_pipes, [server_process.stdin])
+        self.assertIsNone(server_process._proc)
+        self.assertEqual(server_process.broken_pipes, [server_process.stdin])
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/test.py b/Tools/Scripts/webkitpy/layout_tests/port/test.py
index f7dd291..c622cc2 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/test.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/test.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -98,6 +97,15 @@
     def __getitem__(self, item):
         return self.tests[item]
 
+#
+# These numbers may need to be updated whenever we add or delete tests.
+#
+TOTAL_TESTS = 104
+TOTAL_SKIPS = 28
+TOTAL_RETRIES = 14
+
+UNEXPECTED_PASSES = 6
+UNEXPECTED_FAILURES = 17
 
 def unit_test_list():
     tests = TestList()
@@ -339,6 +347,7 @@
 
 class TestPort(Port):
     port_name = 'test'
+    default_port_name = 'test-mac-leopard'
 
     """Test implementation of the Port interface."""
     ALL_BASELINE_VARIANTS = (
@@ -350,23 +359,20 @@
     @classmethod
     def determine_full_port_name(cls, host, options, port_name):
         if port_name == 'test':
-            return 'test-mac-leopard'
+            return TestPort.default_port_name
         return port_name
 
     def __init__(self, host, port_name=None, **kwargs):
-        # FIXME: Consider updating all of the callers to pass in a port_name so it can be a
-        # required parameter like all of the other Port objects.
-        port_name = port_name or 'test-mac-leopard'
-        Port.__init__(self, host, port_name, **kwargs)
+        Port.__init__(self, host, port_name or TestPort.default_port_name, **kwargs)
         self._tests = unit_test_list()
         self._flakes = set()
         self._expectations_path = LAYOUT_TEST_DIR + '/platform/test/TestExpectations'
         self._results_directory = None
 
         self._operating_system = 'mac'
-        if port_name.startswith('test-win'):
+        if self._name.startswith('test-win'):
             self._operating_system = 'win'
-        elif port_name.startswith('test-linux'):
+        elif self._name.startswith('test-linux'):
             self._operating_system = 'linux'
 
         version_map = {
@@ -377,7 +383,7 @@
             'test-mac-snowleopard': 'snowleopard',
             'test-linux-x86_64': 'lucid',
         }
-        self._version = version_map[port_name]
+        self._version = version_map[self._name]
 
     def default_pixel_tests(self):
         return True
@@ -434,9 +440,7 @@
     def webkit_base(self):
         return '/test.checkout'
 
-    def skipped_layout_tests(self, test_list):
-        # This allows us to test the handling Skipped files, both with a test
-        # that actually passes, and a test that does fail.
+    def _skipped_tests_for_unsupported_features(self, test_list):
         return set(['failures/expected/skip_text.html',
                     'failures/unexpected/skip_pass.html',
                     'virtual/skipped'])
@@ -536,12 +540,23 @@
 
 class TestDriver(Driver):
     """Test/Dummy implementation of the DumpRenderTree interface."""
+    next_pid = 1
+
+    def __init__(self, *args, **kwargs):
+        super(TestDriver, self).__init__(*args, **kwargs)
+        self.started = False
+        self.pid = 0
 
     def cmd_line(self, pixel_tests, per_test_args):
         pixel_tests_flag = '-p' if pixel_tests else ''
         return [self._port._path_to_driver()] + [pixel_tests_flag] + self._port.get_option('additional_drt_flag', []) + per_test_args
 
     def run_test(self, test_input, stop_when_done):
+        if not self.started:
+            self.started = True
+            self.pid = TestDriver.next_pid
+            TestDriver.next_pid += 1
+
         start_time = time.time()
         test_name = test_input.test_name
         test_args = test_input.args or []
@@ -589,10 +604,7 @@
         return DriverOutput(actual_text, image, test.actual_checksum, audio,
             crash=test.crash or test.web_process_crash, crashed_process_name=crashed_process_name,
             crashed_pid=crashed_pid, crash_log=crash_log,
-            test_time=time.time() - start_time, timeout=test.timeout, error=test.error)
-
-    def start(self, pixel_tests, per_test_args):
-        pass
+            test_time=time.time() - start_time, timeout=test.timeout, error=test.error, pid=self.pid)
 
     def stop(self):
-        pass
+        self.started = False
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/win.py b/Tools/Scripts/webkitpy/layout_tests/port/win.py
index ff473fe..6adbf75 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/win.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/win.py
@@ -61,10 +61,11 @@
         return expected_text != actual_text
 
     def default_baseline_search_path(self):
-        if self._name.endswith(self.FUTURE_VERSION):
+        name = self._name.replace('-wk2', '')
+        if name.endswith(self.FUTURE_VERSION):
             fallback_names = [self.port_name]
         else:
-            fallback_names = self.VERSION_FALLBACK_ORDER[self.VERSION_FALLBACK_ORDER.index(self._name):-1] + [self.port_name]
+            fallback_names = self.VERSION_FALLBACK_ORDER[self.VERSION_FALLBACK_ORDER.index(name):-1] + [self.port_name]
         # FIXME: The AppleWin port falls back to AppleMac for some results.  Eventually we'll have a shared 'apple' port.
         if self.get_option('webkit_test_runner'):
             fallback_names.insert(0, 'win-wk2')
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/win_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/win_unittest.py
index 930dcd8..e77687c 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/win_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/win_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import StringIO
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.common.system.executive_mock import MockExecutive, MockExecutive2
@@ -51,16 +51,16 @@
         capture = OutputCapture()
         capture.capture_output()
         port.show_results_html_file('test.html')
-        _, stderr, _ = capture.restore_output()
+        _, _, logs = capture.restore_output()
         # We can't know for sure what path will be produced by cygpath, but we can assert about
         # everything else.
-        self.assertTrue(stderr.startswith("MOCK run_command: ['Tools/Scripts/run-safari', '--release', '"))
-        self.assertTrue(stderr.endswith("test.html'], cwd=/mock-checkout\n"))
+        self.assertTrue(logs.startswith("MOCK run_command: ['Tools/Scripts/run-safari', '--release', '"))
+        self.assertTrue(logs.endswith("test.html'], cwd=/mock-checkout\n"))
 
     def _assert_search_path(self, expected_search_paths, version, use_webkit2=False):
         port = self.make_port(port_name='win', os_version=version, options=MockOptions(webkit_test_runner=use_webkit2))
         absolute_search_paths = map(port._webkit_baseline_path, expected_search_paths)
-        self.assertEquals(port.baseline_search_path(), absolute_search_paths)
+        self.assertEqual(port.baseline_search_path(), absolute_search_paths)
 
     def test_baseline_search_path(self):
         self._assert_search_path(['win-xp', 'win-vista', 'win-7sp0', 'win', 'mac-lion', 'mac'], 'xp')
@@ -74,7 +74,7 @@
     def _assert_version(self, port_name, expected_version):
         host = MockSystemHost(os_name='win', os_version=expected_version)
         port = WinPort(host, port_name=port_name)
-        self.assertEquals(port.version(), expected_version)
+        self.assertEqual(port.version(), expected_version)
 
     def test_versions(self):
         self._assert_version('win-xp', 'xp')
@@ -100,10 +100,10 @@
         port = self.make_port()
         port._executive.run_command = lambda command, cwd=None, error_handler=None: "Nonsense"
         # runtime_features_list returns None when its results are meaningless (it couldn't run DRT or parse the output, etc.)
-        self.assertEquals(port._runtime_feature_list(), None)
+        self.assertEqual(port._runtime_feature_list(), None)
         port._executive.run_command = lambda command, cwd=None, error_handler=None: "SupportedFeatures:foo bar"
-        self.assertEquals(port._runtime_feature_list(), ['foo', 'bar'])
+        self.assertEqual(port._runtime_feature_list(), ['foo', 'bar'])
 
     def test_expectations_files(self):
-        self.assertEquals(len(self.make_port().expectations_files()), 2)
-        self.assertEquals(len(self.make_port(options=MockOptions(webkit_test_runner=True)).expectations_files()), 4)
+        self.assertEqual(len(self.make_port().expectations_files()), 3)
+        self.assertEqual(len(self.make_port(options=MockOptions(webkit_test_runner=True, configuration='Release')).expectations_files()), 5)
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver.py b/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver.py
index b98c039..71ea8dd 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver.py
@@ -39,6 +39,13 @@
 
 
 class XvfbDriver(Driver):
+    @staticmethod
+    def check_xvfb(port):
+        xvfb_found = port.host.executive.run_command(['which', 'Xvfb'], return_exit_code=True) is 0
+        if not xvfb_found:
+            _log.error("No Xvfb found. Cannot run layout tests.")
+        return xvfb_found
+
     def __init__(self, *args, **kwargs):
         Driver.__init__(self, *args, **kwargs)
         self._guard_lock = None
@@ -54,11 +61,13 @@
         for i in range(99):
             if i not in reserved_screens:
                 _guard_lock_file = self._port.host.filesystem.join('/tmp', 'WebKitXvfb.lock.%i' % i)
-                self._guard_lock = FileLock(_guard_lock_file)
+                self._guard_lock = self._port.host.make_file_lock(_guard_lock_file)
                 if self._guard_lock.acquire_lock():
                     return i
 
     def _start(self, pixel_tests, per_test_args):
+        self.stop()
+
         # Use even displays for pixel tests and odd ones otherwise. When pixel tests are disabled,
         # DriverProxy creates two drivers, one for normal and the other for ref tests. Both have
         # the same worker number, so this prevents them from using the same Xvfb instance.
diff --git a/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py b/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py
index 220dd35..4c5d338 100644
--- a/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py
@@ -26,22 +26,25 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import logging
+import unittest2 as unittest
 
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.executive_mock import MockExecutive2
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.system.systemhost_mock import MockSystemHost
 from webkitpy.layout_tests.port import Port
-from webkitpy.layout_tests.port.config_mock import MockConfig
 from webkitpy.layout_tests.port.server_process_mock import MockServerProcess
 from webkitpy.layout_tests.port.xvfbdriver import XvfbDriver
+from webkitpy.tool.mocktool import MockOptions
+
+_log = logging.getLogger(__name__)
 
 
 class XvfbDriverTest(unittest.TestCase):
     def make_driver(self, worker_number=0, xorg_running=False, executive=None):
-        port = Port(host=MockSystemHost(log_executive=True, executive=executive), config=MockConfig())
+        port = Port(MockSystemHost(log_executive=True, executive=executive), 'xvfbdrivertestport', options=MockOptions(configuration='Release'))
+        port._config.build_directory = lambda configuration: "/mock-build"
         port._server_process_constructor = MockServerProcess
         if xorg_running:
             port._executive._running_pids['Xorg'] = 108
@@ -56,30 +59,30 @@
         # intend to test the behavior of XvfbDriver.stop.
         driver._xvfb_process = None
 
-    def assertDriverStartSuccessful(self, driver, expected_stderr, expected_display, pixel_tests=False):
-        OutputCapture().assert_outputs(self, driver.start, [pixel_tests, []], expected_stderr=expected_stderr)
+    def assertDriverStartSuccessful(self, driver, expected_logs, expected_display, pixel_tests=False):
+        OutputCapture().assert_outputs(self, driver.start, [pixel_tests, []], expected_logs=expected_logs)
         self.assertTrue(driver._server_process.started)
         self.assertEqual(driver._server_process.env["DISPLAY"], expected_display)
 
     def test_start_no_pixel_tests(self):
         driver = self.make_driver()
-        expected_stderr = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
-        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0")
+        expected_logs = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
+        self.assertDriverStartSuccessful(driver, expected_logs=expected_logs, expected_display=":0")
         self.cleanup_driver(driver)
 
     def test_start_pixel_tests(self):
         driver = self.make_driver()
-        expected_stderr = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
-        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0", pixel_tests=True)
+        expected_logs = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
+        self.assertDriverStartSuccessful(driver, expected_logs=expected_logs, expected_display=":0", pixel_tests=True)
         self.cleanup_driver(driver)
 
     def test_start_arbitrary_worker_number(self):
         driver = self.make_driver(worker_number=17)
-        expected_stderr = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
-        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0", pixel_tests=True)
+        expected_logs = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
+        self.assertDriverStartSuccessful(driver, expected_logs=expected_logs, expected_display=":0", pixel_tests=True)
         self.cleanup_driver(driver)
 
-    def disabled_test_next_free_display(self):
+    def test_next_free_display(self):
         output = "Xorg            /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none\nXvfb            Xvfb :1 -screen 0 800x600x24 -nolisten tcp"
         executive = MockExecutive2(output)
         driver = self.make_driver(executive=executive)
@@ -104,19 +107,19 @@
     def test_start_next_worker(self):
         driver = self.make_driver()
         driver._next_free_display = lambda: 0
-        expected_stderr = "MOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
-        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0", pixel_tests=True)
+        expected_logs = "MOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
+        self.assertDriverStartSuccessful(driver, expected_logs=expected_logs, expected_display=":0", pixel_tests=True)
         self.cleanup_driver(driver)
         driver = self.make_driver()
         driver._next_free_display = lambda: 3
-        expected_stderr = "MOCK popen: ['Xvfb', ':3', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
-        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":3", pixel_tests=True)
+        expected_logs = "MOCK popen: ['Xvfb', ':3', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
+        self.assertDriverStartSuccessful(driver, expected_logs=expected_logs, expected_display=":3", pixel_tests=True)
         self.cleanup_driver(driver)
 
     def test_stop(self):
         filesystem = MockFileSystem(files={'/tmp/.X42-lock': '1234\n'})
-        port = Port(host=MockSystemHost(log_executive=True, filesystem=filesystem), config=MockConfig())
-        port._executive.kill_process = lambda x: log("MOCK kill_process pid: " + str(x))
+        port = Port(MockSystemHost(log_executive=True, filesystem=filesystem), 'xvfbdrivertestport', options=MockOptions(configuration='Release'))
+        port._executive.kill_process = lambda x: _log.info("MOCK kill_process pid: " + str(x))
         driver = XvfbDriver(port, worker_number=0, pixel_tests=True)
 
         class FakeXvfbProcess(object):
@@ -125,8 +128,8 @@
         driver._xvfb_process = FakeXvfbProcess()
         driver._lock_file = '/tmp/.X42-lock'
 
-        expected_stderr = "MOCK kill_process pid: 1234\n"
-        OutputCapture().assert_outputs(self, driver.stop, [], expected_stderr=expected_stderr)
+        expected_logs = "MOCK kill_process pid: 1234\n"
+        OutputCapture().assert_outputs(self, driver.stop, [], expected_logs=expected_logs)
 
-        self.assertEqual(driver._xvfb_process, None)
+        self.assertIsNone(driver._xvfb_process)
         self.assertFalse(port._filesystem.exists(driver._lock_file))
diff --git a/Tools/Scripts/webkitpy/layout_tests/reftests/extract_reference_link_unittest.py b/Tools/Scripts/webkitpy/layout_tests/reftests/extract_reference_link_unittest.py
index 717bc7c..85b18e2 100644
--- a/Tools/Scripts/webkitpy/layout_tests/reftests/extract_reference_link_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/reftests/extract_reference_link_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -24,7 +23,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.reftests import extract_reference_link
 
@@ -56,10 +55,10 @@
 </html>
 """
         matches, mismatches = extract_reference_link.get_reference_link(html_1)
-        self.assertEqual(matches,
-                         ["green-box-ref.xht", "blue-box-ref.xht"])
-        self.assertEqual(mismatches,
-                         ["red-box-notref.xht", "red-box-notref.xht"])
+        self.assertItemsEqual(matches,
+                              ["green-box-ref.xht", "blue-box-ref.xht"])
+        self.assertItemsEqual(mismatches,
+                              ["red-box-notref.xht", "red-box-notref.xht"])
 
         html_2 = ""
         empty_tuple_1 = extract_reference_link.get_reference_link(html_2)
@@ -79,7 +78,3 @@
         html_5 = """<link rel="help" href="RELEVANT_SPEC_SECTION">"""
         empty_tuple_4 = extract_reference_link.get_reference_link(html_5)
         self.assertEqual(empty_tuple_4, ([], []))
-
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py b/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
old mode 100755
new mode 100644
index 1c8e732..b211b97
--- a/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
+++ b/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 # Copyright (C) 2011 Apple Inc. All rights reserved.
@@ -29,7 +28,6 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import errno
 import logging
 import optparse
 import os
@@ -38,10 +36,9 @@
 import traceback
 
 from webkitpy.common.host import Host
-from webkitpy.common.system import stack_utils
-from webkitpy.layout_tests.controllers.manager import Manager, WorkerException, TestRunInterruptedException
-from webkitpy.layout_tests.models import test_expectations
+from webkitpy.layout_tests.controllers.manager import Manager
 from webkitpy.layout_tests.port import configuration_options, platform_options
+from webkitpy.layout_tests.views import buildbot_results
 from webkitpy.layout_tests.views import printing
 
 
@@ -56,149 +53,46 @@
 EXCEPTIONAL_EXIT_STATUS = 254
 
 
-def lint(port, options):
-    host = port.host
-    if options.platform:
-        ports_to_lint = [port]
+def main(argv, stdout, stderr):
+    options, args = parse_args(argv)
+
+    if options.platform and 'test' in options.platform:
+        # It's a bit lame to import mocks into real code, but this allows the user
+        # to run tests against the test platform interactively, which is useful for
+        # debugging test failures.
+        from webkitpy.common.host_mock import MockHost
+        host = MockHost()
     else:
-        ports_to_lint = [host.port_factory.get(name) for name in host.port_factory.all_port_names()]
+        host = Host()
 
-    files_linted = set()
-    lint_failed = False
+    if options.lint_test_files:
+        from webkitpy.layout_tests.lint_test_expectations import lint
+        return lint(host, options, stderr)
 
-    for port_to_lint in ports_to_lint:
-        expectations_dict = port_to_lint.expectations_dict()
-        for expectations_file in expectations_dict.keys():
-            if expectations_file in files_linted:
-                continue
-
-            try:
-                test_expectations.TestExpectations(port_to_lint, expectations_to_lint={expectations_file: expectations_dict[expectations_file]})
-            except test_expectations.ParseError, e:
-                lint_failed = True
-                _log.error('')
-                for warning in e.warnings:
-                    _log.error(warning)
-                _log.error('')
-            files_linted.add(expectations_file)
-
-    if lint_failed:
-        _log.error('Lint failed.')
-        return -1
-    _log.info('Lint succeeded.')
-    return 0
-
-
-def run(port, options, args, regular_output=sys.stderr, buildbot_output=sys.stdout):
     try:
-        warnings = _set_up_derived_options(port, options)
+        port = host.port_factory.get(options.platform, options)
+    except NotImplementedError, e:
+        # FIXME: is this the best way to handle unsupported port names?
+        print >> stderr, str(e)
+        return EXCEPTIONAL_EXIT_STATUS
 
-        printer = printing.Printer(port, options, regular_output, buildbot_output, logger=logging.getLogger())
+    try:
+        run_details = run(port, options, args, stderr)
+        if run_details.exit_code != -1:
+            bot_printer = buildbot_results.BuildBotPrinter(stdout, options.debug_rwt_logging)
+            bot_printer.print_results(run_details)
 
-        for warning in warnings:
-            _log.warning(warning)
-
-        if options.lint_test_files:
-            return lint(port, options)
-
-        # We wrap any parts of the run that are slow or likely to raise exceptions
-        # in a try/finally to ensure that we clean up the logging configuration.
-        unexpected_result_count = -1
-
-        manager = Manager(port, options, printer)
-        printer.print_config(port.results_directory())
-
-        unexpected_result_count = manager.run(args)
-        _log.debug("Testing completed, Exit status: %d" % unexpected_result_count)
-    except Exception:
-        exception_type, exception_value, exception_traceback = sys.exc_info()
-        if exception_type not in (KeyboardInterrupt, TestRunInterruptedException, WorkerException):
-            print >> sys.stderr, '\n%s raised: %s' % (exception_type.__name__, exception_value)
-            stack_utils.log_traceback(_log.error, exception_traceback)
-        raise
-    finally:
-        printer.cleanup()
-
-    return unexpected_result_count
+        return run_details.exit_code
+    except KeyboardInterrupt:
+        return INTERRUPTED_EXIT_STATUS
+    except BaseException as e:
+        if isinstance(e, Exception):
+            print >> stderr, '\n%s raised: %s' % (e.__class__.__name__, str(e))
+            traceback.print_exc(file=stderr)
+        return EXCEPTIONAL_EXIT_STATUS
 
 
-def _set_up_derived_options(port, options):
-    """Sets the options values that depend on other options values."""
-    # We return a list of warnings to print after the printer is initialized.
-    warnings = []
-
-    if not options.child_processes:
-        options.child_processes = os.environ.get("WEBKIT_TEST_CHILD_PROCESSES",
-                                                 str(port.default_child_processes()))
-    if not options.max_locked_shards:
-        options.max_locked_shards = int(os.environ.get("WEBKIT_TEST_MAX_LOCKED_SHARDS",
-                                                       str(port.default_max_locked_shards())))
-
-    if not options.configuration:
-        options.configuration = port.default_configuration()
-
-    if options.pixel_tests is None:
-        options.pixel_tests = port.default_pixel_tests()
-
-    if not options.time_out_ms:
-        options.time_out_ms = str(port.default_timeout_ms())
-
-    options.slow_time_out_ms = str(5 * int(options.time_out_ms))
-
-    if options.additional_platform_directory:
-        additional_platform_directories = []
-        for path in options.additional_platform_directory:
-            additional_platform_directories.append(port.host.filesystem.abspath(path))
-        options.additional_platform_directory = additional_platform_directories
-
-    if not options.http and options.skipped in ('ignore', 'only'):
-        warnings.append("--force/--skipped=%s overrides --no-http." % (options.skipped))
-        options.http = True
-
-    if options.ignore_metrics and (options.new_baseline or options.reset_results):
-        warnings.append("--ignore-metrics has no effect with --new-baselines or with --reset-results")
-
-    if options.new_baseline:
-        options.reset_results = True
-        options.add_platform_exceptions = True
-
-    if options.pixel_test_directories:
-        options.pixel_tests = True
-        varified_dirs = set()
-        pixel_test_directories = options.pixel_test_directories
-        for directory in pixel_test_directories:
-            # FIXME: we should support specifying the directories all the ways we support it for additional
-            # arguments specifying which tests and directories to run. We should also move the logic for that
-            # to Port.
-            filesystem = port.host.filesystem
-            if not filesystem.isdir(filesystem.join(port.layout_tests_dir(), directory)):
-                warnings.append("'%s' was passed to --pixel-test-directories, which doesn't seem to be a directory" % str(directory))
-            else:
-                varified_dirs.add(directory)
-
-        options.pixel_test_directories = list(varified_dirs)
-
-    if options.run_singly:
-        options.verbose = True
-
-    return warnings
-
-
-def _compat_shim_callback(option, opt_str, value, parser):
-    print "Ignoring unsupported option: %s" % opt_str
-
-
-def _compat_shim_option(option_name, **kwargs):
-    return optparse.make_option(option_name, action="callback",
-        callback=_compat_shim_callback,
-        help="Ignored, for old-run-webkit-tests compat only.", **kwargs)
-
-
-def parse_args(args=None):
-    """Provides a default set of command line args.
-
-    Returns a tuple of options, args from optparse"""
-
+def parse_args(args):
     option_group_definitions = []
 
     option_group_definitions.append(("Platform options", platform_options()))
@@ -207,45 +101,9 @@
 
     # FIXME: These options should move onto the ChromiumPort.
     option_group_definitions.append(("Chromium-specific Options", [
-        optparse.make_option("--startup-dialog", action="store_true",
-            default=False, help="create a dialog on DumpRenderTree startup"),
-        optparse.make_option("--gp-fault-error-box", action="store_true",
-            default=False, help="enable Windows GP fault error box"),
-        optparse.make_option("--js-flags",
-            type="string", help="JavaScript flags to pass to tests"),
-        optparse.make_option("--stress-opt", action="store_true",
-            default=False,
-            help="Enable additional stress test to JavaScript optimization"),
-        optparse.make_option("--stress-deopt", action="store_true",
-            default=False,
-            help="Enable additional stress test to JavaScript optimization"),
         optparse.make_option("--nocheck-sys-deps", action="store_true",
             default=False,
             help="Don't check the system dependencies (themes)"),
-        optparse.make_option("--accelerated-video",
-            action="store_true",
-            help="Use hardware-accelerated compositing for video"),
-        optparse.make_option("--no-accelerated-video",
-            action="store_false",
-            dest="accelerated_video",
-            help="Don't use hardware-accelerated compositing for video"),
-        optparse.make_option("--threaded-compositing",
-            action="store_true",
-            help="Use threaded compositing for rendering"),
-        optparse.make_option("--accelerated-2d-canvas",
-            action="store_true",
-            help="Use hardware-accelerated 2D Canvas calls"),
-        optparse.make_option("--no-accelerated-2d-canvas",
-            action="store_false",
-            dest="accelerated_2d_canvas",
-            help="Don't use hardware-accelerated 2D Canvas calls"),
-        optparse.make_option("--accelerated-painting",
-            action="store_true",
-            default=False,
-            help="Use hardware accelerated painting of composited pages"),
-        optparse.make_option("--per-tile-painting",
-            action="store_true",
-            help="Use per-tile painting of composited pages"),
         optparse.make_option("--adb-device",
             action="append", default=[],
             help="Run Android layout tests on these devices."),
@@ -274,16 +132,10 @@
             help="Path to a directory containing the executables needed to run tests."),
     ]))
 
-    option_group_definitions.append(("ORWT Compatibility Options", [
-        # FIXME: Remove this option once the bots don't refer to it.
-        # results.html is smart enough to figure this out itself.
-        _compat_shim_option("--use-remote-links-to-tests"),
-    ]))
-
     option_group_definitions.append(("Results Options", [
-        optparse.make_option("-p", "--pixel-tests", action="store_true",
+        optparse.make_option("-p", "--pixel", "--pixel-tests", action="store_true",
             dest="pixel_tests", help="Enable pixel-to-pixel PNG comparisons"),
-        optparse.make_option("--no-pixel-tests", action="store_false",
+        optparse.make_option("--no-pixel", "--no-pixel-tests", action="store_false",
             dest="pixel_tests", help="Disable pixel-to-pixel PNG comparisons"),
         optparse.make_option("--no-sample-on-timeout", action="store_false",
             dest="sample_on_timeout", help="Don't run sample on timeout (Mac OS X only)"),
@@ -339,18 +191,11 @@
             default=True, dest="show_results",
             help="Don't launch a browser with results after the tests "
                  "are done"),
-        # FIXME: We should have a helper function to do this sort of
-        # deprectated mapping and automatically log, etc.
-        optparse.make_option("--noshow-results", action="store_false", dest="show_results", help="Deprecated, same as --no-show-results."),
-        optparse.make_option("--no-launch-safari", action="store_false", dest="show_results", help="Deprecated, same as --no-show-results."),
         optparse.make_option("--full-results-html", action="store_true",
             default=False,
             help="Show all failures in results.html, rather than only regressions"),
         optparse.make_option("--clobber-old-results", action="store_true",
             default=False, help="Clobbers test results from previous runs."),
-        optparse.make_option("--no-record-results", action="store_false",
-            default=True, dest="record_results",
-            help="Don't record the results."),
         optparse.make_option("--http", action="store_true", dest="http",
             default=True, help="Run HTTP and WebSocket tests (default)"),
         optparse.make_option("--no-http", action="store_false", dest="http",
@@ -389,9 +234,11 @@
             help="Run all tests, even those marked SKIP in the test list (same as --skipped=ignore)"),
         optparse.make_option("--time-out-ms",
             help="Set the timeout for each test"),
-        optparse.make_option("--randomize-order", action="store_true",
-            default=False, help=("Run tests in random order (useful "
-                                "for tracking down corruption)")),
+        optparse.make_option("--order", action="store", default="natural",
+            help=("determine the order in which the test cases will be run. "
+                  "'none' == use the order in which the tests were listed either in arguments or test list, "
+                  "'natural' == use the natural order (default), "
+                  "'random' == randomize the test order.")),
         optparse.make_option("--run-chunk",
             help=("Run a specified chunk (n:l), the nth of len l, "
                  "of the layout tests")),
@@ -425,6 +272,10 @@
             help="Set the maximum number of locked shards"),
         optparse.make_option("--additional-env-var", type="string", action="append", default=[],
             help="Passes that environment variable to the tests (--additional-env-var=NAME=VALUE)"),
+        optparse.make_option("--profile", action="store_true",
+            help="Output per-test profile information."),
+        optparse.make_option("--profiler", action="store",
+            help="Output per-test profile information, using the specified profiler."),
     ]))
 
     option_group_definitions.append(("Miscellaneous Options", [
@@ -459,37 +310,79 @@
     return option_parser.parse_args(args)
 
 
-def main(argv=None):
+def _set_up_derived_options(port, options):
+    """Sets the options values that depend on other options values."""
+    if not options.child_processes:
+        options.child_processes = os.environ.get("WEBKIT_TEST_CHILD_PROCESSES",
+                                                 str(port.default_child_processes()))
+    if not options.max_locked_shards:
+        options.max_locked_shards = int(os.environ.get("WEBKIT_TEST_MAX_LOCKED_SHARDS",
+                                                       str(port.default_max_locked_shards())))
+
+    if not options.configuration:
+        options.configuration = port.default_configuration()
+
+    if options.pixel_tests is None:
+        options.pixel_tests = port.default_pixel_tests()
+
+    if not options.time_out_ms:
+        options.time_out_ms = str(port.default_timeout_ms())
+
+    options.slow_time_out_ms = str(5 * int(options.time_out_ms))
+
+    if options.additional_platform_directory:
+        additional_platform_directories = []
+        for path in options.additional_platform_directory:
+            additional_platform_directories.append(port.host.filesystem.abspath(path))
+        options.additional_platform_directory = additional_platform_directories
+
+    if not options.http and options.skipped in ('ignore', 'only'):
+        _log.warning("--force/--skipped=%s overrides --no-http." % (options.skipped))
+        options.http = True
+
+    if options.ignore_metrics and (options.new_baseline or options.reset_results):
+        _log.warning("--ignore-metrics has no effect with --new-baselines or with --reset-results")
+
+    if options.new_baseline:
+        options.reset_results = True
+        options.add_platform_exceptions = True
+
+    if options.pixel_test_directories:
+        options.pixel_tests = True
+        varified_dirs = set()
+        pixel_test_directories = options.pixel_test_directories
+        for directory in pixel_test_directories:
+            # FIXME: we should support specifying the directories all the ways we support it for additional
+            # arguments specifying which tests and directories to run. We should also move the logic for that
+            # to Port.
+            filesystem = port.host.filesystem
+            if not filesystem.isdir(filesystem.join(port.layout_tests_dir(), directory)):
+                _log.warning("'%s' was passed to --pixel-test-directories, which doesn't seem to be a directory" % str(directory))
+            else:
+                varified_dirs.add(directory)
+
+        options.pixel_test_directories = list(varified_dirs)
+
+    if options.run_singly:
+        options.verbose = True
+
+
+def run(port, options, args, logging_stream):
+    logger = logging.getLogger()
+    logger.setLevel(logging.DEBUG if options.debug_rwt_logging else logging.INFO)
+
     try:
-        options, args = parse_args(argv)
-        if options.platform and 'test' in options.platform:
-            # It's a bit lame to import mocks into real code, but this allows the user
-            # to run tests against the test platform interactively, which is useful for
-            # debugging test failures.
-            from webkitpy.common.host_mock import MockHost
-            host = MockHost()
-        else:
-            host = Host()
-        port = host.port_factory.get(options.platform, options)
-    except NotImplementedError, e:
-        # FIXME: is this the best way to handle unsupported port names?
-        print >> sys.stderr, str(e)
-        return EXCEPTIONAL_EXIT_STATUS
-    except Exception, e:
-        print >> sys.stderr, '\n%s raised: %s' % (e.__class__.__name__, str(e))
-        traceback.print_exc(file=sys.stderr)
-        raise
+        printer = printing.Printer(port, options, logging_stream, logger=logger)
 
-    logging.getLogger().setLevel(logging.DEBUG if options.debug_rwt_logging else logging.INFO)
-    return run(port, options, args)
+        _set_up_derived_options(port, options)
+        manager = Manager(port, options, printer)
+        printer.print_config(port.results_directory())
 
+        run_details = manager.run(args)
+        _log.debug("Testing completed, Exit status: %d" % run_details.exit_code)
+        return run_details
+    finally:
+        printer.cleanup()
 
-if '__main__' == __name__:
-    try:
-        return_code = main()
-    except BaseException, e:
-        if e.__class__ in (KeyboardInterrupt, TestRunInterruptedException):
-            sys.exit(INTERRUPTED_EXIT_STATUS)
-        sys.exit(EXCEPTIONAL_EXIT_STATUS)
-
-    sys.exit(return_code)
+if __name__ == '__main__':
+    sys.exit(main(sys.argv[1:], sys.stdout, sys.stderr))
diff --git a/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py b/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py
old mode 100755
new mode 100644
index 8e35747..ee9f86f
--- a/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
 # Copyright (C) 2011 Apple Inc. All rights reserved.
@@ -30,7 +29,6 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import codecs
-import itertools
 import json
 import logging
 import os
@@ -42,7 +40,7 @@
 import thread
 import time
 import threading
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system import outputcapture, path
 from webkitpy.common.system.crashlogs_unittest import make_mock_crash_report_darwin
@@ -52,20 +50,17 @@
 
 from webkitpy.layout_tests import port
 from webkitpy.layout_tests import run_webkit_tests
-from webkitpy.layout_tests.controllers.manager import WorkerException
 from webkitpy.layout_tests.port import Port
-from webkitpy.layout_tests.port.test import TestPort, TestDriver
+from webkitpy.layout_tests.port import test
 from webkitpy.test.skip import skip_if
 from webkitpy.tool.mocktool import MockOptions
 
 
-def parse_args(extra_args=None, record_results=False, tests_included=False, new_results=False, print_nothing=True):
+def parse_args(extra_args=None, tests_included=False, new_results=False, print_nothing=True):
     extra_args = extra_args or []
     args = []
     if not '--platform' in extra_args:
         args.extend(['--platform', 'test'])
-    if not record_results:
-        args.append('--no-record-results')
     if not new_results:
         args.append('--no-new-test-results')
 
@@ -81,8 +76,8 @@
     return run_webkit_tests.parse_args(args)
 
 
-def passing_run(extra_args=None, port_obj=None, record_results=False, tests_included=False, host=None, shared_port=True):
-    options, parsed_args = parse_args(extra_args, record_results, tests_included)
+def passing_run(extra_args=None, port_obj=None, tests_included=False, host=None, shared_port=True):
+    options, parsed_args = parse_args(extra_args, tests_included)
     if not port_obj:
         host = host or MockHost()
         port_obj = host.port_factory.get(port_name=options.platform, options=options)
@@ -90,23 +85,21 @@
     if shared_port:
         port_obj.host.port_factory.get = lambda *args, **kwargs: port_obj
 
-    buildbot_output = StringIO.StringIO()
-    regular_output = StringIO.StringIO()
-    res = run_webkit_tests.run(port_obj, options, parsed_args, buildbot_output=buildbot_output, regular_output=regular_output)
-    return res == 0
+    logging_stream = StringIO.StringIO()
+    run_details = run_webkit_tests.run(port_obj, options, parsed_args, logging_stream=logging_stream)
+    return run_details.exit_code == 0
 
 
-def logging_run(extra_args=None, port_obj=None, record_results=False, tests_included=False, host=None, new_results=False, shared_port=True):
+def logging_run(extra_args=None, port_obj=None, tests_included=False, host=None, new_results=False, shared_port=True):
     options, parsed_args = parse_args(extra_args=extra_args,
-                                      record_results=record_results,
                                       tests_included=tests_included,
                                       print_nothing=False, new_results=new_results)
     host = host or MockHost()
     if not port_obj:
         port_obj = host.port_factory.get(port_name=options.platform, options=options)
 
-    res, buildbot_output, regular_output = run_and_capture(port_obj, options, parsed_args, shared_port)
-    return (res, buildbot_output, regular_output, host.user)
+    run_details, output = run_and_capture(port_obj, options, parsed_args, shared_port)
+    return (run_details, output, host.user)
 
 
 def run_and_capture(port_obj, options, parsed_args, shared_port=True):
@@ -115,70 +108,60 @@
     oc = outputcapture.OutputCapture()
     try:
         oc.capture_output()
-        buildbot_output = StringIO.StringIO()
-        regular_output = StringIO.StringIO()
-        res = run_webkit_tests.run(port_obj, options, parsed_args,
-                                   buildbot_output=buildbot_output,
-                                   regular_output=regular_output)
+        logging_stream = StringIO.StringIO()
+        run_details = run_webkit_tests.run(port_obj, options, parsed_args, logging_stream=logging_stream)
     finally:
         oc.restore_output()
-    return (res, buildbot_output, regular_output)
+    return (run_details, logging_stream)
 
 
-def get_tests_run(extra_args=None, tests_included=False, flatten_batches=False,
-                  host=None, include_reference_html=False):
-    extra_args = extra_args or []
-    if not tests_included:
-        # Not including http tests since they get run out of order (that
-        # behavior has its own test, see test_get_test_file_queue)
-        extra_args = ['passes', 'failures'] + extra_args
-    options, parsed_args = parse_args(extra_args, tests_included=True)
+def get_tests_run(args, host=None):
+    results = get_test_results(args, host)
+    return [result.test_name for result in results]
+
+
+def get_test_batches(args, host=None):
+    results = get_test_results(args, host)
+    batches = []
+    batch = []
+    current_pid = None
+    for result in results:
+        if batch and result.pid != current_pid:
+            batches.append(batch)
+            batch = []
+        batch.append(result.test_name)
+    if batch:
+        batches.append(batch)
+    return batches
+
+
+def get_test_results(args, host=None):
+    options, parsed_args = parse_args(args, tests_included=True)
 
     host = host or MockHost()
-    test_batches = []
+    port_obj = host.port_factory.get(port_name=options.platform, options=options)
 
-    class RecordingTestDriver(TestDriver):
-        def __init__(self, port, worker_number):
-            TestDriver.__init__(self, port, worker_number, pixel_tests=port.get_option('pixel_test'), no_timeout=False)
-            self._current_test_batch = None
+    oc = outputcapture.OutputCapture()
+    oc.capture_output()
+    logging_stream = StringIO.StringIO()
+    try:
+        run_details = run_webkit_tests.run(port_obj, options, parsed_args, logging_stream=logging_stream)
+    finally:
+        oc.restore_output()
 
-        def start(self):
-            pass
+    all_results = []
+    if run_details.initial_results:
+        all_results.extend(run_details.initial_results.all_results)
 
-        def stop(self):
-            self._current_test_batch = None
-
-        def run_test(self, test_input, stop_when_done):
-            if self._current_test_batch is None:
-                self._current_test_batch = []
-                test_batches.append(self._current_test_batch)
-            test_name = test_input.test_name
-            # In case of reftest, one test calls the driver's run_test() twice.
-            # We should not add a reference html used by reftests to tests unless include_reference_html parameter
-            # is explicitly given.
-            filesystem = self._port.host.filesystem
-            dirname, filename = filesystem.split(test_name)
-            if include_reference_html or not Port.is_reference_html_file(filesystem, dirname, filename):
-                self._current_test_batch.append(test_name)
-            return TestDriver.run_test(self, test_input, stop_when_done)
-
-    class RecordingTestPort(TestPort):
-        def create_driver(self, worker_number):
-            return RecordingTestDriver(self, worker_number)
-
-    recording_port = RecordingTestPort(host, options=options)
-    run_and_capture(recording_port, options, parsed_args)
-
-    if flatten_batches:
-        return list(itertools.chain(*test_batches))
-
-    return test_batches
+    if run_details.retry_results:
+        all_results.extend(run_details.retry_results.all_results)
+    return all_results
 
 
-# Update this magic number if you add an unexpected test to webkitpy.layout_tests.port.test
-# FIXME: It's nice to have a routine in port/test.py that returns this number.
-unexpected_failures = 12
-unexpected_tests_count = unexpected_failures + 4
+def parse_full_results(full_results_text):
+    json_to_eval = full_results_text.replace("ADD_RESULTS(", "").replace(");", "")
+    compressed_results = json.loads(json_to_eval)
+    return compressed_results
 
 
 class StreamTestingMixin(object):
@@ -192,91 +175,7 @@
         self.assertTrue(stream.getvalue())
 
 
-class LintTest(unittest.TestCase, StreamTestingMixin):
-    def test_all_configurations(self):
-
-        class FakePort(object):
-            def __init__(self, host, name, path):
-                self.host = host
-                self.name = name
-                self.path = path
-
-            def test_configuration(self):
-                return None
-
-            def expectations_dict(self):
-                self.host.ports_parsed.append(self.name)
-                return {self.path: ''}
-
-            def skipped_layout_tests(self, tests):
-                return set([])
-
-            def all_test_configurations(self):
-                return []
-
-            def configuration_specifier_macros(self):
-                return []
-
-            def path_from_webkit_base(self):
-                return ''
-
-            def get_option(self, name, val):
-                return val
-
-        class FakeFactory(object):
-            def __init__(self, host, ports):
-                self.host = host
-                self.ports = {}
-                for port in ports:
-                    self.ports[port.name] = port
-
-            def get(self, port_name, *args, **kwargs):
-                return self.ports[port_name]
-
-            def all_port_names(self):
-                return sorted(self.ports.keys())
-
-        host = MockHost()
-        host.ports_parsed = []
-        host.port_factory = FakeFactory(host, (FakePort(host, 'a', 'path-to-a'),
-                                               FakePort(host, 'b', 'path-to-b'),
-                                               FakePort(host, 'b-win', 'path-to-b')))
-
-        self.assertEquals(run_webkit_tests.lint(host.port_factory.ports['a'], MockOptions(platform=None)), 0)
-        self.assertEquals(host.ports_parsed, ['a', 'b', 'b-win'])
-
-        host.ports_parsed = []
-        self.assertEquals(run_webkit_tests.lint(host.port_factory.ports['a'], MockOptions(platform='a')), 0)
-        self.assertEquals(host.ports_parsed, ['a'])
-
-    def test_lint_test_files(self):
-        res, out, err, user = logging_run(['--lint-test-files'])
-        self.assertEqual(res, 0)
-        self.assertEmpty(out)
-        self.assertContains(err, 'Lint succeeded')
-
-    def test_lint_test_files__errors(self):
-        options, parsed_args = parse_args(['--lint-test-files'])
-        host = MockHost()
-        port_obj = host.port_factory.get(options.platform, options=options)
-        port_obj.expectations_dict = lambda: {'': '-- syntax error'}
-        res, out, err = run_and_capture(port_obj, options, parsed_args)
-
-        self.assertEqual(res, -1)
-        self.assertEmpty(out)
-        self.assertTrue(any(['Lint failed' in msg for msg in err.buflist]))
-
-        # ensure we lint *all* of the files in the cascade.
-        port_obj.expectations_dict = lambda: {'foo': '-- syntax error1', 'bar': '-- syntax error2'}
-        res, out, err = run_and_capture(port_obj, options, parsed_args)
-
-        self.assertEqual(res, -1)
-        self.assertEmpty(out)
-        self.assertTrue(any(['foo:1' in msg for msg in err.buflist]))
-        self.assertTrue(any(['bar:1' in msg for msg in err.buflist]))
-
-
-class MainTest(unittest.TestCase, StreamTestingMixin):
+class RunTest(unittest.TestCase, StreamTestingMixin):
     def setUp(self):
         # A real PlatformInfo object is used here instead of a
         # MockPlatformInfo because we need to actually check for
@@ -287,25 +186,41 @@
         # properly on cygwin (bug 63846).
         self.should_test_processes = not self._platform.is_win()
 
-    def test_accelerated_compositing(self):
-        # This just tests that we recognize the command line args
-        self.assertTrue(passing_run(['--accelerated-video']))
-        self.assertTrue(passing_run(['--no-accelerated-video']))
-
-    def test_accelerated_2d_canvas(self):
-        # This just tests that we recognize the command line args
-        self.assertTrue(passing_run(['--accelerated-2d-canvas']))
-        self.assertTrue(passing_run(['--no-accelerated-2d-canvas']))
-
-    def test_all(self):
-        res, out, err, user = logging_run([], tests_included=True)
-        self.assertEquals(res, unexpected_tests_count)
-
     def test_basic(self):
-        self.assertTrue(passing_run())
+        options, args = parse_args(tests_included=True)
+        logging_stream = StringIO.StringIO()
+        host = MockHost()
+        port_obj = host.port_factory.get(options.platform, options)
+        details = run_webkit_tests.run(port_obj, options, args, logging_stream)
+
+        # These numbers will need to be updated whenever we add new tests.
+        self.assertEqual(details.initial_results.total, test.TOTAL_TESTS)
+        self.assertEqual(details.initial_results.expected_skips, test.TOTAL_SKIPS)
+        self.assertEqual(len(details.initial_results.unexpected_results_by_name), test.UNEXPECTED_PASSES + test.UNEXPECTED_FAILURES)
+        self.assertEqual(details.exit_code, test.UNEXPECTED_FAILURES)
+        self.assertEqual(details.retry_results.total, test.TOTAL_RETRIES)
+
+        one_line_summary = "%d tests ran as expected, %d didn't:\n" % (
+            details.initial_results.total - details.initial_results.expected_skips - len(details.initial_results.unexpected_results_by_name),
+            len(details.initial_results.unexpected_results_by_name))
+        self.assertTrue(one_line_summary in logging_stream.buflist)
+
+        # Ensure the results were summarized properly.
+        self.assertEqual(details.summarized_results['num_regressions'], details.exit_code)
+
+        # Ensure the image diff percentage is in the results.
+        self.assertEqual(details.summarized_results['tests']['failures']['expected']['image.html']['image_diff_percent'], 1)
+
+        # Ensure the results were written out and displayed.
+        full_results_text = host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')
+        json_to_eval = full_results_text.replace("ADD_RESULTS(", "").replace(");", "")
+        self.assertEqual(json.loads(json_to_eval), details.summarized_results)
+
+        self.assertEqual(host.user.opened_urls, [path.abspath_to_uri(MockHost().platform, '/tmp/layout-test-results/results.html')])
+
 
     def test_batch_size(self):
-        batch_tests_run = get_tests_run(['--batch-size', '2'])
+        batch_tests_run = get_test_batches(['--batch-size', '2'])
         for batch in batch_tests_run:
             self.assertTrue(len(batch) <= 2, '%s had too many tests' % ', '.join(batch))
 
@@ -317,32 +232,32 @@
         if "WEBKIT_TEST_MAX_LOCKED_SHARDS" in os.environ:
             save_env_webkit_test_max_locked_shards = os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"]
             del os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"]
-        _, _, regular_output, _ = logging_run(['--debug-rwt-logging', '--child-processes', '2'], shared_port=False)
+        _, regular_output, _ = logging_run(['--debug-rwt-logging', '--child-processes', '2'], shared_port=False)
         try:
-            self.assertTrue(any(['(1 locked)' in line for line in regular_output.buflist]))
+            self.assertTrue(any(['1 locked' in line for line in regular_output.buflist]))
         finally:
             if save_env_webkit_test_max_locked_shards:
                 os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"] = save_env_webkit_test_max_locked_shards
 
     def test_child_processes_2(self):
         if self.should_test_processes:
-            _, _, regular_output, _ = logging_run(
+            _, regular_output, _ = logging_run(
                 ['--debug-rwt-logging', '--child-processes', '2'], shared_port=False)
             self.assertTrue(any(['Running 2 ' in line for line in regular_output.buflist]))
 
     def test_child_processes_min(self):
         if self.should_test_processes:
-            _, _, regular_output, _ = logging_run(
+            _, regular_output, _ = logging_run(
                 ['--debug-rwt-logging', '--child-processes', '2', '-i', 'passes/passes', 'passes'],
                 tests_included=True, shared_port=False)
             self.assertTrue(any(['Running 1 ' in line for line in regular_output.buflist]))
 
     def test_dryrun(self):
-        batch_tests_run = get_tests_run(['--dry-run'])
-        self.assertEqual(batch_tests_run, [])
+        tests_run = get_tests_run(['--dry-run'])
+        self.assertEqual(tests_run, [])
 
-        batch_tests_run = get_tests_run(['-n'])
-        self.assertEqual(batch_tests_run, [])
+        tests_run = get_tests_run(['-n'])
+        self.assertEqual(tests_run, [])
 
     def test_exception_raised(self):
         # Exceptions raised by a worker are treated differently depending on
@@ -352,56 +267,81 @@
         # is actually useful in testing.
         #
         # Exceptions raised in a separate process are re-packaged into
-        # WorkerExceptions, which have a string capture of the stack which can
+        # WorkerExceptions (a subclass of BaseException), which have a string capture of the stack which can
         # be printed, but don't display properly in the unit test exception handlers.
-        self.assertRaises(ValueError, logging_run,
+        self.assertRaises(BaseException, logging_run,
             ['failures/expected/exception.html', '--child-processes', '1'], tests_included=True)
 
         if self.should_test_processes:
-            self.assertRaises(WorkerException, logging_run,
+            self.assertRaises(BaseException, logging_run,
                 ['--child-processes', '2', '--force', 'failures/expected/exception.html', 'passes/text.html'], tests_included=True, shared_port=False)
 
     def test_full_results_html(self):
         # FIXME: verify html?
-        res, out, err, user = logging_run(['--full-results-html'])
-        self.assertEqual(res, 0)
+        details, _, _ = logging_run(['--full-results-html'])
+        self.assertEqual(details.exit_code, 0)
 
     def test_hung_thread(self):
-        res, out, err, user = logging_run(['--run-singly', '--time-out-ms=50',
-                                          'failures/expected/hang.html'],
-                                          tests_included=True)
+        details, err, _ = logging_run(['--run-singly', '--time-out-ms=50', 'failures/expected/hang.html'], tests_included=True)
         # Note that hang.html is marked as WontFix and all WontFix tests are
         # expected to Pass, so that actually running them generates an "unexpected" error.
-        self.assertEqual(res, 1)
-        self.assertNotEmpty(out)
+        self.assertEqual(details.exit_code, 1)
         self.assertNotEmpty(err)
 
     def test_keyboard_interrupt(self):
         # Note that this also tests running a test marked as SKIP if
         # you specify it explicitly.
-        self.assertRaises(KeyboardInterrupt, logging_run,
-            ['failures/expected/keyboard.html', '--child-processes', '1'],
-            tests_included=True)
+        self.assertRaises(KeyboardInterrupt, logging_run, ['failures/expected/keyboard.html', '--child-processes', '1'], tests_included=True)
 
         if self.should_test_processes:
             self.assertRaises(KeyboardInterrupt, logging_run,
                 ['failures/expected/keyboard.html', 'passes/text.html', '--child-processes', '2', '--force'], tests_included=True, shared_port=False)
 
     def test_no_tests_found(self):
-        res, out, err, user = logging_run(['resources'], tests_included=True)
-        self.assertEqual(res, -1)
-        self.assertEmpty(out)
+        details, err, _ = logging_run(['resources'], tests_included=True)
+        self.assertEqual(details.exit_code, -1)
         self.assertContains(err, 'No tests to run.\n')
 
     def test_no_tests_found_2(self):
-        res, out, err, user = logging_run(['foo'], tests_included=True)
-        self.assertEqual(res, -1)
-        self.assertEmpty(out)
+        details, err, _ = logging_run(['foo'], tests_included=True)
+        self.assertEqual(details.exit_code, -1)
         self.assertContains(err, 'No tests to run.\n')
 
-    def test_randomize_order(self):
-        # FIXME: verify order was shuffled
-        self.assertTrue(passing_run(['--randomize-order']))
+    def test_natural_order(self):
+        tests_to_run = ['passes/audio.html', 'failures/expected/text.html', 'failures/expected/missing_text.html', 'passes/args.html']
+        tests_run = get_tests_run(['--order=natural'] + tests_to_run)
+        self.assertEqual(['failures/expected/missing_text.html', 'failures/expected/text.html', 'passes/args.html', 'passes/audio.html'], tests_run)
+
+    def test_natural_order_test_specified_multiple_times(self):
+        tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.html', 'passes/args.html']
+        tests_run = get_tests_run(['--order=natural'] + tests_to_run)
+        self.assertEqual(['passes/args.html', 'passes/args.html', 'passes/audio.html', 'passes/audio.html'], tests_run)
+
+    def test_random_order(self):
+        tests_to_run = ['passes/audio.html', 'failures/expected/text.html', 'failures/expected/missing_text.html', 'passes/args.html']
+        tests_run = get_tests_run(['--order=random'] + tests_to_run)
+        self.assertEqual(sorted(tests_to_run), sorted(tests_run))
+
+    def test_random_order_test_specified_multiple_times(self):
+        tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.html', 'passes/args.html']
+        tests_run = get_tests_run(['--order=random'] + tests_to_run)
+        self.assertEqual(tests_run.count('passes/audio.html'), 2)
+        self.assertEqual(tests_run.count('passes/args.html'), 2)
+
+    def test_no_order(self):
+        tests_to_run = ['passes/audio.html', 'failures/expected/text.html', 'failures/expected/missing_text.html', 'passes/args.html']
+        tests_run = get_tests_run(['--order=none'] + tests_to_run)
+        self.assertEqual(tests_to_run, tests_run)
+
+    def test_no_order_test_specified_multiple_times(self):
+        tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.html', 'passes/args.html']
+        tests_run = get_tests_run(['--order=none'] + tests_to_run)
+        self.assertEqual(tests_to_run, tests_run)
+
+    def test_no_order_with_directory_entries_in_natural_order(self):
+        tests_to_run = ['http/tests/ssl', 'perf/foo', 'http/tests/passes']
+        tests_run = get_tests_run(['--order=none'] + tests_to_run)
+        self.assertEqual(tests_run, ['http/tests/ssl/text.html', 'perf/foo/test.html', 'http/tests/passes/image.html', 'http/tests/passes/text.html'])
 
     def test_gc_between_tests(self):
         self.assertTrue(passing_run(['--gc-between-tests']))
@@ -414,88 +354,82 @@
 
     def test_repeat_each(self):
         tests_to_run = ['passes/image.html', 'passes/text.html']
-        tests_run = get_tests_run(['--repeat-each', '2'] + tests_to_run, tests_included=True, flatten_batches=True)
-        self.assertEquals(tests_run, ['passes/image.html', 'passes/image.html', 'passes/text.html', 'passes/text.html'])
+        tests_run = get_tests_run(['--repeat-each', '2'] + tests_to_run)
+        self.assertEqual(tests_run, ['passes/image.html', 'passes/image.html', 'passes/text.html', 'passes/text.html'])
 
     def test_ignore_flag(self):
         # Note that passes/image.html is expected to be run since we specified it directly.
-        tests_run = get_tests_run(['-i', 'passes', 'passes/image.html'], flatten_batches=True, tests_included=True)
+        tests_run = get_tests_run(['-i', 'passes', 'passes/image.html'])
         self.assertFalse('passes/text.html' in tests_run)
         self.assertTrue('passes/image.html' in tests_run)
 
     def test_skipped_flag(self):
-        tests_run = get_tests_run(['passes'], tests_included=True, flatten_batches=True)
+        tests_run = get_tests_run(['passes'])
         self.assertFalse('passes/skipped/skip.html' in tests_run)
         num_tests_run_by_default = len(tests_run)
 
         # Check that nothing changes when we specify skipped=default.
-        self.assertEquals(len(get_tests_run(['--skipped=default', 'passes'], tests_included=True, flatten_batches=True)),
+        self.assertEqual(len(get_tests_run(['--skipped=default', 'passes'])),
                           num_tests_run_by_default)
 
         # Now check that we run one more test (the skipped one).
-        tests_run = get_tests_run(['--skipped=ignore', 'passes'], tests_included=True, flatten_batches=True)
+        tests_run = get_tests_run(['--skipped=ignore', 'passes'])
         self.assertTrue('passes/skipped/skip.html' in tests_run)
-        self.assertEquals(len(tests_run), num_tests_run_by_default + 1)
+        self.assertEqual(len(tests_run), num_tests_run_by_default + 1)
 
         # Now check that we only run the skipped test.
-        self.assertEquals(get_tests_run(['--skipped=only', 'passes'], tests_included=True, flatten_batches=True),
-                          ['passes/skipped/skip.html'])
+        self.assertEqual(get_tests_run(['--skipped=only', 'passes']), ['passes/skipped/skip.html'])
 
         # Now check that we don't run anything.
-        self.assertEquals(get_tests_run(['--skipped=always', 'passes/skipped/skip.html'], tests_included=True, flatten_batches=True),
-                          [])
+        self.assertEqual(get_tests_run(['--skipped=always', 'passes/skipped/skip.html']), [])
 
     def test_iterations(self):
         tests_to_run = ['passes/image.html', 'passes/text.html']
-        tests_run = get_tests_run(['--iterations', '2'] + tests_to_run, tests_included=True, flatten_batches=True)
-        self.assertEquals(tests_run, ['passes/image.html', 'passes/text.html', 'passes/image.html', 'passes/text.html'])
+        tests_run = get_tests_run(['--iterations', '2'] + tests_to_run)
+        self.assertEqual(tests_run, ['passes/image.html', 'passes/text.html', 'passes/image.html', 'passes/text.html'])
 
     def test_repeat_each_iterations_num_tests(self):
         # The total number of tests should be: number_of_tests *
         # repeat_each * iterations
         host = MockHost()
-        res, out, err, _ = logging_run(['--iterations', '2',
-                                        '--repeat-each', '4',
-                                        '--debug-rwt-logging',
-                                        'passes/text.html', 'failures/expected/text.html'],
-                                       tests_included=True, host=host, record_results=True)
-        self.assertContains(out, "=> Results: 8/16 tests passed (50.0%)\n")
+        _, err, _ = logging_run(
+            ['--iterations', '2', '--repeat-each', '4', '--debug-rwt-logging', 'passes/text.html', 'failures/expected/text.html'],
+            tests_included=True, host=host)
         self.assertContains(err, "All 16 tests ran as expected.\n")
 
     def test_run_chunk(self):
         # Test that we actually select the right chunk
-        all_tests_run = get_tests_run(flatten_batches=True)
-        chunk_tests_run = get_tests_run(['--run-chunk', '1:4'], flatten_batches=True)
-        self.assertEquals(all_tests_run[4:8], chunk_tests_run)
+        all_tests_run = get_tests_run(['passes', 'failures'])
+        chunk_tests_run = get_tests_run(['--run-chunk', '1:4', 'passes', 'failures'])
+        self.assertEqual(all_tests_run[4:8], chunk_tests_run)
 
         # Test that we wrap around if the number of tests is not evenly divisible by the chunk size
         tests_to_run = ['passes/error.html', 'passes/image.html', 'passes/platform_image.html', 'passes/text.html']
-        chunk_tests_run = get_tests_run(['--run-chunk', '1:3'] + tests_to_run, tests_included=True, flatten_batches=True)
-        self.assertEquals(['passes/text.html', 'passes/error.html', 'passes/image.html'], chunk_tests_run)
+        chunk_tests_run = get_tests_run(['--run-chunk', '1:3'] + tests_to_run)
+        self.assertEqual(['passes/text.html', 'passes/error.html', 'passes/image.html'], chunk_tests_run)
 
     def test_run_force(self):
         # This raises an exception because we run
         # failures/expected/exception.html, which is normally SKIPped.
 
-        # See also the comments in test_exception_raised() about ValueError vs. WorkerException.
         self.assertRaises(ValueError, logging_run, ['--force'])
 
     def test_run_part(self):
         # Test that we actually select the right part
         tests_to_run = ['passes/error.html', 'passes/image.html', 'passes/platform_image.html', 'passes/text.html']
-        tests_run = get_tests_run(['--run-part', '1:2'] + tests_to_run, tests_included=True, flatten_batches=True)
-        self.assertEquals(['passes/error.html', 'passes/image.html'], tests_run)
+        tests_run = get_tests_run(['--run-part', '1:2'] + tests_to_run)
+        self.assertEqual(['passes/error.html', 'passes/image.html'], tests_run)
 
         # Test that we wrap around if the number of tests is not evenly divisible by the chunk size
         # (here we end up with 3 parts, each with 2 tests, and we only have 4 tests total, so the
         # last part repeats the first two tests).
-        chunk_tests_run = get_tests_run(['--run-part', '3:3'] + tests_to_run, tests_included=True, flatten_batches=True)
-        self.assertEquals(['passes/error.html', 'passes/image.html'], chunk_tests_run)
+        chunk_tests_run = get_tests_run(['--run-part', '3:3'] + tests_to_run)
+        self.assertEqual(['passes/error.html', 'passes/image.html'], chunk_tests_run)
 
     def test_run_singly(self):
-        batch_tests_run = get_tests_run(['--run-singly'])
+        batch_tests_run = get_test_batches(['--run-singly'])
         for batch in batch_tests_run:
-            self.assertEquals(len(batch), 1, '%s had too many tests' % ', '.join(batch))
+            self.assertEqual(len(batch), 1, '%s had too many tests' % ', '.join(batch))
 
     def test_skip_failing_tests(self):
         # This tests that we skip both known failing and known flaky tests. Because there are
@@ -503,7 +437,7 @@
         host = MockHost()
         host.filesystem.write_text_file('/tmp/overrides.txt', 'Bug(x) passes/image.html [ ImageOnlyFailure Pass ]\n')
 
-        batches = get_tests_run(['--skip-failing-tests', '--additional-expectations', '/tmp/overrides.txt'], host=host)
+        batches = get_test_batches(['--skip-failing-tests', '--additional-expectations', '/tmp/overrides.txt'], host=host)
         has_passes_text = False
         for batch in batches:
             self.assertFalse('failures/expected/text.html' in batch)
@@ -512,72 +446,56 @@
         self.assertTrue(has_passes_text)
 
     def test_run_singly_actually_runs_tests(self):
-        res, _, _, _ = logging_run(['--run-singly', 'failures/unexpected'])
-        self.assertEquals(res, unexpected_failures)
+        details, _, _ = logging_run(['--run-singly'], tests_included=True)
+        self.assertEqual(details.exit_code, test.UNEXPECTED_FAILURES - 1)  # failures/expected/hang.html actually passes w/ --run-singly.
 
     def test_single_file(self):
-        # FIXME: We should consider replacing more of the get_tests_run()-style tests
-        # with tests that read the tests_run* files, like this one.
-        host = MockHost()
-        tests_run = passing_run(['passes/text.html'], tests_included=True, host=host)
-        self.assertEquals(host.filesystem.read_text_file('/tmp/layout-test-results/tests_run0.txt'),
-                          'passes/text.html\n')
+        tests_run = get_tests_run(['passes/text.html'])
+        self.assertEqual(tests_run, ['passes/text.html'])
 
     def test_single_file_with_prefix(self):
-        tests_run = get_tests_run(['LayoutTests/passes/text.html'], tests_included=True, flatten_batches=True)
-        self.assertEquals(['passes/text.html'], tests_run)
+        tests_run = get_tests_run(['LayoutTests/passes/text.html'])
+        self.assertEqual(['passes/text.html'], tests_run)
 
     def test_single_skipped_file(self):
-        tests_run = get_tests_run(['failures/expected/keybaord.html'], tests_included=True, flatten_batches=True)
-        self.assertEquals([], tests_run)
+        tests_run = get_tests_run(['failures/expected/keybaord.html'])
+        self.assertEqual([], tests_run)
 
     def test_stderr_is_saved(self):
         host = MockHost()
         self.assertTrue(passing_run(host=host))
-        self.assertEquals(host.filesystem.read_text_file('/tmp/layout-test-results/passes/error-stderr.txt'),
+        self.assertEqual(host.filesystem.read_text_file('/tmp/layout-test-results/passes/error-stderr.txt'),
                           'stuff going to stderr')
 
     def test_test_list(self):
         host = MockHost()
         filename = '/tmp/foo.txt'
         host.filesystem.write_text_file(filename, 'passes/text.html')
-        tests_run = get_tests_run(['--test-list=%s' % filename], tests_included=True, flatten_batches=True, host=host)
-        self.assertEquals(['passes/text.html'], tests_run)
+        tests_run = get_tests_run(['--test-list=%s' % filename], host=host)
+        self.assertEqual(['passes/text.html'], tests_run)
         host.filesystem.remove(filename)
-        res, out, err, user = logging_run(['--test-list=%s' % filename],
-                                          tests_included=True, host=host)
-        self.assertEqual(res, -1)
+        details, err, user = logging_run(['--test-list=%s' % filename], tests_included=True, host=host)
+        self.assertEqual(details.exit_code, -1)
         self.assertNotEmpty(err)
 
     def test_test_list_with_prefix(self):
         host = MockHost()
         filename = '/tmp/foo.txt'
         host.filesystem.write_text_file(filename, 'LayoutTests/passes/text.html')
-        tests_run = get_tests_run(['--test-list=%s' % filename], tests_included=True, flatten_batches=True, host=host)
-        self.assertEquals(['passes/text.html'], tests_run)
-
-    def test_unexpected_failures(self):
-        # Run tests including the unexpected failures.
-        self._url_opened = None
-        res, out, err, user = logging_run(tests_included=True)
-
-        self.assertEqual(res, unexpected_tests_count)
-        self.assertNotEmpty(out)
-        self.assertNotEmpty(err)
-        self.assertEqual(user.opened_urls, [path.abspath_to_uri(MockHost().platform, '/tmp/layout-test-results/results.html')])
+        tests_run = get_tests_run(['--test-list=%s' % filename], host=host)
+        self.assertEqual(['passes/text.html'], tests_run)
 
     def test_missing_and_unexpected_results(self):
         # Test that we update expectations in place. If the expectation
         # is missing, update the expected generic location.
         host = MockHost()
-        res, out, err, _ = logging_run(['--no-show-results',
+        details, err, _ = logging_run(['--no-show-results',
             'failures/expected/missing_image.html',
             'failures/unexpected/missing_text.html',
             'failures/unexpected/text-image-checksum.html'],
-            tests_included=True, host=host, record_results=True)
+            tests_included=True, host=host)
         file_list = host.filesystem.written_files.keys()
-        file_list.remove('/tmp/layout-test-results/tests_run0.txt')
-        self.assertEquals(res, 1)
+        self.assertEqual(details.exit_code, 1)
         expected_token = '"unexpected":{"text-image-checksum.html":{"expected":"PASS","actual":"IMAGE+TEXT","image_diff_percent":1},"missing_text.html":{"expected":"PASS","is_missing_text":true,"actual":"MISSING"}'
         json_string = host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')
         self.assertTrue(json_string.find(expected_token) != -1)
@@ -592,9 +510,9 @@
         args = ['--pixel-tests', '--pixel-test-directory', 'failures/unexpected/pixeldir',
                 'failures/unexpected/pixeldir/image_in_pixeldir.html',
                 'failures/unexpected/image_not_in_pixeldir.html']
-        res, out, err, _ = logging_run(extra_args=args, host=host, record_results=True, tests_included=True)
+        details, err, _ = logging_run(extra_args=args, host=host, tests_included=True)
 
-        self.assertEquals(res, 1)
+        self.assertEqual(details.exit_code, 1)
         expected_token = '"unexpected":{"pixeldir":{"image_in_pixeldir.html":{"expected":"PASS","actual":"IMAGE"'
         json_string = host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')
         self.assertTrue(json_string.find(expected_token) != -1)
@@ -602,38 +520,28 @@
     def test_missing_and_unexpected_results_with_custom_exit_code(self):
         # Test that we update expectations in place. If the expectation
         # is missing, update the expected generic location.
-        class CustomExitCodePort(TestPort):
+        class CustomExitCodePort(test.TestPort):
             def exit_code_from_summarized_results(self, unexpected_results):
                 return unexpected_results['num_regressions'] + unexpected_results['num_missing']
 
         host = MockHost()
         options, parsed_args = run_webkit_tests.parse_args(['--pixel-tests', '--no-new-test-results'])
         test_port = CustomExitCodePort(host, options=options)
-        res, out, err, _ = logging_run(['--no-show-results',
+        details, err, _ = logging_run(['--no-show-results',
             'failures/expected/missing_image.html',
             'failures/unexpected/missing_text.html',
             'failures/unexpected/text-image-checksum.html'],
-            tests_included=True, host=host, record_results=True, port_obj=test_port)
-        self.assertEquals(res, 2)
+            tests_included=True, host=host, port_obj=test_port)
+        self.assertEqual(details.exit_code, 2)
 
     def test_crash_with_stderr(self):
         host = MockHost()
-        res, buildbot_output, regular_output, user = logging_run([
-                'failures/unexpected/crash-with-stderr.html',
-            ],
-            tests_included=True,
-            record_results=True,
-            host=host)
+        _, regular_output, _ = logging_run(['failures/unexpected/crash-with-stderr.html'], tests_included=True, host=host)
         self.assertTrue(host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json').find('{"crash-with-stderr.html":{"expected":"PASS","actual":"CRASH","has_stderr":true}}') != -1)
 
     def test_no_image_failure_with_image_diff(self):
         host = MockHost()
-        res, buildbot_output, regular_output, user = logging_run([
-                'failures/unexpected/checksum-with-matching-image.html',
-            ],
-            tests_included=True,
-            record_results=True,
-            host=host)
+        _, regular_output, _ = logging_run(['failures/unexpected/checksum-with-matching-image.html'], tests_included=True, host=host)
         self.assertTrue(host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json').find('"num_regressions":0') != -1)
 
     def test_crash_log(self):
@@ -644,14 +552,9 @@
         mock_crash_report = make_mock_crash_report_darwin('DumpRenderTree', 12345)
         host = MockHost()
         host.filesystem.write_text_file('/Users/mock/Library/Logs/DiagnosticReports/DumpRenderTree_2011-06-13-150719_quadzen.crash', mock_crash_report)
-        res, buildbot_output, regular_output, user = logging_run([
-                'failures/unexpected/crash-with-stderr.html',
-            ],
-            tests_included=True,
-            record_results=True,
-            host=host)
+        _, regular_output, _ = logging_run(['failures/unexpected/crash-with-stderr.html'], tests_included=True, host=host)
         expected_crash_log = mock_crash_report
-        self.assertEquals(host.filesystem.read_text_file('/tmp/layout-test-results/failures/unexpected/crash-with-stderr-crash-log.txt'), expected_crash_log)
+        self.assertEqual(host.filesystem.read_text_file('/tmp/layout-test-results/failures/unexpected/crash-with-stderr-crash-log.txt'), expected_crash_log)
 
     def test_web_process_crash_log(self):
         # FIXME: Need to rewrite these tests to not be mac-specific, or move them elsewhere.
@@ -661,30 +564,20 @@
         mock_crash_report = make_mock_crash_report_darwin('WebProcess', 12345)
         host = MockHost()
         host.filesystem.write_text_file('/Users/mock/Library/Logs/DiagnosticReports/WebProcess_2011-06-13-150719_quadzen.crash', mock_crash_report)
-        res, buildbot_output, regular_output, user = logging_run([
-                'failures/unexpected/web-process-crash-with-stderr.html',
-            ],
-            tests_included=True,
-            record_results=True,
-            host=host)
-        self.assertEquals(host.filesystem.read_text_file('/tmp/layout-test-results/failures/unexpected/web-process-crash-with-stderr-crash-log.txt'), mock_crash_report)
+        logging_run(['failures/unexpected/web-process-crash-with-stderr.html'], tests_included=True, host=host)
+        self.assertEqual(host.filesystem.read_text_file('/tmp/layout-test-results/failures/unexpected/web-process-crash-with-stderr-crash-log.txt'), mock_crash_report)
 
     def test_exit_after_n_failures_upload(self):
         host = MockHost()
-        res, buildbot_output, regular_output, user = logging_run([
-                'failures/unexpected/text-image-checksum.html',
-                'passes/text.html',
-                '--exit-after-n-failures', '1',
-            ],
-            tests_included=True,
-            record_results=True,
-            host=host)
+        details, regular_output, user = logging_run(
+           ['failures/unexpected/text-image-checksum.html', 'passes/text.html', '--exit-after-n-failures', '1'],
+           tests_included=True, host=host)
 
         # By returning False, we know that the incremental results were generated and then deleted.
         self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/incremental_results.json'))
 
         # This checks that we report only the number of tests that actually failed.
-        self.assertEquals(res, 1)
+        self.assertEqual(details.exit_code, 1)
 
         # This checks that passes/text.html is considered SKIPped.
         self.assertTrue('"skipped":1' in host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json'))
@@ -698,55 +591,25 @@
 
     def test_exit_after_n_failures(self):
         # Unexpected failures should result in tests stopping.
-        tests_run = get_tests_run([
-                'failures/unexpected/text-image-checksum.html',
-                'passes/text.html',
-                '--exit-after-n-failures', '1',
-            ],
-            tests_included=True,
-            flatten_batches=True)
-        self.assertEquals(['failures/unexpected/text-image-checksum.html'], tests_run)
+        tests_run = get_tests_run(['failures/unexpected/text-image-checksum.html', 'passes/text.html', '--exit-after-n-failures', '1'])
+        self.assertEqual(['failures/unexpected/text-image-checksum.html'], tests_run)
 
         # But we'll keep going for expected ones.
-        tests_run = get_tests_run([
-                'failures/expected/text.html',
-                'passes/text.html',
-                '--exit-after-n-failures', '1',
-            ],
-            tests_included=True,
-            flatten_batches=True)
-        self.assertEquals(['failures/expected/text.html', 'passes/text.html'], tests_run)
+        tests_run = get_tests_run(['failures/expected/text.html', 'passes/text.html', '--exit-after-n-failures', '1'])
+        self.assertEqual(['failures/expected/text.html', 'passes/text.html'], tests_run)
 
     def test_exit_after_n_crashes(self):
         # Unexpected crashes should result in tests stopping.
-        tests_run = get_tests_run([
-                'failures/unexpected/crash.html',
-                'passes/text.html',
-                '--exit-after-n-crashes-or-timeouts', '1',
-            ],
-            tests_included=True,
-            flatten_batches=True)
-        self.assertEquals(['failures/unexpected/crash.html'], tests_run)
+        tests_run = get_tests_run(['failures/unexpected/crash.html', 'passes/text.html', '--exit-after-n-crashes-or-timeouts', '1'])
+        self.assertEqual(['failures/unexpected/crash.html'], tests_run)
 
         # Same with timeouts.
-        tests_run = get_tests_run([
-                'failures/unexpected/timeout.html',
-                'passes/text.html',
-                '--exit-after-n-crashes-or-timeouts', '1',
-            ],
-            tests_included=True,
-            flatten_batches=True)
-        self.assertEquals(['failures/unexpected/timeout.html'], tests_run)
+        tests_run = get_tests_run(['failures/unexpected/timeout.html', 'passes/text.html', '--exit-after-n-crashes-or-timeouts', '1'])
+        self.assertEqual(['failures/unexpected/timeout.html'], tests_run)
 
         # But we'll keep going for expected ones.
-        tests_run = get_tests_run([
-                'failures/expected/crash.html',
-                'passes/text.html',
-                '--exit-after-n-crashes-or-timeouts', '1',
-            ],
-            tests_included=True,
-            flatten_batches=True)
-        self.assertEquals(['failures/expected/crash.html', 'passes/text.html'], tests_run)
+        tests_run = get_tests_run(['failures/expected/crash.html', 'passes/text.html', '--exit-after-n-crashes-or-timeouts', '1'])
+        self.assertEqual(['failures/expected/crash.html', 'passes/text.html'], tests_run)
 
     def test_results_directory_absolute(self):
         # We run a configuration that should fail, to generate output, then
@@ -754,8 +617,7 @@
 
         host = MockHost()
         with host.filesystem.mkdtemp() as tmpdir:
-            res, out, err, user = logging_run(['--results-directory=' + str(tmpdir)],
-                                              tests_included=True, host=host)
+            _, _, user = logging_run(['--results-directory=' + str(tmpdir)], tests_included=True, host=host)
             self.assertEqual(user.opened_urls, [path.abspath_to_uri(host.platform, host.filesystem.join(tmpdir, 'results.html'))])
 
     def test_results_directory_default(self):
@@ -763,7 +625,7 @@
         # look for what the output results url was.
 
         # This is the default location.
-        res, out, err, user = logging_run(tests_included=True)
+        _, _, user = logging_run(tests_included=True)
         self.assertEqual(user.opened_urls, [path.abspath_to_uri(MockHost().platform, '/tmp/layout-test-results/results.html')])
 
     def test_results_directory_relative(self):
@@ -772,44 +634,62 @@
         host = MockHost()
         host.filesystem.maybe_make_directory('/tmp/cwd')
         host.filesystem.chdir('/tmp/cwd')
-        res, out, err, user = logging_run(['--results-directory=foo'],
-                                          tests_included=True, host=host)
+        _, _, user = logging_run(['--results-directory=foo'], tests_included=True, host=host)
         self.assertEqual(user.opened_urls, [path.abspath_to_uri(host.platform, '/tmp/cwd/foo/results.html')])
 
     def test_retrying_and_flaky_tests(self):
         host = MockHost()
-        res, out, err, _ = logging_run(['--debug-rwt-logging', 'failures/flaky'], tests_included=True, host=host)
-        self.assertEquals(res, 0)
+        details, err, _ = logging_run(['--debug-rwt-logging', 'failures/flaky'], tests_included=True, host=host)
+        self.assertEqual(details.exit_code, 0)
         self.assertTrue('Retrying' in err.getvalue())
-        self.assertTrue('Unexpected flakiness' in out.getvalue())
         self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failures/flaky/text-actual.txt'))
-        self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/retries/tests_run0.txt'))
         self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/retries/failures/flaky/text-actual.txt'))
 
         # Now we test that --clobber-old-results does remove the old entries and the old retries,
         # and that we don't retry again.
         host = MockHost()
-        res, out, err, _ = logging_run(['--no-retry-failures', '--clobber-old-results', 'failures/flaky'], tests_included=True, host=host)
-        self.assertEquals(res, 1)
+        details, err, _ = logging_run(['--no-retry-failures', '--clobber-old-results', 'failures/flaky'], tests_included=True, host=host)
+        self.assertEqual(details.exit_code, 1)
         self.assertTrue('Clobbering old results' in err.getvalue())
         self.assertTrue('flaky/text.html' in err.getvalue())
-        self.assertTrue('Unexpected text-only failures' in out.getvalue())
-        self.assertFalse('Unexpected flakiness' in out.getvalue())
         self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failures/flaky/text-actual.txt'))
         self.assertFalse(host.filesystem.exists('retries'))
 
+    def test_retrying_force_pixel_tests(self):
+        host = MockHost()
+        details, err, _ = logging_run(['--no-pixel-tests', 'failures/unexpected/text-image-checksum.html'], tests_included=True, host=host)
+        self.assertEqual(details.exit_code, 1)
+        self.assertTrue('Retrying' in err.getvalue())
+        self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failures/unexpected/text-image-checksum-actual.txt'))
+        self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/failures/unexpected/text-image-checksum-actual.png'))
+        self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/retries/failures/unexpected/text-image-checksum-actual.txt'))
+        self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/retries/failures/unexpected/text-image-checksum-actual.png'))
+        json_string = host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')
+        json = parse_full_results(json_string)
+        self.assertEqual(json["tests"]["failures"]["unexpected"]["text-image-checksum.html"],
+            {"expected": "PASS", "actual": "TEXT IMAGE+TEXT", "image_diff_percent": 1})
+        self.assertFalse(json["pixel_tests_enabled"])
+        self.assertEqual(details.enabled_pixel_tests_in_retry, True)
+
+    def test_retrying_uses_retries_directory(self):
+        host = MockHost()
+        details, err, _ = logging_run(['--debug-rwt-logging', 'failures/unexpected/text-image-checksum.html'], tests_included=True, host=host)
+        self.assertEqual(details.exit_code, 1)
+        self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failures/unexpected/text-image-checksum-actual.txt'))
+        self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/retries/failures/unexpected/text-image-checksum-actual.txt'))
+
     def test_run_order__inline(self):
         # These next tests test that we run the tests in ascending alphabetical
         # order per directory. HTTP tests are sharded separately from other tests,
         # so we have to test both.
-        tests_run = get_tests_run(['-i', 'passes/passes', 'passes'], tests_included=True, flatten_batches=True)
-        self.assertEquals(tests_run, sorted(tests_run))
+        tests_run = get_tests_run(['-i', 'passes/passes', 'passes'])
+        self.assertEqual(tests_run, sorted(tests_run))
 
-        tests_run = get_tests_run(['http/tests/passes'], tests_included=True, flatten_batches=True)
-        self.assertEquals(tests_run, sorted(tests_run))
+        tests_run = get_tests_run(['http/tests/passes'])
+        self.assertEqual(tests_run, sorted(tests_run))
 
     def test_tolerance(self):
-        class ImageDiffTestPort(TestPort):
+        class ImageDiffTestPort(test.TestPort):
             def diff_image(self, expected_contents, actual_contents, tolerance=None):
                 self.tolerance_used_for_diff_image = self._options.tolerance
                 return (True, 1, None)
@@ -840,34 +720,34 @@
                                      'virtual/passes/text.html', 'virtual/passes/args.html']))
 
     def test_reftest_run(self):
-        tests_run = get_tests_run(['passes/reftest.html'], tests_included=True, flatten_batches=True)
-        self.assertEquals(['passes/reftest.html'], tests_run)
+        tests_run = get_tests_run(['passes/reftest.html'])
+        self.assertEqual(['passes/reftest.html'], tests_run)
 
     def test_reftest_run_reftests_if_pixel_tests_are_disabled(self):
-        tests_run = get_tests_run(['--no-pixel-tests', 'passes/reftest.html'], tests_included=True, flatten_batches=True)
-        self.assertEquals(['passes/reftest.html'], tests_run)
+        tests_run = get_tests_run(['--no-pixel-tests', 'passes/reftest.html'])
+        self.assertEqual(['passes/reftest.html'], tests_run)
 
     def test_reftest_skip_reftests_if_no_ref_tests(self):
-        tests_run = get_tests_run(['--no-ref-tests', 'passes/reftest.html'], tests_included=True, flatten_batches=True)
-        self.assertEquals([], tests_run)
-        tests_run = get_tests_run(['--no-ref-tests', '--no-pixel-tests', 'passes/reftest.html'], tests_included=True, flatten_batches=True)
-        self.assertEquals([], tests_run)
+        tests_run = get_tests_run(['--no-ref-tests', 'passes/reftest.html'])
+        self.assertEqual([], tests_run)
+        tests_run = get_tests_run(['--no-ref-tests', '--no-pixel-tests', 'passes/reftest.html'])
+        self.assertEqual([], tests_run)
 
     def test_reftest_expected_html_should_be_ignored(self):
-        tests_run = get_tests_run(['passes/reftest-expected.html'], tests_included=True, flatten_batches=True)
-        self.assertEquals([], tests_run)
+        tests_run = get_tests_run(['passes/reftest-expected.html'])
+        self.assertEqual([], tests_run)
 
     def test_reftest_driver_should_run_expected_html(self):
-        tests_run = get_tests_run(['passes/reftest.html'], tests_included=True, flatten_batches=True, include_reference_html=True)
-        self.assertEquals(['passes/reftest.html', 'passes/reftest-expected.html'], tests_run)
+        tests_run = get_test_results(['passes/reftest.html'])
+        self.assertEqual(tests_run[0].references, ['passes/reftest-expected.html'])
 
     def test_reftest_driver_should_run_expected_mismatch_html(self):
-        tests_run = get_tests_run(['passes/mismatch.html'], tests_included=True, flatten_batches=True, include_reference_html=True)
-        self.assertEquals(['passes/mismatch.html', 'passes/mismatch-expected-mismatch.html'], tests_run)
+        tests_run = get_test_results(['passes/mismatch.html'])
+        self.assertEqual(tests_run[0].references, ['passes/mismatch-expected-mismatch.html'])
 
     def test_reftest_should_not_use_naming_convention_if_not_listed_in_reftestlist(self):
         host = MockHost()
-        res, out, err, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_included=True, host=host, record_results=True)
+        _, err, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_included=True, host=host)
         json_string = host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')
         self.assertTrue(json_string.find('"unlistedtest.html":{"expected":"PASS","is_missing_text":true,"actual":"MISSING","is_missing_image":true}') != -1)
         self.assertTrue(json_string.find('"num_regressions":4') != -1)
@@ -884,7 +764,7 @@
         host = MockHost()
         host.filesystem.write_text_file('/tmp/overrides.txt', 'Bug(x) failures/unexpected/mismatch.html [ ImageOnlyFailure ]\n')
         self.assertTrue(passing_run(['--additional-expectations', '/tmp/overrides.txt', 'failures/unexpected/mismatch.html'],
-                                     tests_included=True, host=host))
+                                    tests_included=True, host=host))
 
     def test_no_http_and_force(self):
         # See test_run_force, using --force raises an exception.
@@ -896,20 +776,20 @@
         return [test for test in tests if type in test]
 
     def test_no_http_tests(self):
-        batch_tests_dryrun = get_tests_run(['LayoutTests/http', 'websocket/'], flatten_batches=True)
-        self.assertTrue(MainTest.has_test_of_type(batch_tests_dryrun, 'http'))
-        self.assertTrue(MainTest.has_test_of_type(batch_tests_dryrun, 'websocket'))
+        batch_tests_dryrun = get_tests_run(['LayoutTests/http', 'websocket/'])
+        self.assertTrue(RunTest.has_test_of_type(batch_tests_dryrun, 'http'))
+        self.assertTrue(RunTest.has_test_of_type(batch_tests_dryrun, 'websocket'))
 
-        batch_tests_run_no_http = get_tests_run(['--no-http', 'LayoutTests/http', 'websocket/'], flatten_batches=True)
-        self.assertFalse(MainTest.has_test_of_type(batch_tests_run_no_http, 'http'))
-        self.assertFalse(MainTest.has_test_of_type(batch_tests_run_no_http, 'websocket'))
+        batch_tests_run_no_http = get_tests_run(['--no-http', 'LayoutTests/http', 'websocket/'])
+        self.assertFalse(RunTest.has_test_of_type(batch_tests_run_no_http, 'http'))
+        self.assertFalse(RunTest.has_test_of_type(batch_tests_run_no_http, 'websocket'))
 
-        batch_tests_run_http = get_tests_run(['--http', 'LayoutTests/http', 'websocket/'], flatten_batches=True)
-        self.assertTrue(MainTest.has_test_of_type(batch_tests_run_http, 'http'))
-        self.assertTrue(MainTest.has_test_of_type(batch_tests_run_http, 'websocket'))
+        batch_tests_run_http = get_tests_run(['--http', 'LayoutTests/http', 'websocket/'])
+        self.assertTrue(RunTest.has_test_of_type(batch_tests_run_http, 'http'))
+        self.assertTrue(RunTest.has_test_of_type(batch_tests_run_http, 'websocket'))
 
     def test_platform_tests_are_found(self):
-        tests_run = get_tests_run(['--platform', 'test-mac-leopard', 'http'], tests_included=True, flatten_batches=True)
+        tests_run = get_tests_run(['--platform', 'test-mac-leopard', 'http'])
         self.assertTrue('platform/test-mac-leopard/http/test.html' in tests_run)
         self.assertFalse('platform/test-win-win7/http/test.html' in tests_run)
 
@@ -917,8 +797,7 @@
         # Test to ensure that we don't generate -wdiff.html or -pretty.html if wdiff and PrettyPatch
         # aren't available.
         host = MockHost()
-        res, out, err, _ = logging_run(['--pixel-tests', 'failures/unexpected/text-image-checksum.html'],
-                                       tests_included=True, record_results=True, host=host)
+        _, err, _ = logging_run(['--pixel-tests', 'failures/unexpected/text-image-checksum.html'], tests_included=True, host=host)
         written_files = host.filesystem.written_files
         self.assertTrue(any(path.endswith('-diff.txt') for path in written_files.keys()))
         self.assertFalse(any(path.endswith('-wdiff.html') for path in written_files.keys()))
@@ -926,23 +805,27 @@
 
         full_results_text = host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')
         full_results = json.loads(full_results_text.replace("ADD_RESULTS(", "").replace(");", ""))
-        self.assertEquals(full_results['has_wdiff'], False)
-        self.assertEquals(full_results['has_pretty_patch'], False)
+        self.assertEqual(full_results['has_wdiff'], False)
+        self.assertEqual(full_results['has_pretty_patch'], False)
 
     def test_unsupported_platform(self):
-        oc = outputcapture.OutputCapture()
-        try:
-            oc.capture_output()
-            res = run_webkit_tests.main(['--platform', 'foo'])
-        finally:
-            stdout, stderr, logs = oc.restore_output()
+        stdout = StringIO.StringIO()
+        stderr = StringIO.StringIO()
+        res = run_webkit_tests.main(['--platform', 'foo'], stdout, stderr)
 
-        self.assertEquals(res, run_webkit_tests.EXCEPTIONAL_EXIT_STATUS)
-        self.assertEquals(stdout, '')
-        self.assertTrue('unsupported platform' in stderr)
+        self.assertEqual(res, run_webkit_tests.EXCEPTIONAL_EXIT_STATUS)
+        self.assertEqual(stdout.getvalue(), '')
+        self.assertTrue('unsupported platform' in stderr.getvalue())
 
-        # This is empty because we don't even get a chance to configure the logger before failing.
-        self.assertEquals(logs, '')
+    def test_build_check(self):
+        # By using a port_name for a different platform than the one we're running on, the build check should always fail.
+        if sys.platform == 'darwin':
+            port_name = 'chromium-linux-x86'
+        else:
+            port_name = 'chromium-mac-lion'
+        out = StringIO.StringIO()
+        err = StringIO.StringIO()
+        self.assertEqual(run_webkit_tests.main(['--platform', port_name, 'fast/harness/results.html'], out, err), -1)
 
     def test_verbose_in_child_processes(self):
         # When we actually run multiple processes, we may have to reconfigure logging in the
@@ -957,41 +840,22 @@
         options, parsed_args = parse_args(['--verbose', '--fully-parallel', '--child-processes', '2', 'passes/text.html', 'passes/image.html'], tests_included=True, print_nothing=False)
         host = MockHost()
         port_obj = host.port_factory.get(port_name=options.platform, options=options)
-        buildbot_output = StringIO.StringIO()
-        regular_output = StringIO.StringIO()
-        res = run_webkit_tests.run(port_obj, options, parsed_args, buildbot_output=buildbot_output, regular_output=regular_output)
-        self.assertTrue('text.html passed' in regular_output.getvalue())
-        self.assertTrue('image.html passed' in regular_output.getvalue())
+        logging_stream = StringIO.StringIO()
+        run_webkit_tests.run(port_obj, options, parsed_args, logging_stream=logging_stream)
+        self.assertTrue('text.html passed' in logging_stream.getvalue())
+        self.assertTrue('image.html passed' in logging_stream.getvalue())
 
 
 class EndToEndTest(unittest.TestCase):
-    def parse_full_results(self, full_results_text):
-        json_to_eval = full_results_text.replace("ADD_RESULTS(", "").replace(");", "")
-        compressed_results = json.loads(json_to_eval)
-        return compressed_results
-
-    def test_end_to_end(self):
-        host = MockHost()
-        res, out, err, user = logging_run(record_results=True, tests_included=True, host=host)
-
-        self.assertEquals(res, unexpected_tests_count)
-        results = self.parse_full_results(host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json'))
-
-        # Check to ensure we're passing back image diff %age correctly.
-        self.assertEquals(results['tests']['failures']['expected']['image.html']['image_diff_percent'], 1)
-
-        # Check that we attempted to display the results page in a browser.
-        self.assertTrue(user.opened_urls)
-
     def test_reftest_with_two_notrefs(self):
         # Test that we update expectations in place. If the expectation
         # is missing, update the expected generic location.
         host = MockHost()
-        res, out, err, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_included=True, host=host, record_results=True)
+        _, _, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_included=True, host=host)
         file_list = host.filesystem.written_files.keys()
-        file_list.remove('/tmp/layout-test-results/tests_run0.txt')
+
         json_string = host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')
-        json = self.parse_full_results(json_string)
+        json = parse_full_results(json_string)
         self.assertTrue("multiple-match-success.html" not in json["tests"]["reftests"]["foo"])
         self.assertTrue("multiple-mismatch-success.html" not in json["tests"]["reftests"]["foo"])
         self.assertTrue("multiple-both-success.html" not in json["tests"]["reftests"]["foo"])
@@ -1019,16 +883,12 @@
         # Test that we update expectations in place. If the expectation
         # is missing, update the expected generic location.
         host = MockHost()
-        res, out, err, _ = logging_run(['--pixel-tests',
-                        '--reset-results',
-                        'passes/image.html',
-                        'failures/expected/missing_image.html'],
-                        tests_included=True, host=host, new_results=True)
+        details, err, _ = logging_run(
+            ['--pixel-tests', '--reset-results', 'passes/image.html', 'failures/expected/missing_image.html'],
+            tests_included=True, host=host, new_results=True)
         file_list = host.filesystem.written_files.keys()
-        file_list.remove('/tmp/layout-test-results/tests_run0.txt')
-        self.assertEquals(res, 0)
-        self.assertEmpty(out)
-        self.assertEqual(len(file_list), 4)
+        self.assertEqual(details.exit_code, 0)
+        self.assertEqual(len(file_list), 8)
         self.assertBaselines(file_list, "passes/image", [".txt", ".png"], err)
         self.assertBaselines(file_list, "failures/expected/missing_image", [".txt", ".png"], err)
 
@@ -1036,17 +896,15 @@
         # Test that we update expectations in place. If the expectation
         # is missing, update the expected generic location.
         host = MockHost()
-        res, out, err, _ = logging_run(['--no-show-results',
-                     'failures/unexpected/missing_text.html',
-                     'failures/unexpected/missing_image.html',
-                     'failures/unexpected/missing_audio.html',
-                     'failures/unexpected/missing_render_tree_dump.html'],
-                     tests_included=True, host=host, new_results=True)
+        details, err, _ = logging_run(['--no-show-results',
+            'failures/unexpected/missing_text.html',
+            'failures/unexpected/missing_image.html',
+            'failures/unexpected/missing_audio.html',
+            'failures/unexpected/missing_render_tree_dump.html'],
+            tests_included=True, host=host, new_results=True)
         file_list = host.filesystem.written_files.keys()
-        file_list.remove('/tmp/layout-test-results/tests_run0.txt')
-        self.assertEquals(res, 0)
-        self.assertNotEmpty(out)
-        self.assertEqual(len(file_list), 6)
+        self.assertEqual(details.exit_code, 0)
+        self.assertEqual(len(file_list), 10)
         self.assertBaselines(file_list, "failures/unexpected/missing_text", [".txt"], err)
         self.assertBaselines(file_list, "platform/test/failures/unexpected/missing_image", [".png"], err)
         self.assertBaselines(file_list, "platform/test/failures/unexpected/missing_render_tree_dump", [".txt"], err)
@@ -1055,16 +913,12 @@
         # Test that we update the platform expectations in the version-specific directories
         # for both existing and new baselines.
         host = MockHost()
-        res, out, err, _ = logging_run(['--pixel-tests',
-                        '--new-baseline',
-                        'passes/image.html',
-                        'failures/expected/missing_image.html'],
-                    tests_included=True, host=host, new_results=True)
+        details, err, _ = logging_run(
+            ['--pixel-tests', '--new-baseline', 'passes/image.html', 'failures/expected/missing_image.html'],
+            tests_included=True, host=host, new_results=True)
         file_list = host.filesystem.written_files.keys()
-        file_list.remove('/tmp/layout-test-results/tests_run0.txt')
-        self.assertEquals(res, 0)
-        self.assertEmpty(out)
-        self.assertEqual(len(file_list), 4)
+        self.assertEqual(details.exit_code, 0)
+        self.assertEqual(len(file_list), 8)
         self.assertBaselines(file_list,
             "platform/test-mac-leopard/passes/image", [".txt", ".png"], err)
         self.assertBaselines(file_list,
@@ -1087,5 +941,38 @@
     def disabled_test_mac_lion(self):
         self.assert_mock_port_works('mac-lion')
 
-if __name__ == '__main__':
-    unittest.main()
+
+class MainTest(unittest.TestCase):
+    def test_exception_handling(self):
+        orig_run_fn = run_webkit_tests.run
+
+        # unused args pylint: disable=W0613
+        def interrupting_run(port, options, args, stderr):
+            raise KeyboardInterrupt
+
+        def successful_run(port, options, args, stderr):
+
+            class FakeRunDetails(object):
+                exit_code = -1
+
+            return FakeRunDetails()
+
+        def exception_raising_run(port, options, args, stderr):
+            assert False
+
+        stdout = StringIO.StringIO()
+        stderr = StringIO.StringIO()
+        try:
+            run_webkit_tests.run = interrupting_run
+            res = run_webkit_tests.main([], stdout, stderr)
+            self.assertEqual(res, run_webkit_tests.INTERRUPTED_EXIT_STATUS)
+
+            run_webkit_tests.run = successful_run
+            res = run_webkit_tests.main(['--platform', 'test'], stdout, stderr)
+            self.assertEqual(res, -1)
+
+            run_webkit_tests.run = exception_raising_run
+            res = run_webkit_tests.main([], stdout, stderr)
+            self.assertEqual(res, run_webkit_tests.EXCEPTIONAL_EXIT_STATUS)
+        finally:
+            run_webkit_tests.run = orig_run_fn
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server.py b/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server.py
index 7dede92..eb64d82 100644
--- a/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py b/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py
index 34ab97b..5ca027f 100644
--- a/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py
@@ -28,7 +28,7 @@
 
 import re
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive_mock import MockExecutive
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -63,8 +63,8 @@
             server.start()
             server.stop()
         finally:
-            out, err, logs = oc.restore_output()
-        self.assertTrue("StartServers 4" in err)
-        self.assertTrue("MinSpareServers 4" in err)
-        self.assertTrue("MaxSpareServers 4" in err)
+            _, _, logs = oc.restore_output()
+        self.assertIn("StartServers 4", logs)
+        self.assertIn("MinSpareServers 4", logs)
+        self.assertIn("MaxSpareServers 4", logs)
         self.assertTrue(host.filesystem.exists("/mock/output_dir/httpd.conf"))
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py b/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py
old mode 100755
new mode 100644
index 107c242..604f76b
--- a/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -215,6 +214,15 @@
 
     def _check_and_kill(self):
         if self._executive.check_running_pid(self._pid):
-            self._executive.kill_process(self._pid)
+            host = self._port_obj.host
+            if host.platform.is_win() and not host.platform.is_cygwin():
+                # FIXME: https://bugs.webkit.org/show_bug.cgi?id=106838
+                # We need to kill all of the child processes as well as the
+                # parent, so we can't use executive.kill_process().
+                #
+                # If this is actually working, we should figure out a clean API.
+                self._executive.run_command(["taskkill.exe", "/f", "/t", "/pid", self._pid], error_handler=self._executive.ignore_error)
+            else:
+                self._executive.kill_process(self._pid)
             return False
         return True
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py
old mode 100755
new mode 100644
index c1c3da8..3ce15a5
--- a/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -76,8 +75,12 @@
 
         # Stop any stale servers left over from previous instances.
         if self._filesystem.exists(self._pid_file):
-            self._pid = int(self._filesystem.read_text_file(self._pid_file))
-            self._stop_running_server()
+            try:
+                self._pid = int(self._filesystem.read_text_file(self._pid_file))
+                self._stop_running_server()
+            except (ValueError, UnicodeDecodeError):
+                # These could be raised if the pid file is corrupt.
+                self._remove_pid_file()
             self._pid = None
 
         self._remove_stale_logs()
@@ -95,29 +98,37 @@
     def stop(self):
         """Stops the server. Stopping a server that isn't started is harmless."""
         actual_pid = None
-        if self._filesystem.exists(self._pid_file):
-            actual_pid = int(self._filesystem.read_text_file(self._pid_file))
+        try:
+            if self._filesystem.exists(self._pid_file):
+                try:
+                    actual_pid = int(self._filesystem.read_text_file(self._pid_file))
+                except (ValueError, UnicodeDecodeError):
+                    # These could be raised if the pid file is corrupt.
+                    pass
+                if not self._pid:
+                    self._pid = actual_pid
+
             if not self._pid:
-                self._pid = actual_pid
+                return
 
-        if not self._pid:
-            return
+            if not actual_pid:
+                _log.warning('Failed to stop %s: pid file is missing' % self._name)
+                return
+            if self._pid != actual_pid:
+                _log.warning('Failed to stop %s: pid file contains %d, not %d' %
+                            (self._name, actual_pid, self._pid))
+                # Try to kill the existing pid, anyway, in case it got orphaned.
+                self._executive.kill_process(self._pid)
+                self._pid = None
+                return
 
-        if not actual_pid:
-            _log.warning('Failed to stop %s: pid file is missing' % self._name)
-            return
-        if self._pid != actual_pid:
-            _log.warning('Failed to stop %s: pid file contains %d, not %d' %
-                         (self._name, actual_pid, self._pid))
-            # Try to kill the existing pid, anyway, in case it got orphaned.
-            self._executive.kill_process(self._pid)
+            _log.debug("Attempting to shut down %s server at pid %d" % (self._name, self._pid))
+            self._stop_running_server()
+            _log.debug("%s server at pid %d stopped" % (self._name, self._pid))
             self._pid = None
-            return
-
-        _log.debug("Attempting to shut down %s server at pid %d" % (self._name, self._pid))
-        self._stop_running_server()
-        _log.debug("%s server at pid %d stopped" % (self._name, self._pid))
-        self._pid = None
+        finally:
+            # Make sure we delete the pid file no matter what happens.
+            self._remove_pid_file()
 
     def _prepare_config(self):
         """This routine can be overridden by subclasses to do any sort
@@ -144,6 +155,10 @@
 
     # Utility routines.
 
+    def _remove_pid_file(self):
+        if self._filesystem.exists(self._pid_file):
+            self._filesystem.remove(self._pid_file)
+
     def _remove_log_files(self, folder, starts_with):
         files = self._filesystem.listdir(folder)
         for file in files:
@@ -194,7 +209,7 @@
             except IOError, e:
                 if e.errno in (errno.EALREADY, errno.EADDRINUSE):
                     raise ServerError('Port %d is already in use.' % port)
-                elif sys.platform == 'win32' and e.errno in (errno.WSAEACCES,):
+                elif sys.platform == 'win32' and e.errno in (errno.WSAEACCES,):  # pylint: disable=E1101
                     raise ServerError('Port %d is already in use.' % port)
                 else:
                     raise
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base_unittest.py b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base_unittest.py
new file mode 100644
index 0000000..410f6e4
--- /dev/null
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base_unittest.py
@@ -0,0 +1,58 @@
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest2 as unittest
+
+from webkitpy.common.host_mock import MockHost
+from webkitpy.layout_tests.port import test
+from webkitpy.layout_tests.servers.http_server_base import HttpServerBase
+
+
+class TestHttpServerBase(unittest.TestCase):
+    def test_corrupt_pid_file(self):
+        # This tests that if the pid file is corrupt or invalid,
+        # both start() and stop() deal with it correctly and delete the file.
+        host = MockHost()
+        test_port = test.TestPort(host)
+
+        server = HttpServerBase(test_port)
+        server._pid_file = '/tmp/pidfile'
+        server._spawn_process = lambda: 4
+        server._is_server_running_on_all_ports = lambda: True
+
+        host.filesystem.write_text_file(server._pid_file, 'foo')
+        server.stop()
+        self.assertEqual(host.filesystem.files[server._pid_file], None)
+
+        host.filesystem.write_text_file(server._pid_file, 'foo')
+        server.start()
+        self.assertEqual(server._pid, 4)
+
+        # Note that the pid file would not be None if _spawn_process()
+        # was actually a real implementation.
+        self.assertEqual(host.filesystem.files[server._pid_file], None)
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/http_server_integrationtest.py b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_integrationtest.py
old mode 100755
new mode 100644
index 237d689..aa6e59d
--- a/Tools/Scripts/webkitpy/layout_tests/servers/http_server_integrationtest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_integrationtest.py
@@ -36,7 +36,7 @@
 import subprocess
 import sys
 import tempfile
-import unittest
+import unittest2 as unittest
 
 
 class BaseTest(unittest.TestCase):
@@ -80,9 +80,9 @@
             return
 
         self.assert_servers_are_down()
-        self.assertEquals(self.run_script(['--server', 'start']), 0)
+        self.assertEqual(self.run_script(['--server', 'start']), 0)
         self.assert_servers_are_up()
-        self.assertEquals(self.run_script(['--server', 'stop']), 0)
+        self.assertEqual(self.run_script(['--server', 'stop']), 0)
         self.assert_servers_are_down()
 
     def integration_test_server__fails(self):
@@ -99,13 +99,13 @@
                     if e.errno in (errno.EADDRINUSE, errno.EALREADY):
                         self.fail('could not bind to port %d: %s' % (port_number, str(e)))
                     raise
-                self.assertEquals(self.run_script(['--server', 'start']), 1)
+                self.assertEqual(self.run_script(['--server', 'start']), 1)
             finally:
                 self.run_script(['--server', 'stop'])
                 test_socket.close()
 
         # Test that calling stop() twice is harmless.
-        self.assertEquals(self.run_script(['--server', 'stop']), 0)
+        self.assertEqual(self.run_script(['--server', 'stop']), 0)
 
     def maybe_make_dir(self, *comps):
         try:
@@ -124,9 +124,9 @@
         self.maybe_make_dir(tmpdir, 'media')
 
         self.assert_servers_are_down([18000])
-        self.assertEquals(self.run_script(['--server', 'start', '--port=18000', '--root', tmpdir]), 0)
+        self.assertEqual(self.run_script(['--server', 'start', '--port=18000', '--root', tmpdir]), 0)
         self.assert_servers_are_up([18000])
-        self.assertEquals(self.run_script(['--server', 'stop']), 0)
+        self.assertEqual(self.run_script(['--server', 'stop']), 0)
         self.assert_servers_are_down([18000])
 
 
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/http_server_unittest.py b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_unittest.py
index 7a14526..2ee9495 100644
--- a/Tools/Scripts/webkitpy/layout_tests/servers/http_server_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/http_server_unittest.py
@@ -26,9 +26,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
 import re
 import sys
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
 from webkitpy.layout_tests.port import test
@@ -56,9 +56,46 @@
         self.assertRaises(ServerError, server.start)
 
         config_file = host.filesystem.read_text_file("/mock/output_dir/lighttpd.conf")
-        self.assertEquals(re.findall(r"alias.url.+", config_file), [
+        self.assertEqual(re.findall(r"alias.url.+", config_file), [
             'alias.url = ( "/js-test-resources" => "/test.checkout/LayoutTests/fast/js/resources" )',
             'alias.url += ( "/mock/one-additional-dir" => "/mock-checkout/one-additional-dir" )',
             'alias.url += ( "/mock/another-additional-dir" => "/mock-checkout/one-additional-dir" )',
             'alias.url += ( "/media-resources" => "/test.checkout/LayoutTests/media" )',
         ])
+
+    def test_win32_start_and_stop(self):
+        host = MockHost()
+        test_port = test.TestPort(host)
+        host.filesystem.write_text_file(
+            "/mock-checkout/Tools/Scripts/webkitpy/layout_tests/servers/lighttpd.conf", "Mock Config\n")
+        host.filesystem.write_text_file(
+            "/usr/lib/lighttpd/liblightcomp.dylib", "Mock dylib")
+
+        host.platform.is_win = lambda: True
+        host.platform.is_cygwin = lambda: False
+
+        server = Lighttpd(test_port, "/mock/output_dir",
+                          additional_dirs={
+                              "/mock/one-additional-dir": "/mock-checkout/one-additional-dir",
+                              "/mock/another-additional-dir": "/mock-checkout/one-additional-dir"})
+        server._check_that_all_ports_are_available = lambda: True
+        server._is_server_running_on_all_ports = lambda: True
+
+        server.start()
+        self.assertNotEquals(host.executive.calls, [])
+
+        def wait_for_action(action):
+            if action():
+                return True
+            return action()
+
+        def mock_returns(return_values):
+            def return_value_thunk(*args, **kwargs):
+                return return_values.pop(0)
+            return return_value_thunk
+
+        host.executive.check_running_pid = mock_returns([True, False])
+        server._wait_for_action = wait_for_action
+
+        server.stop()
+        self.assertEqual(['taskkill.exe', '/f', '/t', '/pid', 42], host.executive.calls[1])
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py b/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py
index 93747f6..2ffdc32 100644
--- a/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/views/buildbot_results.py b/Tools/Scripts/webkitpy/layout_tests/views/buildbot_results.py
new file mode 100644
index 0000000..3191b84
--- /dev/null
+++ b/Tools/Scripts/webkitpy/layout_tests/views/buildbot_results.py
@@ -0,0 +1,167 @@
+#!/usr/bin/env python
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+from webkitpy.layout_tests.models import test_expectations
+
+from webkitpy.common.net import resultsjsonparser
+
+
+TestExpectations = test_expectations.TestExpectations
+TestExpectationParser = test_expectations.TestExpectationParser
+
+
+class BuildBotPrinter(object):
+    # This output is parsed by buildbots and must only be changed in coordination with buildbot scripts (see webkit.org's
+    # Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg: RunWebKitTests._parseNewRunWebKitTestsOutput
+    # and chromium.org's buildbot/master.chromium/scripts/master/log_parser/webkit_test_command.py).
+
+    def __init__(self, stream, debug_logging):
+        self.stream = stream
+        self.debug_logging = debug_logging
+
+    def print_results(self, run_details):
+        if self.debug_logging:
+            self.print_run_results(run_details.initial_results)
+        self.print_unexpected_results(run_details.summarized_results, run_details.enabled_pixel_tests_in_retry)
+
+    def _print(self, msg):
+        self.stream.write(msg + '\n')
+
+    def print_run_results(self, run_results):
+        failed = run_results.total_failures
+        total = run_results.total
+        passed = total - failed - run_results.remaining
+        percent_passed = 0.0
+        if total > 0:
+            percent_passed = float(passed) * 100 / total
+
+        self._print("=> Results: %d/%d tests passed (%.1f%%)" % (passed, total, percent_passed))
+        self._print("")
+        self._print_run_results_entry(run_results, test_expectations.NOW, "Tests to be fixed")
+
+        self._print("")
+        # FIXME: We should be skipping anything marked WONTFIX, so we shouldn't bother logging these stats.
+        self._print_run_results_entry(run_results, test_expectations.WONTFIX,
+            "Tests that will only be fixed if they crash (WONTFIX)")
+        self._print("")
+
+    def _print_run_results_entry(self, run_results, timeline, heading):
+        total = len(run_results.tests_by_timeline[timeline])
+        not_passing = (total -
+            len(run_results.tests_by_expectation[test_expectations.PASS] &
+                run_results.tests_by_timeline[timeline]))
+        self._print("=> %s (%d):" % (heading, not_passing))
+
+        for result in TestExpectations.EXPECTATION_ORDER:
+            if result in (test_expectations.PASS, test_expectations.SKIP):
+                continue
+            results = (run_results.tests_by_expectation[result] & run_results.tests_by_timeline[timeline])
+            desc = TestExpectations.EXPECTATION_DESCRIPTIONS[result]
+            if not_passing and len(results):
+                pct = len(results) * 100.0 / not_passing
+                self._print("  %5d %-24s (%4.1f%%)" % (len(results), desc, pct))
+
+    def print_unexpected_results(self, summarized_results, enabled_pixel_tests_in_retry=False):
+        passes = {}
+        flaky = {}
+        regressions = {}
+
+        def add_to_dict_of_lists(dict, key, value):
+            dict.setdefault(key, []).append(value)
+
+        def add_result(test, results, passes=passes, flaky=flaky, regressions=regressions):
+            actual = results['actual'].split(" ")
+            expected = results['expected'].split(" ")
+
+            def is_expected(result):
+                return (result in expected) or (result in ('AUDIO', 'TEXT', 'IMAGE+TEXT') and 'FAIL' in expected)
+
+            if all(is_expected(actual_result) for actual_result in actual):
+                # Don't print anything for tests that ran as expected.
+                return
+
+            if actual == ['PASS']:
+                if 'CRASH' in expected:
+                    add_to_dict_of_lists(passes, 'Expected to crash, but passed', test)
+                elif 'TIMEOUT' in expected:
+                    add_to_dict_of_lists(passes, 'Expected to timeout, but passed', test)
+                else:
+                    add_to_dict_of_lists(passes, 'Expected to fail, but passed', test)
+            elif enabled_pixel_tests_in_retry and actual == ['TEXT', 'IMAGE+TEXT']:
+                add_to_dict_of_lists(regressions, actual[0], test)
+            elif len(actual) > 1:
+                # We group flaky tests by the first actual result we got.
+                add_to_dict_of_lists(flaky, actual[0], test)
+            else:
+                add_to_dict_of_lists(regressions, results['actual'], test)
+
+        resultsjsonparser.for_each_test(summarized_results['tests'], add_result)
+
+        if len(passes) or len(flaky) or len(regressions):
+            self._print("")
+        if len(passes):
+            for key, tests in passes.iteritems():
+                self._print("%s: (%d)" % (key, len(tests)))
+                tests.sort()
+                for test in tests:
+                    self._print("  %s" % test)
+                self._print("")
+            self._print("")
+
+        if len(flaky):
+            descriptions = TestExpectations.EXPECTATION_DESCRIPTIONS
+            for key, tests in flaky.iteritems():
+                result = TestExpectations.EXPECTATIONS[key.lower()]
+                self._print("Unexpected flakiness: %s (%d)" % (descriptions[result], len(tests)))
+                tests.sort()
+
+                for test in tests:
+                    result = resultsjsonparser.result_for_test(summarized_results['tests'], test)
+                    actual = result['actual'].split(" ")
+                    expected = result['expected'].split(" ")
+                    result = TestExpectations.EXPECTATIONS[key.lower()]
+                    # FIXME: clean this up once the old syntax is gone
+                    new_expectations_list = [TestExpectationParser._inverted_expectation_tokens[exp] for exp in list(set(actual) | set(expected))]
+                    self._print("  %s [ %s ]" % (test, " ".join(new_expectations_list)))
+                self._print("")
+            self._print("")
+
+        if len(regressions):
+            descriptions = TestExpectations.EXPECTATION_DESCRIPTIONS
+            for key, tests in regressions.iteritems():
+                result = TestExpectations.EXPECTATIONS[key.lower()]
+                self._print("Regressions: Unexpected %s (%d)" % (descriptions[result], len(tests)))
+                tests.sort()
+                for test in tests:
+                    self._print("  %s [ %s ]" % (test, TestExpectationParser._inverted_expectation_tokens[key]))
+                self._print("")
+
+        if len(summarized_results['tests']) and self.debug_logging:
+            self._print("%s" % ("-" * 78))
diff --git a/Tools/Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py b/Tools/Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py
new file mode 100644
index 0000000..5ce15c1
--- /dev/null
+++ b/Tools/Scripts/webkitpy/layout_tests/views/buildbot_results_unittest.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import StringIO
+import unittest2 as unittest
+
+from webkitpy.common.host_mock import MockHost
+
+from webkitpy.layout_tests.models import test_expectations
+from webkitpy.layout_tests.models import test_failures
+from webkitpy.layout_tests.models import test_run_results
+from webkitpy.layout_tests.models import test_run_results
+from webkitpy.layout_tests.models import test_run_results_unittest
+from webkitpy.layout_tests.views import buildbot_results
+
+
+class BuildBotPrinterTests(unittest.TestCase):
+    def assertEmpty(self, stream):
+        self.assertFalse(stream.getvalue())
+
+    def assertNotEmpty(self, stream):
+        self.assertTrue(stream.getvalue())
+
+    def get_printer(self):
+        stream = StringIO.StringIO()
+        printer = buildbot_results.BuildBotPrinter(stream, debug_logging=True)
+        return printer, stream
+
+    def test_print_unexpected_results(self):
+        port = MockHost().port_factory.get('test')
+        printer, out = self.get_printer()
+
+        # test everything running as expected
+        DASHED_LINE = "-" * 78 + "\n"
+        summary = test_run_results_unittest.summarized_results(port, expected=True, passing=False, flaky=False)
+        printer.print_unexpected_results(summary)
+        self.assertEqual(out.getvalue(), DASHED_LINE)
+
+        # test failures
+        printer, out = self.get_printer()
+        summary = test_run_results_unittest.summarized_results(port, expected=False, passing=False, flaky=False)
+        printer.print_unexpected_results(summary)
+        self.assertNotEmpty(out)
+
+        # test unexpected flaky
+        printer, out = self.get_printer()
+        summary = test_run_results_unittest.summarized_results(port, expected=False, passing=False, flaky=True)
+        printer.print_unexpected_results(summary)
+        self.assertNotEmpty(out)
+
+        printer, out = self.get_printer()
+        summary = test_run_results_unittest.summarized_results(port, expected=False, passing=False, flaky=False)
+        printer.print_unexpected_results(summary)
+        self.assertNotEmpty(out)
+
+        printer, out = self.get_printer()
+        summary = test_run_results_unittest.summarized_results(port, expected=False, passing=False, flaky=False)
+        printer.print_unexpected_results(summary)
+        self.assertNotEmpty(out)
+
+        printer, out = self.get_printer()
+        summary = test_run_results_unittest.summarized_results(port, expected=False, passing=True, flaky=False)
+        printer.print_unexpected_results(summary)
+        self.assertNotEmpty(out)
+
+    def test_print_results(self):
+        port = MockHost().port_factory.get('test')
+        printer, out = self.get_printer()
+        initial_results = test_run_results_unittest.run_results(port)
+        summary = test_run_results_unittest.summarized_results(port, expected=False, passing=True, flaky=False)
+        details = test_run_results.RunDetails(summary['num_regressions'], summary, initial_results, None)
+        printer.print_results(details)
+        self.assertNotEmpty(out)
diff --git a/Tools/Scripts/webkitpy/layout_tests/views/metered_stream.py b/Tools/Scripts/webkitpy/layout_tests/views/metered_stream.py
index acea93e..fd04ad8 100644
--- a/Tools/Scripts/webkitpy/layout_tests/views/metered_stream.py
+++ b/Tools/Scripts/webkitpy/layout_tests/views/metered_stream.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010, 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/layout_tests/views/metered_stream_unittest.py b/Tools/Scripts/webkitpy/layout_tests/views/metered_stream_unittest.py
index b388ec6..0eaec2d 100644
--- a/Tools/Scripts/webkitpy/layout_tests/views/metered_stream_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/views/metered_stream_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2010, 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -30,7 +29,7 @@
 import logging
 import re
 import StringIO
-import unittest
+import unittest2 as unittest
 
 from webkitpy.layout_tests.views.metered_stream import MeteredStream
 
@@ -76,7 +75,7 @@
             self.meter.write_throttled_update('foo')
             self.meter.write_update('bar')
             self.meter.write('baz')
-            self.assertEquals(logging_stream.buflist, [])
+            self.assertEqual(logging_stream.buflist, [])
         finally:
             root_logger.removeHandler(handler)
             root_logger.setLevel(orig_level)
@@ -88,12 +87,12 @@
         self.meter.write_throttled_update('baz')
         self.meter.write_throttled_update('baz 2')
         self.meter.writeln('done')
-        self.assertEquals(self.times, [])
+        self.assertEqual(self.times, [])
         return self.buflist
 
     def test_basic(self):
         buflist = self._basic([0, 1, 2, 13, 14])
-        self.assertEquals(buflist, ['foo\n', 'bar\n', 'baz 2\n', 'done\n'])
+        self.assertEqual(buflist, ['foo\n', 'bar\n', 'baz 2\n', 'done\n'])
 
     def _log_after_update(self):
         self.meter.write_update('foo')
@@ -102,11 +101,11 @@
 
     def test_log_after_update(self):
         buflist = self._log_after_update()
-        self.assertEquals(buflist, ['foo\n', 'bar\n'])
+        self.assertEqual(buflist, ['foo\n', 'bar\n'])
 
     def test_log_args(self):
         self.logger.info('foo %s %d', 'bar', 2)
-        self.assertEquals(self.buflist, ['foo bar 2\n'])
+        self.assertEqual(self.buflist, ['foo bar 2\n'])
 
 class TtyTest(RegularTest):
     verbose = False
@@ -114,14 +113,14 @@
 
     def test_basic(self):
         buflist = self._basic([0, 1, 1.05, 1.1, 2])
-        self.assertEquals(buflist, ['foo',
+        self.assertEqual(buflist, ['foo',
                                      MeteredStream._erasure('foo'), 'bar',
                                      MeteredStream._erasure('bar'), 'baz 2',
                                      MeteredStream._erasure('baz 2'), 'done\n'])
 
     def test_log_after_update(self):
         buflist = self._log_after_update()
-        self.assertEquals(buflist, ['foo',
+        self.assertEqual(buflist, ['foo',
                                      MeteredStream._erasure('foo'), 'bar\n'])
 
 
@@ -137,7 +136,7 @@
         self.assertTrue(re.match('\d\d:\d\d:01.000 8675 bar\n', buflist[1]))
         self.assertTrue(re.match('\d\d:\d\d:13.000 8675 baz 2\n', buflist[2]))
         self.assertTrue(re.match('\d\d:\d\d:14.123 8675 done\n', buflist[3]))
-        self.assertEquals(len(buflist), 4)
+        self.assertEqual(len(buflist), 4)
 
     def test_log_after_update(self):
         buflist = self._log_after_update()
@@ -146,13 +145,9 @@
         # The second argument should have a real timestamp and pid, so we just check the format.
         self.assertTrue(re.match('\d\d:\d\d:\d\d.\d\d\d \d+ bar\n', buflist[1]))
 
-        self.assertEquals(len(buflist), 2)
+        self.assertEqual(len(buflist), 2)
 
     def test_log_args(self):
         self.logger.info('foo %s %d', 'bar', 2)
-        self.assertEquals(len(self.buflist), 1)
+        self.assertEqual(len(self.buflist), 1)
         self.assertTrue(self.buflist[0].endswith('foo bar 2\n'))
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/layout_tests/views/printing.py b/Tools/Scripts/webkitpy/layout_tests/views/printing.py
index b7a9195..c0374f0 100644
--- a/Tools/Scripts/webkitpy/layout_tests/views/printing.py
+++ b/Tools/Scripts/webkitpy/layout_tests/views/printing.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2010, 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -33,7 +32,6 @@
 import optparse
 
 from webkitpy.tool import grammar
-from webkitpy.common.net import resultsjsonparser
 from webkitpy.layout_tests.models import test_expectations
 from webkitpy.layout_tests.models.test_expectations import TestExpectations, TestExpectationParser
 from webkitpy.layout_tests.views.metered_stream import MeteredStream
@@ -56,23 +54,13 @@
 
 
 class Printer(object):
-    """Class handling all non-debug-logging printing done by run-webkit-tests.
+    """Class handling all non-debug-logging printing done by run-webkit-tests."""
 
-    Printing from run-webkit-tests falls into two buckets: general or
-    regular output that is read only by humans and can be changed at any
-    time, and output that is parsed by buildbots (and humans) and hence
-    must be changed more carefully and in coordination with the buildbot
-    parsing code (in chromium.org's buildbot/master.chromium/scripts/master/
-    log_parser/webkit_test_command.py script).
-
-    By default the buildbot-parsed code gets logged to stdout, and regular
-    output gets logged to stderr."""
-    def __init__(self, port, options, regular_output, buildbot_output, logger=None):
+    def __init__(self, port, options, regular_output, logger=None):
         self.num_completed = 0
         self.num_tests = 0
         self._port = port
         self._options = options
-        self._buildbot_stream = buildbot_output
         self._meter = MeteredStream(regular_output, options.debug_rwt_logging, logger=logger,
                                     number_of_columns=self._port.host.platform.terminal_width())
         self._running_tests = []
@@ -110,32 +98,32 @@
         self._print_default('')
 
     def print_found(self, num_all_test_files, num_to_run, repeat_each, iterations):
-        num_unique_tests = num_to_run / (repeat_each * iterations)
-        found_str = 'Found %s; running %d' % (grammar.pluralize('test', num_all_test_files), num_unique_tests)
+        found_str = 'Found %s; running %d' % (grammar.pluralize('test', num_all_test_files), num_to_run)
         if repeat_each * iterations > 1:
             found_str += ' (%d times each: --repeat-each=%d --iterations=%d)' % (repeat_each * iterations, repeat_each, iterations)
-        found_str += ', skipping %d' % (num_all_test_files - num_unique_tests)
+        found_str += ', skipping %d' % (num_all_test_files - num_to_run)
         self._print_default(found_str + '.')
 
-    def print_expected(self, result_summary, tests_with_result_type_callback):
-        self._print_expected_results_of_type(result_summary, test_expectations.PASS, "passes", tests_with_result_type_callback)
-        self._print_expected_results_of_type(result_summary, test_expectations.FAIL, "failures", tests_with_result_type_callback)
-        self._print_expected_results_of_type(result_summary, test_expectations.FLAKY, "flaky", tests_with_result_type_callback)
+    def print_expected(self, run_results, tests_with_result_type_callback):
+        self._print_expected_results_of_type(run_results, test_expectations.PASS, "passes", tests_with_result_type_callback)
+        self._print_expected_results_of_type(run_results, test_expectations.FAIL, "failures", tests_with_result_type_callback)
+        self._print_expected_results_of_type(run_results, test_expectations.FLAKY, "flaky", tests_with_result_type_callback)
         self._print_debug('')
 
     def print_workers_and_shards(self, num_workers, num_shards, num_locked_shards):
         driver_name = self._port.driver_name()
         if num_workers == 1:
-            self._print_default("Running 1 %s over %s." % (driver_name, grammar.pluralize('shard', num_shards)))
+            self._print_default("Running 1 %s." % driver_name)
+            self._print_debug("(%s)." % grammar.pluralize('shard', num_shards))
         else:
-            self._print_default("Running %d %ss in parallel over %d shards (%d locked)." %
-                (num_workers, driver_name, num_shards, num_locked_shards))
+            self._print_default("Running %d %ss in parallel." % (num_workers, driver_name))
+            self._print_debug("(%d shards; %d locked)." % (num_shards, num_locked_shards))
         self._print_default('')
 
-    def _print_expected_results_of_type(self, result_summary, result_type, result_type_str, tests_with_result_type_callback):
+    def _print_expected_results_of_type(self, run_results, result_type, result_type_str, tests_with_result_type_callback):
         tests = tests_with_result_type_callback(result_type)
-        now = result_summary.tests_by_timeline[test_expectations.NOW]
-        wontfix = result_summary.tests_by_timeline[test_expectations.WONTFIX]
+        now = run_results.tests_by_timeline[test_expectations.NOW]
+        wontfix = run_results.tests_by_timeline[test_expectations.WONTFIX]
 
         # We use a fancy format string in order to print the data out in a
         # nicely-aligned table.
@@ -149,39 +137,45 @@
             ndigits = int(math.log10(len(num))) + 1
         return ndigits
 
-    def print_results(self, run_time, thread_timings, test_timings, individual_test_timings, result_summary, unexpected_results):
-        self._print_timing_statistics(run_time, thread_timings, test_timings, individual_test_timings, result_summary)
-        self._print_result_summary(result_summary)
-        self._print_one_line_summary(result_summary.total - result_summary.expected_skips,
-                                     result_summary.expected - result_summary.expected_skips,
-                                     result_summary.unexpected)
-        self._print_unexpected_results(unexpected_results)
+    def print_results(self, run_time, run_results, summarized_results):
+        self._print_timing_statistics(run_time, run_results)
+        self._print_one_line_summary(run_results.total - run_results.expected_skips,
+                                     run_results.expected - run_results.expected_skips,
+                                     run_results.unexpected)
 
-    def _print_timing_statistics(self, total_time, thread_timings,
-                                 directory_test_timings, individual_test_timings,
-                                 result_summary):
+    def _print_timing_statistics(self, total_time, run_results):
         self._print_debug("Test timing:")
         self._print_debug("  %6.2f total testing time" % total_time)
         self._print_debug("")
+
+        self._print_worker_statistics(run_results, int(self._options.child_processes))
+        self._print_aggregate_test_statistics(run_results)
+        self._print_individual_test_times(run_results)
+        self._print_directory_timings(run_results)
+
+    def _print_worker_statistics(self, run_results, num_workers):
         self._print_debug("Thread timing:")
+        stats = {}
         cuml_time = 0
-        for t in thread_timings:
-            self._print_debug("    %10s: %5d tests, %6.2f secs" % (t['name'], t['num_tests'], t['total_time']))
-            cuml_time += t['total_time']
-        self._print_debug("   %6.2f cumulative, %6.2f optimal" % (cuml_time, cuml_time / int(self._options.child_processes)))
+        for result in run_results.results_by_name.values():
+            stats.setdefault(result.worker_name, {'num_tests': 0, 'total_time': 0})
+            stats[result.worker_name]['num_tests'] += 1
+            stats[result.worker_name]['total_time'] += result.total_run_time
+            cuml_time += result.total_run_time
+
+        for worker_name in stats:
+            self._print_debug("    %10s: %5d tests, %6.2f secs" % (worker_name, stats[worker_name]['num_tests'], stats[worker_name]['total_time']))
+        self._print_debug("   %6.2f cumulative, %6.2f optimal" % (cuml_time, cuml_time / num_workers))
         self._print_debug("")
 
-        self._print_aggregate_test_statistics(individual_test_timings)
-        self._print_individual_test_times(individual_test_timings, result_summary)
-        self._print_directory_timings(directory_test_timings)
-
-    def _print_aggregate_test_statistics(self, individual_test_timings):
-        times_for_dump_render_tree = [test_stats.test_run_time for test_stats in individual_test_timings]
+    def _print_aggregate_test_statistics(self, run_results):
+        times_for_dump_render_tree = [result.test_run_time for result in run_results.results_by_name.values()]
         self._print_statistics_for_test_timings("PER TEST TIME IN TESTSHELL (seconds):", times_for_dump_render_tree)
 
-    def _print_individual_test_times(self, individual_test_timings, result_summary):
+    def _print_individual_test_times(self, run_results):
         # Reverse-sort by the time spent in DumpRenderTree.
-        individual_test_timings.sort(lambda a, b: cmp(b.test_run_time, a.test_run_time))
+
+        individual_test_timings = sorted(run_results.results_by_name.values(), key=lambda result: result.test_run_time, reverse=True)
         num_printed = 0
         slow_tests = []
         timeout_or_crash_tests = []
@@ -189,12 +183,12 @@
         for test_tuple in individual_test_timings:
             test_name = test_tuple.test_name
             is_timeout_crash_or_slow = False
-            if test_name in result_summary.slow_tests:
+            if test_name in run_results.slow_tests:
                 is_timeout_crash_or_slow = True
                 slow_tests.append(test_tuple)
 
-            if test_name in result_summary.failures:
-                result = result_summary.results[test_name].type
+            if test_name in run_results.failures_by_name:
+                result = run_results.results_by_name[test_name].type
                 if (result == test_expectations.TIMEOUT or
                     result == test_expectations.CRASH):
                     is_timeout_crash_or_slow = True
@@ -219,18 +213,23 @@
             test_run_time = round(test_tuple.test_run_time, 1)
             self._print_debug("  %s took %s seconds" % (test_tuple.test_name, test_run_time))
 
-    def _print_directory_timings(self, directory_test_timings):
+    def _print_directory_timings(self, run_results):
+        stats = {}
+        for result in run_results.results_by_name.values():
+            stats.setdefault(result.shard_name, {'num_tests': 0, 'total_time': 0})
+            stats[result.shard_name]['num_tests'] += 1
+            stats[result.shard_name]['total_time'] += result.total_run_time
+
         timings = []
-        for directory in directory_test_timings:
-            num_tests, time_for_directory = directory_test_timings[directory]
-            timings.append((round(time_for_directory, 1), directory, num_tests))
+        for directory in stats:
+            timings.append((directory, round(stats[directory]['total_time'], 1), stats[directory]['num_tests']))
         timings.sort()
 
         self._print_debug("Time to process slowest subdirectories:")
         min_seconds_to_print = 10
         for timing in timings:
             if timing[0] > min_seconds_to_print:
-                self._print_debug("  %s took %s seconds to run %s tests." % (timing[1], timing[0], timing[2]))
+                self._print_debug("  %s took %s seconds to run %s tests." % timing)
         self._print_debug("")
 
     def _print_statistics_for_test_timings(self, title, timings):
@@ -263,44 +262,6 @@
         self._print_debug("  Standard dev:    %6.3f" % std_deviation)
         self._print_debug("")
 
-    def _print_result_summary(self, result_summary):
-        if not self._options.debug_rwt_logging:
-            return
-
-        failed = result_summary.total_failures
-        total = result_summary.total - result_summary.expected_skips
-        passed = total - failed - result_summary.remaining
-        pct_passed = 0.0
-        if total > 0:
-            pct_passed = float(passed) * 100 / total
-
-        self._print_for_bot("=> Results: %d/%d tests passed (%.1f%%)" % (passed, total, pct_passed))
-        self._print_for_bot("")
-        self._print_result_summary_entry(result_summary, test_expectations.NOW, "Tests to be fixed")
-
-        self._print_for_bot("")
-        # FIXME: We should be skipping anything marked WONTFIX, so we shouldn't bother logging these stats.
-        self._print_result_summary_entry(result_summary, test_expectations.WONTFIX,
-            "Tests that will only be fixed if they crash (WONTFIX)")
-        self._print_for_bot("")
-
-    def _print_result_summary_entry(self, result_summary, timeline, heading):
-        total = len(result_summary.tests_by_timeline[timeline])
-        not_passing = (total -
-           len(result_summary.tests_by_expectation[test_expectations.PASS] &
-               result_summary.tests_by_timeline[timeline]))
-        self._print_for_bot("=> %s (%d):" % (heading, not_passing))
-
-        for result in TestExpectations.EXPECTATION_ORDER:
-            if result in (test_expectations.PASS, test_expectations.SKIP):
-                continue
-            results = (result_summary.tests_by_expectation[result] &
-                       result_summary.tests_by_timeline[timeline])
-            desc = TestExpectations.EXPECTATION_DESCRIPTIONS[result]
-            if not_passing and len(results):
-                pct = len(results) * 100.0 / not_passing
-                self._print_for_bot("  %5d %-24s (%4.1f%%)" % (len(results), desc, pct))
-
     def _print_one_line_summary(self, total, expected, unexpected):
         incomplete = total - expected - unexpected
         incomplete_str = ''
@@ -411,75 +372,6 @@
             relpath = '<none>'
         self._print_default('  %s: %s' % (extension[1:], relpath))
 
-    def _print_unexpected_results(self, unexpected_results):
-        # Prints to the buildbot stream
-        passes = {}
-        flaky = {}
-        regressions = {}
-
-        def add_to_dict_of_lists(dict, key, value):
-            dict.setdefault(key, []).append(value)
-
-        def add_result(test, results, passes=passes, flaky=flaky, regressions=regressions):
-            actual = results['actual'].split(" ")
-            expected = results['expected'].split(" ")
-            if actual == ['PASS']:
-                if 'CRASH' in expected:
-                    add_to_dict_of_lists(passes, 'Expected to crash, but passed', test)
-                elif 'TIMEOUT' in expected:
-                    add_to_dict_of_lists(passes, 'Expected to timeout, but passed', test)
-                else:
-                    add_to_dict_of_lists(passes, 'Expected to fail, but passed', test)
-            elif len(actual) > 1:
-                # We group flaky tests by the first actual result we got.
-                add_to_dict_of_lists(flaky, actual[0], test)
-            else:
-                add_to_dict_of_lists(regressions, results['actual'], test)
-
-        resultsjsonparser.for_each_test(unexpected_results['tests'], add_result)
-
-        if len(passes) or len(flaky) or len(regressions):
-            self._print_for_bot("")
-        if len(passes):
-            for key, tests in passes.iteritems():
-                self._print_for_bot("%s: (%d)" % (key, len(tests)))
-                tests.sort()
-                for test in tests:
-                    self._print_for_bot("  %s" % test)
-                self._print_for_bot("")
-            self._print_for_bot("")
-
-        if len(flaky):
-            descriptions = TestExpectations.EXPECTATION_DESCRIPTIONS
-            for key, tests in flaky.iteritems():
-                result = TestExpectations.EXPECTATIONS[key.lower()]
-                self._print_for_bot("Unexpected flakiness: %s (%d)" % (descriptions[result], len(tests)))
-                tests.sort()
-
-                for test in tests:
-                    result = resultsjsonparser.result_for_test(unexpected_results['tests'], test)
-                    actual = result['actual'].split(" ")
-                    expected = result['expected'].split(" ")
-                    result = TestExpectations.EXPECTATIONS[key.lower()]
-                    # FIXME: clean this up once the old syntax is gone
-                    new_expectations_list = [TestExpectationParser._inverted_expectation_tokens[exp] for exp in list(set(actual) | set(expected))]
-                    self._print_for_bot("  %s [ %s ]" % (test, " ".join(new_expectations_list)))
-                self._print_for_bot("")
-            self._print_for_bot("")
-
-        if len(regressions):
-            descriptions = TestExpectations.EXPECTATION_DESCRIPTIONS
-            for key, tests in regressions.iteritems():
-                result = TestExpectations.EXPECTATIONS[key.lower()]
-                self._print_for_bot("Regressions: Unexpected %s (%d)" % (descriptions[result], len(tests)))
-                tests.sort()
-                for test in tests:
-                    self._print_for_bot("  %s [ %s ]" % (test, TestExpectationParser._inverted_expectation_tokens[key]))
-                self._print_for_bot("")
-
-        if len(unexpected_results['tests']) and self._options.debug_rwt_logging:
-            self._print_for_bot("%s" % ("-" * 78))
-
     def _print_quiet(self, msg):
         self.writeln(msg)
 
@@ -491,9 +383,6 @@
         if self._options.debug_rwt_logging:
             self.writeln(msg)
 
-    def _print_for_bot(self, msg):
-        self._buildbot_stream.write(msg + "\n")
-
     def write_update(self, msg):
         self._meter.write_update(msg)
 
diff --git a/Tools/Scripts/webkitpy/layout_tests/views/printing_unittest.py b/Tools/Scripts/webkitpy/layout_tests/views/printing_unittest.py
index bc30092..71e7888 100644
--- a/Tools/Scripts/webkitpy/layout_tests/views/printing_unittest.py
+++ b/Tools/Scripts/webkitpy/layout_tests/views/printing_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2010, 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -33,14 +32,13 @@
 import StringIO
 import sys
 import time
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
 
 from webkitpy.common.system import logtesting
 from webkitpy.layout_tests import port
 from webkitpy.layout_tests.controllers import manager
-from webkitpy.layout_tests.models import result_summary
 from webkitpy.layout_tests.models import test_expectations
 from webkitpy.layout_tests.models import test_failures
 from webkitpy.layout_tests.models import test_results
@@ -56,7 +54,7 @@
 class TestUtilityFunctions(unittest.TestCase):
     def test_print_options(self):
         options, args = get_options([])
-        self.assertTrue(options is not None)
+        self.assertIsNotNone(options)
 
 
 class  Testprinter(unittest.TestCase):
@@ -67,7 +65,7 @@
         self.assertTrue(stream.getvalue())
 
     def assertWritten(self, stream, contents):
-        self.assertEquals(stream.buflist, contents)
+        self.assertEqual(stream.buflist, contents)
 
     def reset(self, stream):
         stream.buflist = []
@@ -83,9 +81,8 @@
         nproc = 2
 
         regular_output = StringIO.StringIO()
-        buildbot_output = StringIO.StringIO()
-        printer = printing.Printer(self._port, options, regular_output, buildbot_output)
-        return printer, regular_output, buildbot_output
+        printer = printing.Printer(self._port, options, regular_output)
+        return printer, regular_output
 
     def get_result(self, test_name, result_type=test_expectations.PASS, run_time=0):
         failures = []
@@ -95,199 +92,96 @@
             failures = [test_failures.FailureCrash()]
         return test_results.TestResult(test_name, failures=failures, test_run_time=run_time)
 
-    def get_result_summary(self, test_names, expectations_str):
-        port.test_expectations = lambda: expectations_str
-        port.test_expectations_overrides = lambda: None
-        expectations = test_expectations.TestExpectations(self._port, test_names)
-
-        rs = result_summary.ResultSummary(expectations, test_names, 1, set())
-        return test_names, rs, expectations
-
     def test_configure_and_cleanup(self):
         # This test verifies that calling cleanup repeatedly and deleting
         # the object is safe.
-        printer, err, out = self.get_printer()
+        printer, err = self.get_printer()
         printer.cleanup()
         printer.cleanup()
         printer = None
 
     def test_print_config(self):
-        printer, err, out = self.get_printer()
+        printer, err = self.get_printer()
         # FIXME: it's lame that i have to set these options directly.
         printer._options.pixel_tests = True
         printer._options.new_baseline = True
         printer._options.time_out_ms = 6000
         printer._options.slow_time_out_ms = 12000
         printer.print_config('/tmp')
-        self.assertTrue("Using port 'test-mac-leopard'" in err.getvalue())
-        self.assertTrue('Test configuration: <leopard, x86, release>' in err.getvalue())
-        self.assertTrue('Placing test results in /tmp' in err.getvalue())
-        self.assertTrue('Baseline search path: test-mac-leopard -> test-mac-snowleopard -> generic' in err.getvalue())
-        self.assertTrue('Using Release build' in err.getvalue())
-        self.assertTrue('Pixel tests enabled' in err.getvalue())
-        self.assertTrue('Command line:' in err.getvalue())
-        self.assertTrue('Regular timeout: ' in err.getvalue())
+        self.assertIn("Using port 'test-mac-leopard'", err.getvalue())
+        self.assertIn('Test configuration: <leopard, x86, release>', err.getvalue())
+        self.assertIn('Placing test results in /tmp', err.getvalue())
+        self.assertIn('Baseline search path: test-mac-leopard -> test-mac-snowleopard -> generic', err.getvalue())
+        self.assertIn('Using Release build', err.getvalue())
+        self.assertIn('Pixel tests enabled', err.getvalue())
+        self.assertIn('Command line:', err.getvalue())
+        self.assertIn('Regular timeout: ', err.getvalue())
 
         self.reset(err)
         printer._options.quiet = True
         printer.print_config('/tmp')
-        self.assertFalse('Baseline search path: test-mac-leopard -> test-mac-snowleopard -> generic' in err.getvalue())
+        self.assertNotIn('Baseline search path: test-mac-leopard -> test-mac-snowleopard -> generic', err.getvalue())
 
     def test_print_one_line_summary(self):
-        printer, err, out = self.get_printer()
+        printer, err = self.get_printer()
         printer._print_one_line_summary(1, 1, 0)
         self.assertWritten(err, ["The test ran as expected.\n", "\n"])
 
-        printer, err, out = self.get_printer()
+        printer, err = self.get_printer()
         printer._print_one_line_summary(1, 1, 0)
         self.assertWritten(err, ["The test ran as expected.\n", "\n"])
 
-        printer, err, out = self.get_printer()
+        printer, err = self.get_printer()
         printer._print_one_line_summary(2, 1, 1)
         self.assertWritten(err, ["\n", "1 test ran as expected, 1 didn't:\n", "\n"])
 
-        printer, err, out = self.get_printer()
+        printer, err = self.get_printer()
         printer._print_one_line_summary(3, 2, 1)
         self.assertWritten(err, ["\n", "2 tests ran as expected, 1 didn't:\n", "\n"])
 
-        printer, err, out = self.get_printer()
+        printer, err = self.get_printer()
         printer._print_one_line_summary(3, 2, 0)
         self.assertWritten(err, ['\n', "2 tests ran as expected (1 didn't run).\n", '\n'])
 
-    def test_print_unexpected_results(self):
-        # This routine is the only one that prints stuff that the bots
-        # care about.
-        #
-        # FIXME: there's some weird layering going on here. It seems
-        # like we shouldn't be both using an expectations string and
-        # having to specify whether or not the result was expected.
-        # This whole set of tests should probably be rewritten.
-        #
-        # FIXME: Plus, the fact that we're having to call into
-        # run_webkit_tests is clearly a layering inversion.
-        def get_unexpected_results(expected, passing, flaky):
-            """Return an unexpected results summary matching the input description.
-
-            There are a lot of different combinations of test results that
-            can be tested; this routine produces various combinations based
-            on the values of the input flags.
-
-            Args
-                expected: whether the tests ran as expected
-                passing: whether the tests should all pass
-                flaky: whether the tests should be flaky (if False, they
-                    produce the same results on both runs; if True, they
-                    all pass on the second run).
-
-            """
-            test_is_slow = False
-            paths, rs, exp = self.get_result_summary(tests, expectations)
-            if expected:
-                rs.add(self.get_result('passes/text.html', test_expectations.PASS), expected, test_is_slow)
-                rs.add(self.get_result('failures/expected/timeout.html', test_expectations.TIMEOUT), expected, test_is_slow)
-                rs.add(self.get_result('failures/expected/crash.html', test_expectations.CRASH), expected, test_is_slow)
-            elif passing:
-                rs.add(self.get_result('passes/text.html'), expected, test_is_slow)
-                rs.add(self.get_result('failures/expected/timeout.html'), expected, test_is_slow)
-                rs.add(self.get_result('failures/expected/crash.html'), expected, test_is_slow)
-            else:
-                rs.add(self.get_result('passes/text.html', test_expectations.TIMEOUT), expected, test_is_slow)
-                rs.add(self.get_result('failures/expected/timeout.html', test_expectations.CRASH), expected, test_is_slow)
-                rs.add(self.get_result('failures/expected/crash.html', test_expectations.TIMEOUT), expected, test_is_slow)
-            retry = rs
-            if flaky:
-                paths, retry, exp = self.get_result_summary(tests, expectations)
-                retry.add(self.get_result('passes/text.html'), True, test_is_slow)
-                retry.add(self.get_result('failures/expected/timeout.html'), True, test_is_slow)
-                retry.add(self.get_result('failures/expected/crash.html'), True, test_is_slow)
-            unexpected_results = manager.summarize_results(self._port, exp, rs, retry, test_timings={}, only_unexpected=True, interrupted=False)
-            return unexpected_results
-
-        tests = ['passes/text.html', 'failures/expected/timeout.html', 'failures/expected/crash.html']
-        expectations = ''
-
-        printer, err, out = self.get_printer()
-
-        # test everything running as expected
-        ur = get_unexpected_results(expected=True, passing=False, flaky=False)
-        printer._print_unexpected_results(ur)
-        self.assertEmpty(err)
-        self.assertEmpty(out)
-
-        # test failures
-        printer, err, out = self.get_printer()
-        ur = get_unexpected_results(expected=False, passing=False, flaky=False)
-        printer._print_unexpected_results(ur)
-        self.assertEmpty(err)
-        self.assertNotEmpty(out)
-
-        # test unexpected flaky
-        printer, err, out = self.get_printer()
-        ur = get_unexpected_results(expected=False, passing=False, flaky=True)
-        printer._print_unexpected_results(ur)
-        self.assertEmpty(err)
-        self.assertNotEmpty(out)
-
-        printer, err, out = self.get_printer()
-        ur = get_unexpected_results(expected=False, passing=False, flaky=False)
-        printer._print_unexpected_results(ur)
-        self.assertEmpty(err)
-        self.assertNotEmpty(out)
-
-        expectations = """
-BUGX : failures/expected/crash.html = CRASH
-BUGX : failures/expected/timeout.html = TIMEOUT
-"""
-        printer, err, out = self.get_printer()
-        ur = get_unexpected_results(expected=False, passing=False, flaky=False)
-        printer._print_unexpected_results(ur)
-        self.assertEmpty(err)
-        self.assertNotEmpty(out)
-
-        printer, err, out = self.get_printer()
-        ur = get_unexpected_results(expected=False, passing=True, flaky=False)
-        printer._print_unexpected_results(ur)
-        self.assertEmpty(err)
-        self.assertNotEmpty(out)
-
-    def test_print_unexpected_results_buildbot(self):
-        # FIXME: Test that print_unexpected_results() produces the printer the
-        # buildbot is expecting.
-        pass
-
     def test_test_status_line(self):
-        printer, _, _ = self.get_printer()
+        printer, _ = self.get_printer()
         printer._meter.number_of_columns = lambda: 80
         actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed')
-        self.assertEquals(80, len(actual))
-        self.assertEquals(actual, '[0/0] fast/dom/HTMLFormElement/associa...after-index-assertion-fail1.html passed')
+        self.assertEqual(80, len(actual))
+        self.assertEqual(actual, '[0/0] fast/dom/HTMLFormElement/associa...after-index-assertion-fail1.html passed')
 
         printer._meter.number_of_columns = lambda: 89
         actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed')
-        self.assertEquals(89, len(actual))
-        self.assertEquals(actual, '[0/0] fast/dom/HTMLFormElement/associated-...ents-after-index-assertion-fail1.html passed')
+        self.assertEqual(89, len(actual))
+        self.assertEqual(actual, '[0/0] fast/dom/HTMLFormElement/associated-...ents-after-index-assertion-fail1.html passed')
 
         printer._meter.number_of_columns = lambda: sys.maxint
         actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed')
-        self.assertEquals(90, len(actual))
-        self.assertEquals(actual, '[0/0] fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html passed')
+        self.assertEqual(90, len(actual))
+        self.assertEqual(actual, '[0/0] fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html passed')
 
         printer._meter.number_of_columns = lambda: 18
         actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed')
-        self.assertEquals(18, len(actual))
-        self.assertEquals(actual, '[0/0] f...l passed')
+        self.assertEqual(18, len(actual))
+        self.assertEqual(actual, '[0/0] f...l passed')
 
         printer._meter.number_of_columns = lambda: 10
         actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed')
-        self.assertEquals(actual, '[0/0] associated-elements-after-index-assertion-fail1.html passed')
+        self.assertEqual(actual, '[0/0] associated-elements-after-index-assertion-fail1.html passed')
 
     def test_details(self):
-        printer, err, _ = self.get_printer(['--details'])
+        printer, err = self.get_printer(['--details'])
         result = self.get_result('passes/image.html')
         printer.print_started_test('passes/image.html')
         printer.print_finished_test(result, expected=False, exp_str='', got_str='')
         self.assertNotEmpty(err)
 
+    def test_print_found(self):
+        printer, err = self.get_printer()
 
-if __name__ == '__main__':
-    unittest.main()
+        printer.print_found(100, 10, 1, 1)
+        self.assertWritten(err, ["Found 100 tests; running 10, skipping 90.\n"])
+
+        self.reset(err)
+        printer.print_found(100, 10, 2, 3)
+        self.assertWritten(err, ["Found 100 tests; running 10 (6 times each: --repeat-each=2 --iterations=3), skipping 90.\n"])
diff --git a/Tools/Scripts/webkitpy/performance_tests/perftest.py b/Tools/Scripts/webkitpy/performance_tests/perftest.py
index 9e2f87d..29a796f 100644
--- a/Tools/Scripts/webkitpy/performance_tests/perftest.py
+++ b/Tools/Scripts/webkitpy/performance_tests/perftest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2012 Google Inc. All rights reserved.
 # Copyright (C) 2012 Zoltan Horvath, Adobe Systems Incorporated. All rights reserved.
 #
@@ -49,33 +48,163 @@
 from webkitpy.layout_tests.port.driver import DriverInput
 from webkitpy.layout_tests.port.driver import DriverOutput
 
+DEFAULT_TEST_RUNNER_COUNT = 4
 
 _log = logging.getLogger(__name__)
 
 
+class PerfTestMetric(object):
+    def __init__(self, metric, unit=None, iterations=None):
+        # FIXME: Fix runner.js to report correct metric names
+        self._iterations = iterations or []
+        self._unit = unit or self.metric_to_unit(metric)
+        self._metric = self.time_unit_to_metric(self._unit) if metric == 'Time' else metric
+
+    def name(self):
+        return self._metric
+
+    def has_values(self):
+        return bool(self._iterations)
+
+    def append_group(self, group_values):
+        assert isinstance(group_values, list)
+        self._iterations.append(group_values)
+
+    def grouped_iteration_values(self):
+        return self._iterations
+
+    def flattened_iteration_values(self):
+        return [value for group_values in self._iterations for value in group_values]
+
+    def unit(self):
+        return self._unit
+
+    @staticmethod
+    def metric_to_unit(metric):
+        assert metric in ('Time', 'Malloc', 'JSHeap')
+        return 'ms' if metric == 'Time' else 'bytes'
+
+    @staticmethod
+    def time_unit_to_metric(unit):
+        return {'fps': 'FrameRate', 'runs/s': 'Runs', 'ms': 'Time'}[unit]
+
+
 class PerfTest(object):
-    def __init__(self, port, test_name, path_or_url):
+
+    def __init__(self, port, test_name, test_path, test_runner_count=DEFAULT_TEST_RUNNER_COUNT):
         self._port = port
         self._test_name = test_name
-        self._path_or_url = path_or_url
+        self._test_path = test_path
+        self._description = None
+        self._metrics = {}
+        self._ordered_metrics_name = []
+        self._test_runner_count = test_runner_count
 
     def test_name(self):
         return self._test_name
 
-    def path_or_url(self):
-        return self._path_or_url
+    def test_name_without_file_extension(self):
+        return re.sub(r'\.\w+$', '', self.test_name())
+
+    def test_path(self):
+        return self._test_path
+
+    def description(self):
+        return self._description
 
     def prepare(self, time_out_ms):
         return True
 
-    def run(self, driver, time_out_ms):
-        output = self.run_single(driver, self.path_or_url(), time_out_ms)
-        if self.run_failed(output):
-            return None
-        return self.parse_output(output)
+    def _create_driver(self):
+        return self._port.create_driver(worker_number=0, no_timeout=True)
 
-    def run_single(self, driver, path_or_url, time_out_ms, should_run_pixel_test=False):
-        return driver.run_test(DriverInput(path_or_url, time_out_ms, image_hash=None, should_run_pixel_test=should_run_pixel_test), stop_when_done=False)
+    def run(self, time_out_ms):
+        for _ in xrange(self._test_runner_count):
+            driver = self._create_driver()
+            try:
+                if not self._run_with_driver(driver, time_out_ms):
+                    return None
+            finally:
+                driver.stop()
+
+        should_log = not self._port.get_option('profile')
+        if should_log and self._description:
+            _log.info('DESCRIPTION: %s' % self._description)
+
+        results = {}
+        for metric_name in self._ordered_metrics_name:
+            metric = self._metrics[metric_name]
+            results[metric.name()] = metric.grouped_iteration_values()
+            if should_log:
+                legacy_chromium_bot_compatible_name = self.test_name_without_file_extension().replace('/', ': ')
+                self.log_statistics(legacy_chromium_bot_compatible_name + ': ' + metric.name(),
+                    metric.flattened_iteration_values(), metric.unit())
+
+        return results
+
+    @staticmethod
+    def log_statistics(test_name, values, unit):
+        sorted_values = sorted(values)
+
+        # Compute the mean and variance using Knuth's online algorithm (has good numerical stability).
+        square_sum = 0
+        mean = 0
+        for i, time in enumerate(sorted_values):
+            delta = time - mean
+            sweep = i + 1.0
+            mean += delta / sweep
+            square_sum += delta * (time - mean)
+
+        middle = int(len(sorted_values) / 2)
+        mean = sum(sorted_values) / len(values)
+        median = sorted_values[middle] if len(sorted_values) % 2 else (sorted_values[middle - 1] + sorted_values[middle]) / 2
+        stdev = math.sqrt(square_sum / (len(sorted_values) - 1)) if len(sorted_values) > 1 else 0
+
+        _log.info('RESULT %s= %s %s' % (test_name, mean, unit))
+        _log.info('median= %s %s, stdev= %s %s, min= %s %s, max= %s %s' %
+            (median, unit, stdev, unit, sorted_values[0], unit, sorted_values[-1], unit))
+
+    _description_regex = re.compile(r'^Description: (?P<description>.*)$', re.IGNORECASE)
+    _metrics_regex = re.compile(r'^(?P<metric>Time|Malloc|JS Heap):')
+    _statistics_keys = ['avg', 'median', 'stdev', 'min', 'max', 'unit', 'values']
+    _score_regex = re.compile(r'^(?P<key>' + r'|'.join(_statistics_keys) + r')\s+(?P<value>([0-9\.]+(,\s+)?)+)\s*(?P<unit>.*)')
+
+    def _run_with_driver(self, driver, time_out_ms):
+        output = self.run_single(driver, self.test_path(), time_out_ms)
+        self._filter_output(output)
+        if self.run_failed(output):
+            return False
+
+        current_metric = None
+        for line in re.split('\n', output.text):
+            description_match = self._description_regex.match(line)
+            metric_match = self._metrics_regex.match(line)
+            score = self._score_regex.match(line)
+
+            if description_match:
+                self._description = description_match.group('description')
+            elif metric_match:
+                current_metric = metric_match.group('metric').replace(' ', '')
+            elif score:
+                if score.group('key') != 'values':
+                    continue
+
+                metric = self._ensure_metrics(current_metric, score.group('unit'))
+                metric.append_group(map(lambda value: float(value), score.group('value').split(', ')))
+            else:
+                _log.error('ERROR: ' + line)
+                return False
+
+        return True
+
+    def _ensure_metrics(self, metric_name, unit=None):
+        if metric_name not in self._metrics:
+            self._metrics[metric_name] = PerfTestMetric(metric_name, unit)
+            self._ordered_metrics_name.append(metric_name)
+        return self._metrics[metric_name]
+
+    def run_single(self, driver, test_path, time_out_ms, should_run_pixel_test=False):
+        return driver.run_test(DriverInput(test_path, time_out_ms, image_hash=None, should_run_pixel_test=should_run_pixel_test), stop_when_done=False)
 
     def run_failed(self, output):
         if output.text == None or output.error:
@@ -92,6 +221,24 @@
 
         return True
 
+    @staticmethod
+    def _should_ignore_line(regexps, line):
+        if not line:
+            return True
+        for regexp in regexps:
+            if regexp.search(line):
+                return True
+        return False
+
+    _lines_to_ignore_in_stderr = [
+        re.compile(r'^Unknown option:'),
+        re.compile(r'^\[WARNING:proxy_service.cc'),
+        re.compile(r'^\[INFO:'),
+        # These stderr messages come from content_shell on chromium-linux.
+        re.compile(r'INFO:SkFontHost_fontconfig.cpp'),
+        re.compile(r'Running without the SUID sandbox'),
+    ]
+
     _lines_to_ignore_in_parser_result = [
         re.compile(r'^Running \d+ times$'),
         re.compile(r'^Ignoring warm-up '),
@@ -102,99 +249,52 @@
         re.compile(re.escape("""frame "<!--framePath //<!--frame0-->-->" - has 1 onunload handler(s)""")),
         re.compile(re.escape("""frame "<!--framePath //<!--frame0-->/<!--frame0-->-->" - has 1 onunload handler(s)""")),
         # Following is for html5.html
-        re.compile(re.escape("""Blocked access to external URL http://www.whatwg.org/specs/web-apps/current-work/"""))]
+        re.compile(re.escape("""Blocked access to external URL http://www.whatwg.org/specs/web-apps/current-work/""")),
+        re.compile(r"CONSOLE MESSAGE: (line \d+: )?Blocked script execution in '[A-Za-z0-9\-\.:]+' because the document's frame is sandboxed and the 'allow-scripts' permission is not set."),
+        re.compile(r"CONSOLE MESSAGE: (line \d+: )?Not allowed to load local resource"),
+        # Dromaeo reports values for subtests. Ignore them for now.
+        re.compile(r'(?P<name>.+): \[(?P<values>(\d+(.\d+)?,\s+)*\d+(.\d+)?)\]'),
+    ]
 
-    def _should_ignore_line_in_parser_test_result(self, line):
-        if not line:
-            return True
-        for regex in self._lines_to_ignore_in_parser_result:
-            if regex.search(line):
-                return True
-        return False
+    def _filter_output(self, output):
+        if output.error:
+            output.error = '\n'.join([line for line in re.split('\n', output.error) if not self._should_ignore_line(self._lines_to_ignore_in_stderr, line)])
+        if output.text:
+            output.text = '\n'.join([line for line in re.split('\n', output.text) if not self._should_ignore_line(self._lines_to_ignore_in_parser_result, line)])
 
-    _description_regex = re.compile(r'^Description: (?P<description>.*)$', re.IGNORECASE)
-    _result_classes = ['Time', 'JS Heap', 'Malloc']
-    _result_class_regex = re.compile(r'^(?P<resultclass>' + r'|'.join(_result_classes) + '):')
-    _statistics_keys = ['avg', 'median', 'stdev', 'min', 'max', 'unit', 'values']
-    _score_regex = re.compile(r'^(?P<key>' + r'|'.join(_statistics_keys) + r')\s+(?P<value>([0-9\.]+(,\s+)?)+)\s*(?P<unit>.*)')
 
-    def parse_output(self, output):
-        test_failed = False
-        results = {}
-        ordered_results_keys = []
-        test_name = re.sub(r'\.\w+$', '', self._test_name)
-        description_string = ""
-        result_class = ""
-        for line in re.split('\n', output.text):
-            description = self._description_regex.match(line)
-            if description:
-                description_string = description.group('description')
-                continue
-
-            result_class_match = self._result_class_regex.match(line)
-            if result_class_match:
-                result_class = result_class_match.group('resultclass')
-                continue
-
-            score = self._score_regex.match(line)
-            if score:
-                key = score.group('key')
-                if key == 'values':
-                    value = [float(number) for number in score.group('value').split(', ')]
-                else:
-                    value = float(score.group('value'))
-                unit = score.group('unit')
-                name = test_name
-                if result_class != 'Time':
-                    name += ':' + result_class.replace(' ', '')
-                if name not in ordered_results_keys:
-                    ordered_results_keys.append(name)
-                results.setdefault(name, {})
-                results[name]['unit'] = unit
-                results[name][key] = value
-                continue
-
-            if not self._should_ignore_line_in_parser_test_result(line):
-                test_failed = True
-                _log.error(line)
-
-        if test_failed:
-            return None
-
-        if set(self._statistics_keys) != set(results[test_name].keys() + ['values']):
-            # values is not provided by Dromaeo tests.
-            _log.error("The test didn't report all statistics.")
-            return None
-
-        for result_name in ordered_results_keys:
-            if result_name == test_name:
-                self.output_statistics(result_name, results[result_name], description_string)
-            else:
-                self.output_statistics(result_name, results[result_name])
-        return results
-
-    def output_statistics(self, test_name, results, description_string=None):
-        unit = results['unit']
-        if description_string:
-            _log.info('DESCRIPTION: %s' % description_string)
-        _log.info('RESULT %s= %s %s' % (test_name.replace(':', ': ').replace('/', ': '), results['avg'], unit))
-        _log.info(', '.join(['%s= %s %s' % (key, results[key], unit) for key in self._statistics_keys[1:5]]))
+class SingleProcessPerfTest(PerfTest):
+    def __init__(self, port, test_name, test_path, test_runner_count=1):
+        super(SingleProcessPerfTest, self).__init__(port, test_name, test_path, test_runner_count)
 
 
 class ChromiumStylePerfTest(PerfTest):
     _chromium_style_result_regex = re.compile(r'^RESULT\s+(?P<name>[^=]+)\s*=\s+(?P<value>\d+(\.\d+)?)\s*(?P<unit>\w+)$')
 
-    def __init__(self, port, test_name, path_or_url):
-        super(ChromiumStylePerfTest, self).__init__(port, test_name, path_or_url)
+    def __init__(self, port, test_name, test_path, test_runner_count=DEFAULT_TEST_RUNNER_COUNT):
+        super(ChromiumStylePerfTest, self).__init__(port, test_name, test_path, test_runner_count)
 
-    def parse_output(self, output):
+    def run(self, time_out_ms):
+        driver = self._create_driver()
+        try:
+            output = self.run_single(driver, self.test_path(), time_out_ms)
+        finally:
+            driver.stop()
+
+        self._filter_output(output)
+        if self.run_failed(output):
+            return None
+
+        return self.parse_and_log_output(output)
+
+    def parse_and_log_output(self, output):
         test_failed = False
         results = {}
         for line in re.split('\n', output.text):
             resultLine = ChromiumStylePerfTest._chromium_style_result_regex.match(line)
             if resultLine:
                 # FIXME: Store the unit
-                results[self.test_name() + ':' + resultLine.group('name').replace(' ', '')] = float(resultLine.group('value'))
+                results[resultLine.group('name').replace(' ', '')] = float(resultLine.group('value'))
                 _log.info(line)
             elif not len(line) == 0:
                 test_failed = True
@@ -202,69 +302,6 @@
         return results if results and not test_failed else None
 
 
-class PageLoadingPerfTest(PerfTest):
-    _FORCE_GC_FILE = 'resources/force-gc.html'
-
-    def __init__(self, port, test_name, path_or_url):
-        super(PageLoadingPerfTest, self).__init__(port, test_name, path_or_url)
-        self.force_gc_test = self._port.host.filesystem.join(self._port.perf_tests_dir(), self._FORCE_GC_FILE)
-
-    def run_single(self, driver, path_or_url, time_out_ms, should_run_pixel_test=False):
-        # Force GC to prevent pageload noise. See https://bugs.webkit.org/show_bug.cgi?id=98203
-        super(PageLoadingPerfTest, self).run_single(driver, self.force_gc_test, time_out_ms, False)
-        return super(PageLoadingPerfTest, self).run_single(driver, path_or_url, time_out_ms, should_run_pixel_test)
-
-    def calculate_statistics(self, values):
-        sorted_values = sorted(values)
-
-        # Compute the mean and variance using Knuth's online algorithm (has good numerical stability).
-        squareSum = 0
-        mean = 0
-        for i, time in enumerate(sorted_values):
-            delta = time - mean
-            sweep = i + 1.0
-            mean += delta / sweep
-            squareSum += delta * (time - mean)
-
-        middle = int(len(sorted_values) / 2)
-        result = {'avg': mean,
-            'min': sorted_values[0],
-            'max': sorted_values[-1],
-            'median': sorted_values[middle] if len(sorted_values) % 2 else (sorted_values[middle - 1] + sorted_values[middle]) / 2,
-            'stdev': math.sqrt(squareSum / (len(sorted_values) - 1))}
-        return result
-
-    def run(self, driver, time_out_ms):
-        results = {}
-        results.setdefault(self.test_name(), {'unit': 'ms', 'values': []})
-
-        for i in range(0, 20):
-            output = self.run_single(driver, self.path_or_url(), time_out_ms)
-            if not output or self.run_failed(output):
-                return None
-            if i == 0:
-                continue
-
-            results[self.test_name()]['values'].append(output.test_time * 1000)
-
-            if not output.measurements:
-                continue
-
-            for result_class, result in output.measurements.items():
-                name = self.test_name() + ':' + result_class
-                if not name in results:
-                    results.setdefault(name, {'values': []})
-                results[name]['values'].append(result)
-                if result_class == 'Malloc' or result_class == 'JSHeap':
-                    results[name]['unit'] = 'bytes'
-
-        for result_class in results.keys():
-            results[result_class].update(self.calculate_statistics(results[result_class]['values']))
-            self.output_statistics(result_class, results[result_class], '')
-
-        return results
-
-
 class ReplayServer(object):
     def __init__(self, archive, record):
         self._process = None
@@ -300,9 +337,12 @@
         self.stop()
 
 
-class ReplayPerfTest(PageLoadingPerfTest):
-    def __init__(self, port, test_name, path_or_url):
-        super(ReplayPerfTest, self).__init__(port, test_name, path_or_url)
+class ReplayPerfTest(PerfTest):
+    _FORCE_GC_FILE = 'resources/force-gc.html'
+
+    def __init__(self, port, test_name, test_path, test_runner_count=DEFAULT_TEST_RUNNER_COUNT):
+        super(ReplayPerfTest, self).__init__(port, test_name, test_path, test_runner_count)
+        self.force_gc_test = self._port.host.filesystem.join(self._port.perf_tests_dir(), self._FORCE_GC_FILE)
 
     def _start_replay_server(self, archive, record):
         try:
@@ -315,11 +355,11 @@
 
     def prepare(self, time_out_ms):
         filesystem = self._port.host.filesystem
-        path_without_ext = filesystem.splitext(self.path_or_url())[0]
+        path_without_ext = filesystem.splitext(self.test_path())[0]
 
         self._archive_path = filesystem.join(path_without_ext + '.wpr')
         self._expected_image_path = filesystem.join(path_without_ext + '-expected.png')
-        self._url = filesystem.read_text_file(self.path_or_url()).split('\n')[0]
+        self._url = filesystem.read_text_file(self.test_path()).split('\n')[0]
 
         if filesystem.isfile(self._archive_path) and filesystem.isfile(self._expected_image_path):
             _log.info("Replay ready for %s" % self._archive_path)
@@ -327,7 +367,7 @@
 
         _log.info("Preparing replay for %s" % self.test_name())
 
-        driver = self._port.create_driver(worker_number=1, no_timeout=True)
+        driver = self._port.create_driver(worker_number=0, no_timeout=True)
         try:
             output = self.run_single(driver, self._archive_path, time_out_ms, record=True)
         finally:
@@ -341,6 +381,39 @@
 
         return True
 
+    def _run_with_driver(self, driver, time_out_ms):
+        times = []
+        malloc = []
+        js_heap = []
+
+        for i in range(0, 6):
+            output = self.run_single(driver, self.test_path(), time_out_ms)
+            if not output or self.run_failed(output):
+                return False
+            if i == 0:
+                continue
+
+            times.append(output.test_time * 1000)
+
+            if not output.measurements:
+                continue
+
+            for metric, result in output.measurements.items():
+                assert metric == 'Malloc' or metric == 'JSHeap'
+                if metric == 'Malloc':
+                    malloc.append(result)
+                else:
+                    js_heap.append(result)
+
+        if times:
+            self._ensure_metrics('Time').append_group(times)
+        if malloc:
+            self._ensure_metrics('Malloc').append_group(malloc)
+        if js_heap:
+            self._ensure_metrics('JSHeap').append_group(js_heap)
+
+        return True
+
     def run_single(self, driver, url, time_out_ms, record=False):
         server = self._start_replay_server(self._archive_path, record)
         if not server:
@@ -354,6 +427,8 @@
                 return None
 
             _log.debug("Web page replay started. Loading the page.")
+            # Force GC to prevent pageload noise. See https://bugs.webkit.org/show_bug.cgi?id=98203
+            super(ReplayPerfTest, self).run_single(driver, self.force_gc_test, time_out_ms, False)
             output = super(ReplayPerfTest, self).run_single(driver, self._url, time_out_ms, should_run_pixel_test=True)
             if self.run_failed(output):
                 return None
@@ -380,13 +455,14 @@
 class PerfTestFactory(object):
 
     _pattern_map = [
+        (re.compile(r'^Dromaeo/'), SingleProcessPerfTest),
         (re.compile(r'^inspector/'), ChromiumStylePerfTest),
         (re.compile(r'(.+)\.replay$'), ReplayPerfTest),
     ]
 
     @classmethod
-    def create_perf_test(cls, port, test_name, path):
+    def create_perf_test(cls, port, test_name, path, test_runner_count=DEFAULT_TEST_RUNNER_COUNT):
         for (pattern, test_class) in cls._pattern_map:
             if pattern.match(test_name):
-                return test_class(port, test_name, path)
-        return PerfTest(port, test_name, path)
+                return test_class(port, test_name, path, test_runner_count)
+        return PerfTest(port, test_name, path, test_runner_count)
diff --git a/Tools/Scripts/webkitpy/performance_tests/perftest_unittest.py b/Tools/Scripts/webkitpy/performance_tests/perftest_unittest.py
old mode 100755
new mode 100644
index 259fc78..8b299b8
--- a/Tools/Scripts/webkitpy/performance_tests/perftest_unittest.py
+++ b/Tools/Scripts/webkitpy/performance_tests/perftest_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -28,8 +27,9 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import StringIO
+import json
 import math
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -37,144 +37,202 @@
 from webkitpy.layout_tests.port.test import TestDriver
 from webkitpy.layout_tests.port.test import TestPort
 from webkitpy.performance_tests.perftest import ChromiumStylePerfTest
-from webkitpy.performance_tests.perftest import PageLoadingPerfTest
 from webkitpy.performance_tests.perftest import PerfTest
+from webkitpy.performance_tests.perftest import PerfTestMetric
 from webkitpy.performance_tests.perftest import PerfTestFactory
 from webkitpy.performance_tests.perftest import ReplayPerfTest
+from webkitpy.performance_tests.perftest import SingleProcessPerfTest
 
 
 class MockPort(TestPort):
     def __init__(self, custom_run_test=None):
         super(MockPort, self).__init__(host=MockHost(), custom_run_test=custom_run_test)
 
-class MainTest(unittest.TestCase):
+
+class TestPerfTestMetric(unittest.TestCase):
+    def test_init_set_missing_unit(self):
+        self.assertEqual(PerfTestMetric('Time', iterations=[1, 2, 3, 4, 5]).unit(), 'ms')
+        self.assertEqual(PerfTestMetric('Malloc', iterations=[1, 2, 3, 4, 5]).unit(), 'bytes')
+        self.assertEqual(PerfTestMetric('JSHeap', iterations=[1, 2, 3, 4, 5]).unit(), 'bytes')
+
+    def test_init_set_time_metric(self):
+        self.assertEqual(PerfTestMetric('Time', 'ms').name(), 'Time')
+        self.assertEqual(PerfTestMetric('Time', 'fps').name(), 'FrameRate')
+        self.assertEqual(PerfTestMetric('Time', 'runs/s').name(), 'Runs')
+
+    def test_has_values(self):
+        self.assertFalse(PerfTestMetric('Time').has_values())
+        self.assertTrue(PerfTestMetric('Time', iterations=[1]).has_values())
+
+    def test_append(self):
+        metric = PerfTestMetric('Time')
+        metric2 = PerfTestMetric('Time')
+        self.assertFalse(metric.has_values())
+        self.assertFalse(metric2.has_values())
+
+        metric.append_group([1])
+        self.assertTrue(metric.has_values())
+        self.assertFalse(metric2.has_values())
+        self.assertEqual(metric.grouped_iteration_values(), [[1]])
+        self.assertEqual(metric.flattened_iteration_values(), [1])
+
+        metric.append_group([2])
+        self.assertEqual(metric.grouped_iteration_values(), [[1], [2]])
+        self.assertEqual(metric.flattened_iteration_values(), [1, 2])
+
+        metric2.append_group([3])
+        self.assertTrue(metric2.has_values())
+        self.assertEqual(metric.flattened_iteration_values(), [1, 2])
+        self.assertEqual(metric2.flattened_iteration_values(), [3])
+
+        metric.append_group([4, 5])
+        self.assertEqual(metric.grouped_iteration_values(), [[1], [2], [4, 5]])
+        self.assertEqual(metric.flattened_iteration_values(), [1, 2, 4, 5])
+
+
+class TestPerfTest(unittest.TestCase):
+    def _assert_results_are_correct(self, test, output):
+        test.run_single = lambda driver, path, time_out_ms: output
+        self.assertTrue(test._run_with_driver(None, None))
+        self.assertEqual(test._metrics.keys(), ['Time'])
+        self.assertEqual(test._metrics['Time'].flattened_iteration_values(), [1080, 1120, 1095, 1101, 1104])
+
     def test_parse_output(self):
-        output = DriverOutput('\n'.join([
-            'Running 20 times',
-            'Ignoring warm-up run (1115)',
-            '',
-            'Time:',
-            'values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ms',
-            'avg 1100 ms',
-            'median 1101 ms',
-            'stdev 11 ms',
-            'min 1080 ms',
-            'max 1120 ms']), image=None, image_hash=None, audio=None)
+        output = DriverOutput("""
+Running 20 times
+Ignoring warm-up run (1115)
+
+Time:
+values 1080, 1120, 1095, 1101, 1104 ms
+avg 1100 ms
+median 1101 ms
+stdev 14.50862 ms
+min 1080 ms
+max 1120 ms
+""", image=None, image_hash=None, audio=None)
         output_capture = OutputCapture()
         output_capture.capture_output()
         try:
-            test = PerfTest(None, 'some-test', '/path/some-dir/some-test')
-            self.assertEqual(test.parse_output(output),
-                {'some-test': {'avg': 1100.0, 'median': 1101.0, 'min': 1080.0, 'max': 1120.0, 'stdev': 11.0, 'unit': 'ms',
-                    'values': [i for i in range(1, 20)]}})
+            test = PerfTest(MockPort(), 'some-test', '/path/some-dir/some-test')
+            self._assert_results_are_correct(test, output)
         finally:
-            pass
             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
         self.assertEqual(actual_stdout, '')
         self.assertEqual(actual_stderr, '')
-        self.assertEqual(actual_logs, 'RESULT some-test= 1100.0 ms\nmedian= 1101.0 ms, stdev= 11.0 ms, min= 1080.0 ms, max= 1120.0 ms\n')
+        self.assertEqual(actual_logs, '')
 
     def test_parse_output_with_failing_line(self):
-        output = DriverOutput('\n'.join([
-            'Running 20 times',
-            'Ignoring warm-up run (1115)',
-            '',
-            'some-unrecognizable-line',
-            '',
-            'Time:'
-            'values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ms',
-            'avg 1100 ms',
-            'median 1101 ms',
-            'stdev 11 ms',
-            'min 1080 ms',
-            'max 1120 ms']), image=None, image_hash=None, audio=None)
+        output = DriverOutput("""
+Running 20 times
+Ignoring warm-up run (1115)
+
+some-unrecognizable-line
+
+Time:
+values 1080, 1120, 1095, 1101, 1104 ms
+avg 1100 ms
+median 1101 ms
+stdev 14.50862 ms
+min 1080 ms
+max 1120 ms
+""", image=None, image_hash=None, audio=None)
         output_capture = OutputCapture()
         output_capture.capture_output()
         try:
-            test = PerfTest(None, 'some-test', '/path/some-dir/some-test')
-            self.assertEqual(test.parse_output(output), None)
+            test = PerfTest(MockPort(), 'some-test', '/path/some-dir/some-test')
+            test.run_single = lambda driver, path, time_out_ms: output
+            self.assertFalse(test._run_with_driver(None, None))
         finally:
             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
         self.assertEqual(actual_stdout, '')
         self.assertEqual(actual_stderr, '')
-        self.assertEqual(actual_logs, 'some-unrecognizable-line\n')
+        self.assertEqual(actual_logs, 'ERROR: some-unrecognizable-line\n')
 
+    def test_parse_output_with_description(self):
+        output = DriverOutput("""
+Description: this is a test description.
 
-class TestPageLoadingPerfTest(unittest.TestCase):
-    class MockDriver(object):
-        def __init__(self, values, test, measurements=None):
-            self._values = values
-            self._index = 0
-            self._test = test
-            self._measurements = measurements
+Running 20 times
+Ignoring warm-up run (1115)
 
-        def run_test(self, input, stop_when_done):
-            if input.test_name == self._test.force_gc_test:
-                return
-            value = self._values[self._index]
-            self._index += 1
-            if isinstance(value, str):
-                return DriverOutput('some output', image=None, image_hash=None, audio=None, error=value)
-            else:
-                return DriverOutput('some output', image=None, image_hash=None, audio=None, test_time=self._values[self._index - 1], measurements=self._measurements)
+Time:
+values 1080, 1120, 1095, 1101, 1104 ms
+avg 1100 ms
+median 1101 ms
+stdev 14.50862 ms
+min 1080 ms
+max 1120 ms""", image=None, image_hash=None, audio=None)
+        test = PerfTest(MockPort(), 'some-test', '/path/some-dir/some-test')
+        self._assert_results_are_correct(test, output)
+        self.assertEqual(test.description(), 'this is a test description.')
 
-    def test_run(self):
-        port = MockPort()
-        test = PageLoadingPerfTest(port, 'some-test', '/path/some-dir/some-test')
-        driver = TestPageLoadingPerfTest.MockDriver(range(1, 21), test)
+    def test_ignored_stderr_lines(self):
+        test = PerfTest(MockPort(), 'some-test', '/path/some-dir/some-test')
+        output_with_lines_to_ignore = DriverOutput('', image=None, image_hash=None, audio=None, error="""
+Unknown option: --foo-bar
+Should not be ignored
+[WARNING:proxy_service.cc] bad moon a-rising
+[WARNING:chrome.cc] Something went wrong
+[INFO:SkFontHost_android.cpp(1158)] Use Test Config File Main /data/local/tmp/drt/android_main_fonts.xml, Fallback /data/local/tmp/drt/android_fallback_fonts.xml, Font Dir /data/local/tmp/drt/fonts/
+[ERROR:main.cc] The sky has fallen""")
+        test._filter_output(output_with_lines_to_ignore)
+        self.assertEqual(output_with_lines_to_ignore.error,
+            "Should not be ignored\n"
+            "[WARNING:chrome.cc] Something went wrong\n"
+            "[ERROR:main.cc] The sky has fallen")
+
+    def test_parse_output_with_subtests(self):
+        output = DriverOutput("""
+Running 20 times
+some test: [1, 2, 3, 4, 5]
+other test = else: [6, 7, 8, 9, 10]
+Ignoring warm-up run (1115)
+
+Time:
+values 1080, 1120, 1095, 1101, 1104 ms
+avg 1100 ms
+median 1101 ms
+stdev 14.50862 ms
+min 1080 ms
+max 1120 ms
+""", image=None, image_hash=None, audio=None)
         output_capture = OutputCapture()
         output_capture.capture_output()
         try:
-            self.assertEqual(test.run(driver, None),
-                {'some-test': {'max': 20000, 'avg': 11000.0, 'median': 11000, 'stdev': 5627.314338711378, 'min': 2000, 'unit': 'ms',
-                    'values': [i * 1000 for i in range(2, 21)]}})
+            test = PerfTest(MockPort(), 'some-test', '/path/some-dir/some-test')
+            self._assert_results_are_correct(test, output)
         finally:
             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
         self.assertEqual(actual_stdout, '')
         self.assertEqual(actual_stderr, '')
-        self.assertEqual(actual_logs, 'RESULT some-test= 11000.0 ms\nmedian= 11000 ms, stdev= 5627.31433871 ms, min= 2000 ms, max= 20000 ms\n')
+        self.assertEqual(actual_logs, '')
 
-    def test_run_with_memory_output(self):
-        port = MockPort()
-        test = PageLoadingPerfTest(port, 'some-test', '/path/some-dir/some-test')
-        memory_results = {'Malloc': 10, 'JSHeap': 5}
-        self.maxDiff = None
-        driver = TestPageLoadingPerfTest.MockDriver(range(1, 21), test, memory_results)
-        output_capture = OutputCapture()
-        output_capture.capture_output()
-        try:
-            self.assertEqual(test.run(driver, None),
-                {'some-test': {'max': 20000, 'avg': 11000.0, 'median': 11000, 'stdev': 5627.314338711378, 'min': 2000, 'unit': 'ms',
-                    'values': [i * 1000 for i in range(2, 21)]},
-                 'some-test:Malloc': {'max': 10, 'avg': 10.0, 'median': 10, 'min': 10, 'stdev': 0.0, 'unit': 'bytes',
-                    'values': [10] * 19},
-                 'some-test:JSHeap': {'max': 5, 'avg': 5.0, 'median': 5, 'min': 5, 'stdev': 0.0, 'unit': 'bytes',
-                    'values': [5] * 19}})
-        finally:
-            actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
-        self.assertEqual(actual_stdout, '')
-        self.assertEqual(actual_stderr, '')
-        self.assertEqual(actual_logs, 'RESULT some-test= 11000.0 ms\nmedian= 11000 ms, stdev= 5627.31433871 ms, min= 2000 ms, max= 20000 ms\n'
-            + 'RESULT some-test: Malloc= 10.0 bytes\nmedian= 10 bytes, stdev= 0.0 bytes, min= 10 bytes, max= 10 bytes\n'
-            + 'RESULT some-test: JSHeap= 5.0 bytes\nmedian= 5 bytes, stdev= 0.0 bytes, min= 5 bytes, max= 5 bytes\n')
 
-    def test_run_with_bad_output(self):
-        output_capture = OutputCapture()
-        output_capture.capture_output()
-        try:
-            port = MockPort()
-            test = PageLoadingPerfTest(port, 'some-test', '/path/some-dir/some-test')
-            driver = TestPageLoadingPerfTest.MockDriver([1, 2, 3, 4, 5, 6, 7, 'some error', 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], test)
-            self.assertEqual(test.run(driver, None), None)
-        finally:
-            actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
-        self.assertEqual(actual_stdout, '')
-        self.assertEqual(actual_stderr, '')
-        self.assertEqual(actual_logs, 'error: some-test\nsome error\n')
+class TestSingleProcessPerfTest(unittest.TestCase):
+    def test_use_only_one_process(self):
+        called = [0]
+
+        def run_single(driver, path, time_out_ms):
+            called[0] += 1
+            return DriverOutput("""
+Running 20 times
+Ignoring warm-up run (1115)
+
+Time:
+values 1080, 1120, 1095, 1101, 1104 ms
+avg 1100 ms
+median 1101 ms
+stdev 14.50862 ms
+min 1080 ms
+max 1120 ms""", image=None, image_hash=None, audio=None)
+
+        test = SingleProcessPerfTest(MockPort(), 'some-test', '/path/some-dir/some-test')
+        test.run_single = run_single
+        self.assertTrue(test.run(0))
+        self.assertEqual(called[0], 1)
 
 
 class TestReplayPerfTest(unittest.TestCase):
-
     class ReplayTestPort(MockPort):
         def __init__(self, custom_run_test=None):
 
@@ -221,7 +279,7 @@
             loaded_pages.append(test_input)
             self._add_file(port, '/path/some-dir', 'some-test.wpr', 'wpr content')
             return DriverOutput('actual text', 'actual image', 'actual checksum',
-                audio=None, crash=False, timeout=False, error=False)
+                audio=None, crash=False, timeout=False, error=False, test_time=12345)
 
         test, port = self._setup_test(run_test)
         test._archive_path = '/path/some-dir/some-test.wpr'
@@ -229,7 +287,8 @@
 
         try:
             driver = port.create_driver(worker_number=1, no_timeout=True)
-            self.assertTrue(test.run_single(driver, '/path/some-dir/some-test.replay', time_out_ms=100))
+            output = test.run_single(driver, '/path/some-dir/some-test.replay', time_out_ms=100)
+            self.assertTrue(output)
         finally:
             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
 
@@ -240,6 +299,7 @@
         self.assertEqual(actual_stderr, '')
         self.assertEqual(actual_logs, '')
         self.assertEqual(port.host.filesystem.read_binary_file('/path/some-dir/some-test-actual.png'), 'actual image')
+        self.assertEqual(output.test_time, 12345)
 
     def test_run_single_fails_without_webpagereplay(self):
         output_capture = OutputCapture()
@@ -259,6 +319,59 @@
         self.assertEqual(actual_stderr, '')
         self.assertEqual(actual_logs, "Web page replay didn't start.\n")
 
+    def test_run_with_driver_accumulates_results(self):
+        port = MockPort()
+        test, port = self._setup_test()
+        counter = [0]
+
+        def mock_run_signle(drive, path, timeout):
+            counter[0] += 1
+            return DriverOutput('some output', image=None, image_hash=None, audio=None, test_time=counter[0], measurements={})
+
+        test.run_single = mock_run_signle
+        output_capture = OutputCapture()
+        output_capture.capture_output()
+        try:
+            driver = port.create_driver(worker_number=1, no_timeout=True)
+            self.assertTrue(test._run_with_driver(driver, None))
+        finally:
+            actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
+
+        self.assertEqual(actual_stdout, '')
+        self.assertEqual(actual_stderr, '')
+        self.assertEqual(actual_logs, '')
+
+        self.assertEqual(test._metrics.keys(), ['Time'])
+        self.assertEqual(test._metrics['Time'].flattened_iteration_values(), [float(i * 1000) for i in range(2, 7)])
+
+    def test_run_with_driver_accumulates_memory_results(self):
+        port = MockPort()
+        test, port = self._setup_test()
+        counter = [0]
+
+        def mock_run_signle(drive, path, timeout):
+            counter[0] += 1
+            return DriverOutput('some output', image=None, image_hash=None, audio=None, test_time=counter[0], measurements={'Malloc': 10, 'JSHeap': 5})
+
+        test.run_single = mock_run_signle
+        output_capture = OutputCapture()
+        output_capture.capture_output()
+        try:
+            driver = port.create_driver(worker_number=1, no_timeout=True)
+            self.assertTrue(test._run_with_driver(driver, None))
+        finally:
+            actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
+
+        self.assertEqual(actual_stdout, '')
+        self.assertEqual(actual_stderr, '')
+        self.assertEqual(actual_logs, '')
+
+        metrics = test._metrics
+        self.assertEqual(sorted(metrics.keys()), ['JSHeap', 'Malloc', 'Time'])
+        self.assertEqual(metrics['Time'].flattened_iteration_values(), [float(i * 1000) for i in range(2, 7)])
+        self.assertEqual(metrics['Malloc'].flattened_iteration_values(), [float(10)] * 5)
+        self.assertEqual(metrics['JSHeap'].flattened_iteration_values(), [float(5)] * 5)
+
     def test_prepare_fails_when_wait_until_ready_fails(self):
         output_capture = OutputCapture()
         output_capture.capture_output()
@@ -319,7 +432,7 @@
         test, port = self._setup_test(run_test)
 
         try:
-            self.assertEqual(test.prepare(time_out_ms=100), True)
+            self.assertTrue(test.prepare(time_out_ms=100))
         finally:
             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
 
@@ -343,7 +456,7 @@
         test.run_single = run_single
 
         try:
-            self.assertEqual(test.prepare(time_out_ms=100), False)
+            self.assertFalse(test.prepare(time_out_ms=100))
         finally:
             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
         self.assertTrue(called[0])
@@ -353,6 +466,7 @@
         self.assertEqual(actual_stderr, '')
         self.assertEqual(actual_logs, "Preparing replay for some-test.replay\nFailed to prepare a replay for some-test.replay\n")
 
+
 class TestPerfTestFactory(unittest.TestCase):
     def test_regular_test(self):
         test = PerfTestFactory.create_perf_test(MockPort(), 'some-dir/some-test', '/path/some-dir/some-test')
@@ -361,7 +475,3 @@
     def test_inspector_test(self):
         test = PerfTestFactory.create_perf_test(MockPort(), 'inspector/some-test', '/path/inspector/some-test')
         self.assertEqual(test.__class__, ChromiumStylePerfTest)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/performance_tests/perftestsrunner.py b/Tools/Scripts/webkitpy/performance_tests/perftestsrunner.py
old mode 100755
new mode 100644
index 42e0d96..b3e22e7
--- a/Tools/Scripts/webkitpy/performance_tests/perftestsrunner.py
+++ b/Tools/Scripts/webkitpy/performance_tests/perftestsrunner.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (C) 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -34,12 +33,15 @@
 import logging
 import optparse
 import time
+import datetime
 
 from webkitpy.common import find_files
 from webkitpy.common.checkout.scm.detection import SCMDetector
+from webkitpy.common.config.urls import view_source_url
 from webkitpy.common.host import Host
 from webkitpy.common.net.file_uploader import FileUploader
 from webkitpy.performance_tests.perftest import PerfTestFactory
+from webkitpy.performance_tests.perftest import DEFAULT_TEST_RUNNER_COUNT
 
 
 _log = logging.getLogger(__name__)
@@ -66,8 +68,9 @@
         self._host.initialize_scm()
         self._webkit_base_dir_len = len(self._port.webkit_base())
         self._base_path = self._port.perf_tests_dir()
-        self._results = {}
         self._timestamp = time.time()
+        self._utc_timestamp = datetime.datetime.utcnow()
+
 
     @staticmethod
     def _parse_args(args=None):
@@ -83,6 +86,8 @@
                 help="Specify port/platform being tested (i.e. chromium-mac)"),
             optparse.make_option("--chromium",
                 action="store_const", const='chromium', dest='platform', help='Alias for --platform=chromium'),
+            optparse.make_option("--chromium-android",
+                action="store_const", const='chromium-android', dest='platform', help='Alias for --platform=chromium-android'),
             optparse.make_option("--builder-name",
                 help=("The name of the builder shown on the waterfall running this script e.g. google-mac-2.")),
             optparse.make_option("--build-number",
@@ -95,8 +100,6 @@
                 help="Path to the directory under which build files are kept (should not include configuration)"),
             optparse.make_option("--time-out-ms", default=600 * 1000,
                 help="Set the timeout for each test"),
-            optparse.make_option("--pause-before-testing", dest="pause_before_testing", action="store_true", default=False,
-                help="Pause before running the tests to let user attach a performance monitor."),
             optparse.make_option("--no-results", action="store_false", dest="generate_results", default=True,
                 help="Do no generate results JSON and results page."),
             optparse.make_option("--output-json-path", action='callback', callback=_expand_path, type="str",
@@ -115,14 +118,25 @@
                 help="Use WebKitTestRunner rather than DumpRenderTree."),
             optparse.make_option("--replay", dest="replay", action="store_true", default=False,
                 help="Run replay tests."),
-            optparse.make_option("--force", dest="skipped", action="store_true", default=False,
+            optparse.make_option("--force", dest="use_skipped_list", action="store_false", default=True,
                 help="Run all tests, including the ones in the Skipped list."),
+            optparse.make_option("--profile", action="store_true",
+                help="Output per-test profile information."),
+            optparse.make_option("--profiler", action="store",
+                help="Output per-test profile information, using the specified profiler."),
+            optparse.make_option("--additional-drt-flag", action="append",
+                default=[], help="Additional command line flag to pass to DumpRenderTree "
+                     "Specify multiple times to add multiple flags."),
+            optparse.make_option("--driver-name", type="string",
+                help="Alternative DumpRenderTree binary to use"),
+            optparse.make_option("--repeat", default=1, type="int",
+                help="Specify number of times to run test set (default: 1)."),
+            optparse.make_option("--test-runner-count", default=DEFAULT_TEST_RUNNER_COUNT, type="int",
+                help="Specify number of times to invoke test runner for each performance test."),
             ]
         return optparse.OptionParser(option_list=(perf_option_list)).parse_args(args)
 
     def _collect_tests(self):
-        """Return the list of tests found."""
-
         test_extensions = ['.html', '.svg']
         if self._options.replay:
             test_extensions.append('.replay')
@@ -134,40 +148,76 @@
 
         paths = []
         for arg in self._args:
-            paths.append(arg)
-            relpath = filesystem.relpath(arg, self._base_path)
-            if relpath:
-                paths.append(relpath)
+            if filesystem.exists(filesystem.join(self._base_path, arg)):
+                paths.append(arg)
+            else:
+                relpath = filesystem.relpath(arg, self._base_path)
+                if filesystem.exists(filesystem.join(self._base_path, relpath)):
+                    paths.append(filesystem.normpath(relpath))
+                else:
+                    _log.warn('Path was not found:' + arg)
 
         skipped_directories = set(['.svn', 'resources'])
         test_files = find_files.find(filesystem, self._base_path, paths, skipped_directories, _is_test_file)
         tests = []
         for path in test_files:
-            relative_path = self._port.relative_perf_test_filename(path).replace('\\', '/')
-            if self._port.skips_perf_test(relative_path) and not self._options.skipped:
+            relative_path = filesystem.relpath(path, self._base_path).replace('\\', '/')
+            if self._options.use_skipped_list and self._port.skips_perf_test(relative_path) and filesystem.normpath(relative_path) not in paths:
                 continue
-            test = PerfTestFactory.create_perf_test(self._port, relative_path, path)
+            test = PerfTestFactory.create_perf_test(self._port, relative_path, path, test_runner_count=self._options.test_runner_count)
             tests.append(test)
 
         return tests
 
+    def _start_http_servers(self):
+        self._port.acquire_http_lock()
+        self._port.start_http_server(number_of_servers=2)
+
+    def _stop_http_servers(self):
+        self._port.stop_http_server()
+        self._port.release_http_lock()
+
     def run(self):
-        if not self._port.check_build(needs_http=False):
+        needs_http = self._port.requires_http_server()
+
+        if not self._port.check_build(needs_http=needs_http):
             _log.error("Build not up to date for %s" % self._port._path_to_driver())
             return self.EXIT_CODE_BAD_BUILD
 
-        tests = self._collect_tests()
-        _log.info("Running %d tests" % len(tests))
+        run_count = 0
+        repeat = self._options.repeat
+        while (run_count < repeat):
+            run_count += 1
 
-        for test in tests:
-            if not test.prepare(self._options.time_out_ms):
-                return self.EXIT_CODE_BAD_PREPARATION
+            tests = self._collect_tests()
+            runs = ' (Run %d of %d)' % (run_count, repeat) if repeat > 1 else ''
+            _log.info("Running %d tests%s" % (len(tests), runs))
 
-        unexpected = self._run_tests_set(sorted(list(tests), key=lambda test: test.test_name()), self._port)
-        if self._options.generate_results:
-            exit_code = self._generate_and_show_results()
-            if exit_code:
-                return exit_code
+            for test in tests:
+                if not test.prepare(self._options.time_out_ms):
+                    return self.EXIT_CODE_BAD_PREPARATION
+
+            try:
+                if needs_http:
+                    self._start_http_servers()
+                unexpected = self._run_tests_set(sorted(list(tests), key=lambda test: test.test_name()))
+
+            finally:
+                if needs_http:
+                    self._stop_http_servers()
+
+            if self._options.generate_results and not self._options.profile:
+                exit_code = self._generate_results()
+                if exit_code:
+                    return exit_code
+
+        if self._options.generate_results and not self._options.profile:
+            test_results_server = self._options.test_results_server
+            if test_results_server and not self._upload_json(test_results_server, self._output_json_path()):
+                return self.EXIT_CODE_FAILED_UPLOADING
+
+            if self._options.show_results:
+                self._port.show_results_html_file(self._results_page_path())
 
         return unexpected
 
@@ -177,7 +227,10 @@
             return output_json_path
         return self._host.filesystem.join(self._port.perf_results_directory(), self._DEFAULT_JSON_FILENAME)
 
-    def _generate_and_show_results(self):
+    def _results_page_path(self):
+        return self._host.filesystem.splitext(self._output_json_path())[0] + '.html'
+
+    def _generate_results(self):
         options = self._options
         output_json_path = self._output_json_path()
         output = self._generate_results_dict(self._timestamp, options.description, options.platform, options.builder_name, options.build_number)
@@ -191,33 +244,66 @@
         if not output:
             return self.EXIT_CODE_BAD_MERGE
 
-        results_page_path = self._host.filesystem.splitext(output_json_path)[0] + '.html'
-        self._generate_output_files(output_json_path, results_page_path, output)
+        filesystem = self._host.filesystem
+        json_output = json.dumps(output)
+        filesystem.write_text_file(output_json_path, json_output)
 
-        if options.test_results_server:
-            if not self._upload_json(options.test_results_server, output_json_path):
-                return self.EXIT_CODE_FAILED_UPLOADING
+        template_path = filesystem.join(self._port.perf_tests_dir(), 'resources/results-template.html')
+        template = filesystem.read_text_file(template_path)
 
-        if options.show_results:
-            self._port.show_results_html_file(results_page_path)
+        absolute_path_to_trunk = filesystem.dirname(self._port.perf_tests_dir())
+        results_page = template.replace('%AbsolutePathToWebKitTrunk%', absolute_path_to_trunk)
+        results_page = results_page.replace('%PeformanceTestsResultsJSON%', json_output)
+
+        filesystem.write_text_file(self._results_page_path(), results_page)
 
     def _generate_results_dict(self, timestamp, description, platform, builder_name, build_number):
-        contents = {'results': self._results}
-        if description:
-            contents['description'] = description
+        revisions = {}
         for (name, path) in self._port.repository_paths():
             scm = SCMDetector(self._host.filesystem, self._host.executive).detect_scm_system(path) or self._host.scm()
-            contents[name + '-revision'] = scm.svn_revision(path)
+            revision = scm.svn_revision(path)
+            revisions[name] = {'revision': revision, 'timestamp': scm.timestamp_of_revision(path, revision)}
 
-        # FIXME: Add --branch or auto-detect the branch we're in
-        for key, value in {'timestamp': int(timestamp), 'branch': self._default_branch, 'platform': platform,
-            'builder-name': builder_name, 'build-number': int(build_number) if build_number else None}.items():
+        meta_info = {
+            'description': description,
+            'buildTime': self._datetime_in_ES5_compatible_iso_format(self._utc_timestamp),
+            'platform': platform,
+            'revisions': revisions,
+            'builderName': builder_name,
+            'buildNumber': int(build_number) if build_number else None}
+
+        contents = {'tests': {}}
+        for key, value in meta_info.items():
             if value:
                 contents[key] = value
 
+        for test, metrics in self._results:
+            for metric_name, iteration_values in metrics.iteritems():
+                if not isinstance(iteration_values, list):  # We can't reports results without individual measurements.
+                    continue
+
+                tests = contents['tests']
+                path = test.test_name_without_file_extension().split('/')
+                for i in range(0, len(path)):
+                    is_last_token = i + 1 == len(path)
+                    url = view_source_url('PerformanceTests/' + (test.test_name() if is_last_token else '/'.join(path[0:i + 1])))
+                    tests.setdefault(path[i], {'url': url})
+                    current_test = tests[path[i]]
+                    if is_last_token:
+                        current_test.setdefault('metrics', {})
+                        assert metric_name not in current_test['metrics']
+                        current_test['metrics'][metric_name] = {'current': iteration_values}
+                    else:
+                        current_test.setdefault('tests', {})
+                        tests = current_test['tests']
+
         return contents
 
-    def _merge_slave_config_json(self, slave_config_json_path, output):
+    @staticmethod
+    def _datetime_in_ES5_compatible_iso_format(datetime):
+        return datetime.strftime('%Y-%m-%dT%H:%M:%S.%f')
+
+    def _merge_slave_config_json(self, slave_config_json_path, contents):
         if not self._host.filesystem.isfile(slave_config_json_path):
             _log.error("Missing slave configuration JSON file: %s" % slave_config_json_path)
             return None
@@ -225,7 +311,9 @@
         try:
             slave_config_json = self._host.filesystem.open_text_file_for_reading(slave_config_json_path)
             slave_config = json.load(slave_config_json)
-            return dict(slave_config.items() + output.items())
+            for key in slave_config:
+                contents['builder' + key.capitalize()] = slave_config[key]
+            return contents
         except Exception, error:
             _log.error("Failed to merge slave configuration JSON file %s: %s" % (slave_config_json_path, error))
         return None
@@ -240,85 +328,48 @@
             _log.error("Failed to merge output JSON file %s: %s" % (output_json_path, error))
         return None
 
-    def _generate_output_files(self, output_json_path, results_page_path, output):
-        filesystem = self._host.filesystem
-
-        json_output = json.dumps(output)
-        filesystem.write_text_file(output_json_path, json_output)
-
-        if results_page_path:
-            template_path = filesystem.join(self._port.perf_tests_dir(), 'resources/results-template.html')
-            template = filesystem.read_text_file(template_path)
-
-            absolute_path_to_trunk = filesystem.dirname(self._port.perf_tests_dir())
-            results_page = template.replace('%AbsolutePathToWebKitTrunk%', absolute_path_to_trunk)
-            results_page = results_page.replace('%PeformanceTestsResultsJSON%', json_output)
-
-            filesystem.write_text_file(results_page_path, results_page)
-
-    def _upload_json(self, test_results_server, json_path, file_uploader=FileUploader):
-        uploader = file_uploader("https://%s/api/test/report" % test_results_server, 120)
+    def _upload_json(self, test_results_server, json_path, host_path="/api/report", file_uploader=FileUploader):
+        url = "https://%s%s" % (test_results_server, host_path)
+        uploader = file_uploader(url, 120)
         try:
             response = uploader.upload_single_text_file(self._host.filesystem, 'application/json', json_path)
         except Exception, error:
-            _log.error("Failed to upload JSON file in 120s: %s" % error)
+            _log.error("Failed to upload JSON file to %s in 120s: %s" % (url, error))
             return False
 
         response_body = [line.strip('\n') for line in response]
         if response_body != ['OK']:
-            _log.error("Uploaded JSON but got a bad response:")
-            for line in response_body:
-                _log.error(line)
-            return False
+            try:
+                parsed_response = json.loads('\n'.join(response_body))
+            except:
+                _log.error("Uploaded JSON to %s but got a bad response:" % url)
+                for line in response_body:
+                    _log.error(line)
+                return False
+            if parsed_response.get('status') != 'OK':
+                _log.error("Uploaded JSON to %s but got an error:" % url)
+                _log.error(json.dumps(parsed_response, indent=4))
+                return False
 
-        _log.info("JSON file uploaded.")
+        _log.info("JSON file uploaded to %s." % url)
         return True
 
-    def _print_status(self, tests, expected, unexpected):
-        if len(tests) == expected + unexpected:
-            status = "Ran %d tests" % len(tests)
-        else:
-            status = "Running %d of %d tests" % (expected + unexpected + 1, len(tests))
-        if unexpected:
-            status += " (%d didn't run)" % unexpected
-        _log.info(status)
-
-    def _run_tests_set(self, tests, port):
+    def _run_tests_set(self, tests):
         result_count = len(tests)
-        expected = 0
-        unexpected = 0
-        driver = None
+        failures = 0
+        self._results = []
 
-        for test in tests:
-            driver = port.create_driver(worker_number=1, no_timeout=True)
-
-            if self._options.pause_before_testing:
-                driver.start()
-                if not self._host.user.confirm("Ready to run test?"):
-                    driver.stop()
-                    return unexpected
-
-            _log.info('Running %s (%d of %d)' % (test.test_name(), expected + unexpected + 1, len(tests)))
-            if self._run_single_test(test, driver):
-                expected = expected + 1
+        for i, test in enumerate(tests):
+            _log.info('Running %s (%d of %d)' % (test.test_name(), i + 1, len(tests)))
+            start_time = time.time()
+            metrics = test.run(self._options.time_out_ms)
+            if metrics:
+                self._results.append((test, metrics))
             else:
-                unexpected = unexpected + 1
+                failures += 1
+                _log.error('FAILED')
 
+            _log.info('Finished: %f s' % (time.time() - start_time))
             _log.info('')
 
-            driver.stop()
-
-        return unexpected
-
-    def _run_single_test(self, test, driver):
-        start_time = time.time()
-
-        new_results = test.run(driver, self._options.time_out_ms)
-        if new_results:
-            self._results.update(new_results)
-        else:
-            _log.error('FAILED')
-
-        _log.info("Finished: %f s" % (time.time() - start_time))
-
-        return new_results != None
+        return failures
diff --git a/Tools/Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py b/Tools/Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py
new file mode 100644
index 0000000..8bc2148
--- /dev/null
+++ b/Tools/Scripts/webkitpy/performance_tests/perftestsrunner_integrationtest.py
@@ -0,0 +1,582 @@
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Integration tests for run_perf_tests."""
+
+import StringIO
+import datetime
+import json
+import re
+import unittest2 as unittest
+
+from webkitpy.common.host_mock import MockHost
+from webkitpy.common.system.outputcapture import OutputCapture
+from webkitpy.layout_tests.port.driver import DriverOutput
+from webkitpy.layout_tests.port.test import TestPort
+from webkitpy.performance_tests.perftest import ChromiumStylePerfTest
+from webkitpy.performance_tests.perftest import PerfTest
+from webkitpy.performance_tests.perftestsrunner import PerfTestsRunner
+
+
+class InspectorPassTestData:
+    text = 'RESULT group_name: test_name= 42 ms'
+    output = """Running inspector/pass.html (2 of 2)
+RESULT group_name: test_name= 42 ms
+Finished: 0.1 s
+
+"""
+
+
+class EventTargetWrapperTestData:
+    text = """Running 20 times
+Ignoring warm-up run (1502)
+1504
+1505
+1510
+1504
+1507
+1509
+1510
+1487
+1488
+1472
+1472
+1488
+1473
+1472
+1475
+1487
+1486
+1486
+1475
+1471
+
+Time:
+values 1486, 1471, 1510, 1505, 1478, 1490 ms
+avg 1490 ms
+median 1488 ms
+stdev 15.13935 ms
+min 1471 ms
+max 1510 ms
+"""
+
+    output = """Running Bindings/event-target-wrapper.html (1 of 2)
+RESULT Bindings: event-target-wrapper: Time= 1490.0 ms
+median= 1488.0 ms, stdev= 14.11751 ms, min= 1471.0 ms, max= 1510.0 ms
+Finished: 0.1 s
+
+"""
+
+    results = {'url': 'http://trac.webkit.org/browser/trunk/PerformanceTests/Bindings/event-target-wrapper.html',
+        'metrics': {'Time': {'current': [[1486.0, 1471.0, 1510.0, 1505.0, 1478.0, 1490.0]] * 4}}}
+
+
+class SomeParserTestData:
+    text = """Running 20 times
+Ignoring warm-up run (1115)
+
+Time:
+values 1080, 1120, 1095, 1101, 1104 ms
+avg 1100 ms
+median 1101 ms
+stdev 14.50861 ms
+min 1080 ms
+max 1120 ms
+"""
+
+    output = """Running Parser/some-parser.html (2 of 2)
+RESULT Parser: some-parser: Time= 1100.0 ms
+median= 1101.0 ms, stdev= 13.31402 ms, min= 1080.0 ms, max= 1120.0 ms
+Finished: 0.1 s
+
+"""
+
+
+class MemoryTestData:
+    text = """Running 20 times
+Ignoring warm-up run (1115)
+
+Time:
+values 1080, 1120, 1095, 1101, 1104 ms
+avg 1100 ms
+median 1101 ms
+stdev 14.50861 ms
+min 1080 ms
+max 1120 ms
+
+JS Heap:
+values 825000, 811000, 848000, 837000, 829000 bytes
+avg 830000 bytes
+median 829000 bytes
+stdev 13784.04875 bytes
+min 811000 bytes
+max 848000 bytes
+
+Malloc:
+values 529000, 511000, 548000, 536000, 521000 bytes
+avg 529000 bytes
+median 529000 bytes
+stdev 14124.44689 bytes
+min 511000 bytes
+max 548000 bytes
+"""
+
+    output = """Running 1 tests
+Running Parser/memory-test.html (1 of 1)
+RESULT Parser: memory-test: Time= 1100.0 ms
+median= 1101.0 ms, stdev= 13.31402 ms, min= 1080.0 ms, max= 1120.0 ms
+RESULT Parser: memory-test: JSHeap= 830000.0 bytes
+median= 829000.0 bytes, stdev= 12649.11064 bytes, min= 811000.0 bytes, max= 848000.0 bytes
+RESULT Parser: memory-test: Malloc= 529000.0 bytes
+median= 529000.0 bytes, stdev= 12961.48139 bytes, min= 511000.0 bytes, max= 548000.0 bytes
+Finished: 0.1 s
+"""
+
+    results = {'current': [[1080, 1120, 1095, 1101, 1104]] * 4}
+    js_heap_results = {'current': [[825000, 811000, 848000, 837000, 829000]] * 4}
+    malloc_results = {'current': [[529000, 511000, 548000, 536000, 521000]] * 4}
+
+
+class TestDriver:
+    def run_test(self, driver_input, stop_when_done):
+        text = ''
+        timeout = False
+        crash = False
+        if driver_input.test_name.endswith('pass.html'):
+            text = InspectorPassTestData.text
+        elif driver_input.test_name.endswith('timeout.html'):
+            timeout = True
+        elif driver_input.test_name.endswith('failed.html'):
+            text = None
+        elif driver_input.test_name.endswith('tonguey.html'):
+            text = 'we are not expecting an output from perf tests but RESULT blablabla'
+        elif driver_input.test_name.endswith('crash.html'):
+            crash = True
+        elif driver_input.test_name.endswith('event-target-wrapper.html'):
+            text = EventTargetWrapperTestData.text
+        elif driver_input.test_name.endswith('some-parser.html'):
+            text = SomeParserTestData.text
+        elif driver_input.test_name.endswith('memory-test.html'):
+            text = MemoryTestData.text
+        return DriverOutput(text, '', '', '', crash=crash, timeout=timeout)
+
+    def start(self):
+        """do nothing"""
+
+    def stop(self):
+        """do nothing"""
+
+
+class MainTest(unittest.TestCase):
+    def _normalize_output(self, log):
+        return re.sub(r'(stdev=\s+\d+\.\d{5})\d+', r'\1', re.sub(r'Finished: [0-9\.]+ s', 'Finished: 0.1 s', log))
+
+    def _load_output_json(self, runner):
+        json_content = runner._host.filesystem.read_text_file(runner._output_json_path())
+        return json.loads(re.sub(r'("stdev":\s*\d+\.\d{5})\d+', r'\1', json_content))
+
+    def create_runner(self, args=[], driver_class=TestDriver):
+        options, parsed_args = PerfTestsRunner._parse_args(args)
+        test_port = TestPort(host=MockHost(), options=options)
+        test_port.create_driver = lambda worker_number=None, no_timeout=False: driver_class()
+
+        runner = PerfTestsRunner(args=args, port=test_port)
+        runner._host.filesystem.maybe_make_directory(runner._base_path, 'inspector')
+        runner._host.filesystem.maybe_make_directory(runner._base_path, 'Bindings')
+        runner._host.filesystem.maybe_make_directory(runner._base_path, 'Parser')
+
+        return runner, test_port
+
+    def run_test(self, test_name):
+        runner, port = self.create_runner()
+        tests = [ChromiumStylePerfTest(port, test_name, runner._host.filesystem.join('some-dir', test_name))]
+        return runner._run_tests_set(tests) == 0
+
+    def test_run_passing_test(self):
+        self.assertTrue(self.run_test('pass.html'))
+
+    def test_run_silent_test(self):
+        self.assertFalse(self.run_test('silent.html'))
+
+    def test_run_failed_test(self):
+        self.assertFalse(self.run_test('failed.html'))
+
+    def test_run_tonguey_test(self):
+        self.assertFalse(self.run_test('tonguey.html'))
+
+    def test_run_timeout_test(self):
+        self.assertFalse(self.run_test('timeout.html'))
+
+    def test_run_crash_test(self):
+        self.assertFalse(self.run_test('crash.html'))
+
+    def _tests_for_runner(self, runner, test_names):
+        filesystem = runner._host.filesystem
+        tests = []
+        for test in test_names:
+            path = filesystem.join(runner._base_path, test)
+            dirname = filesystem.dirname(path)
+            if test.startswith('inspector/'):
+                tests.append(ChromiumStylePerfTest(runner._port, test, path))
+            else:
+                tests.append(PerfTest(runner._port, test, path))
+        return tests
+
+    def test_run_test_set(self):
+        runner, port = self.create_runner()
+        tests = self._tests_for_runner(runner, ['inspector/pass.html', 'inspector/silent.html', 'inspector/failed.html',
+            'inspector/tonguey.html', 'inspector/timeout.html', 'inspector/crash.html'])
+        output = OutputCapture()
+        output.capture_output()
+        try:
+            unexpected_result_count = runner._run_tests_set(tests)
+        finally:
+            stdout, stderr, log = output.restore_output()
+        self.assertEqual(unexpected_result_count, len(tests) - 1)
+        self.assertTrue('\nRESULT group_name: test_name= 42 ms\n' in log)
+
+    def test_run_test_set_kills_drt_per_run(self):
+
+        class TestDriverWithStopCount(TestDriver):
+            stop_count = 0
+            def stop(self):
+                TestDriverWithStopCount.stop_count += 1
+
+        runner, port = self.create_runner(driver_class=TestDriverWithStopCount)
+
+        tests = self._tests_for_runner(runner, ['inspector/pass.html', 'inspector/silent.html', 'inspector/failed.html',
+            'inspector/tonguey.html', 'inspector/timeout.html', 'inspector/crash.html'])
+        unexpected_result_count = runner._run_tests_set(tests)
+
+        self.assertEqual(TestDriverWithStopCount.stop_count, 6)
+
+    def test_run_test_set_for_parser_tests(self):
+        runner, port = self.create_runner()
+        tests = self._tests_for_runner(runner, ['Bindings/event-target-wrapper.html', 'Parser/some-parser.html'])
+        output = OutputCapture()
+        output.capture_output()
+        try:
+            unexpected_result_count = runner._run_tests_set(tests)
+        finally:
+            stdout, stderr, log = output.restore_output()
+        self.assertEqual(unexpected_result_count, 0)
+        self.assertEqual(self._normalize_output(log), EventTargetWrapperTestData.output + SomeParserTestData.output)
+
+    def test_run_memory_test(self):
+        runner, port = self.create_runner_and_setup_results_template()
+        runner._timestamp = 123456789
+        port.host.filesystem.write_text_file(runner._base_path + '/Parser/memory-test.html', 'some content')
+
+        output = OutputCapture()
+        output.capture_output()
+        try:
+            unexpected_result_count = runner.run()
+        finally:
+            stdout, stderr, log = output.restore_output()
+        self.assertEqual(unexpected_result_count, 0)
+        self.assertEqual(self._normalize_output(log), MemoryTestData.output + '\nMOCK: user.open_url: file://...\n')
+        parser_tests = self._load_output_json(runner)[0]['tests']['Parser']['tests']
+        self.assertEqual(parser_tests['memory-test']['metrics']['Time'], MemoryTestData.results)
+        self.assertEqual(parser_tests['memory-test']['metrics']['JSHeap'], MemoryTestData.js_heap_results)
+        self.assertEqual(parser_tests['memory-test']['metrics']['Malloc'], MemoryTestData.malloc_results)
+
+    def _test_run_with_json_output(self, runner, filesystem, upload_succeeds=False, results_shown=True, expected_exit_code=0, repeat=1, compare_logs=True):
+        filesystem.write_text_file(runner._base_path + '/inspector/pass.html', 'some content')
+        filesystem.write_text_file(runner._base_path + '/Bindings/event-target-wrapper.html', 'some content')
+
+        uploaded = [False]
+
+        def mock_upload_json(hostname, json_path, host_path=None):
+            # FIXME: Get rid of the hard-coded perf.webkit.org once we've completed the transition.
+            self.assertIn(hostname, ['some.host'])
+            self.assertIn(json_path, ['/mock-checkout/output.json'])
+            self.assertIn(host_path, [None, '/api/report'])
+            uploaded[0] = upload_succeeds
+            return upload_succeeds
+
+        runner._upload_json = mock_upload_json
+        runner._timestamp = 123456789
+        runner._utc_timestamp = datetime.datetime(2013, 2, 8, 15, 19, 37, 460000)
+        output_capture = OutputCapture()
+        output_capture.capture_output()
+        try:
+            self.assertEqual(runner.run(), expected_exit_code)
+        finally:
+            stdout, stderr, logs = output_capture.restore_output()
+
+        if not expected_exit_code and compare_logs:
+            expected_logs = ''
+            for i in xrange(repeat):
+                runs = ' (Run %d of %d)' % (i + 1, repeat) if repeat > 1 else ''
+                expected_logs += 'Running 2 tests%s\n' % runs + EventTargetWrapperTestData.output + InspectorPassTestData.output
+            if results_shown:
+                expected_logs += 'MOCK: user.open_url: file://...\n'
+            self.assertEqual(self._normalize_output(logs), expected_logs)
+
+        self.assertEqual(uploaded[0], upload_succeeds)
+
+        return logs
+
+    _event_target_wrapper_and_inspector_results = {
+        "Bindings":
+            {"url": "http://trac.webkit.org/browser/trunk/PerformanceTests/Bindings",
+            "tests": {"event-target-wrapper": EventTargetWrapperTestData.results}}}
+
+    def test_run_with_json_output(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-results-server=some.host'])
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=True)
+        self.assertEqual(self._load_output_json(runner), [{
+            "buildTime": "2013-02-08T15:19:37.460000", "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}])
+
+        filesystem = port.host.filesystem
+        self.assertTrue(filesystem.isfile(runner._output_json_path()))
+        self.assertTrue(filesystem.isfile(filesystem.splitext(runner._output_json_path())[0] + '.html'))
+
+    def test_run_with_description(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-results-server=some.host', '--description', 'some description'])
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=True)
+        self.assertEqual(self._load_output_json(runner), [{
+            "buildTime": "2013-02-08T15:19:37.460000", "description": "some description",
+            "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}])
+
+    def create_runner_and_setup_results_template(self, args=[]):
+        runner, port = self.create_runner(args)
+        filesystem = port.host.filesystem
+        filesystem.write_text_file(runner._base_path + '/resources/results-template.html',
+            'BEGIN<script src="%AbsolutePathToWebKitTrunk%/some.js"></script>'
+            '<script src="%AbsolutePathToWebKitTrunk%/other.js"></script><script>%PeformanceTestsResultsJSON%</script>END')
+        filesystem.write_text_file(runner._base_path + '/Dromaeo/resources/dromaeo/web/lib/jquery-1.6.4.js', 'jquery content')
+        return runner, port
+
+    def test_run_respects_no_results(self):
+        runner, port = self.create_runner(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-results-server=some.host', '--no-results'])
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=False, results_shown=False)
+        self.assertFalse(port.host.filesystem.isfile('/mock-checkout/output.json'))
+
+    def test_run_generates_json_by_default(self):
+        runner, port = self.create_runner_and_setup_results_template()
+        filesystem = port.host.filesystem
+        output_json_path = runner._output_json_path()
+        results_page_path = filesystem.splitext(output_json_path)[0] + '.html'
+
+        self.assertFalse(filesystem.isfile(output_json_path))
+        self.assertFalse(filesystem.isfile(results_page_path))
+
+        self._test_run_with_json_output(runner, port.host.filesystem)
+
+        self.assertEqual(self._load_output_json(runner), [{
+            "buildTime": "2013-02-08T15:19:37.460000", "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}])
+
+        self.assertTrue(filesystem.isfile(output_json_path))
+        self.assertTrue(filesystem.isfile(results_page_path))
+
+    def test_run_merges_output_by_default(self):
+        runner, port = self.create_runner_and_setup_results_template()
+        filesystem = port.host.filesystem
+        output_json_path = runner._output_json_path()
+
+        filesystem.write_text_file(output_json_path, '[{"previous": "results"}]')
+
+        self._test_run_with_json_output(runner, port.host.filesystem)
+
+        self.assertEqual(self._load_output_json(runner), [{"previous": "results"}, {
+            "buildTime": "2013-02-08T15:19:37.460000", "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}])
+        self.assertTrue(filesystem.isfile(filesystem.splitext(output_json_path)[0] + '.html'))
+
+    def test_run_respects_reset_results(self):
+        runner, port = self.create_runner_and_setup_results_template(args=["--reset-results"])
+        filesystem = port.host.filesystem
+        output_json_path = runner._output_json_path()
+
+        filesystem.write_text_file(output_json_path, '[{"previous": "results"}]')
+
+        self._test_run_with_json_output(runner, port.host.filesystem)
+
+        self.assertEqual(self._load_output_json(runner), [{
+            "buildTime": "2013-02-08T15:19:37.460000", "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}])
+        self.assertTrue(filesystem.isfile(filesystem.splitext(output_json_path)[0] + '.html'))
+        pass
+
+    def test_run_generates_and_show_results_page(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json'])
+        page_shown = []
+        port.show_results_html_file = lambda path: page_shown.append(path)
+        filesystem = port.host.filesystem
+        self._test_run_with_json_output(runner, filesystem, results_shown=False)
+
+        expected_entry = {"buildTime": "2013-02-08T15:19:37.460000", "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}
+
+        self.maxDiff = None
+        self.assertEqual(runner._output_json_path(), '/mock-checkout/output.json')
+        self.assertEqual(self._load_output_json(runner), [expected_entry])
+        self.assertEqual(filesystem.read_text_file('/mock-checkout/output.html'),
+            'BEGIN<script src="/test.checkout/some.js"></script><script src="/test.checkout/other.js"></script>'
+            '<script>%s</script>END' % port.host.filesystem.read_text_file(runner._output_json_path()))
+        self.assertEqual(page_shown[0], '/mock-checkout/output.html')
+
+        self._test_run_with_json_output(runner, filesystem, results_shown=False)
+        self.assertEqual(runner._output_json_path(), '/mock-checkout/output.json')
+        self.assertEqual(self._load_output_json(runner), [expected_entry, expected_entry])
+        self.assertEqual(filesystem.read_text_file('/mock-checkout/output.html'),
+            'BEGIN<script src="/test.checkout/some.js"></script><script src="/test.checkout/other.js"></script>'
+            '<script>%s</script>END' % port.host.filesystem.read_text_file(runner._output_json_path()))
+
+    def test_run_respects_no_show_results(self):
+        show_results_html_file = lambda path: page_shown.append(path)
+
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json'])
+        page_shown = []
+        port.show_results_html_file = show_results_html_file
+        self._test_run_with_json_output(runner, port.host.filesystem, results_shown=False)
+        self.assertEqual(page_shown[0], '/mock-checkout/output.html')
+
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--no-show-results'])
+        page_shown = []
+        port.show_results_html_file = show_results_html_file
+        self._test_run_with_json_output(runner, port.host.filesystem, results_shown=False)
+        self.assertEqual(page_shown, [])
+
+    def test_run_with_bad_output_json(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json'])
+        port.host.filesystem.write_text_file('/mock-checkout/output.json', 'bad json')
+        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_MERGE)
+        port.host.filesystem.write_text_file('/mock-checkout/output.json', '{"another bad json": "1"}')
+        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_MERGE)
+
+    def test_run_with_slave_config_json(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--slave-config-json-path=/mock-checkout/slave-config.json', '--test-results-server=some.host'])
+        port.host.filesystem.write_text_file('/mock-checkout/slave-config.json', '{"key": "value"}')
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=True)
+        self.assertEqual(self._load_output_json(runner), [{
+            "buildTime": "2013-02-08T15:19:37.460000", "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}, "builderKey": "value"}])
+
+    def test_run_with_bad_slave_config_json(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--slave-config-json-path=/mock-checkout/slave-config.json', '--test-results-server=some.host'])
+        logs = self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_SOURCE_JSON)
+        self.assertTrue('Missing slave configuration JSON file: /mock-checkout/slave-config.json' in logs)
+        port.host.filesystem.write_text_file('/mock-checkout/slave-config.json', 'bad json')
+        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_SOURCE_JSON)
+        port.host.filesystem.write_text_file('/mock-checkout/slave-config.json', '["another bad json"]')
+        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_SOURCE_JSON)
+
+    def test_run_with_multiple_repositories(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-results-server=some.host'])
+        port.repository_paths = lambda: [('webkit', '/mock-checkout'), ('some', '/mock-checkout/some')]
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=True)
+        self.assertEqual(self._load_output_json(runner), [{
+            "buildTime": "2013-02-08T15:19:37.460000", "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"webkit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"},
+            "some": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}])
+
+    def test_run_with_upload_json(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-results-server', 'some.host', '--platform', 'platform1', '--builder-name', 'builder1', '--build-number', '123'])
+
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=True)
+        generated_json = json.loads(port.host.filesystem.files['/mock-checkout/output.json'])
+        self.assertEqual(generated_json[0]['platform'], 'platform1')
+        self.assertEqual(generated_json[0]['builderName'], 'builder1')
+        self.assertEqual(generated_json[0]['buildNumber'], 123)
+
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=False, expected_exit_code=PerfTestsRunner.EXIT_CODE_FAILED_UPLOADING)
+
+    def test_run_with_upload_json_should_generate_perf_webkit_json(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-results-server', 'some.host', '--platform', 'platform1', '--builder-name', 'builder1', '--build-number', '123',
+            '--slave-config-json-path=/mock-checkout/slave-config.json'])
+        port.host.filesystem.write_text_file('/mock-checkout/slave-config.json', '{"key": "value1"}')
+
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=True)
+        generated_json = json.loads(port.host.filesystem.files['/mock-checkout/output.json'])
+        self.assertTrue(isinstance(generated_json, list))
+        self.assertEqual(len(generated_json), 1)
+
+        output = generated_json[0]
+        self.maxDiff = None
+        self.assertEqual(output['platform'], 'platform1')
+        self.assertEqual(output['buildNumber'], 123)
+        self.assertEqual(output['buildTime'], '2013-02-08T15:19:37.460000')
+        self.assertEqual(output['builderName'], 'builder1')
+        self.assertEqual(output['builderKey'], 'value1')
+        self.assertEqual(output['revisions'], {'WebKit': {'revision': '5678', 'timestamp': '2013-02-01 08:48:05 +0000'}})
+        self.assertEqual(output['tests'].keys(), ['Bindings'])
+        self.assertEqual(sorted(output['tests']['Bindings'].keys()), ['tests', 'url'])
+        self.assertEqual(output['tests']['Bindings']['url'], 'http://trac.webkit.org/browser/trunk/PerformanceTests/Bindings')
+        self.assertEqual(output['tests']['Bindings']['tests'].keys(), ['event-target-wrapper'])
+        self.assertEqual(output['tests']['Bindings']['tests']['event-target-wrapper'], {
+            'url': 'http://trac.webkit.org/browser/trunk/PerformanceTests/Bindings/event-target-wrapper.html',
+            'metrics': {'Time': {'current': [[1486.0, 1471.0, 1510.0, 1505.0, 1478.0, 1490.0]] * 4}}})
+
+    def test_run_with_repeat(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-results-server=some.host', '--repeat', '5'])
+        self._test_run_with_json_output(runner, port.host.filesystem, upload_succeeds=True, repeat=5)
+        self.assertEqual(self._load_output_json(runner), [
+            {"buildTime": "2013-02-08T15:19:37.460000",
+            "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}},
+            {"buildTime": "2013-02-08T15:19:37.460000",
+            "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}},
+            {"buildTime": "2013-02-08T15:19:37.460000",
+            "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}},
+            {"buildTime": "2013-02-08T15:19:37.460000",
+            "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}},
+            {"buildTime": "2013-02-08T15:19:37.460000",
+            "tests": self._event_target_wrapper_and_inspector_results,
+            "revisions": {"WebKit": {"timestamp": "2013-02-01 08:48:05 +0000", "revision": "5678"}}}])
+
+    def test_run_with_test_runner_count(self):
+        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
+            '--test-runner-count=3'])
+        self._test_run_with_json_output(runner, port.host.filesystem, compare_logs=False)
+        generated_json = json.loads(port.host.filesystem.files['/mock-checkout/output.json'])
+        self.assertTrue(isinstance(generated_json, list))
+        self.assertEqual(len(generated_json), 1)
+
+        output = generated_json[0]['tests']['Bindings']['tests']['event-target-wrapper']['metrics']['Time']['current']
+        self.assertEqual(len(output), 3)
+        expectedMetrics = EventTargetWrapperTestData.results['metrics']['Time']['current'][0]
+        for metrics in output:
+            self.assertEqual(metrics, expectedMetrics)
diff --git a/Tools/Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py b/Tools/Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py
old mode 100755
new mode 100644
index 9c9295f..4e38f53
--- a/Tools/Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py
+++ b/Tools/Scripts/webkitpy/performance_tests/perftestsrunner_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2012 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -32,524 +31,25 @@
 import StringIO
 import json
 import re
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.host_mock import MockHost
-from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
-from webkitpy.layout_tests.port.driver import DriverInput, DriverOutput
 from webkitpy.layout_tests.port.test import TestPort
-from webkitpy.layout_tests.views import printing
-from webkitpy.performance_tests.perftest import ChromiumStylePerfTest
-from webkitpy.performance_tests.perftest import PerfTest
+from webkitpy.performance_tests.perftest import DEFAULT_TEST_RUNNER_COUNT
 from webkitpy.performance_tests.perftestsrunner import PerfTestsRunner
 
 
 class MainTest(unittest.TestCase):
-    def assertWritten(self, stream, contents):
-        self.assertEquals(stream.buflist, contents)
-
-    def normalizeFinishedTime(self, log):
-        return re.sub(r'Finished: [0-9\.]+ s', 'Finished: 0.1 s', log)
-
-    class TestDriver:
-        def run_test(self, driver_input, stop_when_done):
-            text = ''
-            timeout = False
-            crash = False
-            if driver_input.test_name.endswith('pass.html'):
-                text = 'RESULT group_name: test_name= 42 ms'
-            elif driver_input.test_name.endswith('timeout.html'):
-                timeout = True
-            elif driver_input.test_name.endswith('failed.html'):
-                text = None
-            elif driver_input.test_name.endswith('tonguey.html'):
-                text = 'we are not expecting an output from perf tests but RESULT blablabla'
-            elif driver_input.test_name.endswith('crash.html'):
-                crash = True
-            elif driver_input.test_name.endswith('event-target-wrapper.html'):
-                text = """Running 20 times
-Ignoring warm-up run (1502)
-1504
-1505
-1510
-1504
-1507
-1509
-1510
-1487
-1488
-1472
-1472
-1488
-1473
-1472
-1475
-1487
-1486
-1486
-1475
-1471
-
-Time:
-values 1504, 1505, 1510, 1504, 1507, 1509, 1510, 1487, 1488, 1472, 1472, 1488, 1473, 1472, 1475, 1487, 1486, 1486, 1475, 1471 ms
-avg 1489.05 ms
-median 1487 ms
-stdev 14.46 ms
-min 1471 ms
-max 1510 ms
-"""
-            elif driver_input.test_name.endswith('some-parser.html'):
-                text = """Running 20 times
-Ignoring warm-up run (1115)
-
-Time:
-values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ms
-avg 1100 ms
-median 1101 ms
-stdev 11 ms
-min 1080 ms
-max 1120 ms
-"""
-            elif driver_input.test_name.endswith('memory-test.html'):
-                text = """Running 20 times
-Ignoring warm-up run (1115)
-
-Time:
-values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ms
-avg 1100 ms
-median 1101 ms
-stdev 11 ms
-min 1080 ms
-max 1120 ms
-
-JS Heap:
-values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 bytes
-avg 832000 bytes
-median 829000 bytes
-stdev 15000 bytes
-min 811000 bytes
-max 848000 bytes
-
-Malloc:
-values 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 bytes
-avg 532000 bytes
-median 529000 bytes
-stdev 13000 bytes
-min 511000 bytes
-max 548000 bytes
-"""
-            return DriverOutput(text, '', '', '', crash=crash, timeout=timeout)
-
-        def start(self):
-            """do nothing"""
-
-        def stop(self):
-            """do nothing"""
-
-    def create_runner(self, args=[], driver_class=TestDriver):
+    def create_runner(self, args=[]):
         options, parsed_args = PerfTestsRunner._parse_args(args)
         test_port = TestPort(host=MockHost(), options=options)
-        test_port.create_driver = lambda worker_number=None, no_timeout=False: driver_class()
-
         runner = PerfTestsRunner(args=args, port=test_port)
         runner._host.filesystem.maybe_make_directory(runner._base_path, 'inspector')
         runner._host.filesystem.maybe_make_directory(runner._base_path, 'Bindings')
         runner._host.filesystem.maybe_make_directory(runner._base_path, 'Parser')
-
-        filesystem = runner._host.filesystem
-        runner.load_output_json = lambda: json.loads(filesystem.read_text_file(runner._output_json_path()))
         return runner, test_port
 
-    def run_test(self, test_name):
-        runner, port = self.create_runner()
-        driver = MainTest.TestDriver()
-        return runner._run_single_test(ChromiumStylePerfTest(port, test_name, runner._host.filesystem.join('some-dir', test_name)), driver)
-
-    def test_run_passing_test(self):
-        self.assertTrue(self.run_test('pass.html'))
-
-    def test_run_silent_test(self):
-        self.assertFalse(self.run_test('silent.html'))
-
-    def test_run_failed_test(self):
-        self.assertFalse(self.run_test('failed.html'))
-
-    def test_run_tonguey_test(self):
-        self.assertFalse(self.run_test('tonguey.html'))
-
-    def test_run_timeout_test(self):
-        self.assertFalse(self.run_test('timeout.html'))
-
-    def test_run_crash_test(self):
-        self.assertFalse(self.run_test('crash.html'))
-
-    def _tests_for_runner(self, runner, test_names):
-        filesystem = runner._host.filesystem
-        tests = []
-        for test in test_names:
-            path = filesystem.join(runner._base_path, test)
-            dirname = filesystem.dirname(path)
-            if test.startswith('inspector/'):
-                tests.append(ChromiumStylePerfTest(runner._port, test, path))
-            else:
-                tests.append(PerfTest(runner._port, test, path))
-        return tests
-
-    def test_run_test_set(self):
-        runner, port = self.create_runner()
-        tests = self._tests_for_runner(runner, ['inspector/pass.html', 'inspector/silent.html', 'inspector/failed.html',
-            'inspector/tonguey.html', 'inspector/timeout.html', 'inspector/crash.html'])
-        output = OutputCapture()
-        output.capture_output()
-        try:
-            unexpected_result_count = runner._run_tests_set(tests, port)
-        finally:
-            stdout, stderr, log = output.restore_output()
-        self.assertEqual(unexpected_result_count, len(tests) - 1)
-        self.assertTrue('\nRESULT group_name: test_name= 42 ms\n' in log)
-
-    def test_run_test_set_kills_drt_per_run(self):
-
-        class TestDriverWithStopCount(MainTest.TestDriver):
-            stop_count = 0
-
-            def stop(self):
-                TestDriverWithStopCount.stop_count += 1
-
-        runner, port = self.create_runner(driver_class=TestDriverWithStopCount)
-
-        tests = self._tests_for_runner(runner, ['inspector/pass.html', 'inspector/silent.html', 'inspector/failed.html',
-            'inspector/tonguey.html', 'inspector/timeout.html', 'inspector/crash.html'])
-        unexpected_result_count = runner._run_tests_set(tests, port)
-
-        self.assertEqual(TestDriverWithStopCount.stop_count, 6)
-
-    def test_run_test_pause_before_testing(self):
-        class TestDriverWithStartCount(MainTest.TestDriver):
-            start_count = 0
-
-            def start(self):
-                TestDriverWithStartCount.start_count += 1
-
-        runner, port = self.create_runner(args=["--pause-before-testing"], driver_class=TestDriverWithStartCount)
-        tests = self._tests_for_runner(runner, ['inspector/pass.html'])
-
-        output = OutputCapture()
-        output.capture_output()
-        try:
-            unexpected_result_count = runner._run_tests_set(tests, port)
-            self.assertEqual(TestDriverWithStartCount.start_count, 1)
-        finally:
-            stdout, stderr, log = output.restore_output()
-        self.assertEqual(stderr, "Ready to run test?\n")
-        self.assertEqual(self.normalizeFinishedTime(log),
-            "Running inspector/pass.html (1 of 1)\nRESULT group_name: test_name= 42 ms\nFinished: 0.1 s\n\n")
-
-    def test_run_test_set_for_parser_tests(self):
-        runner, port = self.create_runner()
-        tests = self._tests_for_runner(runner, ['Bindings/event-target-wrapper.html', 'Parser/some-parser.html'])
-        output = OutputCapture()
-        output.capture_output()
-        try:
-            unexpected_result_count = runner._run_tests_set(tests, port)
-        finally:
-            stdout, stderr, log = output.restore_output()
-        self.assertEqual(unexpected_result_count, 0)
-        self.assertEqual(self.normalizeFinishedTime(log), '\n'.join(['Running Bindings/event-target-wrapper.html (1 of 2)',
-        'RESULT Bindings: event-target-wrapper= 1489.05 ms',
-        'median= 1487.0 ms, stdev= 14.46 ms, min= 1471.0 ms, max= 1510.0 ms',
-        'Finished: 0.1 s',
-        '',
-        'Running Parser/some-parser.html (2 of 2)',
-        'RESULT Parser: some-parser= 1100.0 ms',
-        'median= 1101.0 ms, stdev= 11.0 ms, min= 1080.0 ms, max= 1120.0 ms',
-        'Finished: 0.1 s',
-        '', '']))
-
-    def test_run_memory_test(self):
-        runner, port = self.create_runner_and_setup_results_template()
-        runner._timestamp = 123456789
-        port.host.filesystem.write_text_file(runner._base_path + '/Parser/memory-test.html', 'some content')
-
-        output = OutputCapture()
-        output.capture_output()
-        try:
-            unexpected_result_count = runner.run()
-        finally:
-            stdout, stderr, log = output.restore_output()
-        self.assertEqual(unexpected_result_count, 0)
-        self.assertEqual(self.normalizeFinishedTime(log), '\n'.join([
-            'Running 1 tests',
-            'Running Parser/memory-test.html (1 of 1)',
-            'RESULT Parser: memory-test= 1100.0 ms',
-            'median= 1101.0 ms, stdev= 11.0 ms, min= 1080.0 ms, max= 1120.0 ms',
-            'RESULT Parser: memory-test: JSHeap= 832000.0 bytes',
-            'median= 829000.0 bytes, stdev= 15000.0 bytes, min= 811000.0 bytes, max= 848000.0 bytes',
-            'RESULT Parser: memory-test: Malloc= 532000.0 bytes',
-            'median= 529000.0 bytes, stdev= 13000.0 bytes, min= 511000.0 bytes, max= 548000.0 bytes',
-            'Finished: 0.1 s',
-            '', '']))
-        results = runner.load_output_json()[0]['results']
-        values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
-        self.assertEqual(results['Parser/memory-test'], {'min': 1080.0, 'max': 1120.0, 'median': 1101.0, 'stdev': 11.0, 'avg': 1100.0, 'unit': 'ms', 'values': values})
-        self.assertEqual(results['Parser/memory-test:JSHeap'], {'min': 811000.0, 'max': 848000.0, 'median': 829000.0, 'stdev': 15000.0, 'avg': 832000.0, 'unit': 'bytes', 'values': values})
-        self.assertEqual(results['Parser/memory-test:Malloc'], {'min': 511000.0, 'max': 548000.0, 'median': 529000.0, 'stdev': 13000.0, 'avg': 532000.0, 'unit': 'bytes', 'values': values})
-
-    def _test_run_with_json_output(self, runner, filesystem, upload_suceeds=False, expected_exit_code=0):
-        filesystem.write_text_file(runner._base_path + '/inspector/pass.html', 'some content')
-        filesystem.write_text_file(runner._base_path + '/Bindings/event-target-wrapper.html', 'some content')
-
-        uploaded = [False]
-
-        def mock_upload_json(hostname, json_path):
-            self.assertEqual(hostname, 'some.host')
-            self.assertEqual(json_path, '/mock-checkout/output.json')
-            uploaded[0] = upload_suceeds
-            return upload_suceeds
-
-        runner._upload_json = mock_upload_json
-        runner._timestamp = 123456789
-        output_capture = OutputCapture()
-        output_capture.capture_output()
-        try:
-            self.assertEqual(runner.run(), expected_exit_code)
-        finally:
-            stdout, stderr, logs = output_capture.restore_output()
-
-        if not expected_exit_code:
-            self.assertEqual(self.normalizeFinishedTime(logs),
-                '\n'.join(['Running 2 tests',
-                'Running Bindings/event-target-wrapper.html (1 of 2)',
-                'RESULT Bindings: event-target-wrapper= 1489.05 ms',
-                'median= 1487.0 ms, stdev= 14.46 ms, min= 1471.0 ms, max= 1510.0 ms',
-                'Finished: 0.1 s',
-                '',
-                'Running inspector/pass.html (2 of 2)',
-                'RESULT group_name: test_name= 42 ms',
-                'Finished: 0.1 s',
-                '',
-                '']))
-
-        self.assertEqual(uploaded[0], upload_suceeds)
-
-        return logs
-
-    _event_target_wrapper_and_inspector_results = {
-        "Bindings/event-target-wrapper": {"max": 1510, "avg": 1489.05, "median": 1487, "min": 1471, "stdev": 14.46, "unit": "ms",
-           "values": [1504, 1505, 1510, 1504, 1507, 1509, 1510, 1487, 1488, 1472, 1472, 1488, 1473, 1472, 1475, 1487, 1486, 1486, 1475, 1471]},
-        "inspector/pass.html:group_name:test_name": 42}
-
-    def test_run_with_json_output(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
-            '--test-results-server=some.host'])
-        self._test_run_with_json_output(runner, port.host.filesystem, upload_suceeds=True)
-        self.assertEqual(runner.load_output_json(), [{
-            "timestamp": 123456789, "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "branch": "webkit-trunk"}])
-
-        filesystem = port.host.filesystem
-        self.assertTrue(filesystem.isfile(runner._output_json_path()))
-        self.assertTrue(filesystem.isfile(filesystem.splitext(runner._output_json_path())[0] + '.html'))
-
-    def test_run_with_description(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
-            '--test-results-server=some.host', '--description', 'some description'])
-        self._test_run_with_json_output(runner, port.host.filesystem, upload_suceeds=True)
-        self.assertEqual(runner.load_output_json(), [{
-            "timestamp": 123456789, "description": "some description",
-            "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "branch": "webkit-trunk"}])
-
-    def create_runner_and_setup_results_template(self, args=[]):
-        runner, port = self.create_runner(args)
-        filesystem = port.host.filesystem
-        filesystem.write_text_file(runner._base_path + '/resources/results-template.html',
-            'BEGIN<script src="%AbsolutePathToWebKitTrunk%/some.js"></script>'
-            '<script src="%AbsolutePathToWebKitTrunk%/other.js"></script><script>%PeformanceTestsResultsJSON%</script>END')
-        filesystem.write_text_file(runner._base_path + '/Dromaeo/resources/dromaeo/web/lib/jquery-1.6.4.js', 'jquery content')
-        return runner, port
-
-    def test_run_respects_no_results(self):
-        runner, port = self.create_runner(args=['--output-json-path=/mock-checkout/output.json',
-            '--test-results-server=some.host', '--no-results'])
-        self._test_run_with_json_output(runner, port.host.filesystem, upload_suceeds=False)
-        self.assertFalse(port.host.filesystem.isfile('/mock-checkout/output.json'))
-
-    def test_run_generates_json_by_default(self):
-        runner, port = self.create_runner_and_setup_results_template()
-        filesystem = port.host.filesystem
-        output_json_path = runner._output_json_path()
-        results_page_path = filesystem.splitext(output_json_path)[0] + '.html'
-
-        self.assertFalse(filesystem.isfile(output_json_path))
-        self.assertFalse(filesystem.isfile(results_page_path))
-
-        self._test_run_with_json_output(runner, port.host.filesystem)
-
-        self.assertEqual(json.loads(port.host.filesystem.read_text_file(output_json_path)), [{
-            "timestamp": 123456789, "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "branch": "webkit-trunk"}])
-
-        self.assertTrue(filesystem.isfile(output_json_path))
-        self.assertTrue(filesystem.isfile(results_page_path))
-
-    def test_run_merges_output_by_default(self):
-        runner, port = self.create_runner_and_setup_results_template()
-        filesystem = port.host.filesystem
-        output_json_path = runner._output_json_path()
-
-        filesystem.write_text_file(output_json_path, '[{"previous": "results"}]')
-
-        self._test_run_with_json_output(runner, port.host.filesystem)
-
-        self.assertEqual(json.loads(port.host.filesystem.read_text_file(output_json_path)), [{"previous": "results"}, {
-            "timestamp": 123456789, "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "branch": "webkit-trunk"}])
-        self.assertTrue(filesystem.isfile(filesystem.splitext(output_json_path)[0] + '.html'))
-
-    def test_run_respects_reset_results(self):
-        runner, port = self.create_runner_and_setup_results_template(args=["--reset-results"])
-        filesystem = port.host.filesystem
-        output_json_path = runner._output_json_path()
-
-        filesystem.write_text_file(output_json_path, '[{"previous": "results"}]')
-
-        self._test_run_with_json_output(runner, port.host.filesystem)
-
-        self.assertEqual(json.loads(port.host.filesystem.read_text_file(output_json_path)), [{
-            "timestamp": 123456789, "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "branch": "webkit-trunk"}])
-        self.assertTrue(filesystem.isfile(filesystem.splitext(output_json_path)[0] + '.html'))
-        pass
-
-    def test_run_generates_and_show_results_page(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json'])
-        page_shown = []
-        port.show_results_html_file = lambda path: page_shown.append(path)
-        filesystem = port.host.filesystem
-        self._test_run_with_json_output(runner, filesystem)
-
-        expected_entry = {"timestamp": 123456789, "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "branch": "webkit-trunk"}
-
-        self.maxDiff = None
-        json_output = port.host.filesystem.read_text_file('/mock-checkout/output.json')
-        self.assertEqual(json.loads(json_output), [expected_entry])
-        self.assertEqual(filesystem.read_text_file('/mock-checkout/output.html'),
-            'BEGIN<script src="/test.checkout/some.js"></script><script src="/test.checkout/other.js"></script>'
-            '<script>%s</script>END' % json_output)
-        self.assertEqual(page_shown[0], '/mock-checkout/output.html')
-
-        self._test_run_with_json_output(runner, filesystem)
-        json_output = port.host.filesystem.read_text_file('/mock-checkout/output.json')
-        self.assertEqual(json.loads(json_output), [expected_entry, expected_entry])
-        self.assertEqual(filesystem.read_text_file('/mock-checkout/output.html'),
-            'BEGIN<script src="/test.checkout/some.js"></script><script src="/test.checkout/other.js"></script>'
-            '<script>%s</script>END' % json_output)
-
-    def test_run_respects_no_show_results(self):
-        show_results_html_file = lambda path: page_shown.append(path)
-
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json'])
-        page_shown = []
-        port.show_results_html_file = show_results_html_file
-        self._test_run_with_json_output(runner, port.host.filesystem)
-        self.assertEqual(page_shown[0], '/mock-checkout/output.html')
-
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
-            '--no-show-results'])
-        page_shown = []
-        port.show_results_html_file = show_results_html_file
-        self._test_run_with_json_output(runner, port.host.filesystem)
-        self.assertEqual(page_shown, [])
-
-    def test_run_with_bad_output_json(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json'])
-        port.host.filesystem.write_text_file('/mock-checkout/output.json', 'bad json')
-        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_MERGE)
-        port.host.filesystem.write_text_file('/mock-checkout/output.json', '{"another bad json": "1"}')
-        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_MERGE)
-
-    def test_run_with_slave_config_json(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
-            '--slave-config-json-path=/mock-checkout/slave-config.json', '--test-results-server=some.host'])
-        port.host.filesystem.write_text_file('/mock-checkout/slave-config.json', '{"key": "value"}')
-        self._test_run_with_json_output(runner, port.host.filesystem, upload_suceeds=True)
-        self.assertEqual(runner.load_output_json(), [{
-            "timestamp": 123456789, "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "branch": "webkit-trunk", "key": "value"}])
-
-    def test_run_with_bad_slave_config_json(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
-            '--slave-config-json-path=/mock-checkout/slave-config.json', '--test-results-server=some.host'])
-        logs = self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_SOURCE_JSON)
-        self.assertTrue('Missing slave configuration JSON file: /mock-checkout/slave-config.json' in logs)
-        port.host.filesystem.write_text_file('/mock-checkout/slave-config.json', 'bad json')
-        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_SOURCE_JSON)
-        port.host.filesystem.write_text_file('/mock-checkout/slave-config.json', '["another bad json"]')
-        self._test_run_with_json_output(runner, port.host.filesystem, expected_exit_code=PerfTestsRunner.EXIT_CODE_BAD_SOURCE_JSON)
-
-    def test_run_with_multiple_repositories(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
-            '--test-results-server=some.host'])
-        port.repository_paths = lambda: [('webkit', '/mock-checkout'), ('some', '/mock-checkout/some')]
-        self._test_run_with_json_output(runner, port.host.filesystem, upload_suceeds=True)
-        self.assertEqual(runner.load_output_json(), [{
-            "timestamp": 123456789, "results": self._event_target_wrapper_and_inspector_results,
-            "webkit-revision": "5678", "some-revision": "5678", "branch": "webkit-trunk"}])
-
-    def test_run_with_upload_json(self):
-        runner, port = self.create_runner_and_setup_results_template(args=['--output-json-path=/mock-checkout/output.json',
-            '--test-results-server', 'some.host', '--platform', 'platform1', '--builder-name', 'builder1', '--build-number', '123'])
-
-        self._test_run_with_json_output(runner, port.host.filesystem, upload_suceeds=True)
-        generated_json = json.loads(port.host.filesystem.files['/mock-checkout/output.json'])
-        self.assertEqual(generated_json[0]['platform'], 'platform1')
-        self.assertEqual(generated_json[0]['builder-name'], 'builder1')
-        self.assertEqual(generated_json[0]['build-number'], 123)
-
-        self._test_run_with_json_output(runner, port.host.filesystem, upload_suceeds=False, expected_exit_code=PerfTestsRunner.EXIT_CODE_FAILED_UPLOADING)
-
-    def test_upload_json(self):
-        runner, port = self.create_runner()
-        port.host.filesystem.files['/mock-checkout/some.json'] = 'some content'
-
-        called = []
-        upload_single_text_file_throws = False
-        upload_single_text_file_return_value = StringIO.StringIO('OK')
-
-        class MockFileUploader:
-            def __init__(mock, url, timeout):
-                self.assertEqual(url, 'https://some.host/api/test/report')
-                self.assertTrue(isinstance(timeout, int) and timeout)
-                called.append('FileUploader')
-
-            def upload_single_text_file(mock, filesystem, content_type, filename):
-                self.assertEqual(filesystem, port.host.filesystem)
-                self.assertEqual(content_type, 'application/json')
-                self.assertEqual(filename, 'some.json')
-                called.append('upload_single_text_file')
-                if upload_single_text_file_throws:
-                    raise "Some exception"
-                return upload_single_text_file_return_value
-
-        runner._upload_json('some.host', 'some.json', MockFileUploader)
-        self.assertEqual(called, ['FileUploader', 'upload_single_text_file'])
-
-        output = OutputCapture()
-        output.capture_output()
-        upload_single_text_file_return_value = StringIO.StringIO('Some error')
-        runner._upload_json('some.host', 'some.json', MockFileUploader)
-        _, _, logs = output.restore_output()
-        self.assertEqual(logs, 'Uploaded JSON but got a bad response:\nSome error\n')
-
-        # Throwing an exception upload_single_text_file shouldn't blow up _upload_json
-        called = []
-        upload_single_text_file_throws = True
-        runner._upload_json('some.host', 'some.json', MockFileUploader)
-        self.assertEqual(called, ['FileUploader', 'upload_single_text_file'])
-
     def _add_file(self, runner, dirname, filename, content=True):
         dirname = runner._host.filesystem.join(runner._base_path, dirname) if dirname else runner._base_path
         runner._host.filesystem.maybe_make_directory(dirname)
@@ -574,7 +74,7 @@
         add_file('test2.html')
         add_file('test3.html')
         port.host.filesystem.chdir(runner._port.perf_tests_dir()[:runner._port.perf_tests_dir().rfind(runner._host.filesystem.sep)])
-        self.assertEqual(self._collect_tests_and_sort_test_name(runner), ['test1.html', 'test2.html'])
+        self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner), ['test1.html', 'test2.html'])
 
     def test_collect_tests_with_skipped_list(self):
         runner, port = self.create_runner()
@@ -585,9 +85,22 @@
         self._add_file(runner, 'inspector/resources', 'resource_file.html')
         self._add_file(runner, 'unsupported', 'unsupported_test2.html')
         port.skipped_perf_tests = lambda: ['inspector/unsupported_test1.html', 'unsupported']
-        self.assertEqual(self._collect_tests_and_sort_test_name(runner), ['inspector/test1.html', 'inspector/test2.html'])
+        self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner), ['inspector/test1.html', 'inspector/test2.html'])
 
-    def test_collect_tests_with_skipped_list(self):
+    def test_collect_tests_with_skipped_list_and_files(self):
+        runner, port = self.create_runner(args=['Suite/Test1.html', 'Suite/SkippedTest1.html', 'SkippedSuite/Test1.html'])
+
+        self._add_file(runner, 'SkippedSuite', 'Test1.html')
+        self._add_file(runner, 'SkippedSuite', 'Test2.html')
+        self._add_file(runner, 'Suite', 'Test1.html')
+        self._add_file(runner, 'Suite', 'Test2.html')
+        self._add_file(runner, 'Suite', 'SkippedTest1.html')
+        self._add_file(runner, 'Suite', 'SkippedTest2.html')
+        port.skipped_perf_tests = lambda: ['Suite/SkippedTest1.html', 'Suite/SkippedTest1.html', 'SkippedSuite']
+        self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner),
+            ['SkippedSuite/Test1.html', 'Suite/SkippedTest1.html', 'Suite/Test1.html'])
+
+    def test_collect_tests_with_ignored_skipped_list(self):
         runner, port = self.create_runner(args=['--force'])
 
         self._add_file(runner, 'inspector', 'test1.html')
@@ -596,12 +109,12 @@
         self._add_file(runner, 'inspector/resources', 'resource_file.html')
         self._add_file(runner, 'unsupported', 'unsupported_test2.html')
         port.skipped_perf_tests = lambda: ['inspector/unsupported_test1.html', 'unsupported']
-        self.assertEqual(self._collect_tests_and_sort_test_name(runner), ['inspector/test1.html', 'inspector/test2.html', 'inspector/unsupported_test1.html', 'unsupported/unsupported_test2.html'])
+        self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner), ['inspector/test1.html', 'inspector/test2.html', 'inspector/unsupported_test1.html', 'unsupported/unsupported_test2.html'])
 
     def test_collect_tests_should_ignore_replay_tests_by_default(self):
         runner, port = self.create_runner()
         self._add_file(runner, 'Replay', 'www.webkit.org.replay')
-        self.assertEqual(runner._collect_tests(), [])
+        self.assertItemsEqual(runner._collect_tests(), [])
 
     def test_collect_tests_with_replay_tests(self):
         runner, port = self.create_runner(args=['--replay'])
@@ -610,6 +123,18 @@
         self.assertEqual(len(tests), 1)
         self.assertEqual(tests[0].__class__.__name__, 'ReplayPerfTest')
 
+    def test_default_args(self):
+        runner, port = self.create_runner()
+        options, args = PerfTestsRunner._parse_args([])
+        self.assertTrue(options.build)
+        self.assertEqual(options.time_out_ms, 600 * 1000)
+        self.assertTrue(options.generate_results)
+        self.assertTrue(options.show_results)
+        self.assertFalse(options.replay)
+        self.assertTrue(options.use_skipped_list)
+        self.assertEqual(options.repeat, 1)
+        self.assertEqual(options.test_runner_count, DEFAULT_TEST_RUNNER_COUNT)
+
     def test_parse_args(self):
         runner, port = self.create_runner()
         options, args = PerfTestsRunner._parse_args([
@@ -623,20 +148,84 @@
                 '--output-json-path=a/output.json',
                 '--slave-config-json-path=a/source.json',
                 '--test-results-server=somehost',
+                '--additional-drt-flag=--enable-threaded-parser',
+                '--additional-drt-flag=--awesomesauce',
+                '--repeat=5',
+                '--test-runner-count=5',
                 '--debug'])
-        self.assertEqual(options.build, True)
+        self.assertTrue(options.build)
         self.assertEqual(options.build_directory, 'folder42')
         self.assertEqual(options.platform, 'platform42')
         self.assertEqual(options.builder_name, 'webkit-mac-1')
         self.assertEqual(options.build_number, '56')
         self.assertEqual(options.time_out_ms, '42')
         self.assertEqual(options.configuration, 'Debug')
-        self.assertEqual(options.show_results, False)
-        self.assertEqual(options.reset_results, True)
+        self.assertFalse(options.show_results)
+        self.assertTrue(options.reset_results)
         self.assertEqual(options.output_json_path, 'a/output.json')
         self.assertEqual(options.slave_config_json_path, 'a/source.json')
         self.assertEqual(options.test_results_server, 'somehost')
+        self.assertEqual(options.additional_drt_flag, ['--enable-threaded-parser', '--awesomesauce'])
+        self.assertEqual(options.repeat, 5)
+        self.assertEqual(options.test_runner_count, 5)
 
+    def test_upload_json(self):
+        runner, port = self.create_runner()
+        port.host.filesystem.files['/mock-checkout/some.json'] = 'some content'
 
-if __name__ == '__main__':
-    unittest.main()
+        class MockFileUploader:
+            called = []
+            upload_single_text_file_throws = False
+            upload_single_text_file_return_value = None
+
+            @classmethod
+            def reset(cls):
+                cls.called = []
+                cls.upload_single_text_file_throws = False
+                cls.upload_single_text_file_return_value = None
+
+            def __init__(mock, url, timeout):
+                self.assertEqual(url, 'https://some.host/some/path')
+                self.assertTrue(isinstance(timeout, int) and timeout)
+                mock.called.append('FileUploader')
+
+            def upload_single_text_file(mock, filesystem, content_type, filename):
+                self.assertEqual(filesystem, port.host.filesystem)
+                self.assertEqual(content_type, 'application/json')
+                self.assertEqual(filename, 'some.json')
+                mock.called.append('upload_single_text_file')
+                if mock.upload_single_text_file_throws:
+                    raise Exception
+                return mock.upload_single_text_file_return_value
+
+        MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('OK')
+        self.assertTrue(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader))
+        self.assertEqual(MockFileUploader.called, ['FileUploader', 'upload_single_text_file'])
+
+        MockFileUploader.reset()
+        MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('Some error')
+        output = OutputCapture()
+        output.capture_output()
+        self.assertFalse(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader))
+        _, _, logs = output.restore_output()
+        self.assertEqual(logs, 'Uploaded JSON to https://some.host/some/path but got a bad response:\nSome error\n')
+
+        # Throwing an exception upload_single_text_file shouldn't blow up _upload_json
+        MockFileUploader.reset()
+        MockFileUploader.upload_single_text_file_throws = True
+        self.assertFalse(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader))
+        self.assertEqual(MockFileUploader.called, ['FileUploader', 'upload_single_text_file'])
+
+        MockFileUploader.reset()
+        MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('{"status": "OK"}')
+        self.assertTrue(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader))
+        self.assertEqual(MockFileUploader.called, ['FileUploader', 'upload_single_text_file'])
+
+        MockFileUploader.reset()
+        MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('{"status": "SomethingHasFailed", "failureStored": false}')
+        output = OutputCapture()
+        output.capture_output()
+        self.assertFalse(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader))
+        _, _, logs = output.restore_output()
+        serialized_json = json.dumps({'status': 'SomethingHasFailed', 'failureStored': False}, indent=4)
+        self.assertEqual(logs, 'Uploaded JSON to https://some.host/some/path but got an error:\n%s\n' % serialized_json)
diff --git a/Tools/Scripts/webkitpy/style/checker.py b/Tools/Scripts/webkitpy/style/checker.py
index 9f27c36..f9e4a46 100644
--- a/Tools/Scripts/webkitpy/style/checker.py
+++ b/Tools/Scripts/webkitpy/style/checker.py
@@ -39,6 +39,7 @@
 from checkers.common import CarriageReturnChecker
 from checkers.changelog import ChangeLogChecker
 from checkers.cpp import CppChecker
+from checkers.cmake import CMakeChecker
 from checkers.jsonchecker import JSONChecker
 from checkers.png import PNGChecker
 from checkers.python import PythonChecker
@@ -106,6 +107,9 @@
     #        with the 79 character limit, or some higher limit that is
     #        agreeable to the WebKit project.
     '-pep8/E501',
+
+    # FIXME: Move the pylint rules from the pylintrc to here. This will
+    # also require us to re-work lint-webkitpy to produce the equivalent output.
     ]
 
 
@@ -146,7 +150,8 @@
 
     ([# The Qt APIs use Qt declaration style, it puts the * to
       # the variable name, not to the class.
-      "Source/WebKit/qt/Api/"],
+      "Source/WebKit/qt/Api/",
+      "Source/WebKit/qt/WidgetApi/"],
      ["-readability/naming",
       "-whitespace/declaration"]),
 
@@ -160,6 +165,11 @@
       "Source/WebKit2/UIProcess/API/qt"],
      ["-readability/parameter_name"]),
 
+    ([# The GTK+ port uses the autotoolsconfig.h header in some C sources
+      # to serve the same purpose of config.h.
+      "Tools/GtkLauncher/main.c"],
+     ["-build/include_order"]),
+
     ([# The GTK+ APIs use GTK+ naming style, which includes
       # lower-cased, underscore-separated values, whitespace before
       # parens for function calls, and always having variable names.
@@ -170,7 +180,15 @@
      ["-readability/naming",
       "-readability/parameter_name",
       "-readability/null",
+      "-readability/enum_casing",
       "-whitespace/parens"]),
+
+    ([# The GTK+ API use upper case, underscore separated, words in
+      # certain types of enums (e.g. signals, properties).
+      "Source/WebKit2/UIProcess/API/gtk",
+      "Source/WebKit2/WebProcess/InjectedBundle/API/gtk"],
+     ["-readability/enum_casing"]),
+
     ([# Header files in ForwardingHeaders have no header guards or
       # exceptional header guards (e.g., WebCore_FWD_Debugger_h).
       "/ForwardingHeaders/"],
@@ -209,14 +227,19 @@
     ([# The WebKit2 C API has names with underscores and whitespace-aligned
       # struct members. Also, we allow unnecessary parameter names in
       # WebKit2 APIs because we're matching CF's header style.
+      # Additionally, we use word which starts with non-capital letter 'k'
+      # for types of enums.
       "Source/WebKit2/UIProcess/API/C/",
       "Source/WebKit2/Shared/API/c/",
       "Source/WebKit2/WebProcess/InjectedBundle/API/c/"],
-     ["-readability/naming",
+     ["-readability/enum_casing",
+      "-readability/naming",
       "-readability/parameter_name",
       "-whitespace/declaration"]),
     ([# These files define GObjects, which implies some definitions of
       # variables and functions containing underscores.
+      "Source/WebCore/platform/graphics/clutter/GraphicsLayerActor.cpp",
+      "Source/WebCore/platform/graphics/clutter/GraphicsLayerActor.h",
       "Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer1.cpp",
       "Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp",
       "Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp",
@@ -302,6 +325,8 @@
 
 _PNG_FILE_EXTENSION = 'png'
 
+_CMAKE_FILE_EXTENSION = 'cmake'
+
 # Files to skip that are less obvious.
 #
 # Some files should be skipped when checking style. For example,
@@ -313,7 +338,9 @@
     # except those ending in ...Private.h are GTK+ API headers,
     # which differ greatly from WebKit coding style.
     re.compile(r'Source/WebKit2/UIProcess/API/gtk/WebKit(?!.*Private\.h).*\.h$'),
-    'Source/WebKit2/UIProcess/API/gtk/webkit2.h']
+    re.compile(r'Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKit(?!.*Private\.h).*\.h$'),
+    'Source/WebKit2/UIProcess/API/gtk/webkit2.h',
+    'Source/WebKit2/WebProcess/InjectedBundle/API/gtk/webkit-web-extension.h']
 
 # Files to skip that are more common or obvious.
 #
@@ -321,6 +348,9 @@
 # with FileType.NONE are automatically skipped without warning.
 _SKIPPED_FILES_WITHOUT_WARNING = [
     "LayoutTests" + os.path.sep,
+    "Source/ThirdParty/leveldb" + os.path.sep,
+    # Prevents this being recognized as a text file.
+    "Source/WebCore/GNUmakefile.features.am.in",
     ]
 
 # Extensions of files which are allowed to contain carriage returns.
@@ -492,6 +522,7 @@
     WATCHLIST = 7
     XML = 8
     XCODEPROJ = 9
+    CMAKE = 10
 
 
 class CheckerDispatcher(object):
@@ -570,6 +601,8 @@
             return FileType.XCODEPROJ
         elif file_extension == _PNG_FILE_EXTENSION:
             return FileType.PNG
+        elif ((file_extension == _CMAKE_FILE_EXTENSION) or os.path.basename(file_path) == 'CMakeLists.txt'):
+            return FileType.CMAKE
         elif ((not file_extension and os.path.join("Tools", "Scripts") in file_path) or
               file_extension in _TEXT_FILE_EXTENSIONS or os.path.basename(file_path) == 'TestExpectations'):
             return FileType.TEXT
@@ -600,6 +633,8 @@
             checker = XcodeProjectFileChecker(file_path, handle_style_error)
         elif file_type == FileType.PNG:
             checker = PNGChecker(file_path, handle_style_error)
+        elif file_type == FileType.CMAKE:
+            checker = CMakeChecker(file_path, handle_style_error)
         elif file_type == FileType.TEXT:
             basename = os.path.basename(file_path)
             if basename == 'TestExpectations':
diff --git a/Tools/Scripts/webkitpy/style/checker_unittest.py b/Tools/Scripts/webkitpy/style/checker_unittest.py
old mode 100755
new mode 100644
index d834fd5..9a139c7
--- a/Tools/Scripts/webkitpy/style/checker_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checker_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # -*- coding: utf-8; -*-
 #
 # Copyright (C) 2009 Google Inc. All rights reserved.
@@ -36,7 +35,7 @@
 
 import logging
 import os
-import unittest
+import unittest2 as unittest
 
 import checker as style
 from webkitpy.common.system.logtesting import LogTesting, TestLogStream
@@ -169,12 +168,12 @@
         # Also do some additional checks.
         for rule in base_filter_rules:
             # Check no leading or trailing white space.
-            self.assertEquals(rule, rule.strip())
+            self.assertEqual(rule, rule.strip())
             # All categories are on by default, so defaults should
             # begin with -.
             self.assertTrue(rule.startswith('-'))
             # Check no rule occurs twice.
-            self.assertFalse(rule in already_seen)
+            self.assertNotIn(rule, already_seen)
             already_seen.append(rule)
 
     def test_defaults(self):
@@ -227,7 +226,7 @@
                       "readability/naming")
 
         # Test if Qt exceptions are indeed working
-        assertCheck("Source/WebKit/qt/Api/qwebpage.cpp",
+        assertCheck("Source/WebKit/qt/WidgetApi/qwebpage.cpp",
                     "readability/braces")
         assertCheck("Source/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp",
                     "readability/braces")
@@ -235,7 +234,7 @@
                     "readability/braces")
         assertCheck("Source/WebKit/qt/examples/platformplugin/WebPlugin.cpp",
                     "readability/braces")
-        assertNoCheck("Source/WebKit/qt/Api/qwebpage.cpp",
+        assertNoCheck("Source/WebKit/qt/WidgetApi/qwebpage.cpp",
                       "readability/naming")
         assertNoCheck("Source/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp",
                       "readability/naming")
@@ -275,8 +274,8 @@
         """Check that _MAX_REPORTS_PER_CATEGORY is valid."""
         all_categories = self._all_categories()
         for category in _MAX_REPORTS_PER_CATEGORY.iterkeys():
-            self.assertTrue(category in all_categories,
-                            'Key "%s" is not a category' % category)
+            self.assertIn(category, all_categories,
+                          'Key "%s" is not a category' % category)
 
 
 class CheckWebKitStyleFunctionTest(unittest.TestCase):
@@ -335,8 +334,8 @@
                                             handle_style_error=None,
                                             min_confidence=3)
         message = 'while checking: %s' % path
-        self.assertEquals(checker is None, is_checker_none, message)
-        self.assertEquals(self._dispatcher.should_skip_without_warning(path),
+        self.assertEqual(checker is None, is_checker_none, message)
+        self.assertEqual(self._dispatcher.should_skip_without_warning(path),
                           expected, message)
 
     def test_should_skip_without_warning__true(self):
@@ -378,7 +377,7 @@
 
         dispatcher = CheckerDispatcher()
         for file_path, expected_result in files.items():
-            self.assertEquals(dispatcher.should_check_and_strip_carriage_returns(file_path), expected_result, 'Checking: %s' % file_path)
+            self.assertEqual(dispatcher.should_check_and_strip_carriage_returns(file_path), expected_result, 'Checking: %s' % file_path)
 
 
 class CheckerDispatcherDispatchTest(unittest.TestCase):
@@ -397,13 +396,13 @@
     def assert_checker_none(self, file_path):
         """Assert that the dispatched checker is None."""
         checker = self.dispatch(file_path)
-        self.assertTrue(checker is None, 'Checking: "%s"' % file_path)
+        self.assertIsNone(checker, 'Checking: "%s"' % file_path)
 
     def assert_checker(self, file_path, expected_class):
         """Assert the type of the dispatched checker."""
         checker = self.dispatch(file_path)
         got_class = checker.__class__
-        self.assertEquals(got_class, expected_class,
+        self.assertEqual(got_class, expected_class,
                           'For path "%(file_path)s" got %(got_class)s when '
                           "expecting %(expected_class)s."
                           % {"file_path": file_path,
@@ -449,8 +448,8 @@
         file_path = "ChangeLog"
         self.assert_checker_changelog(file_path)
         checker = self.dispatch(file_path)
-        self.assertEquals(checker.file_path, file_path)
-        self.assertEquals(checker.handle_style_error,
+        self.assertEqual(checker.file_path, file_path)
+        self.assertEqual(checker.handle_style_error,
                           self.mock_handle_style_error)
 
     def test_cpp_paths(self):
@@ -471,18 +470,18 @@
         file_path = file_base + "." + file_extension
         self.assert_checker_cpp(file_path)
         checker = self.dispatch(file_path)
-        self.assertEquals(checker.file_extension, file_extension)
-        self.assertEquals(checker.file_path, file_path)
-        self.assertEquals(checker.handle_style_error, self.mock_handle_style_error)
-        self.assertEquals(checker.min_confidence, 3)
+        self.assertEqual(checker.file_extension, file_extension)
+        self.assertEqual(checker.file_path, file_path)
+        self.assertEqual(checker.handle_style_error, self.mock_handle_style_error)
+        self.assertEqual(checker.min_confidence, 3)
         # Check "-" for good measure.
         file_base = "-"
         file_extension = ""
         file_path = file_base
         self.assert_checker_cpp(file_path)
         checker = self.dispatch(file_path)
-        self.assertEquals(checker.file_extension, file_extension)
-        self.assertEquals(checker.file_path, file_path)
+        self.assertEqual(checker.file_extension, file_extension)
+        self.assertEqual(checker.file_path, file_path)
 
     def test_json_paths(self):
         """Test paths that should be checked as JSON."""
@@ -500,7 +499,7 @@
         file_path = file_base + "." + file_extension
         self.assert_checker_json(file_path)
         checker = self.dispatch(file_path)
-        self.assertEquals(checker._handle_style_error,
+        self.assertEqual(checker._handle_style_error,
                           self.mock_handle_style_error)
 
     def test_python_paths(self):
@@ -519,8 +518,8 @@
         file_path = file_base + "." + file_extension
         self.assert_checker_text(file_path)
         checker = self.dispatch(file_path)
-        self.assertEquals(checker.file_path, file_path)
-        self.assertEquals(checker.handle_style_error,
+        self.assertEqual(checker.file_path, file_path)
+        self.assertEqual(checker.handle_style_error,
                           self.mock_handle_style_error)
 
     def test_text_paths(self):
@@ -563,8 +562,8 @@
         file_path = file_base + "." + file_extension
         self.assert_checker_text(file_path)
         checker = self.dispatch(file_path)
-        self.assertEquals(checker.file_path, file_path)
-        self.assertEquals(checker.handle_style_error, self.mock_handle_style_error)
+        self.assertEqual(checker.file_path, file_path)
+        self.assertEqual(checker.handle_style_error, self.mock_handle_style_error)
 
     def test_xml_paths(self):
         """Test paths that should be checked as XML."""
@@ -582,7 +581,7 @@
         file_path = file_base + "." + file_extension
         self.assert_checker_xml(file_path)
         checker = self.dispatch(file_path)
-        self.assertEquals(checker._handle_style_error,
+        self.assertEqual(checker._handle_style_error,
                           self.mock_handle_style_error)
 
     def test_none_paths(self):
@@ -625,10 +624,10 @@
         configuration = self._style_checker_configuration()
 
         # Check that __init__ sets the "public" data attributes correctly.
-        self.assertEquals(configuration.max_reports_per_category,
+        self.assertEqual(configuration.max_reports_per_category,
                           {"whitespace/newline": 1})
-        self.assertEquals(configuration.stderr_write, self._mock_stderr_write)
-        self.assertEquals(configuration.min_confidence, 3)
+        self.assertEqual(configuration.stderr_write, self._mock_stderr_write)
+        self.assertEqual(configuration.min_confidence, 3)
 
     def test_is_reportable(self):
         """Test the is_reportable() method."""
@@ -653,13 +652,13 @@
     def test_write_style_error_emacs(self):
         """Test the write_style_error() method."""
         self._call_write_style_error("emacs")
-        self.assertEquals(self._error_messages,
+        self.assertEqual(self._error_messages,
                           ["foo.h:100:  message  [whitespace/tab] [5]\n"])
 
     def test_write_style_error_vs7(self):
         """Test the write_style_error() method."""
         self._call_write_style_error("vs7")
-        self.assertEquals(self._error_messages,
+        self.assertEqual(self._error_messages,
                           ["foo.h(100):  message  [whitespace/tab] [5]\n"])
 
 
@@ -685,8 +684,8 @@
                             stderr_write=self._mock_stderr_write)
         processor = StyleProcessor(configuration)
 
-        self.assertEquals(processor.error_count, 0)
-        self.assertEquals(self._messages, [])
+        self.assertEqual(processor.error_count, 0)
+        self.assertEqual(self._messages, [])
 
     def test_process(self):
         configuration = StyleProcessorConfiguration(
@@ -699,10 +698,10 @@
 
         processor.process(lines=['line1', 'Line with tab:\t'],
                           file_path='foo.txt')
-        self.assertEquals(processor.error_count, 1)
+        self.assertEqual(processor.error_count, 1)
         expected_messages = ['foo.txt(2):  Line contains tab character.  '
                              '[whitespace/tab] [5]\n']
-        self.assertEquals(self._messages, expected_messages)
+        self.assertEqual(self._messages, expected_messages)
 
 
 class StyleProcessor_CodeCoverageTest(LoggingTestCase):
@@ -861,18 +860,18 @@
         # Check that the carriage-return checker was instantiated correctly
         # and was passed lines correctly.
         carriage_checker = self.carriage_checker
-        self.assertEquals(carriage_checker.style_error_handler,
+        self.assertEqual(carriage_checker.style_error_handler,
                           expected_error_handler)
-        self.assertEquals(carriage_checker.lines, ['line1', 'line2'])
+        self.assertEqual(carriage_checker.lines, ['line1', 'line2'])
 
         # Check that the style checker was dispatched correctly and was
         # passed lines correctly.
         checker = self._mock_dispatcher.dispatched_checker
-        self.assertEquals(checker.file_path, 'foo.txt')
-        self.assertEquals(checker.min_confidence, 3)
-        self.assertEquals(checker.style_error_handler, expected_error_handler)
+        self.assertEqual(checker.file_path, 'foo.txt')
+        self.assertEqual(checker.min_confidence, 3)
+        self.assertEqual(checker.style_error_handler, expected_error_handler)
 
-        self.assertEquals(checker.lines, ['line1', 'line2'])
+        self.assertEqual(checker.lines, ['line1', 'line2'])
 
     def test_process__no_checker_dispatched(self):
         """Test the process() method for a path with no dispatched checker."""
diff --git a/Tools/Scripts/webkitpy/style/checkers/changelog.py b/Tools/Scripts/webkitpy/style/checkers/changelog.py
index a096d3f..699bc3d 100644
--- a/Tools/Scripts/webkitpy/style/checkers/changelog.py
+++ b/Tools/Scripts/webkitpy/style/checkers/changelog.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright (C) 2011 Patrick Gansterer <paroga@paroga.com>
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/style/checkers/changelog_unittest.py b/Tools/Scripts/webkitpy/style/checkers/changelog_unittest.py
index 9fe8a60..0ec0ec2 100644
--- a/Tools/Scripts/webkitpy/style/checkers/changelog_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/changelog_unittest.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright (C) 2010 Apple Inc. All rights reserved.
 # Copyright (C) 2011 Patrick Gansterer <paroga@paroga.com>
 #
@@ -26,7 +24,7 @@
 """Unit test for changelog.py."""
 
 import changelog
-import unittest
+import unittest2 as unittest
 
 
 class ChangeLogCheckerTest(unittest.TestCase):
@@ -44,8 +42,8 @@
 
         def handle_style_error(line_number, category, confidence, message):
             self.had_error = True
-            self.assertEquals(expected_line_number, line_number)
-            self.assertEquals(expected_category, category)
+            self.assertEqual(expected_line_number, line_number)
+            self.assertEqual(expected_category, category)
         self.lines_to_check = set(lines_to_check)
         checker = changelog.ChangeLogChecker('ChangeLog', handle_style_error, self.mock_should_line_be_checked)
         checker.check(changelog_data.split('\n'))
@@ -59,9 +57,9 @@
 
     def test_init(self):
         checker = changelog.ChangeLogChecker('ChangeLog', self.mock_handle_style_error, self.mock_should_line_be_checked)
-        self.assertEquals(checker.file_path, 'ChangeLog')
-        self.assertEquals(checker.handle_style_error, self.mock_handle_style_error)
-        self.assertEquals(checker.should_line_be_checked, self.mock_should_line_be_checked)
+        self.assertEqual(checker.file_path, 'ChangeLog')
+        self.assertEqual(checker.handle_style_error, self.mock_handle_style_error)
+        self.assertEqual(checker.should_line_be_checked, self.mock_should_line_be_checked)
 
     def test_missing_bug_number(self):
         self.assert_error(1, range(1, 20), 'changelog/bugnumber',
@@ -182,6 +180,3 @@
                              '        * Source/WebKit/foo.cpp:    \n'
                              '        * Source/WebKit/bar.cpp:\n'
                              '        * Source/WebKit/foobar.cpp: Description\n')
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/style/checkers/cmake.py b/Tools/Scripts/webkitpy/style/checkers/cmake.py
new file mode 100644
index 0000000..06b8929
--- /dev/null
+++ b/Tools/Scripts/webkitpy/style/checkers/cmake.py
@@ -0,0 +1,150 @@
+# Copyright (C) 2012 Intel Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""Supports checking WebKit style in cmake files.(.cmake, CMakeLists.txt)"""
+
+import re
+
+from common import TabChecker
+
+
+class CMakeChecker(object):
+
+    """Processes CMake lines for checking style."""
+
+    # NO_SPACE_CMDS list are based on commands section of CMake document.
+    # Now it is generated from
+    # http://www.cmake.org/cmake/help/v2.8.10/cmake.html#section_Commands.
+    # Some commands are from default CMake modules such as pkg_check_modules.
+    # Please keep list in alphabet order.
+    #
+    # For commands in this list, spaces should not be added it and its
+    # parentheses. For eg, message("testing"), not message ("testing")
+    #
+    # The conditional commands like if, else, endif, foreach, endforeach,
+    # while, endwhile and break are listed in ONE_SPACE_CMDS
+    NO_SPACE_CMDS = [
+        'add_custom_command', 'add_custom_target', 'add_definitions',
+        'add_dependencies', 'add_executable', 'add_library',
+        'add_subdirectory', 'add_test', 'aux_source_directory',
+        'build_command',
+        'cmake_minimum_required', 'cmake_policy', 'configure_file',
+        'create_test_sourcelist',
+        'define_property',
+        'enable_language', 'enable_testing', 'endfunction', 'endmacro',
+        'execute_process', 'export',
+        'file', 'find_file', 'find_library', 'find_package', 'find_path',
+        'find_program', 'fltk_wrap_ui', 'function',
+        'get_cmake_property', 'get_directory_property',
+        'get_filename_component', 'get_property', 'get_source_file_property',
+        'get_target_property', 'get_test_property',
+        'include', 'include_directories', 'include_external_msproject',
+        'include_regular_expression', 'install',
+        'link_directories', 'list', 'load_cache', 'load_command',
+        'macro', 'mark_as_advanced', 'math', 'message',
+        'option',
+        #From FindPkgConfig.cmake
+        'pkg_check_modules',
+        'project',
+        'qt_wrap_cpp', 'qt_wrap_ui',
+        'remove_definitions', 'return',
+        'separate_arguments', 'set', 'set_directory_properties', 'set_property',
+        'set_source_files_properties', 'set_target_properties',
+        'set_tests_properties', 'site_name', 'source_group', 'string',
+        'target_link_libraries', 'try_compile', 'try_run',
+        'unset',
+        'variable_watch',
+    ]
+
+    # CMake conditional commands, require one space between command and
+    # its parentheses, such as "if (", "foreach (", etc.
+    ONE_SPACE_CMDS = [
+        'if', 'else', 'elseif', 'endif',
+        'foreach', 'endforeach',
+        'while', 'endwhile',
+        'break',
+    ]
+
+    def __init__(self, file_path, handle_style_error):
+        self._handle_style_error = handle_style_error
+        self._tab_checker = TabChecker(file_path, handle_style_error)
+
+    def check(self, lines):
+        self._tab_checker.check(lines)
+        self._num_lines = len(lines)
+        for l in xrange(self._num_lines):
+            self._process_line(l + 1, lines[l])
+
+    def _process_line(self, line_number, line_content):
+        if re.match('(^|\ +)#', line_content):
+            # ignore comment line
+            return
+        l = line_content.expandtabs(4)
+        # check command like message( "testing")
+        if re.search('\(\ +', l):
+            self._handle_style_error(line_number, 'whitespace/parentheses', 5,
+                                     'No space after "("')
+        # check command like message("testing" )
+        if re.search('\ +\)', l) and not re.search('^\ +\)$', l):
+            self._handle_style_error(line_number, 'whitespace/parentheses', 5,
+                                     'No space before ")"')
+        self._check_trailing_whitespace(line_number, l)
+        self._check_no_space_cmds(line_number, l)
+        self._check_one_space_cmds(line_number, l)
+        self._check_indent(line_number, line_content)
+
+    def _check_trailing_whitespace(self, line_number, line_content):
+        line_content = line_content.rstrip('\n')    # chr(10), newline
+        line_content = line_content.rstrip('\r')    # chr(13), carriage return
+        line_content = line_content.rstrip('\x0c')  # chr(12), form feed, ^L
+        stripped = line_content.rstrip()
+        if line_content != stripped:
+            self._handle_style_error(line_number, 'whitespace/trailing', 5,
+                                     'No trailing spaces')
+
+    def _check_no_space_cmds(self, line_number, line_content):
+        # check command like "SET    (" or "Set("
+        for t in self.NO_SPACE_CMDS:
+            self._check_non_lowercase_cmd(line_number, line_content, t)
+            if re.search('(^|\ +)' + t.lower() + '\ +\(', line_content):
+                msg = 'No space between command "' + t.lower() + '" and its parentheses, should be "' + t + '("'
+                self._handle_style_error(line_number, 'whitespace/parentheses', 5, msg)
+
+    def _check_one_space_cmds(self, line_number, line_content):
+        # check command like "IF (" or "if(" or "if   (" or "If ()"
+        for t in self.ONE_SPACE_CMDS:
+            self._check_non_lowercase_cmd(line_number, line_content, t)
+            if re.search('(^|\ +)' + t.lower() + '(\(|\ \ +\()', line_content):
+                msg = 'One space between command "' + t.lower() + '" and its parentheses, should be "' + t + ' ("'
+                self._handle_style_error(line_number, 'whitespace/parentheses', 5, msg)
+
+    def _check_non_lowercase_cmd(self, line_number, line_content, cmd):
+        if re.search('(^|\ +)' + cmd + '\ *\(', line_content, flags=re.IGNORECASE) and \
+           (not re.search('(^|\ +)' + cmd.lower() + '\ *\(', line_content)):
+            msg = 'Use lowercase command "' + cmd.lower() + '"'
+            self._handle_style_error(line_number, 'command/lowercase', 5, msg)
+
+    def _check_indent(self, line_number, line_content):
+        #TODO (halton): add indent checking
+        pass
diff --git a/Tools/Scripts/webkitpy/style/checkers/cmake_unittest.py b/Tools/Scripts/webkitpy/style/checkers/cmake_unittest.py
new file mode 100644
index 0000000..7b2cdaf
--- /dev/null
+++ b/Tools/Scripts/webkitpy/style/checkers/cmake_unittest.py
@@ -0,0 +1,90 @@
+# Copyright (C) 2012 Intel Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for cmake.py."""
+
+import unittest2 as unittest
+
+from cmake import CMakeChecker
+
+
+class CMakeCheckerTest(unittest.TestCase):
+
+    """Tests CMakeChecker class."""
+
+    def test_init(self):
+        """Test __init__() method."""
+        def _mock_handle_style_error(self):
+            pass
+
+        checker = CMakeChecker("foo.cmake", _mock_handle_style_error)
+        self.assertEqual(checker._handle_style_error, _mock_handle_style_error)
+
+    def test_check(self):
+        """Test check() method."""
+        errors = []
+
+        def _mock_handle_style_error(line_number, category, confidence,
+                                     message):
+            error = (line_number, category, confidence, message)
+            errors.append(error)
+
+        checker = CMakeChecker("foo.cmake", _mock_handle_style_error)
+
+        lines = [
+            '# This file is sample input for cmake_unittest.py and includes below problems:\n',
+            'IF ()',
+            '\tmessage("Error line with Tab")\n',
+            '    message("Error line with endding spaces")    \n',
+            '    message( "Error line with space after (")\n',
+            '    message("Error line with space before (" )\n',
+            '    MESSAGE("Error line with upper case non-condtional command")\n',
+            '    MESSage("Error line with upper case non-condtional command")\n',
+            '    message("correct message line")\n',
+            'ENDif ()\n',
+            '\n',
+            'if()\n',
+            'endif ()\n',
+            '\n',
+            'macro ()\n',
+            'ENDMacro()\n',
+            '\n',
+            'function    ()\n',
+            'endfunction()\n',
+            ]
+        checker.check(lines)
+
+        self.maxDiff = None
+        self.assertEqual(errors, [
+            (3, 'whitespace/tab', 5, 'Line contains tab character.'),
+            (2, 'command/lowercase', 5, 'Use lowercase command "if"'),
+            (4, 'whitespace/trailing', 5, 'No trailing spaces'),
+            (5, 'whitespace/parentheses', 5, 'No space after "("'),
+            (6, 'whitespace/parentheses', 5, 'No space before ")"'),
+            (7, 'command/lowercase', 5, 'Use lowercase command "message"'),
+            (8, 'command/lowercase', 5, 'Use lowercase command "message"'),
+            (10, 'command/lowercase', 5, 'Use lowercase command "endif"'),
+            (12, 'whitespace/parentheses', 5, 'One space between command "if" and its parentheses, should be "if ("'),
+            (15, 'whitespace/parentheses', 5, 'No space between command "macro" and its parentheses, should be "macro("'),
+            (16, 'command/lowercase', 5, 'Use lowercase command "endmacro"'),
+            (18, 'whitespace/parentheses', 5, 'No space between command "function" and its parentheses, should be "function("'),
+            ])
diff --git a/Tools/Scripts/webkitpy/style/checkers/common_unittest.py b/Tools/Scripts/webkitpy/style/checkers/common_unittest.py
index 1fe1263..8449b98 100644
--- a/Tools/Scripts/webkitpy/style/checkers/common_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/common_unittest.py
@@ -22,7 +22,7 @@
 
 """Unit tests for common.py."""
 
-import unittest
+import unittest2 as unittest
 
 from common import CarriageReturnChecker
 from common import TabChecker
@@ -59,12 +59,12 @@
         output_lines = checker.check(input_lines)
 
         # Check both the return value and error messages.
-        self.assertEquals(output_lines, expected_lines)
+        self.assertEqual(output_lines, expected_lines)
 
         expected_errors = [(line_number, self._category, self._confidence,
                             self._expected_message)
                            for line_number in error_lines]
-        self.assertEquals(self._style_errors, expected_errors)
+        self.assertEqual(self._style_errors, expected_errors)
 
     def test_ends_with_carriage(self):
         self.assert_carriage_return(["carriage return\r"],
@@ -110,7 +110,7 @@
 
         checker = TabChecker('', style_error_handler)
         checker.check(input_lines)
-        self.assertEquals(self._error_lines, error_lines)
+        self.assertEqual(self._error_lines, error_lines)
 
     def test_notab(self):
         self.assert_tab([''], [])
@@ -119,6 +119,3 @@
     def test_tab(self):
         self.assert_tab(['\tfoo'], [1])
         self.assert_tab(['line1', '\tline2', 'line3\t'], [2, 3])
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/style/checkers/cpp.py b/Tools/Scripts/webkitpy/style/checkers/cpp.py
index a1447e2..81f5cbb 100644
--- a/Tools/Scripts/webkitpy/style/checkers/cpp.py
+++ b/Tools/Scripts/webkitpy/style/checkers/cpp.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # -*- coding: utf-8 -*-
 #
 # Copyright (C) 2009, 2010, 2012 Google Inc. All rights reserved.
@@ -1078,7 +1077,7 @@
     line = clean_lines.elided[line_number]
     for single_thread_function, multithread_safe_function in _THREADING_LIST:
         index = line.find(single_thread_function)
-        # Comparisons made explicit for clarity -- pylint: disable-msg=C6403
+        # Comparisons made explicit for clarity
         if index >= 0 and (index == 0 or (not line[index - 1].isalnum()
                                           and line[index - 1] not in ('_', '.', '>'))):
             error(line_number, 'runtime/threadsafe_fn', 2,
@@ -1210,6 +1209,51 @@
         return self.is_c() or self.is_objective_c()
 
 
+class _EnumState(object):
+    """Maintains whether currently in an enum declaration, and checks whether
+    enum declarations follow the style guide.
+    """
+
+    def __init__(self):
+        self.in_enum_decl = False
+        self.is_webidl_enum = False
+
+    def process_clean_line(self, line):
+        # FIXME: The regular expressions for expr_all_uppercase and expr_enum_end only accept integers
+        # and identifiers for the value of the enumerator, but do not accept any other constant
+        # expressions. However, this is sufficient for now (11/27/2012).
+        expr_all_uppercase = r'\s*[A-Z0-9_]+\s*(?:=\s*[a-zA-Z0-9]+\s*)?,?\s*$'
+        expr_starts_lowercase = r'\s*[a-z]'
+        expr_enum_end = r'}\s*(?:[a-zA-Z0-9]+\s*(?:=\s*[a-zA-Z0-9]+)?)?\s*;\s*'
+        expr_enum_start = r'\s*enum(?:\s+[a-zA-Z0-9]+)?\s*\{?\s*'
+        if self.in_enum_decl:
+            if match(r'\s*' + expr_enum_end + r'$', line):
+                self.in_enum_decl = False
+                self.is_webidl_enum = False
+            elif match(expr_all_uppercase, line):
+                return self.is_webidl_enum
+            elif match(expr_starts_lowercase, line):
+                return False
+        else:
+            matched = match(expr_enum_start + r'$', line)
+            if matched:
+                self.in_enum_decl = True
+            else:
+                matched = match(expr_enum_start + r'(?P<members>.*)' + expr_enum_end + r'$', line)
+                if matched:
+                    members = matched.group('members').split(',')
+                    found_invalid_member = False
+                    for member in members:
+                        if match(expr_all_uppercase, member):
+                            found_invalid_member = not self.is_webidl_enum
+                        if match(expr_starts_lowercase, member):
+                            found_invalid_member = True
+                        if found_invalid_member:
+                            self.is_webidl_enum = False
+                            return False
+                    return True
+        return True
+
 def check_for_non_standard_constructs(clean_lines, line_number,
                                       class_state, error):
     """Logs an error if we see certain non-ANSI constructs ignored by gcc-2.
@@ -1793,7 +1837,7 @@
     comment_position = line.find('//')
     if comment_position != -1:
         # Check if the // may be in quotes.  If so, ignore it
-        # Comparisons made explicit for clarity -- pylint: disable-msg=C6403
+        # Comparisons made explicit for clarity
         if (line.count('"', 0, comment_position) - line.count('\\"', 0, comment_position)) % 2 == 0:   # not in quotes
             # Allow one space before end of line comment.
             if (not match(r'^\s*$', line[:comment_position])
@@ -2040,6 +2084,23 @@
             break;
 
 
+def check_enum_casing(clean_lines, line_number, enum_state, error):
+    """Looks for incorrectly named enum values.
+
+    Args:
+      clean_lines: A CleansedLines instance containing the file.
+      line_number: The number of the line to check.
+      enum_state: A _EnumState instance which maintains enum declaration state.
+      error: The function to call with any errors found.
+    """
+
+    enum_state.is_webidl_enum |= bool(match(r'\s*// Web(?:Kit)?IDL enum\s*$', clean_lines.raw_lines[line_number]))
+
+    line = clean_lines.elided[line_number]  # Get rid of comments and strings.
+    if not enum_state.process_clean_line(line):
+        error(line_number, 'readability/enum_casing', 4,
+              'enum members should use InterCaps with an initial capital letter.')
+
 def check_directive_indentation(clean_lines, line_number, file_state, error):
     """Looks for indentation of preprocessor directives.
 
@@ -2495,8 +2556,8 @@
     if search(r'\bgdk_pixbuf_save_to\w+\b', line):
         return
 
-    # Don't warn about NULL usage in gtk_widget_style_get() or gtk_style_context_get_style. See Bug 51758
-    if search(r'\bgtk_widget_style_get\(\w+\b', line) or search(r'\bgtk_style_context_get_style\(\w+\b', line):
+    # Don't warn about NULL usage in gtk_widget_style_get(), gtk_style_context_get_style(), or gtk_style_context_get(). See Bug 51758
+    if search(r'\bgtk_widget_style_get\(\w+\b', line) or search(r'\bgtk_style_context_get_style\(\w+\b', line) or search(r'\bgtk_style_context_get\(\w+\b', line):
         return
 
     # Don't warn about NULL usage in soup_server_new(). See Bug 77890.
@@ -2535,7 +2596,7 @@
     return len(line)
 
 
-def check_style(clean_lines, line_number, file_extension, class_state, file_state, error):
+def check_style(clean_lines, line_number, file_extension, class_state, file_state, enum_state, error):
     """Checks rules from the 'C++ style rules' section of cppguide.html.
 
     Most of these rules are hard to test (naming, comment style), but we
@@ -2550,6 +2611,7 @@
                    the current stack of nested class declarations being parsed.
       file_state: A _FileState instance which maintains information about
                   the state of things in the file.
+      enum_state: A _EnumState instance which maintains the current enum state.
       error: The function to call with any errors found.
     """
 
@@ -2604,6 +2666,7 @@
     check_for_comparisons_to_zero(clean_lines, line_number, error)
     check_for_null(clean_lines, line_number, file_state, error)
     check_indentation_amount(clean_lines, line_number, error)
+    check_enum_casing(clean_lines, line_number, enum_state, error)
 
 
 _RE_PATTERN_INCLUDE_NEW_STYLE = re.compile(r'#include +"[^/]+\.h"')
@@ -3478,7 +3541,7 @@
 
 def process_line(filename, file_extension,
                  clean_lines, line, include_state, function_state,
-                 class_state, file_state, error):
+                 class_state, file_state, enum_state, error):
     """Processes a single line in the file.
 
     Args:
@@ -3493,6 +3556,8 @@
                    the current stack of nested class declarations being parsed.
       file_state: A _FileState instance which maintains information about
                   the state of things in the file.
+      enum_state: A _EnumState instance which maintains an enum declaration
+                  state.
       error: A callable to which errors are reported, which takes arguments:
              line number, error level, and message
 
@@ -3508,7 +3573,7 @@
     check_pass_ptr_usage(clean_lines, line, function_state, error)
     check_for_leaky_patterns(clean_lines, line, function_state, error)
     check_for_multiline_comments_and_strings(clean_lines, line, error)
-    check_style(clean_lines, line, file_extension, class_state, file_state, error)
+    check_style(clean_lines, line, file_extension, class_state, file_state, enum_state, error)
     check_language(filename, clean_lines, line, file_extension, include_state,
                    file_state, error)
     check_for_non_standard_constructs(clean_lines, line, class_state, error)
@@ -3541,9 +3606,11 @@
     remove_multi_line_comments(lines, error)
     clean_lines = CleansedLines(lines)
     file_state = _FileState(clean_lines, file_extension)
+    enum_state = _EnumState()
     for line in xrange(clean_lines.num_lines()):
         process_line(filename, file_extension, clean_lines, line,
-                     include_state, function_state, class_state, file_state, error)
+                     include_state, function_state, class_state, file_state,
+                     enum_state, error)
     class_state.check_finished(error)
 
     check_for_include_what_you_use(filename, clean_lines, include_state, error)
@@ -3585,6 +3652,7 @@
         'readability/comparison_to_zero',
         'readability/constructors',
         'readability/control_flow',
+        'readability/enum_casing',
         'readability/fn_size',
         'readability/function',
         'readability/multiline_comment',
diff --git a/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py b/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
index 5522201..8de99df 100644
--- a/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # -*- coding: utf-8; -*-
 #
 # Copyright (C) 2011 Google Inc. All rights reserved.
@@ -40,7 +39,7 @@
 import os
 import random
 import re
-import unittest
+import unittest2 as unittest
 import cpp as cpp_style
 from cpp import CppChecker
 from ..filter import FilterConfiguration
@@ -116,17 +115,17 @@
     """Supports testing functions that do not need CppStyleTestBase."""
 
     def test_convert_to_lower_with_underscores(self):
-        self.assertEquals(cpp_style._convert_to_lower_with_underscores('ABC'), 'abc')
-        self.assertEquals(cpp_style._convert_to_lower_with_underscores('aB'), 'a_b')
-        self.assertEquals(cpp_style._convert_to_lower_with_underscores('isAName'), 'is_a_name')
-        self.assertEquals(cpp_style._convert_to_lower_with_underscores('AnotherTest'), 'another_test')
-        self.assertEquals(cpp_style._convert_to_lower_with_underscores('PassRefPtr<MyClass>'), 'pass_ref_ptr<my_class>')
-        self.assertEquals(cpp_style._convert_to_lower_with_underscores('_ABC'), '_abc')
+        self.assertEqual(cpp_style._convert_to_lower_with_underscores('ABC'), 'abc')
+        self.assertEqual(cpp_style._convert_to_lower_with_underscores('aB'), 'a_b')
+        self.assertEqual(cpp_style._convert_to_lower_with_underscores('isAName'), 'is_a_name')
+        self.assertEqual(cpp_style._convert_to_lower_with_underscores('AnotherTest'), 'another_test')
+        self.assertEqual(cpp_style._convert_to_lower_with_underscores('PassRefPtr<MyClass>'), 'pass_ref_ptr<my_class>')
+        self.assertEqual(cpp_style._convert_to_lower_with_underscores('_ABC'), '_abc')
 
     def test_create_acronym(self):
-        self.assertEquals(cpp_style._create_acronym('ABC'), 'ABC')
-        self.assertEquals(cpp_style._create_acronym('IsAName'), 'IAN')
-        self.assertEquals(cpp_style._create_acronym('PassRefPtr<MyClass>'), 'PRP<MC>')
+        self.assertEqual(cpp_style._create_acronym('ABC'), 'ABC')
+        self.assertEqual(cpp_style._create_acronym('IsAName'), 'IAN')
+        self.assertEqual(cpp_style._create_acronym('PassRefPtr<MyClass>'), 'PRP<MC>')
 
     def test_is_c_or_objective_c(self):
         clean_lines = cpp_style.CleansedLines([''])
@@ -141,68 +140,68 @@
     def test_parameter(self):
         # Test type.
         parameter = cpp_style.Parameter('ExceptionCode', 13, 1)
-        self.assertEquals(parameter.type, 'ExceptionCode')
-        self.assertEquals(parameter.name, '')
-        self.assertEquals(parameter.row, 1)
+        self.assertEqual(parameter.type, 'ExceptionCode')
+        self.assertEqual(parameter.name, '')
+        self.assertEqual(parameter.row, 1)
 
         # Test type and name.
         parameter = cpp_style.Parameter('PassRefPtr<MyClass> parent', 19, 1)
-        self.assertEquals(parameter.type, 'PassRefPtr<MyClass>')
-        self.assertEquals(parameter.name, 'parent')
-        self.assertEquals(parameter.row, 1)
+        self.assertEqual(parameter.type, 'PassRefPtr<MyClass>')
+        self.assertEqual(parameter.name, 'parent')
+        self.assertEqual(parameter.row, 1)
 
         # Test type, no name, with default value.
         parameter = cpp_style.Parameter('MyClass = 0', 7, 0)
-        self.assertEquals(parameter.type, 'MyClass')
-        self.assertEquals(parameter.name, '')
-        self.assertEquals(parameter.row, 0)
+        self.assertEqual(parameter.type, 'MyClass')
+        self.assertEqual(parameter.name, '')
+        self.assertEqual(parameter.row, 0)
 
         # Test type, name, and default value.
         parameter = cpp_style.Parameter('MyClass a = 0', 7, 0)
-        self.assertEquals(parameter.type, 'MyClass')
-        self.assertEquals(parameter.name, 'a')
-        self.assertEquals(parameter.row, 0)
+        self.assertEqual(parameter.type, 'MyClass')
+        self.assertEqual(parameter.name, 'a')
+        self.assertEqual(parameter.row, 0)
 
     def test_single_line_view(self):
         start_position = cpp_style.Position(row=1, column=1)
         end_position = cpp_style.Position(row=3, column=1)
         single_line_view = cpp_style.SingleLineView(['0', 'abcde', 'fgh', 'i'], start_position, end_position)
-        self.assertEquals(single_line_view.single_line, 'bcde fgh i')
-        self.assertEquals(single_line_view.convert_column_to_row(0), 1)
-        self.assertEquals(single_line_view.convert_column_to_row(4), 1)
-        self.assertEquals(single_line_view.convert_column_to_row(5), 2)
-        self.assertEquals(single_line_view.convert_column_to_row(8), 2)
-        self.assertEquals(single_line_view.convert_column_to_row(9), 3)
-        self.assertEquals(single_line_view.convert_column_to_row(100), 3)
+        self.assertEqual(single_line_view.single_line, 'bcde fgh i')
+        self.assertEqual(single_line_view.convert_column_to_row(0), 1)
+        self.assertEqual(single_line_view.convert_column_to_row(4), 1)
+        self.assertEqual(single_line_view.convert_column_to_row(5), 2)
+        self.assertEqual(single_line_view.convert_column_to_row(8), 2)
+        self.assertEqual(single_line_view.convert_column_to_row(9), 3)
+        self.assertEqual(single_line_view.convert_column_to_row(100), 3)
 
         start_position = cpp_style.Position(row=0, column=3)
         end_position = cpp_style.Position(row=0, column=4)
         single_line_view = cpp_style.SingleLineView(['abcdef'], start_position, end_position)
-        self.assertEquals(single_line_view.single_line, 'd')
+        self.assertEqual(single_line_view.single_line, 'd')
 
     def test_create_skeleton_parameters(self):
-        self.assertEquals(cpp_style.create_skeleton_parameters(''), '')
-        self.assertEquals(cpp_style.create_skeleton_parameters(' '), ' ')
-        self.assertEquals(cpp_style.create_skeleton_parameters('long'), 'long,')
-        self.assertEquals(cpp_style.create_skeleton_parameters('const unsigned long int'), '                    int,')
-        self.assertEquals(cpp_style.create_skeleton_parameters('long int*'), '     int ,')
-        self.assertEquals(cpp_style.create_skeleton_parameters('PassRefPtr<Foo> a'), 'PassRefPtr      a,')
-        self.assertEquals(cpp_style.create_skeleton_parameters(
+        self.assertEqual(cpp_style.create_skeleton_parameters(''), '')
+        self.assertEqual(cpp_style.create_skeleton_parameters(' '), ' ')
+        self.assertEqual(cpp_style.create_skeleton_parameters('long'), 'long,')
+        self.assertEqual(cpp_style.create_skeleton_parameters('const unsigned long int'), '                    int,')
+        self.assertEqual(cpp_style.create_skeleton_parameters('long int*'), '     int ,')
+        self.assertEqual(cpp_style.create_skeleton_parameters('PassRefPtr<Foo> a'), 'PassRefPtr      a,')
+        self.assertEqual(cpp_style.create_skeleton_parameters(
                 'ComplexTemplate<NestedTemplate1<MyClass1, MyClass2>, NestedTemplate1<MyClass1, MyClass2> > param, int second'),
                           'ComplexTemplate                                                                            param, int second,')
-        self.assertEquals(cpp_style.create_skeleton_parameters('int = 0, Namespace::Type& a'), 'int    ,            Type  a,')
+        self.assertEqual(cpp_style.create_skeleton_parameters('int = 0, Namespace::Type& a'), 'int    ,            Type  a,')
         # Create skeleton parameters is a bit too aggressive with function variables, but
         # it allows for parsing other parameters and declarations like this are rare.
-        self.assertEquals(cpp_style.create_skeleton_parameters('void (*fn)(int a, int b), Namespace::Type& a'),
+        self.assertEqual(cpp_style.create_skeleton_parameters('void (*fn)(int a, int b), Namespace::Type& a'),
                           'void                    ,            Type  a,')
 
         # This doesn't look like functions declarations but the simplifications help to eliminate false positives.
-        self.assertEquals(cpp_style.create_skeleton_parameters('b{d}'), 'b   ,')
+        self.assertEqual(cpp_style.create_skeleton_parameters('b{d}'), 'b   ,')
 
     def test_find_parameter_name_index(self):
-        self.assertEquals(cpp_style.find_parameter_name_index(' int a '), 5)
-        self.assertEquals(cpp_style.find_parameter_name_index(' PassRefPtr     '), 16)
-        self.assertEquals(cpp_style.find_parameter_name_index('double'), 6)
+        self.assertEqual(cpp_style.find_parameter_name_index(' int a '), 5)
+        self.assertEqual(cpp_style.find_parameter_name_index(' PassRefPtr     '), 16)
+        self.assertEqual(cpp_style.find_parameter_name_index('double'), 6)
 
     def test_parameter_list(self):
         elided_lines = ['int blah(PassRefPtr<MyClass> paramName,',
@@ -219,17 +218,17 @@
         index = 0
         for parameter in cpp_style.parameter_list(elided_lines, start_position, end_position):
             expected_parameter = expected_parameters[index]
-            self.assertEquals(parameter.type, expected_parameter['type'])
-            self.assertEquals(parameter.name, expected_parameter['name'])
-            self.assertEquals(parameter.row, expected_parameter['row'])
+            self.assertEqual(parameter.type, expected_parameter['type'])
+            self.assertEqual(parameter.name, expected_parameter['name'])
+            self.assertEqual(parameter.row, expected_parameter['row'])
             index += 1
-        self.assertEquals(index, len(expected_parameters))
+        self.assertEqual(index, len(expected_parameters))
 
     def test_check_parameter_against_text(self):
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         parameter = cpp_style.Parameter('FooF ooF', 4, 1)
         self.assertFalse(cpp_style._check_parameter_name_against_text(parameter, 'FooF', error_collector))
-        self.assertEquals(error_collector.results(),
+        self.assertEqual(error_collector.results(),
                           'The parameter name "ooF" adds no information, so it should be removed.  [readability/parameter_name] [5]')
 
 class CppStyleTestBase(unittest.TestCase):
@@ -253,7 +252,7 @@
                                            error, self.min_confidence, unit_test_config)
 
     def perform_lint(self, code, filename, basic_error_rules, unit_test_config={}, lines_to_check=None):
-        error_collector = ErrorCollector(self.assert_, FilterConfiguration(basic_error_rules), lines_to_check)
+        error_collector = ErrorCollector(self.assertTrue, FilterConfiguration(basic_error_rules), lines_to_check)
         lines = code.split('\n')
         extension = filename.split('.')[1]
         self.process_file_data(filename, extension, lines, error_collector, unit_test_config)
@@ -313,7 +312,7 @@
 
     # Perform lint and compare the error message with "expected_message".
     def assert_lint(self, code, expected_message, file_name='foo.cpp'):
-        self.assertEquals(expected_message, self.perform_single_line_lint(code, file_name))
+        self.assertEqual(expected_message, self.perform_single_line_lint(code, file_name))
 
     def assert_lint_one_of_many_errors_re(self, code, expected_message_re, file_name='foo.cpp'):
         messages = self.perform_single_line_lint(code, file_name)
@@ -321,11 +320,11 @@
             if re.search(expected_message_re, message):
                 return
 
-        self.assertEquals(expected_message_re, messages)
+        self.assertEqual(expected_message_re, messages)
 
     def assert_multi_line_lint(self, code, expected_message, file_name='foo.h'):
         file_extension = file_name[file_name.rfind('.') + 1:]
-        self.assertEquals(expected_message, self.perform_multi_line_lint(code, file_extension))
+        self.assertEqual(expected_message, self.perform_multi_line_lint(code, file_extension))
 
     def assert_multi_line_lint_re(self, code, expected_message_re, file_name='foo.h'):
         file_extension = file_name[file_name.rfind('.') + 1:]
@@ -334,22 +333,22 @@
             self.fail('Message was:\n' + message + 'Expected match to "' + expected_message_re + '"')
 
     def assert_language_rules_check(self, file_name, code, expected_message, lines_to_check=None):
-        self.assertEquals(expected_message,
+        self.assertEqual(expected_message,
                           self.perform_language_rules_check(file_name, code, lines_to_check))
 
     def assert_include_what_you_use(self, code, expected_message):
-        self.assertEquals(expected_message,
+        self.assertEqual(expected_message,
                           self.perform_include_what_you_use(code))
 
     def assert_blank_lines_check(self, lines, start_errors, end_errors):
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data('foo.cpp', 'cpp', lines, error_collector)
-        self.assertEquals(
+        self.assertEqual(
             start_errors,
             error_collector.results().count(
                 'Blank line at the start of a code block.  Is this needed?'
                 '  [whitespace/blank_line] [2]'))
-        self.assertEquals(
+        self.assertEqual(
             end_errors,
             error_collector.results().count(
                 'Blank line at the end of a code block.  Is this needed?'
@@ -360,7 +359,7 @@
 
         position: a cpp_style.Position object.
         tuple_position: a tuple (row, column) to compare against."""
-        self.assertEquals(position, cpp_style.Position(tuple_position[0], tuple_position[1]),
+        self.assertEqual(position, cpp_style.Position(tuple_position[0], tuple_position[1]),
                           'position %s, tuple_position %s' % (position, tuple_position))
 
 
@@ -368,16 +367,16 @@
     def perform_function_detection(self, lines, function_information, detection_line=0):
         clean_lines = cpp_style.CleansedLines(lines)
         function_state = cpp_style._FunctionState(5)
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         cpp_style.detect_functions(clean_lines, detection_line, function_state, error_collector)
         if not function_information:
-            self.assertEquals(function_state.in_a_function, False)
+            self.assertEqual(function_state.in_a_function, False)
             return
-        self.assertEquals(function_state.in_a_function, True)
-        self.assertEquals(function_state.current_function, function_information['name'] + '()')
-        self.assertEquals(function_state.modifiers_and_return_type(), function_information['modifiers_and_return_type'])
-        self.assertEquals(function_state.is_pure, function_information['is_pure'])
-        self.assertEquals(function_state.is_declaration, function_information['is_declaration'])
+        self.assertEqual(function_state.in_a_function, True)
+        self.assertEqual(function_state.current_function, function_information['name'] + '()')
+        self.assertEqual(function_state.modifiers_and_return_type(), function_information['modifiers_and_return_type'])
+        self.assertEqual(function_state.is_pure, function_information['is_pure'])
+        self.assertEqual(function_state.is_declaration, function_information['is_declaration'])
         self.assert_positions_equal(function_state.function_name_start_position, function_information['function_name_start_position'])
         self.assert_positions_equal(function_state.parameter_start_position, function_information['parameter_start_position'])
         self.assert_positions_equal(function_state.parameter_end_position, function_information['parameter_end_position'])
@@ -386,13 +385,13 @@
         expected_parameters = function_information.get('parameter_list')
         if expected_parameters:
             actual_parameters = function_state.parameter_list()
-            self.assertEquals(len(actual_parameters), len(expected_parameters))
+            self.assertEqual(len(actual_parameters), len(expected_parameters))
             for index in range(len(expected_parameters)):
                 actual_parameter = actual_parameters[index]
                 expected_parameter = expected_parameters[index]
-                self.assertEquals(actual_parameter.type, expected_parameter['type'])
-                self.assertEquals(actual_parameter.name, expected_parameter['name'])
-                self.assertEquals(actual_parameter.row, expected_parameter['row'])
+                self.assertEqual(actual_parameter.type, expected_parameter['type'])
+                self.assertEqual(actual_parameter.name, expected_parameter['name'])
+                self.assertEqual(actual_parameter.row, expected_parameter['row'])
 
     def test_basic_function_detection(self):
         self.perform_function_detection(
@@ -634,54 +633,54 @@
 
     # Test get line width.
     def test_get_line_width(self):
-        self.assertEquals(0, cpp_style.get_line_width(''))
-        self.assertEquals(10, cpp_style.get_line_width(u'x' * 10))
-        self.assertEquals(16, cpp_style.get_line_width(u'都|道|府|県|支庁'))
+        self.assertEqual(0, cpp_style.get_line_width(''))
+        self.assertEqual(10, cpp_style.get_line_width(u'x' * 10))
+        self.assertEqual(16, cpp_style.get_line_width(u'都|道|府|県|支庁'))
 
     def test_find_next_multi_line_comment_start(self):
-        self.assertEquals(1, cpp_style.find_next_multi_line_comment_start([''], 0))
+        self.assertEqual(1, cpp_style.find_next_multi_line_comment_start([''], 0))
 
         lines = ['a', 'b', '/* c']
-        self.assertEquals(2, cpp_style.find_next_multi_line_comment_start(lines, 0))
+        self.assertEqual(2, cpp_style.find_next_multi_line_comment_start(lines, 0))
 
         lines = ['char a[] = "/*";']  # not recognized as comment.
-        self.assertEquals(1, cpp_style.find_next_multi_line_comment_start(lines, 0))
+        self.assertEqual(1, cpp_style.find_next_multi_line_comment_start(lines, 0))
 
     def test_find_next_multi_line_comment_end(self):
-        self.assertEquals(1, cpp_style.find_next_multi_line_comment_end([''], 0))
+        self.assertEqual(1, cpp_style.find_next_multi_line_comment_end([''], 0))
         lines = ['a', 'b', ' c */']
-        self.assertEquals(2, cpp_style.find_next_multi_line_comment_end(lines, 0))
+        self.assertEqual(2, cpp_style.find_next_multi_line_comment_end(lines, 0))
 
     def test_remove_multi_line_comments_from_range(self):
         lines = ['a', '  /* comment ', ' * still comment', ' comment */   ', 'b']
         cpp_style.remove_multi_line_comments_from_range(lines, 1, 4)
-        self.assertEquals(['a', '// dummy', '// dummy', '// dummy', 'b'], lines)
+        self.assertEqual(['a', '// dummy', '// dummy', '// dummy', 'b'], lines)
 
     def test_position(self):
         position = cpp_style.Position(3, 4)
         self.assert_positions_equal(position, (3, 4))
-        self.assertEquals(position.row, 3)
+        self.assertEqual(position.row, 3)
         self.assertTrue(position > cpp_style.Position(position.row - 1, position.column + 1))
         self.assertTrue(position > cpp_style.Position(position.row, position.column - 1))
         self.assertTrue(position < cpp_style.Position(position.row, position.column + 1))
         self.assertTrue(position < cpp_style.Position(position.row + 1, position.column - 1))
-        self.assertEquals(position.__str__(), '(3, 4)')
+        self.assertEqual(position.__str__(), '(3, 4)')
 
     def test_rfind_in_lines(self):
         not_found_position = cpp_style.Position(10, 11)
         start_position = cpp_style.Position(2, 2)
         lines = ['ab', 'ace', 'test']
-        self.assertEquals(not_found_position, cpp_style._rfind_in_lines('st', lines, start_position, not_found_position))
+        self.assertEqual(not_found_position, cpp_style._rfind_in_lines('st', lines, start_position, not_found_position))
         self.assertTrue(cpp_style.Position(1, 1) == cpp_style._rfind_in_lines('a', lines, start_position, not_found_position))
-        self.assertEquals(cpp_style.Position(2, 2), cpp_style._rfind_in_lines('(te|a)', lines, start_position, not_found_position))
+        self.assertEqual(cpp_style.Position(2, 2), cpp_style._rfind_in_lines('(te|a)', lines, start_position, not_found_position))
 
     def test_close_expression(self):
-        self.assertEquals(cpp_style.Position(1, -1), cpp_style.close_expression([')('], cpp_style.Position(0, 1)))
-        self.assertEquals(cpp_style.Position(1, -1), cpp_style.close_expression([') ()'], cpp_style.Position(0, 1)))
-        self.assertEquals(cpp_style.Position(0, 4), cpp_style.close_expression([')[)]'], cpp_style.Position(0, 1)))
-        self.assertEquals(cpp_style.Position(0, 5), cpp_style.close_expression(['}{}{}'], cpp_style.Position(0, 3)))
-        self.assertEquals(cpp_style.Position(1, 1), cpp_style.close_expression(['}{}{', '}'], cpp_style.Position(0, 3)))
-        self.assertEquals(cpp_style.Position(2, -1), cpp_style.close_expression(['][][', ' '], cpp_style.Position(0, 3)))
+        self.assertEqual(cpp_style.Position(1, -1), cpp_style.close_expression([')('], cpp_style.Position(0, 1)))
+        self.assertEqual(cpp_style.Position(1, -1), cpp_style.close_expression([') ()'], cpp_style.Position(0, 1)))
+        self.assertEqual(cpp_style.Position(0, 4), cpp_style.close_expression([')[)]'], cpp_style.Position(0, 1)))
+        self.assertEqual(cpp_style.Position(0, 5), cpp_style.close_expression(['}{}{}'], cpp_style.Position(0, 3)))
+        self.assertEqual(cpp_style.Position(1, 1), cpp_style.close_expression(['}{}{', '}'], cpp_style.Position(0, 3)))
+        self.assertEqual(cpp_style.Position(2, -1), cpp_style.close_expression(['][][', ' '], cpp_style.Position(0, 3)))
 
     def test_spaces_at_end_of_line(self):
         self.assert_lint(
@@ -864,10 +863,10 @@
 
     def test_include_what_you_use_no_implementation_files(self):
         code = 'std::vector<int> foo;'
-        self.assertEquals('Add #include <vector> for vector<>'
+        self.assertEqual('Add #include <vector> for vector<>'
                           '  [build/include_what_you_use] [4]',
                           self.perform_include_what_you_use(code, 'foo.h'))
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_include_what_you_use(code, 'foo.cpp'))
 
     def test_include_what_you_use(self):
@@ -1003,7 +1002,7 @@
             '#include "blah/a.h"\n',
             filename='blah/a.cpp',
             io=MockIo(mock_header_contents))
-        self.assertEquals(message, '')
+        self.assertEqual(message, '')
 
         mock_header_contents = ['#include <set>']
         message = self.perform_include_what_you_use(
@@ -1013,7 +1012,7 @@
                std::set<int> foo;''',
             filename='blah/a.cpp',
             io=MockIo(mock_header_contents))
-        self.assertEquals(message, '')
+        self.assertEqual(message, '')
 
         # If there's just a .cpp and the header can't be found then it's ok.
         message = self.perform_include_what_you_use(
@@ -1022,7 +1021,7 @@
 
                std::set<int> foo;''',
             filename='blah/a.cpp')
-        self.assertEquals(message, '')
+        self.assertEqual(message, '')
 
         # Make sure we find the headers with relative paths.
         mock_header_contents = ['']
@@ -1033,40 +1032,40 @@
                std::set<int> foo;''' % (os.path.basename(os.getcwd()), os.path.sep),
             filename='a.cpp',
             io=MockIo(mock_header_contents))
-        self.assertEquals(message, 'Add #include <set> for set<>  '
+        self.assertEqual(message, 'Add #include <set> for set<>  '
                                    '[build/include_what_you_use] [4]')
 
     def test_files_belong_to_same_module(self):
         f = cpp_style.files_belong_to_same_module
-        self.assertEquals((True, ''), f('a.cpp', 'a.h'))
-        self.assertEquals((True, ''), f('base/google.cpp', 'base/google.h'))
-        self.assertEquals((True, ''), f('base/google_test.cpp', 'base/google.h'))
-        self.assertEquals((True, ''),
+        self.assertEqual((True, ''), f('a.cpp', 'a.h'))
+        self.assertEqual((True, ''), f('base/google.cpp', 'base/google.h'))
+        self.assertEqual((True, ''), f('base/google_test.cpp', 'base/google.h'))
+        self.assertEqual((True, ''),
                           f('base/google_unittest.cpp', 'base/google.h'))
-        self.assertEquals((True, ''),
+        self.assertEqual((True, ''),
                           f('base/internal/google_unittest.cpp',
                             'base/public/google.h'))
-        self.assertEquals((True, 'xxx/yyy/'),
+        self.assertEqual((True, 'xxx/yyy/'),
                           f('xxx/yyy/base/internal/google_unittest.cpp',
                             'base/public/google.h'))
-        self.assertEquals((True, 'xxx/yyy/'),
+        self.assertEqual((True, 'xxx/yyy/'),
                           f('xxx/yyy/base/google_unittest.cpp',
                             'base/public/google.h'))
-        self.assertEquals((True, ''),
+        self.assertEqual((True, ''),
                           f('base/google_unittest.cpp', 'base/google-inl.h'))
-        self.assertEquals((True, '/home/build/google3/'),
+        self.assertEqual((True, '/home/build/google3/'),
                           f('/home/build/google3/base/google.cpp', 'base/google.h'))
 
-        self.assertEquals((False, ''),
+        self.assertEqual((False, ''),
                           f('/home/build/google3/base/google.cpp', 'basu/google.h'))
-        self.assertEquals((False, ''), f('a.cpp', 'b.h'))
+        self.assertEqual((False, ''), f('a.cpp', 'b.h'))
 
     def test_cleanse_line(self):
-        self.assertEquals('int foo = 0;  ',
+        self.assertEqual('int foo = 0;  ',
                           cpp_style.cleanse_comments('int foo = 0;  // danger!'))
-        self.assertEquals('int o = 0;',
+        self.assertEqual('int o = 0;',
                           cpp_style.cleanse_comments('int /* foo */ o = 0;'))
-        self.assertEquals('foo(int a, int b);',
+        self.assertEqual('foo(int a, int b);',
                           cpp_style.cleanse_comments('foo(int a /* abc */, int b);'))
         self.assertEqual('f(a, b);',
                          cpp_style.cleanse_comments('f(a, /* name */ b);'))
@@ -1113,12 +1112,12 @@
 
         file_path = 'mydir/foo.cpp'
 
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'cpp',
                                ['const char* str = "This is a\\',
                                 ' multiline string.";'],
                                error_collector)
-        self.assertEquals(
+        self.assertEqual(
             2,  # One per line.
             error_collector.result_list().count(multiline_string_error_message))
 
@@ -1902,11 +1901,11 @@
 
     def test_newline_at_eof(self):
         def do_test(self, data, is_missing_eof):
-            error_collector = ErrorCollector(self.assert_)
+            error_collector = ErrorCollector(self.assertTrue)
             self.process_file_data('foo.cpp', 'cpp', data.split('\n'),
                                    error_collector)
             # The warning appears only once.
-            self.assertEquals(
+            self.assertEqual(
                 int(is_missing_eof),
                 error_collector.results().count(
                     'Could not find a newline character at the end of the file.'
@@ -1917,12 +1916,12 @@
 
     def test_invalid_utf8(self):
         def do_test(self, raw_bytes, has_invalid_utf8):
-            error_collector = ErrorCollector(self.assert_)
+            error_collector = ErrorCollector(self.assertTrue)
             self.process_file_data('foo.cpp', 'cpp',
                                    unicode(raw_bytes, 'utf8', 'replace').split('\n'),
                                    error_collector)
             # The warning appears only once.
-            self.assertEquals(
+            self.assertEqual(
                 int(has_invalid_utf8),
                 error_collector.results().count(
                     'Line contains invalid UTF-8'
@@ -1937,11 +1936,11 @@
         do_test(self, '\xef\xbf\xbd\n', True)
 
     def test_is_blank_line(self):
-        self.assert_(cpp_style.is_blank_line(''))
-        self.assert_(cpp_style.is_blank_line(' '))
-        self.assert_(cpp_style.is_blank_line(' \t\r\n'))
-        self.assert_(not cpp_style.is_blank_line('int a;'))
-        self.assert_(not cpp_style.is_blank_line('{'))
+        self.assertTrue(cpp_style.is_blank_line(''))
+        self.assertTrue(cpp_style.is_blank_line(' '))
+        self.assertTrue(cpp_style.is_blank_line(' \t\r\n'))
+        self.assertTrue(not cpp_style.is_blank_line('int a;'))
+        self.assertTrue(not cpp_style.is_blank_line('{'))
 
     def test_blank_lines_check(self):
         self.assert_blank_lines_check(['{\n', '\n', '\n', '}\n'], 1, 1)
@@ -1952,16 +1951,16 @@
         self.assert_blank_lines_check(['\n', '  if (foo) { return 0; }\n', '\n'], 0, 0)
 
     def test_allow_blank_line_before_closing_namespace(self):
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data('foo.cpp', 'cpp',
                                ['namespace {', '', '}  // namespace'],
                                error_collector)
-        self.assertEquals(0, error_collector.results().count(
+        self.assertEqual(0, error_collector.results().count(
             'Blank line at the end of a code block.  Is this needed?'
             '  [whitespace/blank_line] [3]'))
 
     def test_allow_blank_line_before_if_else_chain(self):
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data('foo.cpp', 'cpp',
                                ['if (hoge) {',
                                 '',  # No warning
@@ -1973,12 +1972,12 @@
                                 '',  # Warning on this line
                                 '}'],
                                error_collector)
-        self.assertEquals(1, error_collector.results().count(
+        self.assertEqual(1, error_collector.results().count(
             'Blank line at the end of a code block.  Is this needed?'
             '  [whitespace/blank_line] [3]'))
 
     def test_else_on_same_line_as_closing_braces(self):
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data('foo.cpp', 'cpp',
                                ['if (hoge) {',
                                 '',
@@ -1987,7 +1986,7 @@
                                 '',
                                 '}'],
                                error_collector)
-        self.assertEquals(1, error_collector.results().count(
+        self.assertEqual(1, error_collector.results().count(
             'An else should appear on the same line as the preceding }'
             '  [whitespace/newline] [4]'))
 
@@ -2144,7 +2143,7 @@
         # side of things, so just parse out the suggested header guard. This
         # doesn't allow us to test the suggested header guard, but it does let us
         # test all the other header tests.
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'h', [], error_collector)
         expected_guard = ''
         matcher = re.compile(
@@ -2159,10 +2158,10 @@
         self.assertNotEqual(expected_guard, '')
 
         # Wrong guard
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'h',
                                ['#ifndef FOO_H', '#define FOO_H'], error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(
                 '#ifndef header guard has wrong style, please use: %s'
@@ -2170,10 +2169,10 @@
             error_collector.result_list())
 
         # No define
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'h',
                                ['#ifndef %s' % expected_guard], error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(
                 'No #ifndef header guard found, suggested CPP variable is: %s'
@@ -2181,12 +2180,12 @@
             error_collector.result_list())
 
         # Mismatched define
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'h',
                                ['#ifndef %s' % expected_guard,
                                 '#define FOO_H'],
                                error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(
                 'No #ifndef header guard found, suggested CPP variable is: %s'
@@ -2194,7 +2193,7 @@
             error_collector.result_list())
 
         # No header guard errors
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'h',
                                ['#ifndef %s' % expected_guard,
                                 '#define %s' % expected_guard,
@@ -2205,13 +2204,13 @@
                 self.fail('Unexpected error: %s' % line)
 
         # Completely incorrect header guard
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'h',
                                ['#ifndef FOO',
                                 '#define FOO',
                                 '#endif  // FOO'],
                                error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(
                 '#ifndef header guard has wrong style, please use: %s'
@@ -2219,7 +2218,7 @@
             error_collector.result_list())
 
         # Special case for flymake
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data('mydir/Foo_flymake.h', 'h',
                                ['#ifndef %s' % expected_guard,
                                 '#define %s' % expected_guard,
@@ -2229,9 +2228,9 @@
             if line.find('build/header_guard') != -1:
                 self.fail('Unexpected error: %s' % line)
 
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data('mydir/Foo_flymake.h', 'h', [], error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(
                 'No #ifndef header guard found, suggested CPP variable is: %s'
@@ -2243,27 +2242,27 @@
 
         # Allow the WTF_ prefix for files in that directory.
         header_guard_filter = FilterConfiguration(('-', '+build/header_guard'))
-        error_collector = ErrorCollector(self.assert_, header_guard_filter)
+        error_collector = ErrorCollector(self.assertTrue, header_guard_filter)
         self.process_file_data('Source/JavaScriptCore/wtf/TestName.h', 'h',
                                ['#ifndef WTF_TestName_h', '#define WTF_TestName_h'],
                                error_collector)
-        self.assertEquals(0, len(error_collector.result_list()),
+        self.assertEqual(0, len(error_collector.result_list()),
                           error_collector.result_list())
 
         # Also allow the non WTF_ prefix for files in that directory.
-        error_collector = ErrorCollector(self.assert_, header_guard_filter)
+        error_collector = ErrorCollector(self.assertTrue, header_guard_filter)
         self.process_file_data('Source/JavaScriptCore/wtf/TestName.h', 'h',
                                ['#ifndef TestName_h', '#define TestName_h'],
                                error_collector)
-        self.assertEquals(0, len(error_collector.result_list()),
+        self.assertEqual(0, len(error_collector.result_list()),
                           error_collector.result_list())
 
         # Verify that we suggest the WTF prefix version.
-        error_collector = ErrorCollector(self.assert_, header_guard_filter)
+        error_collector = ErrorCollector(self.assertTrue, header_guard_filter)
         self.process_file_data('Source/JavaScriptCore/wtf/TestName.h', 'h',
                                ['#ifndef BAD_TestName_h', '#define BAD_TestName_h'],
                                error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(
                 '#ifndef header guard has wrong style, please use: WTF_TestName_h'
@@ -2403,29 +2402,29 @@
         file_path = 'mydir/googleclient/foo.cpp'
 
         # There should be a copyright message in the first 10 lines
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'cpp', [], error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(legal_copyright_message))
 
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(
             file_path, 'cpp',
             ['' for unused_i in range(10)] + [copyright_line],
             error_collector)
-        self.assertEquals(
+        self.assertEqual(
             1,
             error_collector.result_list().count(legal_copyright_message))
 
         # Test that warning isn't issued if Copyright line appears early enough.
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(file_path, 'cpp', [copyright_line], error_collector)
         for message in error_collector.result_list():
             if message.find('legal/copyright') != -1:
                 self.fail('Unexpected error: %s' % message)
 
-        error_collector = ErrorCollector(self.assert_)
+        error_collector = ErrorCollector(self.assertTrue)
         self.process_file_data(
             file_path, 'cpp',
             ['' for unused_i in range(9)] + [copyright_line],
@@ -2457,16 +2456,16 @@
                  'Line 4 "foo"']
 
         clean_lines = cpp_style.CleansedLines(lines)
-        self.assertEquals(lines, clean_lines.raw_lines)
-        self.assertEquals(4, clean_lines.num_lines())
+        self.assertEqual(lines, clean_lines.raw_lines)
+        self.assertEqual(4, clean_lines.num_lines())
 
-        self.assertEquals(['Line 1',
+        self.assertEqual(['Line 1',
                            'Line 2',
                            'Line 3 ',
                            'Line 4 "foo"'],
                           clean_lines.lines)
 
-        self.assertEquals(['Line 1',
+        self.assertEqual(['Line 1',
                            'Line 2',
                            'Line 3 ',
                            'Line 4 ""'],
@@ -2474,33 +2473,33 @@
 
     def test_init_empty(self):
         clean_lines = cpp_style.CleansedLines([])
-        self.assertEquals([], clean_lines.raw_lines)
-        self.assertEquals(0, clean_lines.num_lines())
+        self.assertEqual([], clean_lines.raw_lines)
+        self.assertEqual(0, clean_lines.num_lines())
 
     def test_collapse_strings(self):
         collapse = cpp_style.CleansedLines.collapse_strings
-        self.assertEquals('""', collapse('""'))             # ""     (empty)
-        self.assertEquals('"""', collapse('"""'))           # """    (bad)
-        self.assertEquals('""', collapse('"xyz"'))          # "xyz"  (string)
-        self.assertEquals('""', collapse('"\\\""'))         # "\""   (string)
-        self.assertEquals('""', collapse('"\'"'))           # "'"    (string)
-        self.assertEquals('"\"', collapse('"\"'))           # "\"    (bad)
-        self.assertEquals('""', collapse('"\\\\"'))         # "\\"   (string)
-        self.assertEquals('"', collapse('"\\\\\\"'))        # "\\\"  (bad)
-        self.assertEquals('""', collapse('"\\\\\\\\"'))     # "\\\\" (string)
+        self.assertEqual('""', collapse('""'))             # ""     (empty)
+        self.assertEqual('"""', collapse('"""'))           # """    (bad)
+        self.assertEqual('""', collapse('"xyz"'))          # "xyz"  (string)
+        self.assertEqual('""', collapse('"\\\""'))         # "\""   (string)
+        self.assertEqual('""', collapse('"\'"'))           # "'"    (string)
+        self.assertEqual('"\"', collapse('"\"'))           # "\"    (bad)
+        self.assertEqual('""', collapse('"\\\\"'))         # "\\"   (string)
+        self.assertEqual('"', collapse('"\\\\\\"'))        # "\\\"  (bad)
+        self.assertEqual('""', collapse('"\\\\\\\\"'))     # "\\\\" (string)
 
-        self.assertEquals('\'\'', collapse('\'\''))         # ''     (empty)
-        self.assertEquals('\'\'', collapse('\'a\''))        # 'a'    (char)
-        self.assertEquals('\'\'', collapse('\'\\\'\''))     # '\''   (char)
-        self.assertEquals('\'', collapse('\'\\\''))         # '\'    (bad)
-        self.assertEquals('', collapse('\\012'))            # '\012' (char)
-        self.assertEquals('', collapse('\\xfF0'))           # '\xfF0' (char)
-        self.assertEquals('', collapse('\\n'))              # '\n' (char)
-        self.assertEquals('\#', collapse('\\#'))            # '\#' (bad)
+        self.assertEqual('\'\'', collapse('\'\''))         # ''     (empty)
+        self.assertEqual('\'\'', collapse('\'a\''))        # 'a'    (char)
+        self.assertEqual('\'\'', collapse('\'\\\'\''))     # '\''   (char)
+        self.assertEqual('\'', collapse('\'\\\''))         # '\'    (bad)
+        self.assertEqual('', collapse('\\012'))            # '\012' (char)
+        self.assertEqual('', collapse('\\xfF0'))           # '\xfF0' (char)
+        self.assertEqual('', collapse('\\n'))              # '\n' (char)
+        self.assertEqual('\#', collapse('\\#'))            # '\#' (bad)
 
-        self.assertEquals('StringReplace(body, "", "");',
+        self.assertEqual('StringReplace(body, "", "");',
                           collapse('StringReplace(body, "\\\\", "\\\\\\\\");'))
-        self.assertEquals('\'\' ""',
+        self.assertEqual('\'\' ""',
                           collapse('\'"\' "foo"'))
 
 
@@ -2890,7 +2889,7 @@
           code: C++ source code expected to generate a warning message.
           expected_message: Message expected to be generated by the C++ code.
         """
-        self.assertEquals(expected_message,
+        self.assertEqual(expected_message,
                           self.perform_function_lengths_check(code))
 
     def trigger_lines(self, error_level):
@@ -3258,6 +3257,58 @@
                 };''',
             'The class Foo probably needs a virtual destructor')
 
+    def test_enum_casing(self):
+        self.assert_multi_line_lint(
+            '''\
+                enum Foo {
+                    FOO_ONE = 1,
+                    FOO_TWO
+                };
+                enum { FOO_ONE };
+                enum {FooOne, fooTwo};
+                enum {
+                    FOO_ONE
+                };''',
+            ['enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]'] * 5)
+
+        self.assert_multi_line_lint(
+            '''\
+                enum Foo {
+                    fooOne = 1,
+                    FooTwo = 2
+                };''',
+            'enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]')
+
+        self.assert_multi_line_lint(
+            '''\
+                enum Foo {
+                    FooOne = 1,
+                    FooTwo
+                } fooVar = FooOne;
+                enum { FooOne, FooTwo };
+                enum { FooOne, FooTwo } fooVar = FooTwo;
+                enum { FooOne= FooTwo } foo;
+                enum Enum123 {
+                    FooOne,
+                    FooTwo = FooOne,
+                };''',
+            '')
+
+        self.assert_multi_line_lint(
+            '''\
+                // WebIDL enum
+                enum Foo {
+                    FOO_ONE = 1,
+                    FOO_TWO = 2,
+                };''',
+            '')
+
+        self.assert_multi_line_lint(
+            '''\
+                // WebKitIDL enum
+                enum Foo { FOO_ONE, FOO_TWO };''',
+            '')
+
     def test_destructor_non_virtual_when_virtual_needed(self):
         self.assert_multi_line_lint_re(
             '''\
@@ -3280,7 +3331,7 @@
             '''\
                 class Foo {
                     enum Goo {
-                        GOO
+                        Goo
                     };
                     virtual void foo();
                 };''',
@@ -3346,7 +3397,7 @@
           code: C++ source code expected to generate a warning message.
           expected_message: Message expected to be generated by the C++ code.
         """
-        self.assertEquals(expected_message,
+        self.assertEqual(expected_message,
                           self.perform_pass_ptr_check(code))
 
     def test_pass_ref_ptr_in_function(self):
@@ -3461,7 +3512,7 @@
           code: C++ source code expected to generate a warning message.
           expected_message: Message expected to be generated by the C++ code.
         """
-        self.assertEquals(expected_message,
+        self.assertEqual(expected_message,
                           self.perform_leaky_pattern_check(code))
 
     def test_get_dc(self):
@@ -4360,6 +4411,9 @@
             'gtk_style_context_get_style(context, "propertyName", &value, "otherName", &otherValue, NULL);',
             '')
         self.assert_lint(
+            'gtk_style_context_get(context, static_cast<GtkStateFlags>(0), "property", &value, NULL);',
+            '')
+        self.assert_lint(
             'gtk_widget_style_get_property(style, NULL, NULL);',
             'Use 0 instead of NULL.  [readability/null] [5]',
             'foo.cpp')
@@ -4688,45 +4742,45 @@
         parameter_error_rules = ('-',
                                  '+readability/parameter_name')
         # No variable name, so no error.
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('void func(int);', 'test.cpp', parameter_error_rules))
 
         # Verify that copying the name of the set function causes the error (with some odd casing).
-        self.assertEquals(meaningless_variable_name_error_message % 'itemCount',
+        self.assertEqual(meaningless_variable_name_error_message % 'itemCount',
                           self.perform_lint('void setItemCount(size_t itemCount);', 'test.cpp', parameter_error_rules))
-        self.assertEquals(meaningless_variable_name_error_message % 'abcCount',
+        self.assertEqual(meaningless_variable_name_error_message % 'abcCount',
                           self.perform_lint('void setABCCount(size_t abcCount);', 'test.cpp', parameter_error_rules))
 
         # Verify that copying a type name will trigger the warning (even if the type is a template parameter).
-        self.assertEquals(meaningless_variable_name_error_message % 'context',
+        self.assertEqual(meaningless_variable_name_error_message % 'context',
                           self.perform_lint('void funct(PassRefPtr<ScriptExecutionContext> context);', 'test.cpp', parameter_error_rules))
 
         # Verify that acronyms as variable names trigger the error (for both set functions and type names).
-        self.assertEquals(meaningless_variable_name_error_message % 'ec',
+        self.assertEqual(meaningless_variable_name_error_message % 'ec',
                           self.perform_lint('void setExceptionCode(int ec);', 'test.cpp', parameter_error_rules))
-        self.assertEquals(meaningless_variable_name_error_message % 'ec',
+        self.assertEqual(meaningless_variable_name_error_message % 'ec',
                           self.perform_lint('void funct(ExceptionCode ec);', 'test.cpp', parameter_error_rules))
 
         # 'object' alone, appended, or as part of an acronym is meaningless.
-        self.assertEquals(meaningless_variable_name_error_message % 'object',
+        self.assertEqual(meaningless_variable_name_error_message % 'object',
                           self.perform_lint('void funct(RenderView object);', 'test.cpp', parameter_error_rules))
-        self.assertEquals(meaningless_variable_name_error_message % 'viewObject',
+        self.assertEqual(meaningless_variable_name_error_message % 'viewObject',
                           self.perform_lint('void funct(RenderView viewObject);', 'test.cpp', parameter_error_rules))
-        self.assertEquals(meaningless_variable_name_error_message % 'rvo',
+        self.assertEqual(meaningless_variable_name_error_message % 'rvo',
                           self.perform_lint('void funct(RenderView rvo);', 'test.cpp', parameter_error_rules))
 
         # Check that r, g, b, and a are allowed.
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('void setRGBAValues(int r, int g, int b, int a);', 'test.cpp', parameter_error_rules))
 
         # Verify that a simple substring match isn't done which would cause false positives.
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('void setNateLateCount(size_t elate);', 'test.cpp', parameter_error_rules))
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('void funct(NateLate elate);', 'test.cpp', parameter_error_rules))
 
         # Don't have generate warnings for functions (only declarations).
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('void funct(PassRefPtr<ScriptExecutionContext> context)\n'
                                             '{\n'
                                             '}\n', 'test.cpp', parameter_error_rules))
@@ -4743,33 +4797,33 @@
     def test_webkit_export_check(self):
         webkit_export_error_rules = ('-',
                                   '+readability/webkit_export')
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('WEBKIT_EXPORT int foo();\n',
                                             'WebKit/chromium/public/test.h',
                                             webkit_export_error_rules))
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('WEBKIT_EXPORT int foo();\n',
                                             'WebKit/chromium/tests/test.h',
                                             webkit_export_error_rules))
-        self.assertEquals('WEBKIT_EXPORT should only be used in header files.  [readability/webkit_export] [5]',
+        self.assertEqual('WEBKIT_EXPORT should only be used in header files.  [readability/webkit_export] [5]',
                           self.perform_lint('WEBKIT_EXPORT int foo();\n',
                                             'WebKit/chromium/public/test.cpp',
                                             webkit_export_error_rules))
-        self.assertEquals('WEBKIT_EXPORT should only appear in the chromium public (or tests) directory.  [readability/webkit_export] [5]',
+        self.assertEqual('WEBKIT_EXPORT should only appear in the chromium public (or tests) directory.  [readability/webkit_export] [5]',
                           self.perform_lint('WEBKIT_EXPORT int foo();\n',
                                             'WebKit/chromium/src/test.h',
                                             webkit_export_error_rules))
-        self.assertEquals('WEBKIT_EXPORT should not be used on a function with a body.  [readability/webkit_export] [5]',
+        self.assertEqual('WEBKIT_EXPORT should not be used on a function with a body.  [readability/webkit_export] [5]',
                           self.perform_lint('WEBKIT_EXPORT int foo() { }\n',
                                             'WebKit/chromium/public/test.h',
                                             webkit_export_error_rules))
-        self.assertEquals('WEBKIT_EXPORT should not be used on a function with a body.  [readability/webkit_export] [5]',
+        self.assertEqual('WEBKIT_EXPORT should not be used on a function with a body.  [readability/webkit_export] [5]',
                           self.perform_lint('WEBKIT_EXPORT inline int foo()\n'
                                             '{\n'
                                             '}\n',
                                             'WebKit/chromium/public/test.h',
                                             webkit_export_error_rules))
-        self.assertEquals('WEBKIT_EXPORT should not be used with a pure virtual function.  [readability/webkit_export] [5]',
+        self.assertEqual('WEBKIT_EXPORT should not be used with a pure virtual function.  [readability/webkit_export] [5]',
                           self.perform_lint('{}\n'
                                             'WEBKIT_EXPORT\n'
                                             'virtual\n'
@@ -4777,7 +4831,7 @@
                                             'foo() = 0;\n',
                                             'WebKit/chromium/public/test.h',
                                             webkit_export_error_rules))
-        self.assertEquals('',
+        self.assertEqual('',
                           self.perform_lint('{}\n'
                                             'WEBKIT_EXPORT\n'
                                             'virtual\n'
@@ -4804,10 +4858,10 @@
     def test_init(self):
         """Test __init__ constructor."""
         checker = self._checker()
-        self.assertEquals(checker.file_extension, "h")
-        self.assertEquals(checker.file_path, "foo")
-        self.assertEquals(checker.handle_style_error, self.mock_handle_style_error)
-        self.assertEquals(checker.min_confidence, 3)
+        self.assertEqual(checker.file_extension, "h")
+        self.assertEqual(checker.file_path, "foo")
+        self.assertEqual(checker.handle_style_error, self.mock_handle_style_error)
+        self.assertEqual(checker.min_confidence, 3)
 
     def test_eq(self):
         """Test __eq__ equality function."""
@@ -4837,30 +4891,3 @@
         # Thus, just check the distinguishing case to verify that the
         # code defines __ne__.
         self.assertFalse(checker1 != checker2)
-
-
-def tearDown():
-    """A global check to make sure all error-categories have been tested.
-
-    The main tearDown() routine is the only code we can guarantee will be
-    run after all other tests have been executed.
-    """
-    try:
-        if _run_verifyallcategoriesseen:
-            ErrorCollector(None).verify_all_categories_are_seen()
-    except NameError:
-        # If nobody set the global _run_verifyallcategoriesseen, then
-        # we assume we shouldn't run the test
-        pass
-
-if __name__ == '__main__':
-    import sys
-    # We don't want to run the verify_all_categories_are_seen() test unless
-    # we're running the full test suite: if we only run one test,
-    # obviously we're not going to see all the error categories.  So we
-    # only run verify_all_categories_are_seen() when no commandline flags
-    # are passed in.
-    global _run_verifyallcategoriesseen
-    _run_verifyallcategoriesseen = (len(sys.argv) == 1)
-
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py b/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py
old mode 100755
new mode 100644
index 973c673..62a0793
--- a/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright (C) 2010 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -24,7 +22,7 @@
 
 """Unit test for jsonchecker.py."""
 
-import unittest
+import unittest2 as unittest
 
 import jsonchecker
 
@@ -67,9 +65,9 @@
     def assert_error(self, expected_line_number, expected_category, json_data):
         def handle_style_error(mock_error_handler, line_number, category, confidence, message):
             mock_error_handler.had_error = True
-            self.assertEquals(expected_line_number, line_number)
-            self.assertEquals(expected_category, category)
-            self.assertTrue(category in jsonchecker.JSONChecker.categories)
+            self.assertEqual(expected_line_number, line_number)
+            self.assertEqual(expected_category, category)
+            self.assertIn(category, jsonchecker.JSONChecker.categories)
 
         error_handler = MockErrorHandler(handle_style_error)
         error_handler.had_error = False
@@ -91,7 +89,7 @@
     def test_init(self):
         error_handler = MockErrorHandler(self.mock_handle_style_error)
         checker = jsonchecker.JSONChecker('foo.json', error_handler)
-        self.assertEquals(checker._handle_style_error, error_handler)
+        self.assertEqual(checker._handle_style_error, error_handler)
 
     def test_no_error(self):
         self.assert_no_error("""{
@@ -111,6 +109,3 @@
                   ]
 }
 """)
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/style/checkers/png_unittest.py b/Tools/Scripts/webkitpy/style/checkers/png_unittest.py
index 764c285..a71a441 100644
--- a/Tools/Scripts/webkitpy/style/checkers/png_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/png_unittest.py
@@ -23,7 +23,7 @@
 
 """Unit test for png.py."""
 
-import unittest
+import unittest2 as unittest
 from png import PNGChecker
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.systemhost_mock import MockSystemHost
@@ -52,8 +52,8 @@
             pass
 
         checker = PNGChecker("test/config", mock_handle_style_error, MockSCMDetector('git'), MockSystemHost())
-        self.assertEquals(checker._file_path, "test/config")
-        self.assertEquals(checker._handle_style_error, mock_handle_style_error)
+        self.assertEqual(checker._file_path, "test/config")
+        self.assertEqual(checker._handle_style_error, mock_handle_style_error)
 
     def test_check(self):
         errors = []
@@ -69,8 +69,8 @@
         scm = MockSCMDetector('svn')
         checker = PNGChecker(file_path, mock_handle_style_error, scm, MockSystemHost(filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 1)
-        self.assertEquals(errors[0],
+        self.assertEqual(len(errors), 1)
+        self.assertEqual(errors[0],
                           (0, 'image/png', 5, 'Set the svn:mime-type property (svn propset svn:mime-type image/png ).'))
 
         files = {'/Users/mock/.subversion/config': 'enable-auto-props = yes\n*.png = svn:mime-type=image/png'}
@@ -79,7 +79,7 @@
         errors = []
         checker = PNGChecker("config", mock_handle_style_error, scm, MockSystemHost(os_name='linux', filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 0)
+        self.assertEqual(len(errors), 0)
 
         files = {'/Users/mock/.subversion/config': '#enable-auto-props = yes'}
         fs = MockFileSystem(files)
@@ -87,7 +87,7 @@
         errors = []
         checker = PNGChecker("config", mock_handle_style_error, scm, MockSystemHost(os_name='linux', filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 1)
+        self.assertEqual(len(errors), 1)
 
         files = {'/Users/mock/.subversion/config': 'enable-auto-props = yes\n#enable-auto-props = yes\n*.png = svn:mime-type=image/png'}
         fs = MockFileSystem(files)
@@ -95,7 +95,7 @@
         errors = []
         checker = PNGChecker("config", mock_handle_style_error, scm, MockSystemHost(os_name='linux', filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 0)
+        self.assertEqual(len(errors), 0)
 
         files = {'/Users/mock/.subversion/config': '#enable-auto-props = yes\nenable-auto-props = yes\n*.png = svn:mime-type=image/png'}
         fs = MockFileSystem(files)
@@ -103,7 +103,7 @@
         errors = []
         checker = PNGChecker("config", mock_handle_style_error, scm, MockSystemHost(os_name='linux', filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 0)
+        self.assertEqual(len(errors), 0)
 
         files = {'/Users/mock/.subversion/config': 'enable-auto-props = no'}
         fs = MockFileSystem(files)
@@ -111,7 +111,7 @@
         errors = []
         checker = PNGChecker("config", mock_handle_style_error, scm, MockSystemHost(os_name='linux', filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 1)
+        self.assertEqual(len(errors), 1)
 
         file_path = "foo.png"
         fs.write_binary_file(file_path, "Dummy binary data")
@@ -119,7 +119,7 @@
         errors = []
         checker = PNGChecker(file_path, mock_handle_style_error, scm, MockSystemHost(os_name='linux', filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 1)
+        self.assertEqual(len(errors), 1)
 
         file_path = "foo-expected.png"
         fs.write_binary_file(file_path, "Dummy binary data")
@@ -127,8 +127,5 @@
         errors = []
         checker = PNGChecker(file_path, mock_handle_style_error, scm, MockSystemHost(os_name='linux', filesystem=fs))
         checker.check()
-        self.assertEquals(len(errors), 2)
-        self.assertEquals(errors[0], (0, 'image/png', 5, 'Image lacks a checksum. Generate pngs using run-webkit-tests to ensure they have a checksum.'))
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertEqual(len(errors), 2)
+        self.assertEqual(errors[0], (0, 'image/png', 5, 'Image lacks a checksum. Generate pngs using run-webkit-tests to ensure they have a checksum.'))
diff --git a/Tools/Scripts/webkitpy/style/checkers/python.py b/Tools/Scripts/webkitpy/style/checkers/python.py
index 8cfd1b2..9fc436f 100644
--- a/Tools/Scripts/webkitpy/style/checkers/python.py
+++ b/Tools/Scripts/webkitpy/style/checkers/python.py
@@ -22,23 +22,32 @@
 
 """Supports checking WebKit style in Python files."""
 
+import re
+from StringIO import StringIO
+
+from webkitpy.common.system.filesystem import FileSystem
+from webkitpy.common.webkit_finder import WebKitFinder
 from webkitpy.thirdparty.autoinstalled import pep8
+from webkitpy.thirdparty.autoinstalled.pylint import lint
+from webkitpy.thirdparty.autoinstalled.pylint.reporters.text import ParseableTextReporter
 
 
 class PythonChecker(object):
-
     """Processes text lines for checking style."""
-
     def __init__(self, file_path, handle_style_error):
         self._file_path = file_path
         self._handle_style_error = handle_style_error
 
     def check(self, lines):
+        self._check_pep8(lines)
+        self._check_pylint(lines)
+
+    def _check_pep8(self, lines):
         # Initialize pep8.options, which is necessary for
         # Checker.check_all() to execute.
         pep8.process_options(arglist=[self._file_path])
 
-        checker = pep8.Checker(self._file_path)
+        pep8_checker = pep8.Checker(self._file_path)
 
         def _pep8_handle_error(line_number, offset, text, check):
             # FIXME: Incorporate the character offset into the error output.
@@ -51,6 +60,69 @@
 
             self._handle_style_error(line_number, category, 5, pep8_message)
 
-        checker.report_error = _pep8_handle_error
+        pep8_checker.report_error = _pep8_handle_error
+        pep8_errors = pep8_checker.check_all()
 
-        errors = checker.check_all()
+    def _check_pylint(self, lines):
+        pylinter = Pylinter()
+
+        # FIXME: for now, we only report pylint errors, but we should be catching and
+        # filtering warnings using the rules in style/checker.py instead.
+        output = pylinter.run(['-E', self._file_path])
+
+        lint_regex = re.compile('([^:]+):([^:]+): \[([^]]+)\] (.*)')
+        for error in output.getvalue().splitlines():
+            match_obj = lint_regex.match(error)
+            assert(match_obj)
+            line_number = int(match_obj.group(2))
+            category_and_method = match_obj.group(3).split(', ')
+            category = 'pylint/' + (category_and_method[0])
+            if len(category_and_method) > 1:
+                message = '[%s] %s' % (category_and_method[1], match_obj.group(4))
+            else:
+                message = match_obj.group(4)
+            self._handle_style_error(line_number, category, 5, message)
+
+
+class Pylinter(object):
+    # We filter out these messages because they are bugs in pylint that produce false positives.
+    # FIXME: Does it make sense to combine these rules with the rules in style/checker.py somehow?
+    FALSE_POSITIVES = [
+        # possibly http://www.logilab.org/ticket/98613 ?
+        "Instance of 'Popen' has no 'poll' member",
+        "Instance of 'Popen' has no 'returncode' member",
+        "Instance of 'Popen' has no 'stdin' member",
+        "Instance of 'Popen' has no 'stdout' member",
+        "Instance of 'Popen' has no 'stderr' member",
+        "Instance of 'Popen' has no 'wait' member",
+    ]
+
+    def __init__(self):
+        self._pylintrc = WebKitFinder(FileSystem()).path_from_webkit_base('Tools', 'Scripts', 'webkitpy', 'pylintrc')
+
+    def run(self, argv):
+        output = _FilteredStringIO(self.FALSE_POSITIVES)
+        lint.Run(['--rcfile', self._pylintrc] + argv, reporter=ParseableTextReporter(output=output), exit=False)
+        return output
+
+
+class _FilteredStringIO(StringIO):
+    def __init__(self, bad_messages):
+        StringIO.__init__(self)
+        self.dropped_last_msg = False
+        self.bad_messages = bad_messages
+
+    def write(self, msg=''):
+        if not self._filter(msg):
+            StringIO.write(self, msg)
+
+    def _filter(self, msg):
+        if any(bad_message in msg for bad_message in self.bad_messages):
+            self.dropped_last_msg = True
+            return True
+        if self.dropped_last_msg:
+            # We drop the newline after a dropped message as well.
+            self.dropped_last_msg = False
+            if msg == '\n':
+                return True
+        return False
diff --git a/Tools/Scripts/webkitpy/style/checkers/python_unittest.py b/Tools/Scripts/webkitpy/style/checkers/python_unittest.py
index e003eb8..d52e3f3 100644
--- a/Tools/Scripts/webkitpy/style/checkers/python_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/python_unittest.py
@@ -23,7 +23,7 @@
 """Unit tests for python.py."""
 
 import os
-import unittest
+import unittest2 as unittest
 
 from python import PythonChecker
 
@@ -38,8 +38,8 @@
             pass
 
         checker = PythonChecker("foo.txt", _mock_handle_style_error)
-        self.assertEquals(checker._file_path, "foo.txt")
-        self.assertEquals(checker._handle_style_error,
+        self.assertEqual(checker._file_path, "foo.txt")
+        self.assertEqual(checker._handle_style_error,
                           _mock_handle_style_error)
 
     def test_check(self):
@@ -57,6 +57,7 @@
         checker = PythonChecker(file_path, _mock_handle_style_error)
         checker.check(lines=[])
 
-        self.assertEquals(len(errors), 1)
-        self.assertEquals(errors[0],
-                          (2, "pep8/W291", 5, "trailing whitespace"))
+        self.assertEqual(errors, [
+            (4, "pep8/W291", 5, "trailing whitespace"),
+            (4, "pylint/E0602", 5, "Undefined variable 'error'"),
+            ])
diff --git a/Tools/Scripts/webkitpy/style/checkers/python_unittest_input.py b/Tools/Scripts/webkitpy/style/checkers/python_unittest_input.py
index 9f1d118..afa1d4e 100644
--- a/Tools/Scripts/webkitpy/style/checkers/python_unittest_input.py
+++ b/Tools/Scripts/webkitpy/style/checkers/python_unittest_input.py
@@ -1,2 +1,4 @@
-# This file is sample input for python_unittest.py and includes a single
-# error which is an extra space at the end of this line. 
+# This file is sample input for python_unittest.py and includes two
+# problems, one that will generate a PEP-8 warning for trailing whitespace
+# and one that will generate a pylint error for an undefined variable.
+print error() 
diff --git a/Tools/Scripts/webkitpy/style/checkers/test_expectations.py b/Tools/Scripts/webkitpy/style/checkers/test_expectations.py
index 51b97be..67f3841 100644
--- a/Tools/Scripts/webkitpy/style/checkers/test_expectations.py
+++ b/Tools/Scripts/webkitpy/style/checkers/test_expectations.py
@@ -62,7 +62,6 @@
     def __init__(self, file_path, handle_style_error, host=None):
         self._file_path = file_path
         self._handle_style_error = handle_style_error
-        self._handle_style_error.turn_off_line_filtering()
         self._tab_checker = TabChecker(file_path, handle_style_error)
 
         # FIXME: host should be a required parameter, not an optional one.
diff --git a/Tools/Scripts/webkitpy/style/checkers/test_expectations_unittest.py b/Tools/Scripts/webkitpy/style/checkers/test_expectations_unittest.py
index 1516de7..43ef836 100644
--- a/Tools/Scripts/webkitpy/style/checkers/test_expectations_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/test_expectations_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,7 +28,7 @@
 
 import os
 import sys
-import unittest
+import unittest2 as unittest
 
 from test_expectations import TestExpectationsChecker
 from webkitpy.common.host_mock import MockHost
@@ -71,7 +70,7 @@
         if port:
             self.assertTrue(port.name().startswith(expected_port_implementation))
         else:
-            self.assertEquals(None, expected_port_implementation)
+            self.assertIsNone(expected_port_implementation)
 
     def test_determine_port_from_expectations_path(self):
         self._expect_port_for_expectations_path(None, '/')
@@ -95,7 +94,7 @@
                                           self._error_collector, host=host)
 
         # We should have failed to find a valid port object for that path.
-        self.assertEquals(checker._port_obj, None)
+        self.assertIsNone(checker._port_obj)
 
         # Now use a test port so we can check the lines.
         checker._port_obj = host.port_factory.get('test-mac-leopard')
@@ -105,10 +104,15 @@
         if should_pass:
             self.assertEqual('', self._error_collector.get_errors())
         elif expected_output:
-            self.assertEquals(expected_output, self._error_collector.get_errors())
+            self.assertEqual(expected_output, self._error_collector.get_errors())
         else:
             self.assertNotEquals('', self._error_collector.get_errors())
-        self.assertTrue(self._error_collector.turned_off_filtering)
+
+        # Note that a patch might change a line that introduces errors elsewhere, but we
+        # don't want to lint the whole file (it can unfairly punish patches for pre-existing errors).
+        # We rely on a separate lint-webkitpy step on the bots to keep the whole file okay.
+        # FIXME: See https://bugs.webkit.org/show_bug.cgi?id=104712 .
+        self.assertFalse(self._error_collector.turned_off_filtering)
 
     def test_valid_expectations(self):
         self.assert_lines_lint(["crbug.com/1234 [ Mac ] passes/text.html [ Pass Failure ]"], should_pass=True)
diff --git a/Tools/Scripts/webkitpy/style/checkers/text_unittest.py b/Tools/Scripts/webkitpy/style/checkers/text_unittest.py
index ced49a9..01e373a 100644
--- a/Tools/Scripts/webkitpy/style/checkers/text_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/text_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2009 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,7 +28,7 @@
 
 """Unit test for text_style.py."""
 
-import unittest
+import unittest2 as unittest
 
 import text as text_style
 from text import TextChecker
@@ -46,7 +45,7 @@
             self.had_error = True
 
         text_style.process_file_data('', lines, error_for_test)
-        self.assert_(not self.had_error, '%s should not have any errors.' % lines)
+        self.assertFalse(self.had_error, '%s should not have any errors.' % lines)
 
     def assertError(self, lines, expected_line_number):
         """Asserts that the specified lines has an error."""
@@ -54,12 +53,12 @@
 
         def error_for_test(line_number, category, confidence, message):
             """Checks if the expected error occurs."""
-            self.assertEquals(expected_line_number, line_number)
-            self.assertEquals('whitespace/tab', category)
+            self.assertEqual(expected_line_number, line_number)
+            self.assertEqual('whitespace/tab', category)
             self.had_error = True
 
         text_style.process_file_data('', lines, error_for_test)
-        self.assert_(self.had_error, '%s should have an error [whitespace/tab].' % lines)
+        self.assertTrue(self.had_error, '%s should have an error [whitespace/tab].' % lines)
 
 
     def test_no_error(self):
@@ -86,9 +85,5 @@
     def test_init(self):
         """Test __init__ constructor."""
         checker = TextChecker("foo.txt", self.mock_handle_style_error)
-        self.assertEquals(checker.file_path, "foo.txt")
-        self.assertEquals(checker.handle_style_error, self.mock_handle_style_error)
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertEqual(checker.file_path, "foo.txt")
+        self.assertEqual(checker.handle_style_error, self.mock_handle_style_error)
diff --git a/Tools/Scripts/webkitpy/style/checkers/watchlist_unittest.py b/Tools/Scripts/webkitpy/style/checkers/watchlist_unittest.py
index c8d29db..90950c9 100644
--- a/Tools/Scripts/webkitpy/style/checkers/watchlist_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/watchlist_unittest.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright (C) 2010 Apple Inc. All rights reserved.
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
@@ -33,7 +31,7 @@
 '''Unit tests for watchlist.py.'''
 
 
-import unittest
+import unittest2 as unittest
 
 
 import watchlist
@@ -56,8 +54,8 @@
     def test_basic_error_message(self):
         def handle_style_error(mock_error_handler, line_number, category, confidence, message):
             mock_error_handler.had_error = True
-            self.assertEquals(0, line_number)
-            self.assertEquals('watchlist/general', category)
+            self.assertEqual(0, line_number)
+            self.assertEqual('watchlist/general', category)
 
         error_handler = MockErrorHandler(handle_style_error)
         error_handler.had_error = False
diff --git a/Tools/Scripts/webkitpy/style/checkers/xcodeproj.py b/Tools/Scripts/webkitpy/style/checkers/xcodeproj.py
index 89c072d..3de3d19 100644
--- a/Tools/Scripts/webkitpy/style/checkers/xcodeproj.py
+++ b/Tools/Scripts/webkitpy/style/checkers/xcodeproj.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
diff --git a/Tools/Scripts/webkitpy/style/checkers/xcodeproj_unittest.py b/Tools/Scripts/webkitpy/style/checkers/xcodeproj_unittest.py
index 9799ec0..36a1a41 100644
--- a/Tools/Scripts/webkitpy/style/checkers/xcodeproj_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/xcodeproj_unittest.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -26,7 +24,7 @@
 """Unit test for xcodeproj.py."""
 
 import xcodeproj
-import unittest
+import unittest2 as unittest
 
 
 class TestErrorHandler(object):
@@ -62,13 +60,10 @@
         error_handler = TestErrorHandler(handler)
         checker = xcodeproj.XcodeProjectFileChecker('', error_handler)
         checker.check(lines)
-        self.assert_(self.had_error, '%s should have error: %s.' % (lines, expected_message))
+        self.assertTrue(self.had_error, '%s should have error: %s.' % (lines, expected_message))
 
     def test_detect_development_region(self):
         self.assert_no_error(['developmentRegion = English;'])
         self.assert_error([''], 'Missing "developmentRegion = English".')
         self.assert_error(['developmentRegion = Japanese;'],
                           'developmentRegion is not English.')
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/style/checkers/xml_unittest.py b/Tools/Scripts/webkitpy/style/checkers/xml_unittest.py
index e486f5f..a224de3 100644
--- a/Tools/Scripts/webkitpy/style/checkers/xml_unittest.py
+++ b/Tools/Scripts/webkitpy/style/checkers/xml_unittest.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright (C) 2010 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -24,7 +22,7 @@
 
 """Unit test for xml.py."""
 
-import unittest
+import unittest2 as unittest
 
 import xml
 
@@ -57,8 +55,8 @@
     def assert_error(self, expected_line_number, expected_category, xml_data):
         def handle_style_error(mock_error_handler, line_number, category, confidence, message):
             mock_error_handler.had_error = True
-            self.assertEquals(expected_line_number, line_number)
-            self.assertEquals(expected_category, category)
+            self.assertEqual(expected_line_number, line_number)
+            self.assertEqual(expected_category, category)
 
         error_handler = MockErrorHandler(handle_style_error)
         error_handler.had_error = False
@@ -80,13 +78,10 @@
     def test_init(self):
         error_handler = MockErrorHandler(self.mock_handle_style_error)
         checker = xml.XMLChecker('foo.xml', error_handler)
-        self.assertEquals(checker._handle_style_error, error_handler)
+        self.assertEqual(checker._handle_style_error, error_handler)
 
     def test_missing_closing_tag(self):
         self.assert_error(3, 'xml/syntax', '<foo>\n<bar>\n</foo>\n')
 
     def test_no_error(self):
         self.assert_no_error('<foo>\n</foo>')
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/style/error_handlers_unittest.py b/Tools/Scripts/webkitpy/style/error_handlers_unittest.py
index 864bc0f..0b4c355 100644
--- a/Tools/Scripts/webkitpy/style/error_handlers_unittest.py
+++ b/Tools/Scripts/webkitpy/style/error_handlers_unittest.py
@@ -23,7 +23,7 @@
 """Unit tests for error_handlers.py."""
 
 
-import unittest
+import unittest2 as unittest
 
 from checker import StyleProcessorConfiguration
 from error_handlers import DefaultStyleErrorHandler
@@ -70,8 +70,8 @@
 
     def _check_initialized(self):
         """Check that count and error messages are initialized."""
-        self.assertEquals(0, self._error_count)
-        self.assertEquals(0, len(self._error_messages))
+        self.assertEqual(0, self._error_count)
+        self.assertEqual(0, len(self._error_messages))
 
     def _call_error_handler(self, handle_error, confidence, line_number=100):
         """Call the given error handler with a test error."""
@@ -131,8 +131,8 @@
         error_handler = self._error_handler(configuration)
         self._call_error_handler(error_handler, confidence)
 
-        self.assertEquals(0, self._error_count)
-        self.assertEquals([], self._error_messages)
+        self.assertEqual(0, self._error_count)
+        self.assertEqual([], self._error_messages)
 
     # Also serves as a reportable error test.
     def test_max_reports_per_category(self):
@@ -145,27 +145,27 @@
 
         # First call: usual reporting.
         self._call_error_handler(error_handler, confidence)
-        self.assertEquals(1, self._error_count)
-        self.assertEquals(1, len(self._error_messages))
-        self.assertEquals(self._error_messages,
+        self.assertEqual(1, self._error_count)
+        self.assertEqual(1, len(self._error_messages))
+        self.assertEqual(self._error_messages,
                           ["foo.h(100):  message  [whitespace/tab] [5]\n"])
 
         # Second call: suppression message reported.
         self._call_error_handler(error_handler, confidence)
         # The "Suppressing further..." message counts as an additional
         # message (but not as an addition to the error count).
-        self.assertEquals(2, self._error_count)
-        self.assertEquals(3, len(self._error_messages))
-        self.assertEquals(self._error_messages[-2],
+        self.assertEqual(2, self._error_count)
+        self.assertEqual(3, len(self._error_messages))
+        self.assertEqual(self._error_messages[-2],
                           "foo.h(100):  message  [whitespace/tab] [5]\n")
-        self.assertEquals(self._error_messages[-1],
+        self.assertEqual(self._error_messages[-1],
                           "Suppressing further [whitespace/tab] reports "
                           "for this file.\n")
 
         # Third call: no report.
         self._call_error_handler(error_handler, confidence)
-        self.assertEquals(3, self._error_count)
-        self.assertEquals(3, len(self._error_messages))
+        self.assertEqual(3, self._error_count)
+        self.assertEqual(3, len(self._error_messages))
 
     def test_line_numbers(self):
         """Test the line_numbers parameter."""
@@ -177,20 +177,20 @@
 
         # Error on non-modified line: no error.
         self._call_error_handler(error_handler, confidence, line_number=60)
-        self.assertEquals(0, self._error_count)
-        self.assertEquals([], self._error_messages)
+        self.assertEqual(0, self._error_count)
+        self.assertEqual([], self._error_messages)
 
         # Error on modified line: error.
         self._call_error_handler(error_handler, confidence, line_number=50)
-        self.assertEquals(1, self._error_count)
-        self.assertEquals(self._error_messages,
+        self.assertEqual(1, self._error_count)
+        self.assertEqual(self._error_messages,
                           ["foo.h(50):  message  [whitespace/tab] [5]\n"])
 
         # Error on non-modified line after turning off line filtering: error.
         error_handler.turn_off_line_filtering()
         self._call_error_handler(error_handler, confidence, line_number=60)
-        self.assertEquals(2, self._error_count)
-        self.assertEquals(self._error_messages,
+        self.assertEqual(2, self._error_count)
+        self.assertEqual(self._error_messages,
                           ['foo.h(50):  message  [whitespace/tab] [5]\n',
                            'foo.h(60):  message  [whitespace/tab] [5]\n',
                            'Suppressing further [whitespace/tab] reports for this file.\n'])
diff --git a/Tools/Scripts/webkitpy/style/filereader_unittest.py b/Tools/Scripts/webkitpy/style/filereader_unittest.py
index bcf94f3..2c506ec 100644
--- a/Tools/Scripts/webkitpy/style/filereader_unittest.py
+++ b/Tools/Scripts/webkitpy/style/filereader_unittest.py
@@ -20,7 +20,7 @@
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.filesystem import FileSystem
 from webkitpy.common.system.logtesting import LoggingTestCase
@@ -74,14 +74,14 @@
 
     def _assert_file_reader(self, passed_to_processor, file_count):
         """Assert the state of the file reader."""
-        self.assertEquals(passed_to_processor, self._passed_to_processor())
-        self.assertEquals(file_count, self._file_reader.file_count)
+        self.assertEqual(passed_to_processor, self._passed_to_processor())
+        self.assertEqual(file_count, self._file_reader.file_count)
 
     def test_process_file__does_not_exist(self):
         try:
             self._file_reader.process_file('does_not_exist.txt')
         except SystemExit, err:
-            self.assertEquals(str(err), '1')
+            self.assertEqual(str(err), '1')
         else:
             self.fail('No Exception raised.')
         self._assert_file_reader([], 1)
@@ -152,4 +152,4 @@
     def test_count_delete_only_file(self):
         self._file_reader.count_delete_only_file()
         delete_only_file_count = self._file_reader.delete_only_file_count
-        self.assertEquals(delete_only_file_count, 1)
+        self.assertEqual(delete_only_file_count, 1)
diff --git a/Tools/Scripts/webkitpy/style/filter_unittest.py b/Tools/Scripts/webkitpy/style/filter_unittest.py
index 7b8a540..b4dd7bc 100644
--- a/Tools/Scripts/webkitpy/style/filter_unittest.py
+++ b/Tools/Scripts/webkitpy/style/filter_unittest.py
@@ -22,7 +22,7 @@
 
 """Unit tests for filter.py."""
 
-import unittest
+import unittest2 as unittest
 
 from filter import _CategoryFilter as CategoryFilter
 from filter import validate_filter_rules
@@ -30,7 +30,7 @@
 
 # On Testing __eq__() and __ne__():
 #
-# In the tests below, we deliberately do not use assertEquals() or
+# In the tests below, we deliberately do not use assertEqual() or
 # assertNotEquals() to test __eq__() or __ne__().  We do this to be
 # very explicit about what we are testing, especially in the case
 # of assertNotEquals().
@@ -88,17 +88,17 @@
         """Test __init__ method."""
         # Test that the attributes are getting set correctly.
         filter = CategoryFilter(["+"])
-        self.assertEquals(["+"], filter._filter_rules)
+        self.assertEqual(["+"], filter._filter_rules)
 
     def test_init_default_arguments(self):
         """Test __init__ method default arguments."""
         filter = CategoryFilter()
-        self.assertEquals([], filter._filter_rules)
+        self.assertEqual([], filter._filter_rules)
 
     def test_str(self):
         """Test __str__ "to string" operator."""
         filter = CategoryFilter(["+a", "-b"])
-        self.assertEquals(str(filter), "+a,-b")
+        self.assertEqual(str(filter), "+a,-b")
 
     def test_eq(self):
         """Test __eq__ equality function."""
@@ -162,17 +162,17 @@
 
         config = self._config(base_rules, path_specific, user_rules)
 
-        self.assertEquals(base_rules, config._base_rules)
-        self.assertEquals(path_specific, config._path_specific)
-        self.assertEquals(user_rules, config._user_rules)
+        self.assertEqual(base_rules, config._base_rules)
+        self.assertEqual(path_specific, config._path_specific)
+        self.assertEqual(user_rules, config._user_rules)
 
     def test_default_arguments(self):
         # Test that the attributes are getting set correctly to the defaults.
         config = FilterConfiguration()
 
-        self.assertEquals([], config._base_rules)
-        self.assertEquals([], config._path_specific)
-        self.assertEquals([], config._user_rules)
+        self.assertEqual([], config._base_rules)
+        self.assertEqual([], config._path_specific)
+        self.assertEqual([], config._user_rules)
 
     def test_eq(self):
         """Test __eq__ method."""
diff --git a/Tools/Scripts/webkitpy/style/main_unittest.py b/Tools/Scripts/webkitpy/style/main_unittest.py
index 5457833..dbfc7c8 100644
--- a/Tools/Scripts/webkitpy/style/main_unittest.py
+++ b/Tools/Scripts/webkitpy/style/main_unittest.py
@@ -20,7 +20,7 @@
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from main import change_directory
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -43,9 +43,9 @@
 
     def _assert_result(self, actual_return_value, expected_return_value,
                        expected_log_messages, expected_current_directory):
-        self.assertEquals(actual_return_value, expected_return_value)
+        self.assertEqual(actual_return_value, expected_return_value)
         self._log.assertMessages(expected_log_messages)
-        self.assertEquals(self.filesystem.getcwd(), expected_current_directory)
+        self.assertEqual(self.filesystem.getcwd(), expected_current_directory)
 
     def test_paths_none(self):
         paths = self._change_directory(checkout_root=self._checkout_root, paths=None)
diff --git a/Tools/Scripts/webkitpy/style/optparser.py b/Tools/Scripts/webkitpy/style/optparser.py
index f4e9923..4b638c0 100644
--- a/Tools/Scripts/webkitpy/style/optparser.py
+++ b/Tools/Scripts/webkitpy/style/optparser.py
@@ -345,7 +345,7 @@
         # Override OptionParser's print_help() method so that help output
         # does not render to the screen while running unit tests.
         print_help = parser.print_help
-        parser.print_help = lambda: print_help(file=stderr)
+        parser.print_help = lambda file=stderr: print_help(file=file)
 
         return parser
 
diff --git a/Tools/Scripts/webkitpy/style/optparser_unittest.py b/Tools/Scripts/webkitpy/style/optparser_unittest.py
index a6b64da..0c9002a 100644
--- a/Tools/Scripts/webkitpy/style/optparser_unittest.py
+++ b/Tools/Scripts/webkitpy/style/optparser_unittest.py
@@ -22,7 +22,7 @@
 
 """Unit tests for parser.py."""
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.logtesting import LoggingTestCase
 from webkitpy.style.optparser import ArgumentParser
@@ -49,14 +49,14 @@
 
     def test_to_flag_string(self):
         options = self._create_options('vs7', 5, ['+foo', '-bar'], 'git')
-        self.assertEquals('--filter=+foo,-bar --git-commit=git '
+        self.assertEqual('--filter=+foo,-bar --git-commit=git '
                           '--min-confidence=5 --output=vs7',
                           self._printer.to_flag_string(options))
 
         # This is to check that --filter and --git-commit do not
         # show up when not user-specified.
         options = self._create_options()
-        self.assertEquals('--min-confidence=3 --output=emacs',
+        self.assertEqual('--min-confidence=3 --output=emacs',
                           self._printer.to_flag_string(options))
 
 
@@ -142,53 +142,53 @@
 
         (files, options) = parse([])
 
-        self.assertEquals(files, [])
+        self.assertEqual(files, [])
 
-        self.assertEquals(options.filter_rules, [])
-        self.assertEquals(options.git_commit, None)
-        self.assertEquals(options.diff_files, False)
-        self.assertEquals(options.is_verbose, False)
-        self.assertEquals(options.min_confidence, 3)
-        self.assertEquals(options.output_format, 'vs7')
+        self.assertEqual(options.filter_rules, [])
+        self.assertIsNone(options.git_commit)
+        self.assertFalse(options.diff_files)
+        self.assertFalse(options.is_verbose)
+        self.assertEqual(options.min_confidence, 3)
+        self.assertEqual(options.output_format, 'vs7')
 
     def test_parse_explicit_arguments(self):
         parse = self._parse
 
         # Pass non-default explicit values.
         (files, options) = parse(['--min-confidence=4'])
-        self.assertEquals(options.min_confidence, 4)
+        self.assertEqual(options.min_confidence, 4)
         (files, options) = parse(['--output=emacs'])
-        self.assertEquals(options.output_format, 'emacs')
+        self.assertEqual(options.output_format, 'emacs')
         (files, options) = parse(['-g', 'commit'])
-        self.assertEquals(options.git_commit, 'commit')
+        self.assertEqual(options.git_commit, 'commit')
         (files, options) = parse(['--git-commit=commit'])
-        self.assertEquals(options.git_commit, 'commit')
+        self.assertEqual(options.git_commit, 'commit')
         (files, options) = parse(['--git-diff=commit'])
-        self.assertEquals(options.git_commit, 'commit')
+        self.assertEqual(options.git_commit, 'commit')
         (files, options) = parse(['--verbose'])
-        self.assertEquals(options.is_verbose, True)
+        self.assertTrue(options.is_verbose)
         (files, options) = parse(['--diff-files', 'file.txt'])
-        self.assertEquals(options.diff_files, True)
+        self.assertTrue(options.diff_files)
 
         # Pass user_rules.
         (files, options) = parse(['--filter=+build,-whitespace'])
-        self.assertEquals(options.filter_rules,
+        self.assertEqual(options.filter_rules,
                           ["+build", "-whitespace"])
 
         # Pass spurious white space in user rules.
         (files, options) = parse(['--filter=+build, -whitespace'])
-        self.assertEquals(options.filter_rules,
+        self.assertEqual(options.filter_rules,
                           ["+build", "-whitespace"])
 
     def test_parse_files(self):
         parse = self._parse
 
         (files, options) = parse(['foo.cpp'])
-        self.assertEquals(files, ['foo.cpp'])
+        self.assertEqual(files, ['foo.cpp'])
 
         # Pass multiple files.
         (files, options) = parse(['--output=emacs', 'foo.cpp', 'bar.cpp'])
-        self.assertEquals(files, ['foo.cpp', 'bar.cpp'])
+        self.assertEqual(files, ['foo.cpp', 'bar.cpp'])
 
 
 class CommandOptionValuesTest(unittest.TestCase):
@@ -199,11 +199,11 @@
         """Test __init__ constructor."""
         # Check default parameters.
         options = ProcessorOptions()
-        self.assertEquals(options.filter_rules, [])
-        self.assertEquals(options.git_commit, None)
-        self.assertEquals(options.is_verbose, False)
-        self.assertEquals(options.min_confidence, 1)
-        self.assertEquals(options.output_format, "emacs")
+        self.assertEqual(options.filter_rules, [])
+        self.assertIsNone(options.git_commit)
+        self.assertFalse(options.is_verbose)
+        self.assertEqual(options.min_confidence, 1)
+        self.assertEqual(options.output_format, "emacs")
 
         # Check argument validation.
         self.assertRaises(ValueError, ProcessorOptions, output_format="bad")
@@ -220,11 +220,11 @@
                                    is_verbose=True,
                                    min_confidence=3,
                                    output_format="vs7")
-        self.assertEquals(options.filter_rules, ["+"])
-        self.assertEquals(options.git_commit, "commit")
-        self.assertEquals(options.is_verbose, True)
-        self.assertEquals(options.min_confidence, 3)
-        self.assertEquals(options.output_format, "vs7")
+        self.assertEqual(options.filter_rules, ["+"])
+        self.assertEqual(options.git_commit, "commit")
+        self.assertTrue(options.is_verbose)
+        self.assertEqual(options.min_confidence, 3)
+        self.assertEqual(options.output_format, "vs7")
 
     def test_eq(self):
         """Test __eq__ equality function."""
diff --git a/Tools/Scripts/webkitpy/style/patchreader_unittest.py b/Tools/Scripts/webkitpy/style/patchreader_unittest.py
index eb26d47..f7368ec 100644
--- a/Tools/Scripts/webkitpy/style/patchreader_unittest.py
+++ b/Tools/Scripts/webkitpy/style/patchreader_unittest.py
@@ -1,5 +1,3 @@
-#!/usr/bin/python
-#
 # Copyright (C) 2010 Google Inc. All rights reserved.
 # Copyright (C) 2009 Torch Mobile Inc.
 # Copyright (C) 2009 Apple Inc. All rights reserved.
@@ -31,7 +29,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.style.patchreader import PatchReader
@@ -64,9 +62,9 @@
         self._patch_checker.check(patch_string)
 
     def _assert_checked(self, passed_to_process_file, delete_only_file_count):
-        self.assertEquals(self._file_reader.passed_to_process_file,
+        self.assertEqual(self._file_reader.passed_to_process_file,
                           passed_to_process_file)
-        self.assertEquals(self._file_reader.delete_only_file_count,
+        self.assertEqual(self._file_reader.delete_only_file_count,
                           delete_only_file_count)
 
     def test_check_patch(self):
diff --git a/Tools/Scripts/webkitpy/test/finder_unittest.py b/Tools/Scripts/webkitpy/test/finder_unittest.py
index 5c808a1..f1259ef 100644
--- a/Tools/Scripts/webkitpy/test/finder_unittest.py
+++ b/Tools/Scripts/webkitpy/test/finder_unittest.py
@@ -21,7 +21,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import logging
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -58,7 +58,7 @@
             handler.level = self.log_levels.pop(0)
 
     def test_additional_system_paths(self):
-        self.assertEquals(self.finder.additional_paths(['/usr']),
+        self.assertEqual(self.finder.additional_paths(['/usr']),
                           ['/foo', '/foo2'])
 
     def test_is_module(self):
@@ -70,9 +70,9 @@
         self.assertFalse(self.finder.is_module('baz'))
 
     def test_to_module(self):
-        self.assertEquals(self.finder.to_module('/foo/test.py'), 'test')
-        self.assertEquals(self.finder.to_module('/foo/bar/test.py'), 'bar.test')
-        self.assertEquals(self.finder.to_module('/foo/bar/pytest.py'), 'bar.pytest')
+        self.assertEqual(self.finder.to_module('/foo/test.py'), 'test')
+        self.assertEqual(self.finder.to_module('/foo/bar/test.py'), 'bar.test')
+        self.assertEqual(self.finder.to_module('/foo/bar/pytest.py'), 'bar.pytest')
 
     def test_clean(self):
         self.assertTrue(self.fs.exists('/foo2/bar2/missing.pyc'))
@@ -80,7 +80,7 @@
         self.assertFalse(self.fs.exists('/foo2/bar2/missing.pyc'))
 
     def check_names(self, names, expected_names, find_all=True):
-        self.assertEquals(self.finder.find_names(names, find_all), expected_names)
+        self.assertEqual(self.finder.find_names(names, find_all), expected_names)
 
     def test_default_names(self):
         self.check_names([], ['bar.baz_unittest', 'bar2.baz2_integrationtest'], find_all=True)
@@ -112,7 +112,7 @@
             self.check_names(['/tmp/another_unittest.py'], [])
         finally:
             _, _, logs = oc.restore_output()
-            self.assertTrue('another_unittest.py' in logs)
+            self.assertIn('another_unittest.py', logs)
 
         # Paths that don't exist are errors.
         oc.capture_output()
@@ -120,10 +120,7 @@
             self.check_names(['/foo/bar/notexist_unittest.py'], [])
         finally:
             _, _, logs = oc.restore_output()
-            self.assertTrue('notexist_unittest.py' in logs)
+            self.assertIn('notexist_unittest.py', logs)
 
         # Names that don't exist are caught later, at load time.
         self.check_names(['bar.notexist_unittest'], ['bar.notexist_unittest'])
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/test/main.py b/Tools/Scripts/webkitpy/test/main.py
index e639a45..4270ace 100644
--- a/Tools/Scripts/webkitpy/test/main.py
+++ b/Tools/Scripts/webkitpy/test/main.py
@@ -135,8 +135,11 @@
             self._options.child_processes = 1
 
         if self._options.coverage:
+            _log.warning("Checking code coverage, so running things serially")
+            self._options.child_processes = 1
+
             import webkitpy.thirdparty.autoinstalled.coverage as coverage
-            cov = coverage.coverage()
+            cov = coverage.coverage(omit=["/usr/*", "*/webkitpy/thirdparty/autoinstalled/*", "*/webkitpy/thirdparty/BeautifulSoup.py"])
             cov.start()
 
         self.printer.write_update("Checking imports ...")
diff --git a/Tools/Scripts/webkitpy/test/main_unittest.py b/Tools/Scripts/webkitpy/test/main_unittest.py
index 4fa6ef3..8a1b56d 100644
--- a/Tools/Scripts/webkitpy/test/main_unittest.py
+++ b/Tools/Scripts/webkitpy/test/main_unittest.py
@@ -22,7 +22,7 @@
 
 import logging
 import sys
-import unittest
+import unittest2 as unittest
 import StringIO
 
 from webkitpy.common.system.filesystem import FileSystem
@@ -70,8 +70,8 @@
             _, _, logs = oc.restore_output()
             root_logger.handlers = root_handlers
 
-        self.assertTrue('No tests to run' in errors.getvalue())
-        self.assertTrue('No tests to run' in logs)
+        self.assertIn('No tests to run', errors.getvalue())
+        self.assertIn('No tests to run', logs)
 
     def _find_test_names(self, args):
         tester = Tester()
@@ -81,25 +81,25 @@
     def test_individual_names_are_not_run_twice(self):
         args = [STUBS_CLASS + '.test_empty']
         parallel_tests, serial_tests = self._find_test_names(args)
-        self.assertEquals(parallel_tests, args)
-        self.assertEquals(serial_tests, [])
+        self.assertEqual(parallel_tests, args)
+        self.assertEqual(serial_tests, [])
 
     def test_integration_tests_are_not_found_by_default(self):
         parallel_tests, serial_tests = self._find_test_names([STUBS_CLASS])
-        self.assertEquals(parallel_tests, [
+        self.assertEqual(parallel_tests, [
             STUBS_CLASS + '.test_empty',
             ])
-        self.assertEquals(serial_tests, [
+        self.assertEqual(serial_tests, [
             STUBS_CLASS + '.serial_test_empty',
             ])
 
     def test_integration_tests_are_found(self):
         parallel_tests, serial_tests = self._find_test_names(['--integration-tests', STUBS_CLASS])
-        self.assertEquals(parallel_tests, [
+        self.assertEqual(parallel_tests, [
             STUBS_CLASS + '.integration_test_empty',
             STUBS_CLASS + '.test_empty',
             ])
-        self.assertEquals(serial_tests, [
+        self.assertEqual(serial_tests, [
             STUBS_CLASS + '.serial_integration_test_empty',
             STUBS_CLASS + '.serial_test_empty',
             ])
@@ -113,5 +113,5 @@
                                stdout=executive.PIPE, stderr=executive.PIPE)
         out, _ = proc.communicate()
         retcode = proc.returncode
-        self.assertEquals(retcode, 0)
-        self.assertTrue('Cover' in out)
+        self.assertEqual(retcode, 0)
+        self.assertIn('Cover', out)
diff --git a/Tools/Scripts/webkitpy/test/printer.py b/Tools/Scripts/webkitpy/test/printer.py
index 0ec3035..f4a4b06 100644
--- a/Tools/Scripts/webkitpy/test/printer.py
+++ b/Tools/Scripts/webkitpy/test/printer.py
@@ -24,7 +24,7 @@
 import logging
 import StringIO
 
-from webkitpy.common.system import outputcapture
+from webkitpy.common.system.systemhost import SystemHost
 from webkitpy.layout_tests.views.metered_stream import MeteredStream
 
 _log = logging.getLogger(__name__)
@@ -57,7 +57,8 @@
         elif options.verbose == 2:
             log_level = logging.DEBUG
 
-        self.meter = MeteredStream(self.stream, (options.verbose == 2))
+        self.meter = MeteredStream(self.stream, (options.verbose == 2),
+            number_of_columns=SystemHost().platform.terminal_width())
 
         handler = logging.StreamHandler(self.stream)
         # We constrain the level on the handler rather than on the root
@@ -102,6 +103,8 @@
         handler.addFilter(testing_filter)
 
         if self.options.pass_through:
+            # FIXME: Can't import at top of file, as outputcapture needs unittest2
+            from webkitpy.common.system import outputcapture
             outputcapture.OutputCapture.stream_wrapper = _CaptureAndPassThroughStream
 
     def write_update(self, msg):
@@ -159,7 +162,19 @@
         self.completed_tests = []
 
     def _test_line(self, test_name, suffix):
-        return '[%d/%d] %s%s' % (self.num_completed, self.num_tests, test_name, suffix)
+        format_string = '[%d/%d] %s%s'
+        status_line = format_string % (self.num_completed, self.num_tests, test_name, suffix)
+        if len(status_line) > self.meter.number_of_columns():
+            overflow_columns = len(status_line) - self.meter.number_of_columns()
+            ellipsis = '...'
+            if len(test_name) < overflow_columns + len(ellipsis) + 3:
+                # We don't have enough space even if we elide, just show the test method name.
+                test_name = test_name.split('.')[-1]
+            else:
+                new_length = len(test_name) - overflow_columns - len(ellipsis)
+                prefix = int(new_length / 2)
+                test_name = test_name[:prefix] + ellipsis + test_name[-(new_length - prefix):]
+        return format_string % (self.num_completed, self.num_tests, test_name, suffix)
 
     def print_result(self, run_time):
         write = self.meter.writeln
diff --git a/Tools/Scripts/webkitpy/test/runner_unittest.py b/Tools/Scripts/webkitpy/test/runner_unittest.py
index 8fe1b06..46a9507 100644
--- a/Tools/Scripts/webkitpy/test/runner_unittest.py
+++ b/Tools/Scripts/webkitpy/test/runner_unittest.py
@@ -23,7 +23,7 @@
 import logging
 import re
 import StringIO
-import unittest
+import unittest2 as unittest
 
 from webkitpy.tool.mocktool import MockOptions
 from webkitpy.test.printer import Printer
@@ -92,10 +92,6 @@
                             ('test3 (Foo)', 'E', 'test3\nerred'))
         runner = Runner(Printer(stream, options), loader)
         runner.run(['Foo.test1', 'Foo.test2', 'Foo.test3'], 1)
-        self.assertEquals(runner.tests_run, 3)
-        self.assertEquals(len(runner.failures), 1)
-        self.assertEquals(len(runner.errors), 1)
-
-
-if __name__ == '__main__':
-    unittest.main()
+        self.assertEqual(runner.tests_run, 3)
+        self.assertEqual(len(runner.failures), 1)
+        self.assertEqual(len(runner.errors), 1)
diff --git a/Tools/Scripts/webkitpy/test/skip_unittest.py b/Tools/Scripts/webkitpy/test/skip_unittest.py
index f61a1bb..bfcb6a6 100644
--- a/Tools/Scripts/webkitpy/test/skip_unittest.py
+++ b/Tools/Scripts/webkitpy/test/skip_unittest.py
@@ -22,7 +22,7 @@
 
 import StringIO
 import logging
-import unittest
+import unittest2 as unittest
 
 from webkitpy.test.skip import skip_if
 
@@ -72,6 +72,3 @@
         klass(self.foo_callback).test_foo()
         self.assertEqual(self.log_stream.getvalue(), 'Skipping webkitpy.test.skip_unittest.TestSkipFixture: Should see this message.\n')
         self.assertFalse(self.foo_was_called)
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/thirdparty/__init__.py b/Tools/Scripts/webkitpy/thirdparty/__init__.py
index 74ea5f6..601e2fb 100644
--- a/Tools/Scripts/webkitpy/thirdparty/__init__.py
+++ b/Tools/Scripts/webkitpy/thirdparty/__init__.py
@@ -105,9 +105,14 @@
     def _install_pylint(self):
         self._ensure_autoinstalled_dir_is_in_sys_path()
         did_install_something = False
-        if not self._fs.exists(self._fs.join(_AUTOINSTALLED_DIR, "pylint")):
+        if (not self._fs.exists(self._fs.join(_AUTOINSTALLED_DIR, "pylint")) or
+            not self._fs.exists(self._fs.join(_AUTOINSTALLED_DIR, "logilab/astng")) or
+            not self._fs.exists(self._fs.join(_AUTOINSTALLED_DIR, "logilab/common"))):
             installer = AutoInstaller(target_dir=_AUTOINSTALLED_DIR)
-            did_install_something = installer.install("http://pypi.python.org/packages/source/l/logilab-common/logilab-common-0.58.1.tar.gz#md5=77298ab2d8bb8b4af9219791e7cee8ce", url_subpath="logilab-common-0.58.1", target_name="logilab/common")
+            files_to_remove = []
+            if sys.platform == 'win32':
+                files_to_remove = ['test/data/write_protected_file.txt']
+            did_install_something = installer.install("http://pypi.python.org/packages/source/l/logilab-common/logilab-common-0.58.1.tar.gz#md5=77298ab2d8bb8b4af9219791e7cee8ce", url_subpath="logilab-common-0.58.1", target_name="logilab/common", files_to_remove=files_to_remove)
             did_install_something |= installer.install("http://pypi.python.org/packages/source/l/logilab-astng/logilab-astng-0.24.1.tar.gz#md5=ddaf66e4d85714d9c47a46d4bed406de", url_subpath="logilab-astng-0.24.1", target_name="logilab/astng")
             did_install_something |= installer.install('http://pypi.python.org/packages/source/p/pylint/pylint-0.25.1.tar.gz#md5=728bbc2b339bc3749af013709a7f87a5', url_subpath="pylint-0.25.1", target_name="pylint")
         return did_install_something
@@ -152,6 +157,10 @@
                           url_subpath="ircbot.py")
         return did_install_something
 
+    def _install_unittest2(self):
+        self._ensure_autoinstalled_dir_is_in_sys_path()
+        return self._install(url="http://pypi.python.org/packages/source/u/unittest2/unittest2-0.5.1.tar.gz#md5=a0af5cac92bbbfa0c3b0e99571390e0f", url_subpath="unittest2-0.5.1/unittest2")
+
     def _install_webpagereplay(self):
         did_install_something = False
         if not self._fs.exists(self._fs.join(_AUTOINSTALLED_DIR, "webpagereplay")):
diff --git a/Tools/Scripts/webkitpy/thirdparty/__init___unittest.py b/Tools/Scripts/webkitpy/thirdparty/__init___unittest.py
index b3eb75f..f687ae0 100644
--- a/Tools/Scripts/webkitpy/thirdparty/__init___unittest.py
+++ b/Tools/Scripts/webkitpy/thirdparty/__init___unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2011 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -28,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.thirdparty import AutoinstallImportHook
 
@@ -68,7 +67,3 @@
         import webkitpy.thirdparty.autoinstalled.pylint
         import webkitpy.thirdparty.autoinstalled.webpagereplay
         import webkitpy.thirdparty.autoinstalled.pep8
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests.py b/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests.py
old mode 100755
new mode 100644
index 68c2fb7..c7082c8
--- a/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests.py
+++ b/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -157,7 +155,3 @@
         return 2
 
     return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests_unittest.py b/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests_unittest.py
index b3b4d58..028a4c6 100644
--- a/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests_unittest.py
+++ b/Tools/Scripts/webkitpy/to_be_moved/update_webgl_conformance_tests_unittest.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
 # Copyright (C) 2010 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -29,7 +28,7 @@
 
 """Unit tests for update_webgl_conformance_tests."""
 
-import unittest
+import unittest2 as unittest
 from webkitpy.to_be_moved import update_webgl_conformance_tests as webgl
 
 
@@ -96,7 +95,3 @@
         input_text = head + input_text + foot
         output_text = head + output_text + foot
         self.assert_translate(input_text, output_text)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/tool/bot/botinfo.py b/Tools/Scripts/webkitpy/tool/bot/botinfo.py
index b9fd938..11a3d40 100644
--- a/Tools/Scripts/webkitpy/tool/bot/botinfo.py
+++ b/Tools/Scripts/webkitpy/tool/bot/botinfo.py
@@ -29,11 +29,12 @@
 
 # FIXME: We should consider hanging one of these off the tool object.
 class BotInfo(object):
-    def __init__(self, tool):
+    def __init__(self, tool, port_name):
         self._tool = tool
+        self._port_name = port_name
 
     def summary_text(self):
         # bot_id is also stored on the options dictionary on the tool.
         bot_id = self._tool.status_server.bot_id
         bot_id_string = "Bot: %s  " % (bot_id) if bot_id else ""
-        return "%sPort: %s  Platform: %s" % (bot_id_string, self._tool.port().name(), self._tool.platform.display_name())
+        return "%sPort: %s  Platform: %s" % (bot_id_string, self._port_name, self._tool.platform.display_name())
diff --git a/Tools/Scripts/webkitpy/tool/bot/botinfo_unittest.py b/Tools/Scripts/webkitpy/tool/bot/botinfo_unittest.py
index 820ff55..5589556 100644
--- a/Tools/Scripts/webkitpy/tool/bot/botinfo_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/botinfo_unittest.py
@@ -26,11 +26,12 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.tool.bot.botinfo import BotInfo
 from webkitpy.tool.mocktool import MockTool
 from webkitpy.common.net.statusserver_mock import MockStatusServer
+from webkitpy.layout_tests.port.test import TestPort
 
 
 class BotInfoTest(unittest.TestCase):
@@ -38,4 +39,4 @@
     def test_summary_text(self):
         tool = MockTool()
         tool.status_server = MockStatusServer("MockBotId")
-        self.assertEqual(BotInfo(tool).summary_text(), "Bot: MockBotId  Port: MockPort  Platform: MockPlatform 1.0")
+        self.assertEqual(BotInfo(tool, 'port-name').summary_text(), "Bot: MockBotId  Port: port-name  Platform: MockPlatform 1.0")
diff --git a/Tools/Scripts/webkitpy/tool/bot/commitqueuetask.py b/Tools/Scripts/webkitpy/tool/bot/commitqueuetask.py
index 491ba79..5b5a5af 100644
--- a/Tools/Scripts/webkitpy/tool/bot/commitqueuetask.py
+++ b/Tools/Scripts/webkitpy/tool/bot/commitqueuetask.py
@@ -88,7 +88,7 @@
         # no one has set commit-queue- since we started working on the patch.)
         if not self.validate():
             return False
-        # FIXME: We should understand why the land failure occured and retry if possible.
+        # FIXME: We should understand why the land failure occurred and retry if possible.
         if not self._land():
             return self.report_failure()
         return True
diff --git a/Tools/Scripts/webkitpy/tool/bot/commitqueuetask_unittest.py b/Tools/Scripts/webkitpy/tool/bot/commitqueuetask_unittest.py
index 8b33416..ba9254b 100644
--- a/Tools/Scripts/webkitpy/tool/bot/commitqueuetask_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/commitqueuetask_unittest.py
@@ -27,11 +27,11 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 from datetime import datetime
-import unittest
+import logging
+import unittest2 as unittest
 
 from webkitpy.common.net import bugzilla
 from webkitpy.common.net.layouttestresults import LayoutTestResults
-from webkitpy.common.system.deprecated_logging import error, log
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.layout_tests.models import test_results
@@ -41,6 +41,8 @@
 from webkitpy.tool.bot.expectedfailures import ExpectedFailures
 from webkitpy.tool.mocktool import MockTool
 
+_log = logging.getLogger(__name__)
+
 
 class MockCommitQueue(CommitQueueTaskDelegate):
     def __init__(self, error_plan):
@@ -48,18 +50,18 @@
         self._failure_status_id = 0
 
     def run_command(self, command):
-        log("run_webkit_patch: %s" % command)
+        _log.info("run_webkit_patch: %s" % command)
         if self._error_plan:
             error = self._error_plan.pop(0)
             if error:
                 raise error
 
     def command_passed(self, success_message, patch):
-        log("command_passed: success_message='%s' patch='%s'" % (
+        _log.info("command_passed: success_message='%s' patch='%s'" % (
             success_message, patch.id()))
 
     def command_failed(self, failure_message, script_error, patch):
-        log("command_failed: failure_message='%s' script_error='%s' patch='%s'" % (
+        _log.info("command_failed: failure_message='%s' script_error='%s' patch='%s'" % (
             failure_message, script_error, patch.id()))
         self._failure_status_id += 1
         return self._failure_status_id
@@ -75,10 +77,10 @@
 
     def report_flaky_tests(self, patch, flaky_results, results_archive):
         flaky_tests = [result.filename for result in flaky_results]
-        log("report_flaky_tests: patch='%s' flaky_tests='%s' archive='%s'" % (patch.id(), flaky_tests, results_archive.filename))
+        _log.info("report_flaky_tests: patch='%s' flaky_tests='%s' archive='%s'" % (patch.id(), flaky_tests, results_archive.filename))
 
     def archive_last_test_results(self, patch):
-        log("archive_last_test_results: patch='%s'" % patch.id())
+        _log.info("archive_last_test_results: patch='%s'" % patch.id())
         archive = Mock()
         archive.filename = "mock-archive-%s.zip" % patch.id()
         return archive
@@ -121,18 +123,18 @@
 
 
 class CommitQueueTaskTest(unittest.TestCase):
-    def _run_through_task(self, commit_queue, expected_stderr, expected_exception=None, expect_retry=False):
+    def _run_through_task(self, commit_queue, expected_logs, expected_exception=None, expect_retry=False):
         tool = MockTool(log_executive=True)
         patch = tool.bugs.fetch_attachment(10000)
         task = CommitQueueTask(commit_queue, patch)
-        success = OutputCapture().assert_outputs(self, task.run, expected_stderr=expected_stderr, expected_exception=expected_exception)
+        success = OutputCapture().assert_outputs(self, task.run, expected_logs=expected_logs, expected_exception=expected_exception)
         if not expected_exception:
             self.assertEqual(success, not expect_retry)
         return task
 
     def test_success_case(self):
         commit_queue = MockCommitQueue([])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -147,12 +149,12 @@
 run_webkit_patch: ['land-attachment', '--force-clean', '--non-interactive', '--parent-command=commit-queue', 10000]
 command_passed: success_message='Landed patch' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr)
+        self._run_through_task(commit_queue, expected_logs)
 
     def test_fast_success_case(self):
         commit_queue = MockCommitQueue([])
         commit_queue.did_pass_testing_ews = lambda patch: True
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -165,28 +167,28 @@
 run_webkit_patch: ['land-attachment', '--force-clean', '--non-interactive', '--parent-command=commit-queue', 10000]
 command_passed: success_message='Landed patch' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr)
+        self._run_through_task(commit_queue, expected_logs)
 
     def test_clean_failure(self):
         commit_queue = MockCommitQueue([
             ScriptError("MOCK clean failure"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_failed: failure_message='Unable to clean working directory' script_error='MOCK clean failure' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, expect_retry=True)
+        self._run_through_task(commit_queue, expected_logs, expect_retry=True)
 
     def test_update_failure(self):
         commit_queue = MockCommitQueue([
             None,
             ScriptError("MOCK update failure"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_failed: failure_message='Unable to update working directory' script_error='MOCK update failure' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, expect_retry=True)
+        self._run_through_task(commit_queue, expected_logs, expect_retry=True)
 
     def test_apply_failure(self):
         commit_queue = MockCommitQueue([
@@ -194,14 +196,14 @@
             None,
             GoldenScriptError("MOCK apply failure"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
 run_webkit_patch: ['apply-attachment', '--no-update', '--non-interactive', 10000]
 command_failed: failure_message='Patch does not apply' script_error='MOCK apply failure' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, GoldenScriptError)
+        self._run_through_task(commit_queue, expected_logs, GoldenScriptError)
 
     def test_validate_changelog_failure(self):
         commit_queue = MockCommitQueue([
@@ -210,7 +212,7 @@
             None,
             GoldenScriptError("MOCK validate failure"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -219,7 +221,7 @@
 run_webkit_patch: ['validate-changelog', '--non-interactive', 10000]
 command_failed: failure_message='ChangeLog did not pass validation' script_error='MOCK validate failure' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, GoldenScriptError)
+        self._run_through_task(commit_queue, expected_logs, GoldenScriptError)
 
     def test_build_failure(self):
         commit_queue = MockCommitQueue([
@@ -229,7 +231,7 @@
             None,
             GoldenScriptError("MOCK build failure"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -242,7 +244,7 @@
 run_webkit_patch: ['build', '--force-clean', '--no-update', '--build-style=both']
 command_passed: success_message='Able to build without patch' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, GoldenScriptError)
+        self._run_through_task(commit_queue, expected_logs, GoldenScriptError)
 
     def test_red_build_failure(self):
         commit_queue = MockCommitQueue([
@@ -253,7 +255,7 @@
             ScriptError("MOCK build failure"),
             ScriptError("MOCK clean build failure"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -266,7 +268,7 @@
 run_webkit_patch: ['build', '--force-clean', '--no-update', '--build-style=both']
 command_failed: failure_message='Unable to build without patch' script_error='MOCK clean build failure' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, expect_retry=True)
+        self._run_through_task(commit_queue, expected_logs, expect_retry=True)
 
     def test_flaky_test_failure(self):
         commit_queue = MockCommitQueue([
@@ -278,9 +280,9 @@
             ScriptError("MOCK tests failure"),
         ])
         # CommitQueueTask will only report flaky tests if we successfully parsed
-        # results.html and returned a LayoutTestResults object, so we fake one.
+        # results.json and returned a LayoutTestResults object, so we fake one.
         commit_queue.test_results = lambda: LayoutTestResults([])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -299,7 +301,7 @@
 run_webkit_patch: ['land-attachment', '--force-clean', '--non-interactive', '--parent-command=commit-queue', 10000]
 command_passed: success_message='Landed patch' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr)
+        self._run_through_task(commit_queue, expected_logs)
 
     def test_failed_archive(self):
         commit_queue = MockCommitQueue([
@@ -314,7 +316,7 @@
         # It's possible delegate to fail to archive layout tests, don't try to report
         # flaky tests when that happens.
         commit_queue.archive_last_test_results = lambda patch: None
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -331,7 +333,7 @@
 run_webkit_patch: ['land-attachment', '--force-clean', '--non-interactive', '--parent-command=commit-queue', 10000]
 command_passed: success_message='Landed patch' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr)
+        self._run_through_task(commit_queue, expected_logs)
 
     def test_double_flaky_test_failure(self):
         commit_queue = FailingTestCommitQueue([
@@ -348,9 +350,9 @@
             "foo.html",
         ])
         # The (subtle) point of this test is that report_flaky_tests does not appear
-        # in the expected_stderr for this run.
+        # in the expected_logs for this run.
         # Note also that there is no attempt to run the tests w/o the patch.
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -369,8 +371,8 @@
         tool = MockTool(log_executive=True)
         patch = tool.bugs.fetch_attachment(10000)
         task = CommitQueueTask(commit_queue, patch)
-        success = OutputCapture().assert_outputs(self, task.run, expected_stderr=expected_stderr)
-        self.assertEqual(success, False)
+        success = OutputCapture().assert_outputs(self, task.run, expected_logs=expected_logs)
+        self.assertFalse(success)
 
     def test_test_failure(self):
         commit_queue = MockCommitQueue([
@@ -382,7 +384,7 @@
             GoldenScriptError("MOCK test failure"),
             ScriptError("MOCK test failure again"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -401,7 +403,7 @@
 run_webkit_patch: ['build-and-test', '--force-clean', '--no-update', '--build', '--test', '--non-interactive']
 command_passed: success_message='Able to pass tests without patch' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, GoldenScriptError)
+        self._run_through_task(commit_queue, expected_logs, GoldenScriptError)
 
     def test_red_test_failure(self):
         commit_queue = FailingTestCommitQueue([
@@ -421,7 +423,7 @@
 
         # Tests always fail, and always return the same results, but we
         # should still be able to land in this case!
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -442,7 +444,7 @@
 run_webkit_patch: ['land-attachment', '--force-clean', '--non-interactive', '--parent-command=commit-queue', 10000]
 command_passed: success_message='Landed patch' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr)
+        self._run_through_task(commit_queue, expected_logs)
 
     def test_very_red_tree_retry(self):
         lots_of_failing_tests = map(lambda num: "test-%s.html" % num, range(0, 100))
@@ -464,7 +466,7 @@
         # Tests always fail, and return so many failures that we do not
         # trust the results (see ExpectedFailures._can_trust_results) so we
         # just give up and retry the patch.
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -483,7 +485,7 @@
 run_webkit_patch: ['build-and-test', '--force-clean', '--no-update', '--build', '--test', '--non-interactive']
 command_failed: failure_message='Unable to pass tests without patch (tree is red?)' script_error='MOCK clean test failure' patch='10000'
 """
-        self._run_through_task(commit_queue, expected_stderr, expect_retry=True)
+        self._run_through_task(commit_queue, expected_logs, expect_retry=True)
 
     def test_red_tree_patch_rejection(self):
         commit_queue = FailingTestCommitQueue([
@@ -503,7 +505,7 @@
 
         # Tests always fail, but the clean tree only fails one test
         # while the patch fails two.  So we should reject the patch!
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -522,7 +524,7 @@
 run_webkit_patch: ['build-and-test', '--force-clean', '--no-update', '--build', '--test', '--non-interactive']
 command_failed: failure_message='Unable to pass tests without patch (tree is red?)' script_error='MOCK clean test failure' patch='10000'
 """
-        task = self._run_through_task(commit_queue, expected_stderr, GoldenScriptError)
+        task = self._run_through_task(commit_queue, expected_logs, GoldenScriptError)
         self.assertEqual(task.results_from_patch_test_run(task._patch).failing_tests(), ["foo.html", "bar.html"])
         # failure_status_id should be of the test with patch (1), not the test without patch (2).
         self.assertEqual(task.failure_status_id, 1)
@@ -537,7 +539,7 @@
             None,
             GoldenScriptError("MOCK land failure"),
         ])
-        expected_stderr = """run_webkit_patch: ['clean']
+        expected_logs = """run_webkit_patch: ['clean']
 command_passed: success_message='Cleaned working directory' patch='10000'
 run_webkit_patch: ['update']
 command_passed: success_message='Updated working directory' patch='10000'
@@ -553,7 +555,7 @@
 command_failed: failure_message='Unable to land patch' script_error='MOCK land failure' patch='10000'
 """
         # FIXME: This should really be expect_retry=True for a better user experiance.
-        self._run_through_task(commit_queue, expected_stderr, GoldenScriptError)
+        self._run_through_task(commit_queue, expected_logs, GoldenScriptError)
 
     def _expect_validate(self, patch, is_valid):
         class MockDelegate(object):
@@ -564,7 +566,7 @@
                 return ExpectedFailures()
 
         task = CommitQueueTask(MockDelegate(), patch)
-        self.assertEquals(task.validate(), is_valid)
+        self.assertEqual(task.validate(), is_valid)
 
     def _mock_patch(self, attachment_dict={}, bug_dict={'bug_status': 'NEW'}, committer="fake"):
         bug = bugzilla.Bug(bug_dict, None)
diff --git a/Tools/Scripts/webkitpy/tool/bot/expectedfailures_unittest.py b/Tools/Scripts/webkitpy/tool/bot/expectedfailures_unittest.py
index 4c1c3d9..b639856 100644
--- a/Tools/Scripts/webkitpy/tool/bot/expectedfailures_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/expectedfailures_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.tool.bot.expectedfailures import ExpectedFailures
 
@@ -45,7 +45,7 @@
 
 class ExpectedFailuresTest(unittest.TestCase):
     def _assert_can_trust(self, results, can_trust):
-        self.assertEquals(ExpectedFailures._should_trust(results), can_trust)
+        self.assertEqual(ExpectedFailures._should_trust(results), can_trust)
 
     def test_can_trust_results(self):
         self._assert_can_trust(None, False)
@@ -77,19 +77,19 @@
     def test_unexpected_failures_observed(self):
         failures = ExpectedFailures()
         failures.update(MockResults(['foo.html']))
-        self.assertEquals(failures.unexpected_failures_observed(MockResults(['foo.html', 'bar.html'])), set(['bar.html']))
-        self.assertEquals(failures.unexpected_failures_observed(MockResults(['baz.html'])), set(['baz.html']))
+        self.assertEqual(failures.unexpected_failures_observed(MockResults(['foo.html', 'bar.html'])), set(['bar.html']))
+        self.assertEqual(failures.unexpected_failures_observed(MockResults(['baz.html'])), set(['baz.html']))
         unbounded_results = MockResults(['baz.html', 'qux.html', 'taco.html'], failure_limit=3)
-        self.assertEquals(failures.unexpected_failures_observed(unbounded_results), set(['baz.html', 'qux.html', 'taco.html']))
+        self.assertEqual(failures.unexpected_failures_observed(unbounded_results), set(['baz.html', 'qux.html', 'taco.html']))
         unbounded_results_with_existing_failure = MockResults(['foo.html', 'baz.html', 'qux.html', 'taco.html'], failure_limit=4)
-        self.assertEquals(failures.unexpected_failures_observed(unbounded_results_with_existing_failure), set(['baz.html', 'qux.html', 'taco.html']))
+        self.assertEqual(failures.unexpected_failures_observed(unbounded_results_with_existing_failure), set(['baz.html', 'qux.html', 'taco.html']))
 
     def test_unexpected_failures_observed_when_tree_is_hosed(self):
         failures = ExpectedFailures()
         failures.update(MockResults(['foo.html', 'banana.html'], failure_limit=2))
-        self.assertEquals(failures.unexpected_failures_observed(MockResults(['foo.html', 'bar.html'])), None)
-        self.assertEquals(failures.unexpected_failures_observed(MockResults(['baz.html'])), None)
+        self.assertEqual(failures.unexpected_failures_observed(MockResults(['foo.html', 'bar.html'])), None)
+        self.assertEqual(failures.unexpected_failures_observed(MockResults(['baz.html'])), None)
         unbounded_results = MockResults(['baz.html', 'qux.html', 'taco.html'], failure_limit=3)
-        self.assertEquals(failures.unexpected_failures_observed(unbounded_results), None)
+        self.assertEqual(failures.unexpected_failures_observed(unbounded_results), None)
         unbounded_results_with_existing_failure = MockResults(['foo.html', 'baz.html', 'qux.html', 'taco.html'], failure_limit=4)
-        self.assertEquals(failures.unexpected_failures_observed(unbounded_results_with_existing_failure), None)
+        self.assertEqual(failures.unexpected_failures_observed(unbounded_results_with_existing_failure), None)
diff --git a/Tools/Scripts/webkitpy/tool/bot/feeders.py b/Tools/Scripts/webkitpy/tool/bot/feeders.py
index 4ba2f04..f4bc4b9 100644
--- a/Tools/Scripts/webkitpy/tool/bot/feeders.py
+++ b/Tools/Scripts/webkitpy/tool/bot/feeders.py
@@ -26,10 +26,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.common.config.committervalidator import CommitterValidator
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.tool.grammar import pluralize
 
+_log = logging.getLogger(__name__)
+
 
 class AbstractFeeder(object):
     def __init__(self, tool):
@@ -50,7 +53,7 @@
         # FIXME: This is the last use of update_work_items, the commit-queue
         # should move to feeding patches one at a time like the EWS does.
         self._tool.status_server.update_work_items(self.queue_name, item_ids)
-        log("Feeding %s items %s" % (self.queue_name, item_ids))
+        _log.info("Feeding %s items %s" % (self.queue_name, item_ids))
 
     def feed(self):
         patches = self._validate_patches()
@@ -89,7 +92,7 @@
     def feed(self):
         ids_needing_review = set(self._tool.bugs.queries.fetch_attachment_ids_from_review_queue())
         new_ids = ids_needing_review.difference(self._ids_sent_to_server)
-        log("Feeding EWS (%s, %s new)" % (pluralize("r? patch", len(ids_needing_review)), len(new_ids)))
+        _log.info("Feeding EWS (%s, %s new)" % (pluralize("r? patch", len(ids_needing_review)), len(new_ids)))
         for attachment_id in new_ids:  # Order doesn't really matter for the EWS.
             self._tool.status_server.submit_to_ews(attachment_id)
             self._ids_sent_to_server.add(attachment_id)
diff --git a/Tools/Scripts/webkitpy/tool/bot/feeders_unittest.py b/Tools/Scripts/webkitpy/tool/bot/feeders_unittest.py
index dff48ad..b70a637 100644
--- a/Tools/Scripts/webkitpy/tool/bot/feeders_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/feeders_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 from datetime import datetime
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.thirdparty.mock import Mock
@@ -38,9 +38,9 @@
 class FeedersTest(unittest.TestCase):
     def test_commit_queue_feeder(self):
         feeder = CommitQueueFeeder(MockTool())
-        expected_stderr = u"""Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)
+        expected_logs = """Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)
 Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)
-MOCK setting flag 'commit-queue' to '-' on attachment '10001' with comment 'Rejecting attachment 10001 from commit-queue.' and additional comment 'non-committer@example.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/Tools/Scripts/webkitpy/common/config/committers.py.
+MOCK setting flag 'commit-queue' to '-' on attachment '10001' with comment 'Rejecting attachment 10001 from commit-queue.\n\nnon-committer@example.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/Tools/Scripts/webkitpy/common/config/committers.py.
 
 - If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.
 
@@ -48,7 +48,7 @@
 MOCK: update_work_items: commit-queue [10005, 10000]
 Feeding commit-queue items [10005, 10000]
 """
-        OutputCapture().assert_outputs(self, feeder.feed, expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, feeder.feed, expected_logs=expected_logs)
 
     def _mock_attachment(self, is_rollout, attach_date):
         attachment = Mock()
@@ -77,4 +77,4 @@
 
         feeder = CommitQueueFeeder(MockTool())
         patches = [MockPatch(1, None), MockPatch(2, '-'), MockPatch(3, "+")]
-        self.assertEquals([patch.id for patch in feeder._patches_with_acceptable_review_flag(patches)], [1, 3])
+        self.assertEqual([patch.id for patch in feeder._patches_with_acceptable_review_flag(patches)], [1, 3])
diff --git a/Tools/Scripts/webkitpy/tool/bot/flakytestreporter.py b/Tools/Scripts/webkitpy/tool/bot/flakytestreporter.py
index 7be4a4a..086a35b 100644
--- a/Tools/Scripts/webkitpy/tool/bot/flakytestreporter.py
+++ b/Tools/Scripts/webkitpy/tool/bot/flakytestreporter.py
@@ -42,7 +42,8 @@
     def __init__(self, tool, bot_name):
         self._tool = tool
         self._bot_name = bot_name
-        self._bot_info = BotInfo(tool)
+        # FIXME: Use the real port object
+        self._bot_info = BotInfo(tool, tool.deprecated_port().name())
 
     def _author_emails_for_test(self, flaky_test):
         test_path = path_for_layout_test(flaky_test)
diff --git a/Tools/Scripts/webkitpy/tool/bot/flakytestreporter_unittest.py b/Tools/Scripts/webkitpy/tool/bot/flakytestreporter_unittest.py
index eeb06c3..3fb3c83 100644
--- a/Tools/Scripts/webkitpy/tool/bot/flakytestreporter_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/flakytestreporter_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.config.committers import Committer
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -70,7 +70,7 @@
 
     def test_create_bug_for_flaky_test(self):
         reporter = FlakyTestReporter(MockTool(), 'dummy-queue')
-        expected_stderr = """MOCK create_bug
+        expected_logs = """MOCK create_bug
 bug_title: Flaky Test: foo/bar.html
 bug_description: This is an automatically generated bug from the dummy-queue.
 foo/bar.html has been flaky on the dummy-queue.
@@ -90,7 +90,7 @@
 cc: test@test.com
 blocked: 50856
 """
-        OutputCapture().assert_outputs(self, reporter._create_bug_for_flaky_test, ['foo/bar.html', ['test@test.com'], 'FLAKE_MESSAGE'], expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, reporter._create_bug_for_flaky_test, ['foo/bar.html', ['test@test.com'], 'FLAKE_MESSAGE'], expected_logs=expected_logs)
 
     def test_follow_duplicate_chain(self):
         tool = MockTool()
@@ -105,7 +105,8 @@
         reporter = FlakyTestReporter(tool, 'dummy-queue')
         reporter._lookup_bug_for_flaky_test = lambda bug_id: None
         patch = tool.bugs.fetch_attachment(10000)
-        expected_stderr = """MOCK create_bug
+        expected_logs = """Bug does not already exist for foo/bar.html, creating.
+MOCK create_bug
 bug_title: Flaky Test: foo/bar.html
 bug_description: This is an automatically generated bug from the dummy-queue.
 foo/bar.html has been flaky on the dummy-queue.
@@ -144,7 +145,7 @@
             def namelist(self):
                 return ['foo/bar-diffs.txt']
 
-        OutputCapture().assert_outputs(self, reporter.report_flaky_tests, [patch, test_results, MockZipFile()], expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, reporter.report_flaky_tests, [patch, test_results, MockZipFile()], expected_logs=expected_logs)
 
     def test_optional_author_string(self):
         reporter = FlakyTestReporter(MockTool(), 'dummy-queue')
diff --git a/Tools/Scripts/webkitpy/tool/bot/irc_command.py b/Tools/Scripts/webkitpy/tool/bot/irc_command.py
index 1c061a8..c168376 100644
--- a/Tools/Scripts/webkitpy/tool/bot/irc_command.py
+++ b/Tools/Scripts/webkitpy/tool/bot/irc_command.py
@@ -33,6 +33,7 @@
 from webkitpy.common.config import irc as config_irc
 from webkitpy.common.config import urls
 from webkitpy.common.config.committers import CommitterList
+from webkitpy.common.net.web import Web
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.tool.bot.queueengine import TerminateQueue
 from webkitpy.tool.grammar import join_with_separators
@@ -48,19 +49,137 @@
 
 # FIXME: Merge with Command?
 class IRCCommand(object):
+    usage_string = None
+    help_string = None
+
     def execute(self, nick, args, tool, sheriff):
-        raise NotImplementedError, "subclasses must implement"
+        raise NotImplementedError("subclasses must implement")
+
+    @classmethod
+    def usage(cls, nick):
+        return "%s: Usage: %s" % (nick, cls.usage_string)
+
+    @classmethod
+    def help(cls, nick):
+        return "%s: %s" % (nick, cls.help_string)
+
+
+class CreateBug(IRCCommand):
+    usage_string = "create-bug BUG_TITLE"
+    help_string = "Creates a Bugzilla bug with the given title."
+
+    def execute(self, nick, args, tool, sheriff):
+        if not args:
+            return self.usage(nick)
+
+        bug_title = " ".join(args)
+        bug_description = "%s\nRequested by %s on %s." % (bug_title, nick, config_irc.channel)
+
+        # There happens to be a committers list hung off of Bugzilla, so
+        # re-using that one makes things easiest for now.
+        requester = tool.bugs.committers.contributor_by_irc_nickname(nick)
+        requester_email = requester.bugzilla_email() if requester else None
+
+        try:
+            bug_id = tool.bugs.create_bug(bug_title, bug_description, cc=requester_email, assignee=requester_email)
+            bug_url = tool.bugs.bug_url_for_bug_id(bug_id)
+            return "%s: Created bug: %s" % (nick, bug_url)
+        except Exception, e:
+            return "%s: Failed to create bug:\n%s" % (nick, e)
+
+
+class Help(IRCCommand):
+    usage_string = "help [COMMAND]"
+    help_string = "Provides help on individual sheriffbot commands."
+
+    def execute(self, nick, args, tool, sheriff):
+        if args:
+            for command_name in args:
+                if command_name in commands:
+                    self._post_command_help(nick, tool, commands[command_name])
+        else:
+            tool.irc().post("%s: Available commands: %s" % (nick, ", ".join(sorted(visible_commands.keys()))))
+            tool.irc().post('%s: Type "sheriffbot: help COMMAND" for help on individual commands.' % nick)
+
+    def _post_command_help(self, nick, tool, command):
+        tool.irc().post(command.usage(nick))
+        tool.irc().post(command.help(nick))
+        aliases = " ".join(sorted(filter(lambda alias: commands[alias] == command and alias not in visible_commands, commands)))
+        if aliases:
+            tool.irc().post("%s: Aliases: %s" % (nick, aliases))
+
+
+class Hi(IRCCommand):
+    usage_string = "hi"
+    help_string = "Retrieves a random quip from Bugzilla."
+
+    def execute(self, nick, args, tool, sheriff):
+        quips = tool.bugs.quips()
+        quips.append('"Only you can prevent forest fires." -- Smokey the Bear')
+        return random.choice(quips)
 
 
 class Restart(IRCCommand):
+    usage_string = "restart"
+    help_string = "Restarts sherrifbot.  Will update its WebKit checkout, and re-join the channel momentarily."
+
     def execute(self, nick, args, tool, sheriff):
         tool.irc().post("Restarting...")
         raise TerminateQueue()
 
 
-class Rollout(IRCCommand):
-    def _extract_revisions(self, arg):
+class RollChromiumDEPS(IRCCommand):
+    usage_string = "roll-chromium-deps REVISION"
+    help_string = "Rolls WebKit's Chromium DEPS to the given revision. Give LKGR as the revision number to use the last known good revision. This lands an unreviewed patch and provides the bug URL."
 
+    def _parse_args(self, args):
+        if not args:
+            return None
+        revision = args[0].lstrip("r")
+        if revision == "LKGR" or revision.isdigit():
+            return revision
+        return None
+
+    def _expand_irc_nickname(self, nick):
+        contributor = CommitterList().contributor_by_irc_nickname(nick)
+        if contributor:
+            return str(contributor)
+        return nick
+
+    def execute(self, nick, args, tool, sheriff):
+        revision = self._parse_args(args)
+        if not revision:
+            return self.usage(nick)
+
+        roll_target = "r%s" % revision if revision.isdigit() else "last-known good revision"
+        tool.irc().post("%s: Rolling Chromium DEPS to %s" % (nick, roll_target))
+        changelog_message = "Unreviewed.  Rolled Chromium DEPS to %s.  Requested by %s via sheriffbot.\n\n" % (roll_target, self._expand_irc_nickname(nick))
+
+        try:
+            bug_id = sheriff.post_chromium_deps_roll(revision, roll_target, changelog_message)
+            bug_url = tool.bugs.bug_url_for_bug_id(bug_id)
+            return "%s: Created DEPS roll: %s" % (nick, bug_url)
+        except ScriptError, e:
+            tool.irc().post("%s: Failed to create DEPS roll:" % nick)
+            pre_bug_error_messages = [
+                r"Current Chromium DEPS revision \d+ is newer than \d+\.",
+                r"Unable to update Chromium DEPS\.",
+                r"Unable to parse LKGR from: .*",
+                r"Unable to reach LKGR source: .*",
+                r"Invalid revision number\.",
+            ]
+            for message in pre_bug_error_messages:
+                match = re.search(message, e.output)
+                if match:
+                    return "%s: %s" % (nick, match.group(0))
+            _post_error_and_check_for_bug_url(tool, nick, e)
+
+
+class Rollout(IRCCommand):
+    usage_string = "rollout SVN_REVISION [SVN_REVISIONS] REASON"
+    help_string = "Opens a rollout bug, CCing author + reviewer, and attaching the reverse-diff of the given revisions marked as commit-queue=?."
+
+    def _extract_revisions(self, arg):
         revision_list = []
         possible_revisions = arg.split(",")
         for revision in possible_revisions:
@@ -110,15 +229,14 @@
         return ", ".join(target_nicks)
 
     def _update_working_copy(self, tool):
-        tool.scm().ensure_clean_working_directory(force_clean=True)
-        tool.executive.run_and_throw_if_fail(tool.port().update_webkit_command(), quiet=True, cwd=tool.scm().checkout_root)
+        tool.scm().discard_local_changes()
+        tool.executive.run_and_throw_if_fail(tool.deprecated_port().update_webkit_command(), quiet=True, cwd=tool.scm().checkout_root)
 
     def execute(self, nick, args, tool, sheriff):
         svn_revision_list, rollout_reason = self._parse_args(args)
 
         if (not svn_revision_list or not rollout_reason):
-            # return is equivalent to an irc().post(), but makes for easier unit testing.
-            return "%s: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON" % nick
+            return self.usage(nick)
 
         revision_urls_string = join_with_separators([urls.view_revision_url(revision) for revision in svn_revision_list])
         tool.irc().post("%s: Preparing rollout for %s ..." % (nick, revision_urls_string))
@@ -140,56 +258,57 @@
             _post_error_and_check_for_bug_url(tool, nicks_string, e)
 
 
-class RollChromiumDEPS(IRCCommand):
-    def _parse_args(self, args):
-        if not args:
-            return
-        revision = args[0].lstrip("r")
-        if not revision.isdigit():
-            return
-        return revision
+class Sheriffs(IRCCommand):
+    usage_string = "sheriffs"
+    help_string = "Retrieves who the current Chromium WebKit sheriffs are from: %s" % urls.chromium_webkit_sheriff_url
 
-    def execute(self, nick, args, tool, sheriff):
-        revision = self._parse_args(args)
+    def _retrieve_webkit_sheriffs(self, tool, url):
+        try:
+            sheriff_js = tool.web.get_binary(url, True)
+        except:
+            return None
+        if sheriff_js == None:
+            return None
 
-        roll_target = "r%s" % revision if revision else "last-known good revision"
-        tool.irc().post("%s: Rolling Chromium DEPS to %s" % (nick, roll_target))
+        match = re.search(r"document.write\('(.*)'\)", sheriff_js)
 
         try:
-            bug_id = sheriff.post_chromium_deps_roll(revision, roll_target)
-            bug_url = tool.bugs.bug_url_for_bug_id(bug_id)
-            tool.irc().post("%s: Created DEPS roll: %s" % (nick, bug_url))
-        except ScriptError, e:
-            match = re.search(r"Current Chromium DEPS revision \d+ is newer than \d+\.", e.output)
-            if match:
-                tool.irc().post("%s: %s" % (nick, match.group(0)))
-                return
-            tool.irc().post("%s: Failed to create DEPS roll:" % nick)
-            _post_error_and_check_for_bug_url(tool, nick, e)
+            return match.group(1)
+        except:
+            return None
 
-
-class Help(IRCCommand):
     def execute(self, nick, args, tool, sheriff):
-        return "%s: Available commands: %s" % (nick, ", ".join(sorted(visible_commands.keys())))
+        if not args:
+            url = urls.chromium_webkit_sheriff_url
+        else:
+            url = args[0]
 
+        sheriffs = self._retrieve_webkit_sheriffs(tool, url)
+        if sheriffs == None:
+            return "%s: Failed to parse URL: %s" % (nick, url)
 
-class Hi(IRCCommand):
-    def execute(self, nick, args, tool, sheriff):
-        quips = tool.bugs.quips()
-        quips.append('"Only you can prevent forest fires." -- Smokey the Bear')
-        return random.choice(quips)
+        sheriff_name = "Chromium Webkit sheriff"
+        sheriff_count = len(sheriffs.split())
+        if sheriff_count == 0:
+            return "%s: There are no %ss currently assigned." % (nick, sheriff_name)
+        if sheriff_count == 1:
+            return "%s: The current %s is: %s" % (nick, sheriff_name, sheriffs)
+        return "%s: The current %ss are: %s" % (nick, sheriff_name, sheriffs)
 
 
 class Whois(IRCCommand):
+    usage_string = "whois SEARCH_STRING"
+    help_string = "Searches known contributors and returns any matches with irc, email and full name. Wild card * permitted."
+
     def _nick_or_full_record(self, contributor):
         if contributor.irc_nicknames:
             return ', '.join(contributor.irc_nicknames)
         return unicode(contributor)
 
     def execute(self, nick, args, tool, sheriff):
-        if len(args) != 1:
-            return "%s: Usage: whois SEARCH_STRING" % nick
-        search_string = args[0]
+        if not args:
+            return self.usage(nick)
+        search_string = " ".join(args)
         # FIXME: We should get the ContributorList off the tool somewhere.
         contributors = CommitterList().contributors_by_search_string(search_string)
         if not contributors:
@@ -210,36 +329,16 @@
         return "%s: I'm not sure who you mean?  %s could be '%s'." % (nick, contributors_string, search_string)
 
 
-class CreateBug(IRCCommand):
-    def execute(self, nick, args, tool, sheriff):
-        if not args:
-            return "%s: Usage: create-bug BUG_TITLE" % nick
-
-        bug_title = " ".join(args)
-        bug_description = "%s\nRequested by %s on %s." % (bug_title, nick, config_irc.channel)
-
-        # There happens to be a committers list hung off of Bugzilla, so
-        # re-using that one makes things easiest for now.
-        requester = tool.bugs.committers.contributor_by_irc_nickname(nick)
-        requester_email = requester.bugzilla_email() if requester else None
-
-        try:
-            bug_id = tool.bugs.create_bug(bug_title, bug_description, cc=requester_email, assignee=requester_email)
-            bug_url = tool.bugs.bug_url_for_bug_id(bug_id)
-            return "%s: Created bug: %s" % (nick, bug_url)
-        except Exception, e:
-            return "%s: Failed to create bug:\n%s" % (nick, e)
-
-
 # FIXME: Lame.  We should have an auto-registering CommandCenter.
 visible_commands = {
+    "create-bug": CreateBug,
     "help": Help,
     "hi": Hi,
     "restart": Restart,
-    "rollout": Rollout,
-    "whois": Whois,
-    "create-bug": CreateBug,
     "roll-chromium-deps": RollChromiumDEPS,
+    "rollout": Rollout,
+    "sheriffs": Sheriffs,
+    "whois": Whois,
 }
 
 # Add revert as an "easter egg" command. Why?
@@ -248,3 +347,10 @@
 # people to use and it seems silly to have them hunt around for "rollout" instead.
 commands = visible_commands.copy()
 commands["revert"] = Rollout
+commands["gardeners"] = Sheriffs
+# Enough people misspell "sheriffs" that they've requested aliases for the command.
+commands["sherriffs"] = Sheriffs
+commands["sherifs"] = Sheriffs
+commands["sherrifs"] = Sheriffs
+# "hello" Alias for "hi" command for the purposes of testing aliases
+commands["hello"] = Hi
diff --git a/Tools/Scripts/webkitpy/tool/bot/irc_command_unittest.py b/Tools/Scripts/webkitpy/tool/bot/irc_command_unittest.py
index 4dec669..0517744 100644
--- a/Tools/Scripts/webkitpy/tool/bot/irc_command_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/irc_command_unittest.py
@@ -26,41 +26,66 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import os
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.bot.irc_command import *
 from webkitpy.tool.mocktool import MockTool
+from webkitpy.common.net.web_mock import MockWeb
 from webkitpy.common.system.executive_mock import MockExecutive
 
 
 class IRCCommandTest(unittest.TestCase):
     def test_whois(self):
         whois = Whois()
-        self.assertEquals("tom: Usage: whois SEARCH_STRING",
+        self.assertEqual("tom: Usage: whois SEARCH_STRING",
                           whois.execute("tom", [], None, None))
-        self.assertEquals("tom: Usage: whois SEARCH_STRING",
+        self.assertEqual("tom: Adam Barth is abarth (abarth@webkit.org). Why do you ask?",
                           whois.execute("tom", ["Adam", "Barth"], None, None))
-        self.assertEquals("tom: Sorry, I don't know any contributors matching 'unknown@example.com'.",
+        self.assertEqual("tom: Sorry, I don't know any contributors matching 'unknown@example.com'.",
                           whois.execute("tom", ["unknown@example.com"], None, None))
-        self.assertEquals("tom: tonyg@chromium.org is tonyg-cr. Why do you ask?",
+        self.assertEqual("tom: tonyg@chromium.org is tonyg-cr. Why do you ask?",
                           whois.execute("tom", ["tonyg@chromium.org"], None, None))
-        self.assertEquals("tom: TonyG@Chromium.org is tonyg-cr. Why do you ask?",
+        self.assertEqual("tom: TonyG@Chromium.org is tonyg-cr. Why do you ask?",
                           whois.execute("tom", ["TonyG@Chromium.org"], None, None))
-        self.assertEquals("tom: rniwa is rniwa (rniwa@webkit.org). Why do you ask?",
+        self.assertEqual("tom: rniwa is rniwa (rniwa@webkit.org). Why do you ask?",
                           whois.execute("tom", ["rniwa"], None, None))
-        self.assertEquals("tom: lopez is xan (xan.lopez@gmail.com, xan@gnome.org, xan@webkit.org, xlopez@igalia.com). Why do you ask?",
+        self.assertEqual("tom: lopez is xan (xan.lopez@gmail.com, xan@gnome.org, xan@webkit.org, xlopez@igalia.com). Why do you ask?",
                           whois.execute("tom", ["lopez"], None, None))
-        self.assertEquals('tom: "Vicki Murley" <vicki@apple.com> hasn\'t told me their nick. Boo hoo :-(',
+        self.assertEqual('tom: "Vicki Murley" <vicki@apple.com> hasn\'t told me their nick. Boo hoo :-(',
                           whois.execute("tom", ["vicki@apple.com"], None, None))
-        self.assertEquals('tom: I\'m not sure who you mean?  gavinp or gbarra could be \'Gavin\'.',
+        self.assertEqual('tom: I\'m not sure who you mean?  gavinp or gbarra could be \'Gavin\'.',
                           whois.execute("tom", ["Gavin"], None, None))
-        self.assertEquals('tom: More than 5 contributors match \'david\', could you be more specific?',
+        self.assertEqual('tom: More than 5 contributors match \'david\', could you be more specific?',
                           whois.execute("tom", ["david"], None, None))
 
+    @staticmethod
+    def _sheriff_test_data_url(suffix):
+        return "file://" + os.path.join(os.path.dirname(os.path.abspath(__file__)), "testdata", "webkit_sheriff_%s.js" % suffix)
+
+    def test_sheriffs(self):
+        sheriffs = Sheriffs()
+        tool = MockTool(web=MockWeb({
+          "test_0": "document.write('');",
+          "test_1": "document.write('test_user');",
+          "test_2": "document.write('test_user_1, test_user_2');",
+          "test_malformed": "malformed",
+        }))
+        self.assertEqual("tom: There are no Chromium Webkit sheriffs currently assigned.",
+                         sheriffs.execute("tom", ["test_0"], tool, None))
+        self.assertEqual("tom: The current Chromium Webkit sheriff is: test_user",
+                         sheriffs.execute("tom", ["test_1"], tool, None))
+        self.assertEqual("tom: The current Chromium Webkit sheriffs are: test_user_1, test_user_2",
+                         sheriffs.execute("tom", ["test_2"], tool, None))
+        self.assertEqual("tom: Failed to parse URL: test_malformed",
+                         sheriffs.execute("tom", ["test_malformed"], tool, None))
+        self.assertEqual("tom: Failed to parse URL: invalid",
+                         sheriffs.execute("tom", ["invalid"], tool, None))
+
     def test_create_bug(self):
         create_bug = CreateBug()
-        self.assertEquals("tom: Usage: create-bug BUG_TITLE",
+        self.assertEqual("tom: Usage: create-bug BUG_TITLE",
                           create_bug.execute("tom", [], None, None))
 
         example_args = ["sherrif-bot", "should", "have", "a", "create-bug", "command"]
@@ -68,50 +93,55 @@
 
         # MockBugzilla has a create_bug, but it logs to stderr, this avoids any logging.
         tool.bugs.create_bug = lambda a, b, cc=None, assignee=None: 50004
-        self.assertEquals("tom: Created bug: http://example.com/50004",
+        self.assertEqual("tom: Created bug: http://example.com/50004",
                           create_bug.execute("tom", example_args, tool, None))
 
         def mock_create_bug(title, description, cc=None, assignee=None):
             raise Exception("Exception from bugzilla!")
         tool.bugs.create_bug = mock_create_bug
-        self.assertEquals("tom: Failed to create bug:\nException from bugzilla!",
+        self.assertEqual("tom: Failed to create bug:\nException from bugzilla!",
                           create_bug.execute("tom", example_args, tool, None))
 
     def test_roll_chromium_deps(self):
         roll = RollChromiumDEPS()
-        self.assertEquals(None, roll._parse_args([]))
-        self.assertEquals("1234", roll._parse_args(["1234"]))
+        self.assertIsNone(roll._parse_args([]))
+        self.assertIsNone(roll._parse_args(["invalid"]))
+        self.assertEqual("1234", roll._parse_args(["1234"]))
+        self.assertEqual("1234", roll._parse_args(["r1234"]))
+        self.assertEqual("LKGR", roll._parse_args(["LKGR"]))
+        self.assertEqual('"Alan Cutter" <alancutter@chromium.org>', roll._expand_irc_nickname("alancutter"))
+        self.assertEqual("unknown_irc_nickname", roll._expand_irc_nickname("unknown_irc_nickname"))
 
     def test_rollout_updates_working_copy(self):
         rollout = Rollout()
         tool = MockTool()
         tool.executive = MockExecutive(should_log=True)
-        expected_stderr = "MOCK run_and_throw_if_fail: ['mock-update-webkit'], cwd=/mock-checkout\n"
-        OutputCapture().assert_outputs(self, rollout._update_working_copy, [tool], expected_stderr=expected_stderr)
+        expected_logs = "MOCK run_and_throw_if_fail: ['mock-update-webkit'], cwd=/mock-checkout\n"
+        OutputCapture().assert_outputs(self, rollout._update_working_copy, [tool], expected_logs=expected_logs)
 
     def test_rollout(self):
         rollout = Rollout()
-        self.assertEquals(([1234], "testing foo"),
+        self.assertEqual(([1234], "testing foo"),
                           rollout._parse_args(["1234", "testing", "foo"]))
 
-        self.assertEquals(([554], "testing foo"),
+        self.assertEqual(([554], "testing foo"),
                           rollout._parse_args(["r554", "testing", "foo"]))
 
-        self.assertEquals(([556, 792], "testing foo"),
+        self.assertEqual(([556, 792], "testing foo"),
                           rollout._parse_args(["r556", "792", "testing", "foo"]))
 
-        self.assertEquals(([128, 256], "testing foo"),
+        self.assertEqual(([128, 256], "testing foo"),
                           rollout._parse_args(["r128,r256", "testing", "foo"]))
 
-        self.assertEquals(([512, 1024, 2048], "testing foo"),
+        self.assertEqual(([512, 1024, 2048], "testing foo"),
                           rollout._parse_args(["512,", "1024,2048", "testing", "foo"]))
 
         # Test invalid argument parsing:
-        self.assertEquals((None, None), rollout._parse_args([]))
-        self.assertEquals((None, None), rollout._parse_args(["--bar", "1234"]))
+        self.assertEqual((None, None), rollout._parse_args([]))
+        self.assertEqual((None, None), rollout._parse_args(["--bar", "1234"]))
 
         # Invalid arguments result in the USAGE message.
-        self.assertEquals("tom: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON",
+        self.assertEqual("tom: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON",
                           rollout.execute("tom", [], None, None))
 
         # FIXME: We need a better way to test IRCCommands which call tool.irc().post()
diff --git a/Tools/Scripts/webkitpy/tool/bot/ircbot_unittest.py b/Tools/Scripts/webkitpy/tool/bot/ircbot_unittest.py
index ce9a76b..c83569b 100644
--- a/Tools/Scripts/webkitpy/tool/bot/ircbot_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/ircbot_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 import random
 
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -71,8 +71,8 @@
                 raise Exception("mock_exception")
 
         bot._parse_command_and_args = lambda request: (CommandWithException, [])
-        expected_stderr = 'MOCK: irc.post: Exception executing command: mock_exception\n'
-        OutputCapture().assert_outputs(self, bot.process_message, args=["mock_nick", "ignored message"], expected_stderr=expected_stderr)
+        expected_logs = 'MOCK: irc.post: Exception executing command: mock_exception\n'
+        OutputCapture().assert_outputs(self, bot.process_message, args=["mock_nick", "ignored message"], expected_logs=expected_logs)
 
         class CommandWithException(object):
             def execute(self, nick, args, tool, sheriff):
@@ -84,80 +84,83 @@
 
     def test_hi(self):
         random.seed(23324)
-        expected_stderr = 'MOCK: irc.post: "Only you can prevent forest fires." -- Smokey the Bear\n'
-        OutputCapture().assert_outputs(self, run, args=["hi"], expected_stderr=expected_stderr)
+        expected_logs = 'MOCK: irc.post: "Only you can prevent forest fires." -- Smokey the Bear\n'
+        OutputCapture().assert_outputs(self, run, args=["hi"], expected_logs=expected_logs)
 
     def test_help(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Available commands: create-bug, help, hi, restart, roll-chromium-deps, rollout, whois\n"
-        OutputCapture().assert_outputs(self, run, args=["help"], expected_stderr=expected_stderr)
+        expected_logs = 'MOCK: irc.post: mock_nick: Available commands: create-bug, help, hi, restart, roll-chromium-deps, rollout, sheriffs, whois\nMOCK: irc.post: mock_nick: Type "sheriffbot: help COMMAND" for help on individual commands.\n'
+        OutputCapture().assert_outputs(self, run, args=["help"], expected_logs=expected_logs)
+        expected_logs = 'MOCK: irc.post: mock_nick: Usage: hi\nMOCK: irc.post: mock_nick: Retrieves a random quip from Bugzilla.\nMOCK: irc.post: mock_nick: Aliases: hello\n'
+        OutputCapture().assert_outputs(self, run, args=["help hi"], expected_logs=expected_logs)
+        OutputCapture().assert_outputs(self, run, args=["help hello"], expected_logs=expected_logs)
 
     def test_restart(self):
-        expected_stderr = "MOCK: irc.post: Restarting...\n"
-        OutputCapture().assert_outputs(self, run, args=["restart"], expected_stderr=expected_stderr, expected_exception=TerminateQueue)
+        expected_logs = "MOCK: irc.post: Restarting...\n"
+        OutputCapture().assert_outputs(self, run, args=["restart"], expected_logs=expected_logs, expected_exception=TerminateQueue)
 
     def test_rollout(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
-        OutputCapture().assert_outputs(self, run, args=["rollout 21654 This patch broke the world"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
+        OutputCapture().assert_outputs(self, run, args=["rollout 21654 This patch broke the world"], expected_logs=expected_logs)
 
     def test_revert(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
-        OutputCapture().assert_outputs(self, run, args=["revert 21654 This patch broke the world"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
+        OutputCapture().assert_outputs(self, run, args=["revert 21654 This patch broke the world"], expected_logs=expected_logs)
 
     def test_roll_chromium_deps(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Rolling Chromium DEPS to r21654\nMOCK: irc.post: mock_nick: Created DEPS roll: http://example.com/36936\n"
-        OutputCapture().assert_outputs(self, run, args=["roll-chromium-deps 21654"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Rolling Chromium DEPS to r21654\nMOCK: irc.post: mock_nick: Created DEPS roll: http://example.com/36936\n"
+        OutputCapture().assert_outputs(self, run, args=["roll-chromium-deps 21654"], expected_logs=expected_logs)
 
     def test_roll_chromium_deps_to_lkgr(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Rolling Chromium DEPS to last-known good revision\nMOCK: irc.post: mock_nick: Created DEPS roll: http://example.com/36936\n"
-        OutputCapture().assert_outputs(self, run, args=["roll-chromium-deps"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Rolling Chromium DEPS to last-known good revision\nMOCK: irc.post: mock_nick: Created DEPS roll: http://example.com/36936\n"
+        OutputCapture().assert_outputs(self, run, args=["roll-chromium-deps LKGR"], expected_logs=expected_logs)
 
     def test_multi_rollout(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654, http://trac.webkit.org/changeset/21655, and http://trac.webkit.org/changeset/21656 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
-        OutputCapture().assert_outputs(self, run, args=["rollout 21654 21655 21656 This 21654 patch broke the world"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654, http://trac.webkit.org/changeset/21655, and http://trac.webkit.org/changeset/21656 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
+        OutputCapture().assert_outputs(self, run, args=["rollout 21654 21655 21656 This 21654 patch broke the world"], expected_logs=expected_logs)
 
     def test_rollout_with_r_in_svn_revision(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
-        OutputCapture().assert_outputs(self, run, args=["rollout r21654 This patch broke the world"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
+        OutputCapture().assert_outputs(self, run, args=["rollout r21654 This patch broke the world"], expected_logs=expected_logs)
 
     def test_multi_rollout_with_r_in_svn_revision(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654, http://trac.webkit.org/changeset/21655, and http://trac.webkit.org/changeset/21656 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
-        OutputCapture().assert_outputs(self, run, args=["rollout r21654 21655 r21656 This r21654 patch broke the world"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654, http://trac.webkit.org/changeset/21655, and http://trac.webkit.org/changeset/21656 ...\nMOCK: irc.post: mock_nick, abarth, darin, eseidel: Created rollout: http://example.com/36936\n"
+        OutputCapture().assert_outputs(self, run, args=["rollout r21654 21655 r21656 This r21654 patch broke the world"], expected_logs=expected_logs)
 
     def test_rollout_bananas(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
-        OutputCapture().assert_outputs(self, run, args=["rollout bananas"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
+        OutputCapture().assert_outputs(self, run, args=["rollout bananas"], expected_logs=expected_logs)
 
     def test_rollout_invalidate_revision(self):
         # When folks pass junk arguments, we should just spit the usage back at them.
-        expected_stderr = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
+        expected_logs = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
         OutputCapture().assert_outputs(self, run,
                                        args=["rollout --component=Tools 21654"],
-                                       expected_stderr=expected_stderr)
+                                       expected_logs=expected_logs)
 
     def test_rollout_invalidate_reason(self):
         # FIXME: I'm slightly confused as to why this doesn't return the USAGE message.
-        expected_stderr = """MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...
+        expected_logs = """MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654 ...
 MOCK: irc.post: mock_nick, abarth, darin, eseidel: Failed to create rollout patch:
 MOCK: irc.post: The rollout reason may not begin with - (\"-bad (Requested by mock_nick on #webkit).\").
 """
         OutputCapture().assert_outputs(self, run,
                                        args=["rollout 21654 -bad"],
-                                       expected_stderr=expected_stderr)
+                                       expected_logs=expected_logs)
 
     def test_multi_rollout_invalidate_reason(self):
-        expected_stderr = """MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654, http://trac.webkit.org/changeset/21655, and http://trac.webkit.org/changeset/21656 ...
+        expected_logs = """MOCK: irc.post: mock_nick: Preparing rollout for http://trac.webkit.org/changeset/21654, http://trac.webkit.org/changeset/21655, and http://trac.webkit.org/changeset/21656 ...
 MOCK: irc.post: mock_nick, abarth, darin, eseidel: Failed to create rollout patch:
 MOCK: irc.post: The rollout reason may not begin with - (\"-bad (Requested by mock_nick on #webkit).\").
 """
         OutputCapture().assert_outputs(self, run,
                                        args=["rollout "
                                              "21654 21655 r21656 -bad"],
-                                       expected_stderr=expected_stderr)
+                                       expected_logs=expected_logs)
 
     def test_rollout_no_reason(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
-        OutputCapture().assert_outputs(self, run, args=["rollout 21654"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
+        OutputCapture().assert_outputs(self, run, args=["rollout 21654"], expected_logs=expected_logs)
 
     def test_multi_rollout_no_reason(self):
-        expected_stderr = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
-        OutputCapture().assert_outputs(self, run, args=["rollout 21654 21655 r21656"], expected_stderr=expected_stderr)
+        expected_logs = "MOCK: irc.post: mock_nick: Usage: rollout SVN_REVISION [SVN_REVISIONS] REASON\n"
+        OutputCapture().assert_outputs(self, run, args=["rollout 21654 21655 r21656"], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader.py b/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader.py
index 94a70b2..a9e53dd 100644
--- a/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader.py
+++ b/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 Google Inc. All rights reserved.
+# Copyright (c) 2013 Google Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -26,37 +26,41 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.common.net.layouttestresults import LayoutTestResults
 from webkitpy.common.net.unittestresults import UnitTestResults
-from webkitpy.common.system.deprecated_logging import error, log
 from webkitpy.tool.steps.runtests import RunTests
 
+_log = logging.getLogger(__name__)
 
+
+# FIXME: This class no longer has a clear purpose, and should probably
+# be made part of Port, or renamed to LayoutTestResultsArchiver or something more fitting?
 class LayoutTestResultsReader(object):
-    def __init__(self, tool, archive_directory):
-        self._tool = tool
+    def __init__(self, host, results_directory, archive_directory):
+        self._host = host
+        self._results_directory = results_directory
         self._archive_directory = archive_directory
 
     # FIXME: This exists for mocking, but should instead be mocked via
-    # tool.filesystem.read_text_file.  They have different error handling at the moment.
+    # host.filesystem.read_text_file.  They have different error handling at the moment.
     def _read_file_contents(self, path):
         try:
-            return self._tool.filesystem.read_text_file(path)
+            return self._host.filesystem.read_text_file(path)
         except IOError, e:  # File does not exist or can't be read.
             return None
 
     # FIXME: This logic should move to the port object.
     def _create_layout_test_results(self):
-        results_path = self._tool.port().layout_tests_results_path()
+        results_path = self._host.filesystem.join(self._results_directory, "full_results.json")
         results_html = self._read_file_contents(results_path)
         if not results_html:
             return None
         return LayoutTestResults.results_from_string(results_html)
 
     def _create_unit_test_results(self):
-        results_path = self._tool.port().unit_tests_results_path()
-        if not results_path:
-            return None
+        results_path = self._host.filesystem.join(self._results_directory, "webkit_unit_tests_output.xml")
         results_xml = self._read_file_contents(results_path)
         if not results_xml:
             return None
@@ -66,36 +70,28 @@
         layout_test_results = self._create_layout_test_results()
         unit_test_results = self._create_unit_test_results()
         if layout_test_results:
-            # FIXME: We should not have to set failure_limit_count, but we
-            # do until run-webkit-tests can be updated save off the value
-            # of --exit-after-N-failures in results.html/results.json.
-            # https://bugs.webkit.org/show_bug.cgi?id=58481
+            # FIXME: This is used to detect if we had N failures due to
+            # N tests failing, or if we hit the "exit-after-n-failures" limit.
+            # These days we could just check for the "interrupted" key in results.json instead!
             layout_test_results.set_failure_limit_count(RunTests.NON_INTERACTIVE_FAILURE_LIMIT_COUNT)
             if unit_test_results:
                 layout_test_results.add_unit_test_failures(unit_test_results)
         return layout_test_results
 
-    def _results_directory(self):
-        results_path = self._tool.port().layout_tests_results_path()
-        # FIXME: This is wrong in two ways:
-        # 1. It assumes that results.html is at the top level of the results tree.
-        # 2. This uses the "old" ports.py infrastructure instead of the new layout_tests/port
-        # which will not support Chromium.  However the new arch doesn't work with old-run-webkit-tests
-        # so we have to use this for now.
-        return self._tool.filesystem.dirname(results_path)
-
     def archive(self, patch):
-        results_directory = self._results_directory()
-        results_name, _ = self._tool.filesystem.splitext(self._tool.filesystem.basename(results_directory))
+        filesystem = self._host.filesystem
+        workspace = self._host.workspace
+        results_directory = self._results_directory
+        results_name, _ = filesystem.splitext(filesystem.basename(results_directory))
         # Note: We name the zip with the bug_id instead of patch_id to match work_item_log_path().
-        zip_path = self._tool.workspace.find_unused_filename(self._archive_directory, "%s-%s" % (patch.bug_id(), results_name), "zip")
+        zip_path = workspace.find_unused_filename(self._archive_directory, "%s-%s" % (patch.bug_id(), results_name), "zip")
         if not zip_path:
             return None
-        if not self._tool.filesystem.isdir(results_directory):
-            log("%s does not exist, not archiving." % results_directory)
+        if not filesystem.isdir(results_directory):
+            _log.info("%s does not exist, not archiving." % results_directory)
             return None
-        archive = self._tool.workspace.create_zip(zip_path, results_directory)
+        archive = workspace.create_zip(filesystem.abspath(zip_path), filesystem.abspath(results_directory))
         # Remove the results directory to prevent http logs, etc. from getting huge between runs.
         # We could have create_zip remove the original, but this is more explicit.
-        self._tool.filesystem.rmtree(results_directory)
+        filesystem.rmtree(results_directory)
         return archive
diff --git a/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py b/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py
index 0eb3482..c779bb8 100644
--- a/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/layouttestresultsreader_unittest.py
@@ -26,32 +26,33 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.net.layouttestresults import LayoutTestResults
-from webkitpy.tool.bot.layouttestresultsreader import *
-from webkitpy.tool.mocktool import MockTool
+from webkitpy.common.host_mock import MockHost
+
+from .layouttestresultsreader import LayoutTestResultsReader
 
 
 class LayoutTestResultsReaderTest(unittest.TestCase):
     def test_missing_layout_test_results(self):
-        tool = MockTool()
-        reader = LayoutTestResultsReader(tool, "/var/logs")
+        host = MockHost()
+        reader = LayoutTestResultsReader(host, "/mock-results", "/var/logs")
         layout_tests_results_path = '/mock-results/full_results.json'
         unit_tests_results_path = '/mock-results/webkit_unit_tests_output.xml'
-        tool.filesystem = MockFileSystem({layout_tests_results_path: None,
+        host.filesystem = MockFileSystem({layout_tests_results_path: None,
                                           unit_tests_results_path: None})
         # Make sure that our filesystem mock functions as we expect.
-        self.assertRaises(IOError, tool.filesystem.read_text_file, layout_tests_results_path)
-        self.assertRaises(IOError, tool.filesystem.read_text_file, unit_tests_results_path)
-        # layout_test_results shouldn't raise even if the results.html file is missing.
-        self.assertEquals(reader.results(), None)
+        self.assertRaises(IOError, host.filesystem.read_text_file, layout_tests_results_path)
+        self.assertRaises(IOError, host.filesystem.read_text_file, unit_tests_results_path)
+        # layout_test_results shouldn't raise even if the results.json file is missing.
+        self.assertIsNone(reader.results())
 
     def test_create_unit_test_results(self):
-        tool = MockTool()
-        reader = LayoutTestResultsReader(tool, "/var/logs")
+        host = MockHost()
+        reader = LayoutTestResultsReader(host, "/mock-results", "/var/logs")
         unit_tests_results_path = '/mock-results/webkit_unit_tests_output.xml'
         no_failures_xml = """<?xml version="1.0" encoding="UTF-8"?>
 <testsuites tests="3" failures="0" disabled="0" errors="0" time="11.35" name="AllTests">
@@ -61,45 +62,59 @@
     <testcase name="CrashIfSettingUnsetRowIndex" status="run" time="0.123" classname="RenderTableCellDeathTest" />
   </testsuite>
 </testsuites>"""
-        tool.filesystem = MockFileSystem({unit_tests_results_path: no_failures_xml})
-        self.assertEquals(reader._create_unit_test_results(), [])
+        host.filesystem = MockFileSystem({unit_tests_results_path: no_failures_xml})
+        self.assertEqual(reader._create_unit_test_results(), [])
 
     def test_missing_unit_test_results_path(self):
-        tool = MockTool()
-        tool.port().unit_tests_results_path = lambda: None
-        reader = LayoutTestResultsReader(tool, "/var/logs")
+        host = MockHost()
+        reader = LayoutTestResultsReader(host, "/mock-results", "/var/logs")
         reader._create_layout_test_results = lambda: LayoutTestResults([])
+        reader._create_unit_test_results = lambda: None
         # layout_test_results shouldn't raise even if the unit tests xml file is missing.
-        self.assertNotEquals(reader.results(), None)
-        self.assertEquals(reader.results().failing_tests(), [])
+        self.assertIsNotNone(reader.results(), None)
+        self.assertEqual(reader.results().failing_tests(), [])
 
 
     def test_layout_test_results(self):
-        reader = LayoutTestResultsReader(MockTool(), "/var/logs")
+        reader = LayoutTestResultsReader(MockHost(), "/mock-results", "/var/logs")
         reader._read_file_contents = lambda path: None
-        self.assertEquals(reader.results(), None)
+        self.assertIsNone(reader.results())
         reader._read_file_contents = lambda path: ""
-        self.assertEquals(reader.results(), None)
+        self.assertIsNone(reader.results())
         reader._create_layout_test_results = lambda: LayoutTestResults([])
         results = reader.results()
-        self.assertNotEquals(results, None)
-        self.assertEquals(results.failure_limit_count(), 30)  # This value matches RunTests.NON_INTERACTIVE_FAILURE_LIMIT_COUNT
+        self.assertIsNotNone(results)
+        self.assertEqual(results.failure_limit_count(), 30)  # This value matches RunTests.NON_INTERACTIVE_FAILURE_LIMIT_COUNT
 
     def test_archive_last_layout_test_results(self):
-        tool = MockTool()
-        reader = LayoutTestResultsReader(tool, "/var/logs")
-        patch = tool.bugs.fetch_attachment(10001)
-        tool.filesystem = MockFileSystem()
-        # Should fail because the results_directory does not exist.
-        expected_stderr = "/mock-results does not exist, not archiving.\n"
-        archive = OutputCapture().assert_outputs(self, reader.archive, [patch], expected_stderr=expected_stderr)
-        self.assertEqual(archive, None)
-
+        host = MockHost()
         results_directory = "/mock-results"
-        # Sanity check what we assume our mock results directory is.
-        self.assertEqual(reader._results_directory(), results_directory)
-        tool.filesystem.maybe_make_directory(results_directory)
-        self.assertTrue(tool.filesystem.exists(results_directory))
+        reader = LayoutTestResultsReader(host, results_directory, "/var/logs")
+        patch = host.bugs.fetch_attachment(10001)
+        host.filesystem = MockFileSystem()
+        # Should fail because the results_directory does not exist.
+        expected_logs = "/mock-results does not exist, not archiving.\n"
+        archive = OutputCapture().assert_outputs(self, reader.archive, [patch], expected_logs=expected_logs)
+        self.assertIsNone(archive)
 
-        self.assertNotEqual(reader.archive(patch), None)
-        self.assertFalse(tool.filesystem.exists(results_directory))
+        host.filesystem.maybe_make_directory(results_directory)
+        self.assertTrue(host.filesystem.exists(results_directory))
+
+        self.assertIsNotNone(reader.archive(patch))
+        self.assertFalse(host.filesystem.exists(results_directory))
+
+    def test_archive_last_layout_test_results_with_relative_path(self):
+        host = MockHost()
+        results_directory = "/mock-checkout/layout-test-results"
+
+        host.filesystem.maybe_make_directory(results_directory)
+        host.filesystem.maybe_make_directory('/var/logs')
+        self.assertTrue(host.filesystem.exists(results_directory))
+
+        host.filesystem.chdir('/var')
+        reader = LayoutTestResultsReader(host, results_directory, 'logs')
+        patch = host.bugs.fetch_attachment(10001)
+        # Should fail because the results_directory does not exist.
+        self.assertIsNotNone(reader.archive(patch))
+        self.assertEqual(host.workspace.source_path, results_directory)
+        self.assertEqual(host.workspace.zip_path, '/var/logs/50000-layout-test-results.zip')
diff --git a/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py b/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py
index cde1c84..b01c6c7 100644
--- a/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py
+++ b/Tools/Scripts/webkitpy/tool/bot/patchanalysistask.py
@@ -192,7 +192,7 @@
             return True
 
         if self._test():
-            # Only report flaky tests if we were successful at parsing results.html and archiving results.
+            # Only report flaky tests if we were successful at parsing results.json and archiving results.
             if first_results and first_results_archive:
                 self._report_flaky_tests(first_results.failing_test_results(), first_results_archive)
             return True
diff --git a/Tools/Scripts/webkitpy/tool/bot/queueengine.py b/Tools/Scripts/webkitpy/tool/bot/queueengine.py
index 1d75359..90e553f 100644
--- a/Tools/Scripts/webkitpy/tool/bot/queueengine.py
+++ b/Tools/Scripts/webkitpy/tool/bot/queueengine.py
@@ -27,13 +27,16 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 import sys
 import traceback
 
 from datetime import datetime, timedelta
 
 from webkitpy.common.system.executive import ScriptError
-from webkitpy.common.system.deprecated_logging import log, OutputTee
+from webkitpy.common.system.outputtee import OutputTee
+
+_log = logging.getLogger(__name__)
 
 
 # FIXME: This will be caught by "except Exception:" blocks, we should consider
@@ -66,21 +69,20 @@
 
 
 class QueueEngine:
-    def __init__(self, name, delegate, wakeup_event):
+    def __init__(self, name, delegate, wakeup_event, seconds_to_sleep=120):
         self._name = name
         self._delegate = delegate
         self._wakeup_event = wakeup_event
         self._output_tee = OutputTee()
+        self._seconds_to_sleep = seconds_to_sleep
 
     log_date_format = "%Y-%m-%d %H:%M:%S"
-    sleep_duration_text = "2 mins"  # This could be generated from seconds_to_sleep
-    seconds_to_sleep = 120
     handled_error_code = 2
 
     # Child processes exit with a special code to the parent queue process can detect the error was handled.
     @classmethod
     def exit_after_handled_error(cls, error):
-        log(error)
+        _log.error(error)
         sys.exit(cls.handled_error_code)
 
     def run(self):
@@ -100,7 +102,7 @@
                 self._open_work_log(work_item)
                 try:
                     if not self._delegate.process_work_item(work_item):
-                        log("Unable to process work item.")
+                        _log.warning("Unable to process work item.")
                         continue
                 except ScriptError, e:
                     # Use a special exit code to indicate that the error was already
@@ -123,7 +125,7 @@
         return 0
 
     def _stopping(self, message):
-        log("\n%s" % message)
+        _log.info("\n%s" % message)
         self._delegate.stop_work_queue(message)
         # Be careful to shut down our OutputTee or the unit tests will be unhappy.
         self._ensure_work_log_closed()
@@ -150,10 +152,14 @@
         return datetime.now()
 
     def _sleep_message(self, message):
-        wake_time = self._now() + timedelta(seconds=self.seconds_to_sleep)
-        return "%s Sleeping until %s (%s)." % (message, wake_time.strftime(self.log_date_format), self.sleep_duration_text)
+        wake_time = self._now() + timedelta(seconds=self._seconds_to_sleep)
+        if self._seconds_to_sleep < 3 * 60:
+            sleep_duration_text = str(self._seconds_to_sleep) + ' seconds'
+        else:
+            sleep_duration_text = str(round(self._seconds_to_sleep / 60)) + ' minutes'
+        return "%s Sleeping until %s (%s)." % (message, wake_time.strftime(self.log_date_format), sleep_duration_text)
 
     def _sleep(self, message):
-        log(self._sleep_message(message))
-        self._wakeup_event.wait(self.seconds_to_sleep)
+        _log.info(self._sleep_message(message))
+        self._wakeup_event.wait(self._seconds_to_sleep)
         self._wakeup_event.clear()
diff --git a/Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py b/Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py
index f959ee1..de9fa23 100644
--- a/Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py
@@ -31,7 +31,7 @@
 import shutil
 import tempfile
 import threading
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -83,12 +83,12 @@
 
     def process_work_item(self, work_item):
         self.record("process_work_item")
-        self._test.assertEquals(work_item, "work_item")
+        self._test.assertEqual(work_item, "work_item")
         return True
 
     def handle_unexpected_error(self, work_item, message):
         self.record("handle_unexpected_error")
-        self._test.assertEquals(work_item, "work_item")
+        self._test.assertEqual(work_item, "work_item")
 
     def stop_work_queue(self, message):
         self.record("stop_work_queue")
@@ -120,8 +120,8 @@
     def test_trivial(self):
         delegate = LoggingDelegate(self)
         self._run_engine(delegate)
-        self.assertEquals(delegate.stop_message, "Delegate terminated queue.")
-        self.assertEquals(delegate._callbacks, LoggingDelegate.expected_callbacks)
+        self.assertEqual(delegate.stop_message, "Delegate terminated queue.")
+        self.assertEqual(delegate._callbacks, LoggingDelegate.expected_callbacks)
         self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "queue_log_path")))
         self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "work_log_path", "work_item.log")))
 
@@ -133,20 +133,20 @@
         # The unexpected error should be handled right after process_work_item starts
         # but before any other callback.  Otherwise callbacks should be normal.
         expected_callbacks.insert(work_item_index + 1, 'handle_unexpected_error')
-        self.assertEquals(delegate._callbacks, expected_callbacks)
+        self.assertEqual(delegate._callbacks, expected_callbacks)
 
     def test_handled_error(self):
         delegate = RaisingDelegate(self, ScriptError(exit_code=QueueEngine.handled_error_code))
         self._run_engine(delegate)
-        self.assertEquals(delegate._callbacks, LoggingDelegate.expected_callbacks)
+        self.assertEqual(delegate._callbacks, LoggingDelegate.expected_callbacks)
 
     def _run_engine(self, delegate, engine=None, termination_message=None):
         if not engine:
             engine = QueueEngine("test-queue", delegate, threading.Event())
         if not termination_message:
             termination_message = "Delegate terminated queue."
-        expected_stderr = "\n%s\n" % termination_message
-        OutputCapture().assert_outputs(self, engine.run, expected_stderr=expected_stderr)
+        expected_logs = "\n%s\n" % termination_message
+        OutputCapture().assert_outputs(self, engine.run, expected_logs=expected_logs)
 
     def _test_terminating_queue(self, exception, termination_message):
         work_item_index = LoggingDelegate.expected_callbacks.index('process_work_item')
@@ -158,8 +158,8 @@
         delegate = RaisingDelegate(self, exception)
         self._run_engine(delegate, termination_message=termination_message)
 
-        self.assertEquals(delegate._callbacks, expected_callbacks)
-        self.assertEquals(delegate.stop_message, termination_message)
+        self.assertEqual(delegate._callbacks, expected_callbacks)
+        self.assertEqual(delegate.stop_message, termination_message)
 
     def test_terminating_error(self):
         self._test_terminating_queue(KeyboardInterrupt(), "User terminated queue.")
@@ -168,12 +168,12 @@
     def test_now(self):
         """Make sure there are no typos in the QueueEngine.now() method."""
         engine = QueueEngine("test", None, None)
-        self.assertTrue(isinstance(engine._now(), datetime.datetime))
+        self.assertIsInstance(engine._now(), datetime.datetime)
 
     def test_sleep_message(self):
         engine = QueueEngine("test", None, None)
         engine._now = lambda: datetime.datetime(2010, 1, 1)
-        expected_sleep_message = "MESSAGE Sleeping until 2010-01-01 00:02:00 (2 mins)."
+        expected_sleep_message = "MESSAGE Sleeping until 2010-01-01 00:02:00 (120 seconds)."
         self.assertEqual(engine._sleep_message("MESSAGE"), expected_sleep_message)
 
     def setUp(self):
@@ -181,7 +181,3 @@
 
     def tearDown(self):
         shutil.rmtree(self.temp_dir)
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/tool/bot/sheriff.py b/Tools/Scripts/webkitpy/tool/bot/sheriff.py
index a8c928c..38e4bf2 100644
--- a/Tools/Scripts/webkitpy/tool/bot/sheriff.py
+++ b/Tools/Scripts/webkitpy/tool/bot/sheriff.py
@@ -27,7 +27,6 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 from webkitpy.common.config import urls
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.tool.grammar import join_with_separators
 
@@ -89,7 +88,7 @@
         ])
         return urls.parse_bug_id(output)
 
-    def post_chromium_deps_roll(self, revision, revision_name):
+    def post_chromium_deps_roll(self, revision, revision_name, changelog_message):
         args = [
             "post-chromium-deps-roll",
             "--force-clean",
@@ -97,7 +96,7 @@
             "--parent-command=sheriff-bot",
         ]
         # revision can be None, but revision_name is always something meaningful.
-        args += [revision, revision_name]
+        args += [revision, revision_name, changelog_message]
         output = self._sheriffbot.run_webkit_patch(args)
         return urls.parse_bug_id(output)
 
diff --git a/Tools/Scripts/webkitpy/tool/bot/sheriff_unittest.py b/Tools/Scripts/webkitpy/tool/bot/sheriff_unittest.py
index 3ff5082..cf989c9 100644
--- a/Tools/Scripts/webkitpy/tool/bot/sheriff_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/bot/sheriff_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.buildbot import Builder
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -65,7 +65,7 @@
             sheriff.post_blame_comment_on_bug(commit_info, builders, ["mock-test-1"])
             sheriff.post_blame_comment_on_bug(commit_info, builders, ["mock-test-1", "mock-test-2"])
 
-        expected_stderr = u"""MOCK bug comment: bug_id=1234, cc=['watcher@example.com']
+        expected_logs = u"""MOCK bug comment: bug_id=1234, cc=['watcher@example.com']
 --- Begin comment ---
 http://trac.webkit.org/changeset/4321 might have broken Foo and Bar
 --- End comment ---
@@ -86,4 +86,4 @@
 --- End comment ---
 
 """
-        OutputCapture().assert_outputs(self, run, expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, run, expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/commands/__init__.py b/Tools/Scripts/webkitpy/tool/commands/__init__.py
index 4e8eb62..f4af47e 100644
--- a/Tools/Scripts/webkitpy/tool/commands/__init__.py
+++ b/Tools/Scripts/webkitpy/tool/commands/__init__.py
@@ -8,9 +8,9 @@
 from webkitpy.tool.commands.chromechannels import ChromeChannels
 from webkitpy.tool.commands.download import *
 from webkitpy.tool.commands.earlywarningsystem import *
-from webkitpy.tool.commands.expectations import OptimizeExpectations
 from webkitpy.tool.commands.findusers import FindUsers
 from webkitpy.tool.commands.gardenomatic import GardenOMatic
+from webkitpy.tool.commands.newcommitbot import NewCommitBot
 from webkitpy.tool.commands.openbugs import OpenBugs
 from webkitpy.tool.commands.perfalizer import Perfalizer
 from webkitpy.tool.commands.prettydiff import PrettyDiff
diff --git a/Tools/Scripts/webkitpy/tool/commands/abstractlocalservercommand.py b/Tools/Scripts/webkitpy/tool/commands/abstractlocalservercommand.py
index 6c54da2..0056684 100644
--- a/Tools/Scripts/webkitpy/tool/commands/abstractlocalservercommand.py
+++ b/Tools/Scripts/webkitpy/tool/commands/abstractlocalservercommand.py
@@ -53,5 +53,5 @@
             # FIXME: This seems racy.
             threading.Timer(0.1, lambda: self._tool.user.open_url(server_url)).start()
 
-        httpd = self.server(httpd_port=options.httpd_port, config=config)
+        httpd = self.server(httpd_port=options.httpd_port, config=config)  # pylint: disable=E1102
         httpd.serve_forever()
diff --git a/Tools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py b/Tools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py
index 5eaf249..0593f2c 100644
--- a/Tools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py
+++ b/Tools/Scripts/webkitpy/tool/commands/abstractsequencedcommand.py
@@ -26,11 +26,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.common.system.executive import ScriptError
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.tool.commands.stepsequence import StepSequence
 from webkitpy.tool.multicommandtool import AbstractDeclarativeCommand
 
+_log = logging.getLogger(__name__)
+
 
 class AbstractSequencedCommand(AbstractDeclarativeCommand):
     steps = None
@@ -45,7 +48,7 @@
         try:
             state = self._prepare_state(options, args, tool)
         except ScriptError, e:
-            log(e.message_with_output())
+            _log.error(e.message_with_output())
             self._exit(e.exit_code or 2)
 
         self._sequence.run_and_handle_errors(tool, options, state)
diff --git a/Tools/Scripts/webkitpy/tool/commands/applywatchlistlocal_unittest.py b/Tools/Scripts/webkitpy/tool/commands/applywatchlistlocal_unittest.py
index 91818d1..e88a86f 100644
--- a/Tools/Scripts/webkitpy/tool/commands/applywatchlistlocal_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/applywatchlistlocal_unittest.py
@@ -33,18 +33,23 @@
 
 class ApplyWatchListLocalTest(CommandsTest):
     def test_args_parsing(self):
-        expected_stderr = 'MockWatchList: determine_cc_and_messages\n'
-        self.assert_execute_outputs(ApplyWatchListLocal(), [''], expected_stderr=expected_stderr)
+        expected_logs = """MockWatchList: determine_cc_and_messages
+No bug was updated because no id was given.
+Result of watchlist: cc "abarth@webkit.org, eric@webkit.org, levin@chromium.org" messages "Message1.
+
+Message2."
+"""
+        self.assert_execute_outputs(ApplyWatchListLocal(), [''], expected_logs=expected_logs)
 
     def test_args_parsing_with_bug(self):
-        expected_stderr = """MockWatchList: determine_cc_and_messages
+        expected_logs = """MockWatchList: determine_cc_and_messages
 MOCK bug comment: bug_id=50002, cc=set(['eric@webkit.org', 'levin@chromium.org', 'abarth@webkit.org'])
 --- Begin comment ---
 Message1.
 
 Message2.
 --- End comment ---\n\n"""
-        self.assert_execute_outputs(ApplyWatchListLocal(), ['50002'], expected_stderr=expected_stderr)
+        self.assert_execute_outputs(ApplyWatchListLocal(), ['50002'], expected_logs=expected_logs)
 
     def test_args_parsing_with_two_bugs(self):
         self._assertRaisesRegexp(Exception, 'Too many arguments given: 1234 5678', self.assert_execute_outputs, ApplyWatchListLocal(), ['1234', '5678'])
diff --git a/Tools/Scripts/webkitpy/tool/commands/commandtest.py b/Tools/Scripts/webkitpy/tool/commands/commandtest.py
index eea0a61..655c33f 100644
--- a/Tools/Scripts/webkitpy/tool/commands/commandtest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/commandtest.py
@@ -32,7 +32,7 @@
 
 
 class CommandsTest(TestCase):
-    def assert_execute_outputs(self, command, args=[], expected_stdout="", expected_stderr="", expected_exception=None, options=MockOptions(), tool=MockTool()):
+    def assert_execute_outputs(self, command, args=[], expected_stdout="", expected_stderr="", expected_exception=None, expected_logs=None, options=MockOptions(), tool=MockTool()):
         options.blocks = None
         options.cc = 'MOCK cc'
         options.component = 'MOCK component'
@@ -42,7 +42,8 @@
         options.obsolete_patches = True
         options.open_bug = True
         options.port = 'MOCK port'
+        options.update_changelogs = False
         options.quiet = True
         options.reviewer = 'MOCK reviewer'
         command.bind_to_tool(tool)
-        OutputCapture().assert_outputs(self, command.execute, [options, args, tool], expected_stdout=expected_stdout, expected_stderr=expected_stderr, expected_exception=expected_exception)
+        OutputCapture().assert_outputs(self, command.execute, [options, args, tool], expected_stdout=expected_stdout, expected_stderr=expected_stderr, expected_exception=expected_exception, expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/commands/download.py b/Tools/Scripts/webkitpy/tool/commands/download.py
index 1f73d18..395c913 100644
--- a/Tools/Scripts/webkitpy/tool/commands/download.py
+++ b/Tools/Scripts/webkitpy/tool/commands/download.py
@@ -4,7 +4,7 @@
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -14,7 +14,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -27,6 +27,8 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool import steps
 
 from webkitpy.common.checkout.changelog import ChangeLog
@@ -37,14 +39,15 @@
 from webkitpy.tool.comments import bug_comment_from_commit_text
 from webkitpy.tool.grammar import pluralize
 from webkitpy.tool.multicommandtool import AbstractDeclarativeCommand
-from webkitpy.common.system.deprecated_logging import error, log
+
+_log = logging.getLogger(__name__)
 
 
 class Clean(AbstractSequencedCommand):
     name = "clean"
     help_text = "Clean the working copy"
     steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
     ]
 
     def _prepare_state(self, options, args, tool):
@@ -55,7 +58,7 @@
     name = "update"
     help_text = "Update working copy (used internally)"
     steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
     ]
 
@@ -64,7 +67,7 @@
     name = "build"
     help_text = "Update working copy and build"
     steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.Build,
     ]
@@ -77,7 +80,7 @@
     name = "build-and-test"
     help_text = "Update working copy, build, and run the tests"
     steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.Build,
         steps.RunTests,
@@ -146,8 +149,10 @@
     # Subclasses must implement the methods below.  We don't declare them here
     # because we want to be able to implement them with mix-ins.
     #
+    # pylint: disable=E1101
     # def _fetch_list_of_patches_to_process(self, options, args, tool):
     # def _prepare_to_process(self, options, args, tool):
+    # def _process_patch(self, options, args, tool):
 
     @staticmethod
     def _collect_patches_by_bug(patches):
@@ -162,7 +167,7 @@
 
         # It's nice to print out total statistics.
         bugs_to_patches = self._collect_patches_by_bug(patches)
-        log("Processing %s from %s." % (pluralize("patch", len(patches)), pluralize("bug", len(bugs_to_patches))))
+        _log.info("Processing %s from %s." % (pluralize("patch", len(patches)), pluralize("bug", len(bugs_to_patches))))
 
         for patch in patches:
             self._process_patch(patch, options, args, tool)
@@ -197,13 +202,13 @@
         all_patches = []
         for bug_id in args:
             patches = tool.bugs.fetch_bug(bug_id).reviewed_patches()
-            log("%s found on bug %s." % (pluralize("reviewed patch", len(patches)), bug_id))
+            _log.info("%s found on bug %s." % (pluralize("reviewed patch", len(patches)), bug_id))
             all_patches += patches
         if not all_patches:
-            log("No reviewed patches found, looking for unreviewed patches.")
+            _log.info("No reviewed patches found, looking for unreviewed patches.")
             for bug_id in args:
                 patches = tool.bugs.fetch_bug(bug_id).patches()
-                log("%s found on bug %s." % (pluralize("patch", len(patches)), bug_id))
+                _log.info("%s found on bug %s." % (pluralize("patch", len(patches)), bug_id))
                 all_patches += patches
         return all_patches
 
@@ -215,7 +220,7 @@
             bug_id = urls.parse_bug_id(url)
             if bug_id:
                 patches = tool.bugs.fetch_bug(bug_id).patches()
-                log("%s found on bug %s." % (pluralize("patch", len(patches)), bug_id))
+                _log.info("%s found on bug %s." % (pluralize("patch", len(patches)), bug_id))
                 all_patches += patches
 
             attachment_id = urls.parse_attachment_id(url)
@@ -230,7 +235,7 @@
     help_text = "Run check-webkit-style on the specified attachments"
     argument_names = "ATTACHMENT_ID [ATTACHMENT_IDS]"
     main_steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.ApplyPatch,
         steps.CheckStyle,
@@ -242,7 +247,7 @@
     help_text = "Apply and build patches from bugzilla"
     argument_names = "ATTACHMENT_ID [ATTACHMENT_IDS]"
     main_steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.ApplyPatch,
         steps.Build,
@@ -254,7 +259,7 @@
     help_text = "Apply, build, and test patches from bugzilla"
     argument_names = "ATTACHMENT_ID [ATTACHMENT_IDS]"
     main_steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.ApplyPatch,
         steps.Build,
@@ -265,7 +270,7 @@
 class AbstractPatchApplyingCommand(AbstractPatchSequencingCommand):
     prepare_steps = [
         steps.EnsureLocalCommitIfNeeded,
-        steps.CleanWorkingDirectoryWithLocalCommits,
+        steps.CleanWorkingDirectory,
         steps.Update,
     ]
     main_steps = [
@@ -294,7 +299,7 @@
     help_text = "Applies the watchlist to the specified attachments"
     argument_names = "ATTACHMENT_ID [ATTACHMENT_IDS]"
     main_steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.ApplyPatch,
         steps.ApplyWatchList,
@@ -305,7 +310,7 @@
 
 class AbstractPatchLandingCommand(AbstractPatchSequencingCommand):
     main_steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.ApplyPatch,
         steps.ValidateChangeLogs,
@@ -368,9 +373,9 @@
             #       SheriffBot because the SheriffBot just greps the output
             #       of create-rollout for bug URLs.  It should do better
             #       parsing instead.
-            log("Preparing rollout for bug %s." % commit_info.bug_id())
+            _log.info("Preparing rollout for bug %s." % commit_info.bug_id())
         else:
-            log("Unable to parse bug number from diff.")
+            _log.info("Unable to parse bug number from diff.")
         return commit_info
 
     def _prepare_state(self, options, args, tool):
@@ -408,7 +413,7 @@
 Creates an appropriate rollout ChangeLog, including a trac link and bug link.
 """
     steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.RevertRevision,
         steps.PrepareChangeLogForRevert,
@@ -419,7 +424,7 @@
     name = "create-rollout"
     help_text = "Creates a bug to track the broken SVN revision(s) and uploads a rollout patch."
     steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.RevertRevision,
         steps.CreateBug,
@@ -465,7 +470,7 @@
 Shows the prepared diff for confirmation.
 Commits the revert and updates the bug (including re-opening the bug if necessary)."""
     steps = [
-        steps.CleanWorkingDirectory,
+        steps.DiscardLocalChanges,
         steps.Update,
         steps.RevertRevision,
         steps.PrepareChangeLogForRevert,
diff --git a/Tools/Scripts/webkitpy/tool/commands/download_unittest.py b/Tools/Scripts/webkitpy/tool/commands/download_unittest.py
index b71f3da..bc7fc4f 100644
--- a/Tools/Scripts/webkitpy/tool/commands/download_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/download_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.thirdparty.mock import Mock
@@ -43,15 +43,15 @@
         command.bind_to_tool(tool)
         output = OutputCapture()
 
-        expected_stderr = "Preparing rollout for bug 50000.\n"
-        commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_stderr=expected_stderr)
+        expected_logs = "Preparing rollout for bug 50000.\n"
+        commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_logs=expected_logs)
         self.assertTrue(commit_info)
 
         mock_commit_info = Mock()
         mock_commit_info.bug_id = lambda: None
         tool._checkout.commit_info_for_revision = lambda revision: mock_commit_info
-        expected_stderr = "Unable to parse bug number from diff.\n"
-        commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_stderr=expected_stderr)
+        expected_logs = "Unable to parse bug number from diff.\n"
+        commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_logs=expected_logs)
         self.assertEqual(commit_info, mock_commit_info)
 
     def test_prepare_state(self):
@@ -90,51 +90,73 @@
         return options
 
     def test_build(self):
-        expected_stderr = "Updating working directory\nBuilding WebKit\n"
-        self.assert_execute_outputs(Build(), [], options=self._default_options(), expected_stderr=expected_stderr)
+        expected_logs = "Updating working directory\nBuilding WebKit\n"
+        self.assert_execute_outputs(Build(), [], options=self._default_options(), expected_logs=expected_logs)
 
     def test_build_and_test(self):
-        expected_stderr = "Updating working directory\nBuilding WebKit\nRunning Python unit tests\nRunning Perl unit tests\nRunning JavaScriptCore tests\nRunning WebKit unit tests\nRunning run-webkit-tests\n"
-        self.assert_execute_outputs(BuildAndTest(), [], options=self._default_options(), expected_stderr=expected_stderr)
+        expected_logs = """Updating working directory
+Building WebKit
+Running Python unit tests
+Running Perl unit tests
+Running JavaScriptCore tests
+Running bindings generation tests
+Running WebKit unit tests
+Running run-webkit-tests
+"""
+        self.assert_execute_outputs(BuildAndTest(), [], options=self._default_options(), expected_logs=expected_logs)
 
     def test_apply_attachment(self):
         options = self._default_options()
         options.update = True
         options.local_commit = True
-        expected_stderr = "Updating working directory\nProcessing 1 patch from 1 bug.\nProcessing patch 10000 from bug 50000.\n"
-        self.assert_execute_outputs(ApplyAttachment(), [10000], options=options, expected_stderr=expected_stderr)
+        expected_logs = "Updating working directory\nProcessing 1 patch from 1 bug.\nProcessing patch 10000 from bug 50000.\n"
+        self.assert_execute_outputs(ApplyAttachment(), [10000], options=options, expected_logs=expected_logs)
 
     def test_apply_from_bug(self):
         options = self._default_options()
         options.update = True
         options.local_commit = True
 
-        expected_stderr = "Updating working directory\n0 reviewed patches found on bug 50001.\nNo reviewed patches found, looking for unreviewed patches.\n1 patch found on bug 50001.\nProcessing 1 patch from 1 bug.\nProcessing patch 10002 from bug 50001.\n"
-        self.assert_execute_outputs(ApplyFromBug(), [50001], options=options, expected_stderr=expected_stderr)
+        expected_logs = "Updating working directory\n0 reviewed patches found on bug 50001.\nNo reviewed patches found, looking for unreviewed patches.\n1 patch found on bug 50001.\nProcessing 1 patch from 1 bug.\nProcessing patch 10002 from bug 50001.\n"
+        self.assert_execute_outputs(ApplyFromBug(), [50001], options=options, expected_logs=expected_logs)
 
-        expected_stderr = "Updating working directory\n2 reviewed patches found on bug 50000.\nProcessing 2 patches from 1 bug.\nProcessing patch 10000 from bug 50000.\nProcessing patch 10001 from bug 50000.\n"
-        self.assert_execute_outputs(ApplyFromBug(), [50000], options=options, expected_stderr=expected_stderr)
+        expected_logs = "Updating working directory\n2 reviewed patches found on bug 50000.\nProcessing 2 patches from 1 bug.\nProcessing patch 10000 from bug 50000.\nProcessing patch 10001 from bug 50000.\n"
+        self.assert_execute_outputs(ApplyFromBug(), [50000], options=options, expected_logs=expected_logs)
 
     def test_apply_watch_list(self):
-        expected_stderr = """Processing 1 patch from 1 bug.
+        expected_logs = """Processing 1 patch from 1 bug.
 Updating working directory
-MOCK run_and_throw_if_fail: ['mock-update-webkit'], cwd=/mock-checkout\nProcessing patch 10000 from bug 50000.
+MOCK run_and_throw_if_fail: ['mock-update-webkit'], cwd=/mock-checkout
+Processing patch 10000 from bug 50000.
 MockWatchList: determine_cc_and_messages
+No bug was updated because no id was given.
+Result of watchlist: cc "abarth@webkit.org, eric@webkit.org, levin@chromium.org" messages "Message1.
+
+Message2."
 """
-        self.assert_execute_outputs(ApplyWatchList(), [10000], options=self._default_options(), expected_stderr=expected_stderr, tool=MockTool(log_executive=True))
+        self.assert_execute_outputs(ApplyWatchList(), [10000], options=self._default_options(), expected_logs=expected_logs, tool=MockTool(log_executive=True))
 
     def test_land(self):
-        expected_stderr = "Building WebKit\nRunning Python unit tests\nRunning Perl unit tests\nRunning JavaScriptCore tests\nRunning WebKit unit tests\nRunning run-webkit-tests\nCommitted r49824: <http://trac.webkit.org/changeset/49824>\nUpdating bug 50000\n"
+        expected_logs = """Building WebKit
+Running Python unit tests
+Running Perl unit tests
+Running JavaScriptCore tests
+Running bindings generation tests
+Running WebKit unit tests
+Running run-webkit-tests
+Committed r49824: <http://trac.webkit.org/changeset/49824>
+Updating bug 50000
+"""
         mock_tool = MockTool()
         mock_tool.scm().create_patch = Mock(return_value="Patch1\nMockPatch\n")
         mock_tool.checkout().modified_changelogs = Mock(return_value=[])
-        self.assert_execute_outputs(Land(), [50000], options=self._default_options(), expected_stderr=expected_stderr, tool=mock_tool)
+        self.assert_execute_outputs(Land(), [50000], options=self._default_options(), expected_logs=expected_logs, tool=mock_tool)
         # Make sure we're not calling expensive calls too often.
         self.assertEqual(mock_tool.scm().create_patch.call_count, 0)
         self.assertEqual(mock_tool.checkout().modified_changelogs.call_count, 1)
 
     def test_land_cowboy(self):
-        expected_stderr = """MOCK run_and_throw_if_fail: ['mock-prepare-ChangeLog', '--email=MOCK email', '--merge-base=None', 'MockFile1'], cwd=/mock-checkout
+        expected_logs = """MOCK run_and_throw_if_fail: ['mock-prepare-ChangeLog', '--email=MOCK email', '--merge-base=None', 'MockFile1'], cwd=/mock-checkout
 MOCK run_and_throw_if_fail: ['mock-check-webkit-style', '--git-commit', 'MOCK git commit', '--diff-files', 'MockFile1', '--filter', '-changelog'], cwd=/mock-checkout
 MOCK run_command: ['ruby', '-I', '/mock-checkout/Websites/bugs.webkit.org/PrettyPatch', '/mock-checkout/Websites/bugs.webkit.org/PrettyPatch/prettify.rb'], cwd=None, input=Patch1
 MOCK: user.open_url: file://...
@@ -147,6 +169,8 @@
 MOCK run_and_throw_if_fail: ['mock-test-webkitperl'], cwd=/mock-checkout
 Running JavaScriptCore tests
 MOCK run_and_throw_if_fail: ['mock-run-javacriptcore-tests'], cwd=/mock-checkout
+Running bindings generation tests
+MOCK run_and_throw_if_fail: ['mock-run-bindings-tests'], cwd=/mock-checkout
 Running WebKit unit tests
 MOCK run_and_throw_if_fail: ['mock-run-webkit-unit-tests'], cwd=/mock-checkout
 Running run-webkit-tests
@@ -156,46 +180,56 @@
 No bug id provided.
 """
         mock_tool = MockTool(log_executive=True)
-        self.assert_execute_outputs(LandCowboy(), [50000], options=self._default_options(), expected_stderr=expected_stderr, tool=mock_tool)
+        self.assert_execute_outputs(LandCowboy(), [50000], options=self._default_options(), expected_logs=expected_logs, tool=mock_tool)
 
     def test_land_red_builders(self):
-        expected_stderr = 'Building WebKit\nRunning Python unit tests\nRunning Perl unit tests\nRunning JavaScriptCore tests\nRunning WebKit unit tests\nRunning run-webkit-tests\nCommitted r49824: <http://trac.webkit.org/changeset/49824>\nUpdating bug 50000\n'
+        expected_logs = """Building WebKit
+Running Python unit tests
+Running Perl unit tests
+Running JavaScriptCore tests
+Running bindings generation tests
+Running WebKit unit tests
+Running run-webkit-tests
+Committed r49824: <http://trac.webkit.org/changeset/49824>
+Updating bug 50000
+"""
         mock_tool = MockTool()
         mock_tool.buildbot.light_tree_on_fire()
-        self.assert_execute_outputs(Land(), [50000], options=self._default_options(), expected_stderr=expected_stderr, tool=mock_tool)
+        self.assert_execute_outputs(Land(), [50000], options=self._default_options(), expected_logs=expected_logs, tool=mock_tool)
 
     def test_check_style(self):
-        expected_stderr = """Processing 1 patch from 1 bug.
+        expected_logs = """Processing 1 patch from 1 bug.
 Updating working directory
 MOCK run_and_throw_if_fail: ['mock-update-webkit'], cwd=/mock-checkout
 Processing patch 10000 from bug 50000.
 MOCK run_and_throw_if_fail: ['mock-check-webkit-style', '--git-commit', 'MOCK git commit', '--diff-files', 'MockFile1'], cwd=/mock-checkout
 """
-        self.assert_execute_outputs(CheckStyle(), [10000], options=self._default_options(), expected_stderr=expected_stderr, tool=MockTool(log_executive=True))
+        self.assert_execute_outputs(CheckStyle(), [10000], options=self._default_options(), expected_logs=expected_logs, tool=MockTool(log_executive=True))
 
     def test_build_attachment(self):
-        expected_stderr = "Processing 1 patch from 1 bug.\nUpdating working directory\nProcessing patch 10000 from bug 50000.\nBuilding WebKit\n"
-        self.assert_execute_outputs(BuildAttachment(), [10000], options=self._default_options(), expected_stderr=expected_stderr)
+        expected_logs = "Processing 1 patch from 1 bug.\nUpdating working directory\nProcessing patch 10000 from bug 50000.\nBuilding WebKit\n"
+        self.assert_execute_outputs(BuildAttachment(), [10000], options=self._default_options(), expected_logs=expected_logs)
 
     def test_land_attachment(self):
         # FIXME: This expected result is imperfect, notice how it's seeing the same patch as still there after it thought it would have cleared the flags.
-        expected_stderr = """Processing 1 patch from 1 bug.
+        expected_logs = """Processing 1 patch from 1 bug.
 Updating working directory
 Processing patch 10000 from bug 50000.
 Building WebKit
 Running Python unit tests
 Running Perl unit tests
 Running JavaScriptCore tests
+Running bindings generation tests
 Running WebKit unit tests
 Running run-webkit-tests
 Committed r49824: <http://trac.webkit.org/changeset/49824>
 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
 """
-        self.assert_execute_outputs(LandAttachment(), [10000], options=self._default_options(), expected_stderr=expected_stderr)
+        self.assert_execute_outputs(LandAttachment(), [10000], options=self._default_options(), expected_logs=expected_logs)
 
     def test_land_from_bug(self):
         # FIXME: This expected result is imperfect, notice how it's seeing the same patch as still there after it thought it would have cleared the flags.
-        expected_stderr = """2 reviewed patches found on bug 50000.
+        expected_logs = """2 reviewed patches found on bug 50000.
 Processing 2 patches from 1 bug.
 Updating working directory
 Processing patch 10000 from bug 50000.
@@ -203,6 +237,7 @@
 Running Python unit tests
 Running Perl unit tests
 Running JavaScriptCore tests
+Running bindings generation tests
 Running WebKit unit tests
 Running run-webkit-tests
 Committed r49824: <http://trac.webkit.org/changeset/49824>
@@ -213,16 +248,17 @@
 Running Python unit tests
 Running Perl unit tests
 Running JavaScriptCore tests
+Running bindings generation tests
 Running WebKit unit tests
 Running run-webkit-tests
 Committed r49824: <http://trac.webkit.org/changeset/49824>
 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
 """
-        self.assert_execute_outputs(LandFromBug(), [50000], options=self._default_options(), expected_stderr=expected_stderr)
+        self.assert_execute_outputs(LandFromBug(), [50000], options=self._default_options(), expected_logs=expected_logs)
 
     def test_land_from_url(self):
         # FIXME: This expected result is imperfect, notice how it's seeing the same patch as still there after it thought it would have cleared the flags.
-        expected_stderr = """2 patches found on bug 50000.
+        expected_logs = """2 patches found on bug 50000.
 Processing 2 patches from 1 bug.
 Updating working directory
 Processing patch 10000 from bug 50000.
@@ -230,6 +266,7 @@
 Running Python unit tests
 Running Perl unit tests
 Running JavaScriptCore tests
+Running bindings generation tests
 Running WebKit unit tests
 Running run-webkit-tests
 Committed r49824: <http://trac.webkit.org/changeset/49824>
@@ -240,19 +277,20 @@
 Running Python unit tests
 Running Perl unit tests
 Running JavaScriptCore tests
+Running bindings generation tests
 Running WebKit unit tests
 Running run-webkit-tests
 Committed r49824: <http://trac.webkit.org/changeset/49824>
 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
 """
-        self.assert_execute_outputs(LandFromURL(), ["https://bugs.webkit.org/show_bug.cgi?id=50000"], options=self._default_options(), expected_stderr=expected_stderr)
+        self.assert_execute_outputs(LandFromURL(), ["https://bugs.webkit.org/show_bug.cgi?id=50000"], options=self._default_options(), expected_logs=expected_logs)
 
     def test_prepare_rollout(self):
-        expected_stderr = "Preparing rollout for bug 50000.\nUpdating working directory\n"
-        self.assert_execute_outputs(PrepareRollout(), [852, "Reason"], options=self._default_options(), expected_stderr=expected_stderr)
+        expected_logs = "Preparing rollout for bug 50000.\nUpdating working directory\n"
+        self.assert_execute_outputs(PrepareRollout(), [852, "Reason"], options=self._default_options(), expected_logs=expected_logs)
 
     def test_create_rollout(self):
-        expected_stderr = """Preparing rollout for bug 50000.
+        expected_logs = """Preparing rollout for bug 50000.
 Updating working directory
 MOCK create_bug
 bug_title: REGRESSION(r852): Reason
@@ -272,11 +310,11 @@
 where ATTACHMENT_ID is the ID of this attachment.
 -- End comment --
 """
-        self.assert_execute_outputs(CreateRollout(), [852, "Reason"], options=self._default_options(), expected_stderr=expected_stderr)
-        self.assert_execute_outputs(CreateRollout(), ["855 852 854", "Reason"], options=self._default_options(), expected_stderr=expected_stderr)
+        self.assert_execute_outputs(CreateRollout(), [852, "Reason"], options=self._default_options(), expected_logs=expected_logs)
+        self.assert_execute_outputs(CreateRollout(), ["855 852 854", "Reason"], options=self._default_options(), expected_logs=expected_logs)
 
     def test_create_rollout_resolved(self):
-        expected_stderr = """Preparing rollout for bug 50004.
+        expected_logs = """Preparing rollout for bug 50004.
 Updating working directory
 MOCK create_bug
 bug_title: REGRESSION(r3001): Reason
@@ -297,10 +335,10 @@
 where ATTACHMENT_ID is the ID of this attachment.
 -- End comment --
 """
-        self.assert_execute_outputs(CreateRollout(), [3001, "Reason"], options=self._default_options(), expected_stderr=expected_stderr)
+        self.assert_execute_outputs(CreateRollout(), [3001, "Reason"], options=self._default_options(), expected_logs=expected_logs)
 
     def test_rollout(self):
-        expected_stderr = """Preparing rollout for bug 50000.
+        expected_logs = """Preparing rollout for bug 50000.
 Updating working directory
 MOCK: user.open_url: file://...
 Was that diff correct?
@@ -312,5 +350,5 @@
 
 Committed r49824: <http://trac.webkit.org/changeset/49824>'
 """
-        self.assert_execute_outputs(Rollout(), [852, "Reason"], options=self._default_options(), expected_stderr=expected_stderr)
+        self.assert_execute_outputs(Rollout(), [852, "Reason"], options=self._default_options(), expected_logs=expected_logs)
 
diff --git a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py
index b7d5df3..bd24274 100644
--- a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py
+++ b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem.py
@@ -26,11 +26,11 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 from optparse import make_option
 
 from webkitpy.common.config.committers import CommitterList
 from webkitpy.common.config.ports import DeprecatedPort
-from webkitpy.common.system.deprecated_logging import error, log
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.tool.bot.earlywarningsystemtask import EarlyWarningSystemTask, EarlyWarningSystemTaskDelegate
 from webkitpy.tool.bot.expectedfailures import ExpectedFailures
@@ -39,6 +39,8 @@
 from webkitpy.tool.bot.queueengine import QueueEngine
 from webkitpy.tool.commands.queues import AbstractReviewQueue
 
+_log = logging.getLogger(__name__)
+
 
 class AbstractEarlyWarningSystem(AbstractReviewQueue, EarlyWarningSystemTaskDelegate):
     _build_style = "release"
@@ -48,14 +50,11 @@
     def __init__(self):
         options = [make_option("--run-tests", action="store_true", dest="run_tests", default=self._default_run_tests, help="Run the Layout tests for each patch")]
         AbstractReviewQueue.__init__(self, options=options)
-        self.port = DeprecatedPort.port(self.port_name)
 
     def begin_work_queue(self):
-        # FIXME: This violates abstraction
-        self._tool._deprecated_port = self.port
         AbstractReviewQueue.begin_work_queue(self)
         self._expected_failures = ExpectedFailures()
-        self._layout_test_results_reader = LayoutTestResultsReader(self._tool, self._log_directory())
+        self._layout_test_results_reader = LayoutTestResultsReader(self._tool, self._port.results_directory(), self._log_directory())
 
     def _failing_tests_message(self, task, patch):
         results = task.results_from_patch_test_run(patch)
@@ -67,11 +66,13 @@
     def _post_reject_message_on_bug(self, tool, patch, status_id, extra_message_text=None):
         results_link = tool.status_server.results_url_for_status(status_id)
         message = "Attachment %s did not pass %s (%s):\nOutput: %s" % (patch.id(), self.name, self.port_name, results_link)
+        if extra_message_text:
+            message += "\n\n%s" % extra_message_text
         # FIXME: We might want to add some text about rejecting from the commit-queue in
         # the case where patch.commit_queue() isn't already set to '-'.
         if self.watchers:
             tool.bugs.add_cc_to_bug(patch.bug_id(), self.watchers)
-        tool.bugs.set_flag_on_attachment(patch.id(), "commit-queue", "-", message, extra_message_text)
+        tool.bugs.set_flag_on_attachment(patch.id(), "commit-queue", "-", message)
 
     def review_patch(self, patch):
         task = EarlyWarningSystemTask(self, patch, self._options.run_tests)
@@ -100,7 +101,7 @@
         return self.name
 
     def run_command(self, command):
-        self.run_webkit_patch(command + [self.port.flag()])
+        self.run_webkit_patch(command + [self._deprecated_port.flag()])
 
     def command_passed(self, message, patch):
         pass
@@ -132,14 +133,13 @@
     @classmethod
     def handle_script_error(cls, tool, state, script_error):
         # FIXME: Why does this not exit(1) like the superclass does?
-        log(script_error.message_with_output())
+        _log.error(script_error.message_with_output())
 
 
 class GtkEWS(AbstractEarlyWarningSystem):
     name = "gtk-ews"
     port_name = "gtk"
     watchers = AbstractEarlyWarningSystem.watchers + [
-        "gns@gnome.org",
         "xan.lopez@gmail.com",
     ]
 
@@ -174,10 +174,7 @@
 class WinEWS(AbstractEarlyWarningSystem):
     name = "win-ews"
     port_name = "win"
-    # Use debug, the Apple Win port fails to link Release on 32-bit Windows.
-    # https://bugs.webkit.org/show_bug.cgi?id=39197
-    _build_style = "debug"
-
+    _default_run_tests = True
 
 class AbstractChromiumEWS(AbstractEarlyWarningSystem):
     port_name = "chromium"
@@ -194,6 +191,12 @@
     _default_run_tests = True
 
 
+class ChromiumLinuxDebugEWS(AbstractChromiumEWS):
+    name = "cr-linux-debug-ews"
+    port_name = "chromium-xvfb"
+    _build_style = "debug"
+
+
 class ChromiumWindowsEWS(AbstractChromiumEWS):
     name = "cr-win-ews"
 
@@ -210,3 +213,15 @@
     name = "mac-ews"
     port_name = "mac"
     _default_run_tests = True
+    watchers = AbstractEarlyWarningSystem.watchers + [
+        "rniwa@webkit.org",
+    ]
+
+
+class MacWK2EWS(AbstractEarlyWarningSystem):
+    name = "mac-wk2-ews"
+    port_name = "mac-wk2"
+    _default_run_tests = True
+    watchers = AbstractEarlyWarningSystem.watchers + [
+        "rniwa@webkit.org",
+    ]
diff --git a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py
index 7feff0d..5f0b806 100644
--- a/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py
@@ -43,50 +43,53 @@
         ews = TestEWS()
         ews.bind_to_tool(MockTool())
         ews._options = MockOptions(port=None, confirm=False)
-        OutputCapture().assert_outputs(self, ews.begin_work_queue, expected_stderr=self._default_begin_work_queue_stderr(ews.name))
+        OutputCapture().assert_outputs(self, ews.begin_work_queue, expected_logs=self._default_begin_work_queue_logs(ews.name))
         ews._expected_failures.unexpected_failures_observed = lambda results: set(["foo.html", "bar.html"])
         task = Mock()
         patch = ews._tool.bugs.fetch_attachment(10000)
-        self.assertEqual(ews._failing_tests_message(task, patch), "New failing tests:\nbar.html\nfoo.html")
+        self.assertMultiLineEqual(ews._failing_tests_message(task, patch), "New failing tests:\nbar.html\nfoo.html")
 
 
 class EarlyWarningSytemTest(QueuesTest):
-    def _default_expected_stderr(self, ews):
-        string_replacemnts = {
+    def _default_expected_logs(self, ews):
+        string_replacements = {
             "name": ews.name,
             "port": ews.port_name,
         }
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr(ews.name),
+        if ews._default_run_tests:
+            run_tests_line = "Running: webkit-patch --status-host=example.com build-and-test --no-clean --no-update --test --non-interactive --port=%(port)s\n" % string_replacements
+        else:
+            run_tests_line = ""
+        string_replacements['run_tests_line'] = run_tests_line
+
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs(ews.name),
+            "process_work_item": """Running: webkit-patch --status-host=example.com clean --port=%(port)s
+Running: webkit-patch --status-host=example.com update --port=%(port)s
+Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000 --port=%(port)s
+Running: webkit-patch --status-host=example.com build --no-clean --no-update --build-style=release --port=%(port)s
+%(run_tests_line)sMOCK: update_status: %(name)s Pass
+MOCK: release_work_item: %(name)s 10000
+""" % string_replacements,
             "handle_unexpected_error": "Mock error message\n",
-            "next_work_item": "",
-            "process_work_item": "MOCK: update_status: %(name)s Pass\nMOCK: release_work_item: %(name)s 10000\n" % string_replacemnts,
             "handle_script_error": "ScriptError error message\n\nMOCK output\n",
         }
-        return expected_stderr
+        return expected_logs
 
-    def _test_builder_ews(self, ews):
+    def _test_ews(self, ews):
         ews.bind_to_tool(MockTool())
         options = Mock()
         options.port = None
         options.run_tests = ews._default_run_tests
-        self.assert_queue_outputs(ews, expected_stderr=self._default_expected_stderr(ews), options=options)
+        self.assert_queue_outputs(ews, expected_logs=self._default_expected_logs(ews), options=options)
 
-    def _test_testing_ews(self, ews):
-        ews.test_results = lambda: None
-        ews.bind_to_tool(MockTool())
-        expected_stderr = self._default_expected_stderr(ews)
-        expected_stderr["handle_script_error"] = "ScriptError error message\n\nMOCK output\n"
-        self.assert_queue_outputs(ews, expected_stderr=expected_stderr)
-
-    def test_builder_ewses(self):
-        self._test_builder_ews(MacEWS())
-        self._test_builder_ews(ChromiumWindowsEWS())
-        self._test_builder_ews(ChromiumAndroidEWS())
-        self._test_builder_ews(QtEWS())
-        self._test_builder_ews(QtWK2EWS())
-        self._test_builder_ews(GtkEWS())
-        self._test_builder_ews(EflEWS())
-
-    def test_testing_ewses(self):
-        self._test_testing_ews(ChromiumLinuxEWS())
+    def _test_ewses(self):
+        self._test_ews(MacEWS())
+        self._test_ews(MacWK2EWS())
+        self._test_ews(ChromiumLinuxEWS())
+        self._test_ews(ChromiumWindowsEWS())
+        self._test_ews(ChromiumAndroidEWS())
+        self._test_ews(QtEWS())
+        self._test_ews(QtWK2EWS())
+        self._test_ews(GtkEWS())
+        self._test_ews(EflEWS())
diff --git a/Tools/Scripts/webkitpy/tool/commands/expectations.py b/Tools/Scripts/webkitpy/tool/commands/expectations.py
deleted file mode 100644
index 0e1050b..0000000
--- a/Tools/Scripts/webkitpy/tool/commands/expectations.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2011 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-from webkitpy.layout_tests.models.test_configuration import TestConfigurationConverter
-from webkitpy.layout_tests.models.test_expectations import TestExpectationParser
-from webkitpy.layout_tests.models.test_expectations import TestExpectations
-from webkitpy.tool.multicommandtool import AbstractDeclarativeCommand
-
-
-class OptimizeExpectations(AbstractDeclarativeCommand):
-    name = "optimize-expectations"
-    help_text = "Fixes simple style issues in test_expectations file.  (Currently works only for chromium port.)"
-
-    def execute(self, options, args, tool):
-        port = tool.port_factory.get("chromium-win-win7")  # FIXME: This should be selectable.
-        parser = TestExpectationParser(port, [], allow_rebaseline_modifier=False)
-        expectation_lines = parser.parse(port.test_expectations())
-        converter = TestConfigurationConverter(port.all_test_configurations(), port.configuration_specifier_macros())
-        tool.filesystem.write_text_file(port.path_to_test_expectations_file(), TestExpectations.list_to_string(expectation_lines, converter))
diff --git a/Tools/Scripts/webkitpy/tool/commands/gardenomatic.py b/Tools/Scripts/webkitpy/tool/commands/gardenomatic.py
index 6cb1519..c87c1a2 100644
--- a/Tools/Scripts/webkitpy/tool/commands/gardenomatic.py
+++ b/Tools/Scripts/webkitpy/tool/commands/gardenomatic.py
@@ -32,7 +32,7 @@
     help_text = "Command for gardening the WebKit tree."
 
     def __init__(self):
-        return super(AbstractRebaseliningCommand, self).__init__(options=(self.platform_options + [
+        super(GardenOMatic, self).__init__(options=(self.platform_options + [
             self.move_overwritten_baselines_option,
             self.results_directory_option,
             self.no_optimize_option,
diff --git a/Tools/Scripts/webkitpy/tool/commands/newcommitbot.py b/Tools/Scripts/webkitpy/tool/commands/newcommitbot.py
new file mode 100644
index 0000000..16434cf
--- /dev/null
+++ b/Tools/Scripts/webkitpy/tool/commands/newcommitbot.py
@@ -0,0 +1,165 @@
+# Copyright (c) 2012 Google Inc. All rights reserved.
+# Copyright (c) 2013 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+import re
+
+from webkitpy.common.config.committers import CommitterList
+from webkitpy.tool.bot.irc_command import IRCCommand
+from webkitpy.tool.bot.irc_command import Help
+from webkitpy.tool.bot.irc_command import Hi
+from webkitpy.tool.bot.irc_command import Restart
+from webkitpy.tool.bot.ircbot import IRCBot
+from webkitpy.tool.commands.queues import AbstractQueue
+from webkitpy.tool.commands.stepsequence import StepSequenceErrorHandler
+
+_log = logging.getLogger(__name__)
+
+
+class PingPong(IRCCommand):
+    def execute(self, nick, args, tool, sheriff):
+        return nick + ": pong"
+
+
+class NewCommitBot(AbstractQueue, StepSequenceErrorHandler):
+    name = "new-commit-bot"
+    watchers = AbstractQueue.watchers + ["rniwa@webkit.org"]
+
+    _commands = {
+        "ping": PingPong,
+        "restart": Restart,
+    }
+
+    # AbstractQueue methods
+
+    def begin_work_queue(self):
+        AbstractQueue.begin_work_queue(self)
+        self._last_svn_revision = int(self._tool.scm().head_svn_revision())
+        self._irc_bot = IRCBot('WKR', self._tool, None, self._commands)
+        self._tool.ensure_irc_connected(self._irc_bot.irc_delegate())
+
+    def work_item_log_path(self, failure_map):
+        return None
+
+    def next_work_item(self):
+        self._irc_bot.process_pending_messages()
+
+        _log.info('Last SVN revision: %d' % self._last_svn_revision)
+
+        _log.info('Updating checkout')
+        self._update_checkout()
+
+        _log.info('Obtaining new SVN revisions')
+        revisions = self._new_svn_revisions()
+
+        _log.info('Obtaining commit logs for %d revisions' % len(revisions))
+        for revision in revisions:
+            commit_log = self._tool.scm().svn_commit_log(revision)
+            self._tool.irc().post(self._summarize_commit_log(commit_log).encode('ascii', 'ignore'))
+
+        return
+
+    def process_work_item(self, failure_map):
+        return True
+
+    def _update_checkout(self):
+        tool = self._tool
+        tool.executive.run_and_throw_if_fail(tool.deprecated_port().update_webkit_command(), quiet=True, cwd=tool.scm().checkout_root)
+
+    def _new_svn_revisions(self):
+        scm = self._tool.scm()
+        current_head = int(scm.head_svn_revision())
+        first_new_revision = self._last_svn_revision + 1
+        self._last_svn_revision = current_head
+        return range(max(first_new_revision, current_head - 20), current_head + 1)
+
+    _patch_by_regex = re.compile(r'^Patch\s+by\s+(?P<author>.+?)\s+on(\s+\d{4}-\d{2}-\d{2})?\n?', re.MULTILINE | re.IGNORECASE)
+    _rollout_regex = re.compile(r'(rolling out|reverting) (?P<revisions>r?\d+((,\s*|,?\s*and\s+)?r?\d+)*)\.?\s*', re.MULTILINE | re.IGNORECASE)
+    _requested_by_regex = re.compile(r'^\"?(?P<reason>.+?)\"? \(Requested\s+by\s+(?P<author>.+?)\s+on\s+#webkit\)\.', re.MULTILINE | re.IGNORECASE)
+    _bugzilla_url_regex = re.compile(r'http(s?)://bugs\.webkit\.org/show_bug\.cgi\?id=(?P<id>\d+)', re.MULTILINE)
+    _trac_url_regex = re.compile(r'http(s?)://trac.webkit.org/changeset/(?P<revision>\d+)', re.MULTILINE)
+
+    @classmethod
+    def _summarize_commit_log(self, commit_log, committer_list=CommitterList()):
+        patch_by = self._patch_by_regex.search(commit_log)
+        commit_log = self._patch_by_regex.sub('', commit_log, count=1)
+
+        rollout = self._rollout_regex.search(commit_log)
+        commit_log = self._rollout_regex.sub('', commit_log, count=1)
+
+        requested_by = self._requested_by_regex.search(commit_log)
+
+        commit_log = self._bugzilla_url_regex.sub(r'https://webkit.org/b/\g<id>', commit_log)
+        commit_log = self._trac_url_regex.sub(r'https://trac.webkit.org/r\g<revision>', commit_log)
+
+        for contributor in committer_list.contributors():
+            if not contributor.irc_nicknames:
+                continue
+            name_with_nick = "%s (%s)" % (contributor.full_name, contributor.irc_nicknames[0])
+            if contributor.full_name in commit_log:
+                commit_log = commit_log.replace(contributor.full_name, name_with_nick)
+                for email in contributor.emails:
+                    commit_log = commit_log.replace(' <' + email + '>', '')
+            else:
+                for email in contributor.emails:
+                    commit_log = commit_log.replace(email, name_with_nick)
+
+        lines = commit_log.split('\n')[1:-2]  # Ignore lines with ----------.
+
+        firstline = re.match(r'^(?P<revision>r\d+) \| (?P<email>[^\|]+) \| (?P<timestamp>[^|]+) \| [^\n]+', lines[0])
+        assert firstline
+        author = firstline.group('email')
+        if patch_by:
+            author = patch_by.group('author')
+
+        linkified_revision = 'https://trac.webkit.org/%s' % firstline.group('revision')
+        lines[0] = '%s by %s' % (linkified_revision, author)
+
+        if rollout:
+            if requested_by:
+                author = requested_by.group('author')
+                contributor = committer_list.contributor_by_irc_nickname(author)
+                if contributor:
+                    author = "%s (%s)" % (contributor.full_name, contributor.irc_nicknames[0])
+                return '%s rolled out %s in %s : %s' % (author, rollout.group('revisions'),
+                    linkified_revision, requested_by.group('reason'))
+            lines[0] = '%s rolled out %s in %s' % (author, rollout.group('revisions'), linkified_revision)
+
+        return ' '.join(filter(lambda line: len(line), lines)[0:4])
+
+    def handle_unexpected_error(self, failure_map, message):
+        _log.error(message)
+
+    # StepSequenceErrorHandler methods
+
+    @classmethod
+    def handle_script_error(cls, tool, state, script_error):
+        # Ideally we would post some information to IRC about what went wrong
+        # here, but we don't have the IRC password in the child process.
+        pass
diff --git a/Tools/Scripts/webkitpy/tool/commands/newcommitbot_unittest.py b/Tools/Scripts/webkitpy/tool/commands/newcommitbot_unittest.py
new file mode 100644
index 0000000..05bf456
--- /dev/null
+++ b/Tools/Scripts/webkitpy/tool/commands/newcommitbot_unittest.py
@@ -0,0 +1,129 @@
+# Copyright (C) 2013 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#    * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#    * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#    * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest2 as unittest
+
+from webkitpy.tool.commands.newcommitbot import NewCommitBot
+
+
+class NewCommitBotTest(unittest.TestCase):
+    def test_summarize_commit_log_basic(self):
+        self.assertEqual(NewCommitBot._summarize_commit_log("""------------------------------------------------------------------------
+r143106 | jochen@chromium.org | 2013-02-16 10:27:07 -0800 (Sat, 16 Feb 2013) | 10 lines
+
+[chromium] initialize all variables of TestRunner classes
+https://bugs.webkit.org/show_bug.cgi?id=110013
+
+Reviewed by Adam Barth.
+
+* DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
+(WebTestRunner::TestInterfaces::TestInterfaces):
+* DumpRenderTree/chromium/TestRunner/src/TestRunner.cpp:
+(WebTestRunner::TestRunner::TestRunner):
+
+------------------------------------------------------------------------"""),
+            "https://trac.webkit.org/r143106 by Jochen Eisinger (jochen__) [chromium] initialize all variables of TestRunner classes"
+            " https://webkit.org/b/110013 Reviewed by Adam Barth (abarth).")
+
+        self.assertEqual(NewCommitBot._summarize_commit_log("""------------------------------------------------------------------------
+r140066 | simon.fraser@apple.com | 2013-01-17 16:10:31 -0800 (Thu, 17 Jan 2013) | 10 lines
+
+Allow PaintInfo to carry all PaintBehavior flags
+https://bugs.webkit.org/show_bug.cgi?id=106980
+
+Reviewed by Beth Dakin.
+
+In r139908 I missed one instance of the PaintInfo constructor that should take PaintBehaviorNormal
+instead of "false".
+
+* rendering/RenderScrollbarPart.cpp:
+(WebCore::RenderScrollbarPart::paintIntoRect):
+------------------------------------------------------------------------"""),
+            "https://trac.webkit.org/r140066 by Simon Fraser (smfr)"
+            " Allow PaintInfo to carry all PaintBehavior flags https://webkit.org/b/106980 Reviewed by Beth Dakin (dethbakin).")
+
+    def test_summarize_commit_log_rollout(self):
+        self.assertEqual(NewCommitBot._summarize_commit_log("""------------------------------------------------------------------------
+r143104 | commit-queue@webkit.org | 2013-02-16 09:09:01 -0800 (Sat, 16 Feb 2013) | 27 lines
+
+Unreviewed, rolling out r142734.
+http://trac.webkit.org/changeset/142734
+https://bugs.webkit.org/show_bug.cgi?id=110018
+
+"Triggered crashes on lots of websites" (Requested by ggaren
+on #webkit).
+
+Patch by Sheriff Bot <webkit.review.bot@gmail.com> on 2013-02-16
+
+Source/WebCore:
+
+------------------------------------------------------------------------"""),
+            "Geoffrey Garen (ggaren) rolled out r142734 in https://trac.webkit.org/r143104 : Triggered crashes on lots of websites")
+
+        self.assertEqual(NewCommitBot._summarize_commit_log("""------------------------------------------------------------------------
+r139884 | kov@webkit.org | 2013-01-16 08:26:10 -0800 (Wed, 16 Jan 2013) | 23 lines
+
+[GStreamer][Soup] Let GStreamer provide the buffer data is downloaded to, to avoid copying
+https://bugs.webkit.org/show_bug.cgi?id=105552
+
+Reverting 139877. It made a couple of API tests fail.
+
+* platform/graphics/gstreamer/GStreamerVersioning.cpp:
+* platform/graphics/gstreamer/GStreamerVersioning.h:
+* platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+(StreamingClient):
+(_WebKitWebSrcPrivate):
+
+------------------------------------------------------------------------"""),
+            "Gustavo Noronha Silva (kov) rolled out 139877 in https://trac.webkit.org/r139884"
+            " [GStreamer][Soup] Let GStreamer provide the buffer data is downloaded to, to avoid copying"
+            " https://webkit.org/b/105552 It made a couple of API tests fail.")
+
+        self.assertEqual(NewCommitBot._summarize_commit_log("""------------------------------------------------------------------------
+r135487 | commit-queue@webkit.org | 2012-11-22 00:09:25 -0800 (Thu, 22 Nov 2012) | 52 lines
+
+Unreviewed, rolling out r134927 and r134944.
+http://trac.webkit.org/changeset/134927
+http://trac.webkit.org/changeset/134944
+https://bugs.webkit.org/show_bug.cgi?id=103028
+
+Reverting the reverts after merging. (Requested by vsevik on
+#webkit).
+
+Patch by Sheriff Bot <webkit.review.bot@gmail.com> on 2012-11-22
+
+* English.lproj/localizedStrings.js:
+* WebCore.gypi:
+* WebCore.vcproj/WebCore.vcproj:
+* inspector/compile-front-end.py:
+* inspector/front-end/AdvancedSearchController.js:
+* inspector/front-end/CallStackSidebarPane.js:
+
+------------------------------------------------------------------------"""),
+            "Vsevolod Vlasov (vsevik) rolled out r134927 and r134944 in https://trac.webkit.org/r135487 :"
+            " Reverting the reverts after merging.")
diff --git a/Tools/Scripts/webkitpy/tool/commands/openbugs.py b/Tools/Scripts/webkitpy/tool/commands/openbugs.py
index 1b51c9f..8c55aba 100644
--- a/Tools/Scripts/webkitpy/tool/commands/openbugs.py
+++ b/Tools/Scripts/webkitpy/tool/commands/openbugs.py
@@ -26,11 +26,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 import re
 import sys
 
 from webkitpy.tool.multicommandtool import AbstractDeclarativeCommand
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class OpenBugs(AbstractDeclarativeCommand):
@@ -58,6 +60,6 @@
             # This won't open bugs until stdin is closed but could be made to easily.  That would just make unit testing slightly harder.
             bug_ids = self._find_bugs_in_iterable(sys.stdin)
 
-        log("%s bugs found in input." % len(bug_ids))
+        _log.info("%s bugs found in input." % len(bug_ids))
 
         self._open_bugs(bug_ids)
diff --git a/Tools/Scripts/webkitpy/tool/commands/openbugs_unittest.py b/Tools/Scripts/webkitpy/tool/commands/openbugs_unittest.py
index 40a6e1b..680e514 100644
--- a/Tools/Scripts/webkitpy/tool/commands/openbugs_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/openbugs_unittest.py
@@ -43,8 +43,8 @@
     def test_find_bugs_in_string(self):
         openbugs = OpenBugs()
         for expectation in self.find_bugs_in_string_expectations:
-            self.assertEquals(openbugs._find_bugs_in_string(expectation[0]), expectation[1])
+            self.assertEqual(openbugs._find_bugs_in_string(expectation[0]), expectation[1])
 
     def test_args_parsing(self):
-        expected_stderr = "2 bugs found in input.\nMOCK: user.open_url: http://example.com/12345\nMOCK: user.open_url: http://example.com/23456\n"
-        self.assert_execute_outputs(OpenBugs(), ["12345\n23456"], expected_stderr=expected_stderr)
+        expected_logs = "2 bugs found in input.\nMOCK: user.open_url: http://example.com/12345\nMOCK: user.open_url: http://example.com/23456\n"
+        self.assert_execute_outputs(OpenBugs(), ["12345\n23456"], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/commands/perfalizer.py b/Tools/Scripts/webkitpy/tool/commands/perfalizer.py
index ae9f63a..ed0e015 100644
--- a/Tools/Scripts/webkitpy/tool/commands/perfalizer.py
+++ b/Tools/Scripts/webkitpy/tool/commands/perfalizer.py
@@ -26,7 +26,8 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.common.system.deprecated_logging import log
+import logging
+
 from webkitpy.tool.bot.expectedfailures import ExpectedFailures
 from webkitpy.tool.bot.irc_command import IRCCommand
 from webkitpy.tool.bot.irc_command import Help
@@ -38,6 +39,8 @@
 from webkitpy.tool.commands.queues import AbstractQueue
 from webkitpy.tool.commands.stepsequence import StepSequenceErrorHandler
 
+_log = logging.getLogger(__name__)
+
 
 class PerfalizerTask(PatchAnalysisTask):
     def __init__(self, tool, patch, logger):
@@ -204,7 +207,7 @@
         return True
 
     def handle_unexpected_error(self, failure_map, message):
-        log(message)
+        _log.error(message)
 
     # StepSequenceErrorHandler methods
 
diff --git a/Tools/Scripts/webkitpy/tool/commands/perfalizer_unittest.py b/Tools/Scripts/webkitpy/tool/commands/perfalizer_unittest.py
index feb7b05..14211e4 100644
--- a/Tools/Scripts/webkitpy/tool/commands/perfalizer_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/perfalizer_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.buildbot import Builder
 from webkitpy.common.system.executive import ScriptError
diff --git a/Tools/Scripts/webkitpy/tool/commands/queries.py b/Tools/Scripts/webkitpy/tool/commands/queries.py
index b7e4a85..eeb93a1 100644
--- a/Tools/Scripts/webkitpy/tool/commands/queries.py
+++ b/Tools/Scripts/webkitpy/tool/commands/queries.py
@@ -29,6 +29,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import fnmatch
+import logging
 import re
 
 from datetime import datetime
@@ -43,26 +44,24 @@
 from webkitpy.common.net.regressionwindow import RegressionWindow
 from webkitpy.common.system.crashlogs import CrashLogs
 from webkitpy.common.system.user import User
+from webkitpy.tool.commands.abstractsequencedcommand import AbstractSequencedCommand
 from webkitpy.tool.grammar import pluralize
 from webkitpy.tool.multicommandtool import AbstractDeclarativeCommand
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.layout_tests.models.test_expectations import TestExpectations
 from webkitpy.layout_tests.port import platform_options, configuration_options
 
+_log = logging.getLogger(__name__)
 
-class SuggestReviewers(AbstractDeclarativeCommand):
+
+class SuggestReviewers(AbstractSequencedCommand):
     name = "suggest-reviewers"
     help_text = "Suggest reviewers for a patch based on recent changes to the modified files."
+    steps = [
+        steps.SuggestReviewers,
+    ]
 
-    def __init__(self):
-        options = [
-            steps.Options.git_commit,
-        ]
-        AbstractDeclarativeCommand.__init__(self, options=options)
-
-    def execute(self, options, args, tool):
-        reviewers = tool.checkout().suggested_reviewers(options.git_commit)
-        print "\n".join([reviewer.full_name for reviewer in reviewers])
+    def _prepare_state(self, options, args, tool):
+        options.suggest_reviewers = True
 
 
 class BugsToCommit(AbstractDeclarativeCommand):
@@ -82,7 +81,7 @@
 
     def execute(self, options, args, tool):
         patches = tool.bugs.queries.fetch_patches_from_commit_queue()
-        log("Patches in commit queue:")
+        _log.info("Patches in commit queue:")
         for patch in patches:
             print patch.url()
 
@@ -99,13 +98,13 @@
     @staticmethod
     def _needs_commit_queue(patch):
         if patch.commit_queue() == "+": # If it's already cq+, ignore the patch.
-            log("%s already has cq=%s" % (patch.id(), patch.commit_queue()))
+            _log.info("%s already has cq=%s" % (patch.id(), patch.commit_queue()))
             return False
 
         # We only need to worry about patches from contributers who are not yet committers.
         committer_record = CommitterList().committer_by_email(patch.attacher_email())
         if committer_record:
-            log("%s committer = %s" % (patch.id(), committer_record))
+            _log.info("%s committer = %s" % (patch.id(), committer_record))
         return not committer_record
 
     def execute(self, options, args, tool):
@@ -440,13 +439,15 @@
                         help='Print a CSV-style report that includes the port name, modifiers, tests, and expectations'),
             make_option('-f', '--full', action='store_true', default=False,
                         help='Print a full TestExpectations-style line for every match'),
+            make_option('--paths', action='store_true', default=False,
+                        help='display the paths for all applicable expectation files'),
         ] + platform_options(use_globs=True)
 
         AbstractDeclarativeCommand.__init__(self, options=options)
         self._expectation_models = {}
 
     def execute(self, options, args, tool):
-        if not args and not options.all:
+        if not options.paths and not args and not options.all:
             print "You must either specify one or more test paths or --all."
             return
 
@@ -465,7 +466,16 @@
             default_port = tool.port_factory.get(options=options)
             port_names = [default_port.name()]
 
-        tests = default_port.tests(args)
+        if options.paths:
+            files = default_port.expectations_files()
+            layout_tests_dir = default_port.layout_tests_dir()
+            for file in files:
+                if file.startswith(layout_tests_dir):
+                    file = file.replace(layout_tests_dir, 'LayoutTests')
+                print file
+            return
+
+        tests = set(default_port.tests(args))
         for port_name in port_names:
             model = self._model(options, port_name, tests)
             tests_to_print = self._filter_tests(options, model, tests)
@@ -501,10 +511,7 @@
 
     def _model(self, options, port_name, tests):
         port = self._tool.port_factory.get(port_name, options)
-        expectations_path = port.path_to_test_expectations_file()
-        if not expectations_path in self._expectation_models:
-            self._expectation_models[expectations_path] = TestExpectations(port, tests).model()
-        return self._expectation_models[expectations_path]
+        return TestExpectations(port, tests).model()
 
 
 class PrintBaselines(AbstractDeclarativeCommand):
diff --git a/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py b/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py
index 79bf1ca..b94b031 100644
--- a/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py
@@ -27,7 +27,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.net.bugzilla import Bugzilla
@@ -65,24 +65,24 @@
 
 class QueryCommandsTest(CommandsTest):
     def test_bugs_to_commit(self):
-        expected_stderr = "Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)\n"
-        self.assert_execute_outputs(BugsToCommit(), None, "50000\n50003\n", expected_stderr)
+        expected_logs = "Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)\n"
+        self.assert_execute_outputs(BugsToCommit(), None, "50000\n50003\n", expected_logs=expected_logs)
 
     def test_patches_in_commit_queue(self):
         expected_stdout = "http://example.com/10000\nhttp://example.com/10002\n"
-        expected_stderr = "Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)\nPatches in commit queue:\n"
-        self.assert_execute_outputs(PatchesInCommitQueue(), None, expected_stdout, expected_stderr)
+        expected_logs = "Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)\nPatches in commit queue:\n"
+        self.assert_execute_outputs(PatchesInCommitQueue(), None, expected_stdout, expected_logs=expected_logs)
 
     def test_patches_to_commit_queue(self):
         expected_stdout = "http://example.com/10003&action=edit\n"
-        expected_stderr = "10000 already has cq=+\n10001 already has cq=+\n10004 committer = \"Eric Seidel\" <eric@webkit.org>\n"
+        expected_logs = "10000 already has cq=+\n10001 already has cq=+\n10004 committer = \"Eric Seidel\" <eric@webkit.org>\n"
         options = Mock()
         options.bugs = False
-        self.assert_execute_outputs(PatchesToCommitQueue(), None, expected_stdout, expected_stderr, options=options)
+        self.assert_execute_outputs(PatchesToCommitQueue(), None, expected_stdout, expected_logs=expected_logs, options=options)
 
         expected_stdout = "http://example.com/50003\n"
         options.bugs = True
-        self.assert_execute_outputs(PatchesToCommitQueue(), None, expected_stdout, expected_stderr, options=options)
+        self.assert_execute_outputs(PatchesToCommitQueue(), None, expected_stdout, expected_logs=expected_logs, options=options)
 
     def test_patches_to_review(self):
         options = Mock()
@@ -150,18 +150,18 @@
         command = FailureReason()
         command.bind_to_tool(tool)
         # This is an artificial example, mostly to test the CommitInfo lookup failure case.
-        self.assertEquals(command._blame_line_for_revision(0), "FAILED to fetch CommitInfo for r0, likely missing ChangeLog")
+        self.assertEqual(command._blame_line_for_revision(0), "FAILED to fetch CommitInfo for r0, likely missing ChangeLog")
 
         def raising_mock(self):
             raise Exception("MESSAGE")
         tool.checkout().commit_info_for_revision = raising_mock
-        self.assertEquals(command._blame_line_for_revision(0), "FAILED to fetch CommitInfo for r0, exception: MESSAGE")
+        self.assertEqual(command._blame_line_for_revision(0), "FAILED to fetch CommitInfo for r0, exception: MESSAGE")
 
 
 class PrintExpectationsTest(unittest.TestCase):
     def run_test(self, tests, expected_stdout, platform='test-win-xp', **args):
         options = MockOptions(all=False, csv=False, full=False, platform=platform,
-                              include_keyword=[], exclude_keyword=[]).update(**args)
+                              include_keyword=[], exclude_keyword=[], paths=False).update(**args)
         tool = MockTool()
         tool.port_factory.all_port_names = lambda: TestPort.ALL_BASELINE_VARIANTS
         command = PrintExpectations()
@@ -173,7 +173,7 @@
             command.execute(options, tests, tool)
         finally:
             stdout, _, _ = oc.restore_output()
-        self.assertEquals(stdout, expected_stdout)
+        self.assertMultiLineEqual(stdout, expected_stdout)
 
     def test_basic(self):
         self.run_test(['failures/expected/text.html', 'failures/expected/image.html'],
@@ -221,6 +221,21 @@
                        'test-win-xp,failures/expected/text.html,BUGTEST,FAIL\n'),
                       csv=True)
 
+    def test_paths(self):
+        self.run_test([],
+                      ('LayoutTests/TestExpectations\n'
+                       'LayoutTests/platform/test/TestExpectations\n'
+                       'LayoutTests/platform/test-win-xp/TestExpectations\n'),
+                      paths=True)
+
+    def test_platform(self):
+        self.run_test(['platform/test-mac-leopard/http/test.html'],
+                      ('// For test-mac-snowleopard\n'
+                       'platform/test-mac-leopard [ Pass Skip WontFix ]\n'  # Note that this is the expectation (from being skipped internally), not the test name
+                       '\n'
+                       '// For test-mac-leopard\n'
+                       'platform/test-mac-leopard/http/test.html [ Pass ]\n'),
+                      platform='test-mac-*')
 
 class PrintBaselinesTest(unittest.TestCase):
     def setUp(self):
@@ -249,7 +264,7 @@
         self.capture_output()
         command.execute(MockOptions(all=False, include_virtual_tests=False, csv=False, platform=None), ['passes/text.html'], self.tool)
         stdout, _, _ = self.restore_output()
-        self.assertEquals(stdout,
+        self.assertMultiLineEqual(stdout,
                           ('// For test-win-xp\n'
                            'passes/text-expected.png\n'
                            'passes/text-expected.txt\n'))
@@ -260,7 +275,7 @@
         self.capture_output()
         command.execute(MockOptions(all=False, include_virtual_tests=False, csv=False, platform='test-win-*'), ['passes/text.html'], self.tool)
         stdout, _, _ = self.restore_output()
-        self.assertEquals(stdout,
+        self.assertMultiLineEqual(stdout,
                           ('// For test-win-vista\n'
                            'passes/text-expected.png\n'
                            'passes/text-expected.txt\n'
@@ -279,6 +294,6 @@
         self.capture_output()
         command.execute(MockOptions(all=False, platform='*xp', csv=True, include_virtual_tests=False), ['passes/text.html'], self.tool)
         stdout, _, _ = self.restore_output()
-        self.assertEquals(stdout,
+        self.assertMultiLineEqual(stdout,
                           ('test-win-xp,passes/text.html,None,png,passes/text-expected.png,None\n'
                            'test-win-xp,passes/text.html,None,txt,passes/text-expected.txt,None\n'))
diff --git a/Tools/Scripts/webkitpy/tool/commands/queues.py b/Tools/Scripts/webkitpy/tool/commands/queues.py
index 6993c2d..8a47e4c 100644
--- a/Tools/Scripts/webkitpy/tool/commands/queues.py
+++ b/Tools/Scripts/webkitpy/tool/commands/queues.py
@@ -4,7 +4,7 @@
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -14,7 +14,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -28,6 +28,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import codecs
+import logging
 import os
 import sys
 import time
@@ -41,7 +42,6 @@
 from webkitpy.common.config.ports import DeprecatedPort
 from webkitpy.common.net.bugzilla import Attachment
 from webkitpy.common.net.statusserver import StatusServer
-from webkitpy.common.system.deprecated_logging import error, log
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.tool.bot.botinfo import BotInfo
 from webkitpy.tool.bot.commitqueuetask import CommitQueueTask, CommitQueueTaskDelegate
@@ -55,6 +55,8 @@
 from webkitpy.tool.commands.stepsequence import StepSequenceErrorHandler
 from webkitpy.tool.multicommandtool import Command, TryAgain
 
+_log = logging.getLogger(__name__)
+
 
 class AbstractQueue(Command, QueueEngineDelegate):
     watchers = [
@@ -78,7 +80,7 @@
             self._tool.bugs.add_cc_to_bug(bug_id, self.watchers)
         except Exception, e:
             traceback.print_exc()
-            log("Failed to CC watchers.")
+            _log.error("Failed to CC watchers.")
 
     def run_webkit_patch(self, args):
         webkit_patch_args = [self._tool.path()]
@@ -92,12 +94,17 @@
         if self._options.port:
             webkit_patch_args += ["--port=%s" % self._options.port]
         webkit_patch_args.extend(args)
-        # FIXME: There is probably no reason to use run_and_throw_if_fail anymore.
-        # run_and_throw_if_fail was invented to support tee'd output
-        # (where we write both to a log file and to the console at once),
-        # but the queues don't need live-progress, a dump-of-output at the
-        # end should be sufficient.
-        return self._tool.executive.run_and_throw_if_fail(webkit_patch_args, cwd=self._tool.scm().checkout_root)
+
+        try:
+            args_for_printing = list(webkit_patch_args)
+            args_for_printing[0] = 'webkit-patch'  # Printing our path for each log is redundant.
+            _log.info("Running: %s" % self._tool.executive.command_for_printing(args_for_printing))
+            command_output = self._tool.executive.run_command(webkit_patch_args, cwd=self._tool.scm().checkout_root)
+        except ScriptError, e:
+            # Make sure the whole output gets printed if the command failed.
+            _log.error(e.message_with_output(output_limit=None))
+            raise
+        return command_output
 
     def _log_directory(self):
         return os.path.join("..", "%s-logs" % self.name)
@@ -111,12 +118,13 @@
         raise NotImplementedError, "subclasses must implement"
 
     def begin_work_queue(self):
-        log("CAUTION: %s will discard all local changes in \"%s\"" % (self.name, self._tool.scm().checkout_root))
+        _log.info("CAUTION: %s will discard all local changes in \"%s\"" % (self.name, self._tool.scm().checkout_root))
         if self._options.confirm:
             response = self._tool.user.prompt("Are you sure?  Type \"yes\" to continue: ")
             if (response != "yes"):
-                error("User declined.")
-        log("Running WebKit %s." % self.name)
+                _log.error("User declined.")
+                sys.exit(1)
+        _log.info("Running WebKit %s." % self.name)
         self._tool.status_server.update_status(self.name, "Starting Queue")
 
     def stop_work_queue(self, reason):
@@ -140,7 +148,7 @@
     def execute(self, options, args, tool, engine=QueueEngine):
         self._options = options # FIXME: This code is wrong.  Command.options is a list, this assumes an Options element!
         self._tool = tool  # FIXME: This code is wrong too!  Command.bind_to_tool handles this!
-        return engine(self.name, self, self._tool.wakeup_event).run()
+        return engine(self.name, self, self._tool.wakeup_event, self._options.seconds_to_sleep).run()
 
     @classmethod
     def _log_from_script_error_for_upload(cls, script_error, output_limit=None):
@@ -193,7 +201,7 @@
         return None
 
     def handle_unexpected_error(self, work_item, message):
-        log(message)
+        _log.error(message)
 
 
 class AbstractPatchQueue(AbstractQueue):
@@ -238,10 +246,47 @@
         self._update_status(message, patch)
         self._release_work_item(patch)
 
-    # FIXME: This probably belongs at a layer below AbstractPatchQueue, but shared by CommitQueue and the EarlyWarningSystem.
+    def work_item_log_path(self, patch):
+        return os.path.join(self._log_directory(), "%s.log" % patch.bug_id())
+
+
+# Used to share code between the EWS and commit-queue.
+class PatchProcessingQueue(AbstractPatchQueue):
+    # Subclasses must override.
+    port_name = None
+
+    def __init__(self, options=None):
+        self._port = None  # We can't instantiate port here because tool isn't avaialble.
+        AbstractPatchQueue.__init__(self, options)
+
+    # FIXME: This is a hack to map between the old port names and the new port names.
+    def _new_port_name_from_old(self, port_name):
+        # The new port system has no concept of xvfb yet.
+        if port_name == 'chromium-xvfb':
+            return 'chromium'
+        # ApplePort.determine_full_port_name asserts if the name doesn't include version.
+        if port_name == 'mac':
+            return 'mac-future'
+        if port_name == 'win':
+            return 'win-future'
+        return port_name
+
+    def begin_work_queue(self):
+        AbstractPatchQueue.begin_work_queue(self)
+        if not self.port_name:
+            return
+        # FIXME: This is only used for self._deprecated_port.flag()
+        self._deprecated_port = DeprecatedPort.port(self.port_name)
+        # FIXME: This violates abstraction
+        self._tool._deprecated_port = self._deprecated_port
+        self._port = self._tool.port_factory.get(self._new_port_name_from_old(self.port_name))
+
     def _upload_results_archive_for_patch(self, patch, results_archive_zip):
+        if not self._port:
+            self._port = self._tool.port_factory.get(self._new_port_name_from_old(self.port_name))
+
         bot_id = self._tool.status_server.bot_id or "bot"
-        description = "Archive of layout-test-results from %s" % bot_id
+        description = "Archive of layout-test-results from %s for %s" % (bot_id, self._port.name())
         # results_archive is a ZipFile object, grab the File object (.fp) to pass to Mechanize for uploading.
         results_archive_file = results_archive_zip.fp
         # Rewind the file object to start (since Mechanize won't do that automatically)
@@ -252,30 +297,21 @@
         comment_text = "The attached test failures were seen while running run-webkit-tests on the %s.\n" % (self.name)
         # FIXME: We could easily list the test failures from the archive here,
         # currently callers do that separately.
-        comment_text += BotInfo(self._tool).summary_text()
+        comment_text += BotInfo(self._tool, self._port.name()).summary_text()
         self._tool.bugs.add_attachment_to_bug(patch.bug_id(), results_archive_file, description, filename="layout-test-results.zip", comment_text=comment_text)
 
-    def work_item_log_path(self, patch):
-        return os.path.join(self._log_directory(), "%s.log" % patch.bug_id())
 
-
-class CommitQueue(AbstractPatchQueue, StepSequenceErrorHandler, CommitQueueTaskDelegate):
+class CommitQueue(PatchProcessingQueue, StepSequenceErrorHandler, CommitQueueTaskDelegate):
     name = "commit-queue"
     port_name = "chromium-xvfb"
 
-    def __init__(self):
-        AbstractPatchQueue.__init__(self)
-        self.port = DeprecatedPort.port(self.port_name)
-
     # AbstractPatchQueue methods
 
     def begin_work_queue(self):
-        # FIXME: This violates abstraction
-        self._tool._deprecated_port = self.port
-        AbstractPatchQueue.begin_work_queue(self)
+        PatchProcessingQueue.begin_work_queue(self)
         self.committer_validator = CommitterValidator(self._tool)
         self._expected_failures = ExpectedFailures()
-        self._layout_test_results_reader = LayoutTestResultsReader(self._tool, self._log_directory())
+        self._layout_test_results_reader = LayoutTestResultsReader(self._tool, self._port.results_directory(), self._log_directory())
 
     def next_work_item(self):
         return self._next_patch()
@@ -316,7 +352,7 @@
     # CommitQueueTaskDelegate methods
 
     def run_command(self, command):
-        self.run_webkit_patch(command + [self.port.flag()])
+        self.run_webkit_patch(command + [self._deprecated_port.flag()])
 
     def command_passed(self, message, patch):
         self._update_status(message, patch=patch)
@@ -352,11 +388,12 @@
 
     # StepSequenceErrorHandler methods
 
+    @classmethod
     def handle_script_error(cls, tool, state, script_error):
         # Hitting this error handler should be pretty rare.  It does occur,
         # however, when a patch no longer applies to top-of-tree in the final
         # land step.
-        log(script_error.message_with_output())
+        _log.error(script_error.message_with_output())
 
     @classmethod
     def handle_checkout_needs_update(cls, tool, state, options, error):
@@ -372,10 +409,10 @@
         raise TryAgain()
 
 
-class AbstractReviewQueue(AbstractPatchQueue, StepSequenceErrorHandler):
+class AbstractReviewQueue(PatchProcessingQueue, StepSequenceErrorHandler):
     """This is the base-class for the EWS queues and the style-queue."""
     def __init__(self, options=None):
-        AbstractPatchQueue.__init__(self, options)
+        PatchProcessingQueue.__init__(self, options)
 
     def review_patch(self, patch):
         raise NotImplementedError("subclasses must implement")
@@ -383,7 +420,7 @@
     # AbstractPatchQueue methods
 
     def begin_work_queue(self):
-        AbstractPatchQueue.begin_work_queue(self)
+        PatchProcessingQueue.begin_work_queue(self)
 
     def next_work_item(self):
         return self._next_patch()
@@ -404,13 +441,13 @@
             raise e
 
     def handle_unexpected_error(self, patch, message):
-        log(message)
+        _log.error(message)
 
     # StepSequenceErrorHandler methods
 
     @classmethod
     def handle_script_error(cls, tool, state, script_error):
-        log(script_error.output)
+        _log.error(script_error.output)
 
 
 class StyleQueue(AbstractReviewQueue, StyleQueueTaskDelegate):
diff --git a/Tools/Scripts/webkitpy/tool/commands/queues_unittest.py b/Tools/Scripts/webkitpy/tool/commands/queues_unittest.py
index 6301fea..53a46ed 100644
--- a/Tools/Scripts/webkitpy/tool/commands/queues_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/queues_unittest.py
@@ -72,7 +72,7 @@
 
 class AbstractQueueTest(CommandsTest):
     def test_log_directory(self):
-        self.assertEquals(TestQueue()._log_directory(), os.path.join("..", "test-queue-logs"))
+        self.assertEqual(TestQueue()._log_directory(), os.path.join("..", "test-queue-logs"))
 
     def _assert_run_webkit_patch(self, run_args, port=None):
         queue = TestQueue()
@@ -88,7 +88,7 @@
         if port:
             expected_run_args.append("--port=%s" % port)
         expected_run_args.extend(run_args)
-        tool.executive.run_and_throw_if_fail.assert_called_with(expected_run_args, cwd='/mock-checkout')
+        tool.executive.run_command.assert_called_with(expected_run_args, cwd='/mock-checkout')
 
     def test_run_webkit_patch(self):
         self._assert_run_webkit_patch([1])
@@ -130,12 +130,11 @@
     def test_feeder_queue(self):
         queue = TestFeederQueue()
         tool = MockTool(log_executive=True)
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("feeder-queue"),
-            "next_work_item": "",
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("feeder-queue"),
             "process_work_item": """Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)
 Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)
-MOCK setting flag 'commit-queue' to '-' on attachment '10001' with comment 'Rejecting attachment 10001 from commit-queue.' and additional comment 'non-committer@example.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/Tools/Scripts/webkitpy/common/config/committers.py.
+MOCK setting flag 'commit-queue' to '-' on attachment '10001' with comment 'Rejecting attachment 10001 from commit-queue.\n\nnon-committer@example.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/Tools/Scripts/webkitpy/common/config/committers.py.
 
 - If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.
 
@@ -147,7 +146,7 @@
 """,
             "handle_unexpected_error": "Mock error message\n",
         }
-        self.assert_queue_outputs(queue, tool=tool, expected_stderr=expected_stderr)
+        self.assert_queue_outputs(queue, tool=tool, expected_logs=expected_logs)
 
 
 class AbstractPatchQueueTest(CommandsTest):
@@ -157,31 +156,33 @@
         queue.bind_to_tool(tool)
         queue._options = Mock()
         queue._options.port = None
-        self.assertEquals(queue._next_patch(), None)
+        self.assertIsNone(queue._next_patch())
         tool.status_server = MockStatusServer(work_items=[2, 10000, 10001])
         expected_stdout = "MOCK: fetch_attachment: 2 is not a known attachment id\n"  # A mock-only message to prevent us from making mistakes.
-        expected_stderr = "MOCK: release_work_item: None 2\n"
-        patch = OutputCapture().assert_outputs(self, queue._next_patch, expected_stdout=expected_stdout, expected_stderr=expected_stderr)
+        expected_logs = "MOCK: release_work_item: None 2\n"
+        patch = OutputCapture().assert_outputs(self, queue._next_patch, expected_stdout=expected_stdout, expected_logs=expected_logs)
         # The patch.id() == 2 is ignored because it doesn't exist.
-        self.assertEquals(patch.id(), 10000)
-        self.assertEquals(queue._next_patch().id(), 10001)
-        self.assertEquals(queue._next_patch(), None)    # When the queue is empty
+        self.assertEqual(patch.id(), 10000)
+        self.assertEqual(queue._next_patch().id(), 10001)
+        self.assertEqual(queue._next_patch(), None)    # When the queue is empty
 
+
+class PatchProcessingQueueTest(CommandsTest):
     def test_upload_results_archive_for_patch(self):
-        queue = AbstractPatchQueue()
+        queue = PatchProcessingQueue()
         queue.name = "mock-queue"
         tool = MockTool()
         queue.bind_to_tool(tool)
         queue._options = Mock()
         queue._options.port = None
         patch = queue._tool.bugs.fetch_attachment(10001)
-        expected_stderr = """MOCK add_attachment_to_bug: bug_id=50000, description=Archive of layout-test-results from bot filename=layout-test-results.zip mimetype=None
+        expected_logs = """MOCK add_attachment_to_bug: bug_id=50000, description=Archive of layout-test-results from bot for mac-snowleopard filename=layout-test-results.zip mimetype=None
 -- Begin comment --
 The attached test failures were seen while running run-webkit-tests on the mock-queue.
-Port: MockPort  Platform: MockPlatform 1.0
+Port: mac-snowleopard  Platform: MockPlatform 1.0
 -- End comment --
 """
-        OutputCapture().assert_outputs(self, queue._upload_results_archive_for_patch, [patch, Mock()], expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, queue._upload_results_archive_for_patch, [patch, Mock()], expected_logs=expected_logs)
 
 
 class NeedsUpdateSequence(StepSequence):
@@ -235,38 +236,43 @@
         tool = MockTool()
         tool.filesystem.write_text_file('/tmp/layout-test-results/full_results.json', '')  # Otherwise the commit-queue will hit a KeyError trying to read the results from the MockFileSystem.
         tool.filesystem.write_text_file('/tmp/layout-test-results/webkit_unit_tests_output.xml', '')
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue"),
-            "next_work_item": "",
-            "process_work_item": """MOCK: update_status: commit-queue Cleaned working directory
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("commit-queue"),
+            "process_work_item": """Running: webkit-patch --status-host=example.com clean --port=chromium-xvfb
+MOCK: update_status: commit-queue Cleaned working directory
+Running: webkit-patch --status-host=example.com update --port=chromium-xvfb
 MOCK: update_status: commit-queue Updated working directory
+Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000 --port=chromium-xvfb
 MOCK: update_status: commit-queue Applied patch
+Running: webkit-patch --status-host=example.com validate-changelog --non-interactive 10000 --port=chromium-xvfb
 MOCK: update_status: commit-queue ChangeLog validated
+Running: webkit-patch --status-host=example.com build --no-clean --no-update --build-style=release --port=chromium-xvfb
 MOCK: update_status: commit-queue Built patch
+Running: webkit-patch --status-host=example.com build-and-test --no-clean --no-update --test --non-interactive --port=chromium-xvfb
 MOCK: update_status: commit-queue Passed tests
+Running: webkit-patch --status-host=example.com land-attachment --force-clean --non-interactive --parent-command=commit-queue 10000 --port=chromium-xvfb
 MOCK: update_status: commit-queue Landed patch
 MOCK: update_status: commit-queue Pass
 MOCK: release_work_item: commit-queue 10000
 """,
-            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.' and additional comment 'Mock error message'\n",
             "handle_script_error": "ScriptError error message\n\nMOCK output\n",
+            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.\n\nMock error message'\n",
         }
-        self.assert_queue_outputs(CommitQueue(), tool=tool, expected_stderr=expected_stderr)
+        self.assert_queue_outputs(CommitQueue(), tool=tool, expected_logs=expected_logs)
 
     def test_commit_queue_failure(self):
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue"),
-            "next_work_item": "",
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("commit-queue"),
             "process_work_item": """MOCK: update_status: commit-queue Cleaned working directory
 MOCK: update_status: commit-queue Updated working directory
 MOCK: update_status: commit-queue Patch does not apply
-MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.' and additional comment 'MOCK script error
+MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.\n\nMOCK script error
 Full output: http://dummy_url'
 MOCK: update_status: commit-queue Fail
 MOCK: release_work_item: commit-queue 10000
 """,
-            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.' and additional comment 'Mock error message'\n",
             "handle_script_error": "ScriptError error message\n\nMOCK output\n",
+            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.\n\nMock error message'\n",
         }
         queue = CommitQueue()
 
@@ -278,24 +284,23 @@
             raise ScriptError('MOCK script error')
 
         queue.run_webkit_patch = mock_run_webkit_patch
-        self.assert_queue_outputs(queue, expected_stderr=expected_stderr)
+        self.assert_queue_outputs(queue, expected_logs=expected_logs)
 
     def test_commit_queue_failure_with_failing_tests(self):
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue"),
-            "next_work_item": "",
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("commit-queue"),
             "process_work_item": """MOCK: update_status: commit-queue Cleaned working directory
 MOCK: update_status: commit-queue Updated working directory
 MOCK: update_status: commit-queue Patch does not apply
-MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.' and additional comment 'New failing tests:
+MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.\n\nNew failing tests:
 mock_test_name.html
 another_test_name.html
 Full output: http://dummy_url'
 MOCK: update_status: commit-queue Fail
 MOCK: release_work_item: commit-queue 10000
 """,
-            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.' and additional comment 'Mock error message'\n",
             "handle_script_error": "ScriptError error message\n\nMOCK output\n",
+            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.\n\nMock error message'\n",
         }
         queue = CommitQueue()
 
@@ -308,63 +313,61 @@
             raise ScriptError('MOCK script error')
 
         queue.run_webkit_patch = mock_run_webkit_patch
-        self.assert_queue_outputs(queue, expected_stderr=expected_stderr)
+        self.assert_queue_outputs(queue, expected_logs=expected_logs)
 
     def test_rollout(self):
-        tool = MockTool(log_executive=True)
+        tool = MockTool()
         tool.filesystem.write_text_file('/tmp/layout-test-results/full_results.json', '')  # Otherwise the commit-queue will hit a KeyError trying to read the results from the MockFileSystem.
         tool.filesystem.write_text_file('/tmp/layout-test-results/webkit_unit_tests_output.xml', '')
         tool.buildbot.light_tree_on_fire()
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue"),
-            "next_work_item": "",
-            "process_work_item": """MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'clean', '--port=%(port_name)s'], cwd=/mock-checkout
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("commit-queue"),
+            "process_work_item": """Running: webkit-patch --status-host=example.com clean --port=%(port)s
 MOCK: update_status: commit-queue Cleaned working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'update', '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com update --port=%(port)s
 MOCK: update_status: commit-queue Updated working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'apply-attachment', '--no-update', '--non-interactive', 10000, '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000 --port=%(port)s
 MOCK: update_status: commit-queue Applied patch
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'validate-changelog', '--non-interactive', 10000, '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com validate-changelog --non-interactive 10000 --port=%(port)s
 MOCK: update_status: commit-queue ChangeLog validated
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'build', '--no-clean', '--no-update', '--build-style=release', '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com build --no-clean --no-update --build-style=release --port=%(port)s
 MOCK: update_status: commit-queue Built patch
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'build-and-test', '--no-clean', '--no-update', '--test', '--non-interactive', '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com build-and-test --no-clean --no-update --test --non-interactive --port=%(port)s
 MOCK: update_status: commit-queue Passed tests
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'land-attachment', '--force-clean', '--non-interactive', '--parent-command=commit-queue', 10000, '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com land-attachment --force-clean --non-interactive --parent-command=commit-queue 10000 --port=%(port)s
 MOCK: update_status: commit-queue Landed patch
 MOCK: update_status: commit-queue Pass
 MOCK: release_work_item: commit-queue 10000
-""" % {"port_name": CommitQueue.port_name},
-            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.' and additional comment 'Mock error message'\n",
+""" % {"port": CommitQueue.port_name},
             "handle_script_error": "ScriptError error message\n\nMOCK output\n",
+            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10000' with comment 'Rejecting attachment 10000 from commit-queue.\n\nMock error message'\n",
         }
-        self.assert_queue_outputs(CommitQueue(), tool=tool, expected_stderr=expected_stderr)
+        self.assert_queue_outputs(CommitQueue(), tool=tool, expected_logs=expected_logs)
 
     def test_rollout_lands(self):
-        tool = MockTool(log_executive=True)
+        tool = MockTool()
         tool.buildbot.light_tree_on_fire()
         rollout_patch = tool.bugs.fetch_attachment(10005)  # _patch6, a rollout patch.
         assert(rollout_patch.is_rollout())
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue"),
-            "next_work_item": "",
-            "process_work_item": """MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'clean', '--port=%(port_name)s'], cwd=/mock-checkout
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("commit-queue"),
+            "process_work_item": """Running: webkit-patch --status-host=example.com clean --port=%(port)s
 MOCK: update_status: commit-queue Cleaned working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'update', '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com update --port=%(port)s
 MOCK: update_status: commit-queue Updated working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'apply-attachment', '--no-update', '--non-interactive', 10005, '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10005 --port=%(port)s
 MOCK: update_status: commit-queue Applied patch
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'validate-changelog', '--non-interactive', 10005, '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com validate-changelog --non-interactive 10005 --port=%(port)s
 MOCK: update_status: commit-queue ChangeLog validated
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'land-attachment', '--force-clean', '--non-interactive', '--parent-command=commit-queue', 10005, '--port=%(port_name)s'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com land-attachment --force-clean --non-interactive --parent-command=commit-queue 10005 --port=%(port)s
 MOCK: update_status: commit-queue Landed patch
 MOCK: update_status: commit-queue Pass
 MOCK: release_work_item: commit-queue 10005
-""" % {"port_name": CommitQueue.port_name},
-            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10005' with comment 'Rejecting attachment 10005 from commit-queue.' and additional comment 'Mock error message'\n",
+""" % {"port": CommitQueue.port_name},
             "handle_script_error": "ScriptError error message\n\nMOCK output\n",
+            "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '10005' with comment 'Rejecting attachment 10005 from commit-queue.\n\nMock error message'\n",
         }
-        self.assert_queue_outputs(CommitQueue(), tool=tool, work_item=rollout_patch, expected_stderr=expected_stderr)
+        self.assert_queue_outputs(CommitQueue(), tool=tool, work_item=rollout_patch, expected_logs=expected_logs)
 
     def test_auto_retry(self):
         queue = CommitQueue()
@@ -373,13 +376,15 @@
         tool = AlwaysCommitQueueTool()
         sequence = NeedsUpdateSequence(None)
 
-        expected_stderr = "Commit failed because the checkout is out of date.  Please update and try again.\nMOCK: update_status: commit-queue Tests passed, but commit failed (checkout out of date).  Updating, then landing without building or re-running tests.\n"
+        expected_logs = """Commit failed because the checkout is out of date. Please update and try again.
+MOCK: update_status: commit-queue Tests passed, but commit failed (checkout out of date).  Updating, then landing without building or re-running tests.
+"""
         state = {'patch': None}
-        OutputCapture().assert_outputs(self, sequence.run_and_handle_errors, [tool, options, state], expected_exception=TryAgain, expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, sequence.run_and_handle_errors, [tool, options, state], expected_exception=TryAgain, expected_logs=expected_logs)
 
-        self.assertEquals(options.update, True)
-        self.assertEquals(options.build, False)
-        self.assertEquals(options.test, False)
+        self.assertTrue(options.update)
+        self.assertFalse(options.build)
+        self.assertFalse(options.test)
 
     def test_manual_reject_during_processing(self):
         queue = SecondThoughtsCommitQueue(MockTool())
@@ -388,20 +393,26 @@
         queue._tool.filesystem.write_text_file('/tmp/layout-test-results/webkit_unit_tests_output.xml', '')
         queue._options = Mock()
         queue._options.port = None
-        expected_stderr = """MOCK: update_status: commit-queue Cleaned working directory
+        expected_logs = """Running: webkit-patch --status-host=example.com clean --port=chromium-xvfb
+MOCK: update_status: commit-queue Cleaned working directory
+Running: webkit-patch --status-host=example.com update --port=chromium-xvfb
 MOCK: update_status: commit-queue Updated working directory
+Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000 --port=chromium-xvfb
 MOCK: update_status: commit-queue Applied patch
+Running: webkit-patch --status-host=example.com validate-changelog --non-interactive 10000 --port=chromium-xvfb
 MOCK: update_status: commit-queue ChangeLog validated
+Running: webkit-patch --status-host=example.com build --no-clean --no-update --build-style=release --port=chromium-xvfb
 MOCK: update_status: commit-queue Built patch
+Running: webkit-patch --status-host=example.com build-and-test --no-clean --no-update --test --non-interactive --port=chromium-xvfb
 MOCK: update_status: commit-queue Passed tests
 MOCK: update_status: commit-queue Retry
 MOCK: release_work_item: commit-queue 10000
 """
-        OutputCapture().assert_outputs(self, queue.process_work_item, [QueuesTest.mock_work_item], expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, queue.process_work_item, [QueuesTest.mock_work_item], expected_logs=expected_logs)
 
     def test_report_flaky_tests(self):
         queue = TestCommitQueue(MockTool())
-        expected_stderr = """MOCK bug comment: bug_id=50002, cc=None
+        expected_logs = """MOCK bug comment: bug_id=50002, cc=None
 --- Begin comment ---
 The commit-queue just saw foo/bar.html flake (text diff) while processing attachment 10000 on bug 50000.
 Port: MockPort  Platform: MockPlatform 1.0
@@ -414,6 +425,7 @@
 Port: MockPort  Platform: MockPlatform 1.0
 --- End comment ---
 
+bar/baz-diffs.txt does not exist in results archive, uploading entire archive.
 MOCK add_attachment_to_bug: bug_id=50002, description=Archive of layout-test-results from bot filename=layout-test-results.zip mimetype=None
 MOCK bug comment: bug_id=50000, cc=None
 --- Begin comment ---
@@ -439,7 +451,7 @@
                 # This is intentionally missing one diffs.txt to exercise the "upload the whole zip" codepath.
                 return ['foo/bar-diffs.txt']
 
-        OutputCapture().assert_outputs(self, queue.report_flaky_tests, [QueuesTest.mock_work_item, test_results, MockZipFile()], expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, queue.report_flaky_tests, [QueuesTest.mock_work_item, test_results, MockZipFile()], expected_logs=expected_logs)
 
     def test_did_pass_testing_ews(self):
         tool = MockTool()
@@ -450,18 +462,17 @@
 
 class StyleQueueTest(QueuesTest):
     def test_style_queue_with_style_exception(self):
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("style-queue"),
-            "next_work_item": "",
-            "process_work_item": """MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'clean'], cwd=/mock-checkout
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("style-queue"),
+            "process_work_item": """Running: webkit-patch --status-host=example.com clean
 MOCK: update_status: style-queue Cleaned working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'update'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com update
 MOCK: update_status: style-queue Updated working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'apply-attachment', '--no-update', '--non-interactive', 10000], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000
 MOCK: update_status: style-queue Applied patch
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'apply-watchlist-local', 50000], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com apply-watchlist-local 50000
 MOCK: update_status: style-queue Watchlist applied
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'check-style-local', '--non-interactive', '--quiet'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com check-style-local --non-interactive --quiet
 MOCK: update_status: style-queue Style checked
 MOCK: update_status: style-queue Pass
 MOCK: release_work_item: style-queue 10000
@@ -469,22 +480,24 @@
             "handle_unexpected_error": "Mock error message\n",
             "handle_script_error": "MOCK output\n",
         }
-        tool = MockTool(log_executive=True, executive_throws_when_run=set(['check-style']))
-        self.assert_queue_outputs(StyleQueue(), expected_stderr=expected_stderr, tool=tool)
+        tool = MockTool(executive_throws_when_run=set(['check-style']))
+        self.assert_queue_outputs(StyleQueue(), expected_logs=expected_logs, tool=tool)
 
     def test_style_queue_with_watch_list_exception(self):
-        expected_stderr = {
-            "begin_work_queue": self._default_begin_work_queue_stderr("style-queue"),
-            "next_work_item": "",
-            "process_work_item": """MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'clean'], cwd=/mock-checkout
+        expected_logs = {
+            "begin_work_queue": self._default_begin_work_queue_logs("style-queue"),
+            "process_work_item": """Running: webkit-patch --status-host=example.com clean
 MOCK: update_status: style-queue Cleaned working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'update'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com update
 MOCK: update_status: style-queue Updated working directory
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'apply-attachment', '--no-update', '--non-interactive', 10000], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com apply-attachment --no-update --non-interactive 10000
 MOCK: update_status: style-queue Applied patch
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'apply-watchlist-local', 50000], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com apply-watchlist-local 50000
+Exception for ['echo', '--status-host=example.com', 'apply-watchlist-local', 50000]
+
+MOCK command output
 MOCK: update_status: style-queue Unabled to apply watchlist
-MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'check-style-local', '--non-interactive', '--quiet'], cwd=/mock-checkout
+Running: webkit-patch --status-host=example.com check-style-local --non-interactive --quiet
 MOCK: update_status: style-queue Style checked
 MOCK: update_status: style-queue Pass
 MOCK: release_work_item: style-queue 10000
@@ -492,5 +505,5 @@
             "handle_unexpected_error": "Mock error message\n",
             "handle_script_error": "MOCK output\n",
         }
-        tool = MockTool(log_executive=True, executive_throws_when_run=set(['apply-watchlist-local']))
-        self.assert_queue_outputs(StyleQueue(), expected_stderr=expected_stderr, tool=tool)
+        tool = MockTool(executive_throws_when_run=set(['apply-watchlist-local']))
+        self.assert_queue_outputs(StyleQueue(), expected_logs=expected_logs, tool=tool)
diff --git a/Tools/Scripts/webkitpy/tool/commands/queuestest.py b/Tools/Scripts/webkitpy/tool/commands/queuestest.py
index b99302c..c633b84 100644
--- a/Tools/Scripts/webkitpy/tool/commands/queuestest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/queuestest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net.bugzilla import Attachment
 from webkitpy.common.system.outputcapture import OutputCapture
@@ -37,7 +37,7 @@
 
 
 class MockQueueEngine(object):
-    def __init__(self, name, queue, wakeup_event):
+    def __init__(self, name, queue, wakeup_event, seconds_to_sleep):
         pass
 
     def run(self):
@@ -48,29 +48,38 @@
     # This is _patch1 in mocktool.py
     mock_work_item = MockTool().bugs.fetch_attachment(10000)
 
-    def assert_outputs(self, func, func_name, args, expected_stdout, expected_stderr, expected_exceptions):
+    def assert_outputs(self, func, func_name, args, expected_stdout, expected_stderr, expected_exceptions, expected_logs):
         exception = None
         if expected_exceptions and func_name in expected_exceptions:
             exception = expected_exceptions[func_name]
 
+        logs = None
+        if expected_logs and func_name in expected_logs:
+            logs = expected_logs[func_name]
+
         OutputCapture().assert_outputs(self,
                 func,
                 args=args,
                 expected_stdout=expected_stdout.get(func_name, ""),
                 expected_stderr=expected_stderr.get(func_name, ""),
-                expected_exception=exception)
+                expected_exception=exception,
+                expected_logs=logs)
 
     def _default_begin_work_queue_stderr(self, name):
+        string_replacements = {"name": name}
+        return "MOCK: update_status: %(name)s Starting Queue\n" % string_replacements
+
+    def _default_begin_work_queue_logs(self, name):
         checkout_dir = '/mock-checkout'
         string_replacements = {"name": name, 'checkout_dir': checkout_dir}
         return "CAUTION: %(name)s will discard all local changes in \"%(checkout_dir)s\"\nRunning WebKit %(name)s.\nMOCK: update_status: %(name)s Starting Queue\n" % string_replacements
 
-    def assert_queue_outputs(self, queue, args=None, work_item=None, expected_stdout=None, expected_stderr=None, expected_exceptions=None, options=None, tool=None):
+    def assert_queue_outputs(self, queue, args=None, work_item=None, expected_stdout=None, expected_stderr=None, expected_exceptions=None, expected_logs=None, options=None, tool=None):
         if not tool:
             tool = MockTool()
             # This is a hack to make it easy for callers to not have to setup a custom MockFileSystem just to test the commit-queue
             # the cq tries to read the layout test results, and will hit a KeyError in MockFileSystem if we don't do this.
-            tool.filesystem.write_text_file('/mock-results/results.html', "")
+            tool.filesystem.write_text_file('/mock-results/full_results.json', "")
         if not expected_stdout:
             expected_stdout = {}
         if not expected_stderr:
@@ -86,13 +95,13 @@
 
         queue.execute(options, args, tool, engine=MockQueueEngine)
 
-        self.assert_outputs(queue.queue_log_path, "queue_log_path", [], expected_stdout, expected_stderr, expected_exceptions)
-        self.assert_outputs(queue.work_item_log_path, "work_item_log_path", [work_item], expected_stdout, expected_stderr, expected_exceptions)
-        self.assert_outputs(queue.begin_work_queue, "begin_work_queue", [], expected_stdout, expected_stderr, expected_exceptions)
-        self.assert_outputs(queue.should_continue_work_queue, "should_continue_work_queue", [], expected_stdout, expected_stderr, expected_exceptions)
-        self.assert_outputs(queue.next_work_item, "next_work_item", [], expected_stdout, expected_stderr, expected_exceptions)
-        self.assert_outputs(queue.process_work_item, "process_work_item", [work_item], expected_stdout, expected_stderr, expected_exceptions)
-        self.assert_outputs(queue.handle_unexpected_error, "handle_unexpected_error", [work_item, "Mock error message"], expected_stdout, expected_stderr, expected_exceptions)
+        self.assert_outputs(queue.queue_log_path, "queue_log_path", [], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
+        self.assert_outputs(queue.work_item_log_path, "work_item_log_path", [work_item], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
+        self.assert_outputs(queue.begin_work_queue, "begin_work_queue", [], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
+        self.assert_outputs(queue.should_continue_work_queue, "should_continue_work_queue", [], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
+        self.assert_outputs(queue.next_work_item, "next_work_item", [], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
+        self.assert_outputs(queue.process_work_item, "process_work_item", [work_item], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
+        self.assert_outputs(queue.handle_unexpected_error, "handle_unexpected_error", [work_item, "Mock error message"], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
         # Should we have a different function for testing StepSequenceErrorHandlers?
         if isinstance(queue, StepSequenceErrorHandler):
-            self.assert_outputs(queue.handle_script_error, "handle_script_error", [tool, {"patch": self.mock_work_item}, ScriptError(message="ScriptError error message", script_args="MockErrorCommand", output="MOCK output")], expected_stdout, expected_stderr, expected_exceptions)
+            self.assert_outputs(queue.handle_script_error, "handle_script_error", [tool, {"patch": self.mock_work_item}, ScriptError(message="ScriptError error message", script_args="MockErrorCommand", output="MOCK output")], expected_stdout, expected_stderr, expected_exceptions, expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/commands/rebaseline.py b/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
index d9209b1..b6e408d 100644
--- a/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
+++ b/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
@@ -50,7 +50,7 @@
 
 
 class AbstractRebaseliningCommand(AbstractDeclarativeCommand):
-    # not overriding execute() - pylint: disable-msg=W0223
+    # not overriding execute() - pylint: disable=W0223
 
     move_overwritten_baselines_option = optparse.make_option("--move-overwritten-baselines", action="store_true", default=False,
         help="Move overwritten baselines elsewhere in the baseline path. This is for bringing up new ports.")
@@ -152,7 +152,7 @@
             path = port.path_to_test_expectations_file()
             lock = self._tool.make_file_lock(path + '.lock')
             lock.acquire_lock()
-            expectations = TestExpectations(port, include_overrides=False)
+            expectations = TestExpectations(port, include_generic=False, include_overrides=False)
             for test_configuration in port.all_test_configurations():
                 if test_configuration.version == port.test_configuration().version:
                     expectationsString = expectations.remove_configuration_from_test(test_name, test_configuration)
@@ -266,7 +266,7 @@
 
 
 class AbstractParallelRebaselineCommand(AbstractRebaseliningCommand):
-    # not overriding execute() - pylint: disable-msg=W0223
+    # not overriding execute() - pylint: disable=W0223
 
     def _run_webkit_patch(self, args, verbose):
         try:
diff --git a/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py b/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
index d7dafb9..b93e1a5 100644
--- a/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.checkout.baselineoptimizer import BaselineOptimizer
@@ -45,7 +45,7 @@
 
     def setUp(self):
         self.tool = MockTool()
-        self.command = self.command_constructor()  # lint warns that command_constructor might not be set, but this is intentional; pylint: disable-msg=E1102
+        self.command = self.command_constructor()  # lint warns that command_constructor might not be set, but this is intentional; pylint: disable=E1102
         self.command.bind_to_tool(self.tool)
         self.lion_port = self.tool.port_factory.get_from_builder_name("WebKit Mac10.7")
         self.lion_expectations_path = self.lion_port.path_to_test_expectations_file()
@@ -83,15 +83,16 @@
 
     def test_baseline_directory(self):
         command = self.command
-        self.assertEqual(command._baseline_directory("Apple Win XP Debug (Tests)"), "/mock-checkout/LayoutTests/platform/win-xp")
-        self.assertEqual(command._baseline_directory("Apple Win 7 Release (Tests)"), "/mock-checkout/LayoutTests/platform/win")
-        self.assertEqual(command._baseline_directory("Apple Lion Release WK1 (Tests)"), "/mock-checkout/LayoutTests/platform/mac-lion")
-        self.assertEqual(command._baseline_directory("Apple Lion Release WK2 (Tests)"), "/mock-checkout/LayoutTests/platform/mac-wk2")
-        self.assertEqual(command._baseline_directory("GTK Linux 32-bit Release"), "/mock-checkout/LayoutTests/platform/gtk")
-        self.assertEqual(command._baseline_directory("EFL Linux 64-bit Debug"), "/mock-checkout/LayoutTests/platform/efl-wk1")
-        self.assertEqual(command._baseline_directory("Qt Linux Release"), "/mock-checkout/LayoutTests/platform/qt")
-        self.assertEqual(command._baseline_directory("WebKit Mac10.7"), "/mock-checkout/LayoutTests/platform/chromium-mac-lion")
-        self.assertEqual(command._baseline_directory("WebKit Mac10.6"), "/mock-checkout/LayoutTests/platform/chromium-mac-snowleopard")
+        self.assertMultiLineEqual(command._baseline_directory("Apple Win XP Debug (Tests)"), "/mock-checkout/LayoutTests/platform/win-xp")
+        self.assertMultiLineEqual(command._baseline_directory("Apple Win 7 Release (Tests)"), "/mock-checkout/LayoutTests/platform/win")
+        self.assertMultiLineEqual(command._baseline_directory("Apple Lion Release WK1 (Tests)"), "/mock-checkout/LayoutTests/platform/mac-lion")
+        self.assertMultiLineEqual(command._baseline_directory("Apple Lion Release WK2 (Tests)"), "/mock-checkout/LayoutTests/platform/mac-wk2")
+        self.assertMultiLineEqual(command._baseline_directory("GTK Linux 64-bit Debug"), "/mock-checkout/LayoutTests/platform/gtk-wk1")
+        self.assertMultiLineEqual(command._baseline_directory("GTK Linux 64-bit Release WK2 (Tests)"), "/mock-checkout/LayoutTests/platform/gtk-wk2")
+        self.assertMultiLineEqual(command._baseline_directory("EFL Linux 64-bit Release WK2"), "/mock-checkout/LayoutTests/platform/efl-wk2")
+        self.assertMultiLineEqual(command._baseline_directory("Qt Linux Release"), "/mock-checkout/LayoutTests/platform/qt")
+        self.assertMultiLineEqual(command._baseline_directory("WebKit Mac10.7"), "/mock-checkout/LayoutTests/platform/chromium-mac-lion")
+        self.assertMultiLineEqual(command._baseline_directory("WebKit Mac10.6"), "/mock-checkout/LayoutTests/platform/chromium-mac-snowleopard")
 
     def test_rebaseline_updates_expectations_file_noop(self):
         self._zero_out_test_expectations()
@@ -105,12 +106,12 @@
         self.options.suffixes = "png,wav,txt"
         self.command._rebaseline_test_and_update_expectations(self.options)
 
-        self.assertEquals(self.tool.web.urls_fetched,
+        self.assertItemsEqual(self.tool.web.urls_fetched,
             [self.WEB_PREFIX + '/userscripts/another-test-actual.png',
              self.WEB_PREFIX + '/userscripts/another-test-actual.wav',
              self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
         new_expectations = self._read(self.lion_expectations_path)
-        self.assertEqual(new_expectations, """Bug(B) [ Mac Linux XP Debug ] fast/dom/Window/window-postmessage-clone-really-deep-array.html [ Pass ]
+        self.assertMultiLineEqual(new_expectations, """Bug(B) [ Mac Linux XP Debug ] fast/dom/Window/window-postmessage-clone-really-deep-array.html [ Pass ]
 Bug(A) [ Debug ] : fast/css/large-list-of-rules-crash.html [ Failure ]
 """)
 
@@ -121,12 +122,12 @@
         self.options.suffixes = 'png,wav,txt'
         self.command._rebaseline_test_and_update_expectations(self.options)
 
-        self.assertEquals(self.tool.web.urls_fetched,
+        self.assertItemsEqual(self.tool.web.urls_fetched,
             [self.WEB_PREFIX + '/userscripts/another-test-actual.png',
              self.WEB_PREFIX + '/userscripts/another-test-actual.wav',
              self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
         new_expectations = self._read(self.lion_expectations_path)
-        self.assertEqual(new_expectations, "Bug(x) [ MountainLion SnowLeopard ] userscripts/another-test.html [ ImageOnlyFailure ]\nbug(z) [ Linux ] userscripts/another-test.html [ ImageOnlyFailure ]\n")
+        self.assertMultiLineEqual(new_expectations, "Bug(x) [ MountainLion SnowLeopard ] userscripts/another-test.html [ ImageOnlyFailure ]\nbug(z) [ Linux ] userscripts/another-test.html [ ImageOnlyFailure ]\n")
 
     def test_rebaseline_does_not_include_overrides(self):
         self._write(self.lion_expectations_path, "Bug(x) [ Mac ] userscripts/another-test.html [ ImageOnlyFailure ]\nBug(z) [ Linux ] userscripts/another-test.html [ ImageOnlyFailure ]\n")
@@ -136,23 +137,23 @@
         self.options.suffixes = 'png,wav,txt'
         self.command._rebaseline_test_and_update_expectations(self.options)
 
-        self.assertEquals(self.tool.web.urls_fetched,
+        self.assertItemsEqual(self.tool.web.urls_fetched,
             [self.WEB_PREFIX + '/userscripts/another-test-actual.png',
              self.WEB_PREFIX + '/userscripts/another-test-actual.wav',
              self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
 
         new_expectations = self._read(self.lion_expectations_path)
-        self.assertEqual(new_expectations, "Bug(x) [ MountainLion SnowLeopard ] userscripts/another-test.html [ ImageOnlyFailure ]\nBug(z) [ Linux ] userscripts/another-test.html [ ImageOnlyFailure ]\n")
+        self.assertMultiLineEqual(new_expectations, "Bug(x) [ MountainLion SnowLeopard ] userscripts/another-test.html [ ImageOnlyFailure ]\nBug(z) [ Linux ] userscripts/another-test.html [ ImageOnlyFailure ]\n")
 
     def test_rebaseline_test(self):
         self.command._rebaseline_test("WebKit Linux", "userscripts/another-test.html", None, "txt", self.WEB_PREFIX)
-        self.assertEquals(self.tool.web.urls_fetched, [self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
+        self.assertItemsEqual(self.tool.web.urls_fetched, [self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
 
     def test_rebaseline_test_with_results_directory(self):
         self._write(self.lion_expectations_path, "Bug(x) [ Mac ] userscripts/another-test.html [ ImageOnlyFailure ]\nbug(z) [ Linux ] userscripts/another-test.html [ ImageOnlyFailure ]\n")
         self.options.results_directory = '/tmp'
         self.command._rebaseline_test_and_update_expectations(self.options)
-        self.assertEquals(self.tool.web.urls_fetched, ['file:///tmp/userscripts/another-test-actual.txt'])
+        self.assertItemsEqual(self.tool.web.urls_fetched, ['file:///tmp/userscripts/another-test-actual.txt'])
 
     def test_rebaseline_test_and_print_scm_changes(self):
         self.command._print_scm_changes = True
@@ -161,20 +162,20 @@
 
         self.command._rebaseline_test("WebKit Linux", "userscripts/another-test.html", None, "txt", None)
 
-        self.assertEquals(self.command._scm_changes, {'add': ['/mock-checkout/LayoutTests/platform/chromium-linux/userscripts/another-test-expected.txt'], 'delete': []})
+        self.assertDictEqual(self.command._scm_changes, {'add': ['/mock-checkout/LayoutTests/platform/chromium-linux/userscripts/another-test-expected.txt'], 'delete': []})
 
     def test_rebaseline_and_copy_test(self):
         self._write("userscripts/another-test-expected.txt", "generic result")
 
         self.command._rebaseline_test("WebKit Mac10.7", "userscripts/another-test.html", ["chromium-mac-snowleopard"], "txt", None)
 
-        self.assertEquals(self._read('platform/chromium-mac-lion/userscripts/another-test-expected.txt'), self.MOCK_WEB_RESULT)
-        self.assertEquals(self._read('platform/chromium-mac-snowleopard/userscripts/another-test-expected.txt'), 'generic result')
+        self.assertMultiLineEqual(self._read('platform/chromium-mac-lion/userscripts/another-test-expected.txt'), self.MOCK_WEB_RESULT)
+        self.assertMultiLineEqual(self._read('platform/chromium-mac-snowleopard/userscripts/another-test-expected.txt'), 'generic result')
 
     def test_rebaseline_and_copy_test_no_existing_result(self):
         self.command._rebaseline_test("WebKit Mac10.7", "userscripts/another-test.html", ["chromium-mac-snowleopard"], "txt", None)
 
-        self.assertEquals(self._read('platform/chromium-mac-lion/userscripts/another-test-expected.txt'), self.MOCK_WEB_RESULT)
+        self.assertMultiLineEqual(self._read('platform/chromium-mac-lion/userscripts/another-test-expected.txt'), self.MOCK_WEB_RESULT)
         self.assertFalse(self.tool.filesystem.exists(self._expand('platform/chromium-mac-snowleopard/userscripts/another-test-expected.txt')))
 
     def test_rebaseline_and_copy_test_with_lion_result(self):
@@ -182,9 +183,9 @@
 
         self.command._rebaseline_test("WebKit Mac10.7", "userscripts/another-test.html", ["chromium-mac-snowleopard"], "txt", self.WEB_PREFIX)
 
-        self.assertEquals(self.tool.web.urls_fetched, [self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
-        self.assertEquals(self._read("platform/chromium-mac-snowleopard/userscripts/another-test-expected.txt"), "original lion result")
-        self.assertEquals(self._read("platform/chromium-mac-lion/userscripts/another-test-expected.txt"), self.MOCK_WEB_RESULT)
+        self.assertItemsEqual(self.tool.web.urls_fetched, [self.WEB_PREFIX + '/userscripts/another-test-actual.txt'])
+        self.assertMultiLineEqual(self._read("platform/chromium-mac-snowleopard/userscripts/another-test-expected.txt"), "original lion result")
+        self.assertMultiLineEqual(self._read("platform/chromium-mac-lion/userscripts/another-test-expected.txt"), self.MOCK_WEB_RESULT)
 
     def test_rebaseline_and_copy_no_overwrite_test(self):
         self._write("platform/chromium-mac-lion/userscripts/another-test-expected.txt", "original lion result")
@@ -192,8 +193,8 @@
 
         self.command._rebaseline_test("WebKit Mac10.7", "userscripts/another-test.html", ["chromium-mac-snowleopard"], "txt", None)
 
-        self.assertEquals(self._read("platform/chromium-mac-snowleopard/userscripts/another-test-expected.txt"), "original snowleopard result")
-        self.assertEquals(self._read("platform/chromium-mac-lion/userscripts/another-test-expected.txt"), self.MOCK_WEB_RESULT)
+        self.assertMultiLineEqual(self._read("platform/chromium-mac-snowleopard/userscripts/another-test-expected.txt"), "original snowleopard result")
+        self.assertMultiLineEqual(self._read("platform/chromium-mac-lion/userscripts/another-test-expected.txt"), self.MOCK_WEB_RESULT)
 
     def test_rebaseline_test_internal_with_move_overwritten_baselines_to(self):
         self.tool.executive = MockExecutive2()
@@ -220,8 +221,8 @@
             out, _, _ = oc.restore_output()
             builders._exact_matches = old_exact_matches
 
-        self.assertEquals(self._read(self.tool.filesystem.join(port.layout_tests_dir(), 'platform/test-mac-leopard/failures/expected/image-expected.txt')), 'original snowleopard result')
-        self.assertEquals(out, '{"add": []}\n')
+        self.assertMultiLineEqual(self._read(self.tool.filesystem.join(port.layout_tests_dir(), 'platform/test-mac-leopard/failures/expected/image-expected.txt')), 'original snowleopard result')
+        self.assertMultiLineEqual(out, '{"add": []}\n')
 
 
 class TestRebaselineJson(_BaseTestCase):
@@ -246,7 +247,7 @@
         self.command._rebaseline(options,  {"user-scripts/another-test.html": {"MOCK builder": ["txt", "png"]}})
 
         # Note that we have one run_in_parallel() call followed by a run_command()
-        self.assertEquals(self.tool.executive.calls,
+        self.assertEqual(self.tool.executive.calls,
             [[['echo', 'rebaseline-test-internal', '--suffixes', 'txt,png', '--builder', 'MOCK builder', '--test', 'user-scripts/another-test.html', '--verbose']],
              ['echo', '--verbose', 'optimize-baselines', '--suffixes', 'txt,png', 'user-scripts/another-test.html']])
 
@@ -255,7 +256,7 @@
         self.command._rebaseline(options,  {"user-scripts/another-test.html": {"MOCK builder (Debug)": ["txt", "png"]}})
 
         # Note that we have one run_in_parallel() call followed by a run_command()
-        self.assertEquals(self.tool.executive.calls,
+        self.assertEqual(self.tool.executive.calls,
             [[['echo', 'rebaseline-test-internal', '--suffixes', 'txt,png', '--builder', 'MOCK builder (Debug)', '--test', 'user-scripts/another-test.html', '--verbose']],
              ['echo', '--verbose', 'optimize-baselines', '--suffixes', 'txt,png', 'user-scripts/another-test.html']])
 
@@ -264,7 +265,7 @@
         self.command._rebaseline(options,  {"user-scripts/another-test.html": {"MOCK builder": ["txt", "png"]}})
 
         # Note that we have one run_in_parallel() call followed by a run_command()
-        self.assertEquals(self.tool.executive.calls,
+        self.assertEqual(self.tool.executive.calls,
             [[['echo', 'rebaseline-test-internal', '--suffixes', 'txt,png', '--builder', 'MOCK builder', '--test', 'user-scripts/another-test.html', '--move-overwritten-baselines-to', 'test-mac-leopard', '--verbose']],
              ['echo', '--verbose', 'optimize-baselines', '--suffixes', 'txt,png', 'user-scripts/another-test.html']])
 
@@ -273,7 +274,7 @@
         self.command._rebaseline(options,  {"user-scripts/another-test.html": {"MOCK builder (Debug)": ["txt", "png"]}})
 
         # Note that we have only one run_in_parallel() call
-        self.assertEquals(self.tool.executive.calls,
+        self.assertEqual(self.tool.executive.calls,
             [[['echo', 'rebaseline-test-internal', '--suffixes', 'txt,png', '--builder', 'MOCK builder (Debug)', '--test', 'user-scripts/another-test.html', '--verbose']]])
 
     def test_results_directory(self):
@@ -281,7 +282,7 @@
         self.command._rebaseline(options,  {"user-scripts/another-test.html": {"MOCK builder": ["txt", "png"]}})
 
         # Note that we have only one run_in_parallel() call
-        self.assertEquals(self.tool.executive.calls,
+        self.assertEqual(self.tool.executive.calls,
             [[['echo', 'rebaseline-test-internal', '--suffixes', 'txt,png', '--builder', 'MOCK builder', '--test', 'user-scripts/another-test.html', '--results-directory', '/tmp', '--verbose']]])
 
 
@@ -313,7 +314,7 @@
             builders._exact_matches = old_exact_matches
 
         calls = filter(lambda x: x != ['qmake', '-v'] and x[0] != 'perl', self.tool.executive.calls)
-        self.assertEquals(calls,
+        self.assertEqual(calls,
             [[['echo', 'rebaseline-test-internal', '--suffixes', 'txt,png', '--builder', 'MOCK builder', '--test', 'mock/path/to/test.html', '--verbose']]])
 
 
@@ -335,8 +336,8 @@
 
         # FIXME: change this to use the test- ports.
         calls = filter(lambda x: x != ['qmake', '-v'], self.tool.executive.calls)
-        self.assertTrue(len(calls) == 1)
-        self.assertTrue(len(calls[0]) == 26)
+        self.assertEqual(len(calls), 1)
+        self.assertEqual(len(calls[0]), 36)
 
     def test_rebaseline_expectations_noop(self):
         self._zero_out_test_expectations()
@@ -347,8 +348,8 @@
             self.command.execute(self.options, [], self.tool)
         finally:
             _, _, logs = oc.restore_output()
-            self.assertEquals(self.tool.filesystem.written_files, {})
-            self.assertEquals(logs, 'Did not find any tests marked Rebaseline.\n')
+            self.assertEqual(self.tool.filesystem.written_files, {})
+            self.assertEqual(logs, 'Did not find any tests marked Rebaseline.\n')
 
     def disabled_test_overrides_are_included_correctly(self):
         # This tests that the any tests marked as REBASELINE in the overrides are found, but
@@ -362,8 +363,8 @@
                           'Bug(y) userscripts/test.html [ Crash ]\n')}
         self._write('/userscripts/another-test.html', '')
 
-        self.assertEquals(self.command._tests_to_rebaseline(self.lion_port), {'userscripts/another-test.html': set(['png', 'txt', 'wav'])})
-        self.assertEquals(self._read(self.lion_expectations_path), '')
+        self.assertDictEqual(self.command._tests_to_rebaseline(self.lion_port), {'userscripts/another-test.html': set(['png', 'txt', 'wav'])})
+        self.assertEqual(self._read(self.lion_expectations_path), '')
 
 
 class _FakeOptimizer(BaselineOptimizer):
@@ -383,18 +384,18 @@
         self.tool.port_factory.get = (lambda port_name=None, options=None: self.port)
         self.lines = []
         self.command._optimizer_class = _FakeOptimizer
-        self.command._write = (lambda msg: self.lines.append(msg))  # pylint bug warning about unnecessary lambda? pylint: disable-msg=W0108
+        self.command._write = (lambda msg: self.lines.append(msg))  # pylint bug warning about unnecessary lambda? pylint: disable=W0108
 
     def test_default(self):
         self.command.execute(MockOptions(suffixes='txt', missing=False, platform=None), ['passes/text.html'], self.tool)
-        self.assertEquals(self.lines,
+        self.assertEqual(self.lines,
             ['passes/text-expected.txt:',
              '  (generic): 123456',
              '  test-mac-leopard: abcdef'])
 
     def test_missing_baselines(self):
         self.command.execute(MockOptions(suffixes='png,txt', missing=True, platform=None), ['passes/text.html'], self.tool)
-        self.assertEquals(self.lines,
+        self.assertEqual(self.lines,
             ['passes/text-expected.png: (no baselines found)',
              'passes/text-expected.txt:',
              '  (generic): 123456',
diff --git a/Tools/Scripts/webkitpy/tool/commands/roll.py b/Tools/Scripts/webkitpy/tool/commands/roll.py
index 37481b2..8237319 100644
--- a/Tools/Scripts/webkitpy/tool/commands/roll.py
+++ b/Tools/Scripts/webkitpy/tool/commands/roll.py
@@ -31,10 +31,12 @@
 from webkitpy.tool import steps
 
 
+default_changelog_message = "Unreviewed.  Rolled DEPS.\n\n"
+
 class RollChromiumDEPS(AbstractSequencedCommand):
     name = "roll-chromium-deps"
-    help_text = "Updates Chromium DEPS (defaults to the last-known good revision of Chromium)"
-    argument_names = "[CHROMIUM_REVISION]"
+    help_text = "Updates Chromium DEPS (LKGR as the revision will use the last-known good revision of Chromium)"
+    argument_names = "CHROMIUM_REVISION"
     steps = [
         steps.UpdateChromiumDEPS,
         steps.PrepareChangeLogForDEPSRoll,
@@ -45,13 +47,14 @@
     def _prepare_state(self, options, args, tool):
         return {
             "chromium_revision": (args and args[0]),
+            "changelog_message": default_changelog_message,
         }
 
 
 class PostChromiumDEPSRoll(AbstractSequencedCommand):
     name = "post-chromium-deps-roll"
-    help_text = "Posts a patch to update Chromium DEPS (revision defaults to the last-known good revision of Chromium)"
-    argument_names = "CHROMIUM_REVISION CHROMIUM_REVISION_NAME"
+    help_text = "Posts a patch to update Chromium DEPS (LKGR as the revision will use the last-known good revision of Chromium)"
+    argument_names = "CHROMIUM_REVISION CHROMIUM_REVISION_NAME [CHANGELOG_MESSAGE]"
     steps = [
         steps.CleanWorkingDirectory,
         steps.Update,
@@ -67,8 +70,10 @@
 
         chromium_revision = args[0]
         chromium_revision_name = args[1]
+        changelog_message = args[2] if len(args) >= 3 else default_changelog_message
         return {
             "chromium_revision": chromium_revision,
+            "changelog_message": changelog_message,
             "bug_title": "Roll Chromium DEPS to %s" % chromium_revision_name,
             "bug_description": "A DEPS roll a day keeps the build break away.",
         }
diff --git a/Tools/Scripts/webkitpy/tool/commands/roll_unittest.py b/Tools/Scripts/webkitpy/tool/commands/roll_unittest.py
index 800bc5b..9e805dd 100644
--- a/Tools/Scripts/webkitpy/tool/commands/roll_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/roll_unittest.py
@@ -34,20 +34,21 @@
 
 class RollCommandsTest(CommandsTest):
     def test_update_chromium_deps(self):
-        expected_stderr = """Updating Chromium DEPS to 6764
+        expected_logs = """Updating Chromium DEPS to 6764
 MOCK: MockDEPS.write_variable(chromium_rev, 6764)
 MOCK: user.open_url: file://...
 Was that diff correct?
 Committed r49824: <http://trac.webkit.org/changeset/49824>
 """
-        self.assert_execute_outputs(RollChromiumDEPS(), [6764], expected_stderr=expected_stderr)
+        options = MockOptions(non_interactive=False)
+        self.assert_execute_outputs(RollChromiumDEPS(), [6764], options=options, expected_logs=expected_logs)
 
     def test_update_chromium_deps_older_revision(self):
         options = MockOptions(non_interactive=False)
-        expected_stderr = """Current Chromium DEPS revision 6564 is newer than 5764.
-ERROR: Unable to update Chromium DEPS
+        expected_logs = """Current Chromium DEPS revision 6564 is newer than 5764.
+Unable to update Chromium DEPS.
 """
-        self.assert_execute_outputs(RollChromiumDEPS(), [5764], options=options, expected_stderr=expected_stderr, expected_exception=SystemExit)
+        self.assert_execute_outputs(RollChromiumDEPS(), [5764], options=options, expected_logs=expected_logs, expected_exception=SystemExit)
 
 
 class PostRollCommandsTest(CommandsTest):
@@ -56,8 +57,10 @@
         options = MockOptions()
         tool = MockTool()
         lkgr_state = postroll._prepare_state(options, [None, "last-known good revision"], tool)
-        self.assertEquals(None, lkgr_state["chromium_revision"])
-        self.assertEquals("Roll Chromium DEPS to last-known good revision", lkgr_state["bug_title"])
-        revision_state = postroll._prepare_state(options, ["1234", "r1234"], tool)
-        self.assertEquals("1234", revision_state["chromium_revision"])
-        self.assertEquals("Roll Chromium DEPS to r1234", revision_state["bug_title"])
+        self.assertIsNone(lkgr_state["chromium_revision"])
+        self.assertEqual("Roll Chromium DEPS to last-known good revision", lkgr_state["bug_title"])
+        self.assertEqual("Unreviewed.  Rolled DEPS.\n\n", lkgr_state["changelog_message"])
+        revision_state = postroll._prepare_state(options, ["1234", "r1234", "test message"], tool)
+        self.assertEqual("1234", revision_state["chromium_revision"])
+        self.assertEqual("Roll Chromium DEPS to r1234", revision_state["bug_title"])
+        self.assertEqual("test message", revision_state["changelog_message"])
diff --git a/Tools/Scripts/webkitpy/tool/commands/sheriffbot.py b/Tools/Scripts/webkitpy/tool/commands/sheriffbot.py
index d30da39..0f91be3 100644
--- a/Tools/Scripts/webkitpy/tool/commands/sheriffbot.py
+++ b/Tools/Scripts/webkitpy/tool/commands/sheriffbot.py
@@ -26,13 +26,16 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.common.system.deprecated_logging import log
+import logging
+
 from webkitpy.tool.bot.sheriff import Sheriff
 from webkitpy.tool.bot.irc_command import commands as irc_commands
 from webkitpy.tool.bot.ircbot import IRCBot
 from webkitpy.tool.commands.queues import AbstractQueue
 from webkitpy.tool.commands.stepsequence import StepSequenceErrorHandler
 
+_log = logging.getLogger(__name__)
+
 
 class SheriffBot(AbstractQueue, StepSequenceErrorHandler):
     name = "sheriff-bot"
@@ -63,7 +66,7 @@
         return True
 
     def handle_unexpected_error(self, failure_map, message):
-        log(message)
+        _log.error(message)
 
     # StepSequenceErrorHandler methods
 
diff --git a/Tools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py b/Tools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py
index 9aa57b1..bed8c74 100644
--- a/Tools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py
@@ -26,8 +26,31 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.commands.queuestest import QueuesTest
+from webkitpy.tool.commands.queuestest import QueuesTest, MockQueueEngine
+from webkitpy.tool.commands import SheriffBot
+from webkitpy.tool.mocktool import MockTool, MockOptions
+from webkitpy.tool.bot.irc_command import Rollout, Sheriffs
 
 
 class SheriffBotTest(QueuesTest):
-    pass  # No unittests as the moment.
+    def test_command_aliases(self):
+        tool = MockTool()
+        options = MockOptions()
+        options.ensure_value("confirm", False)
+        options.ensure_value("seconds_to_sleep", 120)
+        sheriffbot = SheriffBot()
+        sheriffbot.execute(options, [], tool, MockQueueEngine)
+        sheriffbot.begin_work_queue()
+        irc_bot = sheriffbot._irc_bot
+        # Test Rollout command aliases
+        revert_command, args = irc_bot._parse_command_and_args("revert")
+        self.assertEqual(revert_command, Rollout)
+        # Test Sheriffs command aliases
+        gardeners_command, args = irc_bot._parse_command_and_args("gardeners")
+        self.assertEqual(gardeners_command, Sheriffs)
+        sherifs_command, args = irc_bot._parse_command_and_args("sherifs")
+        self.assertEqual(sherifs_command, Sheriffs)
+        sherrifs_command, args = irc_bot._parse_command_and_args("sherrifs")
+        self.assertEqual(sherrifs_command, Sheriffs)
+        sherriffs_command, args = irc_bot._parse_command_and_args("sherriffs")
+        self.assertEqual(sherriffs_command, Sheriffs)
diff --git a/Tools/Scripts/webkitpy/tool/commands/stepsequence.py b/Tools/Scripts/webkitpy/tool/commands/stepsequence.py
index b666554..1668cdb 100644
--- a/Tools/Scripts/webkitpy/tool/commands/stepsequence.py
+++ b/Tools/Scripts/webkitpy/tool/commands/stepsequence.py
@@ -26,13 +26,16 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool import steps
 
 from webkitpy.common.checkout.scm import CheckoutNeedsUpdate
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.tool.bot.queueengine import QueueEngine
 
+_log = logging.getLogger(__name__)
+
 
 class StepSequenceErrorHandler():
     @classmethod
@@ -69,14 +72,14 @@
         try:
             self._run(tool, options, state)
         except CheckoutNeedsUpdate, e:
-            log("Commit failed because the checkout is out of date.  Please update and try again.")
+            _log.info("Commit failed because the checkout is out of date. Please update and try again.")
             if options.parent_command:
                 command = tool.command_by_name(options.parent_command)
                 command.handle_checkout_needs_update(tool, state, options, e)
             QueueEngine.exit_after_handled_error(e)
         except ScriptError, e:
             if not options.quiet:
-                log(e.message_with_output())
+                _log.error(e.message_with_output())
             if options.parent_command:
                 command = tool.command_by_name(options.parent_command)
                 command.handle_script_error(tool, state, e)
diff --git a/Tools/Scripts/webkitpy/tool/commands/upload.py b/Tools/Scripts/webkitpy/tool/commands/upload.py
index 6b52e6c..d3faa78 100644
--- a/Tools/Scripts/webkitpy/tool/commands/upload.py
+++ b/Tools/Scripts/webkitpy/tool/commands/upload.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # Copyright (c) 2009, 2010 Google Inc. All rights reserved.
 # Copyright (c) 2009 Apple Inc. All rights reserved.
 #
@@ -28,6 +27,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 import os
 import re
 import sys
@@ -38,7 +38,6 @@
 
 from webkitpy.common.checkout.changelog import parse_bug_id_from_changelog
 from webkitpy.common.config.committers import CommitterList
-from webkitpy.common.system.deprecated_logging import error, log
 from webkitpy.common.system.user import User
 from webkitpy.thirdparty.mock import Mock
 from webkitpy.tool.commands.abstractsequencedcommand import AbstractSequencedCommand
@@ -46,6 +45,8 @@
 from webkitpy.tool.grammar import pluralize, join_with_separators
 from webkitpy.tool.multicommandtool import AbstractDeclarativeCommand
 
+_log = logging.getLogger(__name__)
+
 
 class CommitMessageForCurrentDiff(AbstractDeclarativeCommand):
     name = "commit-message"
@@ -133,24 +134,24 @@
         bug = self._tool.bugs.fetch_bug(bug_id)
         if not bug.is_unassigned():
             assigned_to_email = bug.assigned_to_email()
-            log(u"Bug %s is already assigned to %s (%s)." % (bug_id, assigned_to_email, committers.committer_by_email(assigned_to_email)))
+            _log.info(u"Bug %s is already assigned to %s (%s)." % (bug_id, assigned_to_email, committers.committer_by_email(assigned_to_email)))
             return
 
         reviewed_patches = bug.reviewed_patches()
         if not reviewed_patches:
-            log("Bug %s has no non-obsolete patches, ignoring." % bug_id)
+            _log.info("Bug %s has no non-obsolete patches, ignoring." % bug_id)
             return
 
         # We only need to do anything with this bug if one of the r+'d patches does not have a valid committer (cq+ set).
         if self._patches_have_commiters(reviewed_patches):
-            log("All reviewed patches on bug %s already have commit-queue+, ignoring." % bug_id)
+            _log.info("All reviewed patches on bug %s already have commit-queue+, ignoring." % bug_id)
             return
 
         latest_patch = reviewed_patches[-1]
         attacher_email = latest_patch.attacher_email()
         committer = committers.committer_by_email(attacher_email)
         if not committer:
-            log("Attacher %s is not a committer.  Bug %s likely needs commit-queue+." % (attacher_email, bug_id))
+            _log.info("Attacher %s is not a committer.  Bug %s likely needs commit-queue+." % (attacher_email, bug_id))
             return
 
         reassign_message = u"Attachment %s was posted by a committer and has review+, assigning to %s for commit." % (latest_patch.id(), committer.full_name)
@@ -202,7 +203,8 @@
         state = {}
         state["bug_id"] = self._bug_id(options, args, tool, state)
         if not state["bug_id"]:
-            error("No bug id passed and no bug url found in ChangeLogs.")
+            _log.error("No bug id passed and no bug url found in ChangeLogs.")
+            sys.exit(1)
         return state
 
 
@@ -239,6 +241,15 @@
     ]
 
 
+class HasLanded(AbstractPatchUploadingCommand):
+    name = "has-landed"
+    help_text = "Check that the current code was successfully landed and no changes remain."
+    argument_names = "[BUGID]"
+    steps = [
+        steps.HasLanded,
+    ]
+
+
 class Prepare(AbstractSequencedCommand):
     name = "prepare"
     help_text = "Creates a bug (or prompts for an existing bug) and prepares the ChangeLogs"
@@ -322,7 +333,8 @@
     def execute(self, options, args, tool):
         commit_ids = tool.scm().commit_ids_from_commitish_arguments(args)
         if len(commit_ids) > 10: # We could lower this limit, 10 is too many for one bug as-is.
-            error("webkit-patch does not support attaching %s at once.  Are you sure you passed the right commit range?" % (pluralize("patch", len(commit_ids))))
+            _log.error("webkit-patch does not support attaching %s at once.  Are you sure you passed the right commit range?" % (pluralize("patch", len(commit_ids))))
+            sys.exit(1)
 
         have_obsoleted_patches = set()
         for commit_id in commit_ids:
@@ -331,7 +343,7 @@
             # Prefer --bug-id=, then a bug url in the commit message, then a bug url in the entire commit diff (i.e. ChangeLogs).
             bug_id = options.bug_id or parse_bug_id_from_changelog(commit_message.message()) or parse_bug_id_from_changelog(tool.scm().create_patch(git_commit=commit_id))
             if not bug_id:
-                log("Skipping %s: No bug id found in commit or specified with --bug-id." % commit_id)
+                _log.info("Skipping %s: No bug id found in commit or specified with --bug-id." % commit_id)
                 continue
 
             if options.obsolete_patches and bug_id not in have_obsoleted_patches:
@@ -382,8 +394,9 @@
                 not_found.append("bug id")
             if not svn_revision:
                 not_found.append("svn revision")
-            error("Could not find %s on command-line or in %s."
+            _log.error("Could not find %s on command-line or in %s."
                   % (" or ".join(not_found), "r%s" % svn_revision if svn_revision else "last commit"))
+            sys.exit(1)
 
         return (bug_id, svn_revision)
 
@@ -395,15 +408,16 @@
             if re.match("^r[0-9]+$", svn_revision, re.IGNORECASE):
                 svn_revision = svn_revision[1:]
             if not re.match("^[0-9]+$", svn_revision):
-                error("Invalid svn revision: '%s'" % svn_revision)
+                _log.error("Invalid svn revision: '%s'" % svn_revision)
+                sys.exit(1)
 
         needs_prompt = False
         if not bug_id or not svn_revision:
             needs_prompt = True
             (bug_id, svn_revision) = self._determine_bug_id_and_svn_revision(tool, bug_id, svn_revision)
 
-        log("Bug: <%s> %s" % (tool.bugs.bug_url_for_bug_id(bug_id), tool.bugs.fetch_bug_dictionary(bug_id)["title"]))
-        log("Revision: %s" % svn_revision)
+        _log.info("Bug: <%s> %s" % (tool.bugs.bug_url_for_bug_id(bug_id), tool.bugs.fetch_bug_dictionary(bug_id)["title"]))
+        _log.info("Revision: %s" % svn_revision)
 
         if options.open_bug:
             tool.user.open_url(tool.bugs.bug_url_for_bug_id(bug_id))
@@ -417,10 +431,10 @@
             bug_comment = "%s\n\n%s" % (options.comment, bug_comment)
 
         if options.update_only:
-            log("Adding comment to Bug %s." % bug_id)
+            _log.info("Adding comment to Bug %s." % bug_id)
             tool.bugs.post_comment_to_bug(bug_id, bug_comment)
         else:
-            log("Adding comment to Bug %s and marking as Resolved/Fixed." % bug_id)
+            _log.info("Adding comment to Bug %s and marking as Resolved/Fixed." % bug_id)
             tool.bugs.close_bug_as_fixed(bug_id, bug_comment)
 
 
@@ -443,7 +457,8 @@
     def create_bug_from_commit(self, options, args, tool):
         commit_ids = tool.scm().commit_ids_from_commitish_arguments(args)
         if len(commit_ids) > 3:
-            error("Are you sure you want to create one bug with %s patches?" % len(commit_ids))
+            _log.error("Are you sure you want to create one bug with %s patches?" % len(commit_ids))
+            sys.exit(1)
 
         commit_id = commit_ids[0]
 
@@ -499,7 +514,8 @@
     def execute(self, options, args, tool):
         if len(args):
             if (not tool.scm().supports_local_commits()):
-                error("Extra arguments not supported; patch is taken from working directory.")
+                _log.error("Extra arguments not supported; patch is taken from working directory.")
+                sys.exit(1)
             self.create_bug_from_commit(options, args, tool)
         else:
             self.create_bug_from_patch(options, args, tool)
diff --git a/Tools/Scripts/webkitpy/tool/commands/upload_unittest.py b/Tools/Scripts/webkitpy/tool/commands/upload_unittest.py
index 185bb97..ad1b591 100644
--- a/Tools/Scripts/webkitpy/tool/commands/upload_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/commands/upload_unittest.py
@@ -42,7 +42,7 @@
 
     def test_assign_to_committer(self):
         tool = MockTool()
-        expected_stderr = """Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)
+        expected_logs = """Warning, attachment 10001 on bug 50000 has invalid committer (non-committer@example.com)
 MOCK reassign_bug: bug_id=50000, assignee=eric@webkit.org
 -- Begin comment --
 Attachment 10001 was posted by a committer and has review+, assigning to Eric Seidel for commit.
@@ -50,11 +50,11 @@
 Bug 50003 is already assigned to foo@foo.com (None).
 Bug 50002 has no non-obsolete patches, ignoring.
 """
-        self.assert_execute_outputs(AssignToCommitter(), [], expected_stderr=expected_stderr, tool=tool)
+        self.assert_execute_outputs(AssignToCommitter(), [], expected_logs=expected_logs, tool=tool)
 
     def test_obsolete_attachments(self):
-        expected_stderr = "Obsoleting 2 old patches on bug 50000\n"
-        self.assert_execute_outputs(ObsoleteAttachments(), [50000], expected_stderr=expected_stderr)
+        expected_logs = "Obsoleting 2 old patches on bug 50000\n"
+        self.assert_execute_outputs(ObsoleteAttachments(), [50000], expected_logs=expected_logs)
 
     def test_post(self):
         options = MockOptions()
@@ -66,44 +66,46 @@
         options.request_commit = False
         options.review = True
         options.suggest_reviewers = False
-        expected_stderr = """MOCK: user.open_url: file://...
+        expected_logs = """MOCK: user.open_url: file://...
 Was that diff correct?
 Obsoleting 2 old patches on bug 50000
 MOCK reassign_bug: bug_id=50000, assignee=None
 MOCK add_patch_to_bug: bug_id=50000, description=MOCK description, mark_for_review=True, mark_for_commit_queue=False, mark_for_landing=False
 MOCK: user.open_url: http://example.com/50000
 """
-        self.assert_execute_outputs(Post(), [50000], options=options, expected_stderr=expected_stderr)
+        self.assert_execute_outputs(Post(), [50000], options=options, expected_logs=expected_logs)
 
     def test_attach_to_bug(self):
         options = MockOptions()
         options.comment = "extra comment"
         options.description = "file description"
-        expected_stderr = """MOCK add_attachment_to_bug: bug_id=50000, description=file description filename=None mimetype=None
+        expected_logs = """MOCK add_attachment_to_bug: bug_id=50000, description=file description filename=None mimetype=None
 -- Begin comment --
 extra comment
 -- End comment --
 """
-        self.assert_execute_outputs(AttachToBug(), [50000, "path/to/file.txt", "file description"], options=options, expected_stderr=expected_stderr)
+        self.assert_execute_outputs(AttachToBug(), [50000, "path/to/file.txt", "file description"], options=options, expected_logs=expected_logs)
 
     def test_attach_to_bug_no_description_or_comment(self):
         options = MockOptions()
         options.comment = None
         options.description = None
-        expected_stderr = """MOCK add_attachment_to_bug: bug_id=50000, description=file.txt filename=None mimetype=None
-"""
-        self.assert_execute_outputs(AttachToBug(), [50000, "path/to/file.txt"], options=options, expected_stderr=expected_stderr)
+        expected_logs = "MOCK add_attachment_to_bug: bug_id=50000, description=file.txt filename=None mimetype=None\n"
+        self.assert_execute_outputs(AttachToBug(), [50000, "path/to/file.txt"], options=options, expected_logs=expected_logs)
 
     def test_land_safely(self):
-        expected_stderr = "Obsoleting 2 old patches on bug 50000\nMOCK reassign_bug: bug_id=50000, assignee=None\nMOCK add_patch_to_bug: bug_id=50000, description=Patch for landing, mark_for_review=False, mark_for_commit_queue=False, mark_for_landing=True\n"
-        self.assert_execute_outputs(LandSafely(), [50000], expected_stderr=expected_stderr)
+        expected_logs = """Obsoleting 2 old patches on bug 50000
+MOCK reassign_bug: bug_id=50000, assignee=None
+MOCK add_patch_to_bug: bug_id=50000, description=Patch for landing, mark_for_review=False, mark_for_commit_queue=False, mark_for_landing=True
+"""
+        self.assert_execute_outputs(LandSafely(), [50000], expected_logs=expected_logs)
 
     def test_prepare_diff_with_arg(self):
         self.assert_execute_outputs(Prepare(), [50000])
 
     def test_prepare(self):
-        expected_stderr = "MOCK create_bug\nbug_title: Mock user response\nbug_description: Mock user response\ncomponent: MOCK component\ncc: MOCK cc\n"
-        self.assert_execute_outputs(Prepare(), [], expected_stderr=expected_stderr)
+        expected_logs = "MOCK create_bug\nbug_title: Mock user response\nbug_description: Mock user response\ncomponent: MOCK component\ncc: MOCK cc\n"
+        self.assert_execute_outputs(Prepare(), [], expected_logs=expected_logs)
 
     def test_upload(self):
         options = MockOptions()
@@ -115,14 +117,14 @@
         options.request_commit = False
         options.review = True
         options.suggest_reviewers = False
-        expected_stderr = """MOCK: user.open_url: file://...
+        expected_logs = """MOCK: user.open_url: file://...
 Was that diff correct?
 Obsoleting 2 old patches on bug 50000
 MOCK reassign_bug: bug_id=50000, assignee=None
 MOCK add_patch_to_bug: bug_id=50000, description=MOCK description, mark_for_review=True, mark_for_commit_queue=False, mark_for_landing=False
 MOCK: user.open_url: http://example.com/50000
 """
-        self.assert_execute_outputs(Upload(), [50000], options=options, expected_stderr=expected_stderr)
+        self.assert_execute_outputs(Upload(), [50000], options=options, expected_logs=expected_logs)
 
     def test_mark_bug_fixed(self):
         tool = MockTool()
@@ -130,7 +132,7 @@
         options = Mock()
         options.bug_id = 50000
         options.comment = "MOCK comment"
-        expected_stderr = """Bug: <http://example.com/50000> Bug with two r+'d and cq+'d patches, one of which has an invalid commit-queue setter.
+        expected_logs = """Bug: <http://example.com/50000> Bug with two r+'d and cq+'d patches, one of which has an invalid commit-queue setter.
 Revision: 9876
 MOCK: user.open_url: http://example.com/50000
 Is this correct?
@@ -143,7 +145,7 @@
 --- End comment ---
 
 """
-        self.assert_execute_outputs(MarkBugFixed(), [], expected_stderr=expected_stderr, tool=tool, options=options)
+        self.assert_execute_outputs(MarkBugFixed(), [], expected_logs=expected_logs, tool=tool, options=options)
 
     def test_edit_changelog(self):
         self.assert_execute_outputs(EditChangeLogs(), [])
diff --git a/Tools/Scripts/webkitpy/tool/comments.py b/Tools/Scripts/webkitpy/tool/comments.py
old mode 100755
new mode 100644
diff --git a/Tools/Scripts/webkitpy/tool/grammar_unittest.py b/Tools/Scripts/webkitpy/tool/grammar_unittest.py
index cab71db..dd8081f 100644
--- a/Tools/Scripts/webkitpy/tool/grammar_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/grammar_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.tool.grammar import join_with_separators
 
@@ -36,6 +36,3 @@
         self.assertEqual(join_with_separators(["one"]), "one")
         self.assertEqual(join_with_separators(["one", "two"]), "one and two")
         self.assertEqual(join_with_separators(["one", "two", "three"]), "one, two, and three")
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/tool/main.py b/Tools/Scripts/webkitpy/tool/main.py
old mode 100755
new mode 100644
index 68348a0..3fa6e6b
--- a/Tools/Scripts/webkitpy/tool/main.py
+++ b/Tools/Scripts/webkitpy/tool/main.py
@@ -48,6 +48,7 @@
         make_option("--status-host", action="store", dest="status_host", type="string", help="Hostname (e.g. localhost or commit.webkit.org) where status updates should be posted."),
         make_option("--bot-id", action="store", dest="bot_id", type="string", help="Identifier for this bot (if multiple bots are running for a queue)"),
         make_option("--irc-password", action="store", dest="irc_password", type="string", help="Password to use when communicating via IRC."),
+        make_option("--seconds-to-sleep", action="store", default=120, type="int", help="Number of seconds to sleep in the task queue."),
         make_option("--port", action="store", dest="port", default=None, help="Specify a port (e.g., mac, qt, gtk, ...)."),
     ]
 
@@ -61,8 +62,7 @@
         self._irc = None
         self._deprecated_port = None
 
-    # FIXME: Rename this deprecated_port()
-    def port(self):
+    def deprecated_port(self):
         return self._deprecated_port
 
     def path(self):
diff --git a/Tools/Scripts/webkitpy/tool/mocktool.py b/Tools/Scripts/webkitpy/tool/mocktool.py
index b8f0976..8afaea9 100644
--- a/Tools/Scripts/webkitpy/tool/mocktool.py
+++ b/Tools/Scripts/webkitpy/tool/mocktool.py
@@ -71,7 +71,7 @@
         self.irc_password = "MOCK irc password"
         self.wakeup_event = threading.Event()
 
-    def port(self):
+    def deprecated_port(self):
         return self._deprecated_port
 
     def path(self):
diff --git a/Tools/Scripts/webkitpy/tool/mocktool_unittest.py b/Tools/Scripts/webkitpy/tool/mocktool_unittest.py
index cceaa2e..35fdd3a 100644
--- a/Tools/Scripts/webkitpy/tool/mocktool_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/mocktool_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from mocktool import MockOptions
 
@@ -53,7 +53,3 @@
         # Test that keyword arguments work in the constructor.
         options = MockOptions(foo='bar')
         self.assertEqual(options.foo, 'bar')
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/tool/multicommandtool.py b/Tools/Scripts/webkitpy/tool/multicommandtool.py
index 38c410c..e2f91a7 100644
--- a/Tools/Scripts/webkitpy/tool/multicommandtool.py
+++ b/Tools/Scripts/webkitpy/tool/multicommandtool.py
@@ -31,12 +31,14 @@
 # which are called with the following format:
 # tool-name [global options] command-name [command options]
 
+import logging
 import sys
 
 from optparse import OptionParser, IndentedHelpFormatter, SUPPRESS_USAGE, make_option
 
 from webkitpy.tool.grammar import pluralize
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class TryAgain(Exception):
@@ -109,13 +111,13 @@
 
     def check_arguments_and_execute(self, options, args, tool=None):
         if len(args) < len(self.required_arguments):
-            log("%s required, %s provided.  Provided: %s  Required: %s\nSee '%s help %s' for usage." % (
-                pluralize("argument", len(self.required_arguments)),
-                pluralize("argument", len(args)),
-                "'%s'" % " ".join(args),
-                " ".join(self.required_arguments),
-                tool.name(),
-                self.name))
+            _log.error("%s required, %s provided.  Provided: %s  Required: %s\nSee '%s help %s' for usage." % (
+                       pluralize("argument", len(self.required_arguments)),
+                       pluralize("argument", len(args)),
+                       "'%s'" % " ".join(args),
+                       " ".join(self.required_arguments),
+                       tool.name(),
+                       self.name))
             return 1
         return self.execute(options, args, tool) or 0
 
@@ -303,7 +305,7 @@
 
         (should_execute, failure_reason) = self.should_execute_command(command)
         if not should_execute:
-            log(failure_reason)
+            _log.error(failure_reason)
             return 0 # FIXME: Should this really be 0?
 
         while True:
diff --git a/Tools/Scripts/webkitpy/tool/multicommandtool_unittest.py b/Tools/Scripts/webkitpy/tool/multicommandtool_unittest.py
index c19095c..7230235 100644
--- a/Tools/Scripts/webkitpy/tool/multicommandtool_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/multicommandtool_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import sys
-import unittest
+import unittest2 as unittest
 
 from optparse import make_option
 
@@ -81,8 +81,8 @@
 
     def test_required_arguments(self):
         two_required_arguments = TrivialCommand(argument_names="ARG1 ARG2 [ARG3]")
-        expected_missing_args_error = "2 arguments required, 1 argument provided.  Provided: 'foo'  Required: ARG1 ARG2\nSee 'trivial-tool help trivial' for usage.\n"
-        exit_code = OutputCapture().assert_outputs(self, two_required_arguments.check_arguments_and_execute, [None, ["foo"], TrivialTool()], expected_stderr=expected_missing_args_error)
+        expected_logs = "2 arguments required, 1 argument provided.  Provided: 'foo'  Required: ARG1 ARG2\nSee 'trivial-tool help trivial' for usage.\n"
+        exit_code = OutputCapture().assert_outputs(self, two_required_arguments.check_arguments_and_execute, [None, ["foo"], TrivialTool()], expected_logs=expected_logs)
         self.assertEqual(exit_code, 1)
 
 
@@ -171,7 +171,3 @@
         tool = TrivialTool(commands=[command_with_options])
         expected_subcommand_help = "trivial [options]   help text\n\nLONG HELP\n\nOptions:\n  --my_option=MY_OPTION\n\n"
         self._assert_tool_main_outputs(tool, ["tool", "help", "trivial"], expected_subcommand_help)
-
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/Tools/Scripts/webkitpy/tool/servers/gardeningserver.py b/Tools/Scripts/webkitpy/tool/servers/gardeningserver.py
index e89c2a0..6d29f44 100644
--- a/Tools/Scripts/webkitpy/tool/servers/gardeningserver.py
+++ b/Tools/Scripts/webkitpy/tool/servers/gardeningserver.py
@@ -38,21 +38,6 @@
 _log = logging.getLogger(__name__)
 
 
-class BuildCoverageExtrapolator(object):
-    def __init__(self, test_configuration_converter):
-        self._test_configuration_converter = test_configuration_converter
-
-    @memoized
-    def _covered_test_configurations_for_builder_name(self):
-        coverage = {}
-        for builder_name in builders.all_builder_names():
-            coverage[builder_name] = self._test_configuration_converter.to_config_set(builders.coverage_specifiers_for_builder_name(builder_name))
-        return coverage
-
-    def extrapolate_test_configurations(self, builder_name):
-        return self._covered_test_configurations_for_builder_name()[builder_name]
-
-
 class GardeningHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
     def __init__(self, httpd_port, config):
         server_name = ''
@@ -63,12 +48,14 @@
     def url(self, args=None):
         # We can't use urllib.encode() here because that encodes spaces as plus signs and the buildbots don't decode those properly.
         arg_string = ('?' + '&'.join("%s=%s" % (key, urllib.quote(value)) for (key, value) in args.items())) if args else ''
-        return 'file://' + os.path.join(GardeningHTTPRequestHandler.STATIC_FILE_DIRECTORY, 'garden-o-matic.html' + arg_string)
+        return 'http://localhost:8127/garden-o-matic.html' + arg_string
 
 
 class GardeningHTTPRequestHandler(ReflectionHandler):
     STATIC_FILE_NAMES = frozenset()
 
+    STATIC_FILE_EXTENSIONS = ('.js', '.css', '.html', '.gif', '.png', '.ico')
+
     STATIC_FILE_DIRECTORY = os.path.join(
         os.path.dirname(__file__),
         '..',
@@ -83,18 +70,6 @@
     allow_cross_origin_requests = True
     debug_output = ''
 
-    def rollout(self):
-        revision = self.query['revision'][0]
-        reason = self.query['reason'][0]
-        self._run_webkit_patch([
-            'rollout',
-            '--force-clean',
-            '--non-interactive',
-            revision,
-            reason,
-        ])
-        self._serve_text('success')
-
     def ping(self):
         self._serve_text('pong')
 
@@ -139,4 +114,4 @@
                 self._serve_file(fullpath, headers_only=(self.command == 'HEAD'))
                 return
 
-        self._send_response(403)
+        self.send_response(403)
diff --git a/Tools/Scripts/webkitpy/tool/servers/gardeningserver_unittest.py b/Tools/Scripts/webkitpy/tool/servers/gardeningserver_unittest.py
index 9961648..45bd4ee 100644
--- a/Tools/Scripts/webkitpy/tool/servers/gardeningserver_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/servers/gardeningserver_unittest.py
@@ -28,7 +28,7 @@
 
 import json
 import sys
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.layout_tests.models.test_configuration import *
@@ -83,17 +83,6 @@
         print "== End JSON Response =="
 
 
-class BuildCoverageExtrapolatorTest(unittest.TestCase):
-    def test_extrapolate(self):
-        # FIXME: Make this test not rely on actual (not mock) port objects.
-        host = MockHost()
-        port = host.port_factory.get('chromium-win-win7', None)
-        converter = TestConfigurationConverter(port.all_test_configurations(), port.configuration_specifier_macros())
-        extrapolator = BuildCoverageExtrapolator(converter)
-        self.assertEquals(extrapolator.extrapolate_test_configurations("WebKit XP"), set([TestConfiguration(version='xp', architecture='x86', build_type='release')]))
-        self.assertRaises(KeyError, extrapolator.extrapolate_test_configurations, "Potato")
-
-
 class GardeningServerTest(unittest.TestCase):
     def _post_to_path(self, path, body=None, expected_stderr=None, expected_stdout=None, server=None):
         handler = TestGardeningHTTPRequestHandler(server or MockServer())
diff --git a/Tools/Scripts/webkitpy/tool/servers/rebaselineserver_unittest.py b/Tools/Scripts/webkitpy/tool/servers/rebaselineserver_unittest.py
index f5c1cbf..fd19c4d 100644
--- a/Tools/Scripts/webkitpy/tool/servers/rebaselineserver_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/servers/rebaselineserver_unittest.py
@@ -27,7 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import json
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.net import resultsjsonparser_unittest
 from webkitpy.common.host_mock import MockHost
@@ -211,7 +211,7 @@
         server._test_config = get_test_config()
         server._gather_baselines(results_json)
         self.assertEqual(results_json['tests']['svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr.html']['state'], 'needs_rebaseline')
-        self.assertFalse('prototype-chocolate.html' in results_json['tests'])
+        self.assertNotIn('prototype-chocolate.html', results_json['tests'])
 
     def _assertRebaseline(self, test_files, results_files, test_name, baseline_target, baseline_move_to, expected_success, expected_log):
         log = []
@@ -234,7 +234,7 @@
             'fast/text2-actual.txt',
             'fast/text-notactual.txt',
         ))
-        self.assertEqual(
+        self.assertItemsEqual(
             ('text-actual.txt',),
             rebaselineserver._get_actual_result_files(
                 'fast/text.html', test_config))
diff --git a/Tools/Scripts/webkitpy/tool/servers/reflectionhandler.py b/Tools/Scripts/webkitpy/tool/servers/reflectionhandler.py
index 9308709..954fb56 100644
--- a/Tools/Scripts/webkitpy/tool/servers/reflectionhandler.py
+++ b/Tools/Scripts/webkitpy/tool/servers/reflectionhandler.py
@@ -44,8 +44,8 @@
 
 
 class ReflectionHandler(BaseHTTPServer.BaseHTTPRequestHandler):
+    STATIC_FILE_EXTENSIONS = ['.js', '.css', '.html']
     # Subclasses should override.
-    STATIC_FILE_NAMES = None
     STATIC_FILE_DIRECTORY = None
 
     # Setting this flag to True causes the server to send
@@ -78,7 +78,8 @@
             self.query = {}
         function_or_file_name = path[1:] or "index.html"
 
-        if function_or_file_name in self.STATIC_FILE_NAMES:
+        _, extension = os.path.splitext(function_or_file_name)
+        if extension in self.STATIC_FILE_EXTENSIONS:
             self._serve_static_file(function_or_file_name)
             return
 
diff --git a/Tools/Scripts/webkitpy/tool/servers/reflectionhandler_unittest.py b/Tools/Scripts/webkitpy/tool/servers/reflectionhandler_unittest.py
new file mode 100644
index 0000000..e1d5623
--- /dev/null
+++ b/Tools/Scripts/webkitpy/tool/servers/reflectionhandler_unittest.py
@@ -0,0 +1,70 @@
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#    * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#    * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#    * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest2 as unittest
+
+from webkitpy.tool.servers.reflectionhandler import ReflectionHandler
+
+
+class TestReflectionHandler(ReflectionHandler):
+    STATIC_FILE_DIRECTORY = "/"
+
+    def __init__(self):
+        self.static_files_served = set()
+        self.errors_sent = set()
+        self.functions_run = set()
+
+    def _serve_static_file(self, name):
+        self.static_files_served.add(name)
+
+    def send_error(self, code, description):
+        self.errors_sent.add(code)
+
+    def function_one(self):
+        self.functions_run.add("function_one")
+
+    def some_html(self):
+        self.functions_run.add("some_html")
+
+
+class ReflectionHandlerTest(unittest.TestCase):
+    def assert_handler_response(self, requests, expected_static_files, expected_errors, expected_functions):
+        handler = TestReflectionHandler()
+        for request in requests:
+            handler.path = request
+            handler._handle_request()
+        self.assertEqual(handler.static_files_served, expected_static_files)
+        self.assertEqual(handler.errors_sent, expected_errors)
+        self.assertEqual(handler.functions_run, expected_functions)
+
+    def test_static_content_or_function_switch(self):
+        self.assert_handler_response(["/test.js"], set(["test.js"]), set(), set())
+        self.assert_handler_response(["/test.js", "/test.css", "/test.html"], set(["test.js", "test.html", "test.css"]), set(), set())
+        self.assert_handler_response(["/test.js", "/test.exe", "/testhtml"], set(["test.js"]), set([404]), set())
+        self.assert_handler_response(["/test.html", "/function.one"], set(["test.html"]), set(), set(['function_one']))
+        self.assert_handler_response(["/some.html"], set(["some.html"]), set(), set())
diff --git a/Tools/Scripts/webkitpy/tool/steps/__init__.py b/Tools/Scripts/webkitpy/tool/steps/__init__.py
index 56429e8..709de5b 100644
--- a/Tools/Scripts/webkitpy/tool/steps/__init__.py
+++ b/Tools/Scripts/webkitpy/tool/steps/__init__.py
@@ -35,16 +35,17 @@
 from webkitpy.tool.steps.build import Build
 from webkitpy.tool.steps.checkstyle import CheckStyle
 from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
-from webkitpy.tool.steps.cleanworkingdirectorywithlocalcommits import CleanWorkingDirectoryWithLocalCommits
 from webkitpy.tool.steps.closebug import CloseBug
 from webkitpy.tool.steps.closebugforlanddiff import CloseBugForLandDiff
 from webkitpy.tool.steps.closepatch import ClosePatch
 from webkitpy.tool.steps.commit import Commit
 from webkitpy.tool.steps.confirmdiff import ConfirmDiff
 from webkitpy.tool.steps.createbug import CreateBug
+from webkitpy.tool.steps.discardlocalchanges import DiscardLocalChanges
 from webkitpy.tool.steps.editchangelog import EditChangeLog
 from webkitpy.tool.steps.ensurebugisopenandassigned import EnsureBugIsOpenAndAssigned
 from webkitpy.tool.steps.ensurelocalcommitifneeded import EnsureLocalCommitIfNeeded
+from webkitpy.tool.steps.haslanded import HasLanded
 from webkitpy.tool.steps.obsoletepatches import ObsoletePatches
 from webkitpy.tool.steps.options import Options
 from webkitpy.tool.steps.postdiff import PostDiff
diff --git a/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng.py b/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng.py
index 73bec15..0ef0fed 100644
--- a/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng.py
+++ b/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng.py
@@ -21,12 +21,15 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.common import checksvnconfigfile
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.checkout.scm.detection import SCMDetector
 from webkitpy.common.system.systemhost import SystemHost
 
+_log = logging.getLogger(__name__)
+
 
 class AddSvnMimetypeForPng(AbstractStep):
     def __init__(self, tool, options, host=None, scm=None):
@@ -47,19 +50,19 @@
                 config_file_path = checksvnconfigfile.config_file_path(self._host, self._fs)
 
                 if file_missing:
-                    log("There is no SVN config file. The svn:mime-type of pngs won't set.")
+                    _log.info("There is no SVN config file. The svn:mime-type of pngs won't set.")
                     if not self._tool.user.confirm("Are you sure you want to continue?", default="n"):
                         self._exit(1)
                 elif autoprop_missing and png_missing:
-                    log(checksvnconfigfile.errorstr_autoprop(config_file_path) + checksvnconfigfile.errorstr_png(config_file_path))
+                    _log.info(checksvnconfigfile.errorstr_autoprop(config_file_path) + checksvnconfigfile.errorstr_png(config_file_path))
                     if not self._tool.user.confirm("Do you want to continue?", default="n"):
                         self._exit(1)
                 elif autoprop_missing:
-                    log(checksvnconfigfile.errorstr_autoprop(config_file_path))
+                    _log.info(checksvnconfigfile.errorstr_autoprop(config_file_path))
                     if not self._tool.user.confirm("Do you want to continue?", default="n"):
                         self._exit(1)
                 elif png_missing:
-                    log(checksvnconfigfile.errorstr_png(config_file_path))
+                    _log.info(checksvnconfigfile.errorstr_png(config_file_path))
                     if not self._tool.user.confirm("Do you want to continue?", default="n"):
                         self._exit(1)
 
diff --git a/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng_unittest.py b/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng_unittest.py
index 221c6bc..12be0be 100644
--- a/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/addsvnmimetypeforpng_unittest.py
@@ -21,7 +21,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.tool.steps.addsvnmimetypeforpng import AddSvnMimetypeForPng
 from webkitpy.common.system.filesystem_mock import MockFileSystem
@@ -55,4 +55,4 @@
         try:
             capture.assert_outputs(self, step.run, [state])
         except SystemExit, e:
-            self.assertEquals(e.code, 1)
+            self.assertEqual(e.code, 1)
diff --git a/Tools/Scripts/webkitpy/tool/steps/applypatch.py b/Tools/Scripts/webkitpy/tool/steps/applypatch.py
index 5c36169..50ee1f7 100644
--- a/Tools/Scripts/webkitpy/tool/steps/applypatch.py
+++ b/Tools/Scripts/webkitpy/tool/steps/applypatch.py
@@ -26,9 +26,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
+
 
 class ApplyPatch(AbstractStep):
     @classmethod
@@ -38,5 +42,5 @@
         ]
 
     def run(self, state):
-        log("Processing patch %s from bug %s." % (state["patch"].id(), state["patch"].bug_id()))
+        _log.info("Processing patch %s from bug %s." % (state["patch"].id(), state["patch"].bug_id()))
         self._tool.checkout().apply_patch(state["patch"])
diff --git a/Tools/Scripts/webkitpy/tool/steps/applywatchlist_unittest.py b/Tools/Scripts/webkitpy/tool/steps/applywatchlist_unittest.py
index bdaaf75..a740c3d 100644
--- a/Tools/Scripts/webkitpy/tool/steps/applywatchlist_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/applywatchlist_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.mocktool import MockOptions, MockTool
@@ -41,11 +41,11 @@
             'bug_id': '50001',
             'diff': 'The diff',
         }
-        expected_stderr = """MockWatchList: determine_cc_and_messages
+        expected_logs = """MockWatchList: determine_cc_and_messages
 MOCK bug comment: bug_id=50001, cc=set(['levin@chromium.org'])
 --- Begin comment ---
 Message2.
 --- End comment ---
 
 """
-        capture.assert_outputs(self, step.run, [state], expected_stderr=expected_stderr)
+        capture.assert_outputs(self, step.run, [state], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/steps/build.py b/Tools/Scripts/webkitpy/tool/steps/build.py
index 7f7dd9f..b02830c 100644
--- a/Tools/Scripts/webkitpy/tool/steps/build.py
+++ b/Tools/Scripts/webkitpy/tool/steps/build.py
@@ -26,9 +26,12 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class Build(AbstractStep):
@@ -45,14 +48,14 @@
         environment.disable_gcc_smartquotes()
         env = environment.to_dictionary()
 
-        build_webkit_command = self._tool.port().build_webkit_command(build_style=build_style)
+        build_webkit_command = self._tool.deprecated_port().build_webkit_command(build_style=build_style)
         self._tool.executive.run_and_throw_if_fail(build_webkit_command, self._options.quiet,
             cwd=self._tool.scm().checkout_root, env=env)
 
     def run(self, state):
         if not self._options.build:
             return
-        log("Building WebKit")
+        _log.info("Building WebKit")
         if self._options.build_style == "both":
             self.build("debug")
             self.build("release")
diff --git a/Tools/Scripts/webkitpy/tool/steps/checkstyle.py b/Tools/Scripts/webkitpy/tool/steps/checkstyle.py
index 3304f01..cec8a81 100644
--- a/Tools/Scripts/webkitpy/tool/steps/checkstyle.py
+++ b/Tools/Scripts/webkitpy/tool/steps/checkstyle.py
@@ -29,7 +29,6 @@
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import error
 
 class CheckStyle(AbstractStep):
     @classmethod
@@ -58,7 +57,7 @@
             args.append(self._options.check_style_filter)
 
         try:
-            self._tool.executive.run_and_throw_if_fail(self._tool.port().check_webkit_style_command() + args, cwd=self._tool.scm().checkout_root)
+            self._tool.executive.run_and_throw_if_fail(self._tool.deprecated_port().check_webkit_style_command() + args, cwd=self._tool.scm().checkout_root)
         except ScriptError, e:
             if self._options.non_interactive:
                 # We need to re-raise the exception here to have the
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory.py b/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory.py
index 1913524..a4cbe82 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory.py
+++ b/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory.py
@@ -28,12 +28,10 @@
 
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
+from webkitpy.common.system.executive import ScriptError
 
 
 class CleanWorkingDirectory(AbstractStep):
-    def __init__(self, tool, options, allow_local_commits=False):
-        AbstractStep.__init__(self, tool, options)
-        self._allow_local_commits = allow_local_commits
 
     @classmethod
     def options(cls):
@@ -45,6 +43,8 @@
     def run(self, state):
         if not self._options.clean:
             return
-        if not self._allow_local_commits:
-            self._tool.scm().ensure_no_local_commits(self._options.force_clean)
-        self._tool.scm().ensure_clean_working_directory(force_clean=self._options.force_clean)
+
+        if self._tool.scm().has_working_directory_changes() and not self._options.force_clean:
+            raise ScriptError("Working directory has changes, pass --force-clean to continue.")
+
+        self._tool.scm().discard_working_directory_changes()
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory_unittest.py b/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory_unittest.py
index 15a8850..7e31a9b 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectory_unittest.py
@@ -26,27 +26,43 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.thirdparty.mock import Mock
 from webkitpy.tool.mocktool import MockOptions, MockTool
 from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+from webkitpy.common.system.executive import ScriptError
 
 
 class CleanWorkingDirectoryTest(unittest.TestCase):
-    def test_run(self):
+    def test_run_working_directory_changes_no_force(self):
         tool = MockTool()
         tool._scm = Mock()
-        tool._scm.checkout_root = '/mock-checkout'
         step = CleanWorkingDirectory(tool, MockOptions(clean=True, force_clean=False))
+        tool._scm.has_working_directory_changes = lambda: True
+        self.assertRaises(ScriptError, step.run, {})
+        self.assertEqual(tool._scm.discard_working_directory_changes.call_count, 0)
+
+    def test_run_working_directory_changes_force(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        step = CleanWorkingDirectory(tool, MockOptions(clean=True, force_clean=True))
+        tool._scm.has_working_directory_changes = lambda: True
         step.run({})
-        self.assertEqual(tool._scm.ensure_no_local_commits.call_count, 1)
-        self.assertEqual(tool._scm.ensure_clean_working_directory.call_count, 1)
+        self.assertEqual(tool._scm.discard_working_directory_changes.call_count, 1)
+
+    def test_run_no_local_changes(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        step = CleanWorkingDirectory(tool, MockOptions(clean=True, force_clean=False))
+        tool._scm.has_working_directory_changes = lambda: False
+        tool._scm.has_local_commits = lambda: False
+        step.run({})
+        self.assertEqual(tool._scm.discard_working_directory_changes.call_count, 1)
 
     def test_no_clean(self):
         tool = MockTool()
         tool._scm = Mock()
         step = CleanWorkingDirectory(tool, MockOptions(clean=False))
         step.run({})
-        self.assertEqual(tool._scm.ensure_no_local_commits.call_count, 0)
-        self.assertEqual(tool._scm.ensure_clean_working_directory.call_count, 0)
+        self.assertEqual(tool._scm.discard_working_directory_changes.call_count, 0)
diff --git a/Tools/Scripts/webkitpy/tool/steps/closebug.py b/Tools/Scripts/webkitpy/tool/steps/closebug.py
index b33e373..e58be54 100644
--- a/Tools/Scripts/webkitpy/tool/steps/closebug.py
+++ b/Tools/Scripts/webkitpy/tool/steps/closebug.py
@@ -26,9 +26,12 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class CloseBug(AbstractStep):
@@ -48,6 +51,6 @@
         patches = self._tool.bugs.fetch_bug(state["patch"].bug_id()).patches()
         for patch in patches:
             if patch.review() == "?" or patch.review() == "+":
-                log("Not closing bug %s as attachment %s has review=%s.  Assuming there are more patches to land from this bug." % (patch.bug_id(), patch.id(), patch.review()))
+                _log.info("Not closing bug %s as attachment %s has review=%s.  Assuming there are more patches to land from this bug." % (patch.bug_id(), patch.id(), patch.review()))
                 return
         self._tool.bugs.close_bug_as_fixed(state["patch"].bug_id(), "All reviewed patches have been landed.  Closing bug.")
diff --git a/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff.py b/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff.py
index e5a68db..1662d6a 100644
--- a/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff.py
+++ b/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff.py
@@ -26,10 +26,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.comments import bug_comment_from_commit_text
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class CloseBugForLandDiff(AbstractStep):
@@ -46,7 +49,7 @@
             bug_id = state.get("patch").bug_id()
 
         if bug_id:
-            log("Updating bug %s" % bug_id)
+            _log.info("Updating bug %s" % bug_id)
             if self._options.close_bug:
                 self._tool.bugs.close_bug_as_fixed(bug_id, comment_text)
             else:
@@ -54,5 +57,5 @@
                 # to the bug, and if so obsolete it.
                 self._tool.bugs.post_comment_to_bug(bug_id, comment_text)
         else:
-            log(comment_text)
-            log("No bug id provided.")
+            _log.info(comment_text)
+            _log.info("No bug id provided.")
diff --git a/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff_unittest.py b/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff_unittest.py
index 0a56564..b042d42 100644
--- a/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/closebugforlanddiff_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.mocktool import MockOptions, MockTool
@@ -36,5 +36,5 @@
     def test_empty_state(self):
         capture = OutputCapture()
         step = CloseBugForLandDiff(MockTool(), MockOptions())
-        expected_stderr = "Committed r49824: <http://trac.webkit.org/changeset/49824>\nNo bug id provided.\n"
-        capture.assert_outputs(self, step.run, [{"commit_text" : "Mock commit text"}], expected_stderr=expected_stderr)
+        expected_logs = "Committed r49824: <http://trac.webkit.org/changeset/49824>\nNo bug id provided.\n"
+        capture.assert_outputs(self, step.run, [{"commit_text": "Mock commit text"}], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/steps/commit.py b/Tools/Scripts/webkitpy/tool/steps/commit.py
index 0e5ca91..1d5109a 100644
--- a/Tools/Scripts/webkitpy/tool/steps/commit.py
+++ b/Tools/Scripts/webkitpy/tool/steps/commit.py
@@ -26,32 +26,31 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
 import sys
 
 from webkitpy.common.checkout.scm import AuthenticationError, AmbiguousCommitError
 from webkitpy.common.config import urls
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.common.system.user import User
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
 
+_log = logging.getLogger(__name__)
+
 
 class Commit(AbstractStep):
-    # FIXME: This option exists only to make sure we don't break scripts which include --ignore-builders
-    # You can safely delete this option any time after 11/01/11.
     @classmethod
     def options(cls):
         return AbstractStep.options() + [
-            Options.check_builders,
             Options.non_interactive,
         ]
 
     def _commit_warning(self, error):
-        working_directory_message = "" if error.working_directory_is_clean else " and working copy changes"
-        return ('There are %s local commits%s. Everything will be committed as a single commit. '
+        return ('There are %s local commits (and possibly changes in the working directory. '
+                'Everything will be committed as a single commit. '
                 'To avoid this prompt, set "git config webkit-patch.commit-should-always-squash true".' % (
-                error.num_local_commits, working_directory_message))
+                error.num_local_commits))
 
     def _check_test_expectations(self, changed_files):
         test_expectations_files = [filename for filename in changed_files if filename.endswith('TestExpectations')]
@@ -61,7 +60,7 @@
         args = ["--diff-files"]
         args.extend(test_expectations_files)
         try:
-            self._tool.executive.run_and_throw_if_fail(self._tool.port().check_webkit_style_command() + args, cwd=self._tool.scm().checkout_root)
+            self._tool.executive.run_and_throw_if_fail(self._tool.deprecated_port().check_webkit_style_command() + args, cwd=self._tool.scm().checkout_root)
         except ScriptError, e:
             if self._options.non_interactive:
                 raise
@@ -74,12 +73,11 @@
             raise Exception("Attempted to commit with a commit message shorter than 10 characters.  Either your patch is missing a ChangeLog or webkit-patch may have a bug.")
 
         self._check_test_expectations(self._changed_files(state))
-
         self._state = state
 
         username = None
         password = None
-        force_squash = False
+        force_squash = self._options.non_interactive
 
         num_tries = 0
         while num_tries < 3:
@@ -89,11 +87,11 @@
                 scm = self._tool.scm()
                 commit_text = scm.commit_with_message(self._commit_message, git_commit=self._options.git_commit, username=username, password=password, force_squash=force_squash, changed_files=self._changed_files(state))
                 svn_revision = scm.svn_revision_from_commit_text(commit_text)
-                log("Committed r%s: <%s>" % (svn_revision, urls.view_revision_url(svn_revision)))
+                _log.info("Committed r%s: <%s>" % (svn_revision, urls.view_revision_url(svn_revision)))
                 self._state["commit_text"] = commit_text
                 break;
             except AmbiguousCommitError, e:
-                if self._options.non_interactive or self._tool.user.confirm(self._commit_warning(e)):
+                if self._tool.user.confirm(self._commit_warning(e)):
                     force_squash = True
                 else:
                     # This will correctly interrupt the rest of the commit process.
diff --git a/Tools/Scripts/webkitpy/tool/steps/commit_unittest.py b/Tools/Scripts/webkitpy/tool/steps/commit_unittest.py
index 25d9b61..c6b76b4 100644
--- a/Tools/Scripts/webkitpy/tool/steps/commit_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/commit_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.system.executive import ScriptError
@@ -50,13 +50,16 @@
         }
 
         tool.executive = MockExecutive(should_log=True, should_throw_when_run=False)
-        capture.assert_outputs(self, step.run, [state], expected_stderr="Committed r49824: <http://trac.webkit.org/changeset/49824>\n")
+        expected_logs = "Committed r49824: <http://trac.webkit.org/changeset/49824>\n"
+        capture.assert_outputs(self, step.run, [state], expected_logs=expected_logs)
 
         state = {
             "changed_files": ["platform/chromium/" + filename],
         }
-        capture.assert_outputs(self, step.run, [state], expected_stderr="MOCK run_and_throw_if_fail: ['mock-check-webkit-style', '--diff-files', 'platform/chromium/"
-            + filename + "'], cwd=/mock-checkout\nCommitted r49824: <http://trac.webkit.org/changeset/49824>\n")
+        expected_logs = """MOCK run_and_throw_if_fail: ['mock-check-webkit-style', '--diff-files', 'platform/chromium/%s'], cwd=/mock-checkout
+Committed r49824: <http://trac.webkit.org/changeset/49824>
+""" % filename
+        capture.assert_outputs(self, step.run, [state], expected_logs=expected_logs)
 
         tool.executive = MockExecutive(should_log=True, should_throw_when_run=set(["platform/chromium/" + filename]))
         self.assertRaises(ScriptError, capture.assert_outputs, self, step.run, [state])
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/Scripts/webkitpy/tool/steps/discardlocalchanges.py
similarity index 64%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/Scripts/webkitpy/tool/steps/discardlocalchanges.py
index f06f94e..8a84cc7 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/Scripts/webkitpy/tool/steps/discardlocalchanges.py
@@ -1,9 +1,9 @@
 # Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +13,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,27 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+from webkitpy.tool.steps.abstractstep import AbstractStep
+from webkitpy.tool.steps.options import Options
+from webkitpy.common.system.executive import ScriptError
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+
+class DiscardLocalChanges(AbstractStep):
+
+    @classmethod
+    def options(cls):
+        return AbstractStep.options() + [
+            Options.clean,
+            Options.force_clean,
+        ]
+
+    def run(self, state):
+        if not self._options.clean:
+            return
+
+        if not self._options.force_clean:
+            if self._tool.scm().has_working_directory_changes():
+                raise ScriptError("Working directory has changes, pass --force-clean to continue.")
+            if self._tool.scm().has_local_commits():
+                raise ScriptError("Repository has local commits, pass --force-clean to continue.")
+        self._tool.scm().discard_local_changes()
diff --git a/Tools/Scripts/webkitpy/tool/steps/discardlocalchanges_unittest.py b/Tools/Scripts/webkitpy/tool/steps/discardlocalchanges_unittest.py
new file mode 100644
index 0000000..d38fc92
--- /dev/null
+++ b/Tools/Scripts/webkitpy/tool/steps/discardlocalchanges_unittest.py
@@ -0,0 +1,97 @@
+# Copyright (C) 2010 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest2 as unittest
+
+from webkitpy.thirdparty.mock import Mock
+from webkitpy.tool.mocktool import MockOptions, MockTool
+from webkitpy.tool.steps.discardlocalchanges import DiscardLocalChanges
+from webkitpy.common.system.executive import ScriptError
+
+
+class DiscardLocalChangesTest(unittest.TestCase):
+    def test_skip_on_clean(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        step = DiscardLocalChanges(tool, MockOptions(clean=False))
+        step.run({})
+        self.assertEqual(tool._scm.discard_local_changes.call_count, 0)
+
+    def test_working_changes_exist_with_force(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        tool._scm.has_working_directory_changes = lambda: True
+        tool._scm.has_local_commits = lambda: False
+        step = DiscardLocalChanges(tool, MockOptions(clean=True, force_clean=True))
+        step.run({})
+        self.assertEqual(tool._scm.discard_local_changes.call_count, 1)
+
+    def test_local_commits_exist_with_force(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        tool._scm.has_working_directory_changes = lambda: False
+        tool._scm.has_local_commits = lambda: True
+        step = DiscardLocalChanges(tool, MockOptions(clean=True, force_clean=True))
+        step.run({})
+        self.assertEqual(tool._scm.discard_local_changes.call_count, 1)
+
+    def test_local_commits_and_working_changes_exist_with_force(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        tool._scm.has_working_directory_changes = lambda: True
+        tool._scm.has_local_commits = lambda: True
+        step = DiscardLocalChanges(tool, MockOptions(clean=True, force_clean=True))
+        step.run({})
+        self.assertEqual(tool._scm.discard_local_changes.call_count, 1)
+
+    def test_no_changes_exist_with_force(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        tool._scm.has_working_directory_changes = lambda: False
+        tool._scm.has_local_commits = lambda: False
+        step = DiscardLocalChanges(tool, MockOptions(clean=True, force_clean=True))
+        step.run({})
+        self.assertEqual(tool._scm.discard_local_changes.call_count, 1)
+
+    def test_error_working_changes_exist_without_force(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        tool._scm.has_working_directory_changes = lambda: True
+        tool._scm.has_local_commits = lambda: False
+        step = DiscardLocalChanges(tool, MockOptions(clean=True, force_clean=False))
+        self.assertRaises(ScriptError, step.run, {})
+        self.assertEqual(tool._scm.discard_local_changes.call_count, 0)
+
+    def test_error_local_commits_exist_without_force(self):
+        tool = MockTool()
+        tool._scm = Mock()
+        tool._scm.has_working_directory_changes = lambda: False
+        tool._scm.has_local_commits = lambda: True
+        step = DiscardLocalChanges(tool, MockOptions(clean=True, force_clean=False))
+        self.assertRaises(ScriptError, step.run, {})
+        self.assertEqual(tool._scm.discard_local_changes.call_count, 0)
diff --git a/Tools/Scripts/webkitpy/tool/steps/ensurelocalcommitifneeded.py b/Tools/Scripts/webkitpy/tool/steps/ensurelocalcommitifneeded.py
index 2167351..778d7ae 100644
--- a/Tools/Scripts/webkitpy/tool/steps/ensurelocalcommitifneeded.py
+++ b/Tools/Scripts/webkitpy/tool/steps/ensurelocalcommitifneeded.py
@@ -26,9 +26,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+import sys
+
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import error
+
+_log = logging.getLogger(__name__)
 
 
 class EnsureLocalCommitIfNeeded(AbstractStep):
@@ -40,4 +44,5 @@
 
     def run(self, state):
         if self._options.local_commit and not self._tool.scm().supports_local_commits():
-            error("--local-commit passed, but %s does not support local commits" % self._tool.scm().display_name())
+            _log.error("--local-commit passed, but %s does not support local commits" % self._tool.scm().display_name())
+            sys.exit(1)
diff --git a/Tools/Scripts/webkitpy/tool/steps/haslanded.py b/Tools/Scripts/webkitpy/tool/steps/haslanded.py
new file mode 100644
index 0000000..b0692b3
--- /dev/null
+++ b/Tools/Scripts/webkitpy/tool/steps/haslanded.py
@@ -0,0 +1,120 @@
+# Copyright (C) 2010 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import cStringIO as StringIO
+import logging
+import sys
+import re
+import tempfile
+
+from webkitpy.tool.steps.abstractstep import AbstractStep
+from webkitpy.common.system.executive import Executive, ScriptError
+from webkitpy.common.checkout import diff_parser
+
+from webkitpy.tool.steps import confirmdiff
+
+_log = logging.getLogger(__name__)
+
+
+class HasLanded(confirmdiff.ConfirmDiff):
+
+    @classmethod
+    def convert_to_svn(cls, diff):
+        lines = StringIO.StringIO(diff).readlines()
+        convert = diff_parser.get_diff_converter(lines)
+        return "".join(convert(x) for x in lines)
+
+    @classmethod
+    def strip_change_log(cls, diff):
+        output = []
+        skipping = False
+        for line in StringIO.StringIO(diff).readlines():
+            indexline = re.match("^Index: ([^\\n]*/)?([^/\\n]*)$", line)
+            if skipping and indexline:
+                skipping = False
+            if indexline and indexline.group(2) == "ChangeLog":
+                skipping = True
+            if not skipping:
+                output.append(line)
+        return "".join(output)
+
+    @classmethod
+    def diff_diff(cls, diff1, diff2, diff1_suffix, diff2_suffix, executive=None):
+        # Now this is where it gets complicated, we need to compare our diff to the diff at landed_revision.
+        diff1_patch = tempfile.NamedTemporaryFile(suffix=diff1_suffix + '.patch')
+        diff1_patch.write(diff1)
+        diff1_patch.flush()
+
+        # Check if there are any differences in the patch that don't happen
+        diff2_patch = tempfile.NamedTemporaryFile(suffix=diff2_suffix + '.patch')
+        diff2_patch.write(diff2)
+        diff2_patch.flush()
+
+        # Diff the two diff's together...
+        if not executive:
+            executive = Executive()
+
+        try:
+            return executive.run_command(
+                ["interdiff", diff1_patch.name, diff2_patch.name], decode_output=False)
+        except ScriptError, e:
+            _log.warning("Unable to find interdiff util (part of GNU difftools package) which is required.")
+            raise
+
+    def run(self, state):
+        # Check if there are changes first
+        if not self._tool.scm().local_changes_exist():
+            _log.warn("No local changes found, exiting.")
+            return True
+
+        # Check if there is a SVN revision in the bug from the commit queue
+        landed_revision = self.cached_lookup(state, "bug").commit_revision()
+        if not landed_revision:
+            raise ScriptError("Unable to find landed message in associated bug.")
+
+        # Now this is there it gets complicated, we need to compare our diff to the diff at landed_revision.
+        landed_diff_bin = self._tool.scm().diff_for_revision(landed_revision)
+        landed_diff_trimmed = self.strip_change_log(self.convert_to_svn(landed_diff_bin))
+
+        # Check if there are any differences in the patch that don't happen
+        local_diff_bin = self._tool.scm().create_patch()
+        local_diff_trimmed = self.strip_change_log(self.convert_to_svn(local_diff_bin))
+
+        # Diff the two diff's together...
+        diff_diff = self.diff_diff(landed_diff_trimmed, local_diff_trimmed,
+                                   '-landed', '-local',
+                                   executive=self._tool.executive)
+
+        with self._show_pretty_diff(diff_diff) as pretty_diff_file:
+            if not pretty_diff_file:
+                self._tool.user.page(diff_diff)
+
+            if self._tool.user.confirm("May I discard local changes?"):
+                # Discard changes if the user confirmed we should
+                _log.warn("Discarding changes as requested.")
+                self._tool.scm().discard_local_changes()
diff --git a/Tools/Scripts/webkitpy/tool/steps/haslanded_unittest.py b/Tools/Scripts/webkitpy/tool/steps/haslanded_unittest.py
new file mode 100644
index 0000000..3a67029
--- /dev/null
+++ b/Tools/Scripts/webkitpy/tool/steps/haslanded_unittest.py
@@ -0,0 +1,299 @@
+# Copyright (C) 2009 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#    * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#    * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#    * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest2 as unittest
+import subprocess
+
+from webkitpy.tool.steps.haslanded import HasLanded
+
+
+class HasLandedTest(unittest.TestCase):
+    maxDiff = None
+
+    @unittest.skipUnless(subprocess.call('which interdiff', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0, "requires interdiff")
+    def test_run(self):
+        # These patches require trailing whitespace to remain valid patches.
+        diff1 = """\
+Index: a.py
+===================================================================
+--- a.py
++++ a.py
+@@ -1,3 +1,5 @@
+ A
+ B
+ C
++D
++E
+Index: b.py
+===================================================================
+--- b.py      2013-01-21 15:20:59.693887185 +1100
++++ b.py      2013-01-21 15:22:24.382555711 +1100
+@@ -1,3 +1,5 @@
+ 1
+ 2
+ 3
++4
++5
+"""
+
+        diff1_add_line = """\
+Index: a.py
+===================================================================
+--- a.py
++++ a.py
+@@ -1,3 +1,6 @@
+ A
+ B
+ C
++D
++E
++F
+Index: b.py
+===================================================================
+--- b.py
++++ b.py
+@@ -1,3 +1,5 @@
+ 1
+ 2
+ 3
++4
++5
+"""
+
+        diff1_remove_line = """\
+Index: a.py
+===================================================================
+--- a.py
++++ a.py
+@@ -1,3 +1,4 @@
+ A
+ B
+ C
++D
+Index: b.py
+===================================================================
+--- b.py
++++ b.py
+@@ -1,3 +1,5 @@
+ 1
+ 2
+ 3
++4
++5
+"""
+
+        diff1_add_file = diff1 + """\
+Index: c.py
+===================================================================
+--- c.py
++++ c.py
+@@ -1,3 +1,5 @@
+ 1
+ 2
+ 3
++4
++5
+"""
+
+        diff1_remove_file = """\
+Index: a.py
+===================================================================
+--- a.py
++++ a.py
+@@ -1,3 +1,5 @@
+ A
+ B
+ C
++D
++E
+"""
+        self.assertMultiLineEqual(
+            HasLanded.diff_diff(diff1, diff1_add_line, '', 'add-line'),
+            """\
+diff -u a.py a.py
+--- a.py
++++ a.py
+@@ -5,0 +6 @@
++F
+""")
+
+        self.assertMultiLineEqual(
+            HasLanded.diff_diff(diff1, diff1_remove_line, '', 'remove-line'),
+            """\
+diff -u a.py a.py
+--- a.py
++++ a.py
+@@ -5 +4,0 @@
+-E
+""")
+        self.assertMultiLineEqual(
+            HasLanded.diff_diff(diff1, diff1_add_file, '', 'add-file'),
+            """\
+only in patch2:
+unchanged:
+--- c.py
++++ c.py
+@@ -1,3 +1,5 @@
+ 1
+ 2
+ 3
++4
++5
+""")
+        self.assertMultiLineEqual(
+            HasLanded.diff_diff(diff1, diff1_remove_file, '', 'remove-file'),
+            """\
+reverted:
+--- b.py      2013-01-21 15:22:24.382555711 +1100
++++ b.py      2013-01-21 15:20:59.693887185 +1100
+@@ -1,5 +1,3 @@
+ 1
+ 2
+ 3
+-4
+-5
+""")
+
+    def test_convert_to_svn_and_strip_change_log(self):
+        # These patches require trailing whitespace to remain valid patches.
+        testbefore1 = HasLanded.convert_to_svn("""\
+diff --git a/Tools/ChangeLog b/Tools/ChangeLog
+index 219ba72..0390b73 100644
+--- a/Tools/ChangeLog
++++ b/Tools/ChangeLog
+@@ -1,3 +1,32 @@
++2013-01-17  Tim 'mithro' Ansell  <mithro@mithis.com>
++
++        Adding "has-landed" command to webkit-patch which allows a person to
++        Reviewed by NOBODY (OOPS!).
++
+ 2013-01-20  Tim 'mithro' Ansell  <mithro@mithis.com>
+ 
+         Extend diff_parser to support the --full-index output.
+diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+index 4bf8ec6..3a128cb 100644
+--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
++++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+@@ -28,6 +28,8 @@
++import re
++
+ from .attachment import Attachment
+ 
+""")
+        testafter1 = HasLanded.convert_to_svn("""\
+diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+index 4bf8ec6..3a128cb 100644
+--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
++++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+@@ -28,6 +28,8 @@
++import re
++
+ from .attachment import Attachment
+ 
+diff --git a/Tools/ChangeLog b/Tools/ChangeLog
+index 219ba72..0390b73 100644
+--- a/Tools/ChangeLog
++++ b/Tools/ChangeLog
+@@ -1,3 +1,32 @@
++2013-01-17  Tim 'mithro' Ansell  <mithro@mithis.com>
++
++        Adding "has-landed" command to webkit-patch which allows a person to
++        Reviewed by NOBODY (OOPS!).
++
+ 2013-01-20  Tim 'mithro' Ansell  <mithro@mithis.com>
+ 
+         Extend diff_parser to support the --full-index output.
+""")
+        testexpected1 = """\
+Index: Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+===================================================================
+--- Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
++++ Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+@@ -28,6 +28,8 @@
++import re
++
+ from .attachment import Attachment
+ 
+"""
+        testmiddle1 = HasLanded.convert_to_svn("""\
+diff --git a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+index 4bf8ec6..3a128cb 100644
+--- a/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
++++ b/Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+@@ -28,6 +28,8 @@
++import re
++
+ from .attachment import Attachment
+ 
+diff --git a/ChangeLog b/ChangeLog
+index 219ba72..0390b73 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,32 @@
++2013-01-17  Tim 'mithro' Ansell  <mithro@mithis.com>
++
++        Adding "has-landed" command to webkit-patch which allows a person to
++        Reviewed by NOBODY (OOPS!).
++
+ 2013-01-20  Tim 'mithro' Ansell  <mithro@mithis.com>
+ 
+         Extend diff_parser to support the --full-index output.
+diff --git a/Tools/Scripts/webkitpy/common/other.py b/Tools/Scripts/webkitpy/common/other.py
+index 4bf8ec6..3a128cb 100644
+--- a/Tools/Scripts/webkitpy/common/other.py
++++ b/Tools/Scripts/webkitpy/common/other.py
+@@ -28,6 +28,8 @@
++import re
++
+ from .attachment import Attachment
+ 
+""")
+        testexpected2 = """\
+Index: Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+===================================================================
+--- Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
++++ Tools/Scripts/webkitpy/common/net/bugzilla/bug.py
+@@ -28,6 +28,8 @@
++import re
++
+ from .attachment import Attachment
+ 
+Index: Tools/Scripts/webkitpy/common/other.py
+===================================================================
+--- Tools/Scripts/webkitpy/common/other.py
++++ Tools/Scripts/webkitpy/common/other.py
+@@ -28,6 +28,8 @@
++import re
++
+ from .attachment import Attachment
+ 
+"""
+
+        self.assertMultiLineEqual(testexpected1, HasLanded.strip_change_log(testbefore1))
+        self.assertMultiLineEqual(testexpected1, HasLanded.strip_change_log(testafter1))
+        self.assertMultiLineEqual(testexpected2, HasLanded.strip_change_log(testmiddle1))
diff --git a/Tools/Scripts/webkitpy/tool/steps/obsoletepatches.py b/Tools/Scripts/webkitpy/tool/steps/obsoletepatches.py
index de508c6..dfed959 100644
--- a/Tools/Scripts/webkitpy/tool/steps/obsoletepatches.py
+++ b/Tools/Scripts/webkitpy/tool/steps/obsoletepatches.py
@@ -26,10 +26,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.grammar import pluralize
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class ObsoletePatches(AbstractStep):
@@ -46,6 +49,6 @@
         patches = self._tool.bugs.fetch_bug(bug_id).patches()
         if not patches:
             return
-        log("Obsoleting %s on bug %s" % (pluralize("old patch", len(patches)), bug_id))
+        _log.info("Obsoleting %s on bug %s" % (pluralize("old patch", len(patches)), bug_id))
         for patch in patches:
             self._tool.bugs.obsolete_attachment(patch.id())
diff --git a/Tools/Scripts/webkitpy/tool/steps/options.py b/Tools/Scripts/webkitpy/tool/steps/options.py
index c29e59d..7eda614 100644
--- a/Tools/Scripts/webkitpy/tool/steps/options.py
+++ b/Tools/Scripts/webkitpy/tool/steps/options.py
@@ -33,7 +33,6 @@
     build = make_option("--build", action="store_true", dest="build", default=False, help="Build and run run-webkit-tests before committing.")
     build_style = make_option("--build-style", action="store", dest="build_style", default=None, help="Whether to build debug, release, or both.")
     cc = make_option("--cc", action="store", type="string", dest="cc", help="Comma-separated list of email addresses to carbon-copy.")
-    check_builders = make_option("--ignore-builders", action="store_false", dest="check_builders", default=True, help="DEPRECATED: Will be removed any time after 11/01/11.")
     check_style = make_option("--ignore-style", action="store_false", dest="check_style", default=True, help="Don't check to see if the patch has proper style before uploading.")
     check_style_filter = make_option("--check-style-filter", action="store", type="string", dest="check_style_filter", default=None, help="Filter style-checker rules (see check-webkit-style --help).")
     clean = make_option("--no-clean", action="store_false", dest="clean", default=True, help="Don't check if the working directory is clean before applying patches")
@@ -57,4 +56,5 @@
     suggest_reviewers = make_option("--suggest-reviewers", action="store_true", default=False, help="Offer to CC appropriate reviewers.")
     test = make_option("--test", action="store_true", dest="test", default=False, help="Run run-webkit-tests before committing.")
     update = make_option("--no-update", action="store_false", dest="update", default=True, help="Don't update the working directory.")
+    update_changelogs = make_option("--update-changelogs", action="store_true", dest="update_changelogs", default=False, help="Update existing ChangeLog entries with new date, bug description, and touched files/functions.")
     changelog_count = make_option("--changelog-count", action="store", type="int", dest="changelog_count", help="Number of changelogs to parse.")
diff --git a/Tools/Scripts/webkitpy/tool/steps/preparechangelog.py b/Tools/Scripts/webkitpy/tool/steps/preparechangelog.py
index 19caace..716ab82 100644
--- a/Tools/Scripts/webkitpy/tool/steps/preparechangelog.py
+++ b/Tools/Scripts/webkitpy/tool/steps/preparechangelog.py
@@ -26,11 +26,16 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+import re
+import sys
+
 from webkitpy.common.checkout.changelog import ChangeLog
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import error
+
+_log = logging.getLogger(__name__)
 
 
 class PrepareChangeLog(AbstractStep):
@@ -40,6 +45,7 @@
             Options.quiet,
             Options.email,
             Options.git_commit,
+            Options.update_changelogs,
         ]
 
     def _ensure_bug_url(self, state):
@@ -48,17 +54,60 @@
         bug_id = state.get("bug_id")
         changelogs = self.cached_lookup(state, "changelogs")
         for changelog_path in changelogs:
-            changelog = ChangeLog(changelog_path)
+            changelog = ChangeLog(changelog_path, self._tool.filesystem)
             if not changelog.latest_entry().bug_id():
                 changelog.set_short_description_and_bug_url(
                     self.cached_lookup(state, "bug_title"),
                     self._tool.bugs.bug_url_for_bug_id(bug_id))
 
+    def _resolve_existing_entry(self, changelog_path):
+        # When this is called, the top entry in the ChangeLog was just created
+        # by prepare-ChangeLog, as an clean updated version of the one below it.
+        with self._tool.filesystem.open_text_file_for_reading(changelog_path) as changelog_file:
+            entries_gen = ChangeLog.parse_entries_from_file(changelog_file)
+            entries = zip(entries_gen, range(2))
+
+        if not len(entries):
+            raise Exception("Expected to find at least two ChangeLog entries in %s but found none." % changelog_path)
+        if len(entries) == 1:
+            # If we get here, it probably means we've just rolled over to a
+            # new CL file, so we don't have anything to resolve.
+            return
+
+        (new_entry, _), (old_entry, _) = entries
+        final_entry = self._merge_entries(old_entry, new_entry)
+
+        changelog = ChangeLog(changelog_path, self._tool.filesystem)
+        changelog.delete_entries(2)
+        changelog.prepend_text(final_entry)
+
+    def _merge_entries(self, old_entry, new_entry):
+        final_entry = old_entry.contents()
+
+        final_entry = final_entry.replace(old_entry.date(), new_entry.date(), 1)
+
+        new_bug_desc = new_entry.bug_description()
+        old_bug_desc = old_entry.bug_description()
+        if new_bug_desc and old_bug_desc and new_bug_desc != old_bug_desc:
+            final_entry = final_entry.replace(old_bug_desc, new_bug_desc)
+
+        new_touched = new_entry.touched_functions()
+        old_touched = old_entry.touched_functions()
+        if new_touched != old_touched:
+            if old_entry.is_touched_files_text_clean():
+                final_entry = final_entry.replace(old_entry.touched_files_text(), new_entry.touched_files_text())
+            else:
+                final_entry += "\n" + new_entry.touched_files_text()
+
+        return final_entry + "\n"
+
     def run(self, state):
         if self.cached_lookup(state, "changelogs"):
             self._ensure_bug_url(state)
-            return
-        args = self._tool.port().prepare_changelog_command()
+            if not self._options.update_changelogs:
+                return
+
+        args = self._tool.deprecated_port().prepare_changelog_command()
         if state.get("bug_id"):
             args.append("--bug=%s" % state["bug_id"])
             args.append("--description=%s" % self.cached_lookup(state, 'bug_title'))
@@ -71,7 +120,15 @@
         args.extend(self._changed_files(state))
 
         try:
-            self._tool.executive.run_and_throw_if_fail(args, self._options.quiet, cwd=self._tool.scm().checkout_root)
+            output = self._tool.executive.run_and_throw_if_fail(args, self._options.quiet, cwd=self._tool.scm().checkout_root)
         except ScriptError, e:
-            error("Unable to prepare ChangeLogs.")
+            _log.error("Unable to prepare ChangeLogs.")
+            sys.exit(1)
+
+        # These are the ChangeLog entries added by prepare-Changelog
+        changelogs = re.findall(r'Editing the (\S*/ChangeLog) file.', output)
+        changelogs = set(self._tool.filesystem.join(self._tool.scm().checkout_root, f) for f in changelogs)
+        for changelog in changelogs & set(self.cached_lookup(state, "changelogs")):
+            self._resolve_existing_entry(changelog)
+
         self.did_modify_checkout(state)
diff --git a/Tools/Scripts/webkitpy/tool/steps/preparechangelog_unittest.py b/Tools/Scripts/webkitpy/tool/steps/preparechangelog_unittest.py
index 847dc2f..803f072 100644
--- a/Tools/Scripts/webkitpy/tool/steps/preparechangelog_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/preparechangelog_unittest.py
@@ -26,32 +26,108 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import os
-import unittest
+import unittest2 as unittest
 
 # Do not import changelog_unittest.ChangeLogTest directly as that will cause it to be run again.
 from webkitpy.common.checkout import changelog_unittest
 
+from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.mocktool import MockOptions, MockTool
 from webkitpy.tool.steps.preparechangelog import PrepareChangeLog
 
-
 class PrepareChangeLogTest(changelog_unittest.ChangeLogTest):
+    def test_resolve_existing_entry(self):
+        step = PrepareChangeLog(MockTool(), MockOptions())
+
+        headers = ["2013-01-18  Timothy Loh  <timloh@chromium.com>\n\n",
+                   "2013-01-20  Timothy Loh  <timloh@chromium.com>\n\n",
+                  u"2009-08-17  Tor Arne Vestb\xf8  <vestbo@webkit.org>\n\n",
+                  u"2009-08-18  Tor Arne Vestb\xf8  <vestbo@webkit.org>\n\n",
+                   "2013-01-18  Eric Seidel  <eric@webkit.org>\n\n",
+                   "2013-01-20  Eric Seidel  <eric@webkit.org>\n\n",
+                  ]
+
+        bug_descs = ["        prepare-Changelog should support updating the list of changed files\n",
+                     "        webkit-patch upload should support updating the list of changed files\n"]
+
+        bug_url = "        https://bugs.webkit.org/show_bug.cgi?id=74358\n\n"
+
+        descriptions = ["", "        A description of the changes.\n\n",
+                "        A description.\n\n        With some\n        line breaks\n\n"]
+
+        changes = [
+"""        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog):
+        (PrepareChangeLog.run):\n\n""",
+"""        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog._resolve_existing_entry):
+        (PrepareChangeLog):
+        (PrepareChangeLog.run):\n\n""",
+"""        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog): Some annotations
+        (PrepareChangeLog.run):
+            More annotations\n\n""",
+"""        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog): Some annotations
+        (PrepareChangeLog.run):
+            More annotations
+
+        * Scripts/webkitpy/tool/steps/preparechangelog.py:
+        (PrepareChangeLog._resolve_existing_entry):
+        (PrepareChangeLog):
+        (PrepareChangeLog.run):\n\n""",
+            ]
+
+        def make_entry(indices):
+            a, b, c, d = indices
+            return headers[a] + bug_descs[b] + bug_url + descriptions[c] + changes[d]
+
+        test_cases = [((0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)),
+                      ((0, 0, 0, 0), (0, 0, 1, 0), (0, 0, 1, 0)),
+                      ((1, 0, 0, 0), (0, 0, 2, 0), (1, 0, 2, 0)),
+                      ((0, 1, 0, 0), (0, 0, 1, 0), (0, 1, 1, 0)),
+                      ((0, 0, 0, 1), (0, 0, 0, 0), (0, 0, 0, 1)),
+                      ((0, 0, 0, 0), (0, 0, 1, 1), (0, 0, 1, 0)),
+                      ((0, 0, 0, 0), (0, 0, 2, 2), (0, 0, 2, 2)),
+                      ((0, 0, 0, 1), (0, 0, 1, 2), (0, 0, 1, 3)),
+                      ((1, 1, 0, 1), (0, 0, 0, 2), (1, 1, 0, 3)),
+                      ((3, 0, 0, 0), (2, 0, 1, 0), (3, 0, 1, 0)),
+                      ((4, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)),
+                      ((5, 0, 0, 0), (0, 0, 0, 0), (1, 0, 0, 0)),
+                      ((0, 0, 0, 0), (4, 0, 0, 0), (4, 0, 0, 0)),
+                      ((1, 0, 0, 0), (4, 0, 0, 0), (5, 0, 0, 0)),
+        ]
+
+        for new, old, final in test_cases:
+            new_entry = make_entry(new)
+            old_entry = make_entry(old)
+            start_file = new_entry + old_entry + self._rolled_over_footer
+
+            final_entry = make_entry(final)
+            end_file = final_entry + self._rolled_over_footer
+
+            path = "ChangeLog"
+            step._tool.filesystem = MockFileSystem()
+            step._tool.filesystem.write_text_file(path, start_file)
+            step._resolve_existing_entry(path)
+            actual_output = step._tool.filesystem.read_text_file(path)
+            self.assertEquals(actual_output, end_file)
+
     def test_ensure_bug_url(self):
-        # FIXME: This should use a MockFileSystem instead of a real FileSystem.
         capture = OutputCapture()
         step = PrepareChangeLog(MockTool(), MockOptions())
         changelog_contents = u"%s\n%s" % (self._new_entry_boilerplate, self._example_changelog)
-        changelog_path = self._write_tmp_file_with_contents(changelog_contents.encode("utf-8"))
+        changelog_path = "ChangeLog"
         state = {
             "bug_title": "Example title",
             "bug_id": 1234,
             "changelogs": [changelog_path],
         }
-        capture.assert_outputs(self, step.run, [state])
-        actual_contents = self._read_file_contents(changelog_path, "utf-8")
+        step._tool.filesystem = MockFileSystem()
+        step._tool.filesystem.write_text_file(changelog_path, changelog_contents)
+        capture.assert_outputs(self, step._ensure_bug_url, [state])
+        actual_contents = step._tool.filesystem.read_text_file(changelog_path)
         expected_message = "Example title\n        http://example.com/1234"
         expected_contents = changelog_contents.replace("Need a short description (OOPS!).\n        Need the bug URL (OOPS!).", expected_message)
-        os.remove(changelog_path)
-        self.assertEquals(actual_contents.splitlines(), expected_contents.splitlines())
+        self.assertEqual(actual_contents, expected_contents)
diff --git a/Tools/Scripts/webkitpy/tool/steps/preparechangelogfordepsroll.py b/Tools/Scripts/webkitpy/tool/steps/preparechangelogfordepsroll.py
index 4bbd383..5ba48ff 100644
--- a/Tools/Scripts/webkitpy/tool/steps/preparechangelogfordepsroll.py
+++ b/Tools/Scripts/webkitpy/tool/steps/preparechangelogfordepsroll.py
@@ -32,7 +32,7 @@
 
 class PrepareChangeLogForDEPSRoll(AbstractStep):
     def run(self, state):
-        self._tool.executive.run_and_throw_if_fail(self._tool.port().prepare_changelog_command())
+        self._tool.executive.run_and_throw_if_fail(self._tool.deprecated_port().prepare_changelog_command())
         changelog_paths = self._tool.checkout().modified_changelogs(git_commit=None)
         for changelog_path in changelog_paths:
-            ChangeLog(changelog_path).update_with_unreviewed_message("Unreviewed.  Rolled DEPS.\n\n")
+            ChangeLog(changelog_path).update_with_unreviewed_message(state["changelog_message"])
diff --git a/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py b/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py
index 95a99c3..82e7b02 100644
--- a/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py
+++ b/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert.py
@@ -48,7 +48,7 @@
 
     def run(self, state):
         # This could move to prepare-ChangeLog by adding a --revert= option.
-        self._tool.executive.run_and_throw_if_fail(self._tool.port().prepare_changelog_command(), cwd=self._tool.scm().checkout_root)
+        self._tool.executive.run_and_throw_if_fail(self._tool.deprecated_port().prepare_changelog_command(), cwd=self._tool.scm().checkout_root)
         changelog_paths = self._tool.checkout().modified_changelogs(git_commit=None)
         bug_url = self._tool.bugs.bug_url_for_bug_id(state["bug_id"]) if state["bug_id"] else None
         message = self._message_for_revert(state["revision_list"], state["reason"], bug_url)
diff --git a/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert_unittest.py b/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert_unittest.py
index 076e602..3ec6e9a 100644
--- a/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/preparechangelogforrevert_unittest.py
@@ -26,27 +26,17 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import codecs
-import os
-import tempfile
-import unittest
+import unittest2 as unittest
 
 # Do not import changelog_unittest.ChangeLogTest directly as that will cause it to be run again.
 from webkitpy.common.checkout import changelog_unittest
 
 from webkitpy.common.checkout.changelog import ChangeLog
+from webkitpy.common.system.filesystem_mock import MockFileSystem
 from webkitpy.tool.steps.preparechangelogforrevert import *
 
 
 class UpdateChangeLogsForRevertTest(unittest.TestCase):
-    @staticmethod
-    def _write_tmp_file_with_contents(byte_array):
-        assert(isinstance(byte_array, str))
-        (file_descriptor, file_path) = tempfile.mkstemp()  # NamedTemporaryFile always deletes the file on close in python < 2.6
-        with os.fdopen(file_descriptor, "w") as file:
-            file.write(byte_array)
-        return file_path
-
     _revert_entry_with_bug_url = '''2009-08-19  Eric Seidel  <eric@webkit.org>
 
         Unreviewed, rolling out r12345.
@@ -110,16 +100,16 @@
 
     def _assert_message_for_revert_output(self, args, expected_entry):
         changelog_contents = u"%s\n%s" % (changelog_unittest.ChangeLogTest._new_entry_boilerplate, changelog_unittest.ChangeLogTest._example_changelog)
-        changelog_path = self._write_tmp_file_with_contents(changelog_contents.encode("utf-8"))
-        changelog = ChangeLog(changelog_path)
+        changelog_path = "ChangeLog"
+        fs = MockFileSystem({changelog_path: changelog_contents.encode("utf-8")})
+        changelog = ChangeLog(changelog_path, fs)
         changelog.update_with_unreviewed_message(PrepareChangeLogForRevert._message_for_revert(*args))
         actual_entry = changelog.latest_entry()
-        os.remove(changelog_path)
-        self.assertEquals(actual_entry.contents(), expected_entry)
-        self.assertEquals(actual_entry.reviewer_text(), None)
+        self.assertMultiLineEqual(actual_entry.contents(), expected_entry)
+        self.assertIsNone(actual_entry.reviewer_text())
         # These checks could be removed to allow this to work on other entries:
-        self.assertEquals(actual_entry.author_name(), "Eric Seidel")
-        self.assertEquals(actual_entry.author_email(), "eric@webkit.org")
+        self.assertEqual(actual_entry.author_name(), "Eric Seidel")
+        self.assertEqual(actual_entry.author_email(), "eric@webkit.org")
 
     def test_message_for_revert(self):
         self._assert_message_for_revert_output([[12345], "Reason"], self._revert_entry_without_bug_url)
diff --git a/Tools/Scripts/webkitpy/tool/steps/reopenbugafterrollout.py b/Tools/Scripts/webkitpy/tool/steps/reopenbugafterrollout.py
index f369ca9..39388f6 100644
--- a/Tools/Scripts/webkitpy/tool/steps/reopenbugafterrollout.py
+++ b/Tools/Scripts/webkitpy/tool/steps/reopenbugafterrollout.py
@@ -26,9 +26,12 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.comments import bug_comment_from_commit_text
 from webkitpy.tool.steps.abstractstep import AbstractStep
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class ReopenBugAfterRollout(AbstractStep):
@@ -38,7 +41,7 @@
 
         bug_id = state["bug_id"]
         if not bug_id:
-            log(comment_text)
-            log("No bugs were updated.")
+            _log.info(comment_text)
+            _log.info("No bugs were updated.")
             return
         self._tool.bugs.reopen_bug(bug_id, comment_text)
diff --git a/Tools/Scripts/webkitpy/tool/steps/runtests.py b/Tools/Scripts/webkitpy/tool/steps/runtests.py
index aa87291..a45628b 100644
--- a/Tools/Scripts/webkitpy/tool/steps/runtests.py
+++ b/Tools/Scripts/webkitpy/tool/steps/runtests.py
@@ -1,9 +1,9 @@
 # Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
+#
 #     * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
 #     * Redistributions in binary form must reproduce the above
@@ -13,7 +13,7 @@
 #     * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,11 +26,16 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+import os
+import platform
+import sys
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log
 from webkitpy.common.system.executive import ScriptError
 
+_log = logging.getLogger(__name__)
+
 class RunTests(AbstractStep):
     # FIXME: This knowledge really belongs in the commit-queue.
     NON_INTERACTIVE_FAILURE_LIMIT_COUNT = 30
@@ -38,6 +43,7 @@
     @classmethod
     def options(cls):
         return AbstractStep.options() + [
+            Options.build_style,
             Options.test,
             Options.non_interactive,
             Options.quiet,
@@ -50,44 +56,59 @@
         if not self._options.non_interactive:
             # FIXME: We should teach the commit-queue and the EWS how to run these tests.
 
-            python_unittests_command = self._tool.port().run_python_unittests_command()
+            python_unittests_command = self._tool.deprecated_port().run_python_unittests_command()
             if python_unittests_command:
-                log("Running Python unit tests")
+                _log.info("Running Python unit tests")
                 self._tool.executive.run_and_throw_if_fail(python_unittests_command, cwd=self._tool.scm().checkout_root)
 
-            perl_unittests_command = self._tool.port().run_perl_unittests_command()
+            perl_unittests_command = self._tool.deprecated_port().run_perl_unittests_command()
             if perl_unittests_command:
-                log("Running Perl unit tests")
+                _log.info("Running Perl unit tests")
                 self._tool.executive.run_and_throw_if_fail(perl_unittests_command, cwd=self._tool.scm().checkout_root)
 
-            javascriptcore_tests_command = self._tool.port().run_javascriptcore_tests_command()
+            javascriptcore_tests_command = self._tool.deprecated_port().run_javascriptcore_tests_command()
             if javascriptcore_tests_command:
-                log("Running JavaScriptCore tests")
+                _log.info("Running JavaScriptCore tests")
                 self._tool.executive.run_and_throw_if_fail(javascriptcore_tests_command, quiet=True, cwd=self._tool.scm().checkout_root)
 
-        webkit_unit_tests_command = self._tool.port().run_webkit_unit_tests_command()
-        if webkit_unit_tests_command:
-            log("Running WebKit unit tests")
-            args = webkit_unit_tests_command
-            if self._options.non_interactive:
-                args.append("--gtest_output=xml:%s/webkit_unit_tests_output.xml" % self._tool.port().results_directory)
+        bindings_tests_command = self._tool.deprecated_port().run_bindings_tests_command()
+        if bindings_tests_command:
+            _log.info("Running bindings generation tests")
+            args = bindings_tests_command
             try:
                 self._tool.executive.run_and_throw_if_fail(args, cwd=self._tool.scm().checkout_root)
             except ScriptError, e:
-                log("Error running webkit_unit_tests: %s" % e.message_with_output())
+                _log.info("Error running run-bindings-tests: %s" % e.message_with_output())
 
-        log("Running run-webkit-tests")
-        args = self._tool.port().run_webkit_tests_command()
+        webkit_unit_tests_command = self._tool.deprecated_port().run_webkit_unit_tests_command()
+        if webkit_unit_tests_command:
+            _log.info("Running WebKit unit tests")
+            args = webkit_unit_tests_command
+            try:
+                self._tool.executive.run_and_throw_if_fail(args, cwd=self._tool.scm().checkout_root)
+            except ScriptError, e:
+                _log.info("Error running webkit_unit_tests: %s" % e.message_with_output())
+
+
+        _log.info("Running run-webkit-tests")
+        args = self._tool.deprecated_port().run_webkit_tests_command()
         if self._options.non_interactive:
             args.extend([
                 "--no-new-test-results",
-                "--no-launch-safari",
-                "--skip-failing-tests",
+                "--no-show-results",
                 "--exit-after-n-failures=%s" % self.NON_INTERACTIVE_FAILURE_LIMIT_COUNT,
-                "--results-directory=%s" % self._tool.port().results_directory,
-                "--quiet",
             ])
 
+            # old-run-webkit-tests does not support --skip-failing-tests
+            # Using --quiet one Windows fails when we try to use /dev/null, disabling for now until we find a fix
+            if sys.platform != "cygwin":
+                args.append("--quiet")
+                args.append("--skip-failing-tests")
+            else:
+                args.append("--no-build");
+
         if self._options.quiet:
             args.append("--quiet")
+
         self._tool.executive.run_and_throw_if_fail(args, cwd=self._tool.scm().checkout_root)
+        
diff --git a/Tools/Scripts/webkitpy/tool/steps/runtests_unittest.py b/Tools/Scripts/webkitpy/tool/steps/runtests_unittest.py
index bf888e5..ef8920e 100644
--- a/Tools/Scripts/webkitpy/tool/steps/runtests_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/runtests_unittest.py
@@ -26,7 +26,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import platform
+import sys
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.mocktool import MockOptions, MockTool
@@ -38,9 +40,22 @@
         tool._deprecated_port.run_python_unittests_command = lambda: None
         tool._deprecated_port.run_perl_unittests_command = lambda: None
         step = RunTests(tool, MockOptions(test=True, non_interactive=True, quiet=False))
-        expected_stderr = """Running WebKit unit tests
-MOCK run_and_throw_if_fail: ['mock-run-webkit-unit-tests', '--gtest_output=xml:/mock-results/webkit_unit_tests_output.xml'], cwd=/mock-checkout
+
+        if sys.platform != "cygwin":
+            expected_logs = """Running bindings generation tests
+MOCK run_and_throw_if_fail: ['mock-run-bindings-tests'], cwd=/mock-checkout
+Running WebKit unit tests
+MOCK run_and_throw_if_fail: ['mock-run-webkit-unit-tests'], cwd=/mock-checkout
 Running run-webkit-tests
-MOCK run_and_throw_if_fail: ['mock-run-webkit-tests', '--no-new-test-results', '--no-launch-safari', '--skip-failing-tests', '--exit-after-n-failures=30', '--results-directory=/mock-results', '--quiet'], cwd=/mock-checkout
+MOCK run_and_throw_if_fail: ['mock-run-webkit-tests', '--no-new-test-results', '--no-show-results', '--exit-after-n-failures=30', '--quiet', '--skip-failing-tests'], cwd=/mock-checkout
 """
-        OutputCapture().assert_outputs(self, step.run, [{}], expected_stderr=expected_stderr)
+        else:
+            expected_logs = """Running bindings generation tests
+MOCK run_and_throw_if_fail: ['mock-run-bindings-tests'], cwd=/mock-checkout
+Running WebKit unit tests
+MOCK run_and_throw_if_fail: ['mock-run-webkit-unit-tests'], cwd=/mock-checkout
+Running run-webkit-tests
+MOCK run_and_throw_if_fail: ['mock-run-webkit-tests', '--no-new-test-results', '--no-show-results', '--exit-after-n-failures=30', '--no-build'], cwd=/mock-checkout
+"""
+
+        OutputCapture().assert_outputs(self, step.run, [{}], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py b/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py
index 99f1749..7172ba7 100644
--- a/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/steps_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.common.config.ports import DeprecatedPort
@@ -56,8 +56,8 @@
         tool = MockTool()
         options = self._step_options()
         options.update = True
-        expected_stderr = "Updating working directory\n"
-        OutputCapture().assert_outputs(self, self._run_step, [steps.Update, tool, options], expected_stderr=expected_stderr)
+        expected_logs = "Updating working directory\n"
+        OutputCapture().assert_outputs(self, self._run_step, [steps.Update, tool, options], expected_logs=expected_logs)
 
     def test_prompt_for_bug_or_title_step(self):
         tool = MockTool()
@@ -74,43 +74,44 @@
         options.open_bug = True
         return options
 
-    def _assert_step_output_with_bug(self, step, bug_id, expected_stderr, options=None):
+    def _assert_step_output_with_bug(self, step, bug_id, expected_logs, options=None):
         state = {'bug_id': bug_id}
-        OutputCapture().assert_outputs(self, self._run_step, [step, MockTool(), options, state], expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, self._run_step, [step, MockTool(), options, state], expected_logs=expected_logs)
 
-    def _assert_post_diff_output_for_bug(self, step, bug_id, expected_stderr):
-        self._assert_step_output_with_bug(step, bug_id, expected_stderr, self._post_diff_options())
+    def _assert_post_diff_output_for_bug(self, step, bug_id, expected_logs):
+        self._assert_step_output_with_bug(step, bug_id, expected_logs, self._post_diff_options())
 
     def test_post_diff(self):
-        expected_stderr = "MOCK add_patch_to_bug: bug_id=78, description=Patch, mark_for_review=True, mark_for_commit_queue=False, mark_for_landing=False\nMOCK: user.open_url: http://example.com/78\n"
-        self._assert_post_diff_output_for_bug(steps.PostDiff, 78, expected_stderr)
+        expected_logs = "MOCK add_patch_to_bug: bug_id=78, description=Patch, mark_for_review=True, mark_for_commit_queue=False, mark_for_landing=False\nMOCK: user.open_url: http://example.com/78\n"
+        self._assert_post_diff_output_for_bug(steps.PostDiff, 78, expected_logs)
 
     def test_post_diff_for_commit(self):
-        expected_stderr = "MOCK add_patch_to_bug: bug_id=78, description=Patch for landing, mark_for_review=False, mark_for_commit_queue=False, mark_for_landing=True\n"
-        self._assert_post_diff_output_for_bug(steps.PostDiffForCommit, 78, expected_stderr)
+        expected_logs = "MOCK add_patch_to_bug: bug_id=78, description=Patch for landing, mark_for_review=False, mark_for_commit_queue=False, mark_for_landing=True\n"
+        self._assert_post_diff_output_for_bug(steps.PostDiffForCommit, 78, expected_logs)
 
     def test_ensure_bug_is_open_and_assigned(self):
-        expected_stderr = "MOCK reopen_bug 50004 with comment 'Reopening to attach new patch.'\n"
-        self._assert_step_output_with_bug(steps.EnsureBugIsOpenAndAssigned, 50004, expected_stderr)
-        expected_stderr = "MOCK reassign_bug: bug_id=50002, assignee=None\n"
-        self._assert_step_output_with_bug(steps.EnsureBugIsOpenAndAssigned, 50002, expected_stderr)
+        expected_logs = "MOCK reopen_bug 50004 with comment 'Reopening to attach new patch.'\n"
+        self._assert_step_output_with_bug(steps.EnsureBugIsOpenAndAssigned, 50004, expected_logs)
+        expected_logs = "MOCK reassign_bug: bug_id=50002, assignee=None\n"
+        self._assert_step_output_with_bug(steps.EnsureBugIsOpenAndAssigned, 50002, expected_logs)
 
     def test_runtests_args(self):
         mock_options = self._step_options()
         mock_options.non_interactive = False
         step = steps.RunTests(MockTool(log_executive=True), mock_options)
-        # FIXME: We shouldn't use a real port-object here, but there is too much to mock at the moment.
-        mock_port = DeprecatedPort()
         tool = MockTool(log_executive=True)
-        tool.port = lambda: mock_port
+        # FIXME: We shouldn't use a real port-object here, but there is too much to mock at the moment.
+        tool._deprecated_port = DeprecatedPort()
         step = steps.RunTests(tool, mock_options)
-        expected_stderr = """Running Python unit tests
+        expected_logs = """Running Python unit tests
 MOCK run_and_throw_if_fail: ['Tools/Scripts/test-webkitpy'], cwd=/mock-checkout
 Running Perl unit tests
 MOCK run_and_throw_if_fail: ['Tools/Scripts/test-webkitperl'], cwd=/mock-checkout
 Running JavaScriptCore tests
 MOCK run_and_throw_if_fail: ['Tools/Scripts/run-javascriptcore-tests'], cwd=/mock-checkout
+Running bindings generation tests
+MOCK run_and_throw_if_fail: ['Tools/Scripts/run-bindings-tests'], cwd=/mock-checkout
 Running run-webkit-tests
 MOCK run_and_throw_if_fail: ['Tools/Scripts/run-webkit-tests', '--quiet'], cwd=/mock-checkout
 """
-        OutputCapture().assert_outputs(self, step.run, [{}], expected_stderr=expected_stderr)
+        OutputCapture().assert_outputs(self, step.run, [{}], expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/steps/suggestreviewers.py b/Tools/Scripts/webkitpy/tool/steps/suggestreviewers.py
index 76bef35..40a2482 100644
--- a/Tools/Scripts/webkitpy/tool/steps/suggestreviewers.py
+++ b/Tools/Scripts/webkitpy/tool/steps/suggestreviewers.py
@@ -42,9 +42,12 @@
         if not self._options.suggest_reviewers:
             return
 
-        reviewers = self._tool.checkout().suggested_reviewers(self._options.git_commit, self._changed_files(state))
+        reviewers = self._tool.checkout().suggested_reviewers(self._options.git_commit, self._changed_files(state))[:5]
         print "The following reviewers have recently modified files in your patch:"
-        print "\n".join([reviewer.full_name for reviewer in reviewers])
+        print ", ".join([reviewer.full_name for reviewer in reviewers])
+
+        if not state.get('bug_id'):
+            return
         if not self._tool.user.confirm("Would you like to CC them?"):
             return
         reviewer_emails = [reviewer.bugzilla_email() for reviewer in reviewers]
diff --git a/Tools/Scripts/webkitpy/tool/steps/suggestreviewers_unittest.py b/Tools/Scripts/webkitpy/tool/steps/suggestreviewers_unittest.py
index e995663..fc096f1 100644
--- a/Tools/Scripts/webkitpy/tool/steps/suggestreviewers_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/suggestreviewers_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.mocktool import MockOptions, MockTool
@@ -42,5 +42,5 @@
         capture = OutputCapture()
         step = SuggestReviewers(MockTool(), MockOptions(suggest_reviewers=True, git_commit=None))
         expected_stdout = "The following reviewers have recently modified files in your patch:\nFoo Bar\n"
-        expected_stderr = "Would you like to CC them?\n"
-        capture.assert_outputs(self, step.run, [{"bug_id": "123"}], expected_stdout=expected_stdout, expected_stderr=expected_stderr)
+        expected_logs = "Would you like to CC them?\n"
+        capture.assert_outputs(self, step.run, [{"bug_id": "123"}], expected_stdout=expected_stdout, expected_logs=expected_logs)
diff --git a/Tools/Scripts/webkitpy/tool/steps/update.py b/Tools/Scripts/webkitpy/tool/steps/update.py
index cae2bbd..f703540 100644
--- a/Tools/Scripts/webkitpy/tool/steps/update.py
+++ b/Tools/Scripts/webkitpy/tool/steps/update.py
@@ -26,9 +26,12 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log
+
+_log = logging.getLogger(__name__)
 
 
 class Update(AbstractStep):
@@ -43,9 +46,9 @@
     def run(self, state):
         if not self._options.update:
             return
-        log("Updating working directory")
+        _log.info("Updating working directory")
         self._tool.executive.run_and_throw_if_fail(self._update_command(), quiet=self._options.quiet, cwd=self._tool.scm().checkout_root)
 
     def _update_command(self):
-        update_command = self._tool.port().update_webkit_command(self._options.non_interactive)
+        update_command = self._tool.deprecated_port().update_webkit_command(self._options.non_interactive)
         return update_command
diff --git a/Tools/Scripts/webkitpy/tool/steps/update_unittest.py b/Tools/Scripts/webkitpy/tool/steps/update_unittest.py
index c1a934d..0866c4b 100644
--- a/Tools/Scripts/webkitpy/tool/steps/update_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/update_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.config.ports import ChromiumPort, ChromiumAndroidPort, ChromiumXVFBPort
 from webkitpy.tool.mocktool import MockOptions, MockTool
diff --git a/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreview_unittest.py b/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreview_unittest.py
index 8ec8891..d433e3f 100644
--- a/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreview_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreview_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.tool.mocktool import MockOptions, MockTool
@@ -36,14 +36,14 @@
     def test_guess_reviewer_from_bug(self):
         capture = OutputCapture()
         step = UpdateChangeLogsWithReviewer(MockTool(), MockOptions())
-        expected_stderr = "No reviewed patches on bug 50001, cannot infer reviewer.\n"
-        capture.assert_outputs(self, step._guess_reviewer_from_bug, [50001], expected_stderr=expected_stderr)
+        expected_logs = "No reviewed patches on bug 50001, cannot infer reviewer.\n"
+        capture.assert_outputs(self, step._guess_reviewer_from_bug, [50001], expected_logs=expected_logs)
 
     def test_guess_reviewer_from_multipatch_bug(self):
         capture = OutputCapture()
         step = UpdateChangeLogsWithReviewer(MockTool(), MockOptions())
-        expected_stderr = "Guessing \"Reviewer2\" as reviewer from attachment 10001 on bug 50000.\n"
-        capture.assert_outputs(self, step._guess_reviewer_from_bug, [50000], expected_stderr=expected_stderr)
+        expected_logs = "Guessing \"Reviewer2\" as reviewer from attachment 10001 on bug 50000.\n"
+        capture.assert_outputs(self, step._guess_reviewer_from_bug, [50000], expected_logs=expected_logs)
 
     def test_empty_state(self):
         capture = OutputCapture()
diff --git a/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py b/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py
index cc3e965..ef210a0 100644
--- a/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py
+++ b/Tools/Scripts/webkitpy/tool/steps/updatechangelogswithreviewer.py
@@ -26,11 +26,15 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+
 from webkitpy.common.checkout.changelog import ChangeLog
 from webkitpy.tool.grammar import pluralize
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import log, error
+
+_log = logging.getLogger(__name__)
+
 
 class UpdateChangeLogsWithReviewer(AbstractStep):
     @classmethod
@@ -45,10 +49,10 @@
         # here as we don't currently have a way to invalidate a bug after making changes (like ObsoletePatches does).
         patches = self._tool.bugs.fetch_bug(bug_id).reviewed_patches()
         if not patches:
-            log("%s on bug %s, cannot infer reviewer." % ("No reviewed patches", bug_id))
+            _log.info("%s on bug %s, cannot infer reviewer." % ("No reviewed patches", bug_id))
             return None
         patch = patches[-1]
-        log("Guessing \"%s\" as reviewer from attachment %s on bug %s." % (patch.reviewer().full_name, patch.id(), bug_id))
+        _log.info("Guessing \"%s\" as reviewer from attachment %s on bug %s." % (patch.reviewer().full_name, patch.id(), bug_id))
         return patch.reviewer().full_name
 
     def run(self, state):
@@ -59,12 +63,12 @@
         reviewer = self._options.reviewer
         if not reviewer:
             if not bug_id:
-                log("No bug id provided and --reviewer= not provided.  Not updating ChangeLogs with reviewer.")
+                _log.info("No bug id provided and --reviewer= not provided.  Not updating ChangeLogs with reviewer.")
                 return
             reviewer = self._guess_reviewer_from_bug(bug_id)
 
         if not reviewer:
-            log("Failed to guess reviewer from bug %s and --reviewer= not provided.  Not updating ChangeLogs with reviewer." % bug_id)
+            _log.info("Failed to guess reviewer from bug %s and --reviewer= not provided.  Not updating ChangeLogs with reviewer." % bug_id)
             return
 
         # cached_lookup("changelogs") is always absolute paths.
diff --git a/Tools/Scripts/webkitpy/tool/steps/updatechromiumdeps.py b/Tools/Scripts/webkitpy/tool/steps/updatechromiumdeps.py
index c9fc631..f28695f 100644
--- a/Tools/Scripts/webkitpy/tool/steps/updatechromiumdeps.py
+++ b/Tools/Scripts/webkitpy/tool/steps/updatechromiumdeps.py
@@ -26,12 +26,16 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+import sys
 import urllib2
 
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
 from webkitpy.common.config import urls
-from webkitpy.common.system.deprecated_logging import log, error
+from webkitpy.common.net.networktransaction import NetworkTimeout
+
+_log = logging.getLogger(__name__)
 
 
 class UpdateChromiumDEPS(AbstractStep):
@@ -43,31 +47,54 @@
 
     # Notice that this method throws lots of exciting exceptions!
     def _fetch_last_known_good_revision(self):
-        return int(urllib2.urlopen(urls.chromium_lkgr_url).read())
+        return int(self._tool.web.get_binary(urls.chromium_lkgr_url))
+
+    @classmethod
+    def _parse_revision_number(cls, revision):
+        try:
+            if isinstance(revision, int):
+                return revision
+            if isinstance(revision, str):
+                return int(revision.lstrip('r'))
+            return None
+        except ValueError:
+            return None
 
     def _validate_revisions(self, current_chromium_revision, new_chromium_revision):
         if new_chromium_revision < current_chromium_revision:
             message = "Current Chromium DEPS revision %s is newer than %s." % (current_chromium_revision, new_chromium_revision)
             if self._options.non_interactive:
-                error(message)  # Causes the process to terminate.
-            log(message)
+                _log.error(message)
+                sys.exit(1)
+            _log.info(message)
             new_chromium_revision = self._tool.user.prompt("Enter new chromium revision (enter nothing to cancel):\n")
             try:
                 new_chromium_revision = int(new_chromium_revision)
             except ValueError, TypeError:
                 new_chromium_revision = None
             if not new_chromium_revision:
-                error("Unable to update Chromium DEPS")
-
+                _log.error("Unable to update Chromium DEPS.")
+                sys.exit(1)
 
     def run(self, state):
-        # Note that state["chromium_revision"] must be defined, but can be None.
         new_chromium_revision = state["chromium_revision"]
-        if not new_chromium_revision:
-            new_chromium_revision = self._fetch_last_known_good_revision()
+        if new_chromium_revision == "LKGR":
+            try:
+                new_chromium_revision = self._fetch_last_known_good_revision()
+            except ValueError:
+                _log.error("Unable to parse LKGR from: ", urls.chromium_lkgr_url)
+                sys.exit(1)
+            except NetworkTimeout:
+                _log.error("Unable to reach LKGR source: ", urls.chromium_lkgr_url)
+                sys.exit(1)
+        else:
+            new_chromium_revision = self._parse_revision_number(new_chromium_revision)
+            if not new_chromium_revision:
+                _log.error("Invalid revision number.")
+                sys.exit(1)
 
         deps = self._tool.checkout().chromium_deps()
         current_chromium_revision = deps.read_variable("chromium_rev")
         self._validate_revisions(current_chromium_revision, new_chromium_revision)
-        log("Updating Chromium DEPS to %s" % new_chromium_revision)
+        _log.info("Updating Chromium DEPS to %s" % new_chromium_revision)
         deps.write_variable("chromium_rev", new_chromium_revision)
diff --git a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py b/Tools/Scripts/webkitpy/tool/steps/updatechromiumdeps_unittest.py
similarity index 62%
copy from Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
copy to Tools/Scripts/webkitpy/tool/steps/updatechromiumdeps_unittest.py
index f06f94e..c1f79ca 100644
--- a/Tools/Scripts/webkitpy/tool/steps/cleanworkingdirectorywithlocalcommits.py
+++ b/Tools/Scripts/webkitpy/tool/steps/updatechromiumdeps_unittest.py
@@ -1,19 +1,19 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-# 
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
 # met:
-# 
-#     * Redistributions of source code must retain the above copyright
+#
+#    * Redistributions of source code must retain the above copyright
 # notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
+#    * Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following disclaimer
 # in the documentation and/or other materials provided with the
 # distribution.
-#     * Neither the name of Google Inc. nor the names of its
+#    * Neither the name of Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
-# 
+#
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -26,9 +26,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from webkitpy.tool.steps.cleanworkingdirectory import CleanWorkingDirectory
+import unittest2 as unittest
 
-class CleanWorkingDirectoryWithLocalCommits(CleanWorkingDirectory):
-    def __init__(self, tool, options):
-        # FIXME: This a bit of a hack.  Consider doing this more cleanly.
-        CleanWorkingDirectory.__init__(self, tool, options, allow_local_commits=True)
+from webkitpy.tool.steps.updatechromiumdeps import UpdateChromiumDEPS
+
+
+class UpdateChromiumDEPSTest(unittest.TestCase):
+    def test_parse_revision_number(self):
+        self.assertIsNone(UpdateChromiumDEPS._parse_revision_number(None))
+        self.assertIsNone(UpdateChromiumDEPS._parse_revision_number("invalid"))
+        self.assertEqual(1234, UpdateChromiumDEPS._parse_revision_number("1234"))
+        self.assertEqual(1234, UpdateChromiumDEPS._parse_revision_number("r1234"))
diff --git a/Tools/Scripts/webkitpy/tool/steps/validatechangelogs.py b/Tools/Scripts/webkitpy/tool/steps/validatechangelogs.py
index b6b33c0..061baa5 100644
--- a/Tools/Scripts/webkitpy/tool/steps/validatechangelogs.py
+++ b/Tools/Scripts/webkitpy/tool/steps/validatechangelogs.py
@@ -26,10 +26,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+import sys
+
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
 from webkitpy.common.checkout.diff_parser import DiffParser
-from webkitpy.common.system.deprecated_logging import error, log
+
+_log = logging.getLogger(__name__)
 
 
 # This is closely related to the ValidateReviewer step and the CommitterValidator class.
@@ -53,7 +57,7 @@
         if self._options.non_interactive:
             return False
 
-        log("The diff to %s looks wrong.  Are you sure your ChangeLog entry is at the top of the file?" % (diff_file.filename))
+        _log.info("The diff to %s looks wrong. Are you sure your ChangeLog entry is at the top of the file?" % (diff_file.filename))
         # FIXME: Do we need to make the file path absolute?
         self._tool.scm().diff_for_file(diff_file.filename)
         if self._tool.user.confirm("OK to continue?", default='n'):
@@ -73,4 +77,5 @@
             parsed_diff = DiffParser(diff.splitlines())
             for filename, diff_file in parsed_diff.files.items():
                 if not self._check_changelog_diff(diff_file):
-                    error("ChangeLog entry in %s is not at the top of the file." % diff_file.filename)
+                    _log.error("ChangeLog entry in %s is not at the top of the file." % diff_file.filename)
+                    sys.exit(1)
diff --git a/Tools/Scripts/webkitpy/tool/steps/validatechangelogs_unittest.py b/Tools/Scripts/webkitpy/tool/steps/validatechangelogs_unittest.py
index 96bae9f..8a23be4 100644
--- a/Tools/Scripts/webkitpy/tool/steps/validatechangelogs_unittest.py
+++ b/Tools/Scripts/webkitpy/tool/steps/validatechangelogs_unittest.py
@@ -26,7 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import unittest
+import unittest2 as unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.thirdparty.mock import Mock
@@ -43,10 +43,10 @@
         diff_file = Mock()
         diff_file.filename = "mock/ChangeLog"
         diff_file.lines = [(start_line, start_line, "foo")]
-        expected_stdout = expected_stderr = ""
+        expected_stdout = expected_stderr = expected_logs = ""
         if should_fail and not non_interactive:
-            expected_stderr = "The diff to mock/ChangeLog looks wrong.  Are you sure your ChangeLog entry is at the top of the file?\nOK to continue?\n"
-        result = OutputCapture().assert_outputs(self, step._check_changelog_diff, [diff_file], expected_stderr=expected_stderr)
+            expected_logs = "The diff to mock/ChangeLog looks wrong. Are you sure your ChangeLog entry is at the top of the file?\nOK to continue?\n"
+        result = OutputCapture().assert_outputs(self, step._check_changelog_diff, [diff_file], expected_logs=expected_logs)
         self.assertEqual(not result, should_fail)
 
     def test_check_changelog_diff(self):
diff --git a/Tools/Scripts/webkitpy/tool/steps/validatereviewer.py b/Tools/Scripts/webkitpy/tool/steps/validatereviewer.py
index 5e93821..90ddf5b 100644
--- a/Tools/Scripts/webkitpy/tool/steps/validatereviewer.py
+++ b/Tools/Scripts/webkitpy/tool/steps/validatereviewer.py
@@ -26,10 +26,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import logging
+import sys
+
 from webkitpy.common.checkout.changelog import ChangeLog
 from webkitpy.tool.steps.abstractstep import AbstractStep
 from webkitpy.tool.steps.options import Options
-from webkitpy.common.system.deprecated_logging import error, log
+
+_log = logging.getLogger(__name__)
 
 
 # FIXME: Some of this logic should probably be unified with CommitterValidator?
@@ -51,5 +55,6 @@
                 continue
             reviewer_text = changelog_entry.reviewer_text()
             if reviewer_text:
-                log("%s found in %s does not appear to be a valid reviewer according to committers.py." % (reviewer_text, changelog_path))
-            error('%s neither lists a valid reviewer nor contains the string "Unreviewed" or "Rubber stamp" (case insensitive).' % changelog_path)
+                _log.info("%s found in %s does not appear to be a valid reviewer according to committers.py." % (reviewer_text, changelog_path))
+            _log.error('%s neither lists a valid reviewer nor contains the string "Unreviewed" or "Rubber stamp" (case insensitive).' % changelog_path)
+            sys.exit(1)
diff --git a/Tools/Scripts/webkitpy/webkitpy.pyproj b/Tools/Scripts/webkitpy/webkitpy.pyproj
deleted file mode 100644
index 0bff5fc..0000000
--- a/Tools/Scripts/webkitpy/webkitpy.pyproj
+++ /dev/null
@@ -1,540 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{59b0a791-93fe-40f8-a52b-ba19b73e8fa6}</ProjectGuid>
-    <ProjectHome>.</ProjectHome>
-    <StartupFile>layout_tests\run_webkit_tests.py</StartupFile>
-    <SearchPath>
-    </SearchPath>
-    <WorkingDirectory>../</WorkingDirectory>
-    <OutputPath>.</OutputPath>
-    <Name>webkitpy</Name>
-    <RootNamespace>webkitpy</RootNamespace>
-    <IsWindowsApplication>False</IsWindowsApplication>
-    <LaunchProvider>Standard Python launcher</LaunchProvider>
-    <CommandLineArguments>--platform=mock --no-pixel-tests --no-retry-failures</CommandLineArguments>
-    <InterpreterPath />
-    <InterpreterArguments />
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <DebugSymbols>true</DebugSymbols>
-    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
-    <DebugSymbols>true</DebugSymbols>
-    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
-  </PropertyGroup>
-  <ItemGroup>
-    <Compile Include="bindings\main.py" />
-    <Compile Include="bindings\__init__.py" />
-    <Compile Include="common\checkout\baselineoptimizer.py" />
-    <Compile Include="common\checkout\baselineoptimizer_unittest.py" />
-    <Compile Include="common\checkout\changelog.py" />
-    <Compile Include="common\checkout\changelog_unittest.py" />
-    <Compile Include="common\checkout\checkout.py" />
-    <Compile Include="common\checkout\checkout_mock.py" />
-    <Compile Include="common\checkout\checkout_unittest.py" />
-    <Compile Include="common\checkout\commitinfo.py" />
-    <Compile Include="common\checkout\commitinfo_unittest.py" />
-    <Compile Include="common\checkout\deps.py" />
-    <Compile Include="common\checkout\deps_mock.py" />
-    <Compile Include="common\checkout\diff_parser.py" />
-    <Compile Include="common\checkout\diff_parser_unittest.py" />
-    <Compile Include="common\checkout\diff_test_data.py" />
-    <Compile Include="common\checkout\scm\commitmessage.py" />
-    <Compile Include="common\checkout\scm\detection.py" />
-    <Compile Include="common\checkout\scm\detection_unittest.py" />
-    <Compile Include="common\checkout\scm\git.py" />
-    <Compile Include="common\checkout\scm\scm.py" />
-    <Compile Include="common\checkout\scm\scm_mock.py" />
-    <Compile Include="common\checkout\scm\scm_unittest.py" />
-    <Compile Include="common\checkout\scm\svn.py" />
-    <Compile Include="common\checkout\scm\__init__.py" />
-    <Compile Include="common\checkout\__init__.py" />
-    <Compile Include="common\checksvnconfigfile.py" />
-    <Compile Include="common\config\build.py" />
-    <Compile Include="common\config\build_unittest.py" />
-    <Compile Include="common\config\committers.py" />
-    <Compile Include="common\config\committers_unittest.py" />
-    <Compile Include="common\config\committervalidator.py" />
-    <Compile Include="common\config\committervalidator_unittest.py" />
-    <Compile Include="common\config\contributionareas.py" />
-    <Compile Include="common\config\contributionareas_unittest.py" />
-    <Compile Include="common\config\irc.py" />
-    <Compile Include="common\config\ports.py" />
-    <Compile Include="common\config\ports_mock.py" />
-    <Compile Include="common\config\ports_unittest.py" />
-    <Compile Include="common\config\urls.py" />
-    <Compile Include="common\config\urls_unittest.py" />
-    <Compile Include="common\config\__init__.py" />
-    <Compile Include="common\editdistance.py" />
-    <Compile Include="common\editdistance_unittest.py" />
-    <Compile Include="common\find_files.py" />
-    <Compile Include="common\find_files_unittest.py" />
-    <Compile Include="common\host.py" />
-    <Compile Include="common\host_mock.py" />
-    <Compile Include="common\lru_cache.py" />
-    <Compile Include="common\lru_cache_unittest.py" />
-    <Compile Include="common\memoized.py" />
-    <Compile Include="common\memoized_unittest.py" />
-    <Compile Include="common\message_pool.py" />
-    <Compile Include="common\net\bugzilla\attachment.py" />
-    <Compile Include="common\net\bugzilla\bug.py" />
-    <Compile Include="common\net\bugzilla\bugzilla.py" />
-    <Compile Include="common\net\bugzilla\bugzilla_mock.py" />
-    <Compile Include="common\net\bugzilla\bugzilla_unittest.py" />
-    <Compile Include="common\net\bugzilla\bug_unittest.py" />
-    <Compile Include="common\net\bugzilla\__init__.py" />
-    <Compile Include="common\net\buildbot\buildbot.py" />
-    <Compile Include="common\net\buildbot\buildbot_mock.py" />
-    <Compile Include="common\net\buildbot\buildbot_unittest.py" />
-    <Compile Include="common\net\buildbot\chromiumbuildbot.py" />
-    <Compile Include="common\net\buildbot\__init__.py" />
-    <Compile Include="common\net\credentials.py" />
-    <Compile Include="common\net\credentials_unittest.py" />
-    <Compile Include="common\net\failuremap.py" />
-    <Compile Include="common\net\failuremap_unittest.py" />
-    <Compile Include="common\net\file_uploader.py" />
-    <Compile Include="common\net\htdigestparser.py" />
-    <Compile Include="common\net\htdigestparser_unittest.py" />
-    <Compile Include="common\net\irc\ircbot.py" />
-    <Compile Include="common\net\irc\ircproxy.py" />
-    <Compile Include="common\net\irc\ircproxy_unittest.py" />
-    <Compile Include="common\net\irc\irc_mock.py" />
-    <Compile Include="common\net\irc\__init__.py" />
-    <Compile Include="common\net\layouttestresults.py" />
-    <Compile Include="common\net\layouttestresults_unittest.py" />
-    <Compile Include="common\net\networktransaction.py" />
-    <Compile Include="common\net\networktransaction_unittest.py" />
-    <Compile Include="common\net\omahaproxy.py" />
-    <Compile Include="common\net\omahaproxy_unittest.py" />
-    <Compile Include="common\net\regressionwindow.py" />
-    <Compile Include="common\net\resultsjsonparser.py" />
-    <Compile Include="common\net\resultsjsonparser_unittest.py" />
-    <Compile Include="common\net\statusserver.py" />
-    <Compile Include="common\net\statusserver_mock.py" />
-    <Compile Include="common\net\statusserver_unittest.py" />
-    <Compile Include="common\net\unittestresults.py" />
-    <Compile Include="common\net\unittestresults_unittest.py" />
-    <Compile Include="common\net\web.py" />
-    <Compile Include="common\net\web_mock.py" />
-    <Compile Include="common\net\__init__.py" />
-    <Compile Include="common\newstringio.py" />
-    <Compile Include="common\newstringio_unittest.py" />
-    <Compile Include="common\prettypatch.py" />
-    <Compile Include="common\prettypatch_unittest.py" />
-    <Compile Include="common\read_checksum_from_png.py" />
-    <Compile Include="common\read_checksum_from_png_unittest.py" />
-    <Compile Include="common\system\autoinstall.py" />
-    <Compile Include="common\system\crashlogs.py" />
-    <Compile Include="common\system\crashlogs_unittest.py" />
-    <Compile Include="common\system\deprecated_logging.py" />
-    <Compile Include="common\system\deprecated_logging_unittest.py" />
-    <Compile Include="common\system\environment.py" />
-    <Compile Include="common\system\environment_unittest.py" />
-    <Compile Include="common\system\executive.py" />
-    <Compile Include="common\system\executive_mock.py" />
-    <Compile Include="common\system\executive_unittest.py" />
-    <Compile Include="common\system\fileset.py" />
-    <Compile Include="common\system\filesystem.py" />
-    <Compile Include="common\system\filesystem_mock.py" />
-    <Compile Include="common\system\filesystem_mock_unittest.py" />
-    <Compile Include="common\system\filesystem_unittest.py" />
-    <Compile Include="common\system\file_lock.py" />
-    <Compile Include="common\system\file_lock_integrationtest.py" />
-    <Compile Include="common\system\logtesting.py" />
-    <Compile Include="common\system\logutils.py" />
-    <Compile Include="common\system\logutils_unittest.py" />
-    <Compile Include="common\system\outputcapture.py" />
-    <Compile Include="common\system\outputcapture_unittest.py" />
-    <Compile Include="common\system\path.py" />
-    <Compile Include="common\system\path_unittest.py" />
-    <Compile Include="common\system\platforminfo.py" />
-    <Compile Include="common\system\platforminfo_mock.py" />
-    <Compile Include="common\system\platforminfo_unittest.py" />
-    <Compile Include="common\system\stack_utils.py" />
-    <Compile Include="common\system\stack_utils_unittest.py" />
-    <Compile Include="common\system\systemhost.py" />
-    <Compile Include="common\system\systemhost_mock.py" />
-    <Compile Include="common\system\urlfetcher.py" />
-    <Compile Include="common\system\urlfetcher_mock.py" />
-    <Compile Include="common\system\user.py" />
-    <Compile Include="common\system\user_mock.py" />
-    <Compile Include="common\system\user_unittest.py" />
-    <Compile Include="common\system\workspace.py" />
-    <Compile Include="common\system\workspace_mock.py" />
-    <Compile Include="common\system\workspace_unittest.py" />
-    <Compile Include="common\system\zipfileset.py" />
-    <Compile Include="common\system\zipfileset_mock.py" />
-    <Compile Include="common\system\zipfileset_unittest.py" />
-    <Compile Include="common\system\zip_mock.py" />
-    <Compile Include="common\system\__init__.py" />
-    <Compile Include="common\thread\messagepump.py" />
-    <Compile Include="common\thread\messagepump_unittest.py" />
-    <Compile Include="common\thread\threadedmessagequeue.py" />
-    <Compile Include="common\thread\threadedmessagequeue_unittest.py" />
-    <Compile Include="common\thread\__init__.py" />
-    <Compile Include="common\version_check.py" />
-    <Compile Include="common\watchlist\amountchangedpattern.py" />
-    <Compile Include="common\watchlist\amountchangedpattern_unittest.py" />
-    <Compile Include="common\watchlist\changedlinepattern.py" />
-    <Compile Include="common\watchlist\changedlinepattern_unittest.py" />
-    <Compile Include="common\watchlist\filenamepattern.py" />
-    <Compile Include="common\watchlist\filenamepattern_unittest.py" />
-    <Compile Include="common\watchlist\watchlist.py" />
-    <Compile Include="common\watchlist\watchlistloader.py" />
-    <Compile Include="common\watchlist\watchlistloader_unittest.py" />
-    <Compile Include="common\watchlist\watchlistparser.py" />
-    <Compile Include="common\watchlist\watchlistparser_unittest.py" />
-    <Compile Include="common\watchlist\watchlistrule.py" />
-    <Compile Include="common\watchlist\watchlistrule_unittest.py" />
-    <Compile Include="common\watchlist\watchlist_mock.py" />
-    <Compile Include="common\watchlist\watchlist_unittest.py" />
-    <Compile Include="common\watchlist\__init__.py" />
-    <Compile Include="common\webkitunittest.py" />
-    <Compile Include="common\__init__.py" />
-    <Compile Include="layout_tests\controllers\manager.py" />
-    <Compile Include="layout_tests\controllers\manager_unittest.py" />
-    <Compile Include="layout_tests\controllers\single_test_runner.py" />
-    <Compile Include="layout_tests\controllers\test_expectations_editor.py" />
-    <Compile Include="layout_tests\controllers\test_expectations_editor_unittest.py" />
-    <Compile Include="layout_tests\controllers\test_result_writer.py" />
-    <Compile Include="layout_tests\controllers\test_result_writer_unittest.py" />
-    <Compile Include="layout_tests\controllers\worker.py" />
-    <Compile Include="layout_tests\controllers\__init__.py" />
-    <Compile Include="layout_tests\layout_package\json_layout_results_generator.py" />
-    <Compile Include="layout_tests\layout_package\json_results_generator.py" />
-    <Compile Include="layout_tests\layout_package\json_results_generator_unittest.py" />
-    <Compile Include="layout_tests\layout_package\__init__.py" />
-    <Compile Include="layout_tests\models\result_summary.py" />
-    <Compile Include="layout_tests\models\test_configuration.py" />
-    <Compile Include="layout_tests\models\test_configuration_unittest.py" />
-    <Compile Include="layout_tests\models\test_expectations.py" />
-    <Compile Include="layout_tests\models\test_expectations_unittest.py" />
-    <Compile Include="layout_tests\models\test_failures.py" />
-    <Compile Include="layout_tests\models\test_failures_unittest.py" />
-    <Compile Include="layout_tests\models\test_input.py" />
-    <Compile Include="layout_tests\models\test_results.py" />
-    <Compile Include="layout_tests\models\test_results_unittest.py" />
-    <Compile Include="layout_tests\models\__init__.py" />
-    <Compile Include="layout_tests\port\apple.py" />
-    <Compile Include="layout_tests\port\base.py" />
-    <Compile Include="layout_tests\port\base_unittest.py" />
-    <Compile Include="layout_tests\port\builders.py" />
-    <Compile Include="layout_tests\port\builders_unittest.py" />
-    <Compile Include="layout_tests\port\chromium.py" />
-    <Compile Include="layout_tests\port\chromium_android.py" />
-    <Compile Include="layout_tests\port\chromium_android_unittest.py" />
-    <Compile Include="layout_tests\port\chromium_linux.py" />
-    <Compile Include="layout_tests\port\chromium_linux_unittest.py" />
-    <Compile Include="layout_tests\port\chromium_mac.py" />
-    <Compile Include="layout_tests\port\chromium_mac_unittest.py" />
-    <Compile Include="layout_tests\port\chromium_port_testcase.py" />
-    <Compile Include="layout_tests\port\chromium_unittest.py" />
-    <Compile Include="layout_tests\port\chromium_win.py" />
-    <Compile Include="layout_tests\port\chromium_win_unittest.py" />
-    <Compile Include="layout_tests\port\config.py" />
-    <Compile Include="layout_tests\port\config_mock.py" />
-    <Compile Include="layout_tests\port\config_standalone.py" />
-    <Compile Include="layout_tests\port\config_unittest.py" />
-    <Compile Include="layout_tests\port\driver.py" />
-    <Compile Include="layout_tests\port\driver_unittest.py" />
-    <Compile Include="layout_tests\port\efl.py" />
-    <Compile Include="layout_tests\port\efl_unittest.py" />
-    <Compile Include="layout_tests\port\factory.py" />
-    <Compile Include="layout_tests\port\factory_unittest.py" />
-    <Compile Include="layout_tests\port\gtk.py" />
-    <Compile Include="layout_tests\port\gtk_unittest.py" />
-    <Compile Include="layout_tests\port\http_lock.py" />
-    <Compile Include="layout_tests\port\http_lock_unittest.py" />
-    <Compile Include="layout_tests\port\leakdetector.py" />
-    <Compile Include="layout_tests\port\leakdetector_unittest.py" />
-    <Compile Include="layout_tests\port\mac.py" />
-    <Compile Include="layout_tests\port\mac_unittest.py" />
-    <Compile Include="layout_tests\port\mock_drt.py" />
-    <Compile Include="layout_tests\port\mock_drt_unittest.py" />
-    <Compile Include="layout_tests\port\port_testcase.py" />
-    <Compile Include="layout_tests\port\pulseaudio_sanitizer.py" />
-    <Compile Include="layout_tests\port\qt.py" />
-    <Compile Include="layout_tests\port\qt_unittest.py" />
-    <Compile Include="layout_tests\port\server_process.py" />
-    <Compile Include="layout_tests\port\server_process_unittest.py" />
-    <Compile Include="layout_tests\port\test.py" />
-    <Compile Include="layout_tests\port\webkit.py" />
-    <Compile Include="layout_tests\port\webkit_unittest.py" />
-    <Compile Include="layout_tests\port\win.py" />
-    <Compile Include="layout_tests\port\win_unittest.py" />
-    <Compile Include="layout_tests\port\xvfbdriver.py" />
-    <Compile Include="layout_tests\port\__init__.py" />
-    <Compile Include="layout_tests\reftests\extract_reference_link.py" />
-    <Compile Include="layout_tests\reftests\extract_reference_link_unittest.py" />
-    <Compile Include="layout_tests\reftests\__init__.py" />
-    <Compile Include="layout_tests\run_webkit_tests.py" />
-    <Compile Include="layout_tests\run_webkit_tests_integrationtest.py" />
-    <Compile Include="layout_tests\servers\apache_http_server.py" />
-    <Compile Include="layout_tests\servers\apache_http_server_unittest.py" />
-    <Compile Include="layout_tests\servers\http_server.py" />
-    <Compile Include="layout_tests\servers\http_server_base.py" />
-    <Compile Include="layout_tests\servers\http_server_integrationtest.py" />
-    <Compile Include="layout_tests\servers\http_server_unittest.py" />
-    <Compile Include="layout_tests\servers\websocket_server.py" />
-    <Compile Include="layout_tests\servers\__init__.py" />
-    <Compile Include="layout_tests\views\metered_stream.py" />
-    <Compile Include="layout_tests\views\metered_stream_unittest.py" />
-    <Compile Include="layout_tests\views\printing.py" />
-    <Compile Include="layout_tests\views\printing_unittest.py" />
-    <Compile Include="layout_tests\views\__init__.py" />
-    <Compile Include="layout_tests\__init__.py" />
-    <Compile Include="performance_tests\perftest.py" />
-    <Compile Include="performance_tests\perftestsrunner.py" />
-    <Compile Include="performance_tests\perftestsrunner_unittest.py" />
-    <Compile Include="performance_tests\perftest_unittest.py" />
-    <Compile Include="performance_tests\__init__.py" />
-    <Compile Include="style\checker.py" />
-    <Compile Include="style\checkers\changelog.py" />
-    <Compile Include="style\checkers\changelog_unittest.py" />
-    <Compile Include="style\checkers\common.py" />
-    <Compile Include="style\checkers\common_unittest.py" />
-    <Compile Include="style\checkers\cpp.py" />
-    <Compile Include="style\checkers\cpp_unittest.py" />
-    <Compile Include="style\checkers\jsonchecker.py" />
-    <Compile Include="style\checkers\jsonchecker_unittest.py" />
-    <Compile Include="style\checkers\png.py" />
-    <Compile Include="style\checkers\png_unittest.py" />
-    <Compile Include="style\checkers\python.py" />
-    <Compile Include="style\checkers\python_unittest.py" />
-    <Compile Include="style\checkers\python_unittest_input.py" />
-    <Compile Include="style\checkers\test_expectations.py" />
-    <Compile Include="style\checkers\test_expectations_unittest.py" />
-    <Compile Include="style\checkers\text.py" />
-    <Compile Include="style\checkers\text_unittest.py" />
-    <Compile Include="style\checkers\watchlist.py" />
-    <Compile Include="style\checkers\watchlist_unittest.py" />
-    <Compile Include="style\checkers\xcodeproj.py" />
-    <Compile Include="style\checkers\xcodeproj_unittest.py" />
-    <Compile Include="style\checkers\xml.py" />
-    <Compile Include="style\checkers\xml_unittest.py" />
-    <Compile Include="style\checkers\__init__.py" />
-    <Compile Include="style\checker_unittest.py" />
-    <Compile Include="style\error_handlers.py" />
-    <Compile Include="style\error_handlers_unittest.py" />
-    <Compile Include="style\filereader.py" />
-    <Compile Include="style\filereader_unittest.py" />
-    <Compile Include="style\filter.py" />
-    <Compile Include="style\filter_unittest.py" />
-    <Compile Include="style\main.py" />
-    <Compile Include="style\main_unittest.py" />
-    <Compile Include="style\optparser.py" />
-    <Compile Include="style\optparser_unittest.py" />
-    <Compile Include="style\patchreader.py" />
-    <Compile Include="style\patchreader_unittest.py" />
-    <Compile Include="style\__init__.py" />
-    <Compile Include="test\finder.py" />
-    <Compile Include="test\finder_unittest.py" />
-    <Compile Include="test\main.py" />
-    <Compile Include="test\main_unittest.py" />
-    <Compile Include="test\printer.py" />
-    <Compile Include="test\runner.py" />
-    <Compile Include="test\runner_unittest.py" />
-    <Compile Include="test\skip.py" />
-    <Compile Include="test\skip_unittest.py" />
-    <Compile Include="test\__init__.py" />
-    <Compile Include="thirdparty\BeautifulSoup.py" />
-    <Compile Include="thirdparty\mock.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\common.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\dispatch.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\extensions.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\handshake\draft75.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\handshake\hybi.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\handshake\hybi00.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\handshake\_base.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\handshake\__init__.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\headerparserhandler.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\http_header_util.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\memorizingfile.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\msgutil.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\standalone.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\stream.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\util.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\_stream_base.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\_stream_hixie75.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\_stream_hybi.py" />
-    <Compile Include="thirdparty\mod_pywebsocket\__init__.py" />
-    <Compile Include="thirdparty\ordered_dict.py" />
-    <Compile Include="thirdparty\__init__.py" />
-    <Compile Include="thirdparty\__init___unittest.py" />
-    <Compile Include="tool\bot\botinfo.py" />
-    <Compile Include="tool\bot\botinfo_unittest.py" />
-    <Compile Include="tool\bot\commitqueuetask.py" />
-    <Compile Include="tool\bot\commitqueuetask_unittest.py" />
-    <Compile Include="tool\bot\earlywarningsystemtask.py" />
-    <Compile Include="tool\bot\expectedfailures.py" />
-    <Compile Include="tool\bot\expectedfailures_unittest.py" />
-    <Compile Include="tool\bot\feeders.py" />
-    <Compile Include="tool\bot\feeders_unittest.py" />
-    <Compile Include="tool\bot\flakytestreporter.py" />
-    <Compile Include="tool\bot\flakytestreporter_unittest.py" />
-    <Compile Include="tool\bot\irc_command.py" />
-    <Compile Include="tool\bot\irc_command_unittest.py" />
-    <Compile Include="tool\bot\ircbot.py" />
-    <Compile Include="tool\bot\ircbot_unittest.py" />
-    <Compile Include="tool\bot\layouttestresultsreader.py" />
-    <Compile Include="tool\bot\layouttestresultsreader_unittest.py" />
-    <Compile Include="tool\bot\patchanalysistask.py" />
-    <Compile Include="tool\bot\queueengine.py" />
-    <Compile Include="tool\bot\queueengine_unittest.py" />
-    <Compile Include="tool\bot\sheriff.py" />
-    <Compile Include="tool\bot\sheriff_unittest.py" />
-    <Compile Include="tool\bot\stylequeuetask.py" />
-    <Compile Include="tool\bot\__init__.py" />
-    <Compile Include="tool\commands\abstractlocalservercommand.py" />
-    <Compile Include="tool\commands\abstractsequencedcommand.py" />
-    <Compile Include="tool\commands\adduserstogroups.py" />
-    <Compile Include="tool\commands\analyzechangelog.py" />
-    <Compile Include="tool\commands\analyzechangelog_unittest.py" />
-    <Compile Include="tool\commands\applywatchlistlocal.py" />
-    <Compile Include="tool\commands\applywatchlistlocal_unittest.py" />
-    <Compile Include="tool\commands\bugfortest.py" />
-    <Compile Include="tool\commands\bugsearch.py" />
-    <Compile Include="tool\commands\chromechannels.py" />
-    <Compile Include="tool\commands\chromechannels_unittest.py" />
-    <Compile Include="tool\commands\commandtest.py" />
-    <Compile Include="tool\commands\download.py" />
-    <Compile Include="tool\commands\download_unittest.py" />
-    <Compile Include="tool\commands\earlywarningsystem.py" />
-    <Compile Include="tool\commands\earlywarningsystem_unittest.py" />
-    <Compile Include="tool\commands\expectations.py" />
-    <Compile Include="tool\commands\findusers.py" />
-    <Compile Include="tool\commands\gardenomatic.py" />
-    <Compile Include="tool\commands\openbugs.py" />
-    <Compile Include="tool\commands\openbugs_unittest.py" />
-    <Compile Include="tool\commands\prettydiff.py" />
-    <Compile Include="tool\commands\queries.py" />
-    <Compile Include="tool\commands\queries_unittest.py" />
-    <Compile Include="tool\commands\queues.py" />
-    <Compile Include="tool\commands\queuestest.py" />
-    <Compile Include="tool\commands\queues_unittest.py" />
-    <Compile Include="tool\commands\rebaseline.py" />
-    <Compile Include="tool\commands\rebaselineserver.py" />
-    <Compile Include="tool\commands\rebaseline_unittest.py" />
-    <Compile Include="tool\commands\roll.py" />
-    <Compile Include="tool\commands\roll_unittest.py" />
-    <Compile Include="tool\commands\sheriffbot.py" />
-    <Compile Include="tool\commands\sheriffbot_unittest.py" />
-    <Compile Include="tool\commands\stepsequence.py" />
-    <Compile Include="tool\commands\suggestnominations.py" />
-    <Compile Include="tool\commands\suggestnominations_unittest.py" />
-    <Compile Include="tool\commands\upload.py" />
-    <Compile Include="tool\commands\upload_unittest.py" />
-    <Compile Include="tool\commands\__init__.py" />
-    <Compile Include="tool\comments.py" />
-    <Compile Include="tool\grammar.py" />
-    <Compile Include="tool\grammar_unittest.py" />
-    <Compile Include="tool\main.py" />
-    <Compile Include="tool\mocktool.py" />
-    <Compile Include="tool\mocktool_unittest.py" />
-    <Compile Include="tool\multicommandtool.py" />
-    <Compile Include="tool\multicommandtool_unittest.py" />
-    <Compile Include="tool\servers\gardeningserver.py" />
-    <Compile Include="tool\servers\gardeningserver_unittest.py" />
-    <Compile Include="tool\servers\rebaselineserver.py" />
-    <Compile Include="tool\servers\rebaselineserver_unittest.py" />
-    <Compile Include="tool\servers\reflectionhandler.py" />
-    <Compile Include="tool\servers\__init__.py" />
-    <Compile Include="tool\steps\abstractstep.py" />
-    <Compile Include="tool\steps\addsvnmimetypeforpng.py" />
-    <Compile Include="tool\steps\addsvnmimetypeforpng_unittest.py" />
-    <Compile Include="tool\steps\applypatch.py" />
-    <Compile Include="tool\steps\applypatchwithlocalcommit.py" />
-    <Compile Include="tool\steps\applywatchlist.py" />
-    <Compile Include="tool\steps\applywatchlist_unittest.py" />
-    <Compile Include="tool\steps\attachtobug.py" />
-    <Compile Include="tool\steps\build.py" />
-    <Compile Include="tool\steps\checkstyle.py" />
-    <Compile Include="tool\steps\cleanworkingdirectory.py" />
-    <Compile Include="tool\steps\cleanworkingdirectorywithlocalcommits.py" />
-    <Compile Include="tool\steps\cleanworkingdirectory_unittest.py" />
-    <Compile Include="tool\steps\closebug.py" />
-    <Compile Include="tool\steps\closebugforlanddiff.py" />
-    <Compile Include="tool\steps\closebugforlanddiff_unittest.py" />
-    <Compile Include="tool\steps\closepatch.py" />
-    <Compile Include="tool\steps\commit.py" />
-    <Compile Include="tool\steps\commit_unittest.py" />
-    <Compile Include="tool\steps\confirmdiff.py" />
-    <Compile Include="tool\steps\createbug.py" />
-    <Compile Include="tool\steps\editchangelog.py" />
-    <Compile Include="tool\steps\ensurebugisopenandassigned.py" />
-    <Compile Include="tool\steps\ensurelocalcommitifneeded.py" />
-    <Compile Include="tool\steps\metastep.py" />
-    <Compile Include="tool\steps\obsoletepatches.py" />
-    <Compile Include="tool\steps\options.py" />
-    <Compile Include="tool\steps\postdiff.py" />
-    <Compile Include="tool\steps\postdiffforcommit.py" />
-    <Compile Include="tool\steps\postdiffforrevert.py" />
-    <Compile Include="tool\steps\preparechangelog.py" />
-    <Compile Include="tool\steps\preparechangelogfordepsroll.py" />
-    <Compile Include="tool\steps\preparechangelogforrevert.py" />
-    <Compile Include="tool\steps\preparechangelogforrevert_unittest.py" />
-    <Compile Include="tool\steps\preparechangelog_unittest.py" />
-    <Compile Include="tool\steps\promptforbugortitle.py" />
-    <Compile Include="tool\steps\reopenbugafterrollout.py" />
-    <Compile Include="tool\steps\revertrevision.py" />
-    <Compile Include="tool\steps\runtests.py" />
-    <Compile Include="tool\steps\runtests_unittest.py" />
-    <Compile Include="tool\steps\steps_unittest.py" />
-    <Compile Include="tool\steps\suggestreviewers.py" />
-    <Compile Include="tool\steps\suggestreviewers_unittest.py" />
-    <Compile Include="tool\steps\update.py" />
-    <Compile Include="tool\steps\updatechangelogswithreviewer.py" />
-    <Compile Include="tool\steps\updatechangelogswithreview_unittest.py" />
-    <Compile Include="tool\steps\updatechromiumdeps.py" />
-    <Compile Include="tool\steps\update_unittest.py" />
-    <Compile Include="tool\steps\validatechangelogs.py" />
-    <Compile Include="tool\steps\validatechangelogs_unittest.py" />
-    <Compile Include="tool\steps\validatereviewer.py" />
-    <Compile Include="tool\steps\__init__.py" />
-    <Compile Include="tool\__init__.py" />
-    <Compile Include="to_be_moved\update_webgl_conformance_tests.py" />
-    <Compile Include="to_be_moved\update_webgl_conformance_tests_unittest.py" />
-    <Compile Include="to_be_moved\__init__.py" />
-    <Compile Include="__init__.py" />
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="bindings\" />
-    <Folder Include="common\" />
-    <Folder Include="common\checkout\" />
-    <Folder Include="common\checkout\scm\" />
-    <Folder Include="common\config\" />
-    <Folder Include="common\net\" />
-    <Folder Include="common\net\bugzilla\" />
-    <Folder Include="common\net\buildbot\" />
-    <Folder Include="common\net\irc\" />
-    <Folder Include="common\system\" />
-    <Folder Include="common\thread\" />
-    <Folder Include="common\watchlist\" />
-    <Folder Include="layout_tests\" />
-    <Folder Include="layout_tests\controllers\" />
-    <Folder Include="layout_tests\layout_package\" />
-    <Folder Include="layout_tests\models\" />
-    <Folder Include="layout_tests\port\" />
-    <Folder Include="layout_tests\reftests\" />
-    <Folder Include="layout_tests\servers\" />
-    <Folder Include="layout_tests\views\" />
-    <Folder Include="performance_tests\" />
-    <Folder Include="style\" />
-    <Folder Include="style\checkers\" />
-    <Folder Include="test\" />
-    <Folder Include="thirdparty\" />
-    <Folder Include="thirdparty\mod_pywebsocket\" />
-    <Folder Include="thirdparty\mod_pywebsocket\handshake\" />
-    <Folder Include="tool\" />
-    <Folder Include="tool\bot\" />
-    <Folder Include="tool\commands\" />
-    <Folder Include="tool\servers\" />
-    <Folder Include="tool\steps\" />
-    <Folder Include="to_be_moved\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
-</Project>
\ No newline at end of file
diff --git a/Tools/Scripts/webkitpy/webkitpy.sln b/Tools/Scripts/webkitpy/webkitpy.sln
deleted file mode 100644
index 7648387..0000000
--- a/Tools/Scripts/webkitpy/webkitpy.sln
+++ /dev/null
@@ -1,18 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "webkitpy", "webkitpy.pyproj", "{59B0A791-93FE-40F8-A52B-BA19B73E8FA6}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{59B0A791-93FE-40F8-A52B-BA19B73E8FA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{59B0A791-93FE-40F8-A52B-BA19B73E8FA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/fake-data-failing-expected.txt b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/fake-data-failing-expected.txt
new file mode 100644
index 0000000..32e966f
--- /dev/null
+++ b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/fake-data-failing-expected.txt
@@ -0,0 +1,11 @@
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:2' included forbidden macro 'PLATFORM' => '#if PLATFORM(MAC)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:4' included forbidden macro 'CPU' => '#if CPU(X86)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:6' included forbidden macro 'OS' => '#if OS(DARWIN)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:8' included forbidden macro 'COMPILER' => '#if COMPILER(CLANG)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:10' included forbidden macro 'ENABLE' => '#if ENABLE(FEATURE)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:12' included forbidden macro 'HAVE' => '#if HAVE(FEATURE)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:14' included forbidden macro 'USE' => '#if USE(FEATURE)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:16' included forbidden macro 'COMPILER' => '#if COMPILER_SUPPORTS(FEATURE)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:18' included forbidden macro 'COMPILER' => '#if COMPILER_QUIRK(FEATURE)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:23' included forbidden macro 'PLATFORM' => '  #if PLATFORM(X)'
+ERROR: '--stripped--/Fake.framework/Headers/Fail.h:28' included forbidden macro 'PLATFORM' => '#if defined(ignored) && PLATFORM(X)'
diff --git a/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/pass-expected.txt b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/pass-expected.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/pass-expected.txt
diff --git a/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Fail.h b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Fail.h
new file mode 100644
index 0000000..6b42092
--- /dev/null
+++ b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Fail.h
@@ -0,0 +1,29 @@
+// Common macros that we want to catch.
+#if PLATFORM(MAC)
+#endif
+#if CPU(X86)
+#endif
+#if OS(DARWIN)
+#endif
+#if COMPILER(CLANG)
+#endif
+#if ENABLE(FEATURE)
+#endif
+#if HAVE(FEATURE)
+#endif
+#if USE(FEATURE)
+#endif
+#if COMPILER_SUPPORTS(FEATURE)
+#endif
+#if COMPILER_QUIRK(FEATURE)
+#endif
+
+// Indented.
+#if 1
+  #if PLATFORM(X)
+  #endif
+#endif
+
+// Conditionals, we don't evalute. We just check for the existence of the macro.
+#if defined(ignored) && PLATFORM(X)
+#endif
diff --git a/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Pass.h b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Pass.h
new file mode 100644
index 0000000..3a8a15d
--- /dev/null
+++ b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/resources/Fake.framework/Headers/Pass.h
@@ -0,0 +1,6 @@
+// A macro word in a #error should not matter, that is just a coincidence.
+#error PLATFORM
+
+// There are references to a OS2, but that is not the OS() macro.
+#if defined(__OS2__) || defined(OS2)
+#endif
diff --git a/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/run-test.rb b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/run-test.rb
new file mode 100755
index 0000000..e362ba3
--- /dev/null
+++ b/Tools/Scripts/webkitruby/check-for-inappropriate-macros-in-external-headers-tests/run-test.rb
@@ -0,0 +1,74 @@
+#!/usr/bin/env ruby
+
+# Copyright (C) 2012 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+# Testing Tools/Scripts/check-for-macros-in-external-headers
+$test_directory = File.dirname(__FILE__)
+$tool = File.expand_path(File.join($test_directory, '..', '..', 'check-for-inappropriate-macros-in-external-headers'))
+puts "Testing: Tools/Scripts/check-for-inappropriate-macros-in-external-headers"
+
+$was_failure = false
+
+def sanitized_output(output)
+  lines = output.split("\n").map { |line| line.sub(/\'(.*)?\/(.*)?\.framework/, "'--stripped--/\\2.framework") }
+  lines.join("\n") + (lines.empty? ? "" : "\n")
+end
+
+def run_test(config)
+  ENV['TARGET_BUILD_DIR'] = File.join($test_directory, 'resources')
+  ENV['PROJECT_NAME'] = config[:framework]
+  ENV['SHALLOW_BUNDLE'] = config[:shallow] ? 'YES' : 'NO'
+  output = sanitized_output %x{ #{$tool} #{config[:paths].join(' ')} 2>&1 }
+
+  if config[:expectedToPass] != ($?.exitstatus == 0)
+    pass = false
+  else
+    expected_output = File.read File.join($test_directory, config[:expectedOutput])
+    pass = output == expected_output
+  end
+
+  puts "#{pass ? "PASS" : "FAIL"} - #{config[:name]}"
+  $was_failure = true if !pass
+end
+
+[
+  {
+    :name => 'test_good_fake_data',
+    :framework => 'Fake',
+    :shallow => true,
+    :paths => ['Headers/Pass.h'],
+    :expectedToPass => true,
+    :expectedOutput => 'pass-expected.txt'
+  },
+  {
+    :name => 'test_bad_fake_data',
+    :framework => 'Fake',
+    :shallow => true,
+    :paths => ['Headers/Fail.h'],
+    :expectedToPass => false,
+    :expectedOutput => 'fake-data-failing-expected.txt'
+  }
+].each { |x| run_test(x) }
+
+exit 1 if $was_failure
diff --git a/Tools/TestResultServer/generate_builders_json.py b/Tools/TestResultServer/generate_builders_json.py
new file mode 100644
index 0000000..fb5342a
--- /dev/null
+++ b/Tools/TestResultServer/generate_builders_json.py
@@ -0,0 +1,124 @@
+#!/usr/bin/env python
+# Copyright (C) 2011 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import json
+import logging
+import optparse
+import os
+import urllib2
+
+# FIXME: See if Tools/Scripts/webkitpy/layout_tests/port/builders.py should also read
+# the output json file here as its data source.
+
+
+def master_json_url(master_url):
+    return master_url + '/json/builders'
+
+
+def builder_json_url(master_url, builder):
+    return master_json_url(master_url) + '/' + urllib2.quote(builder)
+
+
+def cached_build_json_url(master_url, builder, build_number):
+    return builder_json_url(master_url, builder) + '/builds/' + str(build_number)
+
+
+def fetch_json(url):
+    logging.debug('Fetching %s' % url)
+    return json.load(urllib2.urlopen(url))
+
+
+def insert_builder_and_test_data(masters):
+    for master in masters:
+        master_url = master['url']
+        tests_object = {}
+        master['tests'] = tests_object
+
+        for builder in fetch_json(master_json_url(master_url)):
+            build_data = fetch_json(builder_json_url(master_url, builder))
+            cached_builds = build_data['cachedBuilds']
+            current_builds = build_data['currentBuilds']
+
+            latest_cached_build = cached_builds.pop()
+            while latest_cached_build in current_builds and len(cached_builds):
+                latest_cached_build = cached_builds.pop()
+
+            for step in fetch_json(cached_build_json_url(master_url, builder, latest_cached_build))['steps']:
+                step_name = step['name']
+
+                # The chromium bots call this step webkit-tests, the webkit.org bots call it layout-test. :(
+                # The files stored at test-results.appspot.com use layout-tests as the test suite name, so normalize to that.
+                if step_name in ['layout-test', 'webkit_tests']:
+                    step_name = 'layout-tests'
+
+                is_test = step_name == 'layout-tests' if master['name'] == 'webkit.org' else 'test' in step_name and 'archive' not in step_name
+                if not is_test:
+                    continue
+
+                if step_name not in tests_object:
+                    tests_object[step_name] = {'builders': []}
+                tests_object[step_name]['builders'].append(builder)
+
+    for step_name in tests_object:
+        tests_object[step_name]['builders'].sort()
+
+
+def main():
+    option_parser = optparse.OptionParser()
+    option_parser.add_option('-v', '--verbose', action='store_true', default=False, help='Print debug logging')
+    options, args = option_parser.parse_args()
+
+    logging.getLogger().setLevel(logging.DEBUG if options.verbose else logging.INFO)
+
+    masters = [
+        {'name': 'ChromiumWin', 'url': 'http://build.chromium.org/p/chromium.win'},
+        {'name': 'ChromiumMac', 'url': 'http://build.chromium.org/p/chromium.mac'},
+        {'name': 'ChromiumLinux', 'url': 'http://build.chromium.org/p/chromium.linux'},
+        {'name': 'ChromiumChromiumOS', 'url': 'http://build.chromium.org/p/chromium.chromiumos'},
+        {'name': 'ChromiumGPU', 'url': 'http://build.chromium.org/p/chromium.gpu'},
+        {'name': 'ChromiumGPUFYI', 'url': 'http://build.chromium.org/p/chromium.gpu.fyi'},
+        {'name': 'ChromiumPerfAv', 'url': 'http://build.chromium.org/p/chromium.perf_av'},
+        {'name': 'ChromiumWebkit', 'url': 'http://build.chromium.org/p/chromium.webkit'},
+        {'name': 'ChromiumFYI', 'url': 'http://build.chromium.org/p/chromium.fyi'},
+        {'name': 'webkit.org', 'url': 'http://build.webkit.org'},
+    ]
+
+    insert_builder_and_test_data(masters)
+
+    json_file_prefix = ('// This file is auto-generated by Tools/TestResultServer/generate_builders_json.py. It should not be manually modified.\n'
+        '// It uses jsonp instead of proper json because we want to be able to load it from a file URL in Chrome for local testing.\n'
+        'LOAD_BUILDBOT_DATA(')
+    json_file_suffix = ');\n';
+
+    json_file = open(os.path.join('static-dashboards', 'builders.jsonp'), 'w')
+    json_file.write(json_file_prefix + json.dumps(masters, separators=(', ', ': '), indent=4, sort_keys=True) + json_file_suffix)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/Tools/TestResultServer/generate_builders_json_unittest.py b/Tools/TestResultServer/generate_builders_json_unittest.py
new file mode 100644
index 0000000..588c939
--- /dev/null
+++ b/Tools/TestResultServer/generate_builders_json_unittest.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+# Copyright (C) 2012 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import logging
+import unittest
+
+import generate_builders_json
+
+
+class GenerateBuildersJsonTest(unittest.TestCase):
+
+    def test_master_json_url(self):
+        self.assertEqual(generate_builders_json.master_json_url('http://base'), 'http://base/json/builders')
+
+    def test_builder_json_url(self):
+        self.assertEqual(generate_builders_json.builder_json_url('http://base', 'dummybuilder'), 'http://base/json/builders/dummybuilder')
+
+    def test_cached_build_json_url(self):
+        self.assertEqual(generate_builders_json.cached_build_json_url('http://base', 'dummybuilder', 12345), 'http://base/json/builders/dummybuilder/builds/12345')
+        self.assertEqual(generate_builders_json.cached_build_json_url('http://base', 'dummybuilder', '12345'), 'http://base/json/builders/dummybuilder/builds/12345')
+
+    def test_generate_json_data(self):
+        try:
+            old_fetch_json = generate_builders_json.fetch_json
+
+            fetched_urls = []
+
+            def dummy_fetch_json(url):
+                fetched_urls.append(url)
+
+                if url == 'http://build.chromium.org/p/chromium.webkit/json/builders':
+                    return {'WebKit Win': None, 'WebKit Linux': None, 'WebKit Mac': None}
+                if url == 'http://build.webkit.org/json/builders':
+                    return {'Apple Mac SnowLeopard Tests': None, 'Chromium Mac Builder': None, 'GTK': None}
+
+                if url == 'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Linux':
+                    return {'cachedBuilds': [1, 2], 'currentBuilds': []}
+                if url == 'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Win':
+                    return {'cachedBuilds': [1, 2], 'currentBuilds': []}
+                if url == 'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Mac':
+                    return {'cachedBuilds': [1, 2], 'currentBuilds': []}
+                if url == 'http://build.webkit.org/json/builders/Apple%20Mac%20SnowLeopard%20Tests':
+                    return {'cachedBuilds': [1, 2], 'currentBuilds': []}
+                if url == 'http://build.webkit.org/json/builders/Chromium%20Mac%20Builder':
+                    return {'cachedBuilds': [1, 2, 3], 'currentBuilds': [3]}
+                if url == 'http://build.webkit.org/json/builders/GTK':
+                    return {'cachedBuilds': [2], 'currentBuilds': []}
+
+                if url == 'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Linux/builds/2':
+                    return {'steps': [{'name': 'webkit_tests'}, {'name': 'browser_tests'}, {'name': 'mini_installer_test'}, {'name': 'archive_test_results'}, {'name': 'compile'}]}
+                if url == 'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Win/builds/2':
+                    return {'steps': [{'name': 'webkit_tests'}, {'name': 'mini_installer_test'}, {'name': 'archive_test_results'}, {'name': 'compile'}]}
+                if url == 'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Mac/builds/2':
+                    return {'steps': [{'name': 'browser_tests'}, {'name': 'mini_installer_test'}, {'name': 'archive_test_results'}, {'name': 'compile'}]}
+                if url == 'http://build.webkit.org/json/builders/Apple%20Mac%20SnowLeopard%20Tests/builds/2':
+                    return {'steps': [{'name': 'layout-test'}, {'name': 'archive_test_results'}, {'name': 'compile'}]}
+                if url == 'http://build.webkit.org/json/builders/Chromium%20Mac%20Builder/builds/2':
+                    return {'steps': [{'name': 'compile'}]}
+                if url == 'http://build.webkit.org/json/builders/GTK/builds/2':
+                    return {'steps': [{'name': 'layout-test'}, {'name': 'archive_test_results'}, {'name': 'compile'}]}
+
+                logging.error('Cannot fetch fake url: %s' % url)
+
+            generate_builders_json.fetch_json = dummy_fetch_json
+
+            masters = [
+                {'name': 'ChromiumWebkit', 'url': 'http://build.chromium.org/p/chromium.webkit'},
+                {'name': 'webkit.org', 'url': 'http://build.webkit.org'},
+            ]
+
+            generate_builders_json.insert_builder_and_test_data(masters)
+
+            expected_fetched_urls = [
+                'http://build.chromium.org/p/chromium.webkit/json/builders',
+                'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Linux',
+                'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Linux/builds/2',
+                'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Mac',
+                'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Mac/builds/2',
+                'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Win',
+                'http://build.chromium.org/p/chromium.webkit/json/builders/WebKit%20Win/builds/2',
+                'http://build.webkit.org/json/builders',
+                'http://build.webkit.org/json/builders/Apple%20Mac%20SnowLeopard%20Tests',
+                'http://build.webkit.org/json/builders/Apple%20Mac%20SnowLeopard%20Tests/builds/2',
+                'http://build.webkit.org/json/builders/GTK',
+                'http://build.webkit.org/json/builders/GTK/builds/2',
+                'http://build.webkit.org/json/builders/Chromium%20Mac%20Builder',
+                'http://build.webkit.org/json/builders/Chromium%20Mac%20Builder/builds/2']
+            self.assertEqual(fetched_urls, expected_fetched_urls)
+
+            expected_masters = [
+                {
+                    'url': 'http://build.chromium.org/p/chromium.webkit',
+                    'tests': {
+                        'browser_tests': {'builders': ['WebKit Linux', 'WebKit Mac']},
+                        'mini_installer_test': {'builders': ['WebKit Linux', 'WebKit Mac', 'WebKit Win']},
+                        'layout-tests': {'builders': ['WebKit Linux', 'WebKit Win']}},
+                    'name': 'ChromiumWebkit'},
+                {
+                    'url': 'http://build.webkit.org',
+                    'tests': {
+                        'layout-tests': {'builders': ['Apple Mac SnowLeopard Tests', 'GTK']}},
+                    'name': 'webkit.org'}]
+            self.assertEqual(masters, expected_masters)
+
+        finally:
+            generate_builders_json.fetch_json = old_fetch_json
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tools/TestResultServer/model/jsonresults_unittest.py b/Tools/TestResultServer/model/jsonresults_unittest.py
index 4d5fa9d..0e65d0b 100755
--- a/Tools/TestResultServer/model/jsonresults_unittest.py
+++ b/Tools/TestResultServer/model/jsonresults_unittest.py
@@ -127,7 +127,7 @@
 
         if expected_data:
             expected_results = self._make_test_json(expected_data)
-            self.assertEquals(merged_results, expected_results)
+            self.assertEqual(merged_results, expected_results)
         else:
             self.assertFalse(merged_results)
 
@@ -135,7 +135,7 @@
         input_results = self._make_test_json(input_data)
         expected_results = JSON_RESULTS_TEST_LIST_TEMPLATE.replace("{[TESTDATA_TESTS]}", simplejson.dumps(expected_data, separators=(',', ':')))
         actual_results = JsonResults.get_test_list(self._builder, input_results)
-        self.assertEquals(actual_results, expected_results)
+        self.assertEqual(actual_results, expected_results)
 
     def test_merge_null_incremental_results(self):
         # Empty incremental results json.
diff --git a/Tools/TestResultServer/static-dashboards/aggregate_results.html b/Tools/TestResultServer/static-dashboards/aggregate_results.html
index fa033a5..2790ddc 100644
--- a/Tools/TestResultServer/static-dashboards/aggregate_results.html
+++ b/Tools/TestResultServer/static-dashboards/aggregate_results.html
@@ -52,248 +52,11 @@
 </style>
 <script src="builders.js"></script>
 <script src="loader.js"></script>
+<script src="string.js"></script>
+<script src="history.js"></script>
 <script src="dashboard_base.js"></script>
-<script>
-// @fileoverview Creates a dashboard for tracking number of passes/failures per run.
-//
-// Currently, only webkit tests are supported, but adding other test types
-// should just require the following steps:
-//     -generate results.json for these tests
-//     -copy them to the appropriate location
-//     -add the builder name to the list of builders in dashboard_base.js.
-
-//////////////////////////////////////////////////////////////////////////////
-// Methods and objects from dashboard_base.js to override.
-//////////////////////////////////////////////////////////////////////////////
-function generatePage()
-{
-    var html = htmlForTestTypeSwitcher(true) + '<br>';
-    for (var builder in g_builders)
-        html += htmlForBuilder(builder);
-    document.body.innerHTML = html;
-}
-
-function handleValidHashParameter(key, value)
-{
-    switch(key) {
-    case 'rawValues':
-        g_currentState[key] = value == 'true';
-        return true;
-
-    default:
-        return false;
-    }
-}
-
-g_defaultDashboardSpecificStateValues = {
-    rawValues: false
-};
-
-function htmlForBuilder(builder)
-{
-    var results = g_resultsByBuilder[builder];
-    // Some keys were added later than others, so they don't have as many
-    // builds. Use the shortest.
-    // FIXME: Once 500 runs have finished, we can get rid of passing this
-    // around and just assume all keys have the same number of builders for a
-    // given builder.
-    var numColumns = results[ALL_FIXABLE_COUNT_KEY].length;
-    var html = '<div class=container><h2>' + builder + '</h2>';
-
-    if (g_currentState.rawValues)
-        html += rawValuesHTML(results, numColumns);
-    else {
-        html += '<a href="timeline_explorer.html' + (location.hash ? location.hash + '&' : '#') + 'builder=' + builder + '">' +
-            chartHTML(results, numColumns) + '</a>';
-    }
-
-    html += '</div>';
-    return html;
-}
-
-function rawValuesHTML(results, numColumns)
-{
-    var html = htmlForSummaryTable(results, numColumns) +
-        htmlForTestType(results, FIXABLE_COUNTS_KEY, FIXABLE_DESCRIPTION, numColumns);
-    if (isLayoutTestResults()) {
-        html += htmlForTestType(results, DEFERRED_COUNTS_KEY, DEFERRED_DESCRIPTION, numColumns) +
-            htmlForTestType(results, WONTFIX_COUNTS_KEY, WONTFIX_DESCRIPTION, numColumns);
-    }
-    return html;
-}
-
-function chartHTML(results, numColumns)
-{
-    var shouldShowWebKitRevisions = isTipOfTreeWebKitBuilder();
-    var revisionKey = shouldShowWebKitRevisions ? WEBKIT_REVISIONS_KEY : CHROME_REVISIONS_KEY;
-    var startRevision = results[revisionKey][numColumns - 1];
-    var endRevision = results[revisionKey][0];
-    var revisionLabel = shouldShowWebKitRevisions ? "WebKit Revision" : "Chromium Revision";
-
-    var fixable = results[FIXABLE_COUNT_KEY].slice(0, numColumns);
-    var html = chart("Total failing", {"": fixable}, revisionLabel, startRevision, endRevision);
-
-    var values = valuesPerExpectation(results[FIXABLE_COUNTS_KEY], numColumns);
-    // Don't care about number of passes for the charts.
-    delete(values['P']);
-
-    return html + chart("Detailed breakdown", values, revisionLabel, startRevision, endRevision);
-}
-
-var LABEL_COLORS = ['FF0000', '00FF00', '0000FF', '000000', 'FF6EB4', 'FFA812', '9B30FF', '00FFCC'];
-
-// FIXME: Find a better way to exclude outliers. This is just so we exclude
-// runs where every test failed.
-var MAX_VALUE = 10000;
-
-function filteredValues(values, desiredNumberOfPoints)
-{
-    // Filter out values to make the graph a bit more readable and to keep URLs
-    // from exceeding the browsers max length restriction.
-    var filterAmount = Math.floor(values.length / desiredNumberOfPoints);
-    if (filterAmount < 1)
-        return values;
-
-    return values.filter(function(element, index, array) {
-        // Include the most recent and oldest values and exclude outliers.
-        return (index % filterAmount == 0 || index == array.length - 1) && (array[index] < MAX_VALUE && array[index] != 0);
-    });
-}
-
-function chartUrl(title, values, revisionLabel, startRevision, endRevision, desiredNumberOfPoints) {
-    var maxValue = 0;
-    for (var expectation in values)
-        maxValue = Math.max(maxValue, Math.max.apply(null, filteredValues(values[expectation], desiredNumberOfPoints)));
-
-    var chartData = '';
-    var labels = '';
-    var numLabels = 0;
-
-    var first = true;
-    for (var expectation in values) {
-        chartData += (first ? 'e:' : ',') + extendedEncode(filteredValues(values[expectation], desiredNumberOfPoints).reverse(), maxValue);
-
-        if (expectation) {
-            numLabels++;
-            labels += (first ? '' : '|') + expectationsMap()[expectation];
-        }
-        first = false;
-    }
-
-    var url = "http://chart.apis.google.com/chart?cht=lc&chs=600x400&chd=" +
-            chartData + "&chg=15,15,1,3&chxt=x,x,y&chxl=1:||" + revisionLabel +
-            "|&chxr=0," + startRevision + "," + endRevision + "|2,0," + maxValue + "&chtt=" + title;
-
-
-    if (labels)
-        url += "&chdl=" + labels + "&chco=" + LABEL_COLORS.slice(0, numLabels).join(',');
-    return url;
-}
-
-function chart(title, values, revisionLabel, startRevision, endRevision)
-{
-    var desiredNumberOfPoints = 400;
-    var url = chartUrl(title, values, revisionLabel, startRevision, endRevision, desiredNumberOfPoints);
-
-    while (url.length >= 2048) {
-        // Decrease the desired number of points gradually until we get a URL that
-        // doesn't exceed chartserver's max URL length.
-        desiredNumberOfPoints = 3 / 4 * desiredNumberOfPoints;
-        url = chartUrl(title, values, revisionLabel, startRevision, endRevision, desiredNumberOfPoints);
-    }
-
-    return '<img src="' + url + '">';
-}
-
-function htmlForRevisionRows(results, numColumns)
-{
-    return htmlForTableRow('WebKit Revision', results[WEBKIT_REVISIONS_KEY].slice(0, numColumns)) +
-        htmlForTableRow('Chrome Revision', results[CHROME_REVISIONS_KEY].slice(0, numColumns));
-}
-
-function wrapHTMLInTable(description, html)
-{
-    return '<h3>' + description + '</h3><table><tbody>' + html + '</tbody></table>';
-}
-
-function htmlForSummaryTable(results, numColumns)
-{
-    var percent = [];
-    var fixable = results[FIXABLE_COUNT_KEY].slice(0, numColumns);
-    var allFixable = results[ALL_FIXABLE_COUNT_KEY].slice(0, numColumns);
-    for (var i = 0; i < numColumns; i++) {
-        var percentage = 100 * (allFixable[i] - fixable[i]) / allFixable[i];
-        // Round to the nearest tenth of a percent.
-        percent.push(Math.round(percentage * 10) / 10 + '%');
-    }
-    var html = htmlForRevisionRows(results, numColumns) +
-        htmlForTableRow('Percent passed', percent) +
-        htmlForTableRow('Failures (deduped)', fixable) +
-        htmlForTableRow('Fixable Tests', allFixable);
-    return wrapHTMLInTable('Summary', html);
-}
-
-function valuesPerExpectation(counts, numColumns)
-{
-    var values = {};
-    for (var i = 0; i < numColumns; i++) {
-        for (var expectation in expectationsMap()) {
-            if (expectation in counts[i]) {
-                var count = counts[i][expectation];
-                if (!values[expectation])
-                    values[expectation] = [];
-                values[expectation].push(count);
-            }
-        }
-    }
-    return values;
-}
-
-function htmlForTestType(results, key, description, numColumns)
-{
-    var counts = results[key];
-    var html = htmlForRevisionRows(results, numColumns);
-    var values = valuesPerExpectation(counts, numColumns);
-    for (var expectation in values)
-        html += htmlForTableRow(expectationsMap()[expectation], values[expectation]);
-    return wrapHTMLInTable(description, html);
-}
-
-function htmlForTableRow(columnName, values)
-{
-    return '<tr><td>' + columnName + '</td><td>' + values.join('</td><td>') + '</td></tr>';
-}
-
-// Taken from http://code.google.com/apis/chart/docs/data_formats.html.
-function extendedEncode(arrVals, maxVal)
-{
-    var map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.';
-    var mapLength = map.length;
-    var mapLengthSquared = mapLength * mapLength;
-
-    var chartData = '';
-
-    for (var i = 0, len = arrVals.length; i < len; i++) {
-        // In case the array vals were translated to strings.
-        var numericVal = new Number(arrVals[i]);
-        // Scale the value to maxVal.
-        var scaledVal = Math.floor(mapLengthSquared * numericVal / maxVal);
-
-        if(scaledVal > mapLengthSquared - 1)
-            chartData += "..";
-        else if (scaledVal < 0)
-            chartData += '__';
-        else {
-            // Calculate first and second digits and add them to the output.
-            var quotient = Math.floor(scaledVal / mapLength);
-            var remainder = scaledVal - mapLength * quotient;
-            chartData += map.charAt(quotient) + map.charAt(remainder);
-        }
-    }
-
-    return chartData;
-}
-</script>
+<script src="ui.js"></script>
+<script src="aggregate_results.js"></script>
 </head>
 <body></body>
 </html>
diff --git a/Tools/TestResultServer/static-dashboards/aggregate_results.js b/Tools/TestResultServer/static-dashboards/aggregate_results.js
new file mode 100644
index 0000000..0fd2dfe
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/aggregate_results.js
@@ -0,0 +1,272 @@
+// Copyright (C) 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// @fileoverview Creates a dashboard for tracking number of passes/failures per run.
+//
+// Currently, only webkit tests are supported, but adding other test types
+// should just require the following steps:
+//     -generate results.json for these tests
+//     -copy them to the appropriate location
+//     -add the builder name to the list of builders in dashboard_base.js.
+
+//////////////////////////////////////////////////////////////////////////////
+// Methods and objects from dashboard_base.js to override.
+//////////////////////////////////////////////////////////////////////////////
+function generatePage()
+{
+    var html = ui.html.testTypeSwitcher(true) + '<br>';
+    for (var builder in currentBuilders())
+        html += htmlForBuilder(builder);
+    document.body.innerHTML = html;
+}
+
+function handleValidHashParameter(key, value)
+{
+    switch(key) {
+    case 'rawValues':
+        g_history.dashboardSpecificState[key] = value == 'true';
+        return true;
+
+    default:
+        return false;
+    }
+}
+
+g_defaultDashboardSpecificStateValues = {
+    rawValues: false
+};
+
+function htmlForBuilder(builder)
+{
+    var results = g_resultsByBuilder[builder];
+    // Some keys were added later than others, so they don't have as many
+    // builds. Use the shortest.
+    // FIXME: Once 500 runs have finished, we can get rid of passing this
+    // around and just assume all keys have the same number of builders for a
+    // given builder.
+    var numColumns = results[ALL_FIXABLE_COUNT_KEY].length;
+    var html = '<div class=container><h2>' + builder + '</h2>';
+
+    if (g_history.dashboardSpecificState.rawValues)
+        html += rawValuesHTML(results, numColumns);
+    else {
+        html += '<a href="timeline_explorer.html' + (location.hash ? location.hash + '&' : '#') + 'builder=' + builder + '">' +
+            chartHTML(results, numColumns) + '</a>';
+    }
+
+    html += '</div>';
+    return html;
+}
+
+function rawValuesHTML(results, numColumns)
+{
+    var html = htmlForSummaryTable(results, numColumns) +
+        htmlForTestType(results, FIXABLE_COUNTS_KEY, FIXABLE_DESCRIPTION, numColumns);
+    if (g_history.isLayoutTestResults()) {
+        html += htmlForTestType(results, DEFERRED_COUNTS_KEY, DEFERRED_DESCRIPTION, numColumns) +
+            htmlForTestType(results, WONTFIX_COUNTS_KEY, WONTFIX_DESCRIPTION, numColumns);
+    }
+    return html;
+}
+
+function chartHTML(results, numColumns)
+{
+    var shouldShowWebKitRevisions = isTipOfTreeWebKitBuilder();
+    var revisionKey = shouldShowWebKitRevisions ? WEBKIT_REVISIONS_KEY : CHROME_REVISIONS_KEY;
+    var startRevision = results[revisionKey][numColumns - 1];
+    var endRevision = results[revisionKey][0];
+    var revisionLabel = shouldShowWebKitRevisions ? "WebKit Revision" : "Chromium Revision";
+
+    var fixable = results[FIXABLE_COUNT_KEY].slice(0, numColumns);
+    var html = chart("Total failing", {"": fixable}, revisionLabel, startRevision, endRevision);
+
+    var values = valuesPerExpectation(results[FIXABLE_COUNTS_KEY], numColumns);
+    // Don't care about number of passes for the charts.
+    delete(values['P']);
+
+    return html + chart("Detailed breakdown", values, revisionLabel, startRevision, endRevision);
+}
+
+var LABEL_COLORS = ['FF0000', '00FF00', '0000FF', '000000', 'FF6EB4', 'FFA812', '9B30FF', '00FFCC'];
+
+// FIXME: Find a better way to exclude outliers. This is just so we exclude
+// runs where every test failed.
+var MAX_VALUE = 10000;
+
+function filteredValues(values, desiredNumberOfPoints)
+{
+    // Filter out values to make the graph a bit more readable and to keep URLs
+    // from exceeding the browsers max length restriction.
+    var filterAmount = Math.floor(values.length / desiredNumberOfPoints);
+    if (filterAmount < 1)
+        return values;
+
+    return values.filter(function(element, index, array) {
+        // Include the most recent and oldest values and exclude outliers.
+        return (index % filterAmount == 0 || index == array.length - 1) && (array[index] < MAX_VALUE && array[index] != 0);
+    });
+}
+
+function chartUrl(title, values, revisionLabel, startRevision, endRevision, desiredNumberOfPoints) {
+    var maxValue = 0;
+    for (var expectation in values)
+        maxValue = Math.max(maxValue, Math.max.apply(null, filteredValues(values[expectation], desiredNumberOfPoints)));
+
+    var chartData = '';
+    var labels = '';
+    var numLabels = 0;
+
+    var first = true;
+    for (var expectation in values) {
+        chartData += (first ? 'e:' : ',') + extendedEncode(filteredValues(values[expectation], desiredNumberOfPoints).reverse(), maxValue);
+
+        if (expectation) {
+            numLabels++;
+            labels += (first ? '' : '|') + expectationsMap()[expectation];
+        }
+        first = false;
+    }
+
+    var url = "http://chart.apis.google.com/chart?cht=lc&chs=600x400&chd=" +
+            chartData + "&chg=15,15,1,3&chxt=x,x,y&chxl=1:||" + revisionLabel +
+            "|&chxr=0," + startRevision + "," + endRevision + "|2,0," + maxValue + "&chtt=" + title;
+
+
+    if (labels)
+        url += "&chdl=" + labels + "&chco=" + LABEL_COLORS.slice(0, numLabels).join(',');
+    return url;
+}
+
+function chart(title, values, revisionLabel, startRevision, endRevision)
+{
+    var desiredNumberOfPoints = 400;
+    var url = chartUrl(title, values, revisionLabel, startRevision, endRevision, desiredNumberOfPoints);
+
+    while (url.length >= 2048) {
+        // Decrease the desired number of points gradually until we get a URL that
+        // doesn't exceed chartserver's max URL length.
+        desiredNumberOfPoints = 3 / 4 * desiredNumberOfPoints;
+        url = chartUrl(title, values, revisionLabel, startRevision, endRevision, desiredNumberOfPoints);
+    }
+
+    return '<img src="' + url + '">';
+}
+
+function htmlForRevisionRows(results, numColumns)
+{
+    return htmlForTableRow('WebKit Revision', results[WEBKIT_REVISIONS_KEY].slice(0, numColumns)) +
+        htmlForTableRow('Chrome Revision', results[CHROME_REVISIONS_KEY].slice(0, numColumns));
+}
+
+function wrapHTMLInTable(description, html)
+{
+    return '<h3>' + description + '</h3><table><tbody>' + html + '</tbody></table>';
+}
+
+function htmlForSummaryTable(results, numColumns)
+{
+    var percent = [];
+    var fixable = results[FIXABLE_COUNT_KEY].slice(0, numColumns);
+    var allFixable = results[ALL_FIXABLE_COUNT_KEY].slice(0, numColumns);
+    for (var i = 0; i < numColumns; i++) {
+        var percentage = 100 * (allFixable[i] - fixable[i]) / allFixable[i];
+        // Round to the nearest tenth of a percent.
+        percent.push(Math.round(percentage * 10) / 10 + '%');
+    }
+    var html = htmlForRevisionRows(results, numColumns) +
+        htmlForTableRow('Percent passed', percent) +
+        htmlForTableRow('Failures (deduped)', fixable) +
+        htmlForTableRow('Fixable Tests', allFixable);
+    return wrapHTMLInTable('Summary', html);
+}
+
+function valuesPerExpectation(counts, numColumns)
+{
+    var values = {};
+    for (var i = 0; i < numColumns; i++) {
+        for (var expectation in expectationsMap()) {
+            if (expectation in counts[i]) {
+                var count = counts[i][expectation];
+                if (!values[expectation])
+                    values[expectation] = [];
+                values[expectation].push(count);
+            }
+        }
+    }
+    return values;
+}
+
+function htmlForTestType(results, key, description, numColumns)
+{
+    var counts = results[key];
+    var html = htmlForRevisionRows(results, numColumns);
+    var values = valuesPerExpectation(counts, numColumns);
+    for (var expectation in values)
+        html += htmlForTableRow(expectationsMap()[expectation], values[expectation]);
+    return wrapHTMLInTable(description, html);
+}
+
+function htmlForTableRow(columnName, values)
+{
+    return '<tr><td>' + columnName + '</td><td>' + values.join('</td><td>') + '</td></tr>';
+}
+
+// Taken from http://code.google.com/apis/chart/docs/data_formats.html.
+function extendedEncode(arrVals, maxVal)
+{
+    var map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.';
+    var mapLength = map.length;
+    var mapLengthSquared = mapLength * mapLength;
+
+    var chartData = '';
+
+    for (var i = 0, len = arrVals.length; i < len; i++) {
+        // In case the array vals were translated to strings.
+        var numericVal = new Number(arrVals[i]);
+        // Scale the value to maxVal.
+        var scaledVal = Math.floor(mapLengthSquared * numericVal / maxVal);
+
+        if(scaledVal > mapLengthSquared - 1)
+            chartData += "..";
+        else if (scaledVal < 0)
+            chartData += '__';
+        else {
+            // Calculate first and second digits and add them to the output.
+            var quotient = Math.floor(scaledVal / mapLength);
+            var remainder = scaledVal - mapLength * quotient;
+            chartData += map.charAt(quotient) + map.charAt(remainder);
+        }
+    }
+
+    return chartData;
+}
+
+window.addEventListener('load', function() {
+    var resourceLoader = new loader.Loader(intializeHistory);
+    resourceLoader.load();
+}, false);
diff --git a/Tools/TestResultServer/static-dashboards/builders.js b/Tools/TestResultServer/static-dashboards/builders.js
index 2a6b67d..39000ce 100644
--- a/Tools/TestResultServer/static-dashboards/builders.js
+++ b/Tools/TestResultServer/static-dashboards/builders.js
@@ -29,31 +29,72 @@
 // @fileoverview File that lists builders, their masters, and logical groupings
 // of them.
 
-function BuilderMaster(name, basePath)
+function LOAD_BUILDBOT_DATA(builderData)
+{
+    builders.masters = {};
+    builderData.forEach(function(master) {
+        builders.masters[master.name] = new builders.BuilderMaster(master.name, master.url, master.tests);
+    })
+}
+
+var builders = builders || {};
+
+(function() {
+
+// FIXME: Move some of this loading logic into loader.js.
+
+builders._loadScript = function(url, success, error)
+{
+    var script = document.createElement('script');
+    script.src = url;
+    script.onload = success;
+    script.onerror = error;
+    document.head.appendChild(script);
+}
+
+builders._requestBuilders = function()
+{
+    var buildersUrl = 'builders.jsonp';
+    builders._loadScript(buildersUrl, function() {}, function() {
+        console.error('Could not load ' + buildersUrl);
+    });
+}
+
+
+builders.BuilderMaster = function(name, basePath, tests)
 {
     this.name = name;
     this.basePath = basePath;
+    this.tests = tests;
 }
 
-BuilderMaster.prototype.logPath = function(builder, buildNumber)
-{
-    return this.basePath + 'builders/' + builder + '/builds/' + buildNumber;
-};
+builders.BuilderMaster.prototype = {
+    logPath: function(builder, buildNumber)
+    {
+        return this.basePath + '/builders/' + builder + '/builds/' + buildNumber;
+    },
+    builderJsonPath: function()
+    {
+        return this.basePath + '/json/builders';
+    },
+}
 
-BuilderMaster.prototype.builderJsonPath = function()
-{
-    return this.basePath + 'json/builders';
-};
+builders._requestBuilders();
 
-CHROMIUM_WIN_BUILDER_MASTER = new BuilderMaster('ChromiumWin', 'http://build.chromium.org/p/chromium.win/');
-CHROMIUM_MAC_BUILDER_MASTER = new BuilderMaster('ChromiumMac', 'http://build.chromium.org/p/chromium.mac/');
-CHROMIUM_LINUX_BUILDER_MASTER = new BuilderMaster('ChromiumLinux', 'http://build.chromium.org/p/chromium.linux/');
-CHROMIUMOS_BUILDER_MASTER = new BuilderMaster('ChromiumChromiumOS', 'http://build.chromium.org/p/chromium.chromiumos/');
-CHROMIUM_GPU_BUILDER_MASTER = new BuilderMaster('ChromiumGPU', 'http://build.chromium.org/p/chromium.gpu/');
-CHROMIUM_GPU_FYI_BUILDER_MASTER = new BuilderMaster('ChromiumGPUFYI', 'http://build.chromium.org/p/chromium.gpu.fyi/');
-CHROMIUM_PERF_AV_BUILDER_MASTER = new BuilderMaster('ChromiumPerfAv', 'http://build.chromium.org/p/chromium.perf_av/');
-CHROMIUM_WEBKIT_BUILDER_MASTER = new BuilderMaster('ChromiumWebkit', 'http://build.chromium.org/p/chromium.webkit/');
-WEBKIT_BUILDER_MASTER = new BuilderMaster('webkit.org', 'http://build.webkit.org/');
+})();
+
+// FIXME: Move everything below into the anonymous namespace above.
+
+CHROMIUM_WIN_BUILDER_MASTER = 'ChromiumWin';
+CHROMIUM_MAC_BUILDER_MASTER = 'ChromiumMac';
+CHROMIUM_LINUX_BUILDER_MASTER = 'ChromiumLinux';
+CHROMIUMOS_BUILDER_MASTER = 'ChromiumChromiumOS';
+CHROMIUM_GPU_BUILDER_MASTER = 'ChromiumGPU';
+CHROMIUM_GPU_FYI_BUILDER_MASTER = 'ChromiumGPUFYI';
+CHROMIUM_FYI_BUILDER_MASTER = 'ChromiumFYI';
+CHROMIUM_PERF_AV_BUILDER_MASTER = 'ChromiumPerfAv';
+CHROMIUM_WEBKIT_BUILDER_MASTER = 'ChromiumWebkit';
+WEBKIT_BUILDER_MASTER = 'webkit.org';
 
 var LEGACY_BUILDER_MASTERS_TO_GROUPS = {
     'Chromium': '@DEPS - chromium.org',
@@ -74,88 +115,48 @@
     // Map of builderName (the name shown in the waterfall) to builderPath (the
     // path used in the builder's URL)
     this.builders = {};
-    this.groups = 0;
-    this.expectedGroups = 0;
 }
 
-BuilderGroup.prototype.setbuilder = function(builder, flags) {
-    this.builders[builder] = builder.replace(/[ .()]/g, '_');
-    // FIXME: Remove this at some point, we don't actually use DEFAULT_BUILDER
-    //        in any meaningful way anymore.  We always just default to the
-    //        first builder in alphabetical order.
-    if (flags & BuilderGroup.DEFAULT_BUILDER)
-        this.defaultBuilder = builder;
-};
-
 BuilderGroup.prototype.append = function(builders) {
-    builders.forEach(function(builderAndFlags) {
-        var builder = builderAndFlags[0];
-        var flags = builderAndFlags[1];
-        this.setbuilder(builder, flags);
+    builders.forEach(function(builderName) {
+        this.builders[builderName] = builderName.replace(/[ .()]/g, '_');
     }, this);
-    this.groups += 1;
 };
 
-BuilderGroup.prototype.loaded = function() {
-    return this.groups >= this.expectedGroups;
+BuilderGroup.prototype.defaultBuilder = function()
+{
+    for (var builder in this.builders)
+        return builder;
+    console.error('There are no builders in this builder group.');
 }
 
-BuilderGroup.prototype.setup = function()
+BuilderGroup.prototype.master = function()
 {
-    // FIXME: instead of copying these to globals, it would be better if
-    // the rest of the code read things from the BuilderGroup instance directly
-    g_defaultBuilderName = this.defaultBuilder;
-    g_builders = this.builders;
-};
+    return builderMaster(this.defaultBuilder());
+}
 
 BuilderGroup.TOT_WEBKIT = true;
 BuilderGroup.DEPS_WEBKIT = false;
-BuilderGroup.DEFAULT_BUILDER = 1 << 1;
 
 var BUILDER_TO_MASTER = {};
-function associateBuildersWithMaster(builders, master)
+
+function builderMaster(builderName)
 {
-    builders.forEach(function(builderAndFlags) {
-        var builder = builderAndFlags[0];
-        BUILDER_TO_MASTER[builder] = master;
-    });
+    return BUILDER_TO_MASTER[builderName];
 }
 
-function requestBuilderList(builderGroups, builderFilter, master, groupName, builderGroup)
+function requestBuilderList(builderGroups, masterName, groupName, builderGroup, testType, opt_builderFilter)
 {
     if (!builderGroups[groupName])
         builderGroups[groupName] = builderGroup;
-    loader.request(master.builderJsonPath(),
-                   partial(onBuilderListLoad, builderGroups, builderFilter, master, groupName),
-                   partial(onErrorLoadingBuilderList, master.builderJsonPath(), builderGroups, groupName));
-    builderGroups[groupName].expectedGroups += 1;
-}
-
-function isChromiumDepsGpuTestRunner(builder)
-{
-    return true;
-}
-
-function isChromiumDepsFyiGpuTestRunner(builder)
-{
-    // FIXME: This is kind of wonky, but there's not really a better pattern.
-    return builder.indexOf('(') != -1;
-}
-
-function isChromiumTipOfTreeGpuTestRunner(builder)
-{
-    return builder.indexOf('GPU') != -1;
-}
-
-function isWebkitTestRunner(builder)
-{
-    if (builder.indexOf('EFL') != -1)
-        return builder.indexOf('Build') == -1;
-    if (builder.indexOf('Tests') != -1) {
-        // Apple Windows bots still run old-run-webkit-tests, so they don't upload data.
-        return builder.indexOf('Win') == -1 || (builder.indexOf('Qt') != -1 && builder.indexOf('Chromium') != -1);
-    }
-    return builder.indexOf('GTK') != -1 || builder == 'Qt Linux Release';
+    var master = builders.masters[masterName];
+    var builderList = master.tests[testType].builders;
+    if (opt_builderFilter)
+        builderList = builderList.filter(opt_builderFilter);
+    builderList.forEach(function(builderName) {
+        BUILDER_TO_MASTER[builderName] = master;
+    });
+    builderGroups[groupName].append(builderList);
 }
 
 function isChromiumContentShellTestRunner(builder)
@@ -166,61 +167,15 @@
 function isChromiumWebkitTipOfTreeTestRunner(builder)
 {
     // FIXME: Remove the Android check once the android tests bot is actually uploading results.
-    return builder.indexOf('WebKit') != -1 && builder.indexOf('Builder') == -1 && builder.indexOf('(deps)') == -1 &&
-        builder.indexOf('ASAN') == -1 && !isChromiumContentShellTestRunner(builder) && builder.indexOf('Android') == -1;
+    return builder.indexOf('ASAN') == -1 && !isChromiumContentShellTestRunner(builder) && builder.indexOf('Android') == -1 && !isChromiumWebkitDepsTestRunner(builder);
 }
 
 function isChromiumWebkitDepsTestRunner(builder)
 {
-    return builder.indexOf('WebKit') != -1 && builder.indexOf('Builder') == -1 && builder.indexOf('(deps)') != -1;
+    return builder.indexOf('(deps)') != -1;
 }
 
-function isChromiumDepsGTestRunner(builder)
-{
-    return builder.indexOf('Builder') == -1;
-}
-
-function isChromiumDepsCrosGTestRunner(builder)
-{
-    return builder.indexOf('Tests') != -1;
-}
-
-function isChromiumTipOfTreeGTestRunner(builder)
-{
-    return !isChromiumTipOfTreeGpuTestRunner(builder) && builder.indexOf('Builder') == -1 && builder.indexOf('Perf') == -1 &&
-         builder.indexOf('WebKit') == -1 && builder.indexOf('Valgrind') == -1 && builder.indexOf('Chrome Frame') == -1;
-}
-
-function isChromiumDepsAVTestRunner(builder)
-{
-    return builder.indexOf('Builder') == -1;
-}
-
-function generateBuildersFromBuilderList(builderList, filter)
-{
-    return builderList.filter(filter).map(function(tester, index) {
-        var builder = [tester];
-        if (!index)
-            builder.push(BuilderGroup.DEFAULT_BUILDER);
-        return builder;
-    });
-}
-
-function onBuilderListLoad(builderGroups, builderFilter, master, groupName, xhr)
-{
-    var builders = generateBuildersFromBuilderList(Object.keys(JSON.parse(xhr.responseText)), builderFilter);
-    associateBuildersWithMaster(builders, master);
-    builderGroups[groupName].append(builders);
-    if (builderGroups[groupName].loaded())
-        g_resourceLoader.buildersListLoaded();
-}
-
-function onErrorLoadingBuilderList(url, builderGroups, groupName, xhr)
-{
-    builderGroups[groupName].groups += 1;
-    console.log('Could not load list of builders from ' + url + '. Try reloading.');
-}
-
+// FIXME: Look into whether we can move the grouping logic into builders.jsonp and get rid of this code.
 function loadBuildersList(groupName, testType) {
     switch (testType) {
     case 'gl_tests':
@@ -228,17 +183,17 @@
         switch(groupName) {
         case '@DEPS - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
-            requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, isChromiumDepsGpuTestRunner, CHROMIUM_GPU_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, CHROMIUM_GPU_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
 
         case '@DEPS FYI - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
-            requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, isChromiumDepsFyiGpuTestRunner, CHROMIUM_GPU_FYI_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, CHROMIUM_GPU_FYI_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
 
         case '@ToT - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
-            requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, isChromiumTipOfTreeGpuTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(CHROMIUM_GPU_TESTS_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
         }
         break;
@@ -247,60 +202,91 @@
         switch(groupName) {
         case 'Content Shell @ToT - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
-            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumContentShellTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType, isChromiumContentShellTestRunner);
             break;
 
         case '@ToT - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
-            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumWebkitTipOfTreeTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType, isChromiumWebkitTipOfTreeTestRunner);
             break;
 
         case '@ToT - webkit.org':
             var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
-            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isWebkitTestRunner, WEBKIT_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
 
         case '@DEPS - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
-            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumWebkitDepsTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
-            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumDepsAVTestRunner, CHROMIUM_PERF_AV_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType, isChromiumWebkitDepsTestRunner);
+            requestBuilderList(LAYOUT_TESTS_BUILDER_GROUPS, CHROMIUM_PERF_AV_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
         }
         break;
-   
+
     case 'test_shell_tests':
     case 'webkit_unit_tests':
         switch(groupName) {
         case '@ToT - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
-            requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, isChromiumWebkitTipOfTreeTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType, isChromiumWebkitTipOfTreeTestRunner);
             break;
 
         case '@DEPS - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
-            requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, isChromiumWebkitDepsTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
-            requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, isChromiumDepsAVTestRunner, CHROMIUM_PERF_AV_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(TEST_SHELL_TESTS_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType, isChromiumWebkitDepsTestRunner);
             break;
         }
-        break;    
+        break;
+
+    case 'androidwebview_instrumentation_tests':
+    case 'chromiumtestshell_instrumentation_tests':
+    case 'contentshell_instrumentation_tests':
+        switch(groupName) {
+        case '@DEPS - chromium.org':
+            var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
+            requestBuilderList(CHROMIUM_INSTRUMENTATION_TESTS_BUILDER_GROUPS, CHROMIUM_LINUX_BUILDER_MASTER, groupName, builderGroup, testType);
+            break;
+
+        case '@DEPS FYI - chromium.org':
+            var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
+            requestBuilderList(CHROMIUM_INSTRUMENTATION_TESTS_BUILDER_GROUPS, CHROMIUM_FYI_BUILDER_MASTER , groupName, builderGroup, testType);
+            break;
+        }
+        break;
+
+    case 'cc_unittests':    
+        switch(groupName) {
+        case '@DEPS - chromium.org':
+            var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
+            requestBuilderList(CC_UNITTEST_BUILDER_GROUPS, CHROMIUM_WIN_BUILDER_MASTER, groupName, builderGroup, testType);
+            requestBuilderList(CC_UNITTEST_BUILDER_GROUPS, CHROMIUM_MAC_BUILDER_MASTER, groupName, builderGroup, testType);
+            requestBuilderList(CC_UNITTEST_BUILDER_GROUPS, CHROMIUM_LINUX_BUILDER_MASTER, groupName, builderGroup, testType);
+            break;
+
+        case '@ToT - chromium.org':
+            var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
+            requestBuilderList(CC_UNITTEST_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType);
+            break;
+        }
+        break;
 
     default:
         switch(groupName) {
         case '@DEPS - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
-            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsGTestRunner, CHROMIUM_WIN_BUILDER_MASTER, groupName, builderGroup);
-            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsGTestRunner, CHROMIUM_MAC_BUILDER_MASTER, groupName, builderGroup);
-            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsGTestRunner, CHROMIUM_LINUX_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, CHROMIUM_WIN_BUILDER_MASTER, groupName, builderGroup, testType);
+            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, CHROMIUM_MAC_BUILDER_MASTER, groupName, builderGroup, testType);
+            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, CHROMIUM_LINUX_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
 
         case '@DEPS CrOS - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.DEPS_WEBKIT);
-            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumDepsCrosGTestRunner, CHROMIUMOS_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, CHROMIUMOS_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
 
         case '@ToT - chromium.org':
             var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
-            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, isChromiumTipOfTreeGTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup);
+            requestBuilderList(CHROMIUM_GTESTS_BUILDER_GROUPS, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, builderGroup, testType);
             break;
         }
         break;
@@ -330,3 +316,13 @@
     '@DEPS CrOS - chromium.org': null,
     '@ToT - chromium.org': null,
 };
+
+var CHROMIUM_INSTRUMENTATION_TESTS_BUILDER_GROUPS = {
+    '@DEPS - chromium.org': null,
+    '@DEPS FYI - chromium.org': null,
+};
+
+var CC_UNITTEST_BUILDER_GROUPS = {
+    '@ToT - chromium.org': null,
+    '@DEPS - chromium.org': null,
+};
\ No newline at end of file
diff --git a/Tools/TestResultServer/static-dashboards/builders.jsonp b/Tools/TestResultServer/static-dashboards/builders.jsonp
new file mode 100644
index 0000000..91d61eb
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/builders.jsonp
@@ -0,0 +1,3034 @@
+// This file is auto-generated by Tools/TestResultServer/generate_builders_json.py. It should not be manually modified.
+// It uses jsonp instead of proper json because we want to be able to load it from a file URL in Chrome for local testing.
+LOAD_BUILDBOT_DATA([
+    {
+        "name": "ChromiumWin", 
+        "tests": {
+            "ash_unittests": {
+                "builders": [
+                    "Win8 Aura", 
+                    "Win Aura Tests (1)"
+                ]
+            }, 
+            "aura_unittests": {
+                "builders": [
+                    "Win8 Aura", 
+                    "Win Aura Tests (1)"
+                ]
+            }, 
+            "base_unittests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "XP Tests (2)", 
+                    "Win7 Tests (2)", 
+                    "Vista Tests (2)", 
+                    "Win 7 Tests x64 (2)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "browser_tests": {
+                "builders": [
+                    "XP Tests (dbg)(5)", 
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(3)", 
+                    "Win7 Tests (dbg)(5)", 
+                    "XP Tests (3)", 
+                    "XP Tests (dbg)(4)", 
+                    "Vista Tests (1)", 
+                    "Win Aura Tests (2)", 
+                    "Vista Tests (3)", 
+                    "XP Tests (2)", 
+                    "XP Tests (dbg)(2)", 
+                    "Win7 Tests (dbg)(6)", 
+                    "XP Tests (dbg)(6)", 
+                    "Win7 Tests (2)", 
+                    "Win7 Tests (dbg)(4)", 
+                    "Win7 Tests (3)", 
+                    "Win7 Tests (dbg)(2)", 
+                    "Vista Tests (2)", 
+                    "Win7 Tests (1)", 
+                    "Win Aura Tests (3)", 
+                    "Win Aura Tests (1)", 
+                    "XP Tests (dbg)(3)"
+                ]
+            }, 
+            "cacheinvalidation_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "cc_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "chrome_frame_net_tests": {
+                "builders": [
+                    "Chrome Frame Tests (ie8)", 
+                    "Chrome Frame Tests (ie6)", 
+                    "Chrome Frame Tests (ie7)", 
+                    "Chrome Frame Tests (ie9)"
+                ]
+            }, 
+            "chrome_frame_tests": {
+                "builders": [
+                    "Chrome Frame Tests (ie8)", 
+                    "Chrome Frame Tests (ie6)", 
+                    "Chrome Frame Tests (ie7)", 
+                    "Chrome Frame Tests (ie9)"
+                ]
+            }, 
+            "chrome_frame_unittests": {
+                "builders": [
+                    "Chrome Frame Tests (ie8)", 
+                    "Chrome Frame Tests (ie6)", 
+                    "Chrome Frame Tests (ie7)", 
+                    "Chrome Frame Tests (ie9)"
+                ]
+            }, 
+            "chromedriver2_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "components_unittests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "XP Tests (3)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "compositor_unittests": {
+                "builders": [
+                    "Win Aura Tests (2)", 
+                    "Win8 Aura"
+                ]
+            }, 
+            "content_browsertests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Vista Tests (1)", 
+                    "XP Tests (dbg)(2)", 
+                    "Win7 Tests (dbg)(2)", 
+                    "Win7 Tests (1)", 
+                    "Win Aura Tests (1)"
+                ]
+            }, 
+            "content_unittests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "XP Tests (3)", 
+                    "Win Aura Tests (2)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "courgette_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "crypto_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "device_unittests": {
+                "builders": [
+                    "Win 7 Tests x64 (1)"
+                ]
+            }, 
+            "googleurl_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "gpu_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "installer_util_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "interactive_ui_tests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Interactive Tests (dbg)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "Win Aura Tests (3)"
+                ]
+            }, 
+            "ipc_tests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (3)", 
+                    "XP Tests (3)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "jingle_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "media_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "mini_installer_test": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)"
+                ]
+            }, 
+            "net_unittests": {
+                "builders": [
+                    "XP Tests (2)", 
+                    "XP Tests (dbg)(2)", 
+                    "Win7 Tests (2)", 
+                    "Win7 Tests (dbg)(2)", 
+                    "Vista Tests (2)", 
+                    "Win 7 Tests x64 (2)"
+                ]
+            }, 
+            "ppapi_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "printing_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "remoting_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "sbox_integration_tests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(3)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(3)"
+                ]
+            }, 
+            "sbox_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(3)", 
+                    "Win 7 Tests x64 (1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(3)"
+                ]
+            }, 
+            "sbox_validation_tests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(3)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(3)"
+                ]
+            }, 
+            "sbox_validation_tests_buildrunner_ignore": {
+                "builders": [
+                    "Win 7 Tests x64 (1)"
+                ]
+            }, 
+            "sql_unittests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (3)", 
+                    "XP Tests (3)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "sync_integration_tests": {
+                "builders": [
+                    "Win7 Sync"
+                ]
+            }, 
+            "sync_unit_tests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (3)", 
+                    "XP Tests (3)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "ui_unittests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (3)", 
+                    "XP Tests (3)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "unit_tests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "XP Tests (3)", 
+                    "Win Aura Tests (2)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "views_unittests": {
+                "builders": [
+                    "Win7 Tests (dbg)(1)", 
+                    "Win 7 Tests x64 (3)", 
+                    "XP Tests (3)", 
+                    "Win Aura Tests (2)", 
+                    "Vista Tests (3)", 
+                    "Win7 Tests (3)", 
+                    "Win8 Aura", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }, 
+            "webkit_compositor_bindings_unittests": {
+                "builders": [
+                    "XP Tests (1)", 
+                    "Win7 Tests (dbg)(1)", 
+                    "Vista Tests (1)", 
+                    "Win7 Tests (1)", 
+                    "XP Tests (dbg)(1)"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.win"
+    }, 
+    {
+        "name": "ChromiumMac", 
+        "tests": {
+            "base_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.7 Tests (dbg)(3)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(3)"
+                ]
+            }, 
+            "browser_tests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (3)", 
+                    "Mac 10.7 Tests (dbg)(3)", 
+                    "Mac 10.7 Tests (dbg)(2)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)", 
+                    "Mac 10.6 Tests (dbg)(2)", 
+                    "Mac 10.6 Tests (dbg)(3)", 
+                    "Mac10.7 Tests (3)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "cacheinvalidation_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "cc_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "chromedriver2_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "components_unittests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)"
+                ]
+            }, 
+            "content_browsertests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "content_unittests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)"
+                ]
+            }, 
+            "crypto_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "googleurl_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "gpu_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "interactive_ui_tests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(3)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(3)"
+                ]
+            }, 
+            "ipc_tests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)"
+                ]
+            }, 
+            "jingle_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "media_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.7 Tests (dbg)(2)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(2)"
+                ]
+            }, 
+            "net_unittests": {
+                "builders": [
+                    "Mac10.6 Tests (3)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.7 Tests (dbg)(2)", 
+                    "Mac 10.6 Tests (dbg)(2)", 
+                    "Mac10.7 Tests (3)"
+                ]
+            }, 
+            "ppapi_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "printing_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "remoting_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }, 
+            "sql_unittests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)"
+                ]
+            }, 
+            "sync_integration_tests": {
+                "builders": [
+                    "Mac10.6 Sync"
+                ]
+            }, 
+            "sync_unit_tests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)"
+                ]
+            }, 
+            "ui_unittests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)"
+                ]
+            }, 
+            "unit_tests": {
+                "builders": [
+                    "Mac10.6 Tests (2)", 
+                    "iOS Simulator (dbg)", 
+                    "Mac 10.6 Tests (dbg)(4)", 
+                    "Mac10.7 Tests (2)", 
+                    "Mac 10.7 Tests (dbg)(4)"
+                ]
+            }, 
+            "webkit_compositor_bindings_unittests": {
+                "builders": [
+                    "Mac10.7 Tests (1)", 
+                    "Mac 10.7 Tests (dbg)(1)", 
+                    "Mac10.6 Tests (1)", 
+                    "Mac 10.6 Tests (dbg)(1)"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.mac"
+    }, 
+    {
+        "name": "ChromiumLinux", 
+        "tests": {
+            "Run tests": {
+                "builders": [
+                    "Android Tests (dbg)", 
+                    "Android Tests"
+                ]
+            }, 
+            "android_webview_unittests": {
+                "builders": [
+                    "Android Tests (dbg)", 
+                    "Android Tests"
+                ]
+            }, 
+            "androidwebview_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (dbg)", 
+                    "Android Tests"
+                ]
+            }, 
+            "aura_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura"
+                ]
+            }, 
+            "base_unittests": {
+                "builders": [
+                    "Linux Precise (dbg)", 
+                    "Linux Aura (Precise)", 
+                    "Linux Precise x64", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "browser_tests": {
+                "builders": [
+                    "Linux Precise (dbg)", 
+                    "Linux Tests (dbg)(1)(Precise 32)", 
+                    "Linux Aura (Precise)", 
+                    "Linux Precise x64", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(1)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(1)(Precise)", 
+                    "Linux Tests x64"
+                ]
+            }, 
+            "cacheinvalidation_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "cc_unittests": {
+                "builders": [
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "chromedriver2_unittests": {
+                "builders": [
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "chromiumtestshell_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (dbg)", 
+                    "Android Tests"
+                ]
+            }, 
+            "components_unittests": {
+                "builders": [
+                    "Linux Clang (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "compositor_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura"
+                ]
+            }, 
+            "content_browsertests": {
+                "builders": [
+                    "Linux Precise (dbg)", 
+                    "Linux Tests (dbg)(1)(Precise 32)", 
+                    "Linux Aura (Precise)", 
+                    "Linux Precise x64", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(1)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(1)(Precise)", 
+                    "Linux Tests x64"
+                ]
+            }, 
+            "content_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "contentshell_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (dbg)", 
+                    "Android Tests"
+                ]
+            }, 
+            "crypto_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "dbus_unittests": {
+                "builders": [
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "device_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "googleurl_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "gpu_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "interactive_ui_tests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "ipc_tests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "jingle_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "media_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "net_unittests": {
+                "builders": [
+                    "Linux Tests (dbg)(1)(Precise 32)", 
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(1)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(1)(Precise)", 
+                    "Linux Tests x64", 
+                    "Android Tests"
+                ]
+            }, 
+            "ppapi_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "printing_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "remoting_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "sandbox_linux_unittests": {
+                "builders": [
+                    "Linux Precise (dbg)", 
+                    "Linux Aura (Precise)", 
+                    "Linux Precise x64", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)"
+                ]
+            }, 
+            "sql_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "sync_integration_tests": {
+                "builders": [
+                    "Linux Sync (Precise)", 
+                    "Linux Sync"
+                ]
+            }, 
+            "sync_unit_tests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "test_report": {
+                "builders": [
+                    "Android Tests (dbg)", 
+                    "Android Tests"
+                ]
+            }, 
+            "ui_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "unit_tests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Clang (dbg)", 
+                    "Linux Aura", 
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Clang (dbg)(Precise)", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "views_unittests": {
+                "builders": [
+                    "Linux Aura (Precise)", 
+                    "Linux Aura"
+                ]
+            }, 
+            "webkit_compositor_bindings_unittests": {
+                "builders": [
+                    "Linux Tests (dbg)(2)(Precise 32)", 
+                    "Linux Tests (Precise)", 
+                    "Android Tests (dbg)", 
+                    "Linux Tests (dbg)(2)(Precise)", 
+                    "Linux Tests x64", 
+                    "Linux Tests (dbg)(2)", 
+                    "Android Tests"
+                ]
+            }, 
+            "webkit_unit_tests": {
+                "builders": [
+                    "Android Tests (dbg)", 
+                    "Android Tests"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.linux"
+    }, 
+    {
+        "name": "ChromiumChromiumOS", 
+        "tests": {
+            "app_list_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "ash_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "aura_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "base_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "browser_tests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (2)", 
+                    "Linux ChromiumOS Tests (2)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(2)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(2)"
+                ]
+            }, 
+            "cacheinvalidation_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "chromeos_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "components_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "compositor_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "content_browsertests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (2)", 
+                    "Linux ChromiumOS Tests (2)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(2)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(2)"
+                ]
+            }, 
+            "content_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "crypto_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "dbus_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "device_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "googleurl_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "gpu_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "interactive_ui_tests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(3)", 
+                    "Linux ChromiumOS Tests (2)", 
+                    "Linux ChromiumOS Tests (dbg)(3)(Precise)", 
+                    "Linux ChromiumOS Tests (2)(Precise)"
+                ]
+            }, 
+            "ipc_tests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "jingle_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "media_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "message_center_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "net_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "ppapi_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "printing_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "remoting_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "sandbox_linux_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "sql_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "sync_unit_tests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "ui_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "unit_tests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }, 
+            "views_unittests": {
+                "builders": [
+                    "Linux ChromiumOS Tests (dbg)(1)", 
+                    "Linux ChromiumOS Tests (1)", 
+                    "Linux ChromiumOS Tests (1)(Precise)", 
+                    "Linux ChromiumOS Tests (dbg)(1)(Precise)"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.chromiumos"
+    }, 
+    {
+        "name": "ChromiumGPU", 
+        "tests": {
+            "content_browsertests": {
+                "builders": [
+                    "Mac 10.8 Debug (Intel)", 
+                    "Mac Release (ATI)", 
+                    "Win7 Release (Intel)", 
+                    "Win7 Debug (NVIDIA)", 
+                    "Linux Release (ATI)", 
+                    "Mac Release (Intel)", 
+                    "Mac Debug (Intel)", 
+                    "Mac 10.8 Release (ATI)", 
+                    "Mac Retina Release", 
+                    "Mac 10.8 Release (Intel)", 
+                    "Win7 Release (NVIDIA)", 
+                    "Linux Debug (NVIDIA)", 
+                    "Win7 Release (ATI)", 
+                    "Mac Retina Debug", 
+                    "Linux Release (NVIDIA)"
+                ]
+            }, 
+            "gl_tests": {
+                "builders": [
+                    "Mac 10.8 Debug (Intel)", 
+                    "Mac Release (ATI)", 
+                    "Win7 Release (Intel)", 
+                    "Win7 Debug (NVIDIA)", 
+                    "Linux Release (ATI)", 
+                    "Mac Release (Intel)", 
+                    "Mac Debug (Intel)", 
+                    "Mac 10.8 Release (ATI)", 
+                    "Mac Retina Release", 
+                    "Mac 10.8 Release (Intel)", 
+                    "Win7 Release (NVIDIA)", 
+                    "Linux Debug (NVIDIA)", 
+                    "Win7 Release (ATI)", 
+                    "Mac Retina Debug", 
+                    "Linux Release (NVIDIA)"
+                ]
+            }, 
+            "gles2_conform_test": {
+                "builders": [
+                    "Mac 10.8 Debug (Intel)", 
+                    "Mac Release (ATI)", 
+                    "Win7 Release (Intel)", 
+                    "Win7 Debug (NVIDIA)", 
+                    "Linux Release (ATI)", 
+                    "Mac Release (Intel)", 
+                    "Mac Debug (Intel)", 
+                    "Mac 10.8 Release (ATI)", 
+                    "Mac Retina Release", 
+                    "Mac 10.8 Release (Intel)", 
+                    "Win7 Release (NVIDIA)", 
+                    "Linux Debug (NVIDIA)", 
+                    "Win7 Release (ATI)", 
+                    "Mac Retina Debug", 
+                    "Linux Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_frame_rate_test": {
+                "builders": [
+                    "Mac Release (ATI)", 
+                    "Win7 Release (Intel)", 
+                    "Linux Release (ATI)", 
+                    "Mac Release (Intel)", 
+                    "Mac 10.8 Release (ATI)", 
+                    "Mac Retina Release", 
+                    "Mac 10.8 Release (Intel)", 
+                    "Win7 Release (NVIDIA)", 
+                    "Win7 Release (ATI)", 
+                    "Linux Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_latency_tests": {
+                "builders": [
+                    "Mac Release (ATI)", 
+                    "Win7 Release (Intel)", 
+                    "Linux Release (ATI)", 
+                    "Mac Release (Intel)", 
+                    "Mac 10.8 Release (ATI)", 
+                    "Mac Retina Release", 
+                    "Mac 10.8 Release (Intel)", 
+                    "Win7 Release (NVIDIA)", 
+                    "Win7 Release (ATI)", 
+                    "Linux Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_tests": {
+                "builders": [
+                    "Mac 10.8 Debug (Intel)", 
+                    "Mac Release (ATI)", 
+                    "Win7 Release (Intel)", 
+                    "Win7 Debug (NVIDIA)", 
+                    "Linux Release (ATI)", 
+                    "Mac Release (Intel)", 
+                    "Mac Debug (Intel)", 
+                    "Mac 10.8 Release (ATI)", 
+                    "Mac Retina Release", 
+                    "Mac 10.8 Release (Intel)", 
+                    "Win7 Release (NVIDIA)", 
+                    "Linux Debug (NVIDIA)", 
+                    "Win7 Release (ATI)", 
+                    "Mac Retina Debug", 
+                    "Linux Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_throughput_tests": {
+                "builders": [
+                    "Mac Release (ATI)", 
+                    "Win7 Release (Intel)", 
+                    "Linux Release (ATI)", 
+                    "Mac Release (Intel)", 
+                    "Mac 10.8 Release (ATI)", 
+                    "Mac Retina Release", 
+                    "Mac 10.8 Release (Intel)", 
+                    "Win7 Release (NVIDIA)", 
+                    "Win7 Release (ATI)", 
+                    "Linux Release (NVIDIA)"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.gpu"
+    }, 
+    {
+        "name": "ChromiumGPUFYI", 
+        "tests": {
+            "content_unittests": {
+                "builders": [
+                    "Win7 Audio", 
+                    "Linux Audio"
+                ]
+            }, 
+            "gl_tests": {
+                "builders": [
+                    "Linux Release (Intel)", 
+                    "WinXP Debug (NVIDIA)", 
+                    "WinXP Release (NVIDIA)"
+                ]
+            }, 
+            "gles2_conform_test": {
+                "builders": [
+                    "Linux Release (Intel)", 
+                    "WinXP Debug (NVIDIA)", 
+                    "WinXP Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_frame_rate_test": {
+                "builders": [
+                    "Linux Release (Intel)", 
+                    "WinXP Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_latency_tests": {
+                "builders": [
+                    "Linux Release (Intel)", 
+                    "WinXP Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_tests": {
+                "builders": [
+                    "Linux Release (Intel)", 
+                    "WinXP Debug (NVIDIA)", 
+                    "WinXP Release (NVIDIA)"
+                ]
+            }, 
+            "gpu_throughput_tests": {
+                "builders": [
+                    "Linux Release (Intel)", 
+                    "WinXP Release (NVIDIA)"
+                ]
+            }, 
+            "media_unittests": {
+                "builders": [
+                    "Win7 Audio", 
+                    "Linux Audio"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.gpu.fyi"
+    }, 
+    {
+        "name": "ChromiumPerfAv", 
+        "tests": {
+            "layout-tests": {
+                "builders": [
+                    "AV Win7", 
+                    "AV Linux"
+                ]
+            }, 
+            "media_tests_av_perf": {
+                "builders": [
+                    "AV Win7", 
+                    "AV Linux"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.perf_av"
+    }, 
+    {
+        "name": "ChromiumWebkit", 
+        "tests": {
+            "Run tests": {
+                "builders": [
+                    "WebKit Android (GalaxyNexus)", 
+                    "WebKit (Content Shell) Android", 
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "android_webview_unittests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "androidwebview_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "aura_unittests": {
+                "builders": [
+                    "Linux Aura"
+                ]
+            }, 
+            "base_unittests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "browser_tests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "cc_unittests": {
+                "builders": [
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "chrome_frame_net_tests": {
+                "builders": [
+                    "Chrome Frame Tests"
+                ]
+            }, 
+            "chrome_frame_tests": {
+                "builders": [
+                    "Chrome Frame Tests"
+                ]
+            }, 
+            "chrome_frame_unittests": {
+                "builders": [
+                    "Chrome Frame Tests"
+                ]
+            }, 
+            "chromiumtestshell_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "components_unittests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "content_browsertests": {
+                "builders": [
+                    "GPU Win7 (NVIDIA)", 
+                    "Win7 (dbg)", 
+                    "GPU Linux (NVIDIA)", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "GPU Mac10.7", 
+                    "GPU Win7 (dbg) (NVIDIA)", 
+                    "GPU Mac10.7 (dbg)", 
+                    "GPU Linux (dbg) (NVIDIA)", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "content_unittests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Vista Tests", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)", 
+                    "Linux Aura", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "contentshell_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "gl_tests": {
+                "builders": [
+                    "GPU Win7 (NVIDIA)", 
+                    "GPU Linux (NVIDIA)", 
+                    "GPU Mac10.7", 
+                    "GPU Win7 (dbg) (NVIDIA)", 
+                    "GPU Mac10.7 (dbg)", 
+                    "GPU Linux (dbg) (NVIDIA)"
+                ]
+            }, 
+            "gpu_frame_rate_test": {
+                "builders": [
+                    "GPU Win7 (NVIDIA)", 
+                    "GPU Linux (NVIDIA)", 
+                    "GPU Mac10.7"
+                ]
+            }, 
+            "gpu_latency_tests": {
+                "builders": [
+                    "GPU Win7 (NVIDIA)", 
+                    "GPU Linux (NVIDIA)", 
+                    "GPU Mac10.7"
+                ]
+            }, 
+            "gpu_tests": {
+                "builders": [
+                    "GPU Win7 (NVIDIA)", 
+                    "GPU Linux (NVIDIA)", 
+                    "GPU Mac10.7", 
+                    "GPU Win7 (dbg) (NVIDIA)", 
+                    "GPU Mac10.7 (dbg)", 
+                    "GPU Linux (dbg) (NVIDIA)"
+                ]
+            }, 
+            "gpu_throughput_tests": {
+                "builders": [
+                    "GPU Win7 (NVIDIA)", 
+                    "GPU Linux (NVIDIA)", 
+                    "GPU Mac10.7"
+                ]
+            }, 
+            "gpu_unittests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "installer_util_unittests": {
+                "builders": [
+                    "Vista Tests"
+                ]
+            }, 
+            "interactive_ui_tests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "ipc_tests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Vista Tests", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)", 
+                    "Linux Aura", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "layout-tests": {
+                "builders": [
+                    "WebKit Linux 32", 
+                    "WebKit Win7", 
+                    "WebKit Linux ASAN", 
+                    "WebKit Win7 (dbg)(2)", 
+                    "WebKit (Content Shell) Linux", 
+                    "WebKit (Content Shell) Win", 
+                    "WebKit Android (GalaxyNexus)", 
+                    "WebKit (Content Shell) Android", 
+                    "WebKit Mac10.6 (dbg)", 
+                    "WebKit Mac10.7 (dbg)", 
+                    "WebKit Linux", 
+                    "WebKit Linux (dbg)", 
+                    "WebKit Mac10.6", 
+                    "WebKit Mac10.7", 
+                    "WebKit Linux (deps)", 
+                    "WebKit Mac10.8", 
+                    "WebKit Mac10.6 (deps)", 
+                    "WebKit (Content Shell) Mac10.6", 
+                    "WebKit Win7 (dbg)(1)", 
+                    "WebKit XP (deps)", 
+                    "WebKit XP"
+                ]
+            }, 
+            "media_unittests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "memory test: test_shell": {
+                "builders": [
+                    "Linux Valgrind"
+                ]
+            }, 
+            "memory_test": {
+                "builders": [
+                    "Mac10.6 Perf"
+                ]
+            }, 
+            "mini_installer_test": {
+                "builders": [
+                    "Vista Tests"
+                ]
+            }, 
+            "net_unittests": {
+                "builders": [
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "new_tab_ui_cold_test": {
+                "builders": [
+                    "Win7 Perf", 
+                    "Mac10.6 Perf", 
+                    "Linux Perf"
+                ]
+            }, 
+            "new_tab_ui_warm_test": {
+                "builders": [
+                    "Win7 Perf", 
+                    "Mac10.6 Perf", 
+                    "Linux Perf"
+                ]
+            }, 
+            "sql_unittests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Vista Tests", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)", 
+                    "Linux Aura", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "startup_test": {
+                "builders": [
+                    "Win7 Perf", 
+                    "Mac10.6 Perf", 
+                    "Linux Perf"
+                ]
+            }, 
+            "sync_unit_tests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Vista Tests", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)", 
+                    "Linux Aura", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "tab_switching_test": {
+                "builders": [
+                    "Mac10.6 Perf"
+                ]
+            }, 
+            "test_report": {
+                "builders": [
+                    "WebKit Android (GalaxyNexus)", 
+                    "WebKit (Content Shell) Android", 
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "test_shell_tests": {
+                "builders": [
+                    "WebKit Linux 32", 
+                    "WebKit Win7", 
+                    "WebKit Mac10.6 (dbg)", 
+                    "WebKit Mac10.7 (dbg)", 
+                    "WebKit Linux", 
+                    "WebKit Linux (dbg)", 
+                    "WebKit Mac10.6", 
+                    "WebKit Mac10.7", 
+                    "WebKit Linux (deps)", 
+                    "WebKit Mac10.8", 
+                    "WebKit Mac10.6 (deps)", 
+                    "WebKit Win7 (dbg)(1)", 
+                    "WebKit XP (deps)", 
+                    "WebKit XP"
+                ]
+            }, 
+            "ui_unittests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Vista Tests", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)", 
+                    "Linux Aura", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "unit_tests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Vista Tests", 
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)", 
+                    "Linux Aura", 
+                    "Mac10.8 Tests"
+                ]
+            }, 
+            "views_unittests": {
+                "builders": [
+                    "Win7 (dbg)", 
+                    "Vista Tests"
+                ]
+            }, 
+            "webkit_compositor_bindings_unittests": {
+                "builders": [
+                    "Linux Tests", 
+                    "Mac10.6 Tests", 
+                    "Android Tests (dbg)"
+                ]
+            }, 
+            "webkit_unit_tests": {
+                "builders": [
+                    "WebKit Linux 32", 
+                    "WebKit Win7", 
+                    "WebKit Android (GalaxyNexus)", 
+                    "WebKit Mac10.6 (dbg)", 
+                    "Android Tests (dbg)", 
+                    "WebKit Mac10.7 (dbg)", 
+                    "WebKit Linux", 
+                    "WebKit Linux (dbg)", 
+                    "WebKit Mac10.6", 
+                    "WebKit Mac10.7", 
+                    "WebKit Linux (deps)", 
+                    "WebKit Mac10.8", 
+                    "WebKit Mac10.6 (deps)", 
+                    "WebKit Win7 (dbg)(1)", 
+                    "WebKit XP (deps)", 
+                    "WebKit XP"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.webkit"
+    }, 
+    {
+        "name": "ChromiumFYI", 
+        "tests": {
+            "Run tests": {
+                "builders": [
+                    "Android ChromeDriver Tests (dbg)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "android_webview_unittests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "androidwebview_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "base_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Win ASAN Tests (1)", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "base_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "browser_tests": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Vista Tests (dbg)(2)", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (2)", 
+                    "Chromium Win x64 Clobber", 
+                    "Win ASAN Tests (1)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "browser_tests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "buildrunner_tests": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "cacheinvalidation_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Win ASAN Tests (1)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "cacheinvalidation_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "cc_unittests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "chrome_frame_net_tests": {
+                "builders": [
+                    "Chrome Frame Tests (ie6)(peruser)", 
+                    "Chrome Frame Tests (ie8)(peruser)", 
+                    "Chrome Frame Tests (ie8)(dbg)", 
+                    "Chrome Frame Tests (ie7)(peruser)"
+                ]
+            }, 
+            "chrome_frame_tests": {
+                "builders": [
+                    "Chrome Frame Tests (ie6)(peruser)", 
+                    "Chrome Frame Tests (ie8)(peruser)", 
+                    "Chrome Frame Tests (ie8)(dbg)", 
+                    "Chrome Frame Tests (ie7)(peruser)"
+                ]
+            }, 
+            "chrome_frame_unittests": {
+                "builders": [
+                    "Chrome Frame Tests (ie6)(peruser)", 
+                    "Chrome Frame Tests (ie8)(peruser)", 
+                    "Chrome Frame Tests (ie8)(dbg)", 
+                    "Chrome Frame Tests (ie7)(peruser)"
+                ]
+            }, 
+            "chromedriver2_python_tests": {
+                "builders": [
+                    "Android ChromeDriver Tests (dbg)"
+                ]
+            }, 
+            "chromedriver2_unittests": {
+                "builders": [
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Win x64 Clobber"
+                ]
+            }, 
+            "chromiumtestshell_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "components_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "content_browsertests": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Vista Tests (dbg)(2)", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (2)", 
+                    "Chromium Win x64 Clobber", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "content_browsertests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "content_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Win ASAN Tests (1)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "content_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "contentshell_instrumentation_tests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "courgette_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)"
+                ]
+            }, 
+            "courgette_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "crypto_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Win ASAN Tests (1)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "crypto_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "dbus_unittests": {
+                "builders": [
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "dbus_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "device_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Vista Tests (dbg)(1)"
+                ]
+            }, 
+            "googleurl_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "googleurl_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "gpu_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Win ASAN Tests (1)", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "gpu_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "installer_util_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "interactive_ui_tests": {
+                "builders": [
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Win x64 Clobber"
+                ]
+            }, 
+            "ipc_tests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "ipc_tests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "jingle_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Win ASAN Tests (1)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "jingle_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "media_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "media_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "memory test: base_unittests": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: browser_tests": {
+                "builders": [
+                    "Windows Browser (DrMemory) (1)", 
+                    "Windows Browser (DrMemory) (6)", 
+                    "Chromium Linux Browser (valgrind) (1)", 
+                    "Windows Browser (DrMemory) (5)", 
+                    "Chromium Linux Browser (valgrind) (2)", 
+                    "Windows Browser (DrMemory) (4)", 
+                    "Chromium Linux Browser (valgrind) (3)", 
+                    "Windows Browser (DrMemory) (3)", 
+                    "Chromium Linux Browser (valgrind) (4)", 
+                    "Windows Browser (DrMemory) (2)"
+                ]
+            }, 
+            "memory test: browser_tests_1": {
+                "builders": [
+                    "Chromium Linux Browser (valgrind) (1)", 
+                    "Chromium Linux Browser (valgrind) (2)", 
+                    "Chromium Linux Browser (valgrind) (3)", 
+                    "Chromium Linux Browser (valgrind) (4)"
+                ]
+            }, 
+            "memory test: content": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)"
+                ]
+            }, 
+            "memory test: content_browsertests": {
+                "builders": [
+                    "Chromium Linux Browser (valgrind) (1)", 
+                    "Chromium Linux Browser (valgrind) (2)", 
+                    "Chromium Linux Browser (valgrind) (3)", 
+                    "Chromium Linux Browser (valgrind) (4)"
+                ]
+            }, 
+            "memory test: crypto": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: device_unittests": {
+                "builders": [
+                    "Linux Tests (tsan RV)"
+                ]
+            }, 
+            "memory test: googleurl": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: interactive_ui_tests": {
+                "builders": [
+                    "Chromium Linux Reliability (valgrind)"
+                ]
+            }, 
+            "memory test: interactive_ui_tests_1": {
+                "builders": [
+                    "Chromium Linux Reliability (valgrind)"
+                ]
+            }, 
+            "memory test: ipc_tests": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: media": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: net": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: printing": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: remoting": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: sql": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Windows Tests (TSan Win 7)", 
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: sync": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Linux Tests (tsan RV)"
+                ]
+            }, 
+            "memory test: ui_unittests": {
+                "builders": [
+                    "Chromium Mac 10.6 (tsan)", 
+                    "Linux Tests (tsan RV)"
+                ]
+            }, 
+            "memory test: unit": {
+                "builders": [
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)", 
+                    "Windows Tests (DrMemory pattern)"
+                ]
+            }, 
+            "memory test: unit_1": {
+                "builders": [
+                    "Linux Tests (tsan RV)", 
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)"
+                ]
+            }, 
+            "memory test: unit_2": {
+                "builders": [
+                    "Windows Tests (DrMemory XP)", 
+                    "Windows Tests (DrMemory full)"
+                ]
+            }, 
+            "memory test: unit_3": {
+                "builders": [
+                    "Windows Tests (DrMemory full)"
+                ]
+            }, 
+            "memory test: unit_4": {
+                "builders": [
+                    "Windows Tests (DrMemory full)"
+                ]
+            }, 
+            "memory test: unit_5": {
+                "builders": [
+                    "Windows Tests (DrMemory full)"
+                ]
+            }, 
+            "memory_test": {
+                "builders": [
+                    "Chromium Linux Memory", 
+                    "Chromium Vista Memory", 
+                    "Chromium Mac Memory"
+                ]
+            }, 
+            "mini_installer_test": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)"
+                ]
+            }, 
+            "mini_installer_test_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "net_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Win ASAN Tests (1)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "net_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "new_tab_ui_cold_test": {
+                "builders": [
+                    "Chromium Linux Perf Annotator"
+                ]
+            }, 
+            "new_tab_ui_warm_test": {
+                "builders": [
+                    "Chromium Linux Perf Annotator"
+                ]
+            }, 
+            "ppapi_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "ppapi_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "printing_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "printing_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "remoting_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Linux TSan v2", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium Mac 10.8 Buildrunner"
+                ]
+            }, 
+            "remoting_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Mac Buildrunner", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Mac 10.8 Buildrunner", 
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "run_browser_tests_only": {
+                "builders": [
+                    "Linux Coverage (dbg)"
+                ]
+            }, 
+            "run_unittests_only": {
+                "builders": [
+                    "Linux Coverage (dbg)"
+                ]
+            }, 
+            "sandbox_linux_jni_unittests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)"
+                ]
+            }, 
+            "sandbox_linux_unittests": {
+                "builders": [
+                    "Chromium Linux TSan v2", 
+                    "Linux ARM Tests (Panda)"
+                ]
+            }, 
+            "sbox_integration_tests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)"
+                ]
+            }, 
+            "sbox_integration_tests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "sbox_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)"
+                ]
+            }, 
+            "sbox_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "sbox_validation_tests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)"
+                ]
+            }, 
+            "sbox_validation_tests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Windows Buildrunner"
+                ]
+            }, 
+            "sql_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Win ASAN Tests (1)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "sql_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "startup_test": {
+                "builders": [
+                    "Chromium Linux Perf Annotator"
+                ]
+            }, 
+            "sync_integration_tests": {
+                "builders": [
+                    "Chromium Win x64 Clobber"
+                ]
+            }, 
+            "sync_unit_tests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "sync_unit_tests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "telemetry_perf_unittests": {
+                "builders": [
+                    "Chromium Mac Perf Annotator", 
+                    "Chromium Windows Perf Annotator", 
+                    "Chromium Linux Perf Annotator"
+                ]
+            }, 
+            "telemetry_unittests": {
+                "builders": [
+                    "Chromium Mac Perf Annotator", 
+                    "Chromium Windows Perf Annotator", 
+                    "Chromium Linux Perf Annotator"
+                ]
+            }, 
+            "test_report": {
+                "builders": [
+                    "Android ChromeDriver Tests (dbg)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "ui_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Win ASAN Tests (1)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "ui_unittests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "unit_tests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Linux TSan v2", 
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Win ASAN Tests (2)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Linux Redux", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Linux Buildrunner", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)", 
+                    "Chromium iOS Simulator (dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "unit_tests_buildrunner_ignore": {
+                "builders": [
+                    "Chromium Linux Buildrunner"
+                ]
+            }, 
+            "views_unittests": {
+                "builders": [
+                    "Chromium Win7 Ninja Goma (shared)", 
+                    "Chromium Win VS2012 Goma", 
+                    "Chromium Win VS2012", 
+                    "Chromium Win (aura)", 
+                    "Chromium Win7 Ninja Goma", 
+                    "Chromium Win Ninja Goma (shared)", 
+                    "Chromium Win Ninja Goma", 
+                    "Chromium Win VS2012 Goma (dbg)", 
+                    "Chromium Win (ash)", 
+                    "Win8 Tests (1)", 
+                    "Chromium Win VS2012 (dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Vista Tests (dbg)(1)"
+                ]
+            }, 
+            "webkit_compositor_bindings_unittests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Linux ARM Tests (Panda)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Chromium Win x64 Clobber", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }, 
+            "webkit_unit_tests": {
+                "builders": [
+                    "Android Tests (JB Nexus7)(dbg)", 
+                    "Android Tests (ICS GalaxyNexus)(dbg)", 
+                    "Android Tests (JB GalaxyNexus)(dbg)", 
+                    "Android Asan Tests (dbg)"
+                ]
+            }
+        }, 
+        "url": "http://build.chromium.org/p/chromium.fyi"
+    }, 
+    {
+        "name": "webkit.org", 
+        "tests": {
+            "layout-tests": {
+                "builders": [
+                    "Apple Lion (Leaks)", 
+                    "Apple Lion Debug WK1 (Tests)", 
+                    "Apple Lion Debug WK2 (Tests)", 
+                    "Apple Lion Release WK1 (Tests)", 
+                    "Apple Lion Release WK2 (Tests)", 
+                    "Apple MountainLion (Leaks)", 
+                    "Apple MountainLion Debug WK1 (Tests)", 
+                    "Apple MountainLion Debug WK2 (Tests)", 
+                    "Apple MountainLion Release WK1 (Tests)", 
+                    "Apple MountainLion Release WK2 (Tests)", 
+                    "Apple Win 7 Debug (Tests)", 
+                    "Apple Win 7 Release (Tests)", 
+                    "Chromium Android Release (Tests)", 
+                    "Chromium Linux Release (Tests)", 
+                    "Chromium Mac Release (Tests)", 
+                    "Chromium Win Release (Tests)", 
+                    "EFL Linux 64-bit Debug WK2", 
+                    "EFL Linux 64-bit Release", 
+                    "EFL Linux 64-bit Release WK2", 
+                    "GTK Linux 32-bit Release", 
+                    "GTK Linux 64-bit Debug WK1", 
+                    "GTK Linux 64-bit Release", 
+                    "GTK Linux 64-bit Release WK2 (Tests)", 
+                    "Qt Linux Release", 
+                    "WinCairo Release"
+                ]
+            }
+        }, 
+        "url": "http://build.webkit.org"
+    }
+]);
diff --git a/Tools/TestResultServer/static-dashboards/builders_unittests.js b/Tools/TestResultServer/static-dashboards/builders_unittests.js
new file mode 100644
index 0000000..29c02f1
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/builders_unittests.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2012 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+test('loading steps', 4, function() {
+    var tests = {}
+    var baseUrl = 'http://dummyurl';
+    var name = 'dummyname';
+    var master = new builders.BuilderMaster(name, baseUrl, tests);
+
+    var builder = 'dummybuilder';
+    var buildNumber = 12345;
+    equal(master.logPath(builder, buildNumber), baseUrl + '/builders/' + builder + '/builds/' + buildNumber);
+    equal(master.builderJsonPath(), baseUrl + '/json/builders');
+    equal(master.tests, tests);
+    equal(master.name, name);
+})
diff --git a/Tools/TestResultServer/static-dashboards/dashboard_base.js b/Tools/TestResultServer/static-dashboards/dashboard_base.js
index 6ec0c8e..8b1bcbf 100644
--- a/Tools/TestResultServer/static-dashboards/dashboard_base.js
+++ b/Tools/TestResultServer/static-dashboards/dashboard_base.js
@@ -32,17 +32,15 @@
 //
 // The calling page is expected to implement the following "abstract"
 // functions/objects:
-var g_pageLoadStartTime = Date.now();
-var g_resourceLoader;
 
 // Generates the contents of the dashboard. The page should override this with
 // a function that generates the page assuming all resources have loaded.
 function generatePage() {}
 
-// Takes a key and a value and sets the g_currentState[key] = value iff key is
+// Takes a key and a value and sets the g_history.dashboardSpecificState[key] = value iff key is
 // a valid hash parameter and the value is a valid value for that key.
 //
-// @return {boolean} Whether the key what inserted into the g_currentState.
+// @return {boolean} Whether the key what inserted into the g_history.dashboardSpecificState.
 function handleValidHashParameter(key, value)
 {
     return false;
@@ -86,13 +84,11 @@
     'O': 'MISSING'
 };
 
-var FAILURE_EXPECTATIONS_ = {
-    'T': 1,
-    'F': 1,
-    'C': 1,
-    'I': 1,
-    'Z': 1
+// Map of parameter to other parameter it invalidates.
+var CROSS_DB_INVALIDATING_PARAMETERS = {
+    'testType': 'group'
 };
+var DB_SPECIFIC_INVALIDATING_PARAMETERS;
 
 // Keys in the JSON files.
 var WONTFIX_COUNTS_KEY = 'wontfixCounts';
@@ -146,9 +142,12 @@
     'unit_tests',
     'views_unittests',
     'webkit_unit_tests',
+    'androidwebview_instrumentation_tests',
+    'chromiumtestshell_instrumentation_tests',
+    'contentshell_instrumentation_tests',
+    'cc_unittests'
 ];
 
-var RELOAD_REQUIRING_PARAMETERS = ['showAllRuns', 'group', 'testType'];
 
 // Enum for indexing into the run-length encoded results in the JSON files.
 // 0 is where the count is length is stored. 1 is the value.
@@ -162,251 +161,34 @@
     return 'FSTOCIZ'.indexOf(value) != -1;
 }
 
-// Takes a key and a value and sets the g_currentState[key] = value iff key is
-// a valid hash parameter and the value is a valid value for that key. Handles
-// cross-dashboard parameters then falls back to calling
-// handleValidHashParameter for dashboard-specific parameters.
-//
-// @return {boolean} Whether the key what inserted into the g_currentState.
-function handleValidHashParameterWrapper(key, value)
-{
-    switch(key) {
-    case 'testType':
-        validateParameter(g_crossDashboardState, key, value,
-            function() { return TEST_TYPES.indexOf(value) != -1; });
-        return true;
-
-    case 'group':
-        validateParameter(g_crossDashboardState, key, value,
-            function() {
-              return value in LAYOUT_TESTS_BUILDER_GROUPS ||
-                  value in CHROMIUM_GPU_TESTS_BUILDER_GROUPS ||
-                  value in CHROMIUM_GTESTS_BUILDER_GROUPS;
-            });
-        return true;
-
-    // FIXME: This should probably be stored on g_crossDashboardState like everything else in this function.
-    case 'builder':
-        validateParameter(g_currentState, key, value,
-            function() { return value in g_builders; });
-        return true;
-
-    case 'useTestData':
-    case 'showAllRuns':
-        g_crossDashboardState[key] = value == 'true';
-        return true;
-
-    case 'buildDir':
-        if (value === 'Debug' || value == 'Release') {
-            g_crossDashboardState['testType'] = 'layout-tests';
-            g_crossDashboardState[key] = value;
-            return true;
-        } else
-            return false;
-
-    default:
-        return handleValidHashParameter(key, value);
-    }
-}
-
-var g_defaultCrossDashboardStateValues = {
-    group: '@ToT - chromium.org',
-    showAllRuns: false,
-    testType: 'layout-tests',
-    buildDir: '',
-    useTestData: false,
-}
-
 // Generic utility functions.
 function $(id)
 {
     return document.getElementById(id);
 }
 
-function stringContains(a, b)
-{
-    return a.indexOf(b) != -1;
-}
-
-function caseInsensitiveContains(a, b)
-{
-    return a.match(new RegExp(b, 'i'));
-}
-
-function startsWith(a, b)
-{
-    return a.indexOf(b) == 0;
-}
-
-function endsWith(a, b)
-{
-    return a.lastIndexOf(b) == a.length - b.length;
-}
-
-function isValidName(str)
-{
-    return str.match(/[A-Za-z0-9\-\_,]/);
-}
-
-function trimString(str)
-{
-    return str.replace(/^\s+|\s+$/g, '');
-}
-
-function collapseWhitespace(str)
-{
-    return str.replace(/\s+/g, ' ');
-}
-
-function validateParameter(state, key, value, validateFn)
-{
-    if (validateFn())
-        state[key] = value;
-    else
-        console.log(key + ' value is not valid: ' + value);
-}
-
-function queryHashAsMap()
-{
-    var hash = window.location.hash;
-    var paramsList = hash ? hash.substring(1).split('&') : [];
-    var paramsMap = {};
-    var invalidKeys = [];
-    for (var i = 0; i < paramsList.length; i++) {
-        var thisParam = paramsList[i].split('=');
-        if (thisParam.length != 2) {
-            console.log('Invalid query parameter: ' + paramsList[i]);
-            continue;
-        }
-
-        paramsMap[thisParam[0]] = decodeURIComponent(thisParam[1]);
-    }
-
-    // FIXME: remove support for mapping from the master parameter to the group
-    // one once the waterfall starts to pass in the builder name instead.
-    if (paramsMap.master) {
-        paramsMap.group = LEGACY_BUILDER_MASTERS_TO_GROUPS[paramsMap.master];
-        if (!paramsMap.group)
-            console.log('ERROR: Unknown master name: ' + paramsMap.master);
-        window.location.hash = window.location.hash.replace('master=' + paramsMap.master, 'group=' + paramsMap.group);
-        delete paramsMap.master;
-    }
-
-    return paramsMap;
-}
-
-function parseParameter(parameters, key)
-{
-    if (!(key in parameters))
-        return;
-    var value = parameters[key];
-    if (!handleValidHashParameterWrapper(key, value))
-        console.log("Invalid query parameter: " + key + '=' + value);
-}
-
-function parseCrossDashboardParameters()
-{
-    g_crossDashboardState = {};
-    var parameters = queryHashAsMap();
-    for (parameterName in g_defaultCrossDashboardStateValues)
-        parseParameter(parameters, parameterName);
-
-    fillMissingValues(g_crossDashboardState, g_defaultCrossDashboardStateValues);
-    if (currentBuilderGroup() === undefined)
-        g_crossDashboardState.group = g_defaultCrossDashboardStateValues.group;
-}
-
 function parseDashboardSpecificParameters()
 {
-    g_currentState = {};
-    var parameters = queryHashAsMap();
+    g_history.dashboardSpecificState = {};
+    var parameters = history.queryHashAsMap();
     for (parameterName in g_defaultDashboardSpecificStateValues)
-        parseParameter(parameters, parameterName);
-}
-
-function parseParameters()
-{
-    var oldCrossDashboardState = g_crossDashboardState;
-    var oldDashboardSpecificState = g_currentState;
-
-    parseCrossDashboardParameters();
-    parseDashboardSpecificParameters();
-    parseParameter(queryHashAsMap(), 'builder');
-
-    var crossDashboardDiffState = diffStates(oldCrossDashboardState, g_crossDashboardState);
-    var dashboardSpecificDiffState = diffStates(oldDashboardSpecificState, g_currentState);
-
-    fillMissingValues(g_currentState, g_defaultDashboardSpecificStateValues);
-    if (!g_crossDashboardState.useTestData)
-        fillMissingValues(g_currentState, {'builder': g_defaultBuilderName});
-
-    // FIXME: dashboard_base shouldn't know anything about specific dashboard specific keys.
-    if (dashboardSpecificDiffState.builder)
-        delete g_currentState.tests;
-    if (g_currentState.tests)
-        delete g_currentState.builder;
-
-    // Some parameters require loading different JSON files when the value changes. Do a reload.
-    if (Object.keys(oldCrossDashboardState).length) {
-        for (var key in g_crossDashboardState) {
-            if (oldCrossDashboardState[key] != g_crossDashboardState[key] && RELOAD_REQUIRING_PARAMETERS.indexOf(key) != -1)
-                window.location.reload();
-        }
-    }
-
-    return dashboardSpecificDiffState;
-}
-
-function diffStates(oldState, newState)
-{
-    // If there is no old state, everything in the current state is new.
-    if (!oldState)
-        return newState;
-
-    var changedParams = {};
-    for (curKey in newState) {
-        var oldVal = oldState[curKey];
-        var newVal = newState[curKey];
-        // Add new keys or changed values.
-        if (!oldVal || oldVal != newVal)
-            changedParams[curKey] = newVal;
-    }
-    return changedParams;
+        g_history.parseParameter(parameters, parameterName);
 }
 
 function defaultValue(key)
 {
     if (key in g_defaultDashboardSpecificStateValues)
         return g_defaultDashboardSpecificStateValues[key];
-    return g_defaultCrossDashboardStateValues[key];
+    return history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES[key];
 }
 
-function fillMissingValues(to, from)
-{
-    for (var state in from) {
-        if (!(state in to))
-            to[state] = from[state];
-    }
-}
-
-// FIXME: Rename this to g_dashboardSpecificState;
-var g_currentState = {};
-var g_crossDashboardState = {};
-parseCrossDashboardParameters();
-
-function isLayoutTestResults()
-{
-    return g_crossDashboardState.testType == 'layout-tests';
-}
-
-function isGPUTestResults()
-{
-    return g_crossDashboardState.testType == 'gpu_tests';
-}
+// TODO(jparent): Each db should create their own history obj, not global.
+var g_history = new history.History();
+g_history.parseCrossDashboardParameters();
 
 function currentBuilderGroupCategory()
 {
-    switch (g_crossDashboardState.testType) {
+    switch (g_history.crossDashboardState.testType) {
     case 'gl_tests':
     case 'gpu_tests':
         return CHROMIUM_GPU_TESTS_BUILDER_GROUPS;
@@ -415,19 +197,30 @@
     case 'test_shell_tests':
     case 'webkit_unit_tests':
         return TEST_SHELL_TESTS_BUILDER_GROUPS;
+    case 'androidwebview_instrumentation_tests':
+    case 'chromiumtestshell_instrumentation_tests':
+    case 'contentshell_instrumentation_tests':
+        return CHROMIUM_INSTRUMENTATION_TESTS_BUILDER_GROUPS;
+    case 'cc_unittests':
+        return CC_UNITTEST_BUILDER_GROUPS;
     default:
         return CHROMIUM_GTESTS_BUILDER_GROUPS;
     }
 }
 
-function currentBuilderGroup()
+function currentBuilderGroupName()
 {
-    return currentBuilderGroupCategory()[g_crossDashboardState.group]
+    return g_history.crossDashboardState.group || Object.keys(currentBuilderGroupCategory())[0];
 }
 
-function builderMaster(builderName)
+function currentBuilderGroup()
 {
-    return BUILDER_TO_MASTER[builderName];
+    return currentBuilderGroupCategory()[currentBuilderGroupName()];
+}
+
+function currentBuilders()
+{
+    return currentBuilderGroup().builders;
 }
 
 function isTipOfTreeWebKitBuilder()
@@ -435,212 +228,24 @@
     return currentBuilderGroup().isToTWebKit;
 }
 
-var g_defaultBuilderName, g_builders;
-function initBuilders()
-{
-    if (g_crossDashboardState.buildDir) {
-        // If buildDir is set, point to the results.json in the local tree. Useful for debugging changes to the python JSON generator.
-        g_defaultBuilderName = 'DUMMY_BUILDER_NAME';
-        g_builders = {'DUMMY_BUILDER_NAME': ''};
-        var loc = document.location.toString();
-        var offset = loc.indexOf('webkit/');
-    } else
-        currentBuilderGroup().setup();
-}
-
 var g_resultsByBuilder = {};
 var g_expectationsByPlatform = {};
-var g_staleBuilders = [];
-var g_buildersThatFailedToLoad = [];
-
-// TODO(aboxhall): figure out whether this is a performance bottleneck and
-// change calling code to understand the trie structure instead if necessary.
-function flattenTrie(trie, prefix)
-{
-    var result = {};
-    for (var name in trie) {
-        var fullName = prefix ? prefix + "/" + name : name;
-        var data = trie[name];
-        if ("results" in data)
-            result[fullName] = data;
-        else {
-            var partialResult = flattenTrie(data, fullName);
-            for (var key in partialResult) {
-                result[key] = partialResult[key];
-            }
-        }
-    }
-    return result;
-}
-
-function isTreeMap()
-{
-    return endsWith(window.location.pathname, 'treemap.html');
-}
 
 function isFlakinessDashboard()
 {
-    return endsWith(window.location.pathname, 'flakiness_dashboard.html');
-}
-
-var g_hasDoneInitialPageGeneration = false;
-// String of error messages to display to the user.
-var g_errorMessages = '';
-
-// Record a new error message.
-// @param {string} errorMsg The message to show to the user.
-function addError(errorMsg)
-{
-    g_errorMessages += errorMsg + '<br>';
-}
-
-// Clear out error and warning messages.
-function clearErrors()
-{
-    g_errorMessages = '';
-}
-
-// If there are errors, show big and red UI for errors so as to be noticed.
-function showErrors()
-{
-    var errors = $('errors');
-
-    if (!g_errorMessages) {
-        if (errors)
-            errors.parentNode.removeChild(errors);
-        return;
-    }
-
-    if (!errors) {
-        errors = document.createElement('H2');
-        errors.style.color = 'red';
-        errors.id = 'errors';
-        document.body.appendChild(errors);
-    }
-
-    errors.innerHTML = g_errorMessages;
-}
-
-function addBuilderLoadErrors()
-{
-    if (g_hasDoneInitialPageGeneration)
-        return;
-
-    if (g_buildersThatFailedToLoad.length)
-        addError('ERROR: Failed to get data from ' + g_buildersThatFailedToLoad.toString() + '.');
-
-    if (g_staleBuilders.length)
-        addError('ERROR: Data from ' + g_staleBuilders.toString() + ' is more than 1 day stale.');
-}
-
-function resourceLoadingComplete()
-{
-    g_resourceLoader = null;
-    handleLocationChange();
+    return string.endsWith(window.location.pathname, 'flakiness_dashboard.html');
 }
 
 function handleLocationChange()
 {
-    if (g_resourceLoader)
-        return;
-
-    addBuilderLoadErrors();
-    g_hasDoneInitialPageGeneration = true;
-
-    var params = parseParameters();
-    var shouldGeneratePage = true;
-    if (Object.keys(params).length)
-        shouldGeneratePage = handleQueryParameterChange(params);
-
-    var newHash = permaLinkURLHash();
-    var winHash = window.location.hash || "#";
-    // Make sure the location is the same as the state we are using internally.
-    // These get out of sync if processQueryParamChange changed state.
-    if (newHash != winHash) {
-        // This will cause another hashchange, and when we loop
-        // back through here next time, we'll go through generatePage.
-        window.location.hash = newHash;
-    } else if (shouldGeneratePage)
+    if (g_history.parseParameters())
         generatePage();
 }
 
-window.onhashchange = handleLocationChange;
-
-function combinedDashboardState()
-{
-    var combinedState = Object.create(g_currentState);
-    for (var key in g_crossDashboardState)
-        combinedState[key] = g_crossDashboardState[key];
-    return combinedState;    
-}
-
-// Sets the page state. Takes varargs of key, value pairs.
-function setQueryParameter(var_args)
-{
-    var state = combinedDashboardState();
-    for (var i = 0; i < arguments.length; i += 2) {
-        var key = arguments[i];
-        state[key] = arguments[i + 1];
-    }
-    // Note: We use window.location.hash rather that window.location.replace
-    // because of bugs in Chrome where extra entries were getting created
-    // when back button was pressed and full page navigation was occuring.
-    // FIXME: file those bugs.
-    window.location.hash = permaLinkURLHash(state);
-}
-
-function permaLinkURLHash(opt_state)
-{
-    var state = opt_state || combinedDashboardState();
-    return '#' + joinParameters(state);
-}
-
-function joinParameters(stateObject)
-{
-    var state = [];
-    for (var key in stateObject) {
-        var value = stateObject[key];
-        if (value != defaultValue(key))
-            state.push(key + '=' + encodeURIComponent(value));
-    }
-    return state.join('&');
-}
-
-function logTime(msg, startTime)
-{
-    console.log(msg + ': ' + (Date.now() - startTime));
-}
-
-function hidePopup()
-{
-    var popup = $('popup');
-    if (popup)
-        popup.parentNode.removeChild(popup);
-}
-
-function showPopup(target, html)
-{
-    var popup = $('popup');
-    if (!popup) {
-        popup = document.createElement('div');
-        popup.id = 'popup';
-        document.body.appendChild(popup);
-    }
-
-    // Set html first so that we can get accurate size metrics on the popup.
-    popup.innerHTML = html;
-
-    var targetRect = target.getBoundingClientRect();
-
-    var x = Math.min(targetRect.left - 10, document.documentElement.clientWidth - popup.offsetWidth);
-    x = Math.max(0, x);
-    popup.style.left = x + document.body.scrollLeft + 'px';
-
-    var y = targetRect.top + targetRect.height;
-    if (y + popup.offsetHeight > document.documentElement.clientHeight)
-        y = targetRect.top - popup.offsetHeight;
-    y = Math.max(0, y);
-    popup.style.top = y + document.body.scrollTop + 'px';
+// TODO(jparent): Move this to upcoming History object.
+function intializeHistory() {
+    window.onhashchange = handleLocationChange;
+    handleLocationChange();
 }
 
 // Create a new function with some of its arguements
@@ -662,254 +267,8 @@
     };
 };
 
-// Returns the appropriate expectatiosn map for the current testType.
+// Returns the appropriate expectations map for the current testType.
 function expectationsMap()
 {
-    return isLayoutTestResults() ? LAYOUT_TEST_EXPECTATIONS_MAP_ : GTEST_EXPECTATIONS_MAP_;
-}
-
-function toggleQueryParameter(param)
-{
-    setQueryParameter(param, !queryParameterValue(param));
-}
-
-function queryParameterValue(parameter)
-{
-    return g_currentState[parameter] || g_crossDashboardState[parameter];
-}
-
-function checkboxHTML(queryParameter, label, isChecked, opt_extraJavaScript)
-{
-    var js = opt_extraJavaScript || '';
-    return '<label style="padding-left: 2em">' +
-        '<input type="checkbox" onchange="toggleQueryParameter(\'' + queryParameter + '\');' + js + '" ' +
-            (isChecked ? 'checked' : '') + '>' + label +
-        '</label> ';
-}
-
-function selectHTML(label, queryParameter, options)
-{
-    var html = '<label style="padding-left: 2em">' + label + ': ' +
-        '<select onchange="setQueryParameter(\'' + queryParameter + '\', this[this.selectedIndex].value)">';
-
-    for (var i = 0; i < options.length; i++) {
-        var value = options[i];
-        html += '<option value="' + value + '" ' +
-            (queryParameterValue(queryParameter) == value ? 'selected' : '') +
-            '>' + value + '</option>'
-    }
-    html += '</select></label> ';
-    return html;
-}
-
-// Returns the HTML for the select element to switch to different testTypes.
-function htmlForTestTypeSwitcher(opt_noBuilderMenu, opt_extraHtml, opt_includeNoneBuilder)
-{
-    var html = '<div style="border-bottom:1px dashed">';
-    html += '' +
-        htmlForDashboardLink('Stats', 'aggregate_results.html') +
-        htmlForDashboardLink('Timeline', 'timeline_explorer.html') +
-        htmlForDashboardLink('Results', 'flakiness_dashboard.html') +
-        htmlForDashboardLink('Treemap', 'treemap.html');
-
-    html += selectHTML('Test type', 'testType', TEST_TYPES);
-
-    if (!opt_noBuilderMenu) {
-        var buildersForMenu = Object.keys(g_builders);
-        if (opt_includeNoneBuilder)
-            buildersForMenu.unshift('--------------');
-        html += selectHTML('Builder', 'builder', buildersForMenu);
-    }
-
-    html += selectHTML('Group', 'group',
-        Object.keys(currentBuilderGroupCategory()));
-
-    if (!isTreeMap())
-        html += checkboxHTML('showAllRuns', 'Show all runs', g_crossDashboardState.showAllRuns);
-
-    if (opt_extraHtml)
-        html += opt_extraHtml;
-    return html + '</div>';
-}
-
-function selectBuilder(builder)
-{
-    setQueryParameter('builder', builder);
-}
-
-function loadDashboard(fileName)
-{
-    var pathName = window.location.pathname;
-    pathName = pathName.substring(0, pathName.lastIndexOf('/') + 1);
-    window.location = pathName + fileName + window.location.hash;
-}
-
-function htmlForTopLink(html, onClick, isSelected)
-{
-    var cssText = isSelected ? 'font-weight: bold;' : 'color:blue;text-decoration:underline;cursor:pointer;';
-    cssText += 'margin: 0 5px;';
-    return '<span style="' + cssText + '" onclick="' + onClick + '">' + html + '</span>';
-}
-
-function htmlForDashboardLink(html, fileName)
-{
-    var pathName = window.location.pathname;
-    var currentFileName = pathName.substring(pathName.lastIndexOf('/') + 1);
-    var isSelected = currentFileName == fileName;
-    var onClick = 'loadDashboard(\'' + fileName + '\')';
-    return htmlForTopLink(html, onClick, isSelected);
-}
-
-function revisionLink(results, index, key, singleUrlTemplate, rangeUrlTemplate)
-{
-    var currentRevision = parseInt(results[key][index], 10);
-    var previousRevision = parseInt(results[key][index + 1], 10);
-
-    function singleUrl()
-    {
-        return singleUrlTemplate.replace('<rev>', currentRevision);
-    }
-
-    function rangeUrl()
-    {
-        return rangeUrlTemplate.replace('<rev1>', currentRevision).replace('<rev2>', previousRevision + 1);
-    }
-
-    if (currentRevision == previousRevision)
-        return 'At <a href="' + singleUrl() + '">r' + currentRevision    + '</a>';
-    else if (currentRevision - previousRevision == 1)
-        return '<a href="' + singleUrl() + '">r' + currentRevision    + '</a>';
-    else
-        return '<a href="' + rangeUrl() + '">r' + (previousRevision + 1) + ' to r' + currentRevision + '</a>';
-}
-
-function chromiumRevisionLink(results, index)
-{
-    return revisionLink(
-        results,
-        index,
-        CHROME_REVISIONS_KEY,
-        'http://src.chromium.org/viewvc/chrome?view=rev&revision=<rev>',
-        'http://build.chromium.org/f/chromium/perf/dashboard/ui/changelog.html?url=/trunk/src&range=<rev2>:<rev1>&mode=html');
-}
-
-function webKitRevisionLink(results, index)
-{
-    return revisionLink(
-        results,
-        index,
-        WEBKIT_REVISIONS_KEY,
-        'http://trac.webkit.org/changeset/<rev>',
-        'http://trac.webkit.org/log/trunk/?rev=<rev1>&stop_rev=<rev2>&limit=100&verbose=on');
-}
-
-// "Decompresses" the RLE-encoding of test results so that we can query it
-// by build index and test name.
-//
-// @param {Object} results results for the current builder
-// @return Object with these properties:
-//     - testNames: array mapping test index to test names.
-//     - resultsByBuild: array of builds, for each build a (sparse) array of test results by test index.
-//     - flakyTests: array with the boolean value true at test indices that are considered flaky (more than one single-build failure).
-//     - flakyDeltasByBuild: array of builds, for each build a count of flaky test results by expectation, as well as a total.
-function decompressResults(builderResults)
-{
-    var builderTestResults = builderResults[TESTS_KEY];
-    var buildCount = builderResults[FIXABLE_COUNTS_KEY].length;
-    var resultsByBuild = new Array(buildCount);
-    var flakyDeltasByBuild = new Array(buildCount);
-
-    // Pre-sizing the test result arrays for each build saves us ~250ms
-    var testCount = 0;
-    for (var testName in builderTestResults)
-        testCount++;
-    for (var i = 0; i < buildCount; i++) {
-        resultsByBuild[i] = new Array(testCount);
-        resultsByBuild[i][testCount - 1] = undefined;
-        flakyDeltasByBuild[i] = {};
-    }
-
-    // Using indices instead of the full test names for each build saves us
-    // ~1500ms
-    var testIndex = 0;
-    var testNames = new Array(testCount);
-    var flakyTests = new Array(testCount);
-
-    // Decompress and "invert" test results (by build instead of by test) and
-    // determine which are flaky.
-    for (var testName in builderTestResults) {
-        var oneBuildFailureCount = 0;
-
-        testNames[testIndex] = testName;
-        var testResults = builderTestResults[testName].results;
-        for (var i = 0, rleResult, currentBuildIndex = 0; (rleResult = testResults[i]) && currentBuildIndex < buildCount; i++) {
-            var count = rleResult[RLE.LENGTH];
-            var value = rleResult[RLE.VALUE];
-
-            if (count == 1 && value in FAILURE_EXPECTATIONS_)
-                oneBuildFailureCount++;
-
-            for (var j = 0; j < count; j++) {
-                resultsByBuild[currentBuildIndex++][testIndex] = value;
-                if (currentBuildIndex == buildCount)
-                    break;
-            }
-        }
-
-        if (oneBuildFailureCount > 2)
-            flakyTests[testIndex] = true;
-
-        testIndex++;
-    }
-
-    // Now that we know which tests are flaky, count the test results that are
-    // from flaky tests for each build.
-    testIndex = 0;
-    for (var testName in builderTestResults) {
-        if (!flakyTests[testIndex++])
-            continue;
-
-        var testResults = builderTestResults[testName].results;
-        for (var i = 0, rleResult, currentBuildIndex = 0; (rleResult = testResults[i]) && currentBuildIndex < buildCount; i++) {
-            var count = rleResult[RLE.LENGTH];
-            var value = rleResult[RLE.VALUE];
-
-            for (var j = 0; j < count; j++) {
-                var buildTestResults = flakyDeltasByBuild[currentBuildIndex++];
-                function addFlakyDelta(key)
-                {
-                    if (!(key in buildTestResults))
-                        buildTestResults[key] = 0;
-                    buildTestResults[key]++;
-                }
-                addFlakyDelta(value);
-                if (value != 'P' && value != 'N')
-                    addFlakyDelta('total');
-                if (currentBuildIndex == buildCount)
-                    break;
-            }
-        }
-    }
-
-    return {
-        testNames: testNames,
-        resultsByBuild: resultsByBuild,
-        flakyTests: flakyTests,
-        flakyDeltasByBuild: flakyDeltasByBuild
-    };
-}
-
-document.addEventListener('mousedown', function(e) {
-    // Clear the open popup, unless the click was inside the popup.
-    var popup = $('popup');
-    if (popup && e.target != popup && !(popup.compareDocumentPosition(e.target) & 16))
-        hidePopup();
-}, false);
-
-window.addEventListener('load', function() {
-    // This doesn't seem totally accurate as there is a race between
-    // onload firing and the last script tag being executed.
-    logTime('Time to load JS', g_pageLoadStartTime);
-    g_resourceLoader = new loader.Loader();
-    g_resourceLoader.load();
-}, false);
+    return g_history.isLayoutTestResults() ? LAYOUT_TEST_EXPECTATIONS_MAP_ : GTEST_EXPECTATIONS_MAP_;
+}
\ No newline at end of file
diff --git a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.html b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.html
index 625d423..725bcc8 100644
--- a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.html
+++ b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.html
@@ -32,5 +32,8 @@
 <link rel="stylesheet" href="flakiness_dashboard_tests.css"></link>
 <script src="builders.js"></script>
 <script src="loader.js"></script>
+<script src="string.js"></script>
+<script src="history.js"></script>
 <script src="dashboard_base.js"></script>
+<script src="ui.js"></script>
 <script src="flakiness_dashboard.js"></script>
diff --git a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js
index 7589e34..510ecd5 100644
--- a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js
+++ b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js
@@ -134,28 +134,29 @@
     'platform/chromium/virtual/gpu/canvas/philip': 'canvas/philip'
 };
 
+var resourceLoader;
+
 //////////////////////////////////////////////////////////////////////////////
 // Methods and objects from dashboard_base.js to override.
 //////////////////////////////////////////////////////////////////////////////
 function generatePage()
 {
-    if (g_crossDashboardState.useTestData)
+    if (g_history.crossDashboardState.useTestData)
         return;
 
-    updateDefaultBuilderState();
     document.body.innerHTML = '<div id="loading-ui">LOADING...</div>';
-    showErrors();
+    resourceLoader.showErrors();
 
     // tests expands to all tests that match the CSV list.
     // result expands to all tests that ever have the given result
-    if (g_currentState.tests || g_currentState.result)
+    if (g_history.dashboardSpecificState.tests || g_history.dashboardSpecificState.result)
         generatePageForIndividualTests(individualTests());
-    else if (g_currentState.expectationsUpdate)
+    else if (g_history.dashboardSpecificState.expectationsUpdate)
         generatePageForExpectationsUpdate();
     else
-        generatePageForBuilder(g_currentState.builder);
+        generatePageForBuilder(g_history.dashboardSpecificState.builder || currentBuilderGroup().defaultBuilder());
 
-    for (var builder in g_builders)
+    for (var builder in currentBuilders())
         processTestResultsForBuilderAsync(builder);
 
     postHeightChangedMessage();
@@ -165,15 +166,15 @@
 {
     switch(key) {
     case 'tests':
-        validateParameter(g_currentState, key, value,
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
             function() {
-                return isValidName(value);
+                return string.isValidName(value);
             });
         return true;
 
     case 'result':
         value = value.toUpperCase();
-        validateParameter(g_currentState, key, value,
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
             function() {
                 for (var result in LAYOUT_TEST_EXPECTATIONS_MAP_) {
                     if (value == LAYOUT_TEST_EXPECTATIONS_MAP_[result])
@@ -184,17 +185,18 @@
         return true;
 
     case 'builder':
-        validateParameter(g_currentState, key, value,
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
             function() {
-                return value in g_builders;
+                return value in currentBuilders();
             });
+
         return true;
 
     case 'sortColumn':
-        validateParameter(g_currentState, key, value,
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
             function() {
                 // Get all possible headers since the actual used set of headers
-                // depends on the values in g_currentState, which are currently being set.
+                // depends on the values in g_history.dashboardSpecificState, which are currently being set.
                 var headers = tableHeaders(true);
                 for (var i = 0; i < headers.length; i++) {
                     if (value == sortColumnFromTableHeader(headers[i]))
@@ -205,7 +207,7 @@
         return true;
 
     case 'sortOrder':
-        validateParameter(g_currentState, key, value,
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
             function() {
                 return value == FORWARD || value == BACKWARD;
             });
@@ -214,7 +216,7 @@
     case 'resultsHeight':
     case 'updateIndex':
     case 'revision':
-        validateParameter(g_currentState, key, Number(value),
+        history.validateParameter(g_history.dashboardSpecificState, key, Number(value),
             function() {
                 return value.match(/^\d+$/);
             });
@@ -232,7 +234,7 @@
     case 'showUnexpectedPasses':
     case 'showWontFixSkip':
     case 'expectationsUpdate':
-        g_currentState[key] = value == 'true';
+        g_history.dashboardSpecificState[key] = value == 'true';
         return true;
 
     default:
@@ -248,18 +250,25 @@
     showLargeExpectations: false,
     legacyExpectationsSemantics: true,
     showChrome: true,
-    showCorrectExpectations: !isLayoutTestResults(),
-    showWrongExpectations: !isLayoutTestResults(),
-    showWontFixSkip: !isLayoutTestResults(),
-    showSlow: !isLayoutTestResults(),
-    showSkipped: !isLayoutTestResults(),
-    showUnexpectedPasses: !isLayoutTestResults(),
+    showCorrectExpectations: !g_history.isLayoutTestResults(),
+    showWrongExpectations: !g_history.isLayoutTestResults(),
+    showWontFixSkip: !g_history.isLayoutTestResults(),
+    showSlow: !g_history.isLayoutTestResults(),
+    showSkipped: !g_history.isLayoutTestResults(),
+    showUnexpectedPasses: !g_history.isLayoutTestResults(),
     expectationsUpdate: false,
     updateIndex: 0,
     resultsHeight: 300,
     revision: null,
     tests: '',
     result: '',
+    builder: null
+};
+
+DB_SPECIFIC_INVALIDATING_PARAMETERS = {
+    'tests' : 'builder',
+    'testType': 'builder',
+    'group': 'builder'
 };
 
 //////////////////////////////////////////////////////////////////////////////
@@ -325,56 +334,56 @@
 function matchingElement(stringToMatch, elementsMap)
 {
     for (var element in elementsMap) {
-        if (stringContains(stringToMatch, elementsMap[element]))
+        if (string.contains(stringToMatch, elementsMap[element]))
             return element;
     }
 }
 
 function determineWKPlatform(builderName, basePlatform)
 {
-    var isWK2Builder = stringContains(builderName, 'WK2') || stringContains(builderName, 'WEBKIT2');
+    var isWK2Builder = string.contains(builderName, 'WK2') || string.contains(builderName, 'WEBKIT2');
     return basePlatform + (isWK2Builder ? '_WK2' : '_WK1');
 }
 
 function nonChromiumPlatform(builderNameUpperCase)
 {
-    if (stringContains(builderNameUpperCase, 'WINDOWS 7'))
+    if (string.contains(builderNameUpperCase, 'WINDOWS 7'))
         return 'APPLE_WIN_WIN7';
-    if (stringContains(builderNameUpperCase, 'WINDOWS XP'))
+    if (string.contains(builderNameUpperCase, 'WINDOWS XP'))
         return 'APPLE_WIN_XP';
-    if (stringContains(builderNameUpperCase, 'QT LINUX'))
+    if (string.contains(builderNameUpperCase, 'QT LINUX'))
         return 'QT_LINUX';
 
-    if (stringContains(builderNameUpperCase, 'LION'))
+    if (string.contains(builderNameUpperCase, 'LION'))
         return determineWKPlatform(builderNameUpperCase, 'APPLE_MAC_LION');
-    if (stringContains(builderNameUpperCase, 'SNOWLEOPARD'))
+    if (string.contains(builderNameUpperCase, 'SNOWLEOPARD'))
         return determineWKPlatform(builderNameUpperCase, 'APPLE_MAC_SNOWLEOPARD');
-    if (stringContains(builderNameUpperCase, 'GTK LINUX'))
+    if (string.contains(builderNameUpperCase, 'GTK LINUX'))
         return determineWKPlatform(builderNameUpperCase, 'GTK_LINUX');
-    if (stringContains(builderNameUpperCase, 'EFL'))
+    if (string.contains(builderNameUpperCase, 'EFL'))
         return determineWKPlatform(builderNameUpperCase, 'EFL_LINUX');
 }
 
 function chromiumPlatform(builderNameUpperCase)
 {
-    if (stringContains(builderNameUpperCase, 'MAC')) {
-        if (stringContains(builderNameUpperCase, '10.7'))
+    if (string.contains(builderNameUpperCase, 'MAC')) {
+        if (string.contains(builderNameUpperCase, '10.7'))
             return 'CHROMIUM_LION';
         // The webkit.org 'Chromium Mac Release (Tests)' bot runs SnowLeopard.
         return 'CHROMIUM_SNOWLEOPARD';
     }
-    if (stringContains(builderNameUpperCase, 'WIN7'))
+    if (string.contains(builderNameUpperCase, 'WIN7'))
         return 'CHROMIUM_WIN7';
-    if (stringContains(builderNameUpperCase, 'VISTA'))
+    if (string.contains(builderNameUpperCase, 'VISTA'))
         return 'CHROMIUM_VISTA';
-    if (stringContains(builderNameUpperCase, 'WIN') || stringContains(builderNameUpperCase, 'XP'))
+    if (string.contains(builderNameUpperCase, 'WIN') || string.contains(builderNameUpperCase, 'XP'))
         return 'CHROMIUM_XP';
-    if (stringContains(builderNameUpperCase, 'LINUX'))
+    if (string.contains(builderNameUpperCase, 'LINUX'))
         return 'CHROMIUM_LUCID';
-    if (stringContains(builderNameUpperCase, 'ANDROID'))
+    if (string.contains(builderNameUpperCase, 'ANDROID'))
         return 'CHROMIUM_ANDROID';
     // The interactive bot is XP, but doesn't have an OS in it's name.
-    if (stringContains(builderNameUpperCase, 'INTERACTIVE'))
+    if (string.contains(builderNameUpperCase, 'INTERACTIVE'))
         return 'CHROMIUM_XP';
 }
 
@@ -385,7 +394,7 @@
         var builderNameUpperCase = builderName.toUpperCase();
         
         var platform = '';
-        if (isLayoutTestResults() && g_crossDashboardState.group == '@ToT - webkit.org' && !stringContains(builderNameUpperCase, 'CHROMIUM'))
+        if (g_history.isLayoutTestResults() && currentBuilderGroupName() == '@ToT - webkit.org' && !string.contains(builderNameUpperCase, 'CHROMIUM'))
             platform = nonChromiumPlatform(builderNameUpperCase);
         else
             platform = chromiumPlatform(builderNameUpperCase);
@@ -393,7 +402,7 @@
         if (!platform)
             console.error('Could not resolve platform for builder: ' + builderName);
 
-        var buildType = stringContains(builderNameUpperCase, 'DBG') || stringContains(builderNameUpperCase, 'DEBUG') ? 'DEBUG' : 'RELEASE';
+        var buildType = string.contains(builderNameUpperCase, 'DBG') || string.contains(builderNameUpperCase, 'DEBUG') ? 'DEBUG' : 'RELEASE';
         g_perBuilderPlatformAndBuildType[builderName] = {platform: platform, buildType: buildType};
     }
     return g_perBuilderPlatformAndBuildType[builderName];
@@ -479,7 +488,7 @@
 function getAllTestsTrie()
 {
     if (!g_allTestsTrie)
-        g_allTestsTrie = new TestTrie(g_builders, g_resultsByBuilder);
+        g_allTestsTrie = new TestTrie(currentBuilders(), g_resultsByBuilder);
 
     return g_allTestsTrie;
 }
@@ -489,10 +498,10 @@
 // tests in the directory.
 function individualTests()
 {
-    if (g_currentState.result)
-        return allTestsWithResult(g_currentState.result);
+    if (g_history.dashboardSpecificState.result)
+        return allTestsWithResult(g_history.dashboardSpecificState.result);
 
-    if (!g_currentState.tests)
+    if (!g_history.dashboardSpecificState.tests)
         return [];
 
     return individualTestsForSubstringList();
@@ -501,11 +510,11 @@
 function substringList()
 {
     // Convert windows slashes to unix slashes.
-    var tests = g_currentState.tests.replace(/\\/g, '/');
-    var separator = stringContains(tests, ' ') ? ' ' : ',';
+    var tests = g_history.dashboardSpecificState.tests.replace(/\\/g, '/');
+    var separator = string.contains(tests, ' ') ? ' ' : ',';
     var testList = tests.split(separator);
 
-    if (isLayoutTestResults())
+    if (g_history.isLayoutTestResults())
         return testList;
 
     var testListWithoutModifiers = [];
@@ -534,7 +543,7 @@
 
         var hasAnyMatches = false;
         getAllTestsTrie().forEach(function(triePath) {
-            if (caseInsensitiveContains(triePath, path)) {
+            if (string.caseInsensitiveContains(triePath, path)) {
                 testsMap[triePath] = 1;
                 hasAnyMatches = true;
             }
@@ -610,7 +619,7 @@
 {
     if (!g_allTestsByPlatformAndBuildType[platform][buildType]) {
         var tests = {};
-        for (var thisBuilder in g_builders) {
+        for (var thisBuilder in currentBuilders()) {
             var thisBuilderBuildInfo = platformAndBuildType(thisBuilder);
             if (thisBuilderBuildInfo.buildType == buildType && thisBuilderBuildInfo.platform == platform) {
                 addTestsForBuilder(thisBuilder, tests);
@@ -642,7 +651,7 @@
         return {bugs: '', modifiers: modifiers};
     for (var j = 0; j < bugs.length; j++)
         modifiers = modifiers.replace(bugs[j], '');
-    return {bugs: bugs.join(' '), modifiers: collapseWhitespace(trimString(modifiers))};
+    return {bugs: bugs.join(' '), modifiers: string.collapseWhitespace(string.trimString(modifiers))};
 }
 
 function populateExpectationsData(resultsObject)
@@ -656,7 +665,7 @@
     var filteredModifiers = filterBugs(expectations.modifiers);
     resultsObject.modifiers = filteredModifiers.modifiers;
     resultsObject.bugs = filteredModifiers.bugs;
-    resultsObject.isWontFixSkip = stringContains(expectations.modifiers, 'WONTFIX') || stringContains(expectations.modifiers, 'SKIP'); 
+    resultsObject.isWontFixSkip = string.contains(expectations.modifiers, 'WONTFIX') || string.contains(expectations.modifiers, 'SKIP'); 
 }
 
 function platformObjectForName(platformName)
@@ -685,8 +694,8 @@
     var expectations = [];
     var lines = data.split('\n');
     lines.forEach(function(line) {
-        line = trimString(line);
-        if (!line || startsWith(line, '#'))
+        line = string.trimString(line);
+        if (!line || string.startsWith(line, '#'))
             return;
 
         // This code mimics _tokenize_line_using_new_format() in
@@ -895,8 +904,8 @@
 
         // Test has expectations, but no result in the builders results.
         // This means it's either SKIP or passes on all builds.
-        if (!allTestsForPlatformAndBuildType[test] && !stringContains(expectations.modifiers, 'WONTFIX')) {
-            if (stringContains(expectations.modifiers, 'SKIP'))
+        if (!allTestsForPlatformAndBuildType[test] && !string.contains(expectations.modifiers, 'WONTFIX')) {
+            if (string.contains(expectations.modifiers, 'SKIP'))
                 skipped.push(test);
             else if (!expectations.expectations.match(/^\s*PASS\s*$/)) {
                 // Don't show tests expected to always pass. This is used in ways like
@@ -919,7 +928,7 @@
 
 function processTestRunsForAllBuilders()
 {
-    for (var builder in g_builders)
+    for (var builder in currentBuilders())
         processTestRunsForBuilder(builder);
 }
 
@@ -935,8 +944,7 @@
     }
 
     processExpectations();
-    var start = Date.now();
-
+   
     var buildInfo = platformAndBuildType(builderName);
     var platform = buildInfo.platform;
     var buildType = buildInfo.buildType;
@@ -989,7 +997,6 @@
     }
 
     g_perBuilderFailures[builderName] = failures;
-    logTime('processTestRunsForBuilder: ' + builderName, start);
 }
 
 function processMissingAndExtraExpectations(resultsForTest)
@@ -1048,14 +1055,14 @@
     var missingExpectations = [];
     var extraExpectations = [];
 
-    if (isLayoutTestResults()) {
+    if (g_history.isLayoutTestResults()) {
         var expectationsArray = resultsForTest.expectations ? resultsForTest.expectations.split(' ') : [];
         extraExpectations = expectationsArray.filter(
             function(element) {
                 // FIXME: Once all the FAIL lines are removed from
                 // TestExpectations, delete all the legacyExpectationsSemantics
                 // code.
-                if (g_currentState.legacyExpectationsSemantics) {
+                if (g_history.dashboardSpecificState.legacyExpectationsSemantics) {
                     if (element == 'FAIL') {
                         for (var i = 0; i < FAIL_RESULTS.length; i++) {
                             if (resultsMap[FAIL_RESULTS[i]])
@@ -1065,7 +1072,7 @@
                     }
                 }
 
-                return element && !resultsMap[element] && !stringContains(element, 'BUG');
+                return element && !resultsMap[element] && !string.contains(element, 'BUG');
             });
 
         for (var result in resultsMap) {
@@ -1076,7 +1083,7 @@
                 // FIXME: Once all the FAIL lines are removed from
                 // TestExpectations, delete all the legacyExpectationsSemantics
                 // code.
-                if (g_currentState.legacyExpectationsSemantics) {
+                if (g_history.dashboardSpecificState.legacyExpectationsSemantics) {
                     if (expectation == 'FAIL') {
                         for (var j = 0; j < FAIL_RESULTS.length; j++) {
                             if (result == FAIL_RESULTS[j]) {
@@ -1105,9 +1112,9 @@
         // hundred runs. It's not worth the manual maintenance effort.
         // Also, if a test times out, then it should not be marked as slow.
         var minTimeForNeedsSlow = isDebug(resultsForTest.builder) ? 2 : 1;
-        if (isSlowTest(resultsForTest) && !resultsMap['TIMEOUT'] && (!resultsForTest.modifiers || !stringContains(resultsForTest.modifiers, 'SLOW')))
+        if (isSlowTest(resultsForTest) && !resultsMap['TIMEOUT'] && (!resultsForTest.modifiers || !string.contains(resultsForTest.modifiers, 'SLOW')))
             missingExpectations.push('SLOW');
-        else if (isFastTest(resultsForTest) && resultsForTest.modifiers && stringContains(resultsForTest.modifiers, 'SLOW'))
+        else if (isFastTest(resultsForTest) && resultsForTest.modifiers && string.contains(resultsForTest.modifiers, 'SLOW'))
             extraExpectations.push('SLOW');
 
         // If there are no missing results or modifiers besides build
@@ -1148,7 +1155,7 @@
     return '<a href="' + url + '" target="_blank">' + text + '</a>';
 }
 
-// FIXME: replaced with chromiumRevisionLink/webKitRevisionLink
+// FIXME: replaced with ui.html.chromiumRevisionLink/ui.html.webKitRevisionLink
 function createBlameListHTML(revisions, index, urlBase, separator, repo)
 {
     var thisRevision = revisions[index];
@@ -1199,7 +1206,7 @@
 // Returns the path to the failure log for this non-webkit test.
 function pathToFailureLog(testName)
 {
-    return '/steps/' + g_crossDashboardState.testType + '/logs/' + testName.split('.')[1]
+    return '/steps/' + g_history.crossDashboardState.testType + '/logs/' + testName.split('.')[1]
 }
 
 function showPopupForBuild(e, builder, index, opt_testName)
@@ -1223,9 +1230,9 @@
             'WebKit') +
         '</li>';
 
-    if (master == WEBKIT_BUILDER_MASTER) {
+    if (master.name == WEBKIT_BUILDER_MASTER) {
         var revision = g_resultsByBuilder[builder].webkitRevision[index];
-        html += '<li><span class=link onclick="setQueryParameter(\'revision\',' +
+        html += '<li><span class=link onclick="g_history.setQueryParameter(\'revision\',' +
             revision + ')">Show results for WebKit r' + revision +
             '</span></li>';
     } else {
@@ -1235,17 +1242,17 @@
             '</li>';
 
         var chromeRevision = g_resultsByBuilder[builder].chromeRevision[index];
-        if (chromeRevision && isLayoutTestResults()) {
-            html += '<li><a href="' + TEST_RESULTS_BASE_PATH + g_builders[builder] +
+        if (chromeRevision && g_history.isLayoutTestResults()) {
+            html += '<li><a href="' + TEST_RESULTS_BASE_PATH + currentBuilders()[builder] +
                 '/' + chromeRevision + '/layout-test-results.zip">layout-test-results.zip</a></li>';
         }
     }
 
-    if (!isLayoutTestResults() && opt_testName && isFailure(builder, opt_testName, index))
+    if (!g_history.isLayoutTestResults() && opt_testName && isFailure(builder, opt_testName, index))
         html += '<li>' + linkHTMLToOpenWindow(buildBasePath + pathToFailureLog(opt_testName), 'Failure log') + '</li>';
 
     html += '</ul>';
-    showPopup(e.target, html);
+    ui.popup.show(e.target, html);
 }
 
 function htmlForTestResults(test)
@@ -1291,7 +1298,7 @@
         var extraClassNames = '';
         var webkitRevision = g_resultsByBuilder[builder].webkitRevision;
         var isWebkitMerge = webkitRevision[i + 1] && webkitRevision[i] != webkitRevision[i + 1];
-        if (isWebkitMerge && master != WEBKIT_BUILDER_MASTER)
+        if (isWebkitMerge && master.name != WEBKIT_BUILDER_MASTER)
             extraClassNames += ' merge';
 
         html += '<td title="' + (resultString || 'NO DATA') + '. Click for more info." class="results ' + currentResult +
@@ -1312,23 +1319,23 @@
     if (tests.length || skippedPaths.length) {
         var buildInfo = platformAndBuildType(builder);
         html += '<h2 style="display:inline-block">Expectations for ' + buildInfo.platform + '-' + buildInfo.buildType + '</h2> ';
-        if (!g_currentState.showUnexpectedPasses && tests.length)
+        if (!g_history.dashboardSpecificState.showUnexpectedPasses && tests.length)
             html += showUnexpectedPassesLink;
         html += ' ';
-        if (!g_currentState.showSkipped && skippedPaths.length)
+        if (!g_history.dashboardSpecificState.showSkipped && skippedPaths.length)
             html += showSkippedLink;
     }
 
     var open = '<div onclick="selectContents(this)">';
 
-    if (g_currentState.showUnexpectedPasses && tests.length) {
+    if (g_history.dashboardSpecificState.showUnexpectedPasses && tests.length) {
         html += '<div id="passing-tests">' + showUnexpectedPassesLink;
         for (var i = 0; i < tests.length; i++)
             html += open + tests[i].test + '</div>';
         html += '</div>';
     }
 
-    if (g_currentState.showSkipped && skippedPaths.length)
+    if (g_history.dashboardSpecificState.showSkipped && skippedPaths.length)
         html += '<div id="skipped-tests">' + showSkippedLink + open + skippedPaths.join('</div>' + open) + '</div></div>';
     return html + '<br>';
 }
@@ -1337,18 +1344,18 @@
 function shouldHideTest(testResult)
 {
     if (testResult.isWontFixSkip)
-        return !g_currentState.showWontFixSkip;
+        return !g_history.dashboardSpecificState.showWontFixSkip;
 
     if (testResult.isFlaky)
-        return !g_currentState.showFlaky;
+        return !g_history.dashboardSpecificState.showFlaky;
 
     if (isSlowTest(testResult))
-        return !g_currentState.showSlow;
+        return !g_history.dashboardSpecificState.showSlow;
 
     if (testResult.meetsExpectations)
-        return !g_currentState.showCorrectExpectations;
+        return !g_history.dashboardSpecificState.showCorrectExpectations;
 
-    return !g_currentState.showWrongExpectations;
+    return !g_history.dashboardSpecificState.showWrongExpectations;
 }
 
 // Sets the browser's selection to the element's contents.
@@ -1372,7 +1379,7 @@
 
 function isCrossBuilderView()
 {
-    return g_currentState.tests || g_currentState.result || g_currentState.expectationsUpdate;
+    return g_history.dashboardSpecificState.tests || g_history.dashboardSpecificState.result || g_history.dashboardSpecificState.expectationsUpdate;
 }
 
 function tableHeaders(opt_getAll)
@@ -1384,7 +1391,7 @@
     if (!isCrossBuilderView() || opt_getAll)
         headers.push('test');
 
-    if (isLayoutTestResults() || opt_getAll)
+    if (g_history.isLayoutTestResults() || opt_getAll)
         headers.push('bugs', 'modifiers', 'expectations');
 
     headers.push('slowest run', 'flakiness (numbers are runtimes in seconds)');
@@ -1405,23 +1412,23 @@
     var html = '';
     for (var i = 0; i < headers.length; i++) {
         var header = headers[i];
-        if (startsWith(header, 'test') || startsWith(header, 'builder')) {
+        if (string.startsWith(header, 'test') || string.startsWith(header, 'builder')) {
             // If isCrossBuilderView() is true, we're just viewing a single test
             // with results for many builders, so the first column is builder names
             // instead of test paths.
             var testCellClassName = 'test-link' + (isCrossBuilderView() ? ' builder-name' : '');
-            var testCellHTML = isCrossBuilderView() ? test.builder : '<span class="link" onclick="setQueryParameter(\'tests\',\'' + test.test +'\');">' + test.test + '</span>';
+            var testCellHTML = isCrossBuilderView() ? test.builder : '<span class="link" onclick="g_history.setQueryParameter(\'tests\',\'' + test.test +'\');">' + test.test + '</span>';
 
             html += '<tr><td class="' + testCellClassName + '">' + testCellHTML;
-        } else if (startsWith(header, 'bugs'))
+        } else if (string.startsWith(header, 'bugs'))
             html += '<td class=options-container>' + (test.bugs ? htmlForBugs(test.bugs) : createBugHTML(test));
-        else if (startsWith(header, 'modifiers'))
+        else if (string.startsWith(header, 'modifiers'))
             html += '<td class=options-container>' + test.modifiers;
-        else if (startsWith(header, 'expectations'))
+        else if (string.startsWith(header, 'expectations'))
             html += '<td class=options-container>' + test.expectations;
-        else if (startsWith(header, 'slowest'))
+        else if (string.startsWith(header, 'slowest'))
             html += '<td>' + (test.slowestTime ? test.slowestTime + 's' : '');
-        else if (startsWith(header, 'flakiness'))
+        else if (string.startsWith(header, 'flakiness'))
             html += htmlForTestResults(test);
     }
     return html;
@@ -1436,8 +1443,8 @@
 {
     // Use the first word of the header title as the sortkey
     var thisSortValue = sortColumnFromTableHeader(headerName);
-    var arrowHTML = thisSortValue == g_currentState.sortColumn ?
-        '<span class=' + g_currentState.sortOrder + '>' + (g_currentState.sortOrder == FORWARD ? '&uarr;' : '&darr;' ) + '</span>' : '';
+    var arrowHTML = thisSortValue == g_history.dashboardSpecificState.sortColumn ?
+        '<span class=' + g_history.dashboardSpecificState.sortOrder + '>' + (g_history.dashboardSpecificState.sortOrder == FORWARD ? '&uarr;' : '&darr;' ) + '</span>' : '';
     return '<th sortValue=' + thisSortValue +
         // Extend last th through all the rest of the columns.
         (opt_fillColSpan ? ' colspan=10000' : '') +
@@ -1462,13 +1469,11 @@
 
 function appendHTML(html)
 {
-    var startTime = Date.now();
     // InnerHTML to a div that's not in the document. This is
     // ~300ms faster in Safari 4 and Chrome 4 on mac.
     var div = document.createElement('div');
     div.innerHTML = html;
     document.body.appendChild(div);
-    logTime('Time to innerHTML', startTime);
     postHeightChangedMessage();
 }
 
@@ -1515,12 +1520,12 @@
 
     var sort = 'sortColumn';
     var orderKey = 'sortOrder';
-    if (sortValue == g_currentState[sort] && g_currentState[orderKey] == FORWARD)
+    if (sortValue == g_history.dashboardSpecificState[sort] && g_history.dashboardSpecificState[orderKey] == FORWARD)
         order = BACKWARD;
     else
         order = FORWARD;
 
-    setQueryParameter(sort, sortValue, orderKey, order);
+    g_history.setQueryParameter(sort, sortValue, orderKey, order);
 }
 
 function sortTests(tests, column, order)
@@ -1575,7 +1580,7 @@
 {
     var modifiers = modifierString.split(' ');;
     return modifiers.filter(function(modifier) {
-        if (modifier in BUILD_TYPES || startsWith(modifier, 'BUG'))
+        if (modifier in BUILD_TYPES || string.startsWith(modifier, 'BUG'))
             return false;
 
         var matchesPlatformOrUnion = false;
@@ -1604,8 +1609,8 @@
 function generatePageForExpectationsUpdate()
 {
     // Always show all runs when auto-updating expectations.
-    if (!g_crossDashboardState.showAllRuns)
-        setQueryParameter('showAllRuns', true);
+    if (!g_history.crossDashboardState.showAllRuns)
+        g_history.setQueryParameter('showAllRuns', true);
 
     processTestRunsForAllBuilders();
     var testsNeedingUpdate = {};
@@ -1626,7 +1631,7 @@
         }
     }
 
-    for (var builder in g_builders) {
+    for (var builder in currentBuilders()) {
         var tests = g_perBuilderWithExpectationsButNoFailures[builder]
         for (var i = 0; i < tests.length; i++) {
             // Anything extra in this case is what is listed in expectations
@@ -1651,13 +1656,13 @@
 // @param {Array.<string>} keys Keys into the testNeedingUpdate object.
 function showUpdateInfoForTest(testsNeedingUpdate, keys)
 {
-    var test = keys[g_currentState.updateIndex];
+    var test = keys[g_history.dashboardSpecificState.updateIndex];
     document.body.innerHTML = '';
 
     // FIXME: Make this DOM creation less verbose.
     var index = document.createElement('div');
     index.style.cssFloat = 'right';
-    index.textContent = (g_currentState.updateIndex + 1) + ' of ' + keys.length + ' tests';
+    index.textContent = (g_history.dashboardSpecificState.updateIndex + 1) + ' of ' + keys.length + ' tests';
     document.body.appendChild(index);
 
     var buttonRegion = document.createElement('div');
@@ -1672,7 +1677,7 @@
     previousBtn.value = 'previous';
     previousBtn.addEventListener('click',
         function() {
-          setUpdateIndex(g_currentState.updateIndex - 1, testsNeedingUpdate, keys);
+          setUpdateIndex(g_history.dashboardSpecificState.updateIndex - 1, testsNeedingUpdate, keys);
         },
         false);
     buttonRegion.appendChild(previousBtn);
@@ -1734,7 +1739,7 @@
 // @param {Array.<string>} keys Keys into the testNeedingUpdate object.
 function handleUpdate(testsNeedingUpdate, keys)
 {
-    var test = keys[g_currentState.updateIndex];
+    var test = keys[g_history.dashboardSpecificState.updateIndex];
     var updates = testsNeedingUpdate[test];
     for (var builder in updates) {
         // Add included tests, and delete excluded tests if
@@ -1758,7 +1763,7 @@
 // @param {Array.<string>} keys Keys into the testNeedingUpdate object.
 function nextUpdate(testsNeedingUpdate, keys)
 {
-    setUpdateIndex(g_currentState.updateIndex + 1, testsNeedingUpdate, keys);
+    setUpdateIndex(g_history.dashboardSpecificState.updateIndex + 1, testsNeedingUpdate, keys);
 }
 
 
@@ -1773,7 +1778,7 @@
         newIndex = keys.length - 1;
     else if (newIndex == keys.length)
         newIndex = 0;
-    setQueryParameter("updateIndex", newIndex);
+    g_history.setQueryParameter("updateIndex", newIndex);
     showUpdateInfoForTest(testsNeedingUpdate, keys);
 }
 
@@ -1793,7 +1798,7 @@
     }
 
     var skippedBuilders = []
-    for (builder in currentBuilderGroup().builders) {
+    for (builder in currentBuilders()) {
         if (shownBuilders.indexOf(builder) == -1)
             skippedBuilders.push(builder);
     }
@@ -1818,12 +1823,12 @@
     html += '<div class=expectations test=' + test + '><div>' +
         linkHTMLToToggleState('showExpectations', 'results')
 
-    if (isLayoutTestResults() || isGPUTestResults()) {
-        if (isLayoutTestResults())
+    if (g_history.isLayoutTestResults() || g_history.isGPUTestResults()) {
+        if (g_history.isLayoutTestResults())
             html += ' | ' + linkHTMLToToggleState('showLargeExpectations', 'large thumbnails');
-        if (testResults && builderMaster(testResults[0].builder) == WEBKIT_BUILDER_MASTER) {
-            var revision = g_currentState.revision || '';
-            html += '<form onsubmit="setQueryParameter(\'revision\', revision.value);' +
+        if (testResults && currentBuilderGroup().master().name == WEBKIT_BUILDER_MASTER) {
+            var revision = g_history.dashboardSpecificState.revision || '';
+            html += '<form onsubmit="g_history.setQueryParameter(\'revision\', revision.value);' +
                 'return false;">Show results for WebKit revision: ' +
                 '<input name=revision placeholder="e.g. 65540" value="' + revision +
                 '" id=revision-input></form>';
@@ -1831,8 +1836,8 @@
             html += ' | <b>Only shows actual results/diffs from the most recent *failure* on each bot.</b>';
     } else {
       html += ' | <span>Results height:<input ' +
-          'onchange="setQueryParameter(\'resultsHeight\',this.value)" value="' +
-          g_currentState.resultsHeight + '" style="width:2.5em">px</span>';
+          'onchange="g_history.setQueryParameter(\'resultsHeight\',this.value)" value="' +
+          g_history.dashboardSpecificState.resultsHeight + '" style="width:2.5em">px</span>';
     }
     html += '</div></div>';
     return html;
@@ -1922,21 +1927,21 @@
         childContainer.appendChild(expectationsTitle(platformPart + suitePart, path, opt_builder));
         childContainer.className = 'expectations-item';
         item.className = 'expectation ' + fileExtension;
-        if (g_currentState.showLargeExpectations)
+        if (g_history.dashboardSpecificState.showLargeExpectations)
             item.className += ' large';
         childContainer.appendChild(item);
         handleFinishedLoadingExpectations(container);
     };
 
     var url = base + platformPart + path;
-    if (isImage || !startsWith(base, 'http://svn.webkit.org')) {
+    if (isImage || !string.startsWith(base, 'http://svn.webkit.org')) {
         var dummyNode = document.createElement(isImage ? 'img' : 'script');
         dummyNode.src = url;
         dummyNode.onload = function() {
             var item;
             if (isImage) {
                 item = dummyNode;
-                if (startsWith(base, 'http://svn.webkit.org'))
+                if (string.startsWith(base, 'http://svn.webkit.org'))
                     maybeAddPngChecksum(item, url);
             } else {
                 item = document.createElement('iframe');
@@ -2030,11 +2035,11 @@
         platforms['WIN'] = {};
         platforms['LINUX'] = {};
         allPlatforms.forEach(function(platform) {
-            if (startsWith(platform, 'MAC'))
+            if (string.startsWith(platform, 'MAC'))
                 platforms['MAC'][platform] = 1;
-            else if (startsWith(platform, 'WIN'))
+            else if (string.startsWith(platform, 'WIN'))
                 platforms['WIN'][platform] = 1;
-            else if (startsWith(platform, 'LINUX'))
+            else if (string.startsWith(platform, 'LINUX'))
                 platforms['LINUX'][platform] = 1;
         });
 
@@ -2048,7 +2053,7 @@
                 var nodesToRemove = [];
                 for (var j = 0, usedPlatformsLength = usedPlatforms.length; j < usedPlatformsLength; j++) {
                     var usedPlatform = usedPlatforms[j];
-                    if (startsWith(usedPlatform.textContent, platform))
+                    if (string.startsWith(usedPlatform.textContent, platform))
                         nodesToRemove.push(usedPlatform);
                 }
 
@@ -2077,11 +2082,11 @@
     var innerHTML;
     if (builder) {
         var resultsType;
-        if (endsWith(path, '-crash-log.txt'))
+        if (string.endsWith(path, '-crash-log.txt'))
             resultsType = 'STACKTRACE';
-        else if (endsWith(path, '-actual.txt') || endsWith(path, '-actual.png'))
+        else if (string.endsWith(path, '-actual.txt') || string.endsWith(path, '-actual.png'))
             resultsType = 'ACTUAL RESULTS';
-        else if (endsWith(path, '-wdiff.html'))
+        else if (string.endsWith(path, '-wdiff.html'))
             resultsType = 'WDIFF';
         else
             resultsType = 'DIFF';
@@ -2103,12 +2108,12 @@
 function loadExpectations(expectationsContainer)
 {
     var test = expectationsContainer.getAttribute('test');
-    if (isLayoutTestResults())
+    if (g_history.isLayoutTestResults())
         loadExpectationsLayoutTests(test, expectationsContainer);
     else {
         var results = g_testToResultsMap[test];
         for (var i = 0; i < results.length; i++)
-            if (isGPUTestResults())
+            if (g_history.isGPUTestResults())
                 loadGPUResultsForBuilder(results[i].builder, test, expectationsContainer);
             else
                 loadNonWebKitResultsForBuilder(results[i].builder, test, expectationsContainer);
@@ -2168,7 +2173,7 @@
         var item = document.createElement('iframe');
         item.src = dummyNode.src;
         item.className = itemClassName;
-        item.style.height = g_currentState.resultsHeight + 'px';
+        item.style.height = g_history.dashboardSpecificState.resultsHeight + 'px';
 
         if (opt_title) {
             var childContainer = document.createElement('div');
@@ -2255,9 +2260,9 @@
     var revisionContainer = document.createElement('div');
     revisionContainer.textContent = "Showing results for: "
     expectationsContainer.appendChild(revisionContainer);
-    for (var builder in g_builders) {
-        if (builderMaster(builder) == WEBKIT_BUILDER_MASTER) {
-            var latestRevision = g_currentState.revision || g_resultsByBuilder[builder].webkitRevision[0];
+    for (var builder in currentBuilders()) {
+        if (builderMaster(builder).name == WEBKIT_BUILDER_MASTER) {
+            var latestRevision = g_history.dashboardSpecificState.revision || g_resultsByBuilder[builder].webkitRevision[0];
             var buildInfo = buildInfoForRevision(builder, latestRevision);
             var revisionInfo = document.createElement('div');
             revisionInfo.style.cssText = 'background:lightgray;margin:0 3px;padding:0 2px;display:inline-block;';
@@ -2272,15 +2277,15 @@
     var testWithoutSuffix = test.substring(0, test.lastIndexOf('.'));
     var actualResultSuffixes = ['-actual.txt', '-actual.png', '-crash-log.txt', '-diff.txt', '-wdiff.html', '-diff.png'];
 
-    for (var builder in g_builders) {
+    for (var builder in currentBuilders()) {
         var actualResultsBase;
-        if (builderMaster(builder) == WEBKIT_BUILDER_MASTER) {
-            var latestRevision = g_currentState.revision || g_resultsByBuilder[builder].webkitRevision[0];
+        if (builderMaster(builder).name == WEBKIT_BUILDER_MASTER) {
+            var latestRevision = g_history.dashboardSpecificState.revision || g_resultsByBuilder[builder].webkitRevision[0];
             var buildInfo = buildInfoForRevision(builder, latestRevision);
             actualResultsBase = 'http://build.webkit.org/results/' + builder +
                 '/r' + buildInfo.revisionStart + ' (' + buildInfo.buildNumber + ')/';
         } else
-            actualResultsBase = TEST_RESULTS_BASE_PATH + g_builders[builder] + '/results/layout-test-results/';
+            actualResultsBase = TEST_RESULTS_BASE_PATH + currentBuilders()[builder] + '/results/layout-test-results/';
 
         for (var i = 0; i < actualResultSuffixes.length; i++) {
             addExpectationItem(expectationsContainers, expectationsContainer, null,
@@ -2324,7 +2329,7 @@
 
 function appendExpectations()
 {
-    var expectations = g_currentState.showExpectations ? document.getElementsByClassName('expectations') : [];
+    var expectations = g_history.dashboardSpecificState.showExpectations ? document.getElementsByClassName('expectations') : [];
     // Loading expectations is *very* slow. Use a large timeout to avoid
     // totally hanging the renderer.
     performChunkedAction(expectations, function(chunk) {
@@ -2346,13 +2351,13 @@
 function generatePageForIndividualTests(tests)
 {
     console.log('Number of tests: ' + tests.length);
-    if (g_currentState.showChrome)
+    if (g_history.dashboardSpecificState.showChrome)
         appendHTML(htmlForNavBar());
     performChunkedAction(tests, function(chunk) {
         appendHTML(htmlForIndividualTests(chunk));
     }, appendExpectations, 500);
-    if (g_currentState.showChrome)
-        $('tests-input').value = g_currentState.tests;
+    if (g_history.dashboardSpecificState.showChrome)
+        $('tests-input').value = g_history.dashboardSpecificState.tests;
 }
 
 function performChunkedAction(tests, handleChunk, onComplete, timeout, opt_index) {
@@ -2374,8 +2379,8 @@
     for (var i = 0; i < tests.length; i++) {
         var test = tests[i];
         var testNameHtml = '';
-        if (g_currentState.showChrome || tests.length > 1) {
-            if (isLayoutTestResults()) {
+        if (g_history.dashboardSpecificState.showChrome || tests.length > 1) {
+            if (g_history.isLayoutTestResults()) {
                 var suite = lookupVirtualTestSuite(test);
                 var base = suite ? baseTest(test, suite) : test;
                 var tracURL = TEST_URL_BASE_PATH_TRAC + base;
@@ -2392,13 +2397,13 @@
 function htmlForNavBar()
 {
     var extraHTML = '';
-    var html = htmlForTestTypeSwitcher(false, extraHTML, isCrossBuilderView());
+    var html = ui.html.testTypeSwitcher(false, extraHTML, isCrossBuilderView());
     html += '<div class=forms><form id=result-form ' +
-        'onsubmit="setQueryParameter(\'result\', result.value);' +
+        'onsubmit="g_history.setQueryParameter(\'result\', result.value);' +
         'return false;">Show all tests with result: ' +
         '<input name=result placeholder="e.g. CRASH" id=result-input>' +
         '</form><form id=tests-form ' +
-        'onsubmit="setQueryParameter(\'tests\', tests.value);' +
+        'onsubmit="g_history.setQueryParameter(\'tests\', tests.value);' +
         'return false;"><span>Show tests on all platforms: </span>' +
         '<input name=tests ' +
         'placeholder="Comma or space-separated list of tests or partial ' +
@@ -2410,14 +2415,14 @@
 
 function checkBoxToToggleState(key, text)
 {
-    var stateEnabled = g_currentState[key];
-    return '<label><input type=checkbox ' + (stateEnabled ? 'checked ' : '') + 'onclick="setQueryParameter(\'' + key + '\', ' + !stateEnabled + ')">' + text + '</label> ';
+    var stateEnabled = g_history.dashboardSpecificState[key];
+    return '<label><input type=checkbox ' + (stateEnabled ? 'checked ' : '') + 'onclick="g_history.setQueryParameter(\'' + key + '\', ' + !stateEnabled + ')">' + text + '</label> ';
 }
 
 function linkHTMLToToggleState(key, linkText)
 {
-    var stateEnabled = g_currentState[key];
-    return '<span class=link onclick="setQueryParameter(\'' + key + '\', ' + !stateEnabled + ')">' + (stateEnabled ? 'Hide' : 'Show') + ' ' + linkText + '</span>';
+    var stateEnabled = g_history.dashboardSpecificState[key];
+    return '<span class=link onclick="g_history.setQueryParameter(\'' + key + '\', ' + !stateEnabled + ')">' + (stateEnabled ? 'Hide' : 'Show') + ' ' + linkText + '</span>';
 }
 
 function headerForTestTableHtml()
@@ -2435,7 +2440,7 @@
     processTestRunsForBuilder(builderName);
 
     var results = g_perBuilderFailures[builderName];
-    sortTests(results, g_currentState.sortColumn, g_currentState.sortOrder);
+    sortTests(results, g_history.dashboardSpecificState.sortColumn, g_history.dashboardSpecificState.sortOrder);
 
     var testsHTML = '';
     if (results.length) {
@@ -2445,7 +2450,7 @@
         testsHTML = htmlForTestTable(tableRowsHTML);
     } else {
         testsHTML = '<div>No tests found. ';
-        if (isLayoutTestResults())
+        if (g_history.isLayoutTestResults())
             testsHTML += 'Try showing tests with correct expectations.</div>';
         else
             testsHTML += 'This means no tests have failed!</div>';
@@ -2453,7 +2458,7 @@
 
     var html = htmlForNavBar();
 
-    if (isLayoutTestResults())
+    if (g_history.isLayoutTestResults())
         html += htmlForTestsWithExpectationsButNoFailures(builderName) + headerForTestTableHtml();
 
     html += '<br>' + testsHTML;
@@ -2481,15 +2486,7 @@
 
 function isInvalidKeyForCrossBuilderView(key)
 {
-    return !(key in VALID_KEYS_FOR_CROSS_BUILDER_VIEW) && !(key in g_defaultCrossDashboardStateValues);
-}
-
-function updateDefaultBuilderState()
-{
-    if (isCrossBuilderView())
-        delete g_defaultDashboardSpecificStateValues.builder;
-    else
-        g_defaultDashboardSpecificStateValues.builder = g_defaultBuilderName;
+    return !(key in VALID_KEYS_FOR_CROSS_BUILDER_VIEW) && !(key in history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES);
 }
 
 // Sets the page state to regenerate the page.
@@ -2499,18 +2496,17 @@
     for (key in params) {
         if (key == 'tests') {
             // Entering cross-builder view, only keep valid keys for that view.
-            for (var currentKey in g_currentState) {
+            for (var currentKey in g_history.dashboardSpecificState) {
               if (isInvalidKeyForCrossBuilderView(currentKey)) {
-                delete g_currentState[currentKey];
+                delete g_history.dashboardSpecificState[currentKey];
               }
             }
         } else if (isInvalidKeyForCrossBuilderView(key)) {
-            delete g_currentState.tests;
-            delete g_currentState.result;
+            delete g_history.dashboardSpecificState.tests;
+            delete g_history.dashboardSpecificState.result;
         }
     }
 
-    updateDefaultBuilderState();
     return true;
 }
 
@@ -2549,7 +2545,7 @@
         html += '<div class=' + expectation + '>' + expectationsMap()[expectation] + '</div>';
 
     html += '<div class=merge>WEBKIT MERGE</div>';
-    if (isLayoutTestResults()) {
+    if (g_history.isLayoutTestResults()) {
       html += '</div><br style="clear:both">' +
           '</div><h3>Test expectatons fallback order.</h3>';
 
@@ -2592,7 +2588,7 @@
 }
 
 if (window != parent)
-    window.addEventListener('blur', hidePopup);
+    window.addEventListener('blur', ui.popup.hide);
 
 document.addEventListener('keydown', function(e) {
     if (e.keyIdentifier == 'U+003F' || e.keyIdentifier == 'U+00BF') {
@@ -2602,6 +2598,11 @@
     } else if (e.keyIdentifier == 'U+001B') {
         // escape key
         hideLegend();
-        hidePopup();
+        ui.popup.hide();
     }
 }, false);
+
+window.addEventListener('load', function() {
+    resourceLoader = new loader.Loader(intializeHistory);
+    resourceLoader.load();
+}, false);
diff --git a/Tools/TestResultServer/static-dashboards/flakiness_dashboard_embedded_unittests.js b/Tools/TestResultServer/static-dashboards/flakiness_dashboard_embedded_unittests.js
index 5599b3e..039467a 100644
--- a/Tools/TestResultServer/static-dashboards/flakiness_dashboard_embedded_unittests.js
+++ b/Tools/TestResultServer/static-dashboards/flakiness_dashboard_embedded_unittests.js
@@ -27,7 +27,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 test('hidePopupOnBlur', 2, function() {
-    showPopup(document.body, 'dummy content');
+    ui.popup.show(document.body, 'dummy content');
     ok(document.querySelector('#popup'));
 
     // Cause the window to be blurred.
diff --git a/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js b/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js
index 597c62e..95247d9 100644
--- a/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js
+++ b/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js
@@ -26,30 +26,57 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+// FIXME(jparent): Rename this once it isn't globals.
 function resetGlobals()
 {
     allExpectations = null;
     allTests = null;
     g_expectationsByPlatform = {};
     g_resultsByBuilder = {};
-    g_builders = {};
     g_allExpectations = null;
     g_allTestsTrie = null;
-    g_currentState = {};
-    g_crossDashboardState = {};
-    for (var key in g_defaultCrossDashboardStateValues)
-        g_crossDashboardState[key] = g_defaultCrossDashboardStateValues[key];
+    var historyInstance = new history.History();
+    // FIXME(jparent): Remove this once global isn't used.
+    g_history = historyInstance;
+    g_testToResultsMap = {};
+
+    for (var key in history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES)
+        historyInstance.crossDashboardState[key] = history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES[key];
+
+    LOAD_BUILDBOT_DATA([{
+        name: 'ChromiumWebkit',
+        url: 'dummyurl', 
+        tests: {'layout-tests': {'builders': ['WebKit Linux', 'WebKit Linux (dbg)', 'WebKit Mac10.7', 'WebKit Win', 'WebKit Win (dbg)']}}
+    },
+    {
+        name: 'webkit.org',
+        url: 'dummyurl',
+        tests: {'layout-tests': {'builders': ['Apple SnowLeopard Tests', 'Qt Linux Tests', 'Chromium Mac10.7 Tests', 'GTK Win']}}
+    }]);
+ 
+    for (var group in LAYOUT_TESTS_BUILDER_GROUPS)
+        LAYOUT_TESTS_BUILDER_GROUPS[group] = null;
+
+    return historyInstance;
+}
+
+function stubResultsByBuilder(data)
+{
+    for (var builder in currentBuilders())
+    {
+        g_resultsByBuilder[builder] = data[builder] || {'tests': []};
+    };
 }
 
 function runExpectationsTest(builder, test, expectations, modifiers)
 {
-    g_builders[builder] = true;
-
     // Put in some dummy results. processExpectations expects the test to be
     // there.
     var tests = {};
     tests[test] = {'results': [[100, 'F']], 'times': [[100, 0]]};
-    g_resultsByBuilder[builder] = {'tests': tests};
+    var results = {};
+    results[builder] = {'tests': tests};
+    stubResultsByBuilder(results);
 
     processExpectations();
     var resultsForTest = createResultsObjectForTest(test, builder);
@@ -60,25 +87,10 @@
     equal(resultsForTest.modifiers, modifiers, message);
 }
 
-test('flattenTrie', 1, function() {
-    resetGlobals();
-    var tests = {
-        'bar.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
-        'foo': {
-            'bar': {
-                'baz.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
-            }
-        }
-    };
-    var expectedFlattenedTests = {
-        'bar.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
-        'foo/bar/baz.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
-    };
-    equal(JSON.stringify(flattenTrie(tests)), JSON.stringify(expectedFlattenedTests))
-});
-
 test('releaseFail', 2, function() {
     resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
+
     var builder = 'WebKit Win';
     var test = 'foo/1.html';
     var expectationsArray = [
@@ -90,6 +102,7 @@
 
 test('releaseFailDebugCrashReleaseBuilder', 2, function() {
     resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
     var builder = 'WebKit Win';
     var test = 'foo/1.html';
     var expectationsArray = [
@@ -103,6 +116,7 @@
 
 test('releaseFailDebugCrashDebugBuilder', 2, function() {
     resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
     var builder = 'WebKit Win (dbg)';
     var test = 'foo/1.html';
     var expectationsArray = [
@@ -116,6 +130,7 @@
 
 test('overrideJustBuildType', 12, function() {
     resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
     var test = 'bar/1.html';
     g_expectationsByPlatform['CHROMIUM'] = getParsedExpectations('bar [ WontFix Failure Pass Timeout ]\n' +
         '[ Mac ] ' + test + ' [ WontFix Failure ]\n' +
@@ -130,6 +145,11 @@
 });
 
 test('platformAndBuildType', 78, function() {
+    var historyInstance = new history.History();
+    // FIXME(jparent): Change to use the flakiness_db's history object
+    // once it exists, rather than tracking global.
+    g_history = historyInstance;
+
     var runPlatformAndBuildTypeTest = function(builder, expectedPlatform, expectedBuildType) {
         g_perBuilderPlatformAndBuildType = {};
         buildInfo = platformAndBuildType(builder);
@@ -159,8 +179,8 @@
     runPlatformAndBuildTypeTest('XP Tests', 'CHROMIUM_XP', 'RELEASE');
     runPlatformAndBuildTypeTest('Interactive Tests (dbg)', 'CHROMIUM_XP', 'DEBUG');
     
-    g_crossDashboardState.group = '@ToT - webkit.org';
-    g_crossDashboardState.testType = 'layout-tests';
+    historyInstance.crossDashboardState.group = '@ToT - webkit.org';
+    historyInstance.crossDashboardState.testType = 'layout-tests';
     runPlatformAndBuildTypeTest('Chromium Win Release (Tests)', 'CHROMIUM_XP', 'RELEASE');
     runPlatformAndBuildTypeTest('Chromium Linux Release (Tests)', 'CHROMIUM_LUCID', 'RELEASE');
     runPlatformAndBuildTypeTest('Chromium Mac Release (Tests)', 'CHROMIUM_SNOWLEOPARD', 'RELEASE');
@@ -212,9 +232,10 @@
 
 test('getExpectations', 16, function() {
     resetGlobals();
-    g_builders['WebKit Win'] = true;
-    g_resultsByBuilder = {
-        'WebKit Win': {
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
+ 
+    stubResultsByBuilder({
+        'WebKit Win' : {
             'tests': {
                 'foo/test1.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
                 'foo/test2.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
@@ -222,7 +243,7 @@
                 'test1.html': {'results': [[100, 'F']], 'times': [[100, 0]]}
             }
         }
-    }
+    });
 
     g_expectationsByPlatform['CHROMIUM'] = getParsedExpectations('Bug(123) foo [ Failure Pass Crash ]\n' +
         'Bug(Foo) [ Release ] foo/test1.html [ Failure ]\n' +
@@ -291,34 +312,41 @@
 });
 
 test('substringList', 2, function() {
-    g_crossDashboardState.testType = 'gtest';
-    g_currentState.tests = 'test.FLAKY_foo test.FAILS_foo1 test.DISABLED_foo2 test.MAYBE_foo3 test.foo4';
+    var historyInstance = new history.History();
+    // FIXME(jparent): Remove this once global isn't used.
+    g_history = historyInstance;
+    historyInstance.crossDashboardState.testType = 'gtest';
+    historyInstance.dashboardSpecificState.tests = 'test.FLAKY_foo test.FAILS_foo1 test.DISABLED_foo2 test.MAYBE_foo3 test.foo4';
     equal(substringList().toString(), 'test.foo,test.foo1,test.foo2,test.foo3,test.foo4');
 
-    g_crossDashboardState.testType = 'layout-tests';
-    g_currentState.tests = 'foo/bar.FLAKY_foo.html';
+    historyInstance.crossDashboardState.testType = 'layout-tests';
+    historyInstance.dashboardSpecificState.tests = 'foo/bar.FLAKY_foo.html';
     equal(substringList().toString(), 'foo/bar.FLAKY_foo.html');
 });
 
 test('htmlForTestsWithExpectationsButNoFailures', 4, function() {
+    var historyInstance = new history.History();
+    // FIXME(jparent): Remove this once global isn't used.
+    g_history = historyInstance;
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
     var builder = 'WebKit Win';
     g_perBuilderWithExpectationsButNoFailures[builder] = ['passing-test1.html', 'passing-test2.html'];
     g_perBuilderSkippedPaths[builder] = ['skipped-test1.html'];
     g_resultsByBuilder[builder] = { buildNumbers: [5, 4, 3, 1] };
 
-    g_currentState.showUnexpectedPasses = true;
-    g_currentState.showSkipped = true;
+    historyInstance.dashboardSpecificState.showUnexpectedPasses = true;
+    historyInstance.dashboardSpecificState.showSkipped = true;
 
-    g_crossDashboardState.group = '@ToT - chromium.org';
-    g_crossDashboardState.testType = 'layout-tests';
+    historyInstance.crossDashboardState.group = '@ToT - chromium.org';
+    historyInstance.crossDashboardState.testType = 'layout-tests';
     
     var container = document.createElement('div');
     container.innerHTML = htmlForTestsWithExpectationsButNoFailures(builder);
     equal(container.querySelectorAll('#passing-tests > div').length, 2);
     equal(container.querySelectorAll('#skipped-tests > div').length, 1);
     
-    g_currentState.showUnexpectedPasses = false;
-    g_currentState.showSkipped = false;
+    historyInstance.dashboardSpecificState.showUnexpectedPasses = false;
+    historyInstance.dashboardSpecificState.showSkipped = false;
     
     var container = document.createElement('div');
     container.innerHTML = htmlForTestsWithExpectationsButNoFailures(builder);
@@ -333,17 +361,20 @@
 });
 
 test('htmlForTestTypeSwitcherGroup', 6, function() {
+    var historyInstance = new history.History();
+    // FIXME(jparent): Remove this once global isn't used.
+    g_history = historyInstance;
     var container = document.createElement('div');
-    g_crossDashboardState.testType = 'ui_tests';
-    container.innerHTML = htmlForTestTypeSwitcher(true);
+    historyInstance.crossDashboardState.testType = 'ui_tests';
+    container.innerHTML = ui.html.testTypeSwitcher(true);
     var selects = container.querySelectorAll('select');
     equal(selects.length, 2);
     var group = selects[1];
     equal(group.parentNode.textContent.indexOf('Group:'), 0);
     equal(group.children.length, 3);
 
-    g_crossDashboardState.testType = 'layout-tests';
-    container.innerHTML = htmlForTestTypeSwitcher(true);
+    historyInstance.crossDashboardState.testType = 'layout-tests';
+    container.innerHTML = ui.html.testTypeSwitcher(true);
     var selects = container.querySelectorAll('select');
     equal(selects.length, 2);
     var group = selects[1];
@@ -353,17 +384,19 @@
 
 test('htmlForIndividualTestOnAllBuilders', 1, function() {
     resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
     equal(htmlForIndividualTestOnAllBuilders('foo/nonexistant.html'), '<div class="not-found">Test not found. Either it does not exist, is skipped or passes on all platforms.</div>');
 });
 
 test('htmlForIndividualTestOnAllBuildersWithResultsLinksNonexistant', 1, function() {
     resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
     equal(htmlForIndividualTestOnAllBuildersWithResultsLinks('foo/nonexistant.html'),
         '<div class="not-found">Test not found. Either it does not exist, is skipped or passes on all platforms.</div>' +
         '<div class=expectations test=foo/nonexistant.html>' +
             '<div>' +
-                '<span class=link onclick="setQueryParameter(\'showExpectations\', true)">Show results</span> | ' +
-                '<span class=link onclick="setQueryParameter(\'showLargeExpectations\', true)">Show large thumbnails</span> | ' +
+                '<span class=link onclick="g_history.setQueryParameter(\'showExpectations\', true)">Show results</span> | ' +
+                '<span class=link onclick="g_history.setQueryParameter(\'showLargeExpectations\', true)">Show large thumbnails</span> | ' +
                 '<b>Only shows actual results/diffs from the most recent *failure* on each bot.</b>' +
             '</div>' +
         '</div>');
@@ -371,9 +404,10 @@
 
 test('htmlForIndividualTestOnAllBuildersWithResultsLinks', 1, function() {
     resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
+
+    var builderName = 'WebKit Linux';
     var test = 'dummytest.html';
-    var builderName = 'dummyBuilder';
-    BUILDER_TO_MASTER[builderName] = CHROMIUM_BUILDER_MASTER;
     g_testToResultsMap[test] = [createResultsObjectForTest(test, builderName)];
 
     equal(htmlForIndividualTestOnAllBuildersWithResultsLinks(test),
@@ -389,21 +423,22 @@
         '</table>' +
         '<div>The following builders either don\'t run this test (e.g. it\'s skipped) or all runs passed:</div>' +
         '<div class=skipped-builder-list>' +
-            '<div class=skipped-builder>WebKit Linux</div><div class=skipped-builder>WebKit Linux (dbg)</div>' +
-            '<div class=skipped-builder>WebKit Mac10.7</div><div class=skipped-builder>WebKit Win</div>' +
+            '<div class=skipped-builder>WebKit Linux (dbg)</div><div class=skipped-builder>WebKit Mac10.7</div><div class=skipped-builder>WebKit Win</div><div class=skipped-builder>WebKit Win (dbg)</div>' +
         '</div>' +
         '<div class=expectations test=dummytest.html>' +
-            '<div><span class=link onclick="setQueryParameter(\'showExpectations\', true)">Show results</span> | ' +
-            '<span class=link onclick="setQueryParameter(\'showLargeExpectations\', true)">Show large thumbnails</span> | ' +
+            '<div><span class=link onclick="g_history.setQueryParameter(\'showExpectations\', true)">Show results</span> | ' +
+            '<span class=link onclick="g_history.setQueryParameter(\'showLargeExpectations\', true)">Show large thumbnails</span> | ' +
             '<b>Only shows actual results/diffs from the most recent *failure* on each bot.</b></div>' +
         '</div>');
 });
 
 test('htmlForIndividualTestOnAllBuildersWithResultsLinksWebkitMaster', 1, function() {
-    resetGlobals();
+    var historyInstance = resetGlobals();
+    historyInstance.crossDashboardState.group = '@ToT - webkit.org';
+    loadBuildersList('@ToT - webkit.org', 'layout-tests');
+
+    var builderName = 'Apple SnowLeopard Tests';
     var test = 'dummytest.html';
-    var builderName = 'dummyBuilder';
-    BUILDER_TO_MASTER[builderName] = WEBKIT_BUILDER_MASTER;
     g_testToResultsMap[test] = [createResultsObjectForTest(test, builderName)];
 
     equal(htmlForIndividualTestOnAllBuildersWithResultsLinks(test),
@@ -419,52 +454,52 @@
         '</table>' +
         '<div>The following builders either don\'t run this test (e.g. it\'s skipped) or all runs passed:</div>' +
         '<div class=skipped-builder-list>' +
-            '<div class=skipped-builder>WebKit Linux</div><div class=skipped-builder>WebKit Linux (dbg)</div>' +
-            '<div class=skipped-builder>WebKit Mac10.7</div><div class=skipped-builder>WebKit Win</div>' +
+            '<div class=skipped-builder>Qt Linux Tests</div><div class=skipped-builder>Chromium Mac10.7 Tests</div><div class=skipped-builder>GTK Win</div>' +
         '</div>' +
         '<div class=expectations test=dummytest.html>' +
-            '<div><span class=link onclick="setQueryParameter(\'showExpectations\', true)">Show results</span> | ' +
-            '<span class=link onclick="setQueryParameter(\'showLargeExpectations\', true)">Show large thumbnails</span>' +
-            '<form onsubmit="setQueryParameter(\'revision\', revision.value);return false;">' +
+            '<div><span class=link onclick="g_history.setQueryParameter(\'showExpectations\', true)">Show results</span> | ' +
+            '<span class=link onclick="g_history.setQueryParameter(\'showLargeExpectations\', true)">Show large thumbnails</span>' +
+            '<form onsubmit="g_history.setQueryParameter(\'revision\', revision.value);return false;">' +
                 'Show results for WebKit revision: <input name=revision placeholder="e.g. 65540" value="" id=revision-input>' +
             '</form></div>' +
         '</div>');
 });
 
 test('htmlForIndividualTests', 4, function() {
-    resetGlobals();
+    var historyInstance = resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
     var test1 = 'foo/nonexistant.html';
     var test2 = 'bar/nonexistant.html';
 
-    g_currentState.showChrome = false;
+    historyInstance.dashboardSpecificState.showChrome = false;
 
     var tests = [test1, test2];
     equal(htmlForIndividualTests(tests),
         '<h2><a href="http://trac.webkit.org/browser/trunk/LayoutTests/foo/nonexistant.html" target="_blank">foo/nonexistant.html</a></h2>' +
         htmlForIndividualTestOnAllBuilders(test1) + 
         '<div class=expectations test=foo/nonexistant.html>' +
-            '<div><span class=link onclick=\"setQueryParameter(\'showExpectations\', true)\">Show results</span> | ' +
-            '<span class=link onclick=\"setQueryParameter(\'showLargeExpectations\', true)\">Show large thumbnails</span> | ' +
+            '<div><span class=link onclick=\"g_history.setQueryParameter(\'showExpectations\', true)\">Show results</span> | ' +
+            '<span class=link onclick=\"g_history.setQueryParameter(\'showLargeExpectations\', true)\">Show large thumbnails</span> | ' +
             '<b>Only shows actual results/diffs from the most recent *failure* on each bot.</b></div>' +
         '</div>' +
         '<hr>' +
         '<h2><a href="http://trac.webkit.org/browser/trunk/LayoutTests/bar/nonexistant.html" target="_blank">bar/nonexistant.html</a></h2>' +
         htmlForIndividualTestOnAllBuilders(test2) +
         '<div class=expectations test=bar/nonexistant.html>' +
-            '<div><span class=link onclick=\"setQueryParameter(\'showExpectations\', true)\">Show results</span> | ' +
-            '<span class=link onclick=\"setQueryParameter(\'showLargeExpectations\', true)\">Show large thumbnails</span> | ' +
+            '<div><span class=link onclick=\"g_history.setQueryParameter(\'showExpectations\', true)\">Show results</span> | ' +
+            '<span class=link onclick=\"g_history.setQueryParameter(\'showLargeExpectations\', true)\">Show large thumbnails</span> | ' +
             '<b>Only shows actual results/diffs from the most recent *failure* on each bot.</b></div>' +
         '</div>');
 
     tests = [test1];
     equal(htmlForIndividualTests(tests), htmlForIndividualTestOnAllBuilders(test1) +
         '<div class=expectations test=foo/nonexistant.html>' +
-            '<div><span class=link onclick=\"setQueryParameter(\'showExpectations\', true)\">Show results</span> | ' +
-            '<span class=link onclick=\"setQueryParameter(\'showLargeExpectations\', true)\">Show large thumbnails</span> | ' +
+            '<div><span class=link onclick=\"g_history.setQueryParameter(\'showExpectations\', true)\">Show results</span> | ' +
+            '<span class=link onclick=\"g_history.setQueryParameter(\'showLargeExpectations\', true)\">Show large thumbnails</span> | ' +
             '<b>Only shows actual results/diffs from the most recent *failure* on each bot.</b></div>' +
         '</div>');
 
-    g_currentState.showChrome = true;
+    historyInstance.dashboardSpecificState.showChrome = true;
 
     equal(htmlForIndividualTests(tests),
         '<h2><a href="http://trac.webkit.org/browser/trunk/LayoutTests/foo/nonexistant.html" target="_blank">foo/nonexistant.html</a></h2>' +
@@ -479,16 +514,16 @@
 });
 
 test('htmlForSingleTestRow', 1, function() {
-    resetGlobals();
+    var historyInstance = resetGlobals();
     var builder = 'dummyBuilder';
     BUILDER_TO_MASTER[builder] = CHROMIUM_WEBKIT_BUILDER_MASTER;
     var test = createResultsObjectForTest('foo/exists.html', builder);
-    g_currentState.showCorrectExpectations = true;
+    historyInstance.dashboardSpecificState.showCorrectExpectations = true;
     g_resultsByBuilder[builder] = {buildNumbers: [2, 1], webkitRevision: [1234, 1233]};
     test.rawResults = [[1, 'F'], [2, 'I']];
     test.rawTimes = [[1, 0], [2, 5]];
     var expected = '<tr>' +
-        '<td class="test-link"><span class="link" onclick="setQueryParameter(\'tests\',\'foo/exists.html\');">foo/exists.html</span>' +
+        '<td class="test-link"><span class="link" onclick="g_history.setQueryParameter(\'tests\',\'foo/exists.html\');">foo/exists.html</span>' +
         '<td class=options-container><a href="https://bugs.webkit.org/enter_bug.cgi?assigned_to=webkit-unassigned%40lists.webkit.org&product=WebKit&form_name=enter_bug&component=Tools%20%2F%20Tests&short_desc=Layout%20Test%20foo%2Fexists.html%20is%20failing&comment=The%20following%20layout%20test%20is%20failing%20on%20%5Binsert%20platform%5D%0A%0Afoo%2Fexists.html%0A%0AProbable%20cause%3A%0A%0A%5Binsert%20probable%20cause%5D" class="file-bug">FILE BUG</a>' +
         '<td class=options-container>' +
             '<td class=options-container>' +
@@ -509,191 +544,46 @@
 });
 
 // FIXME: Create builders_tests.js and move this there.
-test('generateChromiumDepsFyiGpuBuildersFromBuilderList', 1, function() {
-    var builderList = ["Linux Audio", "Linux Release (ATI)", "Linux Release (Intel)", "Mac Release (ATI)", "Win7 Audio", "Win7 Release (ATI)", "Win7 Release (Intel)", "WinXP Debug (NVIDIA)", "WinXP Release (NVIDIA)"];
-    var expectedBuilders = [["Linux Release (ATI)", 2], ["Linux Release (Intel)"], ["Mac Release (ATI)"], ["Win7 Release (ATI)"], ["Win7 Release (Intel)"], ["WinXP Debug (NVIDIA)"], ["WinXP Release (NVIDIA)"] ];
-    deepEqual(generateBuildersFromBuilderList(builderList, isChromiumDepsFyiGpuTestRunner), expectedBuilders);
+
+test('isChromiumWebkitTipOfTreeTestRunner', 1, function() {
+    var builderList = ["WebKit Linux", "WebKit Linux (dbg)", "WebKit Linux 32", "WebKit Mac10.6", "WebKit Mac10.6 (dbg)",
+        "WebKit Mac10.6 (deps)", "WebKit Mac10.7", "WebKit Win", "WebKit Win (dbg)(1)", "WebKit Win (dbg)(2)", "WebKit Win (deps)",
+        "WebKit Win7", "Linux (Content Shell)"];
+    var expectedBuilders = ["WebKit Linux", "WebKit Linux (dbg)", "WebKit Linux 32", "WebKit Mac10.6",
+        "WebKit Mac10.6 (dbg)", "WebKit Mac10.7", "WebKit Win", "WebKit Win (dbg)(1)", "WebKit Win (dbg)(2)", "WebKit Win7"];
+    deepEqual(builderList.filter(isChromiumWebkitTipOfTreeTestRunner), expectedBuilders);
 });
 
-test('generateChromiumTipOfTreeGpuBuildersFromBuilderList', 1, function() {
-    var builderList = ["Chrome Frame Tests", "GPU Linux (NVIDIA)", "GPU Linux (dbg) (NVIDIA)", "GPU Mac", "GPU Mac (dbg)", "GPU Win7 (NVIDIA)", "GPU Win7 (dbg) (NVIDIA)", "Linux Perf",
-        "Linux Tests", "Linux Valgrind", "Mac Builder (dbg)", "Mac10.6 Perf", "Mac10.6 Tests", "Vista Perf", "Vista Tests", "WebKit Linux", "WebKit Linux ASAN", "WebKit Linux (dbg)", "WebKit Linux (deps)",
-        "WebKit Linux 32", "WebKit Mac Builder", "WebKit Mac Builder (dbg)", "WebKit Mac Builder (deps)",
-        "WebKit Mac10.6", "WebKit Mac10.6 (dbg)", "WebKit Mac10.6 (deps)", "WebKit Mac10.7", "WebKit Win", "WebKit Win (dbg)(1)", "WebKit Win (dbg)(2)",
-        "WebKit Win (deps)", "WebKit Win Builder", "WebKit Win Builder (dbg)", "WebKit Win Builder (deps)", "WebKit Win7", "Win (dbg)", "Win Builder"];
-    var expectedBuilders = [["GPU Linux (NVIDIA)", 2], ["GPU Linux (dbg) (NVIDIA)"], ["GPU Mac"], ["GPU Mac (dbg)"], ["GPU Win7 (NVIDIA)"], ["GPU Win7 (dbg) (NVIDIA)"]];
-    deepEqual(generateBuildersFromBuilderList(builderList, isChromiumTipOfTreeGpuTestRunner), expectedBuilders);
-});
-
-test('generateWebkitBuildersFromBuilderList', 1, function() {
-    var builderList = ["Chromium Android Release", "Chromium Linux Release", "Chromium Linux Release (Grid Layout)", "Chromium Linux Release (Perf)", "Chromium Linux Release (Tests)",
-        "Chromium Mac Release", "Chromium Mac Release (Perf)", "Chromium Mac Release (Tests)", "Chromium Win Release", "Chromium Win Release (Perf)", "Chromium Win Release (Tests)",
-        "EFL Linux Release", "GTK Linux 32-bit Release", "GTK Linux 64-bit Debug", "GTK Linux 64-bit Release", "Lion Debug (Build)", "Lion Debug (Tests)", "Lion Debug (WebKit2 Tests)",
-        "Lion Leaks", "Lion Release (Build)", "Lion Release (Perf)", "Lion Release (Tests)", "Lion Release (WebKit2 Tests)", "Qt Linux 64-bit Release (Perf)",
-        "Qt Linux 64-bit Release (WebKit2 Perf)", "Qt Linux ARMv7 Release", "Qt Linux MIPS Release", "Qt Linux Release", "Qt Linux Release minimal", "Qt Linux SH4 Release",
-        "Qt SnowLeopard Release", "Qt Windows 32-bit Debug", "Qt Windows 32-bit Release", "SnowLeopard Intel Debug (Build)", "SnowLeopard Intel Debug (Tests)",
-        "SnowLeopard Intel Debug (WebKit2 Tests)", "SnowLeopard Intel Release (Build)", "SnowLeopard Intel Release (Tests)", "SnowLeopard Intel Release (WebKit2 Tests)",
-        "WinCE Release (Build)", "WinCairo Release", "Windows 7 Release (Tests)", "Windows 7 Release (WebKit2 Tests)", "Windows Debug (Build)", "Windows Release (Build)", "Windows XP Debug (Tests)",
-        "EFL Linux 32-bit Release (Build)", "EFL Linux 64-bit Debug"];
-    var expectedBuilders = [["Chromium Linux Release (Tests)", 2], ["Chromium Mac Release (Tests)"], ["EFL Linux Release"], ["GTK Linux 32-bit Release"], ["GTK Linux 64-bit Debug"],
-        ["GTK Linux 64-bit Release"], ["Lion Debug (Tests)"], ["Lion Debug (WebKit2 Tests)"], ["Lion Release (Tests)"], ["Lion Release (WebKit2 Tests)"], ["Qt Linux Release"],
-        ["SnowLeopard Intel Debug (Tests)"], ["SnowLeopard Intel Debug (WebKit2 Tests)"], ["SnowLeopard Intel Release (Tests)"], ["SnowLeopard Intel Release (WebKit2 Tests)"], ["EFL Linux 64-bit Debug"]];
-    deepEqual(generateBuildersFromBuilderList(builderList, isWebkitTestRunner), expectedBuilders);
-});
-
-test('generateChromiumWebkitTipOfTreeBuildersFromBuilderList', 1, function() {
+test('isChromiumWebkitDepsTestRunner', 1, function() {
     var builderList = ["Chrome Frame Tests", "GPU Linux (NVIDIA)", "GPU Linux (dbg) (NVIDIA)", "GPU Mac", "GPU Mac (dbg)", "GPU Win7 (NVIDIA)", "GPU Win7 (dbg) (NVIDIA)", "Linux Perf", "Linux Tests",
         "Linux Valgrind", "Mac Builder (dbg)", "Mac10.6 Perf", "Mac10.6 Tests", "Vista Perf", "Vista Tests", "WebKit Linux", "WebKit Linux ASAN",  "WebKit Linux (dbg)", "WebKit Linux (deps)", "WebKit Linux 32",
-        "WebKit Mac Builder", "WebKit Mac Builder (dbg)", "WebKit Mac Builder (deps)", "WebKit Mac10.6", "WebKit Mac10.6 (dbg)",
-        "WebKit Mac10.6 (deps)", "WebKit Mac10.7", "WebKit Win", "WebKit Win (dbg)(1)", "WebKit Win (dbg)(2)", "WebKit Win (deps)", "WebKit Win Builder", "WebKit Win Builder (dbg)",
-        "WebKit Win Builder (deps)", "WebKit Win7", "Win (dbg)", "Win Builder",
-        "Linux (Content Shell)"];
-    var expectedBuilders = [["WebKit Linux", 2], ["WebKit Linux (dbg)"], ["WebKit Linux 32"], ["WebKit Mac10.6"],
-        ["WebKit Mac10.6 (dbg)"], ["WebKit Mac10.7"], ["WebKit Win"], ["WebKit Win (dbg)(1)"], ["WebKit Win (dbg)(2)"], ["WebKit Win7"]];
-    deepEqual(generateBuildersFromBuilderList(builderList, isChromiumWebkitTipOfTreeTestRunner), expectedBuilders);
-});
-
-test('generateChromiumWebkitDepsBuildersFromBuilderList', 1, function() {
-    var builderList = ["Chrome Frame Tests", "GPU Linux (NVIDIA)", "GPU Linux (dbg) (NVIDIA)", "GPU Mac", "GPU Mac (dbg)", "GPU Win7 (NVIDIA)", "GPU Win7 (dbg) (NVIDIA)", "Linux Perf", "Linux Tests",
-        "Linux Valgrind", "Mac Builder (dbg)", "Mac10.6 Perf", "Mac10.6 Tests", "Vista Perf", "Vista Tests", "WebKit Linux", "WebKit Linux ASAN",  "WebKit Linux (dbg)", "WebKit Linux (deps)", "WebKit Linux 32",
-        "WebKit Mac Builder", "WebKit Mac Builder (dbg)", "WebKit Mac Builder (deps)", "WebKit Mac10.6", "WebKit Mac10.6 (dbg)",
-        "WebKit Mac10.6 (deps)", "WebKit Mac10.7", "WebKit Win", "WebKit Win (dbg)(1)", "WebKit Win (dbg)(2)", "WebKit Win (deps)", "WebKit Win Builder", "WebKit Win Builder (dbg)",
-        "WebKit Win Builder (deps)", "WebKit Win7", "Win (dbg)", "Win Builder"];
-    var expectedBuilders = [["WebKit Linux (deps)", 2], ["WebKit Mac10.6 (deps)"], ["WebKit Win (deps)"]];
-    deepEqual(generateBuildersFromBuilderList(builderList, isChromiumWebkitDepsTestRunner), expectedBuilders);
-});
-
-test('generateChromiumDepsGTestBuildersFromBuilderList', 1, function() {
-    var builderList = ["Android Builder", "Chrome Frame Tests (ie6)", "Chrome Frame Tests (ie7)", "Chrome Frame Tests (ie8)", "Interactive Tests (dbg)", "Linux", "Linux Builder (dbg)",
-        "Linux Builder (dbg)(shared)", "Linux Builder x64", "Linux Clang (dbg)", "Linux Sync", "Linux Tests (dbg)(1)", "Linux Tests (dbg)(2)", "Linux Tests (dbg)(shared)", "Linux Tests x64",
-        "Linux x64", "Mac", "Mac 10.6 Tests (dbg)(1)", "Mac 10.6 Tests (dbg)(2)",
-        "Mac 10.6 Tests (dbg)(3)", "Mac 10.6 Tests (dbg)(4)", "Mac Builder", "Mac Builder (dbg)", "Mac10.6 Sync",
-        "Mac10.6 Tests (1)", "Mac10.6 Tests (2)", "Mac10.6 Tests (3)", "NACL Tests", "NACL Tests (x64)", "Vista Tests (1)", "Vista Tests (2)", "Vista Tests (3)", "Win", "Win Aura",
-        "Win Builder", "Win Builder (dbg)", "Win Builder 2010 (dbg)", "Win7 Sync", "Win7 Tests (1)", "Win7 Tests (2)", "Win7 Tests (3)", "Win7 Tests (dbg)(1)", "Win7 Tests (dbg)(2)",
-        "Win7 Tests (dbg)(3)", "Win7 Tests (dbg)(4)", "Win7 Tests (dbg)(5)", "Win7 Tests (dbg)(6)", "XP Tests (1)", "XP Tests (2)", "XP Tests (3)", "XP Tests (dbg)(1)", "XP Tests (dbg)(2)",
-        "XP Tests (dbg)(3)", "XP Tests (dbg)(4)", "XP Tests (dbg)(5)", "XP Tests (dbg)(6)"];
-    var expectedBuilders = [["Interactive Tests (dbg)", 2], ["Linux Sync"], ["Linux Tests (dbg)(1)"], ["Linux Tests (dbg)(2)"], ["Linux Tests (dbg)(shared)"], ["Linux Tests x64"],
-        ["Mac 10.6 Tests (dbg)(1)"], ["Mac 10.6 Tests (dbg)(2)"], ["Mac 10.6 Tests (dbg)(3)"],
-        ["Mac 10.6 Tests (dbg)(4)"], ["Mac10.6 Sync"], ["Mac10.6 Tests (1)"], ["Mac10.6 Tests (2)"], ["Mac10.6 Tests (3)"], ["NACL Tests"],
-        ["NACL Tests (x64)"], ["Vista Tests (1)"], ["Vista Tests (2)"], ["Vista Tests (3)"], ["Win7 Sync"], ["Win7 Tests (1)"], ["Win7 Tests (2)"], ["Win7 Tests (3)"], ["Win7 Tests (dbg)(1)"],
-        ["Win7 Tests (dbg)(2)"], ["Win7 Tests (dbg)(3)"], ["Win7 Tests (dbg)(4)"], ["Win7 Tests (dbg)(5)"], ["Win7 Tests (dbg)(6)"], ["XP Tests (1)"], ["XP Tests (2)"], ["XP Tests (3)"],
-        ["XP Tests (dbg)(1)"], ["XP Tests (dbg)(2)"], ["XP Tests (dbg)(3)"], ["XP Tests (dbg)(4)"], ["XP Tests (dbg)(5)"], ["XP Tests (dbg)(6)"]];
-    deepEqual(generateBuildersFromBuilderList(builderList, isChromiumDepsGTestRunner), expectedBuilders);
-});
-
-test('generateChromiumDepsCrosGTestBuildersFromBuilderList', 1, function() {
-    var builderList = ["ChromiumOS (amd64)", "ChromiumOS (arm)", "ChromiumOS (tegra2)", "ChromiumOS (x86)", "Linux ChromiumOS (Clang dbg)", "Linux ChromiumOS Builder", "Linux ChromiumOS Builder (dbg)",
-        "Linux ChromiumOS Tests (1)", "Linux ChromiumOS Tests (2)", "Linux ChromiumOS Tests (dbg)(1)", "Linux ChromiumOS Tests (dbg)(2)", "Linux ChromiumOS Tests (dbg)(3)"];
-    var expectedBuilders = [["Linux ChromiumOS Tests (1)", 2], ["Linux ChromiumOS Tests (2)"], ["Linux ChromiumOS Tests (dbg)(1)"], ["Linux ChromiumOS Tests (dbg)(2)"], ["Linux ChromiumOS Tests (dbg)(3)"]];
-    deepEqual(generateBuildersFromBuilderList(builderList, isChromiumDepsCrosGTestRunner), expectedBuilders);
-});
-
-test('generateChromiumTipOfTreeGTestBuildersFromBuilderList', 1, function() {
-    var builderList = ["Chrome Frame Tests", "GPU Linux (NVIDIA)", "GPU Linux (dbg) (NVIDIA)", "GPU Mac", "GPU Mac (dbg)", "GPU Win7 (NVIDIA)", "GPU Win7 (dbg) (NVIDIA)", "Linux Perf",
-        "Linux Tests", "Linux Valgrind", "Mac Builder (dbg)", "Mac10.6 Perf", "Mac10.6 Tests", "Vista Perf", "Vista Tests", "WebKit Linux", "WebKit Linux (dbg)", "WebKit Linux (deps)",
-        "WebKit Linux 32", "WebKit Mac Builder", "WebKit Mac Builder (dbg)", "WebKit Mac Builder (deps)",
-        "WebKit Mac10.6", "WebKit Mac10.6 (dbg)", "WebKit Mac10.6 (deps)", "WebKit Mac10.7", "WebKit Win", "WebKit Win (dbg)(1)", "WebKit Win (dbg)(2)",
-        "WebKit Win (deps)", "WebKit Win Builder", "WebKit Win Builder (dbg)", "WebKit Win Builder (deps)", "WebKit Win7", "Win (dbg)", "Win Builder"];
-    var expectedBuilders = [['Linux Tests', BuilderGroup.DEFAULT_BUILDER], ['Mac10.6 Tests'], ['Vista Tests'], ['Win (dbg)']];
-    deepEqual(generateBuildersFromBuilderList(builderList, isChromiumTipOfTreeGTestRunner), expectedBuilders);
-});
-
-test('queryHashAsMap', 2, function() {
-    equal(window.location.hash, '#useTestData=true');
-    deepEqual(queryHashAsMap(), {useTestData: 'true'});
-});
-
-test('parseCrossDashboardParameters', 2, function() {
-    equal(window.location.hash, '#useTestData=true');
-    parseCrossDashboardParameters();
-
-    var expectedParameters = {};
-    for (var key in g_defaultCrossDashboardStateValues)
-        expectedParameters[key] = g_defaultCrossDashboardStateValues[key];
-    expectedParameters.useTestData = true;
-
-    deepEqual(g_crossDashboardState, expectedParameters);
-});
-
-test('diffStates', 5, function() {
-    var newState = {a: 1, b: 2};
-    deepEqual(diffStates(null, newState), newState);
-
-    var oldState = {a: 1};
-    deepEqual(diffStates(oldState, newState), {b: 2});
-
-    // FIXME: This is kind of weird. I think the existing users of this code work correctly, but it's a confusing result.
-    var oldState = {c: 1};
-    deepEqual(diffStates(oldState, newState), {a:1, b: 2});
-
-    var oldState = {a: 1, b: 2};
-    deepEqual(diffStates(oldState, newState), {});
-
-    var oldState = {a: 2, b: 3};
-    deepEqual(diffStates(oldState, newState), {a: 1, b: 2});
-});
-
-test('addBuilderLoadErrors', 1, function() {
-    clearErrors();
-    g_hasDoneInitialPageGeneration = false;
-    g_buildersThatFailedToLoad = ['builder1', 'builder2'];
-    g_staleBuilders = ['staleBuilder1'];
-    addBuilderLoadErrors();
-    equal(g_errorMessages, 'ERROR: Failed to get data from builder1,builder2.<br>ERROR: Data from staleBuilder1 is more than 1 day stale.<br>');
+        "WebKit Mac10.6", "WebKit Mac10.6 (dbg)", "WebKit Mac10.6 (deps)", "WebKit Mac10.7", "WebKit Win", "WebKit Win (dbg)(1)", "WebKit Win (dbg)(2)", "WebKit Win (deps)",
+        "WebKit Win7", "Win (dbg)", "Win Builder"];
+    var expectedBuilders = ["WebKit Linux (deps)", "WebKit Mac10.6 (deps)", "WebKit Win (deps)"];
+    deepEqual(builderList.filter(isChromiumWebkitDepsTestRunner), expectedBuilders);
 });
 
 test('builderGroupIsToTWebKitAttribute', 2, function() {
-    var dummyMaster = new BuilderMaster('dummy.org', 'http://build.dummy.org');
+    var dummyMaster = new builders.BuilderMaster('Chromium', 'dummyurl', {'layout-tests': {'builders': ['WebKit Linux', 'WebKit Linux (dbg)', 'WebKit Mac10.7', 'WebKit Win']}});
     var testBuilderGroups = {
         '@ToT - dummy.org': new BuilderGroup(BuilderGroup.TOT_WEBKIT),
         '@DEPS - dummy.org': new BuilderGroup(BuilderGroup.DEPS_WEBKIT),
     }
-    testBuilderGroups['@ToT - dummy.org'].expectedGroups = 1;
-    testBuilderGroups['@DEPS - dummy.org'].expectedGroups = 1;
 
     var testJSONData = "{ \"Dummy Builder 1\": null, \"Dummy Builder 2\": null }";
-    onBuilderListLoad(testBuilderGroups, function() { return true; }, dummyMaster, '@ToT - dummy.org', {responseText: testJSONData});
+    requestBuilderList(testBuilderGroups, 'ChromiumWebkit', '@ToT - dummy.org', testBuilderGroups['@ToT - dummy.org'], 'layout-tests');
     equal(testBuilderGroups['@ToT - dummy.org'].isToTWebKit, true);
-    onBuilderListLoad(testBuilderGroups, function() { return true; }, dummyMaster, '@DEPS - dummy.org', {responseText: testJSONData});
+    requestBuilderList(testBuilderGroups, 'ChromiumWebkit', '@DEPS - dummy.org', testBuilderGroups['@DEPS - dummy.org'], 'layout-tests');
     equal(testBuilderGroups['@DEPS - dummy.org'].isToTWebKit, false);
 });
 
-test('builderGroupExpectedGroups', 4, function() {
-    var dummyMaster = new BuilderMaster('dummy.org', 'http://build.dummy.org');
-    var testBuilderGroups = {
-        '@ToT - dummy.org': new BuilderGroup(BuilderGroup.TOT_WEBKIT),
-    }
-    testBuilderGroups['@ToT - dummy.org'].expectedGroups = 3;
-
-    var testJSONData = "{ \"Dummy Builder 1\": null }";
-    equal(testBuilderGroups['@ToT - dummy.org'].expectedGroups, 3);
-    onBuilderListLoad(testBuilderGroups,  function() { return true; }, dummyMaster, '@ToT - dummy.org', {responseText: testJSONData});
-    equal(testBuilderGroups['@ToT - dummy.org'].groups, 1);
-    var testJSONData = "{ \"Dummy Builder 2\": null }";
-    onBuilderListLoad(testBuilderGroups,  function() { return true; }, dummyMaster, '@ToT - dummy.org', {responseText: testJSONData});
-    equal(testBuilderGroups['@ToT - dummy.org'].groups, 2);
-    onErrorLoadingBuilderList('http://build.dummy.org', testBuilderGroups,  '@ToT - dummy.org');
-    equal(testBuilderGroups['@ToT - dummy.org'].groups, 3);
-});
-
-test('requestBuilderListAddsBuilderGroupEntry', 2, function() {
+test('requestBuilderListAddsBuilderGroupEntry', 1, function() {
     var testBuilderGroups = { '@ToT - dummy.org': null };
+    var builderGroup = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
+    var groupName = '@ToT - dummy.org';
+    requestBuilderList(testBuilderGroups, 'ChromiumWebkit', groupName, builderGroup, 'layout-tests');
 
-    var requestFunction = loader.request;
-    loader.request = function() {};
-
-    try {
-        var builderFilter = null;
-        var master = { builderJsonPath: function() {} };
-        var groupName = '@ToT - dummy.org';
-        var builderGroup = { expectedGroups: 0 };
-        requestBuilderList(testBuilderGroups, builderFilter, master, groupName, builderGroup);
-
-        equal(testBuilderGroups['@ToT - dummy.org'], builderGroup);
-        equal(testBuilderGroups['@ToT - dummy.org'].expectedGroups, 1);
-    } finally {
-        loader.request = requestFunction;
-    }
+    equal(testBuilderGroups['@ToT - dummy.org'], builderGroup);
 })
 
 test('sortTests', 4, function() {
@@ -722,9 +612,9 @@
 });
 
 test('popup', 2, function() {
-    showPopup(document.body, 'dummy content');
+    ui.popup.show(document.body, 'dummy content');
     ok(document.querySelector('#popup'));
-    hidePopup();
+    ui.popup.hide();
     ok(!document.querySelector('#popup'));
 });
 
@@ -797,3 +687,15 @@
     }, "foo/bar");
     deepEqual(leafsOfPartialTrieTraversal, expectedLeafs);
 });
+
+test('changeTestTypeInvalidatesGroup', 1, function() {
+    var historyInstance = resetGlobals();
+    var originalGroup = '@ToT - chromium.org';
+    var originalTestType = 'layout-tests';
+    loadBuildersList(originalGroup, originalTestType);
+    historyInstance.crossDashboardState.group = originalGroup;
+    historyInstance.crossDashboardState.testType = originalTestType;
+
+    historyInstance.invalidateQueryParameters({'testType': 'ui_tests'});
+    notEqual(historyInstance.crossDashboardState.group, originalGroup, "group should have been invalidated");   
+});
\ No newline at end of file
diff --git a/Tools/TestResultServer/static-dashboards/history.js b/Tools/TestResultServer/static-dashboards/history.js
new file mode 100644
index 0000000..49c7108
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/history.js
@@ -0,0 +1,274 @@
+// Copyright (C) 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//         * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//         * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//         * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+var history = history || {};
+
+(function() {
+
+history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES = {
+    group: null,
+    showAllRuns: false,
+    testType: 'layout-tests',
+    useTestData: false,
+}    
+
+history.validateParameter = function(state, key, value, validateFn)
+{
+    if (validateFn())
+        state[key] = value;
+    else
+        console.log(key + ' value is not valid: ' + value);
+}
+
+history.isTreeMap = function()
+{
+    return string.endsWith(window.location.pathname, 'treemap.html');
+}
+
+// TODO(jparent): Make private once callers move here.
+history.queryHashAsMap = function()
+{
+    var hash = window.location.hash;
+    var paramsList = hash ? hash.substring(1).split('&') : [];
+    var paramsMap = {};
+    var invalidKeys = [];
+    for (var i = 0; i < paramsList.length; i++) {
+        var thisParam = paramsList[i].split('=');
+        if (thisParam.length != 2) {
+            console.log('Invalid query parameter: ' + paramsList[i]);
+            continue;
+        }
+
+        paramsMap[thisParam[0]] = decodeURIComponent(thisParam[1]);
+    }
+
+    // FIXME: remove support for mapping from the master parameter to the group
+    // one once the waterfall starts to pass in the builder name instead.
+    if (paramsMap.master) {
+        paramsMap.group = LEGACY_BUILDER_MASTERS_TO_GROUPS[paramsMap.master];
+        if (!paramsMap.group)
+            console.log('ERROR: Unknown master name: ' + paramsMap.master);
+        window.location.hash = window.location.hash.replace('master=' + paramsMap.master, 'group=' + paramsMap.group);
+        delete paramsMap.master;
+    }
+
+    return paramsMap;
+}
+
+history._diffStates = function(oldState, newState)
+{
+    // If there is no old state, everything in the current state is new.
+    if (!oldState)
+        return newState;
+
+    var changedParams = {};
+    for (curKey in newState) {
+        var oldVal = oldState[curKey];
+        var newVal = newState[curKey];
+        // Add new keys or changed values.
+        if (!oldVal || oldVal != newVal)
+            changedParams[curKey] = newVal;
+    }
+    return changedParams;
+}
+
+history._fillMissingValues = function(to, from)
+{
+    for (var state in from) {
+        if (!(state in to))
+            to[state] = from[state];
+    }
+}
+
+history.History = function()
+{
+  this.crossDashboardState = {};
+  this.dashboardSpecificState = {};
+}
+
+var RELOAD_REQUIRING_PARAMETERS = ['showAllRuns', 'group', 'testType'];
+
+history.History.prototype = {
+    isLayoutTestResults: function()
+    {
+        return this.crossDashboardState.testType == 'layout-tests';
+    },
+    isGPUTestResults: function()
+    {
+        return this.crossDashboardState.testType == 'gpu_tests';
+    },
+    parseCrossDashboardParameters: function()
+    {
+        this.crossDashboardState = {};
+        var parameters = history.queryHashAsMap();
+        for (parameterName in history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES)
+            this.parseParameter(parameters, parameterName);
+
+        history._fillMissingValues(this.crossDashboardState, history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES);
+    },
+    // TODO(jparent): Make private once callers move here.
+    parseParameters: function()
+    {
+        var oldCrossDashboardState = this.crossDashboardState;
+        var oldDashboardSpecificState = this.dashboardSpecificState;
+
+        this.parseCrossDashboardParameters();
+        
+        // Some parameters require loading different JSON files when the value changes. Do a reload.
+        if (Object.keys(oldCrossDashboardState).length) {
+            for (var key in this.crossDashboardState) {
+                if (oldCrossDashboardState[key] != this.crossDashboardState[key] && RELOAD_REQUIRING_PARAMETERS.indexOf(key) != -1) {
+                    window.location.reload();
+                    return false;
+                }
+            }
+        }
+
+        parseDashboardSpecificParameters();
+        var dashboardSpecificDiffState = history._diffStates(oldDashboardSpecificState, this.dashboardSpecificState);
+
+        history._fillMissingValues(this.dashboardSpecificState, g_defaultDashboardSpecificStateValues);
+
+        // FIXME: dashboard_base shouldn't know anything about specific dashboard specific keys.
+        if (dashboardSpecificDiffState.builder)
+            delete this.dashboardSpecificState.tests;
+        if (this.dashboardSpecificState.tests)
+            delete this.dashboardSpecificState.builder;
+
+        var shouldGeneratePage = true;
+        if (Object.keys(dashboardSpecificDiffState).length)
+            shouldGeneratePage = handleQueryParameterChange(dashboardSpecificDiffState);
+        return shouldGeneratePage;
+    },
+    // TODO(jparent): Make private once callers move here.
+    parseParameter: function(parameters, key)
+    {
+        if (!(key in parameters))
+            return;
+        var value = parameters[key];
+        if (!this._handleValidHashParameterWrapper(key, value))
+            console.log("Invalid query parameter: " + key + '=' + value);
+    },
+    // Takes a key and a value and sets the this.dashboardSpecificState[key] = value iff key is
+    // a valid hash parameter and the value is a valid value for that key. Handles
+    // cross-dashboard parameters then falls back to calling
+    // handleValidHashParameter for dashboard-specific parameters.
+    //
+    // @return {boolean} Whether the key what inserted into the this.dashboardSpecificState.
+    _handleValidHashParameterWrapper: function(key, value)
+    {
+        switch(key) {
+        case 'testType':
+            history.validateParameter(this.crossDashboardState, key, value,
+                function() { return TEST_TYPES.indexOf(value) != -1; });
+            return true;
+
+        case 'group':
+            history.validateParameter(this.crossDashboardState, key, value,
+                function() {
+                  return value in LAYOUT_TESTS_BUILDER_GROUPS ||
+                      value in CHROMIUM_GPU_TESTS_BUILDER_GROUPS ||
+                      value in CHROMIUM_INSTRUMENTATION_TESTS_BUILDER_GROUPS ||
+                      value in CHROMIUM_GTESTS_BUILDER_GROUPS;
+                });
+            return true;
+
+        case 'useTestData':
+        case 'showAllRuns':
+            this.crossDashboardState[key] = value == 'true';
+            return true;
+
+        default:
+            return handleValidHashParameter(key, value);
+        }
+    },
+    queryParameterValue: function(parameter)
+    {
+        return this.dashboardSpecificState[parameter] || this.crossDashboardState[parameter];
+    }, 
+    // Sets the page state. Takes varargs of key, value pairs.
+    setQueryParameter: function(var_args)
+    {
+        var queryParamsAsState = {};
+        for (var i = 0; i < arguments.length; i += 2) {
+            var key = arguments[i];
+            queryParamsAsState[key] = arguments[i + 1];
+        }
+
+        this.invalidateQueryParameters(queryParamsAsState);
+
+        var newState = this._combinedDashboardState();
+        for (var key in queryParamsAsState) {
+            newState[key] = queryParamsAsState[key];
+        }
+
+        // Note: We use window.location.hash rather that window.location.replace
+        // because of bugs in Chrome where extra entries were getting created
+        // when back button was pressed and full page navigation was occuring.
+        // FIXME: file those bugs.
+        window.location.hash = this._permaLinkURLHash(newState);
+    },
+    toggleQueryParameter: function(param)
+    {
+        this.setQueryParameter(param, !this.queryParameterValue(param));
+    },
+    invalidateQueryParameters: function(queryParamsAsState)
+    {
+        for (var key in queryParamsAsState) {
+            if (key in CROSS_DB_INVALIDATING_PARAMETERS)
+                delete this.crossDashboardState[CROSS_DB_INVALIDATING_PARAMETERS[key]];
+            if (DB_SPECIFIC_INVALIDATING_PARAMETERS && key in DB_SPECIFIC_INVALIDATING_PARAMETERS)
+                delete this.dashboardSpecificState[DB_SPECIFIC_INVALIDATING_PARAMETERS[key]];
+        }
+    },
+    _joinParameters: function(stateObject)
+    {
+        var state = [];
+        for (var key in stateObject) {
+            var value = stateObject[key];
+            if (value != defaultValue(key))
+                state.push(key + '=' + encodeURIComponent(value));
+        }
+        return state.join('&');
+    }, 
+    _permaLinkURLHash: function(opt_state)
+    {
+        var state = opt_state || this._combinedDashboardState();
+        return '#' + this._joinParameters(state);
+    },
+    _combinedDashboardState: function()
+    {
+        var combinedState = Object.create(this.dashboardSpecificState);
+        for (var key in this.crossDashboardState)
+            combinedState[key] = this.crossDashboardState[key];
+        return combinedState;    
+    }
+}
+
+})();
\ No newline at end of file
diff --git a/Tools/TestResultServer/static-dashboards/history_unittests.js b/Tools/TestResultServer/static-dashboards/history_unittests.js
new file mode 100644
index 0000000..7559453
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/history_unittests.js
@@ -0,0 +1,65 @@
+// Copyright (C) 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+test('queryHashAsMap', 2, function() {
+    equal(window.location.hash, '#useTestData=true');
+    deepEqual(history.queryHashAsMap(), {useTestData: 'true'});
+});
+
+test('diffStates', 5, function() {
+    var newState = {a: 1, b: 2};
+    deepEqual(history._diffStates(null, newState), newState);
+
+    var oldState = {a: 1};
+    deepEqual(history._diffStates(oldState, newState), {b: 2});
+
+    // FIXME: This is kind of weird. I think the existing users of this code work correctly, but it's a confusing result.
+    var oldState = {c: 1};
+    deepEqual(history._diffStates(oldState, newState), {a:1, b: 2});
+
+    var oldState = {a: 1, b: 2};
+    deepEqual(history._diffStates(oldState, newState), {});
+
+    var oldState = {a: 2, b: 3};
+    deepEqual(history._diffStates(oldState, newState), {a: 1, b: 2});
+});
+
+test('parseCrossDashboardParameters', 2, function() {
+    var historyInstance = new history.History();
+    // FIXME(jparent): Remove this once parseParameters moves onto history obj.
+    g_history = historyInstance;
+    equal(window.location.hash, '#useTestData=true');
+    historyInstance.parseCrossDashboardParameters();
+
+    var expectedParameters = {};
+    for (var key in history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES)
+        expectedParameters[key] = history.DEFAULT_CROSS_DASHBOARD_STATE_VALUES[key];
+    expectedParameters.useTestData = true;
+
+    deepEqual(historyInstance.crossDashboardState, expectedParameters);
+});
diff --git a/Tools/TestResultServer/static-dashboards/loader.js b/Tools/TestResultServer/static-dashboards/loader.js
index be9e708..a526eeb 100644
--- a/Tools/TestResultServer/static-dashboards/loader.js
+++ b/Tools/TestResultServer/static-dashboards/loader.js
@@ -37,7 +37,7 @@
 function pathToBuilderResultsFile(builderName) {
     return TEST_RESULTS_SERVER + 'testfile?builder=' + builderName +
            '&master=' + builderMaster(builderName).name +
-           '&testtype=' + g_crossDashboardState.testType + '&name=';
+           '&testtype=' + g_history.crossDashboardState.testType + '&name=';
 }
 
 loader.request = function(url, success, error, opt_isBinaryData)
@@ -57,13 +57,40 @@
     xhr.send();
 }
 
-loader.Loader = function()
+loader.Loader = function(opt_onLoadingComplete)
 {
     this._loadingSteps = [
         this._loadBuildersList,
         this._loadResultsFiles,
         this._loadExpectationsFiles,
     ];
+
+    this._buildersThatFailedToLoad = [];
+    this._staleBuilders = [];
+    this._errors = new ui.Errors();
+    this._onLoadingComplete = opt_onLoadingComplete || function() {};
+    // TODO(jparent): Pass in the appropriate history obj per db.
+    this._history = g_history;
+}
+
+// TODO(aboxhall): figure out whether this is a performance bottleneck and
+// change calling code to understand the trie structure instead if necessary.
+loader.Loader._flattenTrie = function(trie, prefix)
+{
+    var result = {};
+    for (var name in trie) {
+        var fullName = prefix ? prefix + "/" + name : name;
+        var data = trie[name];
+        if ("results" in data)
+            result[fullName] = data;
+        else {
+            var partialResult = loader.Loader._flattenTrie(data, fullName);
+            for (var key in partialResult) {
+                result[key] = partialResult[key];
+            }
+        }
+    }
+    return result;
 }
 
 loader.Loader.prototype = {
@@ -71,37 +98,36 @@
     {
         this._loadNext();
     },
-    buildersListLoaded: function()
+    showErrors: function() 
     {
-        initBuilders();
-        this._loadNext();
+        this._errors.show();
     },
     _loadNext: function()
     {
         var loadingStep = this._loadingSteps.shift();
         if (!loadingStep) {
-            resourceLoadingComplete();
+            this._addErrors();
+            this._onLoadingComplete();
             return;
         }
         loadingStep.apply(this);
     },
     _loadBuildersList: function()
     {
-        loadBuildersList(g_crossDashboardState.group, g_crossDashboardState.testType);
+        loadBuildersList(currentBuilderGroupName(), this._history.crossDashboardState.testType);
+        this._loadNext();
     },
     _loadResultsFiles: function()
     {
-        parseParameters();
-
-        for (var builderName in g_builders)
+        for (var builderName in currentBuilders())
             this._loadResultsFileForBuilder(builderName);
     },
     _loadResultsFileForBuilder: function(builderName)
     {
         var resultsFilename;
-        if (isTreeMap())
+        if (history.isTreeMap())
             resultsFilename = 'times_ms.json';
-        else if (g_crossDashboardState.showAllRuns)
+        else if (this._history.crossDashboardState.showAllRuns)
             resultsFilename = 'results.json';
         else
             resultsFilename = 'results-small.json';
@@ -117,7 +143,7 @@
     },
     _handleResultsFileLoaded: function(builderName, fileData)
     {
-        if (isTreeMap())
+        if (history.isTreeMap())
             this._processTimesJSONData(builderName, fileData);
         else
             this._processResultsJSONData(builderName, fileData);
@@ -154,44 +180,23 @@
                 continue;
 
             if ((Date.now() / 1000) - lastRunSeconds > ONE_DAY_SECONDS)
-                g_staleBuilders.push(builderName);
+                this._staleBuilders.push(builderName);
 
             if (json_version >= 4)
-                builds[builderName][TESTS_KEY] = flattenTrie(builds[builderName][TESTS_KEY]);
+                builds[builderName][TESTS_KEY] = loader.Loader._flattenTrie(builds[builderName][TESTS_KEY]);
             g_resultsByBuilder[builderName] = builds[builderName];
         }
     },
     _handleResultsFileLoadError: function(builderName)
     {
-        var error = 'Failed to load results file for ' + builderName + '.';
+        console.error('Failed to load results file for ' + builderName + '.');
 
-        if (isLayoutTestResults()) {
-            console.error(error);
-            g_buildersThatFailedToLoad.push(builderName);
-        } else {
-            // Avoid to show error/warning messages for non-layout tests. We may be
-            // checking the builders that are not running the tests.
-            console.info('info:' + error);
-        }
+        // FIXME: loader shouldn't depend on state defined in dashboard_base.js.
+        this._buildersThatFailedToLoad.push(builderName);
 
         // Remove this builder from builders, so we don't try to use the
         // data that isn't there.
-        delete g_builders[builderName];
-
-        // Change the default builder name if it has been deleted.
-        if (g_defaultBuilderName == builderName) {
-            g_defaultBuilderName = null;
-            for (var availableBuilderName in g_builders) {
-                g_defaultBuilderName = availableBuilderName;
-                g_defaultDashboardSpecificStateValues.builder = availableBuilderName;
-                break;
-            }
-            if (!g_defaultBuilderName) {
-                var error = 'No tests results found for ' + g_crossDashboardState.testType + '. Reload the page to try fetching it again.';
-                console.error(error);
-                addError(error);
-            }
-        }
+        delete currentBuilders()[builderName];
 
         // Proceed as if the resource had loaded.
         this._handleResourceLoad();
@@ -203,7 +208,7 @@
     },
     _haveResultsFilesLoaded: function()
     {
-        for (var builder in g_builders) {
+        for (var builder in currentBuilders()) {
             if (!g_resultsByBuilder[builder])
                 return false;
         }
@@ -211,7 +216,7 @@
     },
     _loadExpectationsFiles: function()
     {
-        if (!isFlakinessDashboard() && !g_crossDashboardState.useTestData) {
+        if (!isFlakinessDashboard() && !this._history.crossDashboardState.useTestData) {
             this._loadNext();
             return;
         }
@@ -241,6 +246,14 @@
                     partial(function(platformName, xhr) {
                         console.error('Could not load expectations file for ' + platformName);
                     }, platformWithExpectations));
+    },
+    _addErrors: function()
+    {
+        if (this._buildersThatFailedToLoad.length)
+            this._errors.addError('ERROR: Failed to get data from ' + this._buildersThatFailedToLoad.toString() +'.');
+
+        if (this._staleBuilders.length)
+            this._errors.addError('ERROR: Data from ' + this._staleBuilders.toString() + ' is more than 1 day stale.');
     }
 }
 
diff --git a/Tools/TestResultServer/static-dashboards/loader_unittests.js b/Tools/TestResultServer/static-dashboards/loader_unittests.js
index e2f546c..23eab31 100644
--- a/Tools/TestResultServer/static-dashboards/loader_unittests.js
+++ b/Tools/TestResultServer/static-dashboards/loader_unittests.js
@@ -29,8 +29,13 @@
 module('loader');
 
 test('loading steps', 1, function() {
+    resetGlobals();
     var loadedSteps = [];
-    var resourceLoader = new loader.Loader();
+    var loadingCompleteCallback = handleLocationChange;
+    handleLocationChange = function() {
+        deepEqual(loadedSteps, ['step 1', 'step 2']);
+    }
+    var resourceLoader = new loader.Loader(handleLocationChange);
     function loadingStep1() {
         loadedSteps.push('step 1');
         resourceLoader.load();
@@ -40,21 +45,19 @@
         resourceLoader.load();
     }
 
-    var loadingCompleteCallback = resourceLoadingComplete;
-    resourceLoadingComplete = function() {
-        deepEqual(loadedSteps, ['step 1', 'step 2']);
-    }
-
     try {
         resourceLoader._loadingSteps = [loadingStep1, loadingStep2];
         resourceLoader.load();
     } finally {
-        resourceLoadingComplete = loadingCompleteCallback;
+        handleLocationChange = loadingCompleteCallback;
     }
 });
 
-test('results files loading', 5, function() {
-    var expectedLoadedBuilders = ["WebKit Linux", "WebKit Win"];
+// Total number of assertions is 1 for the deepEqual of the builder lists
+// and then 2 per builder (one for ok, one for deepEqual of tests).
+test('results files loading', 11, function() {
+    resetGlobals();
+    var expectedLoadedBuilders =  ['WebKit Linux', 'WebKit Linux (dbg)', 'WebKit Mac10.7', 'WebKit Win', 'WebKit Win (dbg)'];
     var loadedBuilders = [];
     var resourceLoader = new loader.Loader();
     resourceLoader._loadNext = function() {
@@ -67,23 +70,23 @@
 
     var requestFunction = loader.request;
     loader.request = function(url, successCallback, errorCallback) {
-        var builderName = /builder=([\w ]+)&/.exec(url)[1];
+        var builderName = /builder=([\w ().]+)&/.exec(url)[1];
         loadedBuilders.push(builderName);
         successCallback({responseText: '{"version": 4, "' + builderName + '": {"secondsSinceEpoch": [' + Date.now() + '], "tests": {}}}'});
     }
 
-    g_builders = {"WebKit Linux": true, "WebKit Win": true};
-
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
+ 
     try {
         resourceLoader._loadResultsFiles();
     } finally {
-        g_builders = undefined;
-        g_resultsByBuilder = undefined;
         loader.request = requestFunction;
     }
 });
 
 test('expectations files loading', 1, function() {
+    resetGlobals();
+    g_history.parseCrossDashboardParameters();
     var expectedLoadedPlatforms = ["chromium", "chromium-android", "efl", "efl-wk1", "efl-wk2", "gtk",
                                    "gtk-wk2", "mac", "mac-lion", "mac-snowleopard", "qt", "win", "wk2"];
     var loadedPlatforms = [];
@@ -104,3 +107,68 @@
         loader.request = requestFunction;
     }
 });
+
+test('results file failing to load', 2, function() {
+    resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
+    
+    var resourceLoader = new loader.Loader();
+    var resourceLoadCount = 0;
+    resourceLoader._handleResourceLoad = function() {
+        resourceLoadCount++;
+    }
+
+    var builder1 = 'builder1';
+    currentBuilders()[builder1] = true;
+    resourceLoader._handleResultsFileLoadError(builder1);
+
+    var builder2 = 'builder2';
+    currentBuilders()[builder2] = true;
+    resourceLoader._handleResultsFileLoadError(builder2);
+
+    deepEqual(resourceLoader._buildersThatFailedToLoad, [builder1, builder2]);
+    equal(resourceLoadCount, 2);
+
+});
+
+test('Default builder gets set.', 3, function() {
+    resetGlobals();
+    loadBuildersList('@ToT - chromium.org', 'layout-tests');
+    
+    var defaultBuilder = currentBuilderGroup().defaultBuilder();
+    ok(defaultBuilder, "Default builder should exist.");
+   
+    // Simulate error loading the default builder data, then make sure
+    // a new defaultBuilder is set, and isn't the now invalid one.
+    var resourceLoader = new loader.Loader();
+    resourceLoader._handleResultsFileLoadError(defaultBuilder);
+    var newDefaultBuilder = currentBuilderGroup().defaultBuilder();
+    ok(newDefaultBuilder, "There should still be a default builder.");
+    notEqual(newDefaultBuilder, defaultBuilder, "Default builder should not be the old default builder");
+});
+
+test('addBuilderLoadErrors', 1, function() {
+    var resourceLoader = new loader.Loader();
+    resourceLoader._buildersThatFailedToLoad = ['builder1', 'builder2'];
+    resourceLoader._staleBuilders = ['staleBuilder1'];
+    resourceLoader._addErrors();
+    equal(resourceLoader._errors._messages, 'ERROR: Failed to get data from builder1,builder2.<br>ERROR: Data from staleBuilder1 is more than 1 day stale.<br>');
+});
+
+
+test('flattenTrie', 1, function() {
+    resetGlobals();
+    var tests = {
+        'bar.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
+        'foo': {
+            'bar': {
+                'baz.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
+            }
+        }
+    };
+    var expectedFlattenedTests = {
+        'bar.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
+        'foo/bar/baz.html': {'results': [[100, 'F']], 'times': [[100, 0]]},
+    };
+    equal(JSON.stringify(loader.Loader._flattenTrie(tests)), JSON.stringify(expectedFlattenedTests))
+});
diff --git a/Tools/TestResultServer/static-dashboards/run-embedded-unittests.html b/Tools/TestResultServer/static-dashboards/run-embedded-unittests.html
index 835be21..161ecbb 100644
--- a/Tools/TestResultServer/static-dashboards/run-embedded-unittests.html
+++ b/Tools/TestResultServer/static-dashboards/run-embedded-unittests.html
@@ -40,28 +40,33 @@
 <link rel="stylesheet" href="flakiness_dashboard.css"></link>
 <link rel="stylesheet" href="flakiness_dashboard_tests.css"></link>
 <script src="builders.js"></script>
+<script src="builders_unittests.js"></script>
 
 <script>
-// Don't request the actual builders off the bots when running unittests.
-function loadBuildersList() {};
-function g_handleBuildersListLoaded() {};
-
 // Mimic being embedded. All our embedded checks compare window and parent.
 window.parent = null;
 </script>
 
+<script src="string.js"></script>
+<script src="history.js"></script>
+<script src="history_unittests.js"></script>
 <script src="dashboard_base.js"></script>
+<script src="ui.js"></script>
+<script src="loader.js"></script>
+<script src="loader_unittests.js"></script>
+<script>
+  // Mock out loader.request so that we don't actually make xhrs for tests.
+  loader.request = function(url, successCallback, errorCallback) {};
+</script>
 <script src="flakiness_dashboard.js"></script>
 
 <script>
 window.location.href = '#useTestData=true';
-var builderGroup = '@ToT - chromium.org';
-var builders = {'Webkit Linux': '', 'Webkit Linux (dbg)': '', 'Webkit Mac10.7': '', 'Webkit Win': ''};
-onBuilderListLoad(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumWebkitTipOfTreeTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, builderGroup, BuilderGroup.TOT_WEBKIT, builders);
-initBuilders();
 </script>
 
-<!-- FIXME: Split this up into multiple unittest.js, e.g. one for builders.js and one for dashboard_base.js. -->
 <script src="flakiness_dashboard_embedded_unittests.js"></script>
+<!-- FIXME: Split this up into multiple unittest.js, e.g. one for builders.js and one for dashboard_base.js. -->
+<script src="flakiness_dashboard_unittests.js"></script>
+
 </body>
 </html>
diff --git a/Tools/TestResultServer/static-dashboards/run-unittests.html b/Tools/TestResultServer/static-dashboards/run-unittests.html
index 9999c71..d33c655 100644
--- a/Tools/TestResultServer/static-dashboards/run-unittests.html
+++ b/Tools/TestResultServer/static-dashboards/run-unittests.html
@@ -40,28 +40,25 @@
 <link rel="stylesheet" href="flakiness_dashboard.css"></link>
 <link rel="stylesheet" href="flakiness_dashboard_tests.css"></link>
 <script src="builders.js"></script>
-
-<script>
-// Don't request the actual builders off the bots when running unittests.
-function loadBuildersList() {};
-</script>
-
+<script src="builders_unittests.js"></script>
+<script src="string.js"></script>
+<script src="history.js"></script>
+<script src="history_unittests.js"></script>
 <script src="dashboard_base.js"></script>
+<script src="ui.js"></script>
 <script src="loader.js"></script>
+<script src="loader_unittests.js"></script>
+<script>
+  // Mock out loader.request so that we don't actually make xhrs for tests.
+  loader.request = function(url, successCallback, errorCallback) {};
+</script>
 <script src="flakiness_dashboard.js"></script>
 
 <script>
 window.location.href = '#useTestData=true';
-var groupName = '@ToT - chromium.org';
-var builders = '{"WebKit Linux": true, "WebKit Linux (dbg)": true, "WebKit Mac10.7": true, "WebKit Win": true}';
-LAYOUT_TESTS_BUILDER_GROUPS[groupName] = new BuilderGroup(BuilderGroup.TOT_WEBKIT);
-LAYOUT_TESTS_BUILDER_GROUPS[groupName].expectedGroups = 4;
-onBuilderListLoad(LAYOUT_TESTS_BUILDER_GROUPS, isChromiumWebkitTipOfTreeTestRunner, CHROMIUM_WEBKIT_BUILDER_MASTER, groupName, {responseText: builders});
-initBuilders();
 </script>
 
 <!-- FIXME: Split this up into multiple unittest.js, e.g. one for builders.js and one for dashboard_base.js. -->
 <script src="flakiness_dashboard_unittests.js"></script>
-<script src="loader_unittests.js"></script>
 </body>
 </html>
diff --git a/Tools/TestResultServer/static-dashboards/string.js b/Tools/TestResultServer/static-dashboards/string.js
new file mode 100644
index 0000000..3e1f7f9
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/string.js
@@ -0,0 +1,69 @@
+// Copyright (C) 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//         * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//         * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//         * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// @fileoverview Generic string utility functions.
+var string = string || {};
+
+(function() {
+
+string.contains = function(a, b)
+{
+    return a.indexOf(b) != -1;
+}
+
+string.caseInsensitiveContains = function(a, b)
+{
+    return a.match(new RegExp(b, 'i'));
+}
+
+string.startsWith = function(a, b)
+{
+    return a.indexOf(b) == 0;
+}
+
+string.endsWith = function(a, b)
+{
+    return a.lastIndexOf(b) == a.length - b.length;
+}
+
+string.isValidName = function(str)
+{
+    return str.match(/[A-Za-z0-9\-\_,]/);
+}
+
+string.trimString = function(str)
+{
+    return str.replace(/^\s+|\s+$/g, '');
+}
+
+string.collapseWhitespace = function(str)
+{
+    return str.replace(/\s+/g, ' ');
+}
+
+})();
\ No newline at end of file
diff --git a/Tools/TestResultServer/static-dashboards/timeline_explorer.html b/Tools/TestResultServer/static-dashboards/timeline_explorer.html
index b3fa41b..05d2b51 100644
--- a/Tools/TestResultServer/static-dashboards/timeline_explorer.html
+++ b/Tools/TestResultServer/static-dashboards/timeline_explorer.html
@@ -98,355 +98,11 @@
 <script src="dygraph-combined.js"></script>
 <script src="builders.js"></script>
 <script src="loader.js"></script>
+<script src="string.js"></script>
+<script src="history.js"></script>
 <script src="dashboard_base.js"></script>
-<script>
-var FAILING_TESTS_DATASET_NAME = 'Failing tests';
-
-var g_dygraph;
-var g_buildIndicesByTimestamp = {};
-var g_currentBuildIndex = -1;
-var g_currentBuilderTestResults;
-
-//////////////////////////////////////////////////////////////////////////////
-// Methods and objects from dashboard_base.js to override.
-//////////////////////////////////////////////////////////////////////////////
-function generatePage()
-{
-    g_buildIndicesByTimestamp = {};
-    var results = g_resultsByBuilder[g_currentState.builder];
-
-    for (var i = 0; i < results[FIXABLE_COUNTS_KEY].length; i++) {
-        var buildDate = new Date(results[TIMESTAMPS_KEY][i] * 1000);
-        g_buildIndicesByTimestamp[buildDate.getTime()] = i;
-    }
-
-    if (g_currentState.buildTimestamp != -1 && g_currentState.buildTimestamp in g_buildIndicesByTimestamp) {
-        var newBuildIndex = g_buildIndicesByTimestamp[g_currentState.buildTimestamp];
-
-        if (newBuildIndex == g_currentBuildIndex) {
-            // This happens when selectBuild is called, which updates the UI
-            // immediately, in addition to updating the location hash (we don't
-            // just rely on the hash change since we don't want to regenerate the
-            // whole page just because the user clicked on something)
-            return;
-        } else if (newBuildIndex)
-            g_currentBuildIndex = newBuildIndex;
-    }
-
-    initCurrentBuilderTestResults();
-
-    $('test-type-switcher').innerHTML = htmlForTestTypeSwitcher( false,
-        checkboxHTML('ignoreFlakyTests', 'Ignore flaky tests', g_currentState.ignoreFlakyTests, 'g_currentBuildIndex = -1')
-    );
-
-    updateTimelineForBuilder();
-}
-
-function initCurrentBuilderTestResults()
-{
-    var startTime = Date.now();
-    g_currentBuilderTestResults = decompressResults(g_resultsByBuilder[g_currentState.builder]);
-    console.log( 'Time to get test results by build: ' + (Date.now() - startTime));
-}
-
-function handleValidHashParameter(key, value)
-{
-    switch(key) {
-    case 'buildTimestamp':
-        g_currentState.buildTimestamp = parseInt(value, 10);
-        return true;
-    case 'ignoreFlakyTests':
-        g_currentState.ignoreFlakyTests = value == 'true';
-        return true;
-    default:
-        return false;
-    }
-}
-
-g_defaultDashboardSpecificStateValues = {
-    buildTimestamp: -1,
-    ignoreFlakyTests: true
-};
-
-function shouldShowWebKitRevisionsOnly()
-{
-    return isTipOfTreeWebKitBuilder();
-}
-
-function updateTimelineForBuilder()
-{
-    var builder = g_currentState.builder;
-    var results = g_resultsByBuilder[builder];
-    var graphData = [];
-
-    var annotations = [];
-
-    // Dygraph prefers to be handed data in chronological order.
-    for (var i = results[FIXABLE_COUNTS_KEY].length - 1; i >= 0; i--) {
-        var buildDate = new Date(results[TIMESTAMPS_KEY][i] * 1000);
-        // FIXME: Find a better way to exclude outliers. This is just so we
-        // exclude runs where every test failed.
-        var failureCount = Math.min(results[FIXABLE_COUNT_KEY][i], 10000);
-
-        if (g_currentState.ignoreFlakyTests)
-            failureCount -= g_currentBuilderTestResults.flakyDeltasByBuild[i].total || 0;
-
-        graphData.push([buildDate, failureCount]);
-
-        if (!shouldShowWebKitRevisionsOnly() && (results[WEBKIT_REVISIONS_KEY][i] != results[WEBKIT_REVISIONS_KEY][i + 1])) {
-            annotations.push({
-                series: FAILING_TESTS_DATASET_NAME,
-                x: buildDate,
-                shortText: 'R',
-                text: 'WebKit roll: r' + results[WEBKIT_REVISIONS_KEY][i + 1] + ' to ' + results[WEBKIT_REVISIONS_KEY][i]
-            });
-        }
-    }
-
-    var windowWidth = document.documentElement.clientWidth;
-    var windowHeight = document.documentElement.clientHeight;
-    var switcherNode = $('test-type-switcher');
-    var inspectorNode = $('inspector-container');
-    var graphWidth = windowWidth - 20 - inspectorNode.offsetWidth;
-    var graphHeight = windowHeight - switcherNode.offsetTop - switcherNode.offsetHeight - 20;
-
-    var containerNode = $('timeline-container');
-    containerNode.style.height = graphHeight + 'px';
-    containerNode.style.width = graphWidth + 'px';
-    inspectorNode.style.height = graphHeight + 'px';
-
-    g_dygraph = new Dygraph(
-        containerNode,
-        graphData, {
-            labels: ['Date', FAILING_TESTS_DATASET_NAME],
-            width: graphWidth,
-            height: graphHeight,
-            clickCallback: function(event, date) {
-                selectBuild(results, builder, g_dygraph, g_buildIndicesByTimestamp[date]);
-            },
-            drawCallback: function(dygraph, isInitial) {
-                if (isInitial)
-                    return;
-                updateBuildIndicator(results, dygraph);
-            },
-            // xValueParser is necessary for annotations to work, even though we
-            // already have Date instances
-            xValueParser: function(input) { return input.getTime(); }
-        });
-    if (annotations.length)
-        g_dygraph.setAnnotations(annotations);
-
-    inspectorNode.style.visibility = 'visible';
-
-    if (g_currentBuildIndex != -1)
-        selectBuild(results, builder, g_dygraph, g_currentBuildIndex);
-}
-
-function selectBuild(results, builder, dygraph, index)
-{
-    g_currentBuildIndex = index;
-    updateBuildIndicator(results, dygraph);
-    updateBuildInspector(results, builder, dygraph, index);
-    setQueryParameter('buildTimestamp', results[TIMESTAMPS_KEY][index] * 1000);
-}
-
-function updateBuildIndicator(results, dygraph)
-{
-    var indicatorNode = $('indicator');
-
-    if (!indicatorNode) {
-        var containerNode = $('timeline-container');
-        indicatorNode = document.createElement('div');
-        indicatorNode.id = 'indicator';
-        indicatorNode.style.height = containerNode.offsetHeight + 'px';
-        containerNode.appendChild(indicatorNode);
-    }
-
-    if (g_currentBuildIndex == -1)
-        indicatorNode.style.display = 'none';
-    else {
-        indicatorNode.style.display = 'block';
-        var buildDate = new Date(results[TIMESTAMPS_KEY][g_currentBuildIndex] * 1000);
-        var domCoords = dygraph.toDomCoords(buildDate, 0);
-        indicatorNode.style.left = domCoords[0] + 'px';
-    }
-}
-
-function updateBuildInspector(results, builder, dygraph, index)
-{
-    var html = '<table id="inspector-table"><caption>Details</caption>';
-
-    function addRow(label, value)
-    {
-        html += '<tr><td class="label">' + label + '</td><td>' + value + '</td></tr>';
-    }
-
-    // Builder and results links
-    var buildNumber = results[BUILD_NUMBERS_KEY][index];
-    addRow('', '');
-    var master = builderMaster(builder);
-    var buildUrl = master.logPath(builder, results[BUILD_NUMBERS_KEY][index]);
-    if (master == WEBKIT_BUILDER_MASTER) {
-        var resultsUrl = 'http://build.webkit.org/results/' + builder + '/r' + results[WEBKIT_REVISIONS_KEY][index] +
-            ' (' + results[BUILD_NUMBERS_KEY][index] + ')';
-    } else {
-        var resultsUrl = 'http://build.chromium.org/f/chromium/layout_test_results/' +
-            g_builders[builder] + '/' + results[CHROME_REVISIONS_KEY][index];
-    }
-
-    addRow('Build:', '<a href="' + buildUrl + '" target="_blank">' + buildNumber + '</a> (<a href="' + resultsUrl + '" target="_blank">results</a>)');
-
-    // Revision link(s)
-    if (!shouldShowWebKitRevisionsOnly())
-        addRow('Chromium change:', chromiumRevisionLink(results, index));
-    addRow('WebKit change:', webKitRevisionLink(results, index));
-
-    // Test status/counts
-    addRow('', '');
-
-    function addNumberRow(label, currentValue, previousValue)
-    {
-        var delta = currentValue - previousValue;
-        var deltaText = ''
-        if (delta < 0)
-            deltaText = ' <span class="delta negative">' + delta + '</span>';
-        else if (delta > 0)
-            deltaText = ' <span class="delta positive">+' + delta + '</span>';
-
-        addRow(label, currentValue + deltaText);
-    }
-
-    var expectations = expectationsMap();
-    var flakyDeltasByBuild = g_currentBuilderTestResults.flakyDeltasByBuild;
-    for (var expectationKey in expectations) {
-        if (expectationKey in results[FIXABLE_COUNTS_KEY][index]) {
-            var currentCount = results[FIXABLE_COUNTS_KEY][index][expectationKey];
-            var previousCount = results[FIXABLE_COUNTS_KEY][index + 1][expectationKey];
-            if (g_currentState.ignoreFlakyTests) {
-                currentCount -= flakyDeltasByBuild[index][expectationKey] || 0;
-                previousCount -= flakyDeltasByBuild[index + 1][expectationKey] || 0;
-            }
-            addNumberRow(expectations[expectationKey], currentCount, previousCount);
-        }
-    }
-
-    var currentTotal = results[FIXABLE_COUNT_KEY][index];
-    var previousTotal = results[FIXABLE_COUNT_KEY][index + 1];
-    if (g_currentState.ignoreFlakyTests) {
-        currentTotal -= flakyDeltasByBuild[index].total || 0;
-        previousTotal -= flakyDeltasByBuild[index + 1].total || 0;
-    }
-    addNumberRow('Total failing tests:', currentTotal, previousTotal);
-
-    html += '</table>';
-
-    html += '<div id="changes-button" class="buttons">';
-    html += '<button>Show changed test results</button>';
-    html += '</div>';
-
-    html += '<div id="build-buttons" class="buttons">';
-    html += '<button>Previous build</button> <button>Next build</button>';
-    html += '</div>';
-
-    var inspectorNode = $('inspector-container');
-    inspectorNode.innerHTML = html;
-
-    inspectorNode.getElementsByTagName('button')[0].onclick = function() {
-        showResultsDelta(index, buildNumber, buildUrl, resultsUrl);
-    };
-    inspectorNode.getElementsByTagName('button')[1].onclick = function() {
-        selectBuild(results, builder, dygraph, index + 1);
-    };
-    inspectorNode.getElementsByTagName('button')[2].onclick = function() {
-        selectBuild(results, builder, dygraph, index - 1);
-    };
-}
-
-function showResultsDelta(index, buildNumber, buildUrl, resultsUrl)
-{
-    var flakyTests = g_currentBuilderTestResults.flakyTests;
-    var currentResults = g_currentBuilderTestResults.resultsByBuild[index];
-    var testNames = g_currentBuilderTestResults.testNames;
-    var previousResults = g_currentBuilderTestResults.resultsByBuild[index + 1];
-    var expectations = expectationsMap();
-
-    var deltas = {};
-    function addDelta(category, testIndex)
-    {
-        if (g_currentState.ignoreFlakyTests && flakyTests[testIndex])
-            return;
-        if (!(category in deltas))
-            deltas[category] = [];
-        var testName = testNames[testIndex];
-        var flakinessDashboardUrl = 'flakiness_dashboard.html' + (location.hash ? location.hash + '&' : '#') + 'tests=' + testName;
-        var html = '<a href="' + flakinessDashboardUrl + '">' + testName + '</a>';
-        if (flakyTests[testIndex])
-            html += ' <span style="color: #f66">possibly flaky</span>';
-        deltas[category].push(html);
-    }
-
-    for (var testIndex = 0; testIndex < currentResults.length; testIndex++) {
-        if (currentResults[testIndex] === undefined)
-            continue;
-
-        if (previousResults[testIndex] !== undefined) {
-            if (currentResults[testIndex] == previousResults[testIndex])
-                continue;
-            addDelta('Was <b>' + expectations[previousResults[testIndex]] + '</b> now <b>' + expectations[currentResults[testIndex]] + '</b>', testIndex);
-        } else
-            addDelta('Newly <b>' + expectations[currentResults[testIndex]] + '</b>', testIndex);
-    }
-
-    for (var testIndex = 0; testIndex < previousResults.length; testIndex++) {
-        if (previousResults[testIndex] === undefined)
-            continue;
-        if (currentResults[testIndex] === undefined)
-            addDelta('Was <b>' + expectations[previousResults[testIndex]] + '</b>', testIndex);
-    }
-
-    var html = '';
-
-    html += '<head><base target="_blank"></head>';
-    html += '<h1>Changes in test results</h1>';
-
-    html += '<p>For build <a href="' + buildUrl + '" target="_blank">' +
-        buildNumber + '</a> ' + '(<a href="' + resultsUrl +
-        '" target="_blank">results</a>)</p>';
-
-    for (var deltaCategory in deltas) {
-        html += '<p><div>' + deltaCategory + ' (' + deltas[deltaCategory].length + ')</div><ul>';
-        deltas[deltaCategory].forEach(function(deltaHtml) {
-            html += '<li>' + deltaHtml + '</li>';
-        });
-        html += '</ul></p>';
-    }
-
-    var deltaWindow = window.open();
-    deltaWindow.document.write(html);
-}
-
-document.addEventListener('keydown', function(e) {
-    if (g_currentBuildIndex == -1)
-        return;
-
-    switch (e.keyIdentifier) {
-    case 'Left':
-        selectBuild(
-            g_resultsByBuilder[g_currentState.builder],
-            g_currentState.builder,
-            g_dygraph,
-            g_currentBuildIndex + 1);
-        break;
-    case 'Right':
-        selectBuild(
-            g_resultsByBuilder[g_currentState.builder],
-            g_currentState.builder,
-            g_dygraph,
-            g_currentBuildIndex - 1);
-        break;
-    }
-});
-</script>
+<script src="timeline_explorer.js"></script>
+<script src="ui.js"></script>
 </head>
 <body>
     <div id="test-type-switcher"></div>
diff --git a/Tools/TestResultServer/static-dashboards/timeline_explorer.js b/Tools/TestResultServer/static-dashboards/timeline_explorer.js
new file mode 100644
index 0000000..dd498bd
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/timeline_explorer.js
@@ -0,0 +1,493 @@
+// Copyright (C) 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+var FAILING_TESTS_DATASET_NAME = 'Failing tests';
+
+var g_dygraph;
+var g_buildIndicesByTimestamp = {};
+var g_currentBuildIndex = -1;
+var g_currentBuilderTestResults;
+
+//////////////////////////////////////////////////////////////////////////////
+// Methods and objects from dashboard_base.js to override.
+//////////////////////////////////////////////////////////////////////////////
+function generatePage()
+{
+    g_buildIndicesByTimestamp = {};
+    var results = g_resultsByBuilder[g_history.dashboardSpecificState.builder || currentBuilderGroup().defaultBuilder()];
+
+    for (var i = 0; i < results[FIXABLE_COUNTS_KEY].length; i++) {
+        var buildDate = new Date(results[TIMESTAMPS_KEY][i] * 1000);
+        g_buildIndicesByTimestamp[buildDate.getTime()] = i;
+    }
+
+    if (g_history.dashboardSpecificState.buildTimestamp != -1 && g_history.dashboardSpecificState.buildTimestamp in g_buildIndicesByTimestamp) {
+        var newBuildIndex = g_buildIndicesByTimestamp[g_history.dashboardSpecificState.buildTimestamp];
+
+        if (newBuildIndex == g_currentBuildIndex) {
+            // This happens when selectBuild is called, which updates the UI
+            // immediately, in addition to updating the location hash (we don't
+            // just rely on the hash change since we don't want to regenerate the
+            // whole page just because the user clicked on something)
+            return;
+        } else if (newBuildIndex)
+            g_currentBuildIndex = newBuildIndex;
+    }
+
+    initCurrentBuilderTestResults();
+
+    $('test-type-switcher').innerHTML = ui.html.testTypeSwitcher( false,
+        ui.html.checkbox('ignoreFlakyTests', 'Ignore flaky tests', g_history.dashboardSpecificState.ignoreFlakyTests, 'g_currentBuildIndex = -1')
+    );
+
+    updateTimelineForBuilder();
+}
+
+function initCurrentBuilderTestResults()
+{
+    var startTime = Date.now();
+    g_currentBuilderTestResults = _decompressResults(g_resultsByBuilder[g_history.dashboardSpecificState.builder || currentBuilderGroup().defaultBuilder()]);
+    console.log( 'Time to get test results by build: ' + (Date.now() - startTime));
+}
+
+function handleValidHashParameter(key, value)
+{
+    switch(key) {
+    case 'builder':
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
+            function() { return value in currentBuilders(); });
+        return true;
+    case 'buildTimestamp':
+        g_history.dashboardSpecificState.buildTimestamp = parseInt(value, 10);
+        return true;
+    case 'ignoreFlakyTests':
+        g_history.dashboardSpecificState.ignoreFlakyTests = value == 'true';
+        return true;
+    default:
+        return false;
+    }
+}
+
+g_defaultDashboardSpecificStateValues = {
+    builder: null,
+    buildTimestamp: -1,
+    ignoreFlakyTests: true
+};
+
+DB_SPECIFIC_INVALIDATING_PARAMETERS = {
+    'testType': 'builder',
+    'group': 'builder'
+};
+
+function shouldShowWebKitRevisionsOnly()
+{
+    return isTipOfTreeWebKitBuilder();
+}
+
+function updateTimelineForBuilder()
+{
+    var builder = g_history.dashboardSpecificState.builder || currentBuilderGroup().defaultBuilder();
+    var results = g_resultsByBuilder[builder];
+    var graphData = [];
+
+    var annotations = [];
+
+    // Dygraph prefers to be handed data in chronological order.
+    for (var i = results[FIXABLE_COUNTS_KEY].length - 1; i >= 0; i--) {
+        var buildDate = new Date(results[TIMESTAMPS_KEY][i] * 1000);
+        // FIXME: Find a better way to exclude outliers. This is just so we
+        // exclude runs where every test failed.
+        var failureCount = Math.min(results[FIXABLE_COUNT_KEY][i], 10000);
+
+        if (g_history.dashboardSpecificState.ignoreFlakyTests)
+            failureCount -= g_currentBuilderTestResults.flakyDeltasByBuild[i].total || 0;
+
+        graphData.push([buildDate, failureCount]);
+
+        if (!shouldShowWebKitRevisionsOnly() && (results[WEBKIT_REVISIONS_KEY][i] != results[WEBKIT_REVISIONS_KEY][i + 1])) {
+            annotations.push({
+                series: FAILING_TESTS_DATASET_NAME,
+                x: buildDate,
+                shortText: 'R',
+                text: 'WebKit roll: r' + results[WEBKIT_REVISIONS_KEY][i + 1] + ' to ' + results[WEBKIT_REVISIONS_KEY][i]
+            });
+        }
+    }
+
+    var windowWidth = document.documentElement.clientWidth;
+    var windowHeight = document.documentElement.clientHeight;
+    var switcherNode = $('test-type-switcher');
+    var inspectorNode = $('inspector-container');
+    var graphWidth = windowWidth - 20 - inspectorNode.offsetWidth;
+    var graphHeight = windowHeight - switcherNode.offsetTop - switcherNode.offsetHeight - 20;
+
+    var containerNode = $('timeline-container');
+    containerNode.style.height = graphHeight + 'px';
+    containerNode.style.width = graphWidth + 'px';
+    inspectorNode.style.height = graphHeight + 'px';
+
+    g_dygraph = new Dygraph(
+        containerNode,
+        graphData, {
+            labels: ['Date', FAILING_TESTS_DATASET_NAME],
+            width: graphWidth,
+            height: graphHeight,
+            clickCallback: function(event, date) {
+                selectBuild(results, builder, g_dygraph, g_buildIndicesByTimestamp[date]);
+            },
+            drawCallback: function(dygraph, isInitial) {
+                if (isInitial)
+                    return;
+                updateBuildIndicator(results, dygraph);
+            },
+            // xValueParser is necessary for annotations to work, even though we
+            // already have Date instances
+            xValueParser: function(input) { return input.getTime(); }
+        });
+    if (annotations.length)
+        g_dygraph.setAnnotations(annotations);
+
+    inspectorNode.style.visibility = 'visible';
+
+    if (g_currentBuildIndex != -1)
+        selectBuild(results, builder, g_dygraph, g_currentBuildIndex);
+}
+
+function selectBuild(results, builder, dygraph, index)
+{
+    g_currentBuildIndex = index;
+    updateBuildIndicator(results, dygraph);
+    updateBuildInspector(results, builder, dygraph, index);
+    g_history.setQueryParameter('buildTimestamp', results[TIMESTAMPS_KEY][index] * 1000);
+}
+
+function updateBuildIndicator(results, dygraph)
+{
+    var indicatorNode = $('indicator');
+
+    if (!indicatorNode) {
+        var containerNode = $('timeline-container');
+        indicatorNode = document.createElement('div');
+        indicatorNode.id = 'indicator';
+        indicatorNode.style.height = containerNode.offsetHeight + 'px';
+        containerNode.appendChild(indicatorNode);
+    }
+
+    if (g_currentBuildIndex == -1)
+        indicatorNode.style.display = 'none';
+    else {
+        indicatorNode.style.display = 'block';
+        var buildDate = new Date(results[TIMESTAMPS_KEY][g_currentBuildIndex] * 1000);
+        var domCoords = dygraph.toDomCoords(buildDate, 0);
+        indicatorNode.style.left = domCoords[0] + 'px';
+    }
+}
+
+function updateBuildInspector(results, builder, dygraph, index)
+{
+    var html = '<table id="inspector-table"><caption>Details</caption>';
+
+    function addRow(label, value)
+    {
+        html += '<tr><td class="label">' + label + '</td><td>' + value + '</td></tr>';
+    }
+
+    // Builder and results links
+    var buildNumber = results[BUILD_NUMBERS_KEY][index];
+    addRow('', '');
+    var master = builderMaster(builder);
+    var buildUrl = master.logPath(builder, results[BUILD_NUMBERS_KEY][index]);
+    if (master.name == WEBKIT_BUILDER_MASTER) {
+        var resultsUrl = 'http://build.webkit.org/results/' + builder + '/r' + results[WEBKIT_REVISIONS_KEY][index] +
+            ' (' + results[BUILD_NUMBERS_KEY][index] + ')';
+    } else {
+        var resultsUrl = 'http://build.chromium.org/f/chromium/layout_test_results/' +
+            currentBuilders()[builder] + '/' + results[CHROME_REVISIONS_KEY][index];
+    }
+
+    addRow('Build:', '<a href="' + buildUrl + '" target="_blank">' + buildNumber + '</a> (<a href="' + resultsUrl + '" target="_blank">results</a>)');
+
+    // Revision link(s)
+    if (!shouldShowWebKitRevisionsOnly())
+        addRow('Chromium change:', ui.html.chromiumRevisionLink(results, index));
+    addRow('WebKit change:', ui.html.webKitRevisionLink(results, index));
+
+    // Test status/counts
+    addRow('', '');
+
+    function addNumberRow(label, currentValue, previousValue)
+    {
+        var delta = currentValue - previousValue;
+        var deltaText = ''
+        if (delta < 0)
+            deltaText = ' <span class="delta negative">' + delta + '</span>';
+        else if (delta > 0)
+            deltaText = ' <span class="delta positive">+' + delta + '</span>';
+
+        addRow(label, currentValue + deltaText);
+    }
+
+    var expectations = expectationsMap();
+    var flakyDeltasByBuild = g_currentBuilderTestResults.flakyDeltasByBuild;
+    for (var expectationKey in expectations) {
+        if (expectationKey in results[FIXABLE_COUNTS_KEY][index]) {
+            var currentCount = results[FIXABLE_COUNTS_KEY][index][expectationKey];
+            var previousCount = results[FIXABLE_COUNTS_KEY][index + 1][expectationKey];
+            if (g_history.dashboardSpecificState.ignoreFlakyTests) {
+                currentCount -= flakyDeltasByBuild[index][expectationKey] || 0;
+                previousCount -= flakyDeltasByBuild[index + 1][expectationKey] || 0;
+            }
+            addNumberRow(expectations[expectationKey], currentCount, previousCount);
+        }
+    }
+
+    var currentTotal = results[FIXABLE_COUNT_KEY][index];
+    var previousTotal = results[FIXABLE_COUNT_KEY][index + 1];
+    if (g_history.dashboardSpecificState.ignoreFlakyTests) {
+        currentTotal -= flakyDeltasByBuild[index].total || 0;
+        previousTotal -= flakyDeltasByBuild[index + 1].total || 0;
+    }
+    addNumberRow('Total failing tests:', currentTotal, previousTotal);
+
+    html += '</table>';
+
+    html += '<div id="changes-button" class="buttons">';
+    html += '<button>Show changed test results</button>';
+    html += '</div>';
+
+    html += '<div id="build-buttons" class="buttons">';
+    html += '<button>Previous build</button> <button>Next build</button>';
+    html += '</div>';
+
+    var inspectorNode = $('inspector-container');
+    inspectorNode.innerHTML = html;
+
+    inspectorNode.getElementsByTagName('button')[0].onclick = function() {
+        showResultsDelta(index, buildNumber, buildUrl, resultsUrl);
+    };
+    inspectorNode.getElementsByTagName('button')[1].onclick = function() {
+        selectBuild(results, builder, dygraph, index + 1);
+    };
+    inspectorNode.getElementsByTagName('button')[2].onclick = function() {
+        selectBuild(results, builder, dygraph, index - 1);
+    };
+}
+
+function showResultsDelta(index, buildNumber, buildUrl, resultsUrl)
+{
+    var flakyTests = g_currentBuilderTestResults.flakyTests;
+    var currentResults = g_currentBuilderTestResults.resultsByBuild[index];
+    var testNames = g_currentBuilderTestResults.testNames;
+    var previousResults = g_currentBuilderTestResults.resultsByBuild[index + 1];
+    var expectations = expectationsMap();
+
+    var deltas = {};
+    function addDelta(category, testIndex)
+    {
+        if (g_history.dashboardSpecificState.ignoreFlakyTests && flakyTests[testIndex])
+            return;
+        if (!(category in deltas))
+            deltas[category] = [];
+        var testName = testNames[testIndex];
+        var flakinessDashboardUrl = 'flakiness_dashboard.html' + (location.hash ? location.hash + '&' : '#') + 'tests=' + testName;
+        var html = '<a href="' + flakinessDashboardUrl + '">' + testName + '</a>';
+        if (flakyTests[testIndex])
+            html += ' <span style="color: #f66">possibly flaky</span>';
+        deltas[category].push(html);
+    }
+
+    for (var testIndex = 0; testIndex < currentResults.length; testIndex++) {
+        if (currentResults[testIndex] === undefined)
+            continue;
+
+        if (previousResults[testIndex] !== undefined) {
+            if (currentResults[testIndex] == previousResults[testIndex])
+                continue;
+            addDelta('Was <b>' + expectations[previousResults[testIndex]] + '</b> now <b>' + expectations[currentResults[testIndex]] + '</b>', testIndex);
+        } else
+            addDelta('Newly <b>' + expectations[currentResults[testIndex]] + '</b>', testIndex);
+    }
+
+    for (var testIndex = 0; testIndex < previousResults.length; testIndex++) {
+        if (previousResults[testIndex] === undefined)
+            continue;
+        if (currentResults[testIndex] === undefined)
+            addDelta('Was <b>' + expectations[previousResults[testIndex]] + '</b>', testIndex);
+    }
+
+    var html = '';
+
+    html += '<head><base target="_blank"></head>';
+    html += '<h1>Changes in test results</h1>';
+
+    html += '<p>For build <a href="' + buildUrl + '" target="_blank">' +
+        buildNumber + '</a> ' + '(<a href="' + resultsUrl +
+        '" target="_blank">results</a>)</p>';
+
+    for (var deltaCategory in deltas) {
+        html += '<p><div>' + deltaCategory + ' (' + deltas[deltaCategory].length + ')</div><ul>';
+        deltas[deltaCategory].forEach(function(deltaHtml) {
+            html += '<li>' + deltaHtml + '</li>';
+        });
+        html += '</ul></p>';
+    }
+
+    var deltaWindow = window.open();
+    deltaWindow.document.write(html);
+}
+
+var _FAILURE_EXPECTATIONS = {
+    'T': 1,
+    'F': 1,
+    'C': 1,
+    'I': 1,
+    'Z': 1
+};
+
+// "Decompresses" the RLE-encoding of test results so that we can query it
+// by build index and test name.
+//
+// @param {Object} results results for the current builder
+// @return Object with these properties:
+//     - testNames: array mapping test index to test names.
+//     - resultsByBuild: array of builds, for each build a (sparse) array of test results by test index.
+//     - flakyTests: array with the boolean value true at test indices that are considered flaky (more than one single-build failure).
+//     - flakyDeltasByBuild: array of builds, for each build a count of flaky test results by expectation, as well as a total.
+function _decompressResults(builderResults)
+{
+    var builderTestResults = builderResults[TESTS_KEY];
+    var buildCount = builderResults[FIXABLE_COUNTS_KEY].length;
+    var resultsByBuild = new Array(buildCount);
+    var flakyDeltasByBuild = new Array(buildCount);
+
+    // Pre-sizing the test result arrays for each build saves us ~250ms
+    var testCount = 0;
+    for (var testName in builderTestResults)
+        testCount++;
+    for (var i = 0; i < buildCount; i++) {
+        resultsByBuild[i] = new Array(testCount);
+        resultsByBuild[i][testCount - 1] = undefined;
+        flakyDeltasByBuild[i] = {};
+    }
+
+    // Using indices instead of the full test names for each build saves us
+    // ~1500ms
+    var testIndex = 0;
+    var testNames = new Array(testCount);
+    var flakyTests = new Array(testCount);
+
+    // Decompress and "invert" test results (by build instead of by test) and
+    // determine which are flaky.
+    for (var testName in builderTestResults) {
+        var oneBuildFailureCount = 0;
+
+        testNames[testIndex] = testName;
+        var testResults = builderTestResults[testName].results;
+        for (var i = 0, rleResult, currentBuildIndex = 0; (rleResult = testResults[i]) && currentBuildIndex < buildCount; i++) {
+            var count = rleResult[RLE.LENGTH];
+            var value = rleResult[RLE.VALUE];
+
+            if (count == 1 && value in _FAILURE_EXPECTATIONS)
+                oneBuildFailureCount++;
+
+            for (var j = 0; j < count; j++) {
+                resultsByBuild[currentBuildIndex++][testIndex] = value;
+                if (currentBuildIndex == buildCount)
+                    break;
+            }
+        }
+
+        if (oneBuildFailureCount > 2)
+            flakyTests[testIndex] = true;
+
+        testIndex++;
+    }
+
+    // Now that we know which tests are flaky, count the test results that are
+    // from flaky tests for each build.
+    testIndex = 0;
+    for (var testName in builderTestResults) {
+        if (!flakyTests[testIndex++])
+            continue;
+
+        var testResults = builderTestResults[testName].results;
+        for (var i = 0, rleResult, currentBuildIndex = 0; (rleResult = testResults[i]) && currentBuildIndex < buildCount; i++) {
+            var count = rleResult[RLE.LENGTH];
+            var value = rleResult[RLE.VALUE];
+
+            for (var j = 0; j < count; j++) {
+                var buildTestResults = flakyDeltasByBuild[currentBuildIndex++];
+                function addFlakyDelta(key)
+                {
+                    if (!(key in buildTestResults))
+                        buildTestResults[key] = 0;
+                    buildTestResults[key]++;
+                }
+                addFlakyDelta(value);
+                if (value != 'P' && value != 'N')
+                    addFlakyDelta('total');
+                if (currentBuildIndex == buildCount)
+                    break;
+            }
+        }
+    }
+
+    return {
+        testNames: testNames,
+        resultsByBuild: resultsByBuild,
+        flakyTests: flakyTests,
+        flakyDeltasByBuild: flakyDeltasByBuild
+    };
+}
+
+document.addEventListener('keydown', function(e) {
+    if (g_currentBuildIndex == -1)
+        return;
+
+    var builder = g_history.dashboardSpecificState.builder || currentBuilderGroup().defaultBuilder();
+    switch (e.keyIdentifier) {
+    case 'Left':
+        selectBuild(
+            g_resultsByBuilder[builder],
+            builder,
+            g_dygraph,
+            g_currentBuildIndex + 1);
+        break;
+    case 'Right':
+        selectBuild(
+            g_resultsByBuilder[builder],
+            builder,
+            g_dygraph,
+            g_currentBuildIndex - 1);
+        break;
+    }
+});
+
+window.addEventListener('load', function() {
+    var resourceLoader = new loader.Loader(intializeHistory);
+    resourceLoader.load();
+}, false);
diff --git a/Tools/TestResultServer/static-dashboards/treemap.html b/Tools/TestResultServer/static-dashboards/treemap.html
index aa7ae43..acf9af9 100644
--- a/Tools/TestResultServer/static-dashboards/treemap.html
+++ b/Tools/TestResultServer/static-dashboards/treemap.html
@@ -109,256 +109,13 @@
 </style>
 <script src="builders.js"></script>
 <script src="loader.js"></script>
+<script src="string.js"></script>
+<script src="history.js"></script>
 <script src="dashboard_base.js"></script>
-<script src='webtreemap.js'></script>
+<script src="ui.js"></script>
+<script src="treemap.js"></script>
+<script src="webtreemap.js"></script>
 
 <div id='header-container'></div>
 <p>Click on a box to zoom in. Click on the outermost box to zoom out. <a href="" onclick="showAverages();return false;">Show averages</a></p>
 <div id='map'></div>
-
-<script>
-var TEST_URL_BASE_PATH = "http://svn.webkit.org/repository/webkit/trunk/";
-
-function humanReadableTime(milliseconds)
-{
-    if (milliseconds < 1000)
-        return Math.floor(milliseconds) + 'ms';
-    else if (milliseconds < 60000)
-        return (milliseconds / 1000).toPrecision(2) + 's';
-
-    var minutes = Math.floor(milliseconds / 60000);
-    var seconds = Math.floor((milliseconds - minutes * 60000) / 1000);
-    return minutes + 'm' + seconds + 's';
-}
-
-// This looks like:
-// { "data": {"$area": (sum of all timings)},
-//   "name": (name of this node),
-//   "children": [ (child nodes, in the same format as this) ] }
-// childCount is added just to be includes in the node's name
-function convertToWebTreemapFormat(treename, tree, path)
-{
-    var total = 0;
-    var childCount = 0;
-    var children = [];
-    for (var name in tree) {
-        var treeNode = tree[name];
-        if (typeof treeNode == "number") {
-            var time = treeNode;
-            var node = {
-                "data": {"$area": time},
-                "name": name + " (" + humanReadableTime(time) + ")"
-            };
-            children.push(node);
-            total += time;
-            childCount++;
-        } else {
-            var newPath = path ? path + '/' + name : name;
-            var subtree = convertToWebTreemapFormat(name, treeNode, newPath);
-            children.push(subtree);
-            total += subtree["data"]["$area"];
-            childCount += subtree["childCount"];
-        }
-    }
-
-    children.sort(function(a, b) {
-        aTime = a.data["$area"]
-        bTime = b.data["$area"]
-        return bTime - aTime;
-    });
-
-    return {
-        "data": {"$area": total},
-        "name": treename + " (" + humanReadableTime(total) + " - " + childCount + " tests)",
-        "children": children,
-        "childCount": childCount,
-        "path": path
-    };
-}
-
-function listOfAllNonLeafNodes(tree, list)
-{
-    if (!tree.children)
-        return;
-
-    if (!list)
-        list = [];
-    list.push(tree);
-
-    tree.children.forEach(function(child) {
-        listOfAllNonLeafNodes(child, list);
-    });
-    return list;
-}
-
-function reverseSortByAverage(list)
-{
-    list.sort(function(a, b) {
-        var avgA = a.data['$area'] / a.childCount;
-        var avgB = b.data['$area'] / b.childCount;
-        return avgB - avgA;
-    });
-}
-
-function showAverages()
-{
-    if (!document.getElementById('map'))
-        return;
-
-    var table = document.createElement('table');
-    table.innerHTML = '<th>directory</th><th># tests</th><th>avg time / test</th>';
-
-    var allNodes = listOfAllNonLeafNodes(g_webTree);
-    reverseSortByAverage(allNodes);
-    allNodes.forEach(function(node) {
-        var average = node.data['$area'] / node.childCount;
-        if (average > 100 && node.childCount != 1) {
-            var tr = document.createElement('tr');
-            tr.innerHTML = '<td></td><td>' + node.childCount + '</td><td>' + humanReadableTime(average) + '</td>';
-            tr.querySelector('td').innerText = node.path;
-            table.appendChild(tr);
-        }
-    });
-
-    var map = document.getElementById('map');
-    map.parentNode.replaceChild(table, map);
-}
-
-var g_isGeneratingPage = false;
-var g_webTree;
-
-function generatePage()
-{
-    $('header-container').innerHTML = htmlForTestTypeSwitcher();
-
-    g_isGeneratingPage = true;
-
-    var rawTree = g_resultsByBuilder[g_currentState.builder];
-    g_webTree = convertToWebTreemapFormat('LayoutTests', rawTree);
-    appendTreemap($('map'), g_webTree);
-
-    if (g_currentState.treemapfocus)
-        focusPath(g_webTree, g_currentState.treemapfocus)
-
-    g_isGeneratingPage = false;
-}
-
-function focusPath(tree, path)
-{
-    var parts = decodeURIComponent(path).split('/');
-    if (extractName(tree) != parts[0]) {
-        console.error('Could not focus tree rooted at ' + parts[0]);
-        return;
-    }
-
-    for (var i = 1; i < parts.length; i++) {
-        var children = tree.children;
-        for (var j = 0; j < children.length; j++) {
-            var child = children[j];
-            if (extractName(child) == parts[i]) {
-                tree = child;
-                focus(tree);
-                break;
-            }
-        }
-        if (j == children.length) {
-            console.error('Could not find tree at ' + parts[i]);
-            break;
-        }
-    }
-
-}
-
-function handleValidHashParameter(key, value)
-{
-    switch(key) {
-    case 'builder':
-        validateParameter(g_currentState, key, value,
-            function() { return value in g_builders; });
-        return true;
-
-    case 'treemapfocus':
-        validateParameter(g_currentState, key, value,
-            function() {
-                // FIXME: There's probably a simpler regexp here. Just trying to match ascii + forward-slash.
-                // e.g. LayoutTests/foo/bar.html
-                return (value.match(/^(\w+\/\w*)*$/));
-            });
-        return true;
-
-    default:
-        return false;
-    }
-}
-
-g_defaultDashboardSpecificStateValues = {
-    treemapfocus: '',
-}
-
-function handleQueryParameterChange(params)
-{
-    for (var param in params) {
-        if (param != 'treemapfocus') {
-            $('map').innerHTML = 'Loading...';
-            return true;
-        }
-    }
-    return false;
-}
-
-// Overrides handleResourceLoadError in dashboard_base.js.
-function handleResourceLoadError(builderName, e)
-{
-    $('map').innerHTML = '<span class=error>Could not load data for ' + builderName + '. ' +
-        'Either there was a server-side error or ' + builderName + ' does not run ' +
-        g_crossDashboardState.testType + '.</span>';
-}
-
-function extractName(node)
-{
-    return node.name.split(' ')[0];
-}
-
-function fullName(node)
-{
-    var buffer = [extractName(node)];
-    while (node.parent) {
-        node = node.parent;
-        buffer.unshift(extractName(node));
-    }
-    return buffer.join('/');
-}
-
-function handleFocus(tree)
-{
-    var currentlyFocusedNode = $('focused-leaf');
-    if (currentlyFocusedNode)
-        currentlyFocusedNode.id = '';
-
-    if (!tree.children)
-        tree.dom.id = 'focused-leaf';
-
-    var name = fullName(tree);
-
-    if (!tree.children && !tree.extraDom && isLayoutTestResults()) {
-        tree.extraDom = document.createElement('pre');
-        tree.extraDom.className = 'extra-dom';
-        tree.dom.appendChild(tree.extraDom);
-
-        loader.request(TEST_URL_BASE_PATH + name,
-            function(xhr) {
-                tree.extraDom.onmousedown = function(e) {
-                    e.stopPropagation();
-                };
-                tree.extraDom.textContent = xhr.responseText;
-            },
-            function (xhr) {
-                tree.extraDom.textContent = "Could not load test."
-        });
-    }
-
-    // We don't want the focus calls during generatePage to try to modify the query state.
-    if (!g_isGeneratingPage)
-        setQueryParameter('treemapfocus', name);
-}
-</script>
diff --git a/Tools/TestResultServer/static-dashboards/treemap.js b/Tools/TestResultServer/static-dashboards/treemap.js
new file mode 100644
index 0000000..a261dfd
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/treemap.js
@@ -0,0 +1,275 @@
+// Copyright (C) 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+var TEST_URL_BASE_PATH = "http://svn.webkit.org/repository/webkit/trunk/";
+
+function humanReadableTime(milliseconds)
+{
+    if (milliseconds < 1000)
+        return Math.floor(milliseconds) + 'ms';
+    else if (milliseconds < 60000)
+        return (milliseconds / 1000).toPrecision(2) + 's';
+
+    var minutes = Math.floor(milliseconds / 60000);
+    var seconds = Math.floor((milliseconds - minutes * 60000) / 1000);
+    return minutes + 'm' + seconds + 's';
+}
+
+// This looks like:
+// { "data": {"$area": (sum of all timings)},
+//   "name": (name of this node),
+//   "children": [ (child nodes, in the same format as this) ] }
+// childCount is added just to be includes in the node's name
+function convertToWebTreemapFormat(treename, tree, path)
+{
+    var total = 0;
+    var childCount = 0;
+    var children = [];
+    for (var name in tree) {
+        var treeNode = tree[name];
+        if (typeof treeNode == "number") {
+            var time = treeNode;
+            var node = {
+                "data": {"$area": time},
+                "name": name + " (" + humanReadableTime(time) + ")"
+            };
+            children.push(node);
+            total += time;
+            childCount++;
+        } else {
+            var newPath = path ? path + '/' + name : name;
+            var subtree = convertToWebTreemapFormat(name, treeNode, newPath);
+            children.push(subtree);
+            total += subtree["data"]["$area"];
+            childCount += subtree["childCount"];
+        }
+    }
+
+    children.sort(function(a, b) {
+        aTime = a.data["$area"]
+        bTime = b.data["$area"]
+        return bTime - aTime;
+    });
+
+    return {
+        "data": {"$area": total},
+        "name": treename + " (" + humanReadableTime(total) + " - " + childCount + " tests)",
+        "children": children,
+        "childCount": childCount,
+        "path": path
+    };
+}
+
+function listOfAllNonLeafNodes(tree, list)
+{
+    if (!tree.children)
+        return;
+
+    if (!list)
+        list = [];
+    list.push(tree);
+
+    tree.children.forEach(function(child) {
+        listOfAllNonLeafNodes(child, list);
+    });
+    return list;
+}
+
+function reverseSortByAverage(list)
+{
+    list.sort(function(a, b) {
+        var avgA = a.data['$area'] / a.childCount;
+        var avgB = b.data['$area'] / b.childCount;
+        return avgB - avgA;
+    });
+}
+
+function showAverages()
+{
+    if (!document.getElementById('map'))
+        return;
+
+    var table = document.createElement('table');
+    table.innerHTML = '<th>directory</th><th># tests</th><th>avg time / test</th>';
+
+    var allNodes = listOfAllNonLeafNodes(g_webTree);
+    reverseSortByAverage(allNodes);
+    allNodes.forEach(function(node) {
+        var average = node.data['$area'] / node.childCount;
+        if (average > 100 && node.childCount != 1) {
+            var tr = document.createElement('tr');
+            tr.innerHTML = '<td></td><td>' + node.childCount + '</td><td>' + humanReadableTime(average) + '</td>';
+            tr.querySelector('td').innerText = node.path;
+            table.appendChild(tr);
+        }
+    });
+
+    var map = document.getElementById('map');
+    map.parentNode.replaceChild(table, map);
+}
+
+var g_isGeneratingPage = false;
+var g_webTree;
+
+function generatePage()
+{
+    $('header-container').innerHTML = ui.html.testTypeSwitcher();
+
+    g_isGeneratingPage = true;
+
+    var rawTree = g_resultsByBuilder[g_history.dashboardSpecificState.builder || currentBuilderGroup().defaultBuilder()];
+    g_webTree = convertToWebTreemapFormat('LayoutTests', rawTree);
+    appendTreemap($('map'), g_webTree);
+
+    if (g_history.dashboardSpecificState.treemapfocus)
+        focusPath(g_webTree, g_history.dashboardSpecificState.treemapfocus)
+
+    g_isGeneratingPage = false;
+}
+
+function focusPath(tree, path)
+{
+    var parts = decodeURIComponent(path).split('/');
+    if (extractName(tree) != parts[0]) {
+        console.error('Could not focus tree rooted at ' + parts[0]);
+        return;
+    }
+
+    for (var i = 1; i < parts.length; i++) {
+        var children = tree.children;
+        for (var j = 0; j < children.length; j++) {
+            var child = children[j];
+            if (extractName(child) == parts[i]) {
+                tree = child;
+                focus(tree);
+                break;
+            }
+        }
+        if (j == children.length) {
+            console.error('Could not find tree at ' + parts[i]);
+            break;
+        }
+    }
+
+}
+
+function handleValidHashParameter(key, value)
+{
+    switch(key) {
+    case 'builder':
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
+            function() { return value in currentBuilders(); });
+        return true;
+
+    case 'treemapfocus':
+        history.validateParameter(g_history.dashboardSpecificState, key, value,
+            function() {
+                // FIXME: There's probably a simpler regexp here. Just trying to match ascii + forward-slash.
+                // e.g. LayoutTests/foo/bar.html
+                return (value.match(/^(\w+\/\w*)*$/));
+            });
+        return true;
+
+    default:
+        return false;
+    }
+}
+
+g_defaultDashboardSpecificStateValues = {
+    builder: null,
+    treemapfocus: '',
+};
+
+DB_SPECIFIC_INVALIDATING_PARAMETERS = {
+    'testType': 'builder',
+    'group': 'builder'
+};
+
+function handleQueryParameterChange(params)
+{
+    for (var param in params) {
+        if (param != 'treemapfocus') {
+            $('map').innerHTML = 'Loading...';
+            return true;
+        }
+    }
+    return false;
+}
+
+function extractName(node)
+{
+    return node.name.split(' ')[0];
+}
+
+function fullName(node)
+{
+    var buffer = [extractName(node)];
+    while (node.parent) {
+        node = node.parent;
+        buffer.unshift(extractName(node));
+    }
+    return buffer.join('/');
+}
+
+function handleFocus(tree)
+{
+    var currentlyFocusedNode = $('focused-leaf');
+    if (currentlyFocusedNode)
+        currentlyFocusedNode.id = '';
+
+    if (!tree.children)
+        tree.dom.id = 'focused-leaf';
+
+    var name = fullName(tree);
+
+    if (!tree.children && !tree.extraDom && g_history.isLayoutTestResults()) {
+        tree.extraDom = document.createElement('pre');
+        tree.extraDom.className = 'extra-dom';
+        tree.dom.appendChild(tree.extraDom);
+
+        loader.request(TEST_URL_BASE_PATH + name,
+            function(xhr) {
+                tree.extraDom.onmousedown = function(e) {
+                    e.stopPropagation();
+                };
+                tree.extraDom.textContent = xhr.responseText;
+            },
+            function (xhr) {
+                tree.extraDom.textContent = "Could not load test."
+        });
+    }
+
+    // We don't want the focus calls during generatePage to try to modify the query state.
+    if (!g_isGeneratingPage)
+        g_history.setQueryParameter('treemapfocus', name);
+}
+
+window.addEventListener('load', function() {
+    var resourceLoader = new loader.Loader(intializeHistory);
+    resourceLoader.load();
+}, false);
diff --git a/Tools/TestResultServer/static-dashboards/ui.js b/Tools/TestResultServer/static-dashboards/ui.js
new file mode 100644
index 0000000..8907986
--- /dev/null
+++ b/Tools/TestResultServer/static-dashboards/ui.js
@@ -0,0 +1,225 @@
+// Copyright (C) 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//         * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//         * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//         * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+var ui = ui || {};
+
+(function() {
+
+ui.popup = {};
+
+ui.popup.hide = function()
+{
+    var popup = $('popup');
+    if (popup) {
+        popup.parentNode.removeChild(popup);
+        document.removeEventListener('mousedown', ui.popup._handleMouseDown, false);
+    }
+}
+
+ui.popup.show = function(target, html)
+{
+    var popup = $('popup');
+    if (!popup) {
+        popup = document.createElement('div');
+        popup.id = 'popup';
+        document.body.appendChild(popup);
+        document.addEventListener('mousedown', ui.popup._handleMouseDown, false);
+    }
+
+    // Set html first so that we can get accurate size metrics on the popup.
+    popup.innerHTML = html;
+
+    var targetRect = target.getBoundingClientRect();
+
+    var x = Math.min(targetRect.left - 10, document.documentElement.clientWidth - popup.offsetWidth);
+    x = Math.max(0, x);
+    popup.style.left = x + document.body.scrollLeft + 'px';
+
+    var y = targetRect.top + targetRect.height;
+    if (y + popup.offsetHeight > document.documentElement.clientHeight)
+        y = targetRect.top - popup.offsetHeight;
+    y = Math.max(0, y);
+    popup.style.top = y + document.body.scrollTop + 'px';
+}
+
+ui.popup._handleMouseDown = function(e) {
+    // Clear the open popup, unless the click was inside the popup.
+    var popup = $('popup');
+    if (popup && e.target != popup && !(popup.compareDocumentPosition(e.target) & 16)) 
+        ui.popup.hide();    
+}
+
+ui.html = {};
+
+ui.html.checkbox = function(queryParameter, label, isChecked, opt_extraJavaScript)
+{
+    var js = opt_extraJavaScript || '';
+    return '<label style="padding-left: 2em">' +
+        '<input type="checkbox" onchange="g_history.toggleQueryParameter(\'' + queryParameter + '\');' + js + '" ' +
+            (isChecked ? 'checked' : '') + '>' + label +
+        '</label> ';
+}
+
+ui.html.select = function(label, queryParameter, options)
+{
+    var html = '<label style="padding-left: 2em">' + label + ': ' +
+        '<select onchange="g_history.setQueryParameter(\'' + queryParameter + '\', this[this.selectedIndex].value)">';
+
+    for (var i = 0; i < options.length; i++) {
+        var value = options[i];
+        html += '<option value="' + value + '" ' +
+            (g_history.queryParameterValue(queryParameter) == value ? 'selected' : '') +
+            '>' + value + '</option>'
+    }
+    html += '</select></label> ';
+    return html;
+}
+
+// Returns the HTML for the select element to switch to different testTypes.
+ui.html.testTypeSwitcher = function(opt_noBuilderMenu, opt_extraHtml, opt_includeNoneBuilder)
+{
+    var html = '<div style="border-bottom:1px dashed">';
+    html += '' +
+        ui.html._dashboardLink('Stats', 'aggregate_results.html') +
+        ui.html._dashboardLink('Timeline', 'timeline_explorer.html') +
+        ui.html._dashboardLink('Results', 'flakiness_dashboard.html') +
+        ui.html._dashboardLink('Treemap', 'treemap.html');
+
+    html += ui.html.select('Test type', 'testType', TEST_TYPES);
+
+    if (!opt_noBuilderMenu) {
+        var buildersForMenu = Object.keys(currentBuilders());
+        if (opt_includeNoneBuilder)
+            buildersForMenu.unshift('--------------');
+        html += ui.html.select('Builder', 'builder', buildersForMenu);
+    }
+
+    html += ui.html.select('Group', 'group',
+        Object.keys(currentBuilderGroupCategory()));
+
+    if (!history.isTreeMap())
+        html += ui.html.checkbox('showAllRuns', 'Show all runs', g_history.crossDashboardState.showAllRuns);
+
+    if (opt_extraHtml)
+        html += opt_extraHtml;
+    return html + '</div>';
+}
+
+ui.html._loadDashboard = function(fileName)
+{
+    var pathName = window.location.pathname;
+    pathName = pathName.substring(0, pathName.lastIndexOf('/') + 1);
+    window.location = pathName + fileName + window.location.hash;
+}
+
+ui.html._topLink = function(html, onClick, isSelected)
+{
+    var cssText = isSelected ? 'font-weight: bold;' : 'color:blue;text-decoration:underline;cursor:pointer;';
+    cssText += 'margin: 0 5px;';
+    return '<span style="' + cssText + '" onclick="' + onClick + '">' + html + '</span>';
+}
+
+ui.html._dashboardLink = function(html, fileName)
+{
+    var pathName = window.location.pathname;
+    var currentFileName = pathName.substring(pathName.lastIndexOf('/') + 1);
+    var isSelected = currentFileName == fileName;
+    var onClick = 'ui.html._loadDashboard(\'' + fileName + '\')';
+    return ui.html._topLink(html, onClick, isSelected);
+}
+
+ui.html._revisionLink = function(results, index, key, singleUrlTemplate, rangeUrlTemplate)
+{
+    var currentRevision = parseInt(results[key][index], 10);
+    var previousRevision = parseInt(results[key][index + 1], 10);
+
+    function singleUrl()
+    {
+        return singleUrlTemplate.replace('<rev>', currentRevision);
+    }
+
+    function rangeUrl()
+    {
+        return rangeUrlTemplate.replace('<rev1>', currentRevision).replace('<rev2>', previousRevision + 1);
+    }
+
+    if (currentRevision == previousRevision)
+        return 'At <a href="' + singleUrl() + '">r' + currentRevision    + '</a>';
+    else if (currentRevision - previousRevision == 1)
+        return '<a href="' + singleUrl() + '">r' + currentRevision    + '</a>';
+    else
+        return '<a href="' + rangeUrl() + '">r' + (previousRevision + 1) + ' to r' + currentRevision + '</a>';
+}
+
+ui.html.chromiumRevisionLink = function(results, index)
+{
+    return ui.html._revisionLink(
+        results,
+        index,
+        CHROME_REVISIONS_KEY,
+        'http://src.chromium.org/viewvc/chrome?view=rev&revision=<rev>',
+        'http://build.chromium.org/f/chromium/perf/dashboard/ui/changelog.html?url=/trunk/src&range=<rev2>:<rev1>&mode=html');
+}
+
+ui.html.webKitRevisionLink = function(results, index)
+{
+    return ui.html._revisionLink(
+        results,
+        index,
+        WEBKIT_REVISIONS_KEY,
+        'http://trac.webkit.org/changeset/<rev>',
+        'http://trac.webkit.org/log/trunk/?rev=<rev1>&stop_rev=<rev2>&limit=100&verbose=on');
+}
+
+
+ui.Errors = function() {
+    this._messages = '';
+    // Element to display the errors within.
+    this._containerElement = null;
+}
+
+ui.Errors.prototype = {
+    show: function()
+    {
+        if (!this._containerElement) {
+            this._containerElement = document.createElement('H2');
+            this._containerElement.style.color = 'red';
+            this._containerElement.id = 'errors';
+            document.body.appendChild(this._containerElement);
+        }
+
+        this._containerElement.innerHTML = this._messages;
+    },
+    // Record a new error message.
+    addError: function(message)
+    {
+        this._messages += message + '<br>';
+    }
+}
+
+})();
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/CMakeLists.txt b/Tools/TestWebKitAPI/CMakeLists.txt
index 163edc7..a8e9999 100644
--- a/Tools/TestWebKitAPI/CMakeLists.txt
+++ b/Tools/TestWebKitAPI/CMakeLists.txt
@@ -1,8 +1,9 @@
-SET(TESTWEBKITAPI_DIR "${TOOLS_DIR}/TestWebKitAPI")
+set(TESTWEBKITAPI_DIR "${TOOLS_DIR}/TestWebKitAPI")
 
-INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}
+include_directories(${CMAKE_BINARY_DIR}
     ${TESTWEBKITAPI_DIR}
     ${CMAKE_SOURCE_DIR}/Source
+    ${DERIVED_SOURCES_WEBCORE_DIR}
     ${DERIVED_SOURCES_WEBKIT2_DIR}/include
     ${JAVASCRIPTCORE_DIR}
     ${JAVASCRIPTCORE_DIR}/API
@@ -21,7 +22,7 @@
 
 WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()
 
-ADD_LIBRARY(TestWebKitAPIInjectedBundle SHARED
+add_library(TestWebKitAPIInjectedBundle SHARED
     ${bundle_harness_SOURCES}
     ${TESTWEBKITAPI_DIR}/InjectedBundleController.cpp
     ${TESTWEBKITAPI_DIR}/InjectedBundleMain.cpp
@@ -33,6 +34,7 @@
     ${TESTWEBKITAPI_DIR}/Tests/WebKit2/GetInjectedBundleInitializationUserDataCallback_Bundle.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WebKit2/HitTestResultNodeHandle_Bundle.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WebKit2/InjectedBundleBasic_Bundle.cpp
+    ${TESTWEBKITAPI_DIR}/Tests/WebKit2/InjectedBundleFrameHitTest_Bundle.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WebKit2/InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WebKit2/LoadCanceledNoServerRedirectCallback_Bundle.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WebKit2/MouseMoveAfterCrash_Bundle.cpp
@@ -48,22 +50,22 @@
     ${TESTWEBKITAPI_DIR}/Tests/WebKit2/WillSendSubmitEvent_Bundle.cpp
 )
 
-TARGET_LINK_LIBRARIES(TestWebKitAPIInjectedBundle ${WTF_LIBRARY_NAME})
-ADD_DEPENDENCIES(TestWebKitAPIInjectedBundle ${WebKit2_LIBRARY_NAME} ${ForwardingHeadersForTestWebKitAPI_NAME} ${ForwardingNetworkHeadersForTestWebKitAPI_NAME})
+target_link_libraries(TestWebKitAPIInjectedBundle ${WTF_LIBRARY_NAME})
+add_dependencies(TestWebKitAPIInjectedBundle ${WebKit2_LIBRARY_NAME} ${ForwardingHeadersForTestWebKitAPI_NAME} ${ForwardingNetworkHeadersForTestWebKitAPI_NAME})
 
-GET_PROPERTY(TestWebKitAPIInjectedBundle_PATH TARGET TestWebKitAPIInjectedBundle PROPERTY LOCATION)
+get_property(TestWebKitAPIInjectedBundle_PATH TARGET TestWebKitAPIInjectedBundle PROPERTY LOCATION)
 
-ADD_DEFINITIONS(-DGTEST_LINKED_AS_SHARED_LIBRARY=1
+add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1
     -DTEST_WEBKIT2_RESOURCES_DIR=\"${TESTWEBKITAPI_DIR}/Tests/WebKit2\"
     -DTEST_INJECTED_BUNDLE_PATH=\"${TestWebKitAPIInjectedBundle_PATH}\"
 )
 
-SET(test_wtf_LIBRARIES
+set(test_wtf_LIBRARIES
     ${WTF_LIBRARY_NAME}
     gtest
 )
 
-ADD_EXECUTABLE(test_wtf
+add_executable(test_wtf
     ${test_main_SOURCES}
     ${TESTWEBKITAPI_DIR}/TestsController.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/AtomicString.cpp
@@ -72,12 +74,14 @@
     ${TESTWEBKITAPI_DIR}/Tests/WTF/Functional.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/HashMap.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/IntegerToStringConversion.cpp
+    ${TESTWEBKITAPI_DIR}/Tests/WTF/ListHashSet.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/MathExtras.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/MetaAllocator.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/MemoryInstrumentationTest.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/RedBlackTree.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/SaturatedArithmeticOperations.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/StringBuilder.cpp
+    ${TESTWEBKITAPI_DIR}/Tests/WTF/StringHasher.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/StringImpl.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/StringOperators.cpp
     ${TESTWEBKITAPI_DIR}/Tests/WTF/TemporaryChange.cpp
@@ -87,29 +91,25 @@
     ${TESTWEBKITAPI_DIR}/Tests/WTF/WTFString.cpp
 )
 
-TARGET_LINK_LIBRARIES(test_wtf ${test_wtf_LIBRARIES})
-ADD_DEPENDENCIES(test_wtf ${ForwardingHeadersForTestWebKitAPI_NAME} ${ForwardingNetworkHeadersForTestWebKitAPI_NAME})
-ADD_TEST(test_wtf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_wtf)
-SET_TESTS_PROPERTIES(test_wtf PROPERTIES TIMEOUT 60)
+target_link_libraries(test_wtf ${test_wtf_LIBRARIES})
+add_dependencies(test_wtf ${ForwardingHeadersForTestWebKitAPI_NAME} ${ForwardingNetworkHeadersForTestWebKitAPI_NAME})
+add_test(test_wtf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_wtf)
+set_tests_properties(test_wtf PROPERTIES TIMEOUT 60)
 
-SET(test_webcore_LIBRARIES
+set(test_webcore_LIBRARIES
+    gtest
     ${WTF_LIBRARY_NAME}
     ${WebCore_LIBRARY_NAME}
-    gtest
 )
 
-ADD_EXECUTABLE(test_webcore
-    ${test_main_SOURCES}
-    ${TESTWEBKITAPI_DIR}/TestsController.cpp
-    ${TESTWEBKITAPI_DIR}/Tests/WebCore/KURL.cpp
-)
+foreach (testName ${test_webcore_BINARIES})
+    add_executable(test_webcore_${testName} ${test_main_SOURCES} ${TESTWEBKITAPI_DIR}/TestsController.cpp ${TESTWEBKITAPI_DIR}/Tests/WebCore/${testName}.cpp)
+    add_test(test_webcore_${testName} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_webcore_${testName})
+    set_tests_properties(test_webcore_${testName} PROPERTIES TIMEOUT 60)
+    target_link_libraries(test_webcore_${testName} ${test_webcore_LIBRARIES})
+endforeach ()
 
-TARGET_LINK_LIBRARIES(test_webcore ${test_webcore_LIBRARIES})
-ADD_DEPENDENCIES(test_webcore ${ForwardingHeadersForTestWebKitAPI_NAME} ${ForwardingNetworkHeadersForTestWebKitAPI_NAME})
-ADD_TEST(test_webcore ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_webcore)
-SET_TESTS_PROPERTIES(test_webcore PROPERTIES TIMEOUT 60)
-
-ADD_LIBRARY(TestWebKitAPIBase
+add_library(TestWebKitAPIBase
     ${test_main_SOURCES}
     ${webkit2_api_harness_SOURCES}
     ${TESTWEBKITAPI_DIR}/JavaScriptTest.cpp
@@ -117,9 +117,9 @@
     ${TESTWEBKITAPI_DIR}/TestsController.cpp
 )
 
-ADD_DEPENDENCIES(TestWebKitAPIBase ${WebKit2_LIBRARY_NAME} ${ForwardingHeadersForTestWebKitAPI_NAME} ${ForwardingNetworkHeadersForTestWebKitAPI_NAME})
+add_dependencies(TestWebKitAPIBase ${WebKit2_LIBRARY_NAME} ${ForwardingHeadersForTestWebKitAPI_NAME} ${ForwardingNetworkHeadersForTestWebKitAPI_NAME})
 
-SET(test_webkit2_api_LIBRARIES
+set(test_webkit2_api_LIBRARIES
     TestWebKitAPIBase
     ${WTF_LIBRARY_NAME}
     ${JavaScriptCore_LIBRARY_NAME}
@@ -127,18 +127,19 @@
     gtest
 )
 
-FOREACH(testName ${test_webkit2_api_BINARIES})
-    ADD_EXECUTABLE(test_webkit2_api_${testName} ${TESTWEBKITAPI_DIR}/Tests/WebKit2/${testName}.cpp)
-    ADD_TEST(test_webkit2_api_${testName} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_webkit2_api_${testName})
-    SET_TESTS_PROPERTIES(test_webkit2_api_${testName} PROPERTIES TIMEOUT 60)
-    TARGET_LINK_LIBRARIES(test_webkit2_api_${testName} ${test_webkit2_api_LIBRARIES})
-ENDFOREACH()
+foreach (testName ${test_webkit2_api_BINARIES})
+    get_filename_component(testBaseName ${testName} NAME)
+    add_executable(test_webkit2_api_${testBaseName} ${TESTWEBKITAPI_DIR}/Tests/WebKit2/${testName}.cpp)
+    add_test(test_webkit2_api_${testBaseName} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_webkit2_api_${testBaseName})
+    set_tests_properties(test_webkit2_api_${testBaseName} PROPERTIES TIMEOUT 60)
+    target_link_libraries(test_webkit2_api_${testBaseName} ${test_webkit2_api_LIBRARIES})
+endforeach ()
 
 # We don't run tests that are expected to fail. We could use the WILL_FAIL
 # property, but it reports failure when the test crashes or timeouts and would
 # make the bot red.
 
-FOREACH(testName ${test_webkit2_api_fail_BINARIES})
-    ADD_EXECUTABLE(test_webkit2_api_fail_${testName} ${TESTWEBKITAPI_DIR}/Tests/WebKit2/${testName}.cpp)
-    TARGET_LINK_LIBRARIES(test_webkit2_api_fail_${testName} ${test_webkit2_api_LIBRARIES})
-ENDFOREACH()
+foreach (testName ${test_webkit2_api_fail_BINARIES})
+    add_executable(test_webkit2_api_fail_${testName} ${TESTWEBKITAPI_DIR}/Tests/WebKit2/${testName}.cpp)
+    target_link_libraries(test_webkit2_api_fail_${testName} ${test_webkit2_api_LIBRARIES})
+endforeach ()
diff --git a/Tools/TestWebKitAPI/Configurations/Base.xcconfig b/Tools/TestWebKitAPI/Configurations/Base.xcconfig
index 1e029d4..5542f41 100644
--- a/Tools/TestWebKitAPI/Configurations/Base.xcconfig
+++ b/Tools/TestWebKitAPI/Configurations/Base.xcconfig
@@ -25,8 +25,11 @@
 CLANG_CXX_LIBRARY = libc++;
 CLANG_WARN_CXX0X_EXTENSIONS = NO;
 HEADER_SEARCH_PATHS = ${BUILT_PRODUCTS_DIR}/usr/local/include $(WEBCORE_PRIVATE_HEADERS_DIR)/ForwardingHeaders $(WEBCORE_PRIVATE_HEADERS_DIR)/icu;
-FRAMEWORK_SEARCH_PATHS = $(SYSTEM_LIBRARY_DIR)/Frameworks/Quartz.framework/Frameworks $(SYSTEM_LIBRARY_DIR)/Frameworks/ApplicationServices.framework/Frameworks $(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks;
-GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) ENABLE_DASHBOARD_SUPPORT WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST GTEST_HAS_TR1_TUPLE=0 GTEST_HAS_RTTI=0;
+FRAMEWORK_SEARCH_PATHS = $(FRAMEWORK_SEARCH_PATHS_$(PLATFORM_NAME));
+FRAMEWORK_SEARCH_PATHS_macosx = $(SYSTEM_LIBRARY_DIR)/Frameworks/Quartz.framework/Frameworks $(SYSTEM_LIBRARY_DIR)/Frameworks/ApplicationServices.framework/Frameworks $(SYSTEM_LIBRARY_DIR)/Frameworks/CoreServices.framework/Frameworks;
+
+GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST GTEST_HAS_TR1_TUPLE=0 GTEST_HAS_RTTI=0 $(GCC_PREPROCESSOR_DEFINITIONS_$(PLATFORM_NAME));
+GCC_PREPROCESSOR_DEFINITIONS_macosx = ENABLE_DASHBOARD_SUPPORT;
 DEBUG_INFORMATION_FORMAT = dwarf-with-dsym;
 PREBINDING = NO
 GCC_C_LANGUAGE_STANDARD = gnu99
@@ -40,7 +43,6 @@
 GCC_WARN_UNUSED_VARIABLE = YES
 WARNING_CFLAGS = -Wall -W -Wno-unused-parameter
 LINKER_DISPLAYS_MANGLED_NAMES = YES;
-VALID_ARCHS = i386 x86_64;
 
 // DEBUG_DEFINES, GCC_OPTIMIZATION_LEVEL, STRIP_INSTALLED_PRODUCT and DEAD_CODE_STRIPPING vary between the debug and normal variants.
 // We set up the values for each variant here, and have the Debug configuration in the Xcode project use the _debug variant.
@@ -48,6 +50,7 @@
 DEBUG_DEFINES_normal = NDEBUG;
 DEBUG_DEFINES = $(DEBUG_DEFINES_$(CURRENT_VARIANT));
 
+SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx;
 
 TARGET_MAC_OS_X_VERSION_MAJOR = $(MAC_OS_X_VERSION_MAJOR);
 
@@ -63,3 +66,8 @@
 
 WEBKIT_UMBRELLA_FRAMEWORKS_DIR = $(NEXT_ROOT)$(SYSTEM_LIBRARY_DIR)/Frameworks/WebKit.framework/Versions/A/Frameworks;
 WEBCORE_PRIVATE_HEADERS_DIR = $(WEBKIT_UMBRELLA_FRAMEWORKS_DIR)/WebCore.framework/PrivateHeaders;
+
+EXCLUDED_SOURCE_FILE_NAMES = $(EXCLUDED_SOURCE_FILE_NAMES_$(PLATFORM_NAME));
+EXCLUDED_SOURCE_FILE_NAMES_macosx = *IOS.h *IOS.cpp *IOS.mm;
+EXCLUDED_SOURCE_FILE_NAMES_iphoneos = *Mac.h *Mac.cpp *Mac.mm *InjectedBundle* *PlatformUtilities* Tests/WebKit2/* Tests/WebKit2ObjC/* *_Bundle* JavaScriptTest.*;
+EXCLUDED_SOURCE_FILE_NAMES_iphonesimulator = $(EXCLUDED_SOURCE_FILE_NAMES_iphoneos);
diff --git a/Tools/TestWebKitAPI/Configurations/TestWebKitAPI.xcconfig b/Tools/TestWebKitAPI/Configurations/TestWebKitAPI.xcconfig
index c2ab7cd..5fc6f74 100644
--- a/Tools/TestWebKitAPI/Configurations/TestWebKitAPI.xcconfig
+++ b/Tools/TestWebKitAPI/Configurations/TestWebKitAPI.xcconfig
@@ -21,5 +21,10 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 
-PRODUCT_NAME = TestWebKitAPI
-GCC_ENABLE_OBJC_EXCEPTIONS = YES
+PRODUCT_NAME = TestWebKitAPI;
+GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+
+OTHER_LDFLAGS = -lgtest -framework JavaScriptCore -framework WebKit $(OTHER_LDFLAGS_$(PLATFORM_NAME));
+OTHER_LDFLAGS_iphoneos = -framework WebCore;
+OTHER_LDFLAGS_iphonesimulator = $(OTHER_LDFLAGS_iphoneos);
+OTHER_LDFLAGS_macosx = -framework Cocoa -framework Carbon -framework WebKit2;
diff --git a/Tools/TestWebKitAPI/DerivedSources.pri b/Tools/TestWebKitAPI/DerivedSources.pri
new file mode 100644
index 0000000..cb391ad
--- /dev/null
+++ b/Tools/TestWebKitAPI/DerivedSources.pri
@@ -0,0 +1,12 @@
+# -------------------------------------------------------------------
+# Derived sources for TestWebKitAPI
+#
+# See 'Tools/qmake/README' for an overview of the build system
+# -------------------------------------------------------------------
+
+TEMPLATE = derived
+
+# Make sure forwarded headers needed by this project are present
+fwheader_generator.commands = perl $${ROOT_WEBKIT_DIR}/Source/WebKit2/Scripts/generate-forwarding-headers.pl $${ROOT_WEBKIT_DIR}/Tools/TestWebKitAPI $${ROOT_BUILD_DIR}/Source/include qt
+fwheader_generator.depends  = $${ROOT_WEBKIT_DIR}/Source/WebKit2/Scripts/generate-forwarding-headers.pl
+GENERATORS += fwheader_generator
diff --git a/Tools/TestWebKitAPI/ForwardingHeaders/WebCore/LayoutUnit.h b/Tools/TestWebKitAPI/ForwardingHeaders/WebCore/LayoutUnit.h
new file mode 100644
index 0000000..de0a745
--- /dev/null
+++ b/Tools/TestWebKitAPI/ForwardingHeaders/WebCore/LayoutUnit.h
@@ -0,0 +1,4 @@
+#ifndef TestWebKitAPI_FWD_LayoutUnit_h
+#define TestWebKitAPI_FWD_LayoutUnit_h
+#include <LayoutUnit.h>
+#endif
diff --git a/Tools/TestWebKitAPI/GNUmakefile.am b/Tools/TestWebKitAPI/GNUmakefile.am
index 759ccb9..344f60b 100644
--- a/Tools/TestWebKitAPI/GNUmakefile.am
+++ b/Tools/TestWebKitAPI/GNUmakefile.am
@@ -52,12 +52,13 @@
 	Tools/TestWebKitAPI/Tests/WTF/Functional.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/HashMap.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/IntegerToStringConversion.cpp \
+	Tools/TestWebKitAPI/Tests/WTF/ListHashSet.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/MediaTime.cpp \
-	Tools/TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/RedBlackTree.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/SaturatedArithmeticOperations.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp \
+	Tools/TestWebKitAPI/Tests/WTF/StringHasher.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp \
 	Tools/TestWebKitAPI/Tests/WTF/TemporaryChange.cpp \
@@ -71,8 +72,10 @@
 
 Programs_TestWebKitAPI_TestGtk_CPPFLAGS = \
 	$(Programs_TestWebKitAPI_TestWTF_CPPFLAGS) \
+	$(platformgtk_cppflags) \
 	$(webcore_cppflags) \
 	$(webcoregtk_cppflags) \
+	$(FREETYPE_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	$(GTK_CFLAGS) \
 	$(LIBSOUP_CFLAGS)
@@ -81,7 +84,10 @@
 	Libraries/libTestWebKitAPIMain.la \
 	Libraries/libgtest.la \
 	libjavascriptcoregtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
-	libwebkitgtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
+	libPlatformGtk.la \
+	libWebCore.la \
+	libWebCoreGtk.la \
+	$(FREETYPE_LIBS) \
 	$(GLIB_LIBS) \
 	$(GTK_LIBS) \
 	$(LIBSOUP_LIBS)
@@ -104,6 +110,7 @@
 Programs_TestWebKitAPI_TestWebKit2_CPPFLAGS = \
 	$(Programs_TestWebKitAPI_TestWTF_CPPFLAGS) \
 	-I$(top_builddir)/DerivedSources/WebKit2/include \
+	$(FREETYPE_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	$(GTK_CFLAGS) \
 	$(LIBSOUP_CFLAGS)
@@ -113,6 +120,7 @@
 	Libraries/libgtest.la \
 	libjavascriptcoregtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
 	libwebkit2gtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \
+	$(FREETYPE_LIBS) \
 	$(GLIB_LIBS) \
 	$(GTK_LIBS) \
 	$(LIBSOUP_LIBS)
@@ -148,6 +156,8 @@
 	Tools/TestWebKitAPI/Tests/WebKit2/LoadAlternateHTMLStringWithNonDirectoryURL.cpp \
 	Tools/TestWebKitAPI/Tests/WebKit2/LoadCanceledNoServerRedirectCallback.cpp \
 	Tools/TestWebKitAPI/Tests/WebKit2/MouseMoveAfterCrash.cpp \
+	Tools/TestWebKitAPI/Tests/WebKit2/ReloadPageAfterCrash.cpp \
+	Tools/TestWebKitAPI/Tests/WebKit2/ResizeWindowAfterCrash.cpp \
 	Tools/TestWebKitAPI/Tests/WebKit2/NewFirstVisuallyNonEmptyLayout.cpp \
 	Tools/TestWebKitAPI/Tests/WebKit2/NewFirstVisuallyNonEmptyLayoutFails.cpp \
 	Tools/TestWebKitAPI/Tests/WebKit2/NewFirstVisuallyNonEmptyLayoutForImages.cpp \
diff --git a/Tools/TestWebKitAPI/InjectedBundle.pri b/Tools/TestWebKitAPI/InjectedBundle.pri
new file mode 100644
index 0000000..171a200
--- /dev/null
+++ b/Tools/TestWebKitAPI/InjectedBundle.pri
@@ -0,0 +1,56 @@
+# -------------------------------------------------------------------
+# Project file for TestWebKitAPI's InjectedBundle
+#
+# See 'Tools/qmake/README' for an overview of the build system
+# -------------------------------------------------------------------
+
+TEMPLATE = lib
+TARGET = TestWebKitAPIInjectedBundle
+
+INCLUDEPATH += $$PWD
+INCLUDEPATH += $${ROOT_WEBKIT_DIR}/Source/ThirdParty/gtest/include
+
+SOURCES += \
+    $$PWD/InjectedBundleController.cpp \
+    $$PWD/InjectedBundleController.h \
+    $$PWD/InjectedBundleMain.cpp \
+    $$PWD/InjectedBundleTest.h \
+    $$PWD/PlatformUtilities.cpp \
+    $$PWD/PlatformUtilities.h \
+    $$PWD/qt/InjectedBundleControllerQt.cpp \
+    $$PWD/qt/PlatformUtilitiesQt.cpp \
+    $$PWD/Tests/WebKit2/CanHandleRequest_Bundle.cpp \
+    $$PWD/Tests/WebKit2/DocumentStartUserScriptAlertCrash_Bundle.cpp \
+    $$PWD/Tests/WebKit2/DOMWindowExtensionBasic_Bundle.cpp \
+    $$PWD/Tests/WebKit2/DOMWindowExtensionNoCache_Bundle.cpp \
+    $$PWD/Tests/WebKit2/GetInjectedBundleInitializationUserDataCallback_Bundle.cpp \
+    $$PWD/Tests/WebKit2/HitTestResultNodeHandle_Bundle.cpp \
+    $$PWD/Tests/WebKit2/InjectedBundleBasic_Bundle.cpp \
+    $$PWD/Tests/WebKit2/InjectedBundleFrameHitTest_Bundle.cpp \
+    $$PWD/Tests/WebKit2/InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp \
+    $$PWD/Tests/WebKit2/LoadCanceledNoServerRedirectCallback_Bundle.cpp \
+    $$PWD/Tests/WebKit2/MouseMoveAfterCrash_Bundle.cpp \
+    $$PWD/Tests/WebKit2/NewFirstVisuallyNonEmptyLayout_Bundle.cpp \
+    $$PWD/Tests/WebKit2/NewFirstVisuallyNonEmptyLayoutFails_Bundle.cpp \
+    $$PWD/Tests/WebKit2/NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp \
+    $$PWD/Tests/WebKit2/NewFirstVisuallyNonEmptyLayoutFrames_Bundle.cpp \
+    $$PWD/Tests/WebKit2/ParentFrame_Bundle.cpp \
+    $$PWD/Tests/WebKit2/ResponsivenessTimerDoesntFireEarly_Bundle.cpp \
+    $$PWD/Tests/WebKit2/ShouldGoToBackForwardListItem_Bundle.cpp \
+    $$PWD/Tests/WebKit2/UserMessage_Bundle.cpp \
+    $$PWD/Tests/WebKit2/WillSendSubmitEvent_Bundle.cpp \
+    $$PWD/Tests/WebKit2/WKConnection_Bundle.cpp
+
+
+DESTDIR = $${ROOT_BUILD_DIR}/lib
+
+QT += core webkit
+
+WEBKIT += wtf javascriptcore webcore webkit2
+
+CONFIG += plugin rpath compiling_thirdparty_code
+
+LIBS += -L$${ROOT_BUILD_DIR}/Source/ThirdParty/gtest/$$targetSubDir() -lgtest
+
+DEFINES += APITEST_SOURCE_DIR=\\\"$$PWD\\\" \
+           ROOT_BUILD_DIR=\\\"$${ROOT_BUILD_DIR}\\\"
diff --git a/Tools/TestWebKitAPI/PlatformEfl.cmake b/Tools/TestWebKitAPI/PlatformEfl.cmake
index 7defb11..a717559 100644
--- a/Tools/TestWebKitAPI/PlatformEfl.cmake
+++ b/Tools/TestWebKitAPI/PlatformEfl.cmake
@@ -1,47 +1,57 @@
-ADD_CUSTOM_TARGET(forwarding-headersEflForTestWebKitAPI
+add_custom_target(forwarding-headersEflForTestWebKitAPI
+    COMMAND ${PERL_EXECUTABLE} ${WEBKIT2_DIR}/Scripts/generate-forwarding-headers.pl ${WEBKIT2_DIR} ${DERIVED_SOURCES_WEBKIT2_DIR}/include efl
     COMMAND ${PERL_EXECUTABLE} ${WEBKIT2_DIR}/Scripts/generate-forwarding-headers.pl ${TESTWEBKITAPI_DIR} ${DERIVED_SOURCES_WEBKIT2_DIR}/include efl
 )
-SET(ForwardingHeadersForTestWebKitAPI_NAME forwarding-headersEflForTestWebKitAPI)
+set(ForwardingHeadersForTestWebKitAPI_NAME forwarding-headersEflForTestWebKitAPI)
 
-ADD_CUSTOM_TARGET(forwarding-headersSoupForTestWebKitAPI
+add_custom_target(forwarding-headersSoupForTestWebKitAPI
+    COMMAND ${PERL_EXECUTABLE} ${WEBKIT2_DIR}/Scripts/generate-forwarding-headers.pl ${WEBKIT2_DIR} ${DERIVED_SOURCES_WEBKIT2_DIR}/include soup
     COMMAND ${PERL_EXECUTABLE} ${WEBKIT2_DIR}/Scripts/generate-forwarding-headers.pl ${TESTWEBKITAPI_DIR} ${DERIVED_SOURCES_WEBKIT2_DIR}/include soup
 )
-SET(ForwardingNetworkHeadersForTestWebKitAPI_NAME forwarding-headersSoupForTestWebKitAPI)
+set(ForwardingNetworkHeadersForTestWebKitAPI_NAME forwarding-headersSoupForTestWebKitAPI)
 
-INCLUDE_DIRECTORIES(
+include_directories(
     ${WEBKIT2_DIR}/UIProcess/API/C/soup
     ${WEBKIT2_DIR}/UIProcess/API/C/efl
     ${WEBKIT2_DIR}/UIProcess/API/efl
+    ${ECORE_EVAS_INCLUDE_DIRS}
     ${ECORE_INCLUDE_DIRS}
     ${EINA_INCLUDE_DIRS}
+    ${EO_INCLUDE_DIRS}
     ${EVAS_INCLUDE_DIRS}
     ${GLIB_INCLUDE_DIRS}
     ${LIBSOUP_INCLUDE_DIRS}
 )
 
-SET(test_main_SOURCES
+set(test_main_SOURCES
     ${TESTWEBKITAPI_DIR}/efl/main.cpp
 )
 
-SET(bundle_harness_SOURCES
+set(bundle_harness_SOURCES
     ${TESTWEBKITAPI_DIR}/efl/InjectedBundleController.cpp
     ${TESTWEBKITAPI_DIR}/efl/PlatformUtilities.cpp
 )
 
-SET(webkit2_api_harness_SOURCES
+set(webkit2_api_harness_SOURCES
     ${TESTWEBKITAPI_DIR}/efl/PlatformUtilities.cpp
     ${TESTWEBKITAPI_DIR}/efl/PlatformWebView.cpp
 )
 
 # The list below works like a test expectation. Tests in the
-# test_webkit2_api_BINARIES list are added to the test runner and
-# tried on the bots on every build. Tests in test_webkit2_api_fail_BINARIES
+# test_{webkit2_api|webcore}_BINARIES list are added to the test runner and
+# tried on the bots on every build. Tests in test_{webkit2_api|webcore}_BINARIES
 # are compiled and suffixed with fail and skipped from the test runner.
 #
 # Make sure that the tests are passing on both Debug and
-# Release builds before adding it to test_webkit2_api_BINARIES.
+# Release builds before adding it to test_{webkit2_api|webcore}_BINARIES.
 
-SET(test_webkit2_api_BINARIES
+set(test_webcore_BINARIES
+    LayoutUnit
+    KURL
+)
+
+set(test_webkit2_api_BINARIES
+    AboutBlankLoad
     CookieManager
     DOMWindowExtensionNoCache
     DocumentStartUserScriptAlertCrash
@@ -52,46 +62,46 @@
     FrameMIMETypeHTML
     FrameMIMETypePNG
     GetInjectedBundleInitializationUserDataCallback
+    HitTestResultNodeHandle
     InjectedBundleBasic
+    InjectedBundleFrameHitTest
     InjectedBundleInitializationUserDataCallbackWins
     LoadAlternateHTMLStringWithNonDirectoryURL
     LoadCanceledNoServerRedirectCallback
+    MouseMoveAfterCrash
+    ReloadPageAfterCrash
+    ResizeWindowAfterCrash
     NewFirstVisuallyNonEmptyLayout
     NewFirstVisuallyNonEmptyLayoutFails
+    NewFirstVisuallyNonEmptyLayoutForImages
     PageLoadBasic
     PageLoadDidChangeLocationWithinPageForFrame
     ParentFrame
     PreventEmptyUserAgent
     PrivateBrowsingPushStateNoHistoryCallback
+    ShouldGoToBackForwardListItem
+    UserMessage
     WKConnection
+    WKPreferences
     WKString
     WKStringJSString
     WKURL
     WillSendSubmitEvent
+    efl/WKViewClientWebProcessCallbacks
 )
 
-SET(test_webkit2_api_fail_BINARIES
+set(test_webkit2_api_fail_BINARIES
     CanHandleRequest
     DOMWindowExtensionBasic
     DownloadDecideDestinationCrash
-    NewFirstVisuallyNonEmptyLayoutForImages
     NewFirstVisuallyNonEmptyLayoutFrames
     RestoreSessionStateContainingFormData
-    ShouldGoToBackForwardListItem
     WKPageGetScaleFactorNotZero
 )
 
-ADD_DEFINITIONS(-DTHEME_DIR="${THEME_BINARY_DIR}")
+add_definitions(-DTHEME_DIR="${THEME_BINARY_DIR}")
 
 # Tests disabled because of missing features on the test harness:
 #
-#   AboutBlankLoad
-#   HitTestResultNodeHandle
-#   MouseMoveAfterCrash
 #   ResponsivenessTimerDoesntFireEarly
 #   SpacebarScrolling
-#   WKPreferences
-#
-# Flaky test, fails on Release but passes on Debug:
-#
-#   UserMessage
diff --git a/Tools/TestWebKitAPI/PlatformWebView.h b/Tools/TestWebKitAPI/PlatformWebView.h
index 653a17c..5594ee4 100644
--- a/Tools/TestWebKitAPI/PlatformWebView.h
+++ b/Tools/TestWebKitAPI/PlatformWebView.h
@@ -47,10 +47,17 @@
 typedef WKViewRef PlatformWKView;
 typedef GtkWidget *PlatformWindow;
 #elif PLATFORM(EFL)
-typedef struct _Evas_Object Evas_Object;
 typedef struct _Ecore_Evas Ecore_Evas;
+typedef struct _Evas_Object Evas_Object;
 typedef Evas_Object* PlatformWKView;
 typedef Ecore_Evas* PlatformWindow;
+#elif PLATFORM(QT)
+QT_BEGIN_NAMESPACE
+class QQuickView;
+QT_END_NAMESPACE
+class QQuickWebView;
+typedef QQuickWebView* PlatformWKView;
+typedef QQuickView* PlatformWindow;
 #endif
 
 namespace TestWebKitAPI {
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp b/Tools/TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp
index 696f40c..f2c5fa5 100644
--- a/Tools/TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp
@@ -54,6 +54,7 @@
             'target_name': 'TestWebKitAPI',
             'type': 'executable',
             'dependencies': [
+                '<(source_dir)/WebCore/WebCore.gyp/WebCore.gyp:webcore',
                 '<(source_dir)/WebKit/chromium/WebKit.gyp:webkit',
                 '<(source_dir)/WTF/WTF.gyp/WTF.gyp:wtf',
                 '<(chromium_src_dir)/build/temp_gyp/googleurl.gyp:googleurl',
@@ -68,6 +69,7 @@
                 # Needed by tests/RunAllTests.cpp, as well as ChromiumCurrentTime.cpp and
                 # ChromiumThreading.cpp in chromium shared library configuration.
                 '<(source_dir)/WebKit/chromium/public',
+                '<(tools_dir)/TestWebKitAPI/ForwardingHeaders',
             ],
             'sources': [
                 # Reuse the same testing driver of Chromium's webkit_unit_tests.
@@ -75,6 +77,11 @@
                 '<@(TestWebKitAPI_files)',
             ],
             'conditions': [
+                ['component!="shared_library"', {
+                    'sources': [
+		        '../Tests/WebCore/HeapGraphSerializerTest.cpp'
+                    ],
+                }],
                 ['inside_chromium_build==1 and component=="shared_library"', {
                     'sources': [
                         # To satisfy linking of WTF::currentTime() etc. in shared library configuration,
@@ -99,14 +106,11 @@
                 'target_name': 'TestWebKitAPI_apk',
                 'type': 'none',
                 'dependencies': [
-                    '<(chromium_src_dir)/base/base.gyp:base',
+                    '<(chromium_src_dir)/base/base.gyp:base_java',
                     'TestWebKitAPI',
                 ],
                 'variables': {
                     'input_shlib_path': '<(SHARED_LIB_DIR)/<(SHARED_LIB_PREFIX)TestWebKitAPI<(SHARED_LIB_SUFFIX)',
-                    'input_jars_paths': [
-                        '<(PRODUCT_DIR)/lib.java/chromium_base.jar',
-                    ],
                     'conditions': [
                         ['inside_chromium_build==1', {
                             'ant_build_to_chromium_src': '<(ant_build_out)/../../',
@@ -125,7 +129,7 @@
                         '<(chromium_src_dir)/testing/android/AndroidManifest.xml',
                         '<(chromium_src_dir)/testing/android/generate_native_test.py',
                         '<(input_shlib_path)',
-                        '<@(input_jars_paths)',
+                        '>@(input_jars_paths)',
                     ],
                     'outputs': [
                         '<(PRODUCT_DIR)/TestWebKitAPI_apk/TestWebKitAPI-debug.apk',
@@ -134,12 +138,12 @@
                         '<(chromium_src_dir)/testing/android/generate_native_test.py',
                         '--native_library',
                         '<(input_shlib_path)',
-                        '--jars',
-                        '"<@(input_jars_paths)"',
                         '--output',
                         '<(PRODUCT_DIR)/TestWebKitAPI_apk',
                         '--strip-binary=<(android_strip)',
                         '--ant-args',
+                        '-quiet',
+                        '--ant-args',
                         '-DANDROID_SDK=<(android_sdk)',
                         '--ant-args',
                         '-DANDROID_SDK_ROOT=<(android_sdk_root)',
@@ -155,6 +159,8 @@
                         '-DPRODUCT_DIR=<(ant_build_out)',
                         '--ant-args',
                         '-DCHROMIUM_SRC=<(ant_build_to_chromium_src)',
+                        '--ant-args',
+                        '-DINPUT_JARS_PATHS=>@(input_jars_paths)',
                         '--app_abi',
                         '<(android_app_abi)',
                     ],
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.gypi b/Tools/TestWebKitAPI/TestWebKitAPI.gypi
index 2c07940..0f71e82 100644
--- a/Tools/TestWebKitAPI/TestWebKitAPI.gypi
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.gypi
@@ -31,17 +31,21 @@
 {
     'variables': {
         'TestWebKitAPI_files': [
+            'Tests/WebCore/LayoutUnit.cpp',
             'Tests/WTF/AtomicString.cpp',
             'Tests/WTF/CheckedArithmeticOperations.cpp',
             'Tests/WTF/CString.cpp',
             'Tests/WTF/Functional.cpp',
             'Tests/WTF/HashMap.cpp',
+            'Tests/WTF/HashSet.cpp',
+            'Tests/WTF/ListHashSet.cpp',
             'Tests/WTF/MathExtras.cpp',
             'Tests/WTF/MediaTime.cpp',
             'Tests/WTF/MemoryInstrumentationTest.cpp',
             'Tests/WTF/RedBlackTree.cpp',
             'Tests/WTF/SaturatedArithmeticOperations.cpp',
             'Tests/WTF/StringBuilder.cpp',
+            'Tests/WTF/StringHasher.cpp',
             'Tests/WTF/StringImpl.cpp',
             'Tests/WTF/StringOperators.cpp',
             'Tests/WTF/TemporaryChange.cpp',
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.pri b/Tools/TestWebKitAPI/TestWebKitAPI.pri
new file mode 100644
index 0000000..ddc9934
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.pri
@@ -0,0 +1,22 @@
+
+INCLUDEPATH += $$PWD $${ROOT_WEBKIT_DIR}/Source/ThirdParty/gtest/include
+WEBKIT += wtf javascriptcore webkit2
+
+DEFINES += QT_NO_CAST_FROM_ASCII
+
+QT += core core-private gui gui-private webkit quick quick-private
+
+CONFIG += compiling_thirdparty_code
+
+SOURCES += \
+    $$PWD/JavaScriptTest.cpp \
+    $$PWD/PlatformUtilities.cpp \
+    $$PWD/TestsController.cpp \
+    $$PWD/qt/main.cpp \
+    $$PWD/qt/PlatformUtilitiesQt.cpp \
+    $$PWD/qt/PlatformWebViewQt.cpp
+
+LIBS += -L$${ROOT_BUILD_DIR}/Source/ThirdParty/gtest/$$targetSubDir() -lgtest
+
+DEFINES += ROOT_BUILD_DIR=\\\"$${ROOT_BUILD_DIR}\\\"
+
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.pro b/Tools/TestWebKitAPI/TestWebKitAPI.pro
new file mode 100644
index 0000000..b9d0cd5
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.pro
@@ -0,0 +1,11 @@
+TEMPLATE = subdirs
+CONFIG += ordered
+
+derived_sources.file = DerivedSources.pri
+injected_bundle.file = InjectedBundle.pri
+tests.file = Tests.pri
+
+SUBDIRS += derived_sources injected_bundle tests
+
+addStrictSubdirOrderBetween(derived_sources, injected_bundle)
+addStrictSubdirOrderBetween(derived_sources, tests)
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.sln b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.sln
new file mode 100644
index 0000000..38b2fd6
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.sln
@@ -0,0 +1,29 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestWebKitAPI", "TestWebKitAPI.vcxproj", "{AF94D13A-36C1-45FF-9B0B-EB5D3FF6F43D}"
+	ProjectSection(ProjectDependencies) = postProject
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8} = {C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest-md", "..\..\..\Source\ThirdParty\gtest\msvc\gtest-md.vcxproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{AF94D13A-36C1-45FF-9B0B-EB5D3FF6F43D}.Debug|Win32.ActiveCfg = Debug|Win32
+		{AF94D13A-36C1-45FF-9B0B-EB5D3FF6F43D}.Debug|Win32.Build.0 = Debug|Win32
+		{AF94D13A-36C1-45FF-9B0B-EB5D3FF6F43D}.Release|Win32.ActiveCfg = Release|Win32
+		{AF94D13A-36C1-45FF-9B0B-EB5D3FF6F43D}.Release|Win32.Build.0 = Release|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug|Win32.ActiveCfg = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug|Win32.Build.0 = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release|Win32.ActiveCfg = Release|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj
new file mode 100644
index 0000000..d4907c4
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{AF94D13A-36C1-45FF-9B0B-EB5D3FF6F43D}</ProjectGuid>

+    <Keyword>Win32Proj</Keyword>

+    <RootNamespace>TestWebKitAPI</RootNamespace>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestWebKitAPIDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestWebKitAPIDebugWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestWebKitAPIDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestWebKitAPIRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestWebKitAPIReleaseWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="TestWebKitAPIProduction.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" />

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClInclude Include="..\config.h" />

+    <ClInclude Include="..\Test.h" />

+    <ClInclude Include="..\TestsController.h" />

+    <ClInclude Include="..\win\HostWindow.h" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\TestsController.cpp" />

+    <ClCompile Include="..\Tests\WebCore\LayoutUnit.cpp" />

+    <ClCompile Include="..\Tests\WebCore\win\BitmapImage.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WebKit\win\WebViewDestruction.cpp" />

+    <ClCompile Include="..\Tests\WTF\cf\RetainPtr.cpp" />

+    <ClCompile Include="..\Tests\WTF\cf\RetainPtrHashing.cpp" />

+    <ClCompile Include="..\Tests\WTF\CheckedArithmeticOperations.cpp" />

+    <ClCompile Include="..\Tests\WTF\Functional.cpp" />

+    <ClCompile Include="..\Tests\WTF\HashMap.cpp" />

+    <ClCompile Include="..\Tests\WTF\MathExtras.cpp" />

+    <ClCompile Include="..\Tests\WTF\MediaTime.cpp" />

+    <ClCompile Include="..\Tests\WTF\SaturatedArithmeticOperations.cpp" />

+    <ClCompile Include="..\Tests\WTF\StringHasher.cpp" />

+    <ClCompile Include="..\Tests\WTF\StringOperators.cpp" />

+    <ClCompile Include="..\Tests\WTF\Vector.cpp" />

+    <ClCompile Include="..\Tests\WTF\VectorBasic.cpp" />

+    <ClCompile Include="..\Tests\WTF\VectorReverse.cpp" />

+    <ClCompile Include="..\win\HostWindow.cpp" />

+    <ClCompile Include="..\win\main.cpp" />

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="TestWebKitAPIPostBuild.cmd" />

+    <None Include="TestWebKitAPIPreBuild.cmd" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters
new file mode 100644
index 0000000..3756383
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Tests">

+      <UniqueIdentifier>{80b7e5c5-5c50-4363-ae7b-a0956e6a688d}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="win">

+      <UniqueIdentifier>{e0b41579-994a-4d5e-9c2a-2ec14cd0c606}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Tests\WTF">

+      <UniqueIdentifier>{87f2c8f6-8710-4785-a918-2aec42c9f1d3}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Tests\WebCore">

+      <UniqueIdentifier>{77db1e64-3c2d-4de3-adc1-860d4ea1c3c2}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Tests\WebKit">

+      <UniqueIdentifier>{f8236406-78aa-4c83-b393-b060b09405a3}</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Tests\WTF\cf">

+      <UniqueIdentifier>{909ce22a-2223-4afa-af44-2d0153f13cc6}</UniqueIdentifier>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\config.h" />

+    <ClInclude Include="..\Test.h" />

+    <ClInclude Include="..\TestsController.h" />

+    <ClInclude Include="..\win\HostWindow.h">

+      <Filter>win</Filter>

+    </ClInclude>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\TestsController.cpp" />

+    <ClCompile Include="..\win\HostWindow.cpp">

+      <Filter>win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\win\main.cpp">

+      <Filter>win</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WebCore\win\BitmapImage.cpp">

+      <Filter>Tests\WebCore</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WebCore\LayoutUnit.cpp">

+      <Filter>Tests\WebCore</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WebKit\win\WebViewDestruction.cpp">

+      <Filter>Tests\WebKit</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\CheckedArithmeticOperations.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\Functional.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\HashMap.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\MathExtras.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\MediaTime.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\SaturatedArithmeticOperations.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\StringHasher.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\StringOperators.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\Vector.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\VectorBasic.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\VectorReverse.cpp">

+      <Filter>Tests\WTF</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\cf\RetainPtr.cpp">

+      <Filter>Tests\WTF\cf</Filter>

+    </ClCompile>

+    <ClCompile Include="..\Tests\WTF\cf\RetainPtrHashing.cpp">

+      <Filter>Tests\WTF\cf</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="TestWebKitAPIPostBuild.cmd" />

+    <None Include="TestWebKitAPIPreBuild.cmd" />

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPICommon.props b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPICommon.props
new file mode 100644
index 0000000..3d589a4
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPICommon.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets" />

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <AdditionalDependencies>CFNetwork.lib;CoreFoundation.lib;WebKit.lib;JavaScriptCore.lib;gtest.lib;%(AdditionalDependencies)</AdditionalDependencies>

+    </Link>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir)..;$(ProjectDir)..\win;$(ConfigurationBuildDir)\Include;$(ConfigurationBuildDir)\Include\private\JavaScriptCore;$(ConfigurationBuildDir)\Include\WebCore\ForwardingHeaders;$(ConfigurationBuildDir)\Include\private;$(WebKit_Source)\ThirdParty\gtest\include;$(WebKit_Libraries)\include;$(WebKit_Libraries)\Include\private;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+  </ItemDefinitionGroup>

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPICommonWinCairo.props b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPICommonWinCairo.props
new file mode 100644
index 0000000..fc15249
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPICommonWinCairo.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets" />

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <AdditionalDependencies>CFLite.lib;WebKit.lib;JavaScriptCore.lib;gtest.lib;%(AdditionalDependencies)</AdditionalDependencies>

+    </Link>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir)..;$(ProjectDir)..\win;$(ConfigurationBuildDir)\Include;$(ConfigurationBuildDir)\Include\private\JavaScriptCore;$(ConfigurationBuildDir)\Include\WebCore\ForwardingHeaders;$(ConfigurationBuildDir)\Include\private;$(WebKit_Source)\ThirdParty\gtest\include;$(WebKit_Libraries)\include;$(WebKit_Libraries)\Include\private;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+  </ItemDefinitionGroup>

+  <ItemGroup />

+</Project>

diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebug.props b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebug.props
new file mode 100644
index 0000000..72fe2c9
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebug.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="TestWebKitAPICommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebugWinCairo.props b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebugWinCairo.props
new file mode 100644
index 0000000..6fafee9
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIDebugWinCairo.props
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefinesCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\WinCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\cURL.props" />

+    <Import Project="TestWebKitAPICommonWinCairo.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>

diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPostBuild.cmd b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPostBuild.cmd
new file mode 100644
index 0000000..26707ca
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPostBuild.cmd
@@ -0,0 +1 @@
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" del "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPreBuild.cmd b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPreBuild.cmd
new file mode 100644
index 0000000..a770776
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIPreBuild.cmd
@@ -0,0 +1,6 @@
+%SystemDrive%\cygwin\bin\which.exe bash
+if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH%
+cmd /c
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" grep XX%PROJECTNAME%XX "%CONFIGURATIONBUILDDIR%\buildfailed"
+if errorlevel 1 exit 1
+echo XX%PROJECTNAME%XX > "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIProduction.props b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIProduction.props
new file mode 100644
index 0000000..7c252b6
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIProduction.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="TestWebKitAPICommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIRelease.props b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIRelease.props
new file mode 100644
index 0000000..0c1ccbf
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIRelease.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="TestWebKitAPICommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIReleaseWinCairo.props b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIReleaseWinCairo.props
new file mode 100644
index 0000000..9ef4ff5
--- /dev/null
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPIReleaseWinCairo.props
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefinesCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\WinCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\cURL.props" />

+    <Import Project="TestWebKitAPICommonWinCairo.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>

diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
index dc256b4..5f66b09 100644
--- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
@@ -7,12 +7,14 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		00BC16871680FE810065F1E5 /* PublicSuffix.mm in Sources */ = {isa = PBXBuildFile; fileRef = 00BC16851680FE810065F1E5 /* PublicSuffix.mm */; };
 		00CD9F6315BE312C002DA2CE /* BackForwardList.mm in Sources */ = {isa = PBXBuildFile; fileRef = 00CD9F6215BE312C002DA2CE /* BackForwardList.mm */; };
 		0BCD833514857CE400EA2003 /* HashMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BCD833414857CE400EA2003 /* HashMap.cpp */; };
 		0BCD856A1485C98B00EA2003 /* TemporaryChange.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BCD85691485C98B00EA2003 /* TemporaryChange.cpp */; };
 		0F17BBD615AF6C4D007AB753 /* WebCoreStatisticsWithNoWebProcess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F17BBD415AF6C4D007AB753 /* WebCoreStatisticsWithNoWebProcess.cpp */; };
 		0FC6C4CC141027E0005B7F0C /* RedBlackTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FC6C4CB141027E0005B7F0C /* RedBlackTree.cpp */; };
 		0FC6C4CF141034AD005B7F0C /* MetaAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FC6C4CE141034AD005B7F0C /* MetaAllocator.cpp */; };
+		14464013167A8305000BD218 /* LayoutUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14464012167A8305000BD218 /* LayoutUnit.cpp */; };
 		14F3B11315E45EAB00210069 /* SaturatedArithmeticOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14F3B11215E45EAB00210069 /* SaturatedArithmeticOperations.cpp */; };
 		1A02C84F125D4A8400E3F4BD /* Find.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A02C84E125D4A8400E3F4BD /* Find.cpp */; };
 		1A02C870125D4CFD00E3F4BD /* find.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 1A02C84B125D4A5E00E3F4BD /* find.html */; };
@@ -23,6 +25,7 @@
 		1ADBEFE3130C6AA100D61D19 /* simple-accelerated-compositing.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 1ADBEFBC130C6A0100D61D19 /* simple-accelerated-compositing.html */; };
 		1AEDE22613E5E7E700E62FE8 /* InjectedBundleControllerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1AEDE22413E5E7A000E62FE8 /* InjectedBundleControllerMac.mm */; };
 		261516D615B0E60500A2C201 /* SetAndUpdateCacheModel.mm in Sources */ = {isa = PBXBuildFile; fileRef = 261516D515B0E60500A2C201 /* SetAndUpdateCacheModel.mm */; };
+		26300B1816755CD90066886D /* ListHashSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26300B1716755CD90066886D /* ListHashSet.cpp */; };
 		265AF55015D1E48A00B0CB4A /* WTFString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 265AF54F15D1E48A00B0CB4A /* WTFString.cpp */; };
 		266FAFD315E5775200F61D5B /* IntegerToStringConversion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266FAFD215E5775200F61D5B /* IntegerToStringConversion.cpp */; };
 		26A2C72F15E2E73C005B1A14 /* CString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26A2C72E15E2E73C005B1A14 /* CString.cpp */; };
@@ -32,6 +35,10 @@
 		26F1B44415CA434F00D1E4BF /* AtomicString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F1B44215CA434F00D1E4BF /* AtomicString.cpp */; };
 		26F1B44515CA434F00D1E4BF /* StringImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F1B44315CA434F00D1E4BF /* StringImpl.cpp */; };
 		2943BE86161DFEB800999E3D /* UserContentTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2943BE84161DFEB800999E3D /* UserContentTest.mm */; };
+		29AB8AA1164C735800D49BEC /* CustomProtocolsTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 29AB8A9F164C735800D49BEC /* CustomProtocolsTest.mm */; };
+		29AB8AA4164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 29AB8AA2164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.mm */; };
+		2E7765CD16C4D80A00BA2BB1 /* mainIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E7765CC16C4D80A00BA2BB1 /* mainIOS.mm */; };
+		2E7765CF16C4D81100BA2BB1 /* mainMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E7765CE16C4D81100BA2BB1 /* mainMac.mm */; };
 		333B9CE21277F23100FEFCE3 /* PreventEmptyUserAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 333B9CE11277F23100FEFCE3 /* PreventEmptyUserAgent.cpp */; };
 		33BE5AF5137B5A6C00705813 /* MouseMoveAfterCrash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 33BE5AF4137B5A6C00705813 /* MouseMoveAfterCrash.cpp */; };
 		33BE5AF9137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 33BE5AF8137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp */; };
@@ -41,6 +48,7 @@
 		33E79E06137B5FD900E32D99 /* mouse-move-listener.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 33E79E05137B5FCE00E32D99 /* mouse-move-listener.html */; };
 		37200B9213A16230007A4FAD /* VectorReverse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 37200B9113A16230007A4FAD /* VectorReverse.cpp */; };
 		3722C8691461E03E00C45D00 /* RenderedImageFromDOMRange.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3722C8681461E03E00C45D00 /* RenderedImageFromDOMRange.mm */; };
+		3751AF7C169518F800764319 /* DOMNodeFromJSObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3751AF7A169518F800764319 /* DOMNodeFromJSObject.mm */; };
 		3776BC63150946BC0043A66D /* DeviceScaleFactorInDashboardRegions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3776BC62150946BC0043A66D /* DeviceScaleFactorInDashboardRegions.mm */; };
 		378E64731632646D00B6C676 /* InjectedBundleFrameHitTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 378E64711632646D00B6C676 /* InjectedBundleFrameHitTest.cpp */; };
 		378E64771632655E00B6C676 /* InjectedBundleFrameHitTest_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 378E64751632655D00B6C676 /* InjectedBundleFrameHitTest_Bundle.cpp */; };
@@ -51,7 +59,12 @@
 		37A6895F148A9B50005100FA /* SubresourceErrorCrash.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37A6895D148A9B50005100FA /* SubresourceErrorCrash.mm */; };
 		37DC678D140D7C5000ABCCDB /* DOMRangeOfString.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37DC678B140D7C5000ABCCDB /* DOMRangeOfString.mm */; };
 		37DC6791140D7D7600ABCCDB /* DOMRangeOfString.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 37DC678F140D7D3A00ABCCDB /* DOMRangeOfString.html */; };
+		37E1064C1697681800B78BD0 /* DOMHTMLTableCellElementCellAbove.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 37E1064B169767F700B78BD0 /* DOMHTMLTableCellElementCellAbove.html */; };
+		37E1064D16976C8500B78BD0 /* DOMHTMLTableCellCellAbove.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37E1064A1697676400B78BD0 /* DOMHTMLTableCellCellAbove.mm */; };
+		37E38C34169B7D010084C28C /* WebViewDidRemoveFrameFromHierarchy.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37E38C33169B7D010084C28C /* WebViewDidRemoveFrameFromHierarchy.mm */; };
 		440A1D3914A0103A008A66F2 /* KURL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 440A1D3814A0103A008A66F2 /* KURL.cpp */; };
+		4BB4160216815B2600824238 /* JSWrapperForNodeInWebFrame.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4160116815B2600824238 /* JSWrapperForNodeInWebFrame.mm */; };
+		4BB4160416815F9100824238 /* ElementAtPointInWebFrame.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BB4160316815F9100824238 /* ElementAtPointInWebFrame.mm */; };
 		4BFDFFA71314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFDFFA61314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp */; };
 		4BFDFFA9131477770061F24B /* HitTestResultNodeHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFDFFA8131477770061F24B /* HitTestResultNodeHandle.cpp */; };
 		4F4D2C0E1626FE2700320FE1 /* MemoryInstrumentationTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F4D2C0D1626FE2700320FE1 /* MemoryInstrumentationTest.cpp */; };
@@ -76,10 +89,13 @@
 		76E182DD1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76E182DC1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp */; };
 		76E182DF154767E600F1FADD /* auto-submitting-form.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 76E182DE15475A8300F1FADD /* auto-submitting-form.html */; };
 		81B50193140F232300D9EB58 /* StringBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 81B50192140F232300D9EB58 /* StringBuilder.cpp */; };
+		8A2C750E16CED9550024F352 /* ResizeWindowAfterCrash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A2C750D16CED9550024F352 /* ResizeWindowAfterCrash.cpp */; };
+		8A3AF93B16C9ED2700D248C1 /* ReloadPageAfterCrash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A3AF93A16C9ED2700D248C1 /* ReloadPageAfterCrash.cpp */; };
 		930AD402150698D00067970F /* lots-of-text.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 930AD401150698B30067970F /* lots-of-text.html */; };
 		9318778915EEC57700A9CCE3 /* NewFirstVisuallyNonEmptyLayoutForImages.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AF4ECA1506F035007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages.cpp */; };
 		9361002914DC95A70061379D /* lots-of-iframes.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9361002814DC957B0061379D /* lots-of-iframes.html */; };
 		939BA91714103412001A01BD /* DeviceScaleFactorOnBack.mm in Sources */ = {isa = PBXBuildFile; fileRef = 939BA91614103412001A01BD /* DeviceScaleFactorOnBack.mm */; };
+		93ABA80916DDAB91002DB2FA /* StringHasher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93ABA80816DDAB91002DB2FA /* StringHasher.cpp */; };
 		93AF4ECE1506F064007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AF4ECD1506F064007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp */; };
 		93AF4ED01506F123007FD57E /* lots-of-images.html in Resources */ = {isa = PBXBuildFile; fileRef = 93AF4ECF1506F123007FD57E /* lots-of-images.html */; };
 		93AF4ED11506F130007FD57E /* lots-of-images.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 93AF4ECF1506F123007FD57E /* lots-of-images.html */; };
@@ -93,6 +109,9 @@
 		9B26FCCA159D16DE00CC3765 /* HTMLFormCollectionNamedItem.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B26FCB4159D15E700CC3765 /* HTMLFormCollectionNamedItem.html */; };
 		9B4F8FA4159D52B1002D9F94 /* HTMLCollectionNamedItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9B4F8FA3159D52B1002D9F94 /* HTMLCollectionNamedItem.mm */; };
 		9B4F8FA7159D52DD002D9F94 /* HTMLCollectionNamedItem.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */; };
+		A51B650916ADF9B1007AA5D9 /* PageVisibilityState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A51B650816ADF9B1007AA5D9 /* PageVisibilityState.cpp */; };
+		A57A34F016AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm in Sources */ = {isa = PBXBuildFile; fileRef = A57A34EF16AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm */; };
+		A57A34F216AF6B2B00C2501F /* PageVisibilityStateWithWindowChanges.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = A57A34F116AF69E200C2501F /* PageVisibilityStateWithWindowChanges.html */; };
 		A5E2027315B2181900C13E14 /* WindowlessWebViewWithMedia.mm in Sources */ = {isa = PBXBuildFile; fileRef = A5E2027215B2181900C13E14 /* WindowlessWebViewWithMedia.mm */; };
 		A5E2027515B21F6E00C13E14 /* WindowlessWebViewWithMedia.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = A5E2027015B2180600C13E14 /* WindowlessWebViewWithMedia.html */; };
 		A7A966DB140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7A966DA140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp */; };
@@ -103,7 +122,6 @@
 		BC029B181486AD6400817DA9 /* RetainPtr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC029B161486AD6400817DA9 /* RetainPtr.cpp */; };
 		BC029B1C1486B25900817DA9 /* RetainPtr.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC029B1B1486B25900817DA9 /* RetainPtr.mm */; };
 		BC131885117114B600B69727 /* PlatformUtilitiesMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC131884117114B600B69727 /* PlatformUtilitiesMac.mm */; };
-		BC131A9B1171316900B69727 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC131A9A1171316900B69727 /* main.mm */; };
 		BC131AA9117131FC00B69727 /* TestsController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC131AA8117131FC00B69727 /* TestsController.cpp */; };
 		BC22D31514DC689800FFB1DD /* UserMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC22D31314DC689800FFB1DD /* UserMessage.cpp */; };
 		BC22D31914DC68B900FFB1DD /* UserMessage_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC22D31714DC68B800FFB1DD /* UserMessage_Bundle.cpp */; };
@@ -130,17 +148,14 @@
 		BC901E331492AF390074A667 /* WKConnection_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC901E311492AF390074A667 /* WKConnection_Bundle.cpp */; };
 		BC90955D125548AA00083756 /* PlatformWebViewMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC90955C125548AA00083756 /* PlatformWebViewMac.mm */; };
 		BC90964C125561BF00083756 /* VectorBasic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC90964B125561BF00083756 /* VectorBasic.cpp */; };
-		BC90964E1255620C00083756 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC90964D1255620C00083756 /* JavaScriptCore.framework */; };
 		BC90977A125571AB00083756 /* PageLoadBasic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC909779125571AB00083756 /* PageLoadBasic.cpp */; };
 		BC909784125571CF00083756 /* simple.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = BC909778125571AB00083756 /* simple.html */; };
 		BC90995E12567BC100083756 /* WKString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC90995D12567BC100083756 /* WKString.cpp */; };
 		BC9099941256ACF100083756 /* WKStringJSString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC9099931256ACF100083756 /* WKStringJSString.cpp */; };
-		BCA61DB511700EFD00460D1E /* WebKit2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA61DB411700EFD00460D1E /* WebKit2.framework */; };
 		BCAA485614A0444C0088FAC4 /* simple-tall.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = BCAA485514A021640088FAC4 /* simple-tall.html */; };
 		BCAA485814A044D40088FAC4 /* EditorCommands.mm in Sources */ = {isa = PBXBuildFile; fileRef = BCAA485714A044D40088FAC4 /* EditorCommands.mm */; };
 		BCB68040126FBFE100642A61 /* DocumentStartUserScriptAlertCrash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCB6803F126FBFE100642A61 /* DocumentStartUserScriptAlertCrash.cpp */; };
 		BCB68042126FBFF100642A61 /* DocumentStartUserScriptAlertCrash_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCB68041126FBFF100642A61 /* DocumentStartUserScriptAlertCrash_Bundle.cpp */; };
-		BCB9E9F111235BDE00A137E0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCB9E9F011235BDE00A137E0 /* Cocoa.framework */; };
 		BCBD3710125AA2EB00D2C29F /* FrameMIMETypeHTML.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCBD370F125AA2EB00D2C29F /* FrameMIMETypeHTML.cpp */; };
 		BCBD3737125ABBEB00D2C29F /* icon.png in Copy Resources */ = {isa = PBXBuildFile; fileRef = BCBD372E125ABBE600D2C29F /* icon.png */; };
 		BCBD3761125ABCFE00D2C29F /* FrameMIMETypePNG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCBD3760125ABCFE00D2C29F /* FrameMIMETypePNG.cpp */; };
@@ -148,13 +163,11 @@
 		C01363C813C3997300EF3964 /* StringOperators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C01363C713C3997300EF3964 /* StringOperators.cpp */; };
 		C01A23F21266156700C9ED55 /* spacebar-scrolling.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = C02B7882126615410026BF0F /* spacebar-scrolling.html */; };
 		C02B77F2126612140026BF0F /* SpacebarScrolling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C02B77F1126612140026BF0F /* SpacebarScrolling.cpp */; };
-		C02B7854126613AE0026BF0F /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C02B7853126613AE0026BF0F /* Carbon.framework */; };
 		C045F9451385C2EA00C0F3CD /* DownloadDecideDestinationCrash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C045F9441385C2E900C0F3CD /* DownloadDecideDestinationCrash.cpp */; };
 		C07E6CAF13FD67650038B22B /* DynamicDeviceScaleFactor.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07E6CAE13FD67650038B22B /* DynamicDeviceScaleFactor.mm */; };
 		C07E6CB213FD73930038B22B /* devicePixelRatio.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = C07E6CB113FD738A0038B22B /* devicePixelRatio.html */; };
 		C081224213FC172400DC39AE /* JavaScriptTestMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = C081224013FC172400DC39AE /* JavaScriptTestMac.mm */; };
 		C081224513FC19EC00DC39AE /* SyntheticBackingScaleFactorWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = C081224413FC19EC00DC39AE /* SyntheticBackingScaleFactorWindow.m */; };
-		C081224913FC1B0300DC39AE /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C081224813FC1B0300DC39AE /* WebKit.framework */; };
 		C08587BF13FE956C001EF4E5 /* WebKitAgnosticTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = C08587BD13FE956C001EF4E5 /* WebKitAgnosticTest.mm */; };
 		C08587FC13FEC39B001EF4E5 /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = C08587FB13FEC39B001EF4E5 /* InstanceMethodSwizzler.mm */; };
 		C085880013FEC3A6001EF4E5 /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = C08587FF13FEC3A6001EF4E5 /* InstanceMethodSwizzler.mm */; };
@@ -166,14 +179,20 @@
 		C0BD669F131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C0BD669E131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp */; };
 		C0C5D3BE14598B6F00A802A6 /* GetBackingScaleFactor.mm in Sources */ = {isa = PBXBuildFile; fileRef = C0C5D3BC14598B6F00A802A6 /* GetBackingScaleFactor.mm */; };
 		C0C5D3C61459912900A802A6 /* GetBackingScaleFactor_Bundle.mm in Sources */ = {isa = PBXBuildFile; fileRef = C0C5D3BD14598B6F00A802A6 /* GetBackingScaleFactor_Bundle.mm */; };
+		C2CF975A16CEC7140054E99D /* JSContextBackForwardCache2.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = C2CF975916CEC69E0054E99D /* JSContextBackForwardCache2.html */; };
+		C2CF975B16CEC71B0054E99D /* JSContextBackForwardCache1.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = C2CF975816CEC69E0054E99D /* JSContextBackForwardCache1.html */; };
+		C2EB2DD316CAC7AC009B52EE /* WebViewDidCreateJavaScriptContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = C2EB2DD116CAC7AC009B52EE /* WebViewDidCreateJavaScriptContext.mm */; };
 		C507E8A714C6545B005D6B3B /* InspectorBar.mm in Sources */ = {isa = PBXBuildFile; fileRef = C507E8A614C6545B005D6B3B /* InspectorBar.mm */; };
+		C51AFB99169F49FF009CCF66 /* FindMatches.mm in Sources */ = {isa = PBXBuildFile; fileRef = C51AFB98169F49FF009CCF66 /* FindMatches.mm */; };
 		C540F776152E4DA000A40C8C /* SimplifyMarkup.mm in Sources */ = {isa = PBXBuildFile; fileRef = C540F775152E4DA000A40C8C /* SimplifyMarkup.mm */; };
 		C540F784152E5A9A00A40C8C /* verboseMarkup.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = C540F783152E5A7800A40C8C /* verboseMarkup.html */; };
+		C54237F016B8955800E638FC /* PasteboardNotifications.mm in Sources */ = {isa = PBXBuildFile; fileRef = C54237EE16B8955800E638FC /* PasteboardNotifications.mm */; };
+		C54237F116B8957D00E638FC /* PasteboardNotifications_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C54237ED16B8955800E638FC /* PasteboardNotifications_Bundle.cpp */; };
+		C5E1AFFE16B221F1006CC1F2 /* execCopy.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = C5E1AFFD16B22179006CC1F2 /* execCopy.html */; };
 		CD5497B415857F0C00B5BC30 /* MediaTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD5497B315857F0C00B5BC30 /* MediaTime.cpp */; };
 		E1220DA0155B25480013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1220D9F155B25480013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.mm */; };
 		E1220DCA155B28AA0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = E1220DC9155B287D0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html */; };
 		E490296814E2E3A4002BEDD1 /* TypingStyleCrash.mm in Sources */ = {isa = PBXBuildFile; fileRef = E490296714E2E3A4002BEDD1 /* TypingStyleCrash.mm */; };
-		F3FC3EE313678B7300126A65 /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F3FC3EE213678B7300126A65 /* libgtest.a */; };
 		F660AA0D15A5F061003A1243 /* GetInjectedBundleInitializationUserDataCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F660AA0C15A5F061003A1243 /* GetInjectedBundleInitializationUserDataCallback.cpp */; };
 		F660AA1115A5F631003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F660AA0F15A5F624003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp */; };
 		F660AA1315A619C9003A1243 /* InjectedBundleInitializationUserDataCallbackWins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F660AA1215A619C8003A1243 /* InjectedBundleInitializationUserDataCallbackWins.cpp */; };
@@ -212,37 +231,42 @@
 			dstPath = TestWebKitAPI.resources;
 			dstSubfolderSpec = 7;
 			files = (
-				52B8CF9815868D9100281053 /* SetDocumentURI.html in Copy Resources */,
+				C2CF975B16CEC71B0054E99D /* JSContextBackForwardCache1.html in Copy Resources */,
+				C2CF975A16CEC7140054E99D /* JSContextBackForwardCache2.html in Copy Resources */,
+				1A9E52C913E65EF4006917F5 /* 18-characters.html in Copy Resources */,
+				379028B914FAC24C007E6B43 /* acceptsFirstMouse.html in Copy Resources */,
 				B55F11BE15191A0600915916 /* Ahem.ttf in Copy Resources */,
 				B55F11B71517D03300915916 /* attributedStringCustomFont.html in Copy Resources */,
 				76E182DF154767E600F1FADD /* auto-submitting-form.html in Copy Resources */,
 				26DF5A6315A2A27E003689C2 /* CancelLoadFromResourceLoadDelegate.html in Copy Resources */,
 				5142B2731517C8C800C32B19 /* ContextMenuCanCopyURL.html in Copy Resources */,
+				C07E6CB213FD73930038B22B /* devicePixelRatio.html in Copy Resources */,
+				37E1064C1697681800B78BD0 /* DOMHTMLTableCellElementCellAbove.html in Copy Resources */,
+				37DC6791140D7D7600ABCCDB /* DOMRangeOfString.html in Copy Resources */,
+				C5E1AFFE16B221F1006CC1F2 /* execCopy.html in Copy Resources */,
+				BC2D006412AA04CE00E732A3 /* file-with-anchor.html in Copy Resources */,
+				1A02C870125D4CFD00E3F4BD /* find.html in Copy Resources */,
 				9B4F8FA7159D52DD002D9F94 /* HTMLCollectionNamedItem.html in Copy Resources */,
 				9B26FCCA159D16DE00CC3765 /* HTMLFormCollectionNamedItem.html in Copy Resources */,
-				E1220DCA155B28AA0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html in Copy Resources */,
-				517E7E04151119C100D0B008 /* MemoryCachePruneWithinResourceLoadDelegate.html in Copy Resources */,
-				A5E2027515B21F6E00C13E14 /* WindowlessWebViewWithMedia.html in Copy Resources */,
-				379028B914FAC24C007E6B43 /* acceptsFirstMouse.html in Copy Resources */,
-				33DC8912141955FE00747EF7 /* simple-iframe.html in Copy Resources */,
-				1A9E52C913E65EF4006917F5 /* 18-characters.html in Copy Resources */,
-				C07E6CB213FD73930038B22B /* devicePixelRatio.html in Copy Resources */,
+				BCBD3737125ABBEB00D2C29F /* icon.png in Copy Resources */,
 				378E64791632707400B6C676 /* link-with-title.html in Copy Resources */,
 				9361002914DC95A70061379D /* lots-of-iframes.html in Copy Resources */,
 				93AF4ED11506F130007FD57E /* lots-of-images.html in Copy Resources */,
 				930AD402150698D00067970F /* lots-of-text.html in Copy Resources */,
+				E1220DCA155B28AA0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html in Copy Resources */,
+				517E7E04151119C100D0B008 /* MemoryCachePruneWithinResourceLoadDelegate.html in Copy Resources */,
 				33E79E06137B5FD900E32D99 /* mouse-move-listener.html in Copy Resources */,
+				A57A34F216AF6B2B00C2501F /* PageVisibilityStateWithWindowChanges.html in Copy Resources */,
 				F6FDDDD614241C6F004F1729 /* push-state.html in Copy Resources */,
-				BCBD3737125ABBEB00D2C29F /* icon.png in Copy Resources */,
-				1A02C870125D4CFD00E3F4BD /* find.html in Copy Resources */,
-				BC909784125571CF00083756 /* simple.html in Copy Resources */,
-				C0ADBE9612FCA79B00D2C129 /* simple-form.html in Copy Resources */,
-				BCAA485614A0444C0088FAC4 /* simple-tall.html in Copy Resources */,
-				C01A23F21266156700C9ED55 /* spacebar-scrolling.html in Copy Resources */,
-				BC2D006412AA04CE00E732A3 /* file-with-anchor.html in Copy Resources */,
-				37DC6791140D7D7600ABCCDB /* DOMRangeOfString.html in Copy Resources */,
+				52B8CF9815868D9100281053 /* SetDocumentURI.html in Copy Resources */,
 				1ADBEFE3130C6AA100D61D19 /* simple-accelerated-compositing.html in Copy Resources */,
+				C0ADBE9612FCA79B00D2C129 /* simple-form.html in Copy Resources */,
+				33DC8912141955FE00747EF7 /* simple-iframe.html in Copy Resources */,
+				BCAA485614A0444C0088FAC4 /* simple-tall.html in Copy Resources */,
+				BC909784125571CF00083756 /* simple.html in Copy Resources */,
+				C01A23F21266156700C9ED55 /* spacebar-scrolling.html in Copy Resources */,
 				C540F784152E5A9A00A40C8C /* verboseMarkup.html in Copy Resources */,
+				A5E2027515B21F6E00C13E14 /* WindowlessWebViewWithMedia.html in Copy Resources */,
 			);
 			name = "Copy Resources";
 			runOnlyForDeploymentPostprocessing = 0;
@@ -250,12 +274,14 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		00BC16851680FE810065F1E5 /* PublicSuffix.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PublicSuffix.mm; sourceTree = "<group>"; };
 		00CD9F6215BE312C002DA2CE /* BackForwardList.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = BackForwardList.mm; sourceTree = "<group>"; };
 		0BCD833414857CE400EA2003 /* HashMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HashMap.cpp; path = WTF/HashMap.cpp; sourceTree = "<group>"; };
 		0BCD85691485C98B00EA2003 /* TemporaryChange.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TemporaryChange.cpp; path = WTF/TemporaryChange.cpp; sourceTree = "<group>"; };
 		0F17BBD415AF6C4D007AB753 /* WebCoreStatisticsWithNoWebProcess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebCoreStatisticsWithNoWebProcess.cpp; sourceTree = "<group>"; };
 		0FC6C4CB141027E0005B7F0C /* RedBlackTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RedBlackTree.cpp; path = WTF/RedBlackTree.cpp; sourceTree = "<group>"; };
 		0FC6C4CE141034AD005B7F0C /* MetaAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MetaAllocator.cpp; path = WTF/MetaAllocator.cpp; sourceTree = "<group>"; };
+		14464012167A8305000BD218 /* LayoutUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutUnit.cpp; sourceTree = "<group>"; };
 		14F3B11215E45EAB00210069 /* SaturatedArithmeticOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SaturatedArithmeticOperations.cpp; path = WTF/SaturatedArithmeticOperations.cpp; sourceTree = "<group>"; };
 		1A02C84B125D4A5E00E3F4BD /* find.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = find.html; sourceTree = "<group>"; };
 		1A02C84E125D4A8400E3F4BD /* Find.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Find.cpp; sourceTree = "<group>"; };
@@ -265,6 +291,7 @@
 		1ADBEFBC130C6A0100D61D19 /* simple-accelerated-compositing.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "simple-accelerated-compositing.html"; sourceTree = "<group>"; };
 		1AEDE22413E5E7A000E62FE8 /* InjectedBundleControllerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InjectedBundleControllerMac.mm; sourceTree = "<group>"; };
 		261516D515B0E60500A2C201 /* SetAndUpdateCacheModel.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SetAndUpdateCacheModel.mm; sourceTree = "<group>"; };
+		26300B1716755CD90066886D /* ListHashSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ListHashSet.cpp; path = WTF/ListHashSet.cpp; sourceTree = "<group>"; };
 		265AF54F15D1E48A00B0CB4A /* WTFString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WTFString.cpp; path = WTF/WTFString.cpp; sourceTree = "<group>"; };
 		266FAFD215E5775200F61D5B /* IntegerToStringConversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = IntegerToStringConversion.cpp; path = WTF/IntegerToStringConversion.cpp; sourceTree = "<group>"; };
 		26A2C72E15E2E73C005B1A14 /* CString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CString.cpp; path = WTF/CString.cpp; sourceTree = "<group>"; };
@@ -274,6 +301,11 @@
 		26F1B44215CA434F00D1E4BF /* AtomicString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AtomicString.cpp; path = WTF/AtomicString.cpp; sourceTree = "<group>"; };
 		26F1B44315CA434F00D1E4BF /* StringImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringImpl.cpp; path = WTF/StringImpl.cpp; sourceTree = "<group>"; };
 		2943BE84161DFEB800999E3D /* UserContentTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UserContentTest.mm; path = WebKit2ObjC/UserContentTest.mm; sourceTree = "<group>"; };
+		29AB8A9F164C735800D49BEC /* CustomProtocolsTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CustomProtocolsTest.mm; path = WebKit2ObjC/CustomProtocolsTest.mm; sourceTree = "<group>"; };
+		29AB8AA2164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TestBrowsingContextLoadDelegate.mm; sourceTree = "<group>"; };
+		29AB8AA3164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestBrowsingContextLoadDelegate.h; sourceTree = "<group>"; };
+		2E7765CC16C4D80A00BA2BB1 /* mainIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = mainIOS.mm; sourceTree = "<group>"; };
+		2E7765CE16C4D81100BA2BB1 /* mainMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = mainMac.mm; sourceTree = "<group>"; };
 		333B9CE11277F23100FEFCE3 /* PreventEmptyUserAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PreventEmptyUserAgent.cpp; sourceTree = "<group>"; };
 		33BE5AF4137B5A6C00705813 /* MouseMoveAfterCrash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseMoveAfterCrash.cpp; sourceTree = "<group>"; };
 		33BE5AF8137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseMoveAfterCrash_Bundle.cpp; sourceTree = "<group>"; };
@@ -283,6 +315,7 @@
 		33E79E05137B5FCE00E32D99 /* mouse-move-listener.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "mouse-move-listener.html"; sourceTree = "<group>"; };
 		37200B9113A16230007A4FAD /* VectorReverse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VectorReverse.cpp; path = WTF/VectorReverse.cpp; sourceTree = "<group>"; };
 		3722C8681461E03E00C45D00 /* RenderedImageFromDOMRange.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderedImageFromDOMRange.mm; sourceTree = "<group>"; };
+		3751AF7A169518F800764319 /* DOMNodeFromJSObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMNodeFromJSObject.mm; sourceTree = "<group>"; };
 		3776BC62150946BC0043A66D /* DeviceScaleFactorInDashboardRegions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceScaleFactorInDashboardRegions.mm; sourceTree = "<group>"; };
 		378E64711632646D00B6C676 /* InjectedBundleFrameHitTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleFrameHitTest.cpp; sourceTree = "<group>"; };
 		378E64751632655D00B6C676 /* InjectedBundleFrameHitTest_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleFrameHitTest_Bundle.cpp; sourceTree = "<group>"; };
@@ -293,8 +326,13 @@
 		37A6895D148A9B50005100FA /* SubresourceErrorCrash.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SubresourceErrorCrash.mm; sourceTree = "<group>"; };
 		37DC678B140D7C5000ABCCDB /* DOMRangeOfString.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMRangeOfString.mm; sourceTree = "<group>"; };
 		37DC678F140D7D3A00ABCCDB /* DOMRangeOfString.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DOMRangeOfString.html; sourceTree = "<group>"; };
+		37E1064A1697676400B78BD0 /* DOMHTMLTableCellCellAbove.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMHTMLTableCellCellAbove.mm; sourceTree = "<group>"; };
+		37E1064B169767F700B78BD0 /* DOMHTMLTableCellElementCellAbove.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DOMHTMLTableCellElementCellAbove.html; sourceTree = "<group>"; };
+		37E38C33169B7D010084C28C /* WebViewDidRemoveFrameFromHierarchy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebViewDidRemoveFrameFromHierarchy.mm; sourceTree = "<group>"; };
 		440A1D3814A0103A008A66F2 /* KURL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KURL.cpp; sourceTree = "<group>"; };
 		44A622C114A0E2B60048515B /* WTFStringUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WTFStringUtilities.h; sourceTree = "<group>"; };
+		4BB4160116815B2600824238 /* JSWrapperForNodeInWebFrame.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = JSWrapperForNodeInWebFrame.mm; sourceTree = "<group>"; };
+		4BB4160316815F9100824238 /* ElementAtPointInWebFrame.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ElementAtPointInWebFrame.mm; sourceTree = "<group>"; };
 		4BFDFFA61314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HitTestResultNodeHandle_Bundle.cpp; sourceTree = "<group>"; };
 		4BFDFFA8131477770061F24B /* HitTestResultNodeHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HitTestResultNodeHandle.cpp; sourceTree = "<group>"; };
 		4F4D2C0D1626FE2700320FE1 /* MemoryInstrumentationTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MemoryInstrumentationTest.cpp; path = WTF/MemoryInstrumentationTest.cpp; sourceTree = "<group>"; };
@@ -319,10 +357,13 @@
 		76E182DC1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WillSendSubmitEvent_Bundle.cpp; sourceTree = "<group>"; };
 		76E182DE15475A8300F1FADD /* auto-submitting-form.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "auto-submitting-form.html"; sourceTree = "<group>"; };
 		81B50192140F232300D9EB58 /* StringBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringBuilder.cpp; path = WTF/StringBuilder.cpp; sourceTree = "<group>"; };
+		8A2C750D16CED9550024F352 /* ResizeWindowAfterCrash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResizeWindowAfterCrash.cpp; sourceTree = "<group>"; };
+		8A3AF93A16C9ED2700D248C1 /* ReloadPageAfterCrash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReloadPageAfterCrash.cpp; sourceTree = "<group>"; };
 		8DD76FA10486AA7600D96B5E /* TestWebKitAPI */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TestWebKitAPI; sourceTree = BUILT_PRODUCTS_DIR; };
 		930AD401150698B30067970F /* lots-of-text.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "lots-of-text.html"; sourceTree = "<group>"; };
 		9361002814DC957B0061379D /* lots-of-iframes.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "lots-of-iframes.html"; sourceTree = "<group>"; };
 		939BA91614103412001A01BD /* DeviceScaleFactorOnBack.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceScaleFactorOnBack.mm; sourceTree = "<group>"; };
+		93ABA80816DDAB91002DB2FA /* StringHasher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringHasher.cpp; path = WTF/StringHasher.cpp; sourceTree = "<group>"; };
 		93AF4ECA1506F035007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NewFirstVisuallyNonEmptyLayoutForImages.cpp; sourceTree = "<group>"; };
 		93AF4ECD1506F064007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp; sourceTree = "<group>"; };
 		93AF4ECF1506F123007FD57E /* lots-of-images.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "lots-of-images.html"; sourceTree = "<group>"; };
@@ -336,6 +377,9 @@
 		9B26FCB4159D15E700CC3765 /* HTMLFormCollectionNamedItem.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = HTMLFormCollectionNamedItem.html; sourceTree = "<group>"; };
 		9B4F8FA3159D52B1002D9F94 /* HTMLCollectionNamedItem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = HTMLCollectionNamedItem.mm; sourceTree = "<group>"; };
 		9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = HTMLCollectionNamedItem.html; sourceTree = "<group>"; };
+		A51B650816ADF9B1007AA5D9 /* PageVisibilityState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageVisibilityState.cpp; sourceTree = "<group>"; };
+		A57A34EF16AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PageVisibilityStateWithWindowChanges.mm; sourceTree = "<group>"; };
+		A57A34F116AF69E200C2501F /* PageVisibilityStateWithWindowChanges.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = PageVisibilityStateWithWindowChanges.html; sourceTree = "<group>"; };
 		A5E2027015B2180600C13E14 /* WindowlessWebViewWithMedia.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = WindowlessWebViewWithMedia.html; sourceTree = "<group>"; };
 		A5E2027215B2181900C13E14 /* WindowlessWebViewWithMedia.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WindowlessWebViewWithMedia.mm; sourceTree = "<group>"; };
 		A7A966DA140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CheckedArithmeticOperations.cpp; path = WTF/CheckedArithmeticOperations.cpp; sourceTree = "<group>"; };
@@ -347,7 +391,6 @@
 		BC029B1B1486B25900817DA9 /* RetainPtr.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RetainPtr.mm; path = WTF/ns/RetainPtr.mm; sourceTree = "<group>"; };
 		BC131883117114A800B69727 /* PlatformUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformUtilities.h; sourceTree = "<group>"; };
 		BC131884117114B600B69727 /* PlatformUtilitiesMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlatformUtilitiesMac.mm; sourceTree = "<group>"; };
-		BC131A9A1171316900B69727 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
 		BC131A9E1171317C00B69727 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
 		BC131AA8117131FC00B69727 /* TestsController.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; path = TestsController.cpp; sourceTree = "<group>"; };
 		BC22D31314DC689800FFB1DD /* UserMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMessage.cpp; sourceTree = "<group>"; };
@@ -422,9 +465,16 @@
 		C0BD669E131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResponsivenessTimerDoesntFireEarly_Bundle.cpp; sourceTree = "<group>"; };
 		C0C5D3BC14598B6F00A802A6 /* GetBackingScaleFactor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetBackingScaleFactor.mm; sourceTree = "<group>"; };
 		C0C5D3BD14598B6F00A802A6 /* GetBackingScaleFactor_Bundle.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetBackingScaleFactor_Bundle.mm; sourceTree = "<group>"; };
+		C2CF975816CEC69E0054E99D /* JSContextBackForwardCache1.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = JSContextBackForwardCache1.html; sourceTree = "<group>"; };
+		C2CF975916CEC69E0054E99D /* JSContextBackForwardCache2.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = JSContextBackForwardCache2.html; sourceTree = "<group>"; };
+		C2EB2DD116CAC7AC009B52EE /* WebViewDidCreateJavaScriptContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebViewDidCreateJavaScriptContext.mm; sourceTree = "<group>"; };
 		C507E8A614C6545B005D6B3B /* InspectorBar.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InspectorBar.mm; sourceTree = "<group>"; };
+		C51AFB98169F49FF009CCF66 /* FindMatches.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FindMatches.mm; sourceTree = "<group>"; };
 		C540F775152E4DA000A40C8C /* SimplifyMarkup.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SimplifyMarkup.mm; sourceTree = "<group>"; };
 		C540F783152E5A7800A40C8C /* verboseMarkup.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = verboseMarkup.html; sourceTree = "<group>"; };
+		C54237ED16B8955800E638FC /* PasteboardNotifications_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PasteboardNotifications_Bundle.cpp; sourceTree = "<group>"; };
+		C54237EE16B8955800E638FC /* PasteboardNotifications.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PasteboardNotifications.mm; sourceTree = "<group>"; };
+		C5E1AFFD16B22179006CC1F2 /* execCopy.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = execCopy.html; sourceTree = "<group>"; };
 		CD5497B315857F0C00B5BC30 /* MediaTime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MediaTime.cpp; path = WTF/MediaTime.cpp; sourceTree = "<group>"; };
 		E1220D9F155B25480013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MemoryCacheDisableWithinResourceLoadDelegate.mm; sourceTree = "<group>"; };
 		E1220DC9155B287D0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = MemoryCacheDisableWithinResourceLoadDelegate.html; sourceTree = "<group>"; };
@@ -447,12 +497,6 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				BCB9E9F111235BDE00A137E0 /* Cocoa.framework in Frameworks */,
-				C081224913FC1B0300DC39AE /* WebKit.framework in Frameworks */,
-				BCA61DB511700EFD00460D1E /* WebKit2.framework in Frameworks */,
-				BC90964E1255620C00083756 /* JavaScriptCore.framework in Frameworks */,
-				C02B7854126613AE0026BF0F /* Carbon.framework in Frameworks */,
-				F3FC3EE313678B7300126A65 /* libgtest.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -461,8 +505,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				BC575A90126E74D3006F0F12 /* Cocoa.framework in Frameworks */,
-				BC575A91126E74D3006F0F12 /* WebKit2.framework in Frameworks */,
 				BC575A92126E74D3006F0F12 /* JavaScriptCore.framework in Frameworks */,
+				BC575A91126E74D3006F0F12 /* WebKit2.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -484,11 +528,12 @@
 		08FB7795FE84155DC02AAC07 /* Source */ = {
 			isa = PBXGroup;
 			children = (
-				BCA61C3A11700B9400460D1E /* mac */,
 				BC575944126E733C006F0F12 /* InjectedBundle */,
+				2E9660DC16C07D7B00371B42 /* ios */,
+				BCA61C3A11700B9400460D1E /* mac */,
+				BC131A9E1171317C00B69727 /* config.h */,
 				C0ADBE7A12FCA4D000D2C129 /* JavaScriptTest.cpp */,
 				C0ADBE7B12FCA4D000D2C129 /* JavaScriptTest.h */,
-				BC131A9E1171317C00B69727 /* config.h */,
 				BC575BBF126F5752006F0F12 /* PlatformUtilities.cpp */,
 				BC131883117114A800B69727 /* PlatformUtilities.h */,
 				BC90951B125533D700083756 /* PlatformWebView.h */,
@@ -503,12 +548,12 @@
 		08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = {
 			isa = PBXGroup;
 			children = (
-				F3FC3EE213678B7300126A65 /* libgtest.a */,
+				C02B7853126613AE0026BF0F /* Carbon.framework */,
 				BCB9E9F011235BDE00A137E0 /* Cocoa.framework */,
 				BC90964D1255620C00083756 /* JavaScriptCore.framework */,
+				F3FC3EE213678B7300126A65 /* libgtest.a */,
 				C081224813FC1B0300DC39AE /* WebKit.framework */,
 				BCA61DB411700EFD00460D1E /* WebKit2.framework */,
-				C02B7853126613AE0026BF0F /* Carbon.framework */,
 			);
 			name = "External Frameworks and Libraries";
 			sourceTree = "<group>";
@@ -522,10 +567,19 @@
 			name = Products;
 			sourceTree = "<group>";
 		};
+		2E9660DC16C07D7B00371B42 /* ios */ = {
+			isa = PBXGroup;
+			children = (
+				2E7765CC16C4D80A00BA2BB1 /* mainIOS.mm */,
+			);
+			path = ios;
+			sourceTree = "<group>";
+		};
 		440A1D3614A01000008A66F2 /* WebCore */ = {
 			isa = PBXGroup;
 			children = (
 				440A1D3814A0103A008A66F2 /* KURL.cpp */,
+				14464012167A8305000BD218 /* LayoutUnit.cpp */,
 			);
 			path = WebCore;
 			sourceTree = "<group>";
@@ -541,6 +595,7 @@
 		BC3C4C6F14575B1D0025FB62 /* WebKit2 Objective-C */ = {
 			isa = PBXGroup;
 			children = (
+				29AB8A9F164C735800D49BEC /* CustomProtocolsTest.mm */,
 				2943BE84161DFEB800999E3D /* UserContentTest.mm */,
 				BC3C4C7D14587AA60025FB62 /* WKBrowsingContextGroupTest.mm */,
 				BC3C4C7014575B6A0025FB62 /* WKBrowsingContextLoadDelegateTest.mm */,
@@ -552,10 +607,10 @@
 			isa = PBXGroup;
 			children = (
 				BC575981126E74AF006F0F12 /* InjectedBundle-Info.plist */,
+				BC575AA0126E7657006F0F12 /* InjectedBundleController.cpp */,
+				BC575A9F126E7657006F0F12 /* InjectedBundleController.h */,
 				BC575946126E7351006F0F12 /* InjectedBundleMain.cpp */,
 				BC575A9E126E75FB006F0F12 /* InjectedBundleTest.h */,
-				BC575A9F126E7657006F0F12 /* InjectedBundleController.h */,
-				BC575AA0126E7657006F0F12 /* InjectedBundleController.cpp */,
 			);
 			name = InjectedBundle;
 			sourceTree = "<group>";
@@ -580,16 +635,17 @@
 				BC246D98132F1FE100B56D7C /* CanHandleRequest.cpp */,
 				BC246D97132F1FE100B56D7C /* CanHandleRequest_Bundle.cpp */,
 				F6F3F29013342FEB00A6BF19 /* CookieManager.cpp */,
+				BCB6803F126FBFE100642A61 /* DocumentStartUserScriptAlertCrash.cpp */,
+				BCB68041126FBFF100642A61 /* DocumentStartUserScriptAlertCrash_Bundle.cpp */,
 				51393E1E1523944A005F39C5 /* DOMWindowExtensionBasic.cpp */,
 				51393E1D1523944A005F39C5 /* DOMWindowExtensionBasic_Bundle.cpp */,
 				F6F49C6715545C8D0007F39D /* DOMWindowExtensionNoCache.cpp */,
 				F6F49C6615545C8D0007F39D /* DOMWindowExtensionNoCache_Bundle.cpp */,
-				BCB6803F126FBFE100642A61 /* DocumentStartUserScriptAlertCrash.cpp */,
-				BCB68041126FBFF100642A61 /* DocumentStartUserScriptAlertCrash_Bundle.cpp */,
 				C045F9441385C2E900C0F3CD /* DownloadDecideDestinationCrash.cpp */,
 				1A5FEFDC1270E2A3000E2921 /* EvaluateJavaScript.cpp */,
 				BCC8B95A12611F4700DE46A4 /* FailedLoad.cpp */,
 				1A02C84E125D4A8400E3F4BD /* Find.cpp */,
+				C51AFB98169F49FF009CCF66 /* FindMatches.mm */,
 				1ADBEFAD130C689C00D61D19 /* ForceRepaint.cpp */,
 				BCBD370F125AA2EB00D2C29F /* FrameMIMETypeHTML.cpp */,
 				BCBD3760125ABCFE00D2C29F /* FrameMIMETypePNG.cpp */,
@@ -618,10 +674,15 @@
 				93F7E86E14DC8E5B00C84A99 /* NewFirstVisuallyNonEmptyLayoutFrames_Bundle.cpp */,
 				BC909779125571AB00083756 /* PageLoadBasic.cpp */,
 				BC2D004812A9FDFA00E732A3 /* PageLoadDidChangeLocationWithinPageForFrame.cpp */,
+				A51B650816ADF9B1007AA5D9 /* PageVisibilityState.cpp */,
 				52E5CE4514D21E9D003B2BD8 /* ParentFrame.cpp */,
 				52E5CE4814D21EAB003B2BD8 /* ParentFrame_Bundle.cpp */,
+				C54237EE16B8955800E638FC /* PasteboardNotifications.mm */,
+				C54237ED16B8955800E638FC /* PasteboardNotifications_Bundle.cpp */,
 				333B9CE11277F23100FEFCE3 /* PreventEmptyUserAgent.cpp */,
 				F6FDDDD214241AD4004F1729 /* PrivateBrowsingPushStateNoHistoryCallback.cpp */,
+				8A3AF93A16C9ED2700D248C1 /* ReloadPageAfterCrash.cpp */,
+				8A2C750D16CED9550024F352 /* ResizeWindowAfterCrash.cpp */,
 				C0BD669C131D3CF700E18F2A /* ResponsivenessTimerDoesntFireEarly.cpp */,
 				C0BD669E131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp */,
 				C0ADBE8212FCA6AA00D2C129 /* RestoreSessionStateContainingFormData.cpp */,
@@ -632,6 +693,7 @@
 				BC22D31714DC68B800FFB1DD /* UserMessage_Bundle.cpp */,
 				520BCF4B141EB09E00937EA8 /* WebArchive.cpp */,
 				520BCF4A141EB09E00937EA8 /* WebArchive_Bundle.cpp */,
+				0F17BBD415AF6C4D007AB753 /* WebCoreStatisticsWithNoWebProcess.cpp */,
 				76E182D91547550100F1FADD /* WillSendSubmitEvent.cpp */,
 				76E182DC1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp */,
 				BC901E221492ADCE0074A667 /* WKConnection.cpp */,
@@ -640,7 +702,6 @@
 				BC7B619A1299FE9E00D174A4 /* WKPreferences.cpp */,
 				BC90995D12567BC100083756 /* WKString.cpp */,
 				BC9099931256ACF100083756 /* WKStringJSString.cpp */,
-				0F17BBD415AF6C4D007AB753 /* WebCoreStatisticsWithNoWebProcess.cpp */,
 			);
 			path = WebKit2;
 			sourceTree = "<group>";
@@ -648,22 +709,24 @@
 		BC9096461255618900083756 /* WTF */ = {
 			isa = PBXGroup;
 			children = (
-				BC029B1A1486B23800817DA9 /* ns */,
 				C0991C4F143C7D68007998F2 /* cf */,
+				BC029B1A1486B23800817DA9 /* ns */,
 				26F1B44215CA434F00D1E4BF /* AtomicString.cpp */,
+				A7A966DA140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp */,
 				26A2C72E15E2E73C005B1A14 /* CString.cpp */,
+				1AA9E55714980A9900001A8A /* Functional.cpp */,
+				0BCD833414857CE400EA2003 /* HashMap.cpp */,
+				26B2DFF815BDE599004F691D /* HashSet.cpp */,
+				266FAFD215E5775200F61D5B /* IntegerToStringConversion.cpp */,
+				26300B1716755CD90066886D /* ListHashSet.cpp */,
+				B4039F9C15E6D8B3007255D6 /* MathExtras.cpp */,
 				CD5497B315857F0C00B5BC30 /* MediaTime.cpp */,
 				4F4D2C0D1626FE2700320FE1 /* MemoryInstrumentationTest.cpp */,
 				0FC6C4CE141034AD005B7F0C /* MetaAllocator.cpp */,
 				0FC6C4CB141027E0005B7F0C /* RedBlackTree.cpp */,
-				A7A966DA140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp */,
-				1AA9E55714980A9900001A8A /* Functional.cpp */,
-				0BCD833414857CE400EA2003 /* HashMap.cpp */,
-				26B2DFF815BDE599004F691D /* HashSet.cpp */,
-				B4039F9C15E6D8B3007255D6 /* MathExtras.cpp */,
 				14F3B11215E45EAB00210069 /* SaturatedArithmeticOperations.cpp */,
-				266FAFD215E5775200F61D5B /* IntegerToStringConversion.cpp */,
 				81B50192140F232300D9EB58 /* StringBuilder.cpp */,
+				93ABA80816DDAB91002DB2FA /* StringHasher.cpp */,
 				26F1B44315CA434F00D1E4BF /* StringImpl.cpp */,
 				C01363C713C3997300EF3964 /* StringOperators.cpp */,
 				0BCD85691485C98B00EA2003 /* TemporaryChange.cpp */,
@@ -680,6 +743,7 @@
 			children = (
 				C045F9461385C2F800C0F3CD /* 18-characters.html */,
 				76E182DE15475A8300F1FADD /* auto-submitting-form.html */,
+				C5E1AFFD16B22179006CC1F2 /* execCopy.html */,
 				BC2D004A12A9FEB300E732A3 /* file-with-anchor.html */,
 				1A02C84B125D4A5E00E3F4BD /* find.html */,
 				BCBD372E125ABBE600D2C29F /* icon.png */,
@@ -706,11 +770,13 @@
 				C08587FE13FEC3A6001EF4E5 /* InstanceMethodSwizzler.h */,
 				C08587FF13FEC3A6001EF4E5 /* InstanceMethodSwizzler.mm */,
 				C081224013FC172400DC39AE /* JavaScriptTestMac.mm */,
-				BC131A9A1171316900B69727 /* main.mm */,
+				2E7765CE16C4D81100BA2BB1 /* mainMac.mm */,
 				BC131884117114B600B69727 /* PlatformUtilitiesMac.mm */,
 				BC90955C125548AA00083756 /* PlatformWebViewMac.mm */,
 				C081224313FC19EC00DC39AE /* SyntheticBackingScaleFactorWindow.h */,
 				C081224413FC19EC00DC39AE /* SyntheticBackingScaleFactorWindow.m */,
+				29AB8AA3164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.h */,
+				29AB8AA2164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.mm */,
 				C08587BE13FE956C001EF4E5 /* WebKitAgnosticTest.h */,
 				C08587BD13FE956C001EF4E5 /* WebKitAgnosticTest.mm */,
 			);
@@ -721,8 +787,8 @@
 			isa = PBXGroup;
 			children = (
 				FE217ECB1640A54A0052988B /* JavaScriptCore */,
-				C08587F913FEC39B001EF4E5 /* TestWebKitAPI */,
 				C07E6CAD13FD67650038B22B /* mac */,
+				C08587F913FEC39B001EF4E5 /* TestWebKitAPI */,
 				440A1D3614A01000008A66F2 /* WebCore */,
 				BC9096411255616000083756 /* WebKit2 */,
 				BC3C4C6F14575B1D0025FB62 /* WebKit2 Objective-C */,
@@ -737,17 +803,24 @@
 				C07E6CB013FD737C0038B22B /* Resources */,
 				379028B514FABD92007E6B43 /* AcceptsFirstMouse.mm */,
 				B55F119F1516834F00915916 /* AttributedString.mm */,
+				00CD9F6215BE312C002DA2CE /* BackForwardList.mm */,
 				26DF5A5D15A29BAA003689C2 /* CancelLoadFromResourceLoadDelegate.mm */,
 				5142B2701517C88B00C32B19 /* ContextMenuCanCopyURL.mm */,
-				37DC678B140D7C5000ABCCDB /* DOMRangeOfString.mm */,
-				C07E6CAE13FD67650038B22B /* DynamicDeviceScaleFactor.mm */,
 				3776BC62150946BC0043A66D /* DeviceScaleFactorInDashboardRegions.mm */,
 				939BA91614103412001A01BD /* DeviceScaleFactorOnBack.mm */,
+				37E1064A1697676400B78BD0 /* DOMHTMLTableCellCellAbove.mm */,
+				3751AF7A169518F800764319 /* DOMNodeFromJSObject.mm */,
+				37DC678B140D7C5000ABCCDB /* DOMRangeOfString.mm */,
+				C07E6CAE13FD67650038B22B /* DynamicDeviceScaleFactor.mm */,
+				4BB4160316815F9100824238 /* ElementAtPointInWebFrame.mm */,
 				9B4F8FA3159D52B1002D9F94 /* HTMLCollectionNamedItem.mm */,
 				9B26FC6B159D061000CC3765 /* HTMLFormCollectionNamedItem.mm */,
 				C507E8A614C6545B005D6B3B /* InspectorBar.mm */,
+				4BB4160116815B2600824238 /* JSWrapperForNodeInWebFrame.mm */,
 				E1220D9F155B25480013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.mm */,
 				517E7DFB15110EA600D0B008 /* MemoryCachePruneWithinResourceLoadDelegate.mm */,
+				A57A34EF16AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm */,
+				00BC16851680FE810065F1E5 /* PublicSuffix.mm */,
 				3722C8681461E03E00C45D00 /* RenderedImageFromDOMRange.mm */,
 				261516D515B0E60500A2C201 /* SetAndUpdateCacheModel.mm */,
 				52B8CF9515868CF000281053 /* SetDocumentURI.mm */,
@@ -756,8 +829,9 @@
 				37A6895D148A9B50005100FA /* SubresourceErrorCrash.mm */,
 				E490296714E2E3A4002BEDD1 /* TypingStyleCrash.mm */,
 				51FBBB4C1513D4E900822738 /* WebViewCanPasteURL.mm */,
+				37E38C33169B7D010084C28C /* WebViewDidRemoveFrameFromHierarchy.mm */,
 				A5E2027215B2181900C13E14 /* WindowlessWebViewWithMedia.mm */,
-				00CD9F6215BE312C002DA2CE /* BackForwardList.mm */,
+				C2EB2DD116CAC7AC009B52EE /* WebViewDidCreateJavaScriptContext.mm */,
 			);
 			path = mac;
 			sourceTree = "<group>";
@@ -765,18 +839,22 @@
 		C07E6CB013FD737C0038B22B /* Resources */ = {
 			isa = PBXGroup;
 			children = (
-				52B8CF9415868CF000281053 /* SetDocumentURI.html */,
+				C2CF975816CEC69E0054E99D /* JSContextBackForwardCache1.html */,
+				C2CF975916CEC69E0054E99D /* JSContextBackForwardCache2.html */,
+				379028B814FABE49007E6B43 /* acceptsFirstMouse.html */,
 				B55F11B9151916E600915916 /* Ahem.ttf */,
 				B55F11B01517A2C400915916 /* attributedStringCustomFont.html */,
-				379028B814FABE49007E6B43 /* acceptsFirstMouse.html */,
 				26DF5A6115A2A22B003689C2 /* CancelLoadFromResourceLoadDelegate.html */,
 				5142B2721517C89100C32B19 /* ContextMenuCanCopyURL.html */,
+				C07E6CB113FD738A0038B22B /* devicePixelRatio.html */,
+				37E1064B169767F700B78BD0 /* DOMHTMLTableCellElementCellAbove.html */,
 				37DC678F140D7D3A00ABCCDB /* DOMRangeOfString.html */,
 				9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */,
 				9B26FCB4159D15E700CC3765 /* HTMLFormCollectionNamedItem.html */,
 				E1220DC9155B287D0013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.html */,
 				517E7E031511187500D0B008 /* MemoryCachePruneWithinResourceLoadDelegate.html */,
-				C07E6CB113FD738A0038B22B /* devicePixelRatio.html */,
+				A57A34F116AF69E200C2501F /* PageVisibilityStateWithWindowChanges.html */,
+				52B8CF9415868CF000281053 /* SetDocumentURI.html */,
 				C540F783152E5A7800A40C8C /* verboseMarkup.html */,
 				A5E2027015B2180600C13E14 /* WindowlessWebViewWithMedia.html */,
 			);
@@ -802,8 +880,8 @@
 		C0991C4F143C7D68007998F2 /* cf */ = {
 			isa = PBXGroup;
 			children = (
-				C0991C50143C7D68007998F2 /* RetainPtrHashing.cpp */,
 				BC029B161486AD6400817DA9 /* RetainPtr.cpp */,
+				C0991C50143C7D68007998F2 /* RetainPtrHashing.cpp */,
 			);
 			name = cf;
 			path = WTF/cf;
@@ -812,9 +890,9 @@
 		C0C5D3BB14598B6F00A802A6 /* mac */ = {
 			isa = PBXGroup;
 			children = (
+				BCAA485714A044D40088FAC4 /* EditorCommands.mm */,
 				C0C5D3BC14598B6F00A802A6 /* GetBackingScaleFactor.mm */,
 				C0C5D3BD14598B6F00A802A6 /* GetBackingScaleFactor_Bundle.mm */,
-				BCAA485714A044D40088FAC4 /* EditorCommands.mm */,
 			);
 			path = mac;
 			sourceTree = "<group>";
@@ -919,18 +997,23 @@
 				5142B2711517C88B00C32B19 /* ContextMenuCanCopyURL.mm in Sources */,
 				F6F3F29113342FEB00A6BF19 /* CookieManager.cpp in Sources */,
 				26A2C72F15E2E73C005B1A14 /* CString.cpp in Sources */,
+				29AB8AA1164C735800D49BEC /* CustomProtocolsTest.mm in Sources */,
 				3776BC63150946BC0043A66D /* DeviceScaleFactorInDashboardRegions.mm in Sources */,
 				939BA91714103412001A01BD /* DeviceScaleFactorOnBack.mm in Sources */,
 				BCB68040126FBFE100642A61 /* DocumentStartUserScriptAlertCrash.cpp in Sources */,
+				37E1064D16976C8500B78BD0 /* DOMHTMLTableCellCellAbove.mm in Sources */,
+				3751AF7C169518F800764319 /* DOMNodeFromJSObject.mm in Sources */,
 				37DC678D140D7C5000ABCCDB /* DOMRangeOfString.mm in Sources */,
 				51393E201523944A005F39C5 /* DOMWindowExtensionBasic.cpp in Sources */,
 				F6F49C6915545C8E0007F39D /* DOMWindowExtensionNoCache.cpp in Sources */,
 				C045F9451385C2EA00C0F3CD /* DownloadDecideDestinationCrash.cpp in Sources */,
 				C07E6CAF13FD67650038B22B /* DynamicDeviceScaleFactor.mm in Sources */,
 				BCAA485814A044D40088FAC4 /* EditorCommands.mm in Sources */,
+				4BB4160416815F9100824238 /* ElementAtPointInWebFrame.mm in Sources */,
 				1A5FEFDD1270E2A3000E2921 /* EvaluateJavaScript.cpp in Sources */,
 				BCC8B95B12611F4700DE46A4 /* FailedLoad.cpp in Sources */,
 				1A02C84F125D4A8400E3F4BD /* Find.cpp in Sources */,
+				C51AFB99169F49FF009CCF66 /* FindMatches.mm in Sources */,
 				1ADBEFAE130C689C00D61D19 /* ForceRepaint.cpp in Sources */,
 				BCBD3710125AA2EB00D2C29F /* FrameMIMETypeHTML.cpp in Sources */,
 				BCBD3761125ABCFE00D2C29F /* FrameMIMETypePNG.cpp in Sources */,
@@ -942,7 +1025,9 @@
 				4BFDFFA9131477770061F24B /* HitTestResultNodeHandle.cpp in Sources */,
 				9B4F8FA4159D52B1002D9F94 /* HTMLCollectionNamedItem.mm in Sources */,
 				9B26FC6C159D061000CC3765 /* HTMLFormCollectionNamedItem.mm in Sources */,
+				C2EB2DD316CAC7AC009B52EE /* WebViewDidCreateJavaScriptContext.mm in Sources */,
 				BC575AAD126E83B9006F0F12 /* InjectedBundleBasic.cpp in Sources */,
+				378E64731632646D00B6C676 /* InjectedBundleFrameHitTest.cpp in Sources */,
 				F660AA1315A619C9003A1243 /* InjectedBundleInitializationUserDataCallbackWins.cpp in Sources */,
 				C507E8A714C6545B005D6B3B /* InspectorBar.mm in Sources */,
 				C08587FC13FEC39B001EF4E5 /* InstanceMethodSwizzler.mm in Sources */,
@@ -950,34 +1035,44 @@
 				266FAFD315E5775200F61D5B /* IntegerToStringConversion.cpp in Sources */,
 				C0ADBE7C12FCA4D000D2C129 /* JavaScriptTest.cpp in Sources */,
 				C081224213FC172400DC39AE /* JavaScriptTestMac.mm in Sources */,
+				4BB4160216815B2600824238 /* JSWrapperForNodeInWebFrame.mm in Sources */,
 				440A1D3914A0103A008A66F2 /* KURL.cpp in Sources */,
+				14464013167A8305000BD218 /* LayoutUnit.cpp in Sources */,
+				26300B1816755CD90066886D /* ListHashSet.cpp in Sources */,
 				52CB47411448FB9300873995 /* LoadAlternateHTMLStringWithNonDirectoryURL.cpp in Sources */,
 				33DC8911141953A300747EF7 /* LoadCanceledNoServerRedirectCallback.cpp in Sources */,
-				BC131A9B1171316900B69727 /* main.mm in Sources */,
 				B4039F9D15E6D8B3007255D6 /* MathExtras.cpp in Sources */,
 				CD5497B415857F0C00B5BC30 /* MediaTime.cpp in Sources */,
 				E1220DA0155B25480013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.mm in Sources */,
 				517E7DFC15110EA600D0B008 /* MemoryCachePruneWithinResourceLoadDelegate.mm in Sources */,
+				4F4D2C0E1626FE2700320FE1 /* MemoryInstrumentationTest.cpp in Sources */,
 				0FC6C4CF141034AD005B7F0C /* MetaAllocator.cpp in Sources */,
 				33BE5AF5137B5A6C00705813 /* MouseMoveAfterCrash.cpp in Sources */,
 				93F1DB3114DA20760024C362 /* NewFirstVisuallyNonEmptyLayout.cpp in Sources */,
 				93F1DB5514DB1B730024C362 /* NewFirstVisuallyNonEmptyLayoutFails.cpp in Sources */,
+				9318778915EEC57700A9CCE3 /* NewFirstVisuallyNonEmptyLayoutForImages.cpp in Sources */,
 				93F7E86C14DC8E4D00C84A99 /* NewFirstVisuallyNonEmptyLayoutFrames.cpp in Sources */,
 				BC90977A125571AB00083756 /* PageLoadBasic.cpp in Sources */,
 				BC2D004912A9FDFA00E732A3 /* PageLoadDidChangeLocationWithinPageForFrame.cpp in Sources */,
+				A51B650916ADF9B1007AA5D9 /* PageVisibilityState.cpp in Sources */,
+				A57A34F016AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm in Sources */,
 				52E5CE4614D21E9D003B2BD8 /* ParentFrame.cpp in Sources */,
+				C54237F016B8955800E638FC /* PasteboardNotifications.mm in Sources */,
 				BC575BC0126F5752006F0F12 /* PlatformUtilities.cpp in Sources */,
 				BC131885117114B600B69727 /* PlatformUtilitiesMac.mm in Sources */,
 				BC90955D125548AA00083756 /* PlatformWebViewMac.mm in Sources */,
 				333B9CE21277F23100FEFCE3 /* PreventEmptyUserAgent.cpp in Sources */,
 				F6FDDDD314241AD4004F1729 /* PrivateBrowsingPushStateNoHistoryCallback.cpp in Sources */,
+				00BC16871680FE810065F1E5 /* PublicSuffix.mm in Sources */,
 				0FC6C4CC141027E0005B7F0C /* RedBlackTree.cpp in Sources */,
+				8A3AF93B16C9ED2700D248C1 /* ReloadPageAfterCrash.cpp in Sources */,
+				8A2C750E16CED9550024F352 /* ResizeWindowAfterCrash.cpp in Sources */,
 				3722C8691461E03E00C45D00 /* RenderedImageFromDOMRange.mm in Sources */,
 				C0BD669D131D3CF700E18F2A /* ResponsivenessTimerDoesntFireEarly.cpp in Sources */,
 				C0ADBE8312FCA6AA00D2C129 /* RestoreSessionStateContainingFormData.cpp in Sources */,
 				BC029B181486AD6400817DA9 /* RetainPtr.cpp in Sources */,
-				C0991C51143C7D68007998F2 /* RetainPtrHashing.cpp in Sources */,
 				BC029B1C1486B25900817DA9 /* RetainPtr.mm in Sources */,
+				C0991C51143C7D68007998F2 /* RetainPtrHashing.cpp in Sources */,
 				14F3B11315E45EAB00210069 /* SaturatedArithmeticOperations.cpp in Sources */,
 				261516D615B0E60500A2C201 /* SetAndUpdateCacheModel.mm in Sources */,
 				52B8CF9615868CF000281053 /* SetDocumentURI.mm in Sources */,
@@ -986,21 +1081,26 @@
 				C02B77F2126612140026BF0F /* SpacebarScrolling.cpp in Sources */,
 				81B50193140F232300D9EB58 /* StringBuilder.cpp in Sources */,
 				3799AD3A14120A43005EB0C6 /* StringByEvaluatingJavaScriptFromString.mm in Sources */,
+				93ABA80916DDAB91002DB2FA /* StringHasher.cpp in Sources */,
 				26F1B44515CA434F00D1E4BF /* StringImpl.cpp in Sources */,
 				C01363C813C3997300EF3964 /* StringOperators.cpp in Sources */,
 				37A6895F148A9B50005100FA /* SubresourceErrorCrash.mm in Sources */,
 				C081224513FC19EC00DC39AE /* SyntheticBackingScaleFactorWindow.m in Sources */,
 				0BCD856A1485C98B00EA2003 /* TemporaryChange.cpp in Sources */,
+				29AB8AA4164C7A9300D49BEC /* TestBrowsingContextLoadDelegate.mm in Sources */,
 				BC131AA9117131FC00B69727 /* TestsController.cpp in Sources */,
 				E490296814E2E3A4002BEDD1 /* TypingStyleCrash.mm in Sources */,
+				2943BE86161DFEB800999E3D /* UserContentTest.mm in Sources */,
 				BC22D31514DC689800FFB1DD /* UserMessage.cpp in Sources */,
-				BC90964C125561BF00083756 /* VectorBasic.cpp in Sources */,
 				BC55F5F914AD78EE00484BE1 /* Vector.cpp in Sources */,
+				BC90964C125561BF00083756 /* VectorBasic.cpp in Sources */,
 				37200B9213A16230007A4FAD /* VectorReverse.cpp in Sources */,
+				FE217ECD1640A54A0052988B /* VMInspector.cpp in Sources */,
 				520BCF4D141EB09E00937EA8 /* WebArchive.cpp in Sources */,
 				0F17BBD615AF6C4D007AB753 /* WebCoreStatisticsWithNoWebProcess.cpp in Sources */,
 				C08587BF13FE956C001EF4E5 /* WebKitAgnosticTest.mm in Sources */,
 				51FBBB4D1513D4E900822738 /* WebViewCanPasteURL.mm in Sources */,
+				37E38C34169B7D010084C28C /* WebViewDidRemoveFrameFromHierarchy.mm in Sources */,
 				76E182DA1547550100F1FADD /* WillSendSubmitEvent.cpp in Sources */,
 				A5E2027315B2181900C13E14 /* WindowlessWebViewWithMedia.mm in Sources */,
 				BC3C4C7F14587AA60025FB62 /* WKBrowsingContextGroupTest.mm in Sources */,
@@ -1011,11 +1111,8 @@
 				BC90995E12567BC100083756 /* WKString.cpp in Sources */,
 				BC9099941256ACF100083756 /* WKStringJSString.cpp in Sources */,
 				265AF55015D1E48A00B0CB4A /* WTFString.cpp in Sources */,
-				9318778915EEC57700A9CCE3 /* NewFirstVisuallyNonEmptyLayoutForImages.cpp in Sources */,
-				2943BE86161DFEB800999E3D /* UserContentTest.mm in Sources */,
-				4F4D2C0E1626FE2700320FE1 /* MemoryInstrumentationTest.cpp in Sources */,
-				378E64731632646D00B6C676 /* InjectedBundleFrameHitTest.cpp in Sources */,
-				FE217ECD1640A54A0052988B /* VMInspector.cpp in Sources */,
+				2E7765CD16C4D80A00BA2BB1 /* mainIOS.mm in Sources */,
+				2E7765CF16C4D81100BA2BB1 /* mainMac.mm in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1023,34 +1120,35 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				BC575A97126E74F1006F0F12 /* InjectedBundleMain.cpp in Sources */,
-				BC575AA2126E7660006F0F12 /* InjectedBundleController.cpp in Sources */,
-				BC575AB0126E83C8006F0F12 /* InjectedBundleBasic_Bundle.cpp in Sources */,
-				BC575BD9126F58E2006F0F12 /* PlatformUtilities.cpp in Sources */,
-				BC575BE0126F590D006F0F12 /* PlatformUtilitiesMac.mm in Sources */,
-				BCB68042126FBFF100642A61 /* DocumentStartUserScriptAlertCrash_Bundle.cpp in Sources */,
-				4BFDFFA71314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp in Sources */,
-				C0BD669F131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp in Sources */,
 				BC246D9C132F1FF000B56D7C /* CanHandleRequest_Bundle.cpp in Sources */,
-				33BE5AF9137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp in Sources */,
-				1AEDE22613E5E7E700E62FE8 /* InjectedBundleControllerMac.mm in Sources */,
-				33DC89141419579F00747EF7 /* LoadCanceledNoServerRedirectCallback_Bundle.cpp in Sources */,
-				520BCF4C141EB09E00937EA8 /* WebArchive_Bundle.cpp in Sources */,
+				BCB68042126FBFF100642A61 /* DocumentStartUserScriptAlertCrash_Bundle.cpp in Sources */,
+				51393E221523952D005F39C5 /* DOMWindowExtensionBasic_Bundle.cpp in Sources */,
+				F6F49C6B15545CA70007F39D /* DOMWindowExtensionNoCache_Bundle.cpp in Sources */,
 				C0C5D3C61459912900A802A6 /* GetBackingScaleFactor_Bundle.mm in Sources */,
-				BC901E331492AF390074A667 /* WKConnection_Bundle.cpp in Sources */,
-				52E5CE4914D21EAB003B2BD8 /* ParentFrame_Bundle.cpp in Sources */,
+				F660AA1115A5F631003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp in Sources */,
+				4BFDFFA71314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp in Sources */,
+				BC575AB0126E83C8006F0F12 /* InjectedBundleBasic_Bundle.cpp in Sources */,
+				BC575AA2126E7660006F0F12 /* InjectedBundleController.cpp in Sources */,
+				1AEDE22613E5E7E700E62FE8 /* InjectedBundleControllerMac.mm in Sources */,
+				378E64771632655E00B6C676 /* InjectedBundleFrameHitTest_Bundle.cpp in Sources */,
+				F660AA1515A61ABF003A1243 /* InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp in Sources */,
+				BC575A97126E74F1006F0F12 /* InjectedBundleMain.cpp in Sources */,
+				33DC89141419579F00747EF7 /* LoadCanceledNoServerRedirectCallback_Bundle.cpp in Sources */,
+				33BE5AF9137B5AAE00705813 /* MouseMoveAfterCrash_Bundle.cpp in Sources */,
 				93F1DB3414DA20870024C362 /* NewFirstVisuallyNonEmptyLayout_Bundle.cpp in Sources */,
 				93F1DB5714DB1B840024C362 /* NewFirstVisuallyNonEmptyLayoutFails_Bundle.cpp in Sources */,
-				93F7E86F14DC8E5C00C84A99 /* NewFirstVisuallyNonEmptyLayoutFrames_Bundle.cpp in Sources */,
-				BC22D31914DC68B900FFB1DD /* UserMessage_Bundle.cpp in Sources */,
 				93AF4ECE1506F064007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp in Sources */,
+				93F7E86F14DC8E5C00C84A99 /* NewFirstVisuallyNonEmptyLayoutFrames_Bundle.cpp in Sources */,
+				52E5CE4914D21EAB003B2BD8 /* ParentFrame_Bundle.cpp in Sources */,
+				C54237F116B8957D00E638FC /* PasteboardNotifications_Bundle.cpp in Sources */,
+				BC575BD9126F58E2006F0F12 /* PlatformUtilities.cpp in Sources */,
+				BC575BE0126F590D006F0F12 /* PlatformUtilitiesMac.mm in Sources */,
+				C0BD669F131D3CFF00E18F2A /* ResponsivenessTimerDoesntFireEarly_Bundle.cpp in Sources */,
 				51FCF7A11534B2A000104491 /* ShouldGoToBackForwardListItem_Bundle.cpp in Sources */,
-				51393E221523952D005F39C5 /* DOMWindowExtensionBasic_Bundle.cpp in Sources */,
+				BC22D31914DC68B900FFB1DD /* UserMessage_Bundle.cpp in Sources */,
+				520BCF4C141EB09E00937EA8 /* WebArchive_Bundle.cpp in Sources */,
 				76E182DD1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp in Sources */,
-				F6F49C6B15545CA70007F39D /* DOMWindowExtensionNoCache_Bundle.cpp in Sources */,
-				F660AA1115A5F631003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp in Sources */,
-				F660AA1515A61ABF003A1243 /* InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp in Sources */,
-				378E64771632655E00B6C676 /* InjectedBundleFrameHitTest_Bundle.cpp in Sources */,
+				BC901E331492AF390074A667 /* WKConnection_Bundle.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Tools/TestWebKitAPI/Tests.pri b/Tools/TestWebKitAPI/Tests.pri
new file mode 100644
index 0000000..15e81c0
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests.pri
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+
+SUBDIRS += Tests/WTF Tests/JavaScriptCore Tests/WebKit2
diff --git a/Tools/TestWebKitAPI/Tests/JavaScriptCore/JavaScriptCore.pro b/Tools/TestWebKitAPI/Tests/JavaScriptCore/JavaScriptCore.pro
new file mode 100644
index 0000000..9d44fad
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/JavaScriptCore/JavaScriptCore.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+TARGET = tst_jsc
+
+SOURCES += *.cpp
+
+include(../../TestWebKitAPI.pri)
+
+DEFINES += APITEST_SOURCE_DIR=\\\"$$PWD\\\"
diff --git a/Tools/TestWebKitAPI/Tests/WTF/CString.cpp b/Tools/TestWebKitAPI/Tests/WTF/CString.cpp
index 1f47cb2..735d7dd 100644
--- a/Tools/TestWebKitAPI/Tests/WTF/CString.cpp
+++ b/Tools/TestWebKitAPI/Tests/WTF/CString.cpp
@@ -107,3 +107,90 @@
     ASSERT_STREQ(string.data(), "WebKit");
     ASSERT_STREQ(copy.data(), initialString);
 }
+
+TEST(WTF, CStringComparison)
+{
+    // Comparison with another CString.
+    CString a;
+    CString b;
+    ASSERT_TRUE(a == b);
+    ASSERT_FALSE(a != b);
+    a = "a";
+    b = CString();
+    ASSERT_FALSE(a == b);
+    ASSERT_TRUE(a != b);
+    a = "a";
+    b = "b";
+    ASSERT_FALSE(a == b);
+    ASSERT_TRUE(a != b);
+    a = "a";
+    b = "a";
+    ASSERT_TRUE(a == b);
+    ASSERT_FALSE(a != b);
+    a = "a";
+    b = "aa";
+    ASSERT_FALSE(a == b);
+    ASSERT_TRUE(a != b);
+    a = "";
+    b = "";
+    ASSERT_TRUE(a == b);
+    ASSERT_FALSE(a != b);
+    a = "";
+    b = CString();
+    ASSERT_FALSE(a == b);
+    ASSERT_TRUE(a != b);
+    a = "a";
+    b = "";
+    ASSERT_FALSE(a == b);
+    ASSERT_TRUE(a != b);
+
+    // Comparison with a const char*.
+    CString c;
+    const char* d = 0;
+    ASSERT_TRUE(c == d);
+    ASSERT_FALSE(c != d);
+    c = "c";
+    d = 0;
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = CString();
+    d = "d";
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = "c";
+    d = "d";
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = "c";
+    d = "c";
+    ASSERT_TRUE(c == d);
+    ASSERT_FALSE(c != d);
+    c = "c";
+    d = "cc";
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = "cc";
+    d = "c";
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = "";
+    d = "";
+    ASSERT_TRUE(c == d);
+    ASSERT_FALSE(c != d);
+    c = "";
+    d = 0;
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = CString();
+    d = "";
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = "a";
+    d = "";
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+    c = "";
+    d = "b";
+    ASSERT_FALSE(c == d);
+    ASSERT_TRUE(c != d);
+}
diff --git a/Tools/TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp b/Tools/TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp
index 768c7d3..77b8ff4 100644
--- a/Tools/TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp
+++ b/Tools/TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp
@@ -70,6 +70,41 @@
         EXPECT_EQ(true, (value += coerceLiteral(1)).hasOverflowed()); \
         EXPECT_EQ(true, value.hasOverflowed()); \
         value = 10; \
+        type _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (value * Checked<type, RecordOverflow>(0)).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (Checked<type, RecordOverflow>(0) * value).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidOverflow == (value * Checked<type, RecordOverflow>(std::numeric_limits<type>::max())).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidOverflow == (Checked<type, RecordOverflow>(std::numeric_limits<type>::max()) * value).safeGet(_value)); \
+        value = 0; \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (value * Checked<type, RecordOverflow>(std::numeric_limits<type>::max())).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (Checked<type, RecordOverflow>(std::numeric_limits<type>::max()) * value).safeGet(_value)); \
+        value = 1; \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (value * Checked<type, RecordOverflow>(std::numeric_limits<type>::max())).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (Checked<type, RecordOverflow>(std::numeric_limits<type>::max()) * value).safeGet(_value)); \
+        _value = 0; \
+        value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (value * Checked<type, RecordOverflow>(std::numeric_limits<type>::max())).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (Checked<type, RecordOverflow>(std::numeric_limits<type>::max()) * (type)0).safeGet(_value)); \
+        _value = 0; \
+        value = 1; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (value * Checked<type, RecordOverflow>(std::numeric_limits<type>::max())).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidNotOverflow == (Checked<type, RecordOverflow>(std::numeric_limits<type>::max()) * (type)1).safeGet(_value)); \
+        _value = 0; \
+        value = 2; \
+        EXPECT_EQ(true, CheckedState::DidOverflow == (value * Checked<type, RecordOverflow>(std::numeric_limits<type>::max())).safeGet(_value)); \
+        _value = 0; \
+        EXPECT_EQ(true, CheckedState::DidOverflow == (Checked<type, RecordOverflow>(std::numeric_limits<type>::max()) * (type)2).safeGet(_value)); \
+        value = 10; \
+        EXPECT_EQ(true, (value * Checked<type, RecordOverflow>(std::numeric_limits<type>::max())).hasOverflowed()); \
         MixedSignednessTest(EXPECT_EQ(coerceLiteral(0), (value + -10).unsafeGet())); \
         MixedSignednessTest(EXPECT_EQ(0U, (value - 10U).unsafeGet())); \
         MixedSignednessTest(EXPECT_EQ(coerceLiteral(0), (-10 + value).unsafeGet())); \
diff --git a/Tools/TestWebKitAPI/Tests/WTF/ListHashSet.cpp b/Tools/TestWebKitAPI/Tests/WTF/ListHashSet.cpp
new file mode 100644
index 0000000..7579c42
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WTF/ListHashSet.cpp
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include <wtf/ListHashSet.h>
+
+namespace TestWebKitAPI {
+
+TEST(WTF, ListHashSetRemoveFirst)
+{
+    ListHashSet<int> list;
+    list.add(1);
+    list.add(2);
+    list.add(3);
+
+    ASSERT_EQ(1, list.first());
+
+    list.removeFirst();
+    ASSERT_EQ(2, list.first());
+
+    list.removeFirst();
+    ASSERT_EQ(3, list.first());
+
+    list.removeFirst();
+    ASSERT_TRUE(list.isEmpty());
+}
+
+TEST(WTF, ListHashSetAppendOrMoveToLastNewItems)
+{
+    ListHashSet<int> list;
+    ListHashSet<int>::AddResult result = list.appendOrMoveToLast(1);
+    ASSERT_TRUE(result.isNewEntry);
+    result = list.add(2);
+    ASSERT_TRUE(result.isNewEntry);
+    result = list.appendOrMoveToLast(3);
+    ASSERT_TRUE(result.isNewEntry);
+
+    ASSERT_EQ(list.size(), 3);
+
+    // The list should be in order 1, 2, 3.
+    ListHashSet<int>::iterator iterator = list.begin();
+    ASSERT_EQ(1, *iterator);
+    ++iterator;
+    ASSERT_EQ(2, *iterator);
+    ++iterator;
+    ASSERT_EQ(3, *iterator);
+    ++iterator;
+}
+
+TEST(WTF, ListHashSetAppendOrMoveToLastWithDuplicates)
+{
+    ListHashSet<int> list;
+
+    // Add a single element twice.
+    ListHashSet<int>::AddResult result = list.add(1);
+    ASSERT_TRUE(result.isNewEntry);
+    result = list.appendOrMoveToLast(1);
+    ASSERT_FALSE(result.isNewEntry);
+    ASSERT_EQ(1, list.size());
+
+    list.add(2);
+    list.add(3);
+    ASSERT_EQ(3, list.size());
+
+    // Appending 2 move it to the end.
+    ASSERT_EQ(3, list.last());
+    result = list.appendOrMoveToLast(2);
+    ASSERT_FALSE(result.isNewEntry);
+    ASSERT_EQ(2, list.last());
+
+    // Inverse the list by moving each element to end end.
+    result = list.appendOrMoveToLast(3);
+    ASSERT_FALSE(result.isNewEntry);
+    result = list.appendOrMoveToLast(2);
+    ASSERT_FALSE(result.isNewEntry);
+    result = list.appendOrMoveToLast(1);
+    ASSERT_FALSE(result.isNewEntry);
+    ASSERT_EQ(3, list.size());
+
+    ListHashSet<int>::iterator iterator = list.begin();
+    ASSERT_EQ(3, *iterator);
+    ++iterator;
+    ASSERT_EQ(2, *iterator);
+    ++iterator;
+    ASSERT_EQ(1, *iterator);
+    ++iterator;
+}
+
+TEST(WTF, ListHashSetPrependOrMoveToLastNewItems)
+{
+    ListHashSet<int> list;
+    ListHashSet<int>::AddResult result = list.prependOrMoveToFirst(1);
+    ASSERT_TRUE(result.isNewEntry);
+    result = list.add(2);
+    ASSERT_TRUE(result.isNewEntry);
+    result = list.prependOrMoveToFirst(3);
+    ASSERT_TRUE(result.isNewEntry);
+
+    ASSERT_EQ(list.size(), 3);
+
+    // The list should be in order 3, 1, 2.
+    ListHashSet<int>::iterator iterator = list.begin();
+    ASSERT_EQ(3, *iterator);
+    ++iterator;
+    ASSERT_EQ(1, *iterator);
+    ++iterator;
+    ASSERT_EQ(2, *iterator);
+    ++iterator;
+}
+
+TEST(WTF, ListHashSetPrependOrMoveToLastWithDuplicates)
+{
+    ListHashSet<int> list;
+
+    // Add a single element twice.
+    ListHashSet<int>::AddResult result = list.add(1);
+    ASSERT_TRUE(result.isNewEntry);
+    result = list.prependOrMoveToFirst(1);
+    ASSERT_FALSE(result.isNewEntry);
+    ASSERT_EQ(1, list.size());
+
+    list.add(2);
+    list.add(3);
+    ASSERT_EQ(3, list.size());
+
+    // Prepending 2 move it to the beginning.
+    ASSERT_EQ(1, list.first());
+    result = list.prependOrMoveToFirst(2);
+    ASSERT_FALSE(result.isNewEntry);
+    ASSERT_EQ(2, list.first());
+
+    // Inverse the list by moving each element to the first position.
+    result = list.prependOrMoveToFirst(1);
+    ASSERT_FALSE(result.isNewEntry);
+    result = list.prependOrMoveToFirst(2);
+    ASSERT_FALSE(result.isNewEntry);
+    result = list.prependOrMoveToFirst(3);
+    ASSERT_FALSE(result.isNewEntry);
+    ASSERT_EQ(3, list.size());
+
+    ListHashSet<int>::iterator iterator = list.begin();
+    ASSERT_EQ(3, *iterator);
+    ++iterator;
+    ASSERT_EQ(2, *iterator);
+    ++iterator;
+    ASSERT_EQ(1, *iterator);
+    ++iterator;
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp b/Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp
index 06e442c..7cbb297 100644
--- a/Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp
+++ b/Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp
@@ -50,4 +50,128 @@
     }
 }
 
+TEST(WTF, clampToIntLong)
+{
+    if (sizeof(long) == sizeof(int))
+        return;
+
+    long maxInt = std::numeric_limits<int>::max();
+    long minInt = std::numeric_limits<int>::min();
+    long overflowInt = maxInt + 1;
+    long underflowInt = minInt - 1;
+
+    EXPECT_GT(overflowInt, maxInt);
+    EXPECT_LT(underflowInt, minInt);
+
+    EXPECT_EQ(clampTo<int>(maxInt), maxInt);
+    EXPECT_EQ(clampTo<int>(minInt), minInt);
+
+    EXPECT_EQ(clampTo<int>(overflowInt), maxInt);
+    EXPECT_EQ(clampTo<int>(underflowInt), minInt);
+}
+
+TEST(WTF, clampToIntLongLong)
+{
+    long long maxInt = std::numeric_limits<int>::max();
+    long long minInt = std::numeric_limits<int>::min();
+    long long overflowInt = maxInt + 1;
+    long long underflowInt = minInt - 1;
+
+    EXPECT_GT(overflowInt, maxInt);
+    EXPECT_LT(underflowInt, minInt);
+
+    EXPECT_EQ(clampTo<int>(maxInt), maxInt);
+    EXPECT_EQ(clampTo<int>(minInt), minInt);
+
+    EXPECT_EQ(clampTo<int>(overflowInt), maxInt);
+    EXPECT_EQ(clampTo<int>(underflowInt), minInt);
+}
+
+TEST(WTF, clampToIntegerFloat)
+{
+    // This test is inaccurate as floats will round the min / max integer
+    // due to the narrow mantissa. However it will properly checks within
+    // (close to the extreme) and outside the integer range.
+    float maxInt = std::numeric_limits<int>::max();
+    float minInt = std::numeric_limits<int>::min();
+    float overflowInt = maxInt * 1.1;
+    float underflowInt = minInt * 1.1;
+
+    EXPECT_GT(overflowInt, maxInt);
+    EXPECT_LT(underflowInt, minInt);
+
+    // If maxInt == 2^31 - 1 (ie on I32 architecture), the closest float used to represent it is 2^31.
+    EXPECT_NEAR(clampToInteger(maxInt), maxInt, 1);
+    EXPECT_EQ(clampToInteger(minInt), minInt);
+
+    EXPECT_NEAR(clampToInteger(overflowInt), maxInt, 1);
+    EXPECT_EQ(clampToInteger(underflowInt), minInt);
+}
+
+TEST(WTF, clampToIntegerDouble)
+{
+    double maxInt = std::numeric_limits<int>::max();
+    double minInt = std::numeric_limits<int>::min();
+    double overflowInt = maxInt + 1;
+    double underflowInt = minInt - 1;
+
+    EXPECT_GT(overflowInt, maxInt);
+    EXPECT_LT(underflowInt, minInt);
+
+    EXPECT_EQ(clampToInteger(maxInt), maxInt);
+    EXPECT_EQ(clampToInteger(minInt), minInt);
+
+    EXPECT_EQ(clampToInteger(overflowInt), maxInt);
+    EXPECT_EQ(clampToInteger(underflowInt), minInt);
+}
+
+TEST(WTF, clampToFloat)
+{
+    double maxFloat = std::numeric_limits<float>::max();
+    double minFloat = -maxFloat;
+    double overflowFloat = maxFloat * 1.1;
+    double underflowFloat = minFloat * 1.1;
+
+    EXPECT_GT(overflowFloat, maxFloat);
+    EXPECT_LT(underflowFloat, minFloat);
+
+    EXPECT_EQ(clampToFloat(maxFloat), maxFloat);
+    EXPECT_EQ(clampToFloat(minFloat), minFloat);
+
+    EXPECT_EQ(clampToFloat(overflowFloat), maxFloat);
+    EXPECT_EQ(clampToFloat(underflowFloat), minFloat);
+
+    EXPECT_EQ(clampToFloat(std::numeric_limits<float>::infinity()), maxFloat);
+    EXPECT_EQ(clampToFloat(-std::numeric_limits<float>::infinity()), minFloat);
+}
+
+TEST(WTF, clampToUnsignedLong)
+{
+    if (sizeof(unsigned long) == sizeof(unsigned))
+        return;
+
+    unsigned long maxUnsigned = std::numeric_limits<unsigned>::max();
+    unsigned long overflowUnsigned = maxUnsigned + 1;
+
+    EXPECT_GT(overflowUnsigned, maxUnsigned);
+
+    EXPECT_EQ(clampTo<unsigned>(maxUnsigned), maxUnsigned);
+
+    EXPECT_EQ(clampTo<unsigned>(overflowUnsigned), maxUnsigned);
+    EXPECT_EQ(clampTo<unsigned>(-1), 0u);
+}
+
+TEST(WTF, clampToUnsignedLongLong)
+{
+    unsigned long long maxUnsigned = std::numeric_limits<unsigned>::max();
+    unsigned long long overflowUnsigned = maxUnsigned + 1;
+
+    EXPECT_GT(overflowUnsigned, maxUnsigned);
+
+    EXPECT_EQ(clampTo<unsigned>(maxUnsigned), maxUnsigned);
+
+    EXPECT_EQ(clampTo<unsigned>(overflowUnsigned), maxUnsigned);
+    EXPECT_EQ(clampTo<unsigned>(-1), 0u);
+}
+
 } // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp b/Tools/TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp
index 1ac26a0..106a6dc 100644
--- a/Tools/TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp
+++ b/Tools/TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp
@@ -45,6 +45,7 @@
 #include <wtf/MemoryInstrumentationListHashSet.h>
 #include <wtf/MemoryInstrumentationString.h>
 #include <wtf/MemoryInstrumentationVector.h>
+#include <wtf/MemoryObjectInfo.h>
 #include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
 #include <wtf/text/AtomicString.h>
@@ -78,11 +79,19 @@
 using WTF::MemoryObjectInfo;
 using WTF::MemoryClassInfo;
 using WTF::MemoryObjectType;
+using WTF::MemberType;
 
 MemoryObjectType TestType = "TestType";
 
 class MemoryInstrumentationTestClient : public WTF::MemoryInstrumentationClient {
 public:
+    MemoryInstrumentationTestClient() : m_links(WTF::LastMemberTypeEntry)
+    {
+        m_links[WTF::PointerMember] = 0;
+        m_links[WTF::ReferenceMember] = 0;
+        m_links[WTF::RetainingPointer] = 0;
+    }
+
     virtual void countObjectSize(const void*, MemoryObjectType objectType, size_t size)
     {
         TypeToSizeMap::AddResult result = m_totalSizes.add(objectType, size);
@@ -90,7 +99,18 @@
             result.iterator->value += size;
     }
     virtual bool visited(const void* object) { return !m_visitedObjects.add(object).isNewEntry; }
-    virtual void checkCountedObject(const void*) { }
+    virtual bool checkCountedObject(const void*) { return true; }
+    virtual void reportNode(const MemoryObjectInfo&) OVERRIDE { }
+    virtual void reportEdge(const void*, const char*, MemberType memberType) OVERRIDE
+    {
+        ++m_links[memberType];
+    }
+    virtual void reportLeaf(const MemoryObjectInfo&, const char*) OVERRIDE
+    {
+        ++m_links[WTF::RetainingPointer];
+    }
+    virtual void reportBaseAddress(const void*, const void*) OVERRIDE { }
+    virtual int registerString(const char*) OVERRIDE { return -1; }
 
     size_t visitedObjects() const { return m_visitedObjects.size(); }
     size_t totalSize(const MemoryObjectType objectType) const
@@ -99,6 +119,11 @@
         return i == m_totalSizes.end() ? 0 : i->value;
     }
 
+    size_t linksCount(const WTF::MemberType memberType) const
+    {
+        return m_links[memberType];
+    }
+
     size_t reportedSizeForAllTypes() const
     {
         size_t size = 0;
@@ -111,6 +136,7 @@
     typedef HashMap<MemoryObjectType, size_t> TypeToSizeMap;
     TypeToSizeMap m_totalSizes;
     WTF::HashSet<const void*> m_visitedObjects;
+    WTF::Vector<size_t, WTF::LastMemberTypeEntry> m_links;
 };
 
 class InstrumentationTestImpl : public WTF::MemoryInstrumentation {
@@ -119,16 +145,17 @@
         : MemoryInstrumentation(client)
         , m_client(client) { }
 
-    virtual void processDeferredInstrumentedPointers();
-    virtual void deferInstrumentedPointer(PassOwnPtr<InstrumentedPointerBase>);
+    virtual void processDeferredObjects();
+    virtual void deferObject(PassOwnPtr<WrapperBase>);
 
     size_t visitedObjects() const { return m_client->visitedObjects(); }
     size_t reportedSizeForAllTypes() const { return m_client->reportedSizeForAllTypes(); }
     size_t totalSize(const MemoryObjectType objectType) const { return m_client->totalSize(objectType); }
+    size_t linksCount(const WTF::MemberType memberType) const {  return m_client->linksCount(memberType); }
 
 private:
     MemoryInstrumentationTestClient* m_client;
-    Vector<OwnPtr<InstrumentedPointerBase> > m_deferredInstrumentedPointers;
+    Vector<OwnPtr<WrapperBase> > m_deferredObjects;
 };
 
 class InstrumentationTestHelper : public InstrumentationTestImpl {
@@ -139,18 +166,18 @@
     MemoryInstrumentationTestClient m_client;
 };
 
-void InstrumentationTestImpl::processDeferredInstrumentedPointers()
+void InstrumentationTestImpl::processDeferredObjects()
 {
-    while (!m_deferredInstrumentedPointers.isEmpty()) {
-        OwnPtr<InstrumentedPointerBase> pointer = m_deferredInstrumentedPointers.last().release();
-        m_deferredInstrumentedPointers.removeLast();
+    while (!m_deferredObjects.isEmpty()) {
+        OwnPtr<WrapperBase> pointer = m_deferredObjects.last().release();
+        m_deferredObjects.removeLast();
         pointer->process(this);
     }
 }
 
-void InstrumentationTestImpl::deferInstrumentedPointer(PassOwnPtr<InstrumentedPointerBase> pointer)
+void InstrumentationTestImpl::deferObject(PassOwnPtr<WrapperBase> pointer)
 {
-    m_deferredInstrumentedPointers.append(pointer);
+    m_deferredObjects.append(pointer);
 }
 
 class NotInstrumented {
@@ -162,13 +189,21 @@
 class Instrumented {
 public:
     Instrumented() : m_notInstrumented(new NotInstrumented) { }
-    virtual ~Instrumented() { delete m_notInstrumented; }
+    virtual ~Instrumented() { disposeOwnedObject(); }
 
     virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
     {
         MemoryClassInfo info(memoryObjectInfo, this, TestType);
-        info.addMember(m_notInstrumented);
+        memoryObjectInfo->setClassName("Instrumented");
+        info.addMember(m_notInstrumented, "m_notInstrumented", WTF::RetainingPointer);
     }
+
+    void disposeOwnedObject()
+    {
+        delete m_notInstrumented;
+        m_notInstrumented = 0;
+    }
+
     NotInstrumented* m_notInstrumented;
 };
 
@@ -179,6 +214,7 @@
     helper.addRootObject(instrumented);
     EXPECT_EQ(sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
     EXPECT_EQ(1u, helper.visitedObjects());
+    EXPECT_EQ(1u, helper.linksCount(WTF::RetainingPointer));
 }
 
 TEST(MemoryInstrumentationTest, nullCheck)
@@ -188,6 +224,7 @@
     helper.addRootObject(instrumented);
     EXPECT_EQ(0u, helper.reportedSizeForAllTypes());
     EXPECT_EQ(0u, helper.visitedObjects());
+    EXPECT_EQ(0u, helper.linksCount(WTF::RetainingPointer));
 }
 
 TEST(MemoryInstrumentationTest, ptrVsRef)
@@ -198,6 +235,7 @@
         helper.addRootObject(&instrumented);
         EXPECT_EQ(sizeof(Instrumented) + sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
         EXPECT_EQ(2u, helper.visitedObjects());
+        EXPECT_EQ(1u, helper.linksCount(WTF::RetainingPointer));
     }
     {
         InstrumentationTestHelper helper;
@@ -205,41 +243,10 @@
         helper.addRootObject(instrumented);
         EXPECT_EQ(sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
         EXPECT_EQ(1u, helper.visitedObjects());
+        EXPECT_EQ(1u, helper.linksCount(WTF::RetainingPointer));
     }
 }
 
-TEST(MemoryInstrumentationTest, ownPtr)
-{
-    InstrumentationTestHelper helper;
-    OwnPtr<Instrumented> instrumented(adoptPtr(new Instrumented));
-    helper.addRootObject(instrumented);
-    EXPECT_EQ(sizeof(Instrumented) + sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
-    EXPECT_EQ(2u, helper.visitedObjects());
-}
-
-class InstrumentedRefPtr : public RefCounted<InstrumentedRefPtr> {
-public:
-    InstrumentedRefPtr() : m_notInstrumented(new NotInstrumented) { }
-    virtual ~InstrumentedRefPtr() { delete m_notInstrumented; }
-    static PassRefPtr<InstrumentedRefPtr> create() { return adoptRef(new InstrumentedRefPtr()); }
-
-    virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
-    {
-        MemoryClassInfo info(memoryObjectInfo, this, TestType);
-        info.addMember(m_notInstrumented);
-    }
-    NotInstrumented* m_notInstrumented;
-};
-
-TEST(MemoryInstrumentationTest, refPtr)
-{
-    InstrumentationTestHelper helper;
-    RefPtr<InstrumentedRefPtr> instrumentedRefPtr(adoptRef(new InstrumentedRefPtr));
-    helper.addRootObject(instrumentedRefPtr);
-    EXPECT_EQ(sizeof(InstrumentedRefPtr) + sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
-    EXPECT_EQ(2u, helper.visitedObjects());
-}
-
 class InstrumentedWithOwnPtr : public Instrumented {
 public:
     InstrumentedWithOwnPtr() : m_notInstrumentedOwnPtr(adoptPtr(new NotInstrumented)) { }
@@ -260,6 +267,7 @@
     helper.addRootObject(instrumentedWithOwnPtr);
     EXPECT_EQ(2u * sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
     EXPECT_EQ(2u, helper.visitedObjects());
+    EXPECT_EQ(2u, helper.linksCount(WTF::RetainingPointer));
 }
 
 class InstrumentedUndefined {
@@ -289,7 +297,7 @@
 {
     InstrumentationTestHelper helper;
     OwnPtr<InstrumentedDOM> instrumentedDOM(adoptPtr(new InstrumentedDOM));
-    helper.addRootObject(instrumentedDOM);
+    helper.addRootObject(instrumentedDOM.get());
     EXPECT_EQ(sizeof(InstrumentedDOM) + sizeof(InstrumentedUndefined), helper.reportedSizeForAllTypes());
     EXPECT_EQ(sizeof(InstrumentedDOM) + sizeof(InstrumentedUndefined), helper.totalSize(TestType));
     EXPECT_EQ(2u, helper.visitedObjects());
@@ -324,7 +332,7 @@
     void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
     {
         MemoryClassInfo info(memoryObjectInfo, this, TestType);
-        info.addMember(m_value);
+        info.addMember(m_value, "value", WTF::RetainingPointer);
     }
 
     T m_value;
@@ -639,22 +647,35 @@
     EXPECT_EQ(2u * count + 1, helper.visitedObjects());
 }
 
+class InstrumentedRefCounted : public RefCounted<InstrumentedRefCounted> {
+public:
+    InstrumentedRefCounted() : m_notInstrumented(new NotInstrumented) { }
+    ~InstrumentedRefCounted() { delete m_notInstrumented; }
+    
+    void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
+    {
+        MemoryClassInfo info(memoryObjectInfo, this, TestType);
+        info.addMember(m_notInstrumented, "m_notInstrumented", WTF::RetainingPointer);
+    }
+private:
+    NotInstrumented* m_notInstrumented;
+};
+
 TEST(MemoryInstrumentationTest, hashMapWithInstrumentedPointerKeysAndPointerValues)
 {
     InstrumentationTestHelper helper;
 
-    typedef HashMap<Instrumented*, Instrumented*> InstrumentedToInstrumentedMap;
+    typedef HashMap<RefPtr<InstrumentedRefCounted>, RefPtr<InstrumentedRefCounted> > InstrumentedToInstrumentedMap;
     OwnPtr<InstrumentedToInstrumentedMap> value(adoptPtr(new InstrumentedToInstrumentedMap()));
-    Vector<OwnPtr<Instrumented> > valuesVector;
     size_t count = 10;
-    for (size_t i = 0; i < count; ++i) {
-        valuesVector.append(adoptPtr(new Instrumented()));
-        valuesVector.append(adoptPtr(new Instrumented()));
-        value->set(valuesVector[2 * i].get(), valuesVector[2 * i + 1].get());
-    }
+    for (size_t i = 0; i < count; ++i)
+        value->set(adoptRef(new InstrumentedRefCounted()), adoptRef(new InstrumentedRefCounted()));
     InstrumentedOwner<InstrumentedToInstrumentedMap* > root(value.get());
     helper.addRootObject(root);
-    EXPECT_EQ(sizeof(InstrumentedToInstrumentedMap) + sizeof(InstrumentedToInstrumentedMap::ValueType) * value->capacity() + 2 * (sizeof(Instrumented) + sizeof(NotInstrumented)) * value->size(), helper.reportedSizeForAllTypes());
+    EXPECT_EQ(sizeof(InstrumentedToInstrumentedMap)
+        + sizeof(InstrumentedToInstrumentedMap::ValueType) * value->capacity()
+        + 2 * (sizeof(InstrumentedRefCounted) + sizeof(NotInstrumented)) * value->size(),
+        helper.reportedSizeForAllTypes());
     EXPECT_EQ(2u * 2u * count + 1, helper.visitedObjects());
 }
 
@@ -695,10 +716,10 @@
     EXPECT_EQ(1 + (count - 10), helper.visitedObjects());
 }
 
-class InstrumentedConvertibleToInt {
+class InstrumentedConvertibleToInt : public RefCounted<InstrumentedConvertibleToInt> {
 public:
-    InstrumentedConvertibleToInt() : m_notInstrumented(0) { }
-    virtual ~InstrumentedConvertibleToInt() { }
+    InstrumentedConvertibleToInt() : m_notInstrumented(new NotInstrumented) { }
+    virtual ~InstrumentedConvertibleToInt() { delete m_notInstrumented; }
 
     virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
     {
@@ -719,16 +740,11 @@
 {
     InstrumentationTestHelper helper;
 
-    typedef HashMap<InstrumentedConvertibleToInt*, InstrumentedConvertibleToInt> TestMap;
+    typedef HashMap<RefPtr<InstrumentedConvertibleToInt>, int> TestMap;
     OwnPtr<TestMap> value(adoptPtr(new TestMap()));
-    Vector<OwnPtr<InstrumentedConvertibleToInt> > keysVector;
-    Vector<OwnPtr<NotInstrumented> > valuesVector;
     size_t count = 10;
-    for (size_t i = 0; i < count; ++i) {
-        keysVector.append(adoptPtr(new InstrumentedConvertibleToInt()));
-        valuesVector.append(adoptPtr(new NotInstrumented()));
-        value->set(keysVector[i].get(), InstrumentedConvertibleToInt()).iterator->value.m_notInstrumented = valuesVector[i].get();
-    }
+    for (size_t i = 0; i < count; ++i)
+        value->set(adoptRef(new InstrumentedConvertibleToInt()), 0);
     InstrumentedOwner<TestMap* > root(value.get());
     helper.addRootObject(root);
     EXPECT_EQ(sizeof(TestMap) + sizeof(TestMap::ValueType) * value->capacity() +
@@ -747,7 +763,10 @@
         value->set(static_cast<TestEnum>(i), String::number(i));
     InstrumentedOwner<EnumToStringMap* > root(value.get());
     helper.addRootObject(root);
-    EXPECT_EQ(sizeof(EnumToStringMap) + sizeof(EnumToStringMap::ValueType) * value->capacity() + (sizeof(StringImpl) + 1) * value->size(), helper.reportedSizeForAllTypes());
+    EXPECT_EQ(sizeof(EnumToStringMap)
+        + sizeof(EnumToStringMap::ValueType) * value->capacity()
+        + (sizeof(StringImpl) + 1) * value->size(),
+        helper.reportedSizeForAllTypes());
     EXPECT_EQ(count + 1, helper.visitedObjects());
 }
 
@@ -755,18 +774,20 @@
 {
     InstrumentationTestHelper helper;
 
-    typedef HashCountedSet<Instrumented*> TestSet;
+    typedef HashCountedSet<RefPtr<InstrumentedRefCounted> > TestSet;
     OwnPtr<TestSet> set(adoptPtr(new TestSet()));
-    Vector<OwnPtr<Instrumented> > keysVector;
     size_t count = 10;
     for (size_t i = 0; i < count; ++i) {
-        keysVector.append(adoptPtr(new Instrumented()));
+        RefPtr<InstrumentedRefCounted> instrumentedRefCounted = adoptRef(new InstrumentedRefCounted());
         for (size_t j = 0; j <= i; j++)
-            set->add(keysVector.last().get());
+            set->add(instrumentedRefCounted);
     }
     InstrumentedOwner<TestSet* > root(set.get());
     helper.addRootObject(root);
-    EXPECT_EQ(sizeof(TestSet) + sizeof(HashMap<Instrumented*, unsigned>::ValueType) * set->capacity() + (sizeof(Instrumented) + sizeof(NotInstrumented))  * set->size(), helper.reportedSizeForAllTypes());
+    EXPECT_EQ(sizeof(TestSet)
+        + sizeof(HashMap<RefPtr<InstrumentedRefCounted>, unsigned>::ValueType) * set->capacity()
+        + (sizeof(InstrumentedRefCounted) + sizeof(NotInstrumented))  * set->size(),
+        helper.reportedSizeForAllTypes());
     EXPECT_EQ(2u * count + 1, helper.visitedObjects());
 }
 
@@ -779,6 +800,7 @@
     helper.addRootObject(value);
     EXPECT_EQ(sizeof(int) * 1000 + sizeof(ArrayBuffer), helper.reportedSizeForAllTypes());
     EXPECT_EQ(2u, helper.visitedObjects());
+    EXPECT_EQ(2u, helper.linksCount(WTF::RetainingPointer));
 }
 
 class AncestorWithVirtualMethod {
@@ -794,6 +816,7 @@
     virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
     {
         MemoryClassInfo info(memoryObjectInfo, this, TestType);
+        Instrumented::reportMemoryUsage(memoryObjectInfo);
     }
 };
 
@@ -809,17 +832,18 @@
 
     helper.addRootObject(descendantPointerOwner);
     helper.addRootObject(ancestorPointerOwner);
-    EXPECT_EQ(sizeof(ClassWithTwoAncestors), helper.reportedSizeForAllTypes());
-    EXPECT_EQ(2u, helper.visitedObjects());
+    EXPECT_EQ(sizeof(ClassWithTwoAncestors) + sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
+    EXPECT_EQ(3u, helper.visitedObjects());
 }
 
 class CheckCountedObjectsClient : public MemoryInstrumentationTestClient {
 public:
     CheckCountedObjectsClient(const void* expectedPointer) : m_expectedPointer(expectedPointer), m_expectedPointerFound(false) { }
-    virtual void checkCountedObject(const void* pointer)
+    virtual bool checkCountedObject(const void* pointer)
     {
         EXPECT_EQ(pointer, m_expectedPointer);
         m_expectedPointerFound = true;
+        return true;
     }
     bool expectedPointerFound() { return m_expectedPointerFound; }
 
@@ -831,6 +855,7 @@
 TEST(MemoryInstrumentationTest, checkCountedObjectWithMultipleAncestors)
 {
     OwnPtr<ClassWithTwoAncestors> instance = adoptPtr(new ClassWithTwoAncestors());
+    instance->disposeOwnedObject();
     ClassWithTwoAncestors* descendantPointer = instance.get();
     InstrumentedOwner<ClassWithTwoAncestors*> descendantPointerOwner(descendantPointer);
     Instrumented* ancestorPointer = descendantPointer;
@@ -844,5 +869,65 @@
     EXPECT_TRUE(client.expectedPointerFound());
 }
 
+class TwoPointersToSameInsrumented {
+public:
+    TwoPointersToSameInsrumented()
+        : m_ownPtr(adoptPtr(new ClassWithTwoAncestors()))
+        , m_baseClassPtr(m_ownPtr.get())
+    {
+        EXPECT_NE(static_cast<void*>(m_ownPtr.get()), static_cast<void*>(m_baseClassPtr));
+    }
+    void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
+    {
+        MemoryClassInfo info(memoryObjectInfo, this, TestType);
+        info.addMember(m_ownPtr);
+        info.addMember(m_baseClassPtr);
+    }
+
+private:
+    OwnPtr<ClassWithTwoAncestors> m_ownPtr;
+    Instrumented* m_baseClassPtr;
+};
+
+class CountLinksFromInstrumentedObject : public MemoryInstrumentationTestClient {
+public:
+    CountLinksFromInstrumentedObject() : m_linkCount(0) { }
+    virtual void reportEdge(const void*, const char* name, MemberType) OVERRIDE
+    {
+        if (name && !strcmp("m_notInstrumented", name))
+            m_linkCount++;
+    }
+    int linkCount() const { return m_linkCount; }
+
+private:
+    int m_linkCount;
+};
+
+
+TEST(MemoryInstrumentationTest, doNotReportEdgeTwice)
+{
+    OwnPtr<TwoPointersToSameInsrumented> instance = adoptPtr(new TwoPointersToSameInsrumented());
+
+    CountLinksFromInstrumentedObject client;
+    InstrumentationTestImpl instrumentation(&client);
+    instrumentation.addRootObject(instance.get());
+    EXPECT_EQ(1, client.linkCount());
+}
+
+class DerivedClass : public Instrumented {
+public:
+    size_t m_member;
+};
+
+TEST(MemoryInstrumentationTest, detectBaseClassInstrumentation)
+{
+    OwnPtr<DerivedClass> instance = adoptPtr(new DerivedClass());
+
+    InstrumentationTestHelper helper;
+    helper.addRootObject(instance.get(), TestType);
+    EXPECT_EQ(sizeof(Instrumented) + sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
+    EXPECT_EQ(2u, helper.visitedObjects());
+}
+
 } // namespace
 
diff --git a/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp b/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp
index 8ee5c6e..d1b5b43 100644
--- a/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp
+++ b/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011 Google Inc. All rights reserved.
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -33,11 +34,11 @@
 
 namespace TestWebKitAPI {
 
-void expectBuilderContent(const char* expected, const StringBuilder& builder)
+static void expectBuilderContent(const String& expected, const StringBuilder& builder)
 {
     // Not using builder.toString() or builder.toStringPreserveCapacity() because they all
     // change internal state of builder.
-    EXPECT_EQ(String(expected), String(builder.characters(), builder.length()));
+    EXPECT_EQ(expected, String(builder.characters(), builder.length()));
 }
 
 void expectEmpty(const StringBuilder& builder)
@@ -85,6 +86,16 @@
     builder2.toStringPreserveCapacity(); // Test after reifyString with buffer preserved.
     builder2.append("abcd");
     ASSERT_EQ(characters, builder2.characters());
+
+    // Test appending UChar32 characters to StringBuilder.
+    StringBuilder builderForUChar32Append;
+    UChar32 frakturAChar = 0x1D504;
+    builderForUChar32Append.append(frakturAChar); // The fraktur A is not in the BMP, so it's two UTF-16 code units long.
+    ASSERT_EQ(2U, builderForUChar32Append.length());
+    builderForUChar32Append.append(static_cast<UChar32>('A'));
+    ASSERT_EQ(3U, builderForUChar32Append.length());
+    const UChar resultArray[] = { U16_LEAD(frakturAChar), U16_TRAIL(frakturAChar), 'A' };
+    expectBuilderContent(String(resultArray, WTF_ARRAY_LENGTH(resultArray)), builderForUChar32Append);
 }
 
 TEST(StringBuilderTest, ToString)
@@ -274,4 +285,51 @@
     ASSERT_EQ(atomicString2.impl(), string.impl());
 }
 
+TEST(StringBuilderTest, ToAtomicStringOnEmpty)
+{
+    { // Default constructed.
+        StringBuilder builder;
+        AtomicString atomicString = builder.toAtomicString();
+        ASSERT_EQ(emptyAtom, atomicString);
+    }
+    { // With capacity.
+        StringBuilder builder;
+        builder.reserveCapacity(64);
+        AtomicString atomicString = builder.toAtomicString();
+        ASSERT_EQ(emptyAtom, atomicString);
+    }
+    { // AtomicString constructed from a null string.
+        StringBuilder builder;
+        builder.append(String());
+        AtomicString atomicString = builder.toAtomicString();
+        ASSERT_EQ(emptyAtom, atomicString);
+    }
+    { // AtomicString constructed from an empty string.
+        StringBuilder builder;
+        builder.append(emptyString());
+        AtomicString atomicString = builder.toAtomicString();
+        ASSERT_EQ(emptyAtom, atomicString);
+    }
+    { // AtomicString constructed from an empty StringBuilder.
+        StringBuilder builder;
+        StringBuilder emptyBuilder;
+        builder.append(emptyBuilder);
+        AtomicString atomicString = builder.toAtomicString();
+        ASSERT_EQ(emptyAtom, atomicString);
+    }
+    { // AtomicString constructed from an empty char* string.
+        StringBuilder builder;
+        builder.append("", 0);
+        AtomicString atomicString = builder.toAtomicString();
+        ASSERT_EQ(emptyAtom, atomicString);
+    }
+    { // Cleared StringBuilder.
+        StringBuilder builder;
+        builder.appendLiteral("WebKit");
+        builder.clear();
+        AtomicString atomicString = builder.toAtomicString();
+        ASSERT_EQ(emptyAtom, atomicString);
+    }
+}
+
 } // namespace
diff --git a/Tools/TestWebKitAPI/Tests/WTF/StringHasher.cpp b/Tools/TestWebKitAPI/Tests/WTF/StringHasher.cpp
new file mode 100644
index 0000000..a4d223c
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WTF/StringHasher.cpp
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include <wtf/StringHasher.h>
+
+namespace TestWebKitAPI {
+
+static const LChar nullLChars[2] = { 0, 0 };
+static const UChar nullUChars[2] = { 0, 0 };
+
+static const unsigned emptyStringHash = 0x4EC889EU;
+static const unsigned singleNullCharacterHash = 0x3D3ABF44U;
+
+static const LChar testALChars[6] = { 0x41, 0x95, 0xFF, 0x50, 0x01, 0 };
+static const UChar testAUChars[6] = { 0x41, 0x95, 0xFF, 0x50, 0x01, 0 };
+static const UChar testBUChars[6] = { 0x41, 0x95, 0xFFFF, 0x1080, 0x01, 0 };
+
+static const unsigned testAHash1 = 0xEA32B004;
+static const unsigned testAHash2 = 0x93F0F71E;
+static const unsigned testAHash3 = 0xCB609EB1;
+static const unsigned testAHash4 = 0x7984A706;
+static const unsigned testAHash5 = 0x0427561F;
+
+static const unsigned testBHash1 = 0xEA32B004;
+static const unsigned testBHash2 = 0x93F0F71E;
+static const unsigned testBHash3 = 0x59EB1B2C;
+static const unsigned testBHash4 = 0xA7BCCC0A;
+static const unsigned testBHash5 = 0x79201649;
+
+TEST(WTF, StringHasher)
+{
+    StringHasher hasher;
+
+    // The initial state of the hasher.
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+}
+
+TEST(WTF, StringHasher_addCharacter)
+{
+    StringHasher hasher;
+
+    // Hashing a single character.
+    hasher = StringHasher();
+    hasher.addCharacter(0);
+    ASSERT_EQ(singleNullCharacterHash, hasher.hash());
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing five characters, checking the intermediate state after each is added.
+    hasher = StringHasher();
+    hasher.addCharacter(testAUChars[0]);
+    ASSERT_EQ(testAHash1, hasher.hash());
+    ASSERT_EQ(testAHash1 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testAUChars[1]);
+    ASSERT_EQ(testAHash2, hasher.hash());
+    ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testAUChars[2]);
+    ASSERT_EQ(testAHash3, hasher.hash());
+    ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testAUChars[3]);
+    ASSERT_EQ(testAHash4, hasher.hash());
+    ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testAUChars[4]);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing a second set of five characters, including non-Latin-1 characters.
+    hasher = StringHasher();
+    hasher.addCharacter(testBUChars[0]);
+    ASSERT_EQ(testBHash1, hasher.hash());
+    ASSERT_EQ(testBHash1 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testBUChars[1]);
+    ASSERT_EQ(testBHash2, hasher.hash());
+    ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testBUChars[2]);
+    ASSERT_EQ(testBHash3, hasher.hash());
+    ASSERT_EQ(testBHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testBUChars[3]);
+    ASSERT_EQ(testBHash4, hasher.hash());
+    ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testBUChars[4]);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+}
+
+TEST(WTF, StringHasher_addCharacters)
+{
+    StringHasher hasher;
+
+    // Hashing zero characters.
+    hasher = StringHasher();
+    hasher.addCharacters(static_cast<LChar*>(0), 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(nullLChars, 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(nullLChars);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(static_cast<UChar*>(0), 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(nullUChars, 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(nullUChars);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing one character.
+    hasher = StringHasher();
+    hasher.addCharacters(nullLChars, 1);
+    ASSERT_EQ(singleNullCharacterHash, hasher.hash());
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(nullUChars, 1);
+    ASSERT_EQ(singleNullCharacterHash, hasher.hash());
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing five characters, all at once.
+    hasher = StringHasher();
+    hasher.addCharacters(testALChars, 5);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testALChars);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testAUChars, 5);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testAUChars);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testBUChars, 5);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testBUChars);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing five characters, in groups of two, then the last one.
+    hasher = StringHasher();
+    hasher.addCharacters(testALChars, 2);
+    ASSERT_EQ(testAHash2, hasher.hash());
+    ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testALChars + 2, 2);
+    ASSERT_EQ(testAHash4, hasher.hash());
+    ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testALChars + 4, 1);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testALChars, 2);
+    hasher.addCharacters(testALChars + 2, 2);
+    hasher.addCharacters(testALChars + 4);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testAUChars, 2);
+    ASSERT_EQ(testAHash2, hasher.hash());
+    ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testAUChars + 2, 2);
+    ASSERT_EQ(testAHash4, hasher.hash());
+    ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testAUChars + 4, 1);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testAUChars, 2);
+    hasher.addCharacters(testAUChars + 2, 2);
+    hasher.addCharacters(testAUChars + 4);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testBUChars, 2);
+    ASSERT_EQ(testBHash2, hasher.hash());
+    ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testBUChars + 2, 2);
+    ASSERT_EQ(testBHash4, hasher.hash());
+    ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testBUChars + 4, 1);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testBUChars, 2);
+    hasher.addCharacters(testBUChars + 2, 2);
+    hasher.addCharacters(testBUChars + 4);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing five characters, the first three, then the last two.
+    hasher = StringHasher();
+    hasher.addCharacters(testALChars, 3);
+    ASSERT_EQ(testAHash3, hasher.hash());
+    ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testALChars + 3, 2);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testALChars, 3);
+    ASSERT_EQ(testAHash3, hasher.hash());
+    ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testALChars + 3);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testAUChars, 3);
+    ASSERT_EQ(testAHash3, hasher.hash());
+    ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testAUChars + 3, 2);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testAUChars, 3);
+    ASSERT_EQ(testAHash3, hasher.hash());
+    ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testAUChars + 3, 2);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testBUChars, 3);
+    ASSERT_EQ(testBHash3, hasher.hash());
+    ASSERT_EQ(testBHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacters(testBUChars + 3, 2);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharacters(testBUChars, 3);
+    hasher.addCharacters(testBUChars + 3);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+}
+
+TEST(WTF, StringHasher_addCharactersAssumingAligned)
+{
+    StringHasher hasher;
+
+    // Hashing zero characters.
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(static_cast<LChar*>(0), 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(nullLChars, 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(static_cast<UChar*>(0), 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(nullUChars, 0);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(nullUChars);
+    ASSERT_EQ(emptyStringHash, hasher.hash());
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing one character.
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(nullLChars, 1);
+    ASSERT_EQ(singleNullCharacterHash, hasher.hash());
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(nullUChars, 1);
+    ASSERT_EQ(singleNullCharacterHash, hasher.hash());
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing five characters, all at once.
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testALChars, 5);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testALChars);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testAUChars, 5);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testAUChars);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testBUChars, 5);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testBUChars);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing five characters, in groups of two, then the last one.
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testALChars, 2);
+    ASSERT_EQ(testAHash2, hasher.hash());
+    ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testALChars + 2, 2);
+    ASSERT_EQ(testAHash4, hasher.hash());
+    ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testALChars + 4, 1);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testALChars, 2);
+    hasher.addCharactersAssumingAligned(testALChars + 2, 2);
+    hasher.addCharactersAssumingAligned(testALChars + 4);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testAUChars, 2);
+    ASSERT_EQ(testAHash2, hasher.hash());
+    ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testAUChars + 2, 2);
+    ASSERT_EQ(testAHash4, hasher.hash());
+    ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testAUChars + 4, 1);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testAUChars, 2);
+    hasher.addCharactersAssumingAligned(testAUChars + 2, 2);
+    hasher.addCharactersAssumingAligned(testAUChars + 4);
+    ASSERT_EQ(testAHash5, hasher.hash());
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testBUChars, 2);
+    ASSERT_EQ(testBHash2, hasher.hash());
+    ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testBUChars + 2, 2);
+    ASSERT_EQ(testBHash4, hasher.hash());
+    ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testBUChars + 4, 1);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher = StringHasher();
+    hasher.addCharactersAssumingAligned(testBUChars, 2);
+    hasher.addCharactersAssumingAligned(testBUChars + 2, 2);
+    hasher.addCharactersAssumingAligned(testBUChars + 4);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+
+    // Hashing five characters, first two characters one at a time,
+    // then two more, then the last one.
+    hasher = StringHasher();
+    hasher.addCharacter(testBUChars[0]);
+    ASSERT_EQ(testBHash1, hasher.hash());
+    ASSERT_EQ(testBHash1 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharacter(testBUChars[1]);
+    ASSERT_EQ(testBHash2, hasher.hash());
+    ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testBUChars[2], testBUChars[3]);
+    ASSERT_EQ(testBHash4, hasher.hash());
+    ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+    hasher.addCharactersAssumingAligned(testBUChars + 4);
+    ASSERT_EQ(testBHash5, hasher.hash());
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
+}
+
+TEST(WTF, StringHasher_computeHash)
+{
+    ASSERT_EQ(emptyStringHash, StringHasher::computeHash(static_cast<LChar*>(0), 0));
+    ASSERT_EQ(emptyStringHash, StringHasher::computeHash(nullLChars, 0));
+    ASSERT_EQ(emptyStringHash, StringHasher::computeHash(static_cast<UChar*>(0), 0));
+    ASSERT_EQ(emptyStringHash, StringHasher::computeHash(nullUChars, 0));
+
+    ASSERT_EQ(singleNullCharacterHash, StringHasher::computeHash(nullLChars, 1));
+    ASSERT_EQ(singleNullCharacterHash, StringHasher::computeHash(nullUChars, 1));
+
+    ASSERT_EQ(testAHash5, StringHasher::computeHash(testALChars, 5));
+    ASSERT_EQ(testAHash5, StringHasher::computeHash(testAUChars, 5));
+    ASSERT_EQ(testBHash5, StringHasher::computeHash(testBUChars, 5));
+}
+
+TEST(WTF, StringHasher_computeHashAndMaskTop8Bits)
+{
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(static_cast<LChar*>(0), 0));
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullLChars, 0));
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(static_cast<UChar*>(0), 0));
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullUChars, 0));
+
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullLChars, 1));
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullUChars, 1));
+
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(testALChars, 5));
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(testAUChars, 5));
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(testBUChars, 5));
+}
+
+TEST(WTF, StringHasher_hashMemory)
+{
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory(0, 0));
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory(nullUChars, 0));
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory<0>(0));
+    ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory<0>(nullUChars));
+
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::hashMemory(nullUChars, 2));
+    ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::hashMemory<2>(nullUChars));
+
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::hashMemory(testAUChars, 10));
+    ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::hashMemory<10>(testAUChars));
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, StringHasher::hashMemory(testBUChars, 10));
+    ASSERT_EQ(testBHash5 & 0xFFFFFF, StringHasher::hashMemory<10>(testBUChars));
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp b/Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp
index 819013f..149b85b 100644
--- a/Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp
+++ b/Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp
@@ -45,6 +45,7 @@
 {
     String string("String");
     AtomicString atomicString("AtomicString");
+    ASCIILiteral literal("ASCIILiteral");
 
     EXPECT_EQ(0, wtfStringCopyCount);
 
@@ -58,6 +59,11 @@
     EXPECT_N_WTF_STRING_COPIES(1, "C string" + atomicString);
     EXPECT_N_WTF_STRING_COPIES(1, atomicString + "C string");
 
+    EXPECT_N_WTF_STRING_COPIES(1, literal + string);
+    EXPECT_N_WTF_STRING_COPIES(1, string + literal);
+    EXPECT_N_WTF_STRING_COPIES(1, literal + atomicString);
+    EXPECT_N_WTF_STRING_COPIES(1, atomicString + literal);
+
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + "C string" + string);
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + "C string" + string));
     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + ("C string" + string));
@@ -65,6 +71,41 @@
     EXPECT_N_WTF_STRING_COPIES(2, string + ("C string" + string + "C string"));
     EXPECT_N_WTF_STRING_COPIES(2, (string + "C string") + (string + "C string"));
 
+    EXPECT_N_WTF_STRING_COPIES(2, literal + string + literal + string);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (string + literal + string));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + (literal + string));
+    EXPECT_N_WTF_STRING_COPIES(2, string + literal + string + literal);
+    EXPECT_N_WTF_STRING_COPIES(2, string + (literal + string + literal));
+    EXPECT_N_WTF_STRING_COPIES(2, (string + literal) + (string + literal));
+
+    EXPECT_N_WTF_STRING_COPIES(2, literal + string + "C string" + string);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (string + "C string" + string));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + ("C string" + string));
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + literal + string);
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + literal + string));
+    EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + (literal + string));
+
+    EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + "C string" + atomicString);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + "C string" + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + ("C string" + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + literal + atomicString);
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + literal + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + (literal + atomicString));
+
+    EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + "C string" + string);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + "C string" + string));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + ("C string" + string));
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + literal + string);
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + literal + string));
+    EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + (literal + string));
+
+    EXPECT_N_WTF_STRING_COPIES(2, literal + string + "C string" + atomicString);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (string + "C string" + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + ("C string" + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + literal + atomicString);
+    EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + literal + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + (literal + atomicString));
+
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + "C string" + atomicString);
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + "C string" + atomicString));
     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + ("C string" + atomicString));
@@ -72,6 +113,13 @@
     EXPECT_N_WTF_STRING_COPIES(2, atomicString + ("C string" + atomicString + "C string"));
     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + "C string") + (atomicString + "C string"));
 
+    EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + literal + atomicString);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + literal + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + (literal + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, atomicString + literal + atomicString + literal);
+    EXPECT_N_WTF_STRING_COPIES(2, atomicString + (literal + atomicString + literal));
+    EXPECT_N_WTF_STRING_COPIES(2, (atomicString + literal) + (atomicString + literal));
+
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + "C string" + atomicString);
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + "C string" + atomicString));
     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + ("C string" + atomicString));
@@ -79,6 +127,13 @@
     EXPECT_N_WTF_STRING_COPIES(2, string + ("C string" + atomicString + "C string"));
     EXPECT_N_WTF_STRING_COPIES(2, (string + "C string") + (atomicString + "C string"));
 
+    EXPECT_N_WTF_STRING_COPIES(2, literal + string + literal + atomicString);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (string + literal + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + (literal + atomicString));
+    EXPECT_N_WTF_STRING_COPIES(2, string + literal + atomicString + literal);
+    EXPECT_N_WTF_STRING_COPIES(2, string + (literal + atomicString + literal));
+    EXPECT_N_WTF_STRING_COPIES(2, (string + literal) + (atomicString + literal));
+
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + "C string" + string);
     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + "C string" + string));
     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + ("C string" + string));
@@ -86,6 +141,13 @@
     EXPECT_N_WTF_STRING_COPIES(2, atomicString + ("C string" + string + "C string"));
     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + "C string") + (string + "C string"));
 
+    EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + literal + string);
+    EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + literal + string));
+    EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + (literal + string));
+    EXPECT_N_WTF_STRING_COPIES(2, atomicString + literal + string + literal);
+    EXPECT_N_WTF_STRING_COPIES(2, atomicString + (literal + string + literal));
+    EXPECT_N_WTF_STRING_COPIES(2, (atomicString + literal) + (string + literal));
+
 #if COMPILER(MSVC)
     EXPECT_N_WTF_STRING_COPIES(1, L"wide string" + string);
     EXPECT_N_WTF_STRING_COPIES(1, string + L"wide string");
diff --git a/Tools/TestWebKitAPI/Tests/WTF/WTF.pro b/Tools/TestWebKitAPI/Tests/WTF/WTF.pro
new file mode 100644
index 0000000..1208198
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WTF/WTF.pro
@@ -0,0 +1,30 @@
+TEMPLATE = app
+TARGET = tst_wtf
+
+SOURCES += \
+    AtomicString.cpp \
+    CheckedArithmeticOperations.cpp \
+    CString.cpp \
+    Functional.cpp \
+    HashMap.cpp \
+    HashSet.cpp \
+    IntegerToStringConversion.cpp \
+    ListHashSet.cpp \
+    MathExtras.cpp \
+    MediaTime.cpp \
+    RedBlackTree.cpp \
+    SaturatedArithmeticOperations.cpp \
+    StringBuilder.cpp \
+    StringHasher.cpp \
+    StringImpl.cpp \
+    StringOperators.cpp \
+    TemporaryChange.cpp \
+    Vector.cpp \
+    VectorBasic.cpp \
+    VectorReverse.cpp \
+    WTFString.cpp
+
+include(../../TestWebKitAPI.pri)
+
+DEFINES += APITEST_SOURCE_DIR=\\\"$$PWD\\\"
+
diff --git a/Tools/TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp b/Tools/TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp
new file mode 100644
index 0000000..8486f7d
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2013 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WTFStringUtilities.h"
+#include <gtest/gtest.h>
+
+#include "HeapGraphSerializer.h"
+#include "MemoryInstrumentationImpl.h"
+#include <wtf/MemoryInstrumentation.h>
+#include <wtf/MemoryInstrumentationHashSet.h>
+#include <wtf/MemoryInstrumentationString.h>
+#include <wtf/MemoryObjectInfo.h>
+
+namespace TestWebKitAPI {
+
+using namespace WebCore;
+
+static WTF::MemoryObjectType g_defaultObjectType = "DefaultObjectType";
+
+class HeapGraphReceiver : public HeapGraphSerializer::Client {
+public:
+    HeapGraphReceiver() : m_serializer(this) { }
+
+    virtual void addNativeSnapshotChunk(PassRefPtr<TypeBuilder::Memory::HeapSnapshotChunk> heapSnapshotChunk) OVERRIDE
+    {
+        ASSERT(!m_heapSnapshotChunk);
+        m_heapSnapshotChunk = heapSnapshotChunk;
+        m_strings = chunkPart("strings");
+        m_edges = chunkPart("edges");
+        m_nodes = chunkPart("nodes");
+
+        // Reset platform depended size field values.
+        for (InspectorArray::iterator i = m_nodes->begin(); i != m_nodes->end(); i += s_nodeFieldCount)
+            *(i + s_sizeOffset) = InspectorBasicValue::create(0);
+
+        m_id2index.clear();
+
+        for (unsigned index = 0; index < m_nodes->length(); index += s_nodeFieldCount)
+            m_id2index.add(intValue(m_nodes.get(), index + s_idOffset), index);
+    }
+
+    void printGraph()
+    {
+        EXPECT_TRUE(m_heapSnapshotChunk);
+        int processedEdgesCount = 0;
+        for (unsigned index = 0; index < m_nodes->length(); index += s_nodeFieldCount)
+            processedEdgesCount += printNode(index, processedEdgesCount);
+    }
+
+    String dumpNodes() { return dumpPart("nodes"); }
+    String dumpEdges() { return dumpPart("edges"); }
+    String dumpBaseToRealNodeId() { return dumpPart("baseToRealNodeId"); }
+    String dumpStrings() { return dumpPart("strings"); }
+
+    HeapGraphSerializer* serializer() { return &m_serializer; }
+
+private:
+    PassRefPtr<InspectorArray> chunkPart(String partName)
+    {
+        EXPECT_TRUE(m_heapSnapshotChunk);
+        RefPtr<InspectorObject> chunk = *reinterpret_cast<RefPtr<InspectorObject>*>(&m_heapSnapshotChunk);
+        RefPtr<InspectorValue> partValue = chunk->get(partName);
+        RefPtr<InspectorArray> partArray;
+        EXPECT_TRUE(partValue->asArray(&partArray));
+        return partArray.release();
+    }
+
+    String dumpPart(String partName)
+    {
+        return chunkPart(partName)->toJSONString().replace("\"", "'");
+    }
+
+    String stringValue(InspectorArray* array, int index)
+    {
+        RefPtr<InspectorValue> inspectorValue = array->get(index);
+        String value;
+        EXPECT_TRUE(inspectorValue->asString(&value));
+        return value;
+    }
+
+    int intValue(InspectorArray* array, int index)
+    {
+        RefPtr<InspectorValue> inspectorValue = array->get(index);
+        int value;
+        EXPECT_TRUE(inspectorValue->asNumber(&value));
+        return value;
+    }
+
+    String nodeToString(unsigned nodeIndex)
+    {
+        StringBuilder builder;
+        builder.append("node: ");
+        builder.appendNumber(intValue(m_nodes.get(), nodeIndex + s_idOffset));
+        builder.append(" with className:'");
+        builder.append(stringValue(m_strings.get(), intValue(m_nodes.get(), nodeIndex + s_classNameOffset)));
+        builder.append("' and name: '");
+        builder.append(stringValue(m_strings.get(), intValue(m_nodes.get(), nodeIndex + s_nameOffset)));
+        builder.append("'");
+        return builder.toString();
+    }
+
+    String edgeToString(unsigned edgeOrdinal)
+    {
+        unsigned edgeIndex = edgeOrdinal * s_edgeFieldCount;
+        StringBuilder builder;
+        builder.append("'");
+        builder.append(stringValue(m_strings.get(), intValue(m_edges.get(), edgeIndex + s_edgeTypeOffset)));
+        builder.append("' edge '");
+        builder.append(stringValue(m_strings.get(), intValue(m_edges.get(), edgeIndex + s_edgeNameOffset)));
+        builder.append("' points to ");
+        int nodeId = intValue(m_edges.get(), edgeIndex + s_toNodeIdOffset);
+        builder.append(nodeToString(m_id2index.get(nodeId)));
+        return builder.toString();
+    }
+
+    int printNode(unsigned nodeIndex, unsigned processedEdgesCount)
+    {
+        String nodeString = nodeToString(nodeIndex);
+        unsigned edgeCount = intValue(m_nodes.get(), nodeIndex + s_edgeCountOffset);
+
+        printf("%s\n", nodeString.utf8().data());
+        for (unsigned i = 0; i < edgeCount; ++i) {
+            String edgeText = edgeToString(i + processedEdgesCount);
+            printf("\thas %s\n", edgeText.utf8().data());
+        }
+        return edgeCount;
+    }
+
+    HeapGraphSerializer m_serializer;
+    RefPtr<TypeBuilder::Memory::HeapSnapshotChunk> m_heapSnapshotChunk;
+
+    RefPtr<InspectorArray> m_strings;
+    RefPtr<InspectorArray> m_nodes;
+    RefPtr<InspectorArray> m_edges;
+    HashMap<int, int> m_id2index;
+
+    static const int s_nodeFieldCount = 5;
+    static const int s_classNameOffset = 0;
+    static const int s_nameOffset = 1;
+    static const int s_idOffset = 2;
+    static const int s_sizeOffset = 3;
+    static const int s_edgeCountOffset = 4;
+
+    static const int s_edgeFieldCount = 3;
+    static const int s_edgeTypeOffset = 0;
+    static const int s_edgeNameOffset = 1;
+    static const int s_toNodeIdOffset = 2;
+};
+
+class Helper {
+public:
+    Helper(HeapGraphSerializer* serializer)
+        : m_serializer(serializer)
+        , m_memoryInstrumentationClient(serializer)
+        , m_memoryInstrumentation(&m_memoryInstrumentationClient)
+        , m_currentPointer(0)
+    { }
+
+    void* addNode(const char* className, const char* name, bool isRoot)
+    {
+        WTF::MemoryObjectInfo info(&m_memoryInstrumentation, g_defaultObjectType, ++m_currentPointer);
+        info.setClassName(className);
+        info.setName(name);
+        if (isRoot)
+            info.markAsRoot();
+        m_serializer->reportNode(info);
+        return m_currentPointer;
+    }
+
+    void addEdge(void* to, const char* edgeName, WTF::MemberType memberType)
+    {
+        m_serializer->reportEdge(to, edgeName, memberType);
+    }
+
+    void done()
+    {
+        m_serializer->finish();
+    }
+
+private:
+    HeapGraphSerializer* m_serializer;
+    MemoryInstrumentationClientImpl m_memoryInstrumentationClient;
+    MemoryInstrumentationImpl m_memoryInstrumentation;
+
+    class Object {
+    public:
+        Object() { m_data[0] = 0; }
+        char m_data[sizeof(void*)];
+    };
+    Object* m_currentPointer;
+};
+
+TEST(HeapGraphSerializerTest, snapshotWithoutUserObjects)
+{
+    HeapGraphReceiver receiver;
+    Helper helper(receiver.serializer());
+    helper.done();
+    receiver.printGraph();
+    EXPECT_EQ(String("['','weak','property','object','unknown','Root']"), receiver.dumpStrings());
+    EXPECT_EQ(String("[5,0,1,0,0]"), receiver.dumpNodes()); // Only Root object.
+    EXPECT_EQ(String("[]"), receiver.dumpEdges()); // No edges.
+    EXPECT_EQ(String("[]"), receiver.dumpBaseToRealNodeId()); // No id maps.
+}
+
+TEST(HeapGraphSerializerTest, oneRootUserObject)
+{
+    HeapGraphReceiver receiver;
+    Helper helper(receiver.serializer());
+    helper.addNode("ClassName", "objectName", true);
+    helper.done();
+    receiver.printGraph();
+    EXPECT_EQ(String("['','weak','property','object','unknown','ClassName','objectName','Root']"), receiver.dumpStrings());
+    EXPECT_EQ(String("[5,6,1,0,0,7,0,2,0,1]"), receiver.dumpNodes());
+    EXPECT_EQ(String("[1,0,1]"), receiver.dumpEdges());
+    EXPECT_EQ(String("[]"), receiver.dumpBaseToRealNodeId());
+}
+
+TEST(HeapGraphSerializerTest, twoUserObjectsWithEdge)
+{
+    HeapGraphReceiver receiver;
+    Helper helper(receiver.serializer());
+    void* childObject = helper.addNode("Child", "child", false);
+    helper.addEdge(childObject, "pointerToChild", WTF::RetainingPointer);
+    helper.addNode("Parent", "parent", true);
+    helper.done();
+    receiver.printGraph();
+    EXPECT_EQ(String("['','weak','property','object','unknown','Child','child','pointerToChild','Parent','parent','Root']"), receiver.dumpStrings());
+    EXPECT_EQ(String("[5,6,1,0,0,8,9,2,0,1,10,0,3,0,1]"), receiver.dumpNodes());
+    EXPECT_EQ(String("[2,7,1,1,0,2]"), receiver.dumpEdges());
+    EXPECT_EQ(String("[]"), receiver.dumpBaseToRealNodeId());
+}
+
+class Owner {
+public:
+    Owner()
+    {
+        m_strings.add("first element");
+        m_strings.add("second element");
+    }
+    void reportMemoryUsage(WTF::MemoryObjectInfo* memoryObjectInfo) const
+    {
+        WTF::MemoryClassInfo info(memoryObjectInfo, this, g_defaultObjectType);
+        info.addMember(m_strings, "strings");
+    }
+private:
+    HashSet<String> m_strings;
+};
+
+TEST(HeapGraphSerializerTest, hashSetWithTwoStrings)
+{
+    HeapGraphReceiver receiver;
+    MemoryInstrumentationClientImpl memoryInstrumentationClient(receiver.serializer());
+    MemoryInstrumentationImpl memoryInstrumentation(&memoryInstrumentationClient);
+
+    Owner owner;
+    memoryInstrumentation.addRootObject(&owner);
+    receiver.serializer()->finish();
+    receiver.printGraph();
+    EXPECT_EQ(String("[6,0,1,0,0,5,0,4,0,3,9,0,3,0,0,9,0,2,0,0,10,0,5,0,1]"), receiver.dumpNodes());
+    EXPECT_EQ(String("[2,7,1,2,8,2,2,8,3,1,0,4]"), receiver.dumpEdges());
+    EXPECT_EQ(String("[]"), receiver.dumpBaseToRealNodeId());
+}
+
+} // namespace
diff --git a/Tools/TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp b/Tools/TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp
new file mode 100644
index 0000000..ceafb03
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebCore/LayoutUnit.cpp
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 2012, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define ENABLE_SUBPIXEL_LAYOUT 1
+#define ENABLE_SATURATED_LAYOUT_ARITHMETIC 1
+#include "config.h"
+
+#include <WebCore/LayoutUnit.h>
+
+using namespace WebCore;
+
+namespace TestWebKitAPI {
+
+TEST(WebCoreLayoutUnit, LayoutUnitInt)
+{
+    ASSERT_EQ(LayoutUnit(INT_MIN).toInt(), intMinForLayoutUnit);
+    ASSERT_EQ(LayoutUnit(INT_MIN / 2).toInt(), intMinForLayoutUnit);
+    ASSERT_EQ(LayoutUnit(intMinForLayoutUnit - 1).toInt(), intMinForLayoutUnit); 
+    ASSERT_EQ(LayoutUnit(intMinForLayoutUnit).toInt(), intMinForLayoutUnit);
+    ASSERT_EQ(LayoutUnit(intMinForLayoutUnit + 1).toInt(), intMinForLayoutUnit + 1);
+    ASSERT_EQ(LayoutUnit(intMinForLayoutUnit / 2).toInt(), intMinForLayoutUnit / 2);
+    ASSERT_EQ(LayoutUnit(-10000).toInt(), -10000);
+    ASSERT_EQ(LayoutUnit(-1000).toInt(), -1000);
+    ASSERT_EQ(LayoutUnit(-100).toInt(), -100);
+    ASSERT_EQ(LayoutUnit(-10).toInt(), -10);
+    ASSERT_EQ(LayoutUnit(-1).toInt(), -1);
+    ASSERT_EQ(LayoutUnit(0).toInt(), 0);
+    ASSERT_EQ(LayoutUnit(1).toInt(), 1);
+    ASSERT_EQ(LayoutUnit(100).toInt(), 100);
+    ASSERT_EQ(LayoutUnit(1000).toInt(), 1000);
+    ASSERT_EQ(LayoutUnit(10000).toInt(), 10000);
+    ASSERT_EQ(LayoutUnit(intMaxForLayoutUnit / 2).toInt(), intMaxForLayoutUnit / 2);
+    ASSERT_EQ(LayoutUnit(intMaxForLayoutUnit - 1).toInt(), intMaxForLayoutUnit - 1);
+    ASSERT_EQ(LayoutUnit(intMaxForLayoutUnit).toInt(), intMaxForLayoutUnit);
+    ASSERT_EQ(LayoutUnit(intMaxForLayoutUnit + 1).toInt(), intMaxForLayoutUnit);
+    ASSERT_EQ(LayoutUnit(INT_MAX / 2).toInt(), intMaxForLayoutUnit);
+    ASSERT_EQ(LayoutUnit(INT_MAX).toInt(), intMaxForLayoutUnit);
+}
+
+TEST(WebCoreLayoutUnit, LayoutUnitFloat)
+{
+    const float tolerance = 1.0f / kFixedPointDenominator;
+    ASSERT_FLOAT_EQ(LayoutUnit(1.0f).toFloat(), 1.0f);
+    ASSERT_FLOAT_EQ(LayoutUnit(1.25f).toFloat(), 1.25f);
+    ASSERT_NEAR(LayoutUnit(1.1f).toFloat(), 1.1f, tolerance);
+    ASSERT_NEAR(LayoutUnit(1.33f).toFloat(), 1.33f, tolerance);
+    ASSERT_NEAR(LayoutUnit(1.3333f).toFloat(), 1.3333f, tolerance);
+    ASSERT_NEAR(LayoutUnit(1.53434f).toFloat(), 1.53434f, tolerance);
+    ASSERT_NEAR(LayoutUnit(345634).toFloat(), 345634.0f, tolerance);
+    ASSERT_NEAR(LayoutUnit(345634.12335f).toFloat(), 345634.12335f, tolerance);
+    ASSERT_NEAR(LayoutUnit(-345634.12335f).toFloat(), -345634.12335f, tolerance);
+    ASSERT_NEAR(LayoutUnit(-345634).toFloat(), -345634.0f, tolerance);    
+}
+
+TEST(WebCoreLayoutUnit, LayoutUnitRounding)
+{
+    ASSERT_EQ(LayoutUnit(-1.9f).round(), -2);
+    ASSERT_EQ(LayoutUnit(-1.6f).round(), -2);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(-1.51f).round(), -2);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(-1.5f).round(), -1);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(-1.49f).round(), -1);
+    ASSERT_EQ(LayoutUnit(-1.0f).round(), -1);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(-0.99f).round(), -1);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(-0.51f).round(), -1);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(-0.50f).round(), 0);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(-0.49f).round(), 0);
+    ASSERT_EQ(LayoutUnit(-0.1f).round(), 0);
+    ASSERT_EQ(LayoutUnit(0.0f).round(), 0);
+    ASSERT_EQ(LayoutUnit(0.1f).round(), 0);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(0.49f).round(), 0);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(0.50f).round(), 1);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(0.51f).round(), 1);
+    ASSERT_EQ(LayoutUnit(0.99f).round(), 1);
+    ASSERT_EQ(LayoutUnit(1.0f).round(), 1);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(1.49f).round(), 1);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(1.5f).round(), 2);
+    ASSERT_EQ(LayoutUnit::fromFloatRound(1.51f).round(), 2);
+}
+
+TEST(WebCoreLayoutUnit, LayoutUnitSnapSizeToPixel)
+{
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1), LayoutUnit(0)), 1);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1), LayoutUnit(0.5)), 1);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.5), LayoutUnit(0)), 2);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.5), LayoutUnit(0.49)), 2);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.5), LayoutUnit(0.5)), 1);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.5), LayoutUnit(0.75)), 1);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.5), LayoutUnit(0.99)), 1);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.5), LayoutUnit(1)), 2);
+    
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(0.5), LayoutUnit(1.5)), 0);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(0.99), LayoutUnit(1.5)), 0);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.0), LayoutUnit(1.5)), 1);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.49), LayoutUnit(1.5)), 1);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(1.5), LayoutUnit(1.5)), 1);
+    
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(100.5), LayoutUnit(100)), 101);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(intMaxForLayoutUnit), LayoutUnit(0.3)), intMaxForLayoutUnit);
+    ASSERT_EQ(snapSizeToPixel(LayoutUnit(intMinForLayoutUnit), LayoutUnit(-0.3)), intMinForLayoutUnit);
+}
+
+TEST(WebCoreLayoutUnit, LayoutUnitMultiplication)
+{
+    ASSERT_EQ((LayoutUnit(1) * LayoutUnit(1)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(1) * LayoutUnit(2)).toInt(), 2);
+    ASSERT_EQ((LayoutUnit(2) * LayoutUnit(1)).toInt(), 2);
+    ASSERT_EQ((LayoutUnit(2) * LayoutUnit(0.5)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(0.5) * LayoutUnit(2)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(100) * LayoutUnit(1)).toInt(), 100);
+    
+    ASSERT_EQ((LayoutUnit(-1) * LayoutUnit(1)).toInt(), -1);
+    ASSERT_EQ((LayoutUnit(-1) * LayoutUnit(2)).toInt(), -2);
+    ASSERT_EQ((LayoutUnit(-2) * LayoutUnit(1)).toInt(), -2);
+    ASSERT_EQ((LayoutUnit(-2) * LayoutUnit(0.5)).toInt(), -1);
+    ASSERT_EQ((LayoutUnit(-0.5) * LayoutUnit(2)).toInt(), -1);
+    ASSERT_EQ((LayoutUnit(-100) * LayoutUnit(1)).toInt(), -100);
+    
+    ASSERT_EQ((LayoutUnit(-1) * LayoutUnit(-1)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(-1) * LayoutUnit(-2)).toInt(), 2);
+    ASSERT_EQ((LayoutUnit(-2) * LayoutUnit(-1)).toInt(), 2);
+    ASSERT_EQ((LayoutUnit(-2) * LayoutUnit(-0.5)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(-0.5) * LayoutUnit(-2)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(-100) * LayoutUnit(-1)).toInt(), 100);
+    
+    ASSERT_EQ((LayoutUnit(100) * LayoutUnit(3.33)).round(), 333);
+    ASSERT_EQ((LayoutUnit(-100) * LayoutUnit(3.33)).round(), -333);
+    ASSERT_EQ((LayoutUnit(-100) * LayoutUnit(-3.33)).round(), 333);
+
+    size_t aHundredSizeT = 100;
+    ASSERT_EQ((LayoutUnit(aHundredSizeT) * LayoutUnit(1)).toInt(), 100);
+    ASSERT_EQ((aHundredSizeT * LayoutUnit(4)).toInt(), 400);
+    ASSERT_EQ((LayoutUnit(4) * aHundredSizeT).toInt(), 400);
+
+    int quarterMax = intMaxForLayoutUnit / 4;
+    ASSERT_EQ((LayoutUnit(quarterMax) * LayoutUnit(2)).toInt(), quarterMax * 2);
+    ASSERT_EQ((LayoutUnit(quarterMax) * LayoutUnit(3)).toInt(), quarterMax * 3);
+    ASSERT_EQ((LayoutUnit(quarterMax) * LayoutUnit(4)).toInt(), quarterMax * 4);
+    ASSERT_EQ((LayoutUnit(quarterMax) * LayoutUnit(5)).toInt(), intMaxForLayoutUnit);
+
+    size_t overflowIntSizeT = intMaxForLayoutUnit * 4;
+    ASSERT_EQ((LayoutUnit(overflowIntSizeT) * LayoutUnit(2)).toInt(), intMaxForLayoutUnit);
+    ASSERT_EQ((overflowIntSizeT * LayoutUnit(4)).toInt(), intMaxForLayoutUnit);
+    ASSERT_EQ((LayoutUnit(4) * overflowIntSizeT).toInt(), intMaxForLayoutUnit);
+}
+
+TEST(WebCoreLayoutUnit, LayoutUnitDivision)
+{
+    ASSERT_EQ((LayoutUnit(1) / LayoutUnit(1)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(1) / LayoutUnit(2)).toInt(), 0);
+    ASSERT_EQ((LayoutUnit(2) / LayoutUnit(1)).toInt(), 2);
+    ASSERT_EQ((LayoutUnit(2) / LayoutUnit(0.5)).toInt(), 4);
+    ASSERT_EQ((LayoutUnit(0.5) / LayoutUnit(2)).toInt(), 0);
+    ASSERT_EQ((LayoutUnit(100) / LayoutUnit(10)).toInt(), 10);
+    ASSERT_FLOAT_EQ((LayoutUnit(1) / LayoutUnit(2)).toFloat(), 0.5f);
+    ASSERT_FLOAT_EQ((LayoutUnit(0.5) / LayoutUnit(2)).toFloat(), 0.25f);
+    
+    ASSERT_EQ((LayoutUnit(-1) / LayoutUnit(1)).toInt(), -1);
+    ASSERT_EQ((LayoutUnit(-1) / LayoutUnit(2)).toInt(), 0);
+    ASSERT_EQ((LayoutUnit(-2) / LayoutUnit(1)).toInt(), -2);
+    ASSERT_EQ((LayoutUnit(-2) / LayoutUnit(0.5)).toInt(), -4);
+    ASSERT_EQ((LayoutUnit(-0.5) / LayoutUnit(2)).toInt(), 0);
+    ASSERT_EQ((LayoutUnit(-100) / LayoutUnit(10)).toInt(), -10);
+    ASSERT_FLOAT_EQ((LayoutUnit(-1) / LayoutUnit(2)).toFloat(), -0.5f);
+    ASSERT_FLOAT_EQ((LayoutUnit(-0.5) / LayoutUnit(2)).toFloat(), -0.25f);
+    
+    ASSERT_EQ((LayoutUnit(-1) / LayoutUnit(-1)).toInt(), 1);
+    ASSERT_EQ((LayoutUnit(-1) / LayoutUnit(-2)).toInt(), 0);
+    ASSERT_EQ((LayoutUnit(-2) / LayoutUnit(-1)).toInt(), 2);
+    ASSERT_EQ((LayoutUnit(-2) / LayoutUnit(-0.5)).toInt(), 4);
+    ASSERT_EQ((LayoutUnit(-0.5) / LayoutUnit(-2)).toInt(), 0);
+    ASSERT_EQ((LayoutUnit(-100) / LayoutUnit(-10)).toInt(), 10);
+    ASSERT_FLOAT_EQ((LayoutUnit(-1) / LayoutUnit(-2)).toFloat(), 0.5f);
+    ASSERT_FLOAT_EQ((LayoutUnit(-0.5) / LayoutUnit(-2)).toFloat(), 0.25f);
+    
+    size_t aHundredSizeT = 100;
+    ASSERT_EQ((LayoutUnit(aHundredSizeT) / LayoutUnit(2)).toInt(), 50);
+    ASSERT_EQ((aHundredSizeT / LayoutUnit(4)).toInt(), 25);
+    ASSERT_EQ((LayoutUnit(400) / aHundredSizeT).toInt(), 4);
+
+    ASSERT_EQ((LayoutUnit(intMaxForLayoutUnit) / LayoutUnit(2)).toInt(), intMaxForLayoutUnit / 2);
+    ASSERT_EQ((LayoutUnit(intMaxForLayoutUnit) / LayoutUnit(0.5)).toInt(), intMaxForLayoutUnit);
+}
+
+TEST(WebCoreLayoutUnit, LayoutUnitCeil)
+{
+    ASSERT_EQ(LayoutUnit(0).ceil(), 0);
+    ASSERT_EQ(LayoutUnit(0.1).ceil(), 1);
+    ASSERT_EQ(LayoutUnit(0.5).ceil(), 1);
+    ASSERT_EQ(LayoutUnit(0.9).ceil(), 1);
+    ASSERT_EQ(LayoutUnit(1.0).ceil(), 1);
+    ASSERT_EQ(LayoutUnit(1.1).ceil(), 2);
+    
+    ASSERT_EQ(LayoutUnit(-0.1).ceil(), 0);
+    ASSERT_EQ(LayoutUnit(-0.5).ceil(), 0);
+    ASSERT_EQ(LayoutUnit(-0.9).ceil(), 0);
+    ASSERT_EQ(LayoutUnit(-1.0).ceil(), -1);
+    
+    ASSERT_EQ(LayoutUnit(intMaxForLayoutUnit).ceil(), intMaxForLayoutUnit);
+    ASSERT_EQ((LayoutUnit(intMaxForLayoutUnit) - LayoutUnit(0.5)).ceil(), intMaxForLayoutUnit);
+    ASSERT_EQ((LayoutUnit(intMaxForLayoutUnit) - LayoutUnit(1)).ceil(), intMaxForLayoutUnit - 1);
+
+    ASSERT_EQ(LayoutUnit(intMinForLayoutUnit).ceil(), intMinForLayoutUnit);
+}
+
+TEST(WebCoreLayoutUnit, LayoutUnitFloor)
+{
+    ASSERT_EQ(LayoutUnit(0).floor(), 0);
+    ASSERT_EQ(LayoutUnit(0.1).floor(), 0);
+    ASSERT_EQ(LayoutUnit(0.5).floor(), 0);
+    ASSERT_EQ(LayoutUnit(0.9).floor(), 0);
+    ASSERT_EQ(LayoutUnit(1.0).floor(), 1);
+    ASSERT_EQ(LayoutUnit(1.1).floor(), 1);
+    
+    ASSERT_EQ(LayoutUnit(-0.1).floor(), -1);
+    ASSERT_EQ(LayoutUnit(-0.5).floor(), -1);
+    ASSERT_EQ(LayoutUnit(-0.9).floor(), -1);
+    ASSERT_EQ(LayoutUnit(-1.0).floor(), -1);
+    
+    ASSERT_EQ(LayoutUnit(intMaxForLayoutUnit).floor(), intMaxForLayoutUnit);
+
+    ASSERT_EQ(LayoutUnit(intMinForLayoutUnit).floor(), intMinForLayoutUnit);
+    ASSERT_EQ((LayoutUnit(intMinForLayoutUnit) + LayoutUnit(0.5)).floor(), intMinForLayoutUnit);
+    ASSERT_EQ((LayoutUnit(intMinForLayoutUnit) + LayoutUnit(1)).floor(), intMinForLayoutUnit + 1);
+}
+
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp b/Tools/TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp
similarity index 62%
copy from Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
copy to Tools/TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp
index 5c4f42d..61b87cd 100644
--- a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
+++ b/Tools/TestWebKitAPI/Tests/WebCore/win/BitmapImage.cpp
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 peavo@outlook.com All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -24,12 +25,35 @@
  */
 
 #include "config.h"
-#include "InjectedBundleController.h"
+#include <WebCore/BitmapImage.h>
+
+using namespace WebCore;
 
 namespace TestWebKitAPI {
 
-void InjectedBundleController::platformInitialize()
+// Test that there is no crash when BitmapImage::getHBITMAPOfSize() is called
+// for an image with empty frames (BitmapImage::frameAtIndex(i) return null), WebKit Bug 102689.
+
+class BitmapImageTest : public WebCore::BitmapImage {
+public:
+    BitmapImageTest()
+    {
+        m_frames.grow(1);
+    }
+
+    virtual size_t frameCount()
+    {
+        return 1;
+    }
+};
+
+TEST(WebCore, BitmapImageEmptyFrameTest)
 {
+    SIZE sz = {16, 16};
+    RefPtr<BitmapImageTest> bitmapImageTest = adoptRef(new BitmapImageTest);
+    int bits[256];
+    HBITMAP hBitmap = CreateBitmap(16, 16, 1, 32, bits);
+    bitmapImageTest->getHBITMAPOfSize(hBitmap, &sz);
 }
 
 } // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/AboutBlankLoad.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/AboutBlankLoad.cpp
index ff36a0b..42939dd 100644
--- a/Tools/TestWebKitAPI/Tests/WebKit2/AboutBlankLoad.cpp
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/AboutBlankLoad.cpp
@@ -31,11 +31,10 @@
     
 static bool done;
 
-static void decidePolicyForResponse(WKPageRef, WKFrameRef, WKURLResponseRef response, WKURLRequestRef, WKFramePolicyListenerRef listener, WKTypeRef, const void*)
+static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void* clientInfo)
 {
-    EXPECT_WK_STREQ("text/html", Util::MIMETypeForWKURLResponse(response));
-
-    WKFramePolicyListenerUse(listener);
+    WKRetainPtr<WKStringRef> mimeType = adoptWK(WKFrameCopyMIMEType(frame));
+    EXPECT_WK_STREQ("text/html", mimeType);
     done = true;
 }
 
@@ -44,11 +43,10 @@
     WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate());
     PlatformWebView webView(context.get());
 
-    WKPagePolicyClient policyClient;
-    memset(&policyClient, 0, sizeof(policyClient));
-
-    policyClient.decidePolicyForResponse = decidePolicyForResponse;
-    WKPageSetPagePolicyClient(webView.page(), &policyClient);
+    WKPageLoaderClient loaderClient;
+    memset(&loaderClient, 0 , sizeof(loaderClient));
+    loaderClient.didFinishLoadForFrame = didFinishLoadForFrame;
+    WKPageSetPageLoaderClient(webView.page(), &loaderClient);
 
     WKPageLoadURL(webView.page(), adoptWK(WKURLCreateWithUTF8CString("about:blank")).get());
 
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/DOMWindowExtensionBasic.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/DOMWindowExtensionBasic.cpp
index 8be4440..7ccddae 100644
--- a/Tools/TestWebKitAPI/Tests/WebKit2/DOMWindowExtensionBasic.cpp
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/DOMWindowExtensionBasic.cpp
@@ -77,7 +77,7 @@
         finished = true;
 }
 
-TEST(WebKit2, DOMWindowExtensionBasic)
+TEST(WebKit2, DISABLED_DOMWindowExtensionBasic)
 {
     WKRetainPtr<WKPageGroupRef> pageGroup(AdoptWK, WKPageGroupCreateWithIdentifier(WKStringCreateWithUTF8CString("DOMWindowExtensionBasicPageGroup"))); 
 
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/FindMatches.mm b/Tools/TestWebKitAPI/Tests/WebKit2/FindMatches.mm
new file mode 100644
index 0000000..4b08972
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/FindMatches.mm
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PlatformUtilities.h"
+#include "PlatformWebView.h"
+#import <WebKit/WebDocumentPrivate.h>
+#import <WebKit/DOMPrivate.h>
+#include <WebKit2/WKImage.h>
+#import <wtf/RetainPtr.h>
+
+@interface FindMatchesWK1FrameLoadDelegate : NSObject {
+}
+@end
+
+static bool didFinishLoadWK1;
+
+@implementation FindMatchesWK1FrameLoadDelegate
+
+- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
+{
+    didFinishLoadWK1 = true;
+}
+
+@end
+
+namespace TestWebKitAPI {
+
+static bool didFinishLoad = false;
+static bool didCallFindStringMatches = false;
+static bool didCallGetImage = false;
+
+RetainPtr<WebView> webkit1View;
+
+static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void* clientInfo)
+{
+    didFinishLoad = true;
+}
+
+static void didFindStringMatches(WKPageRef page, WKStringRef string, WKArrayRef matches, int firstIndex, const void* clientInfo)
+{
+    EXPECT_WK_STREQ("Hello", string);
+    size_t numMatches = WKArrayGetSize(matches);
+    EXPECT_EQ(3u, numMatches);
+
+    for (size_t i = 0; i < numMatches; ++i) {
+        WKTypeRef items = WKArrayGetItemAtIndex(matches, i);
+        WKTypeID type = WKGetTypeID(items);
+        EXPECT_EQ(type, WKArrayGetTypeID());
+        WKArrayRef rects = reinterpret_cast<WKArrayRef>(items);
+        size_t numRects = WKArrayGetSize(rects);
+        EXPECT_EQ(1u, numRects);
+        items = WKArrayGetItemAtIndex(rects, 0);
+        type = WKGetTypeID(items);
+        EXPECT_EQ(type, WKRectGetTypeID());
+        WKRect rect = WKRectGetValue(reinterpret_cast<WKRectRef>(items));
+        rect = rect;
+    }
+    didCallFindStringMatches = true;
+}
+
+static void didGetImageForMatchResult(WKPageRef page, WKImageRef image, uint32_t index, const void* clientInfo)
+{
+    WKSize size = WKImageGetSize(image);
+
+    DOMDocument *document = webkit1View.get().mainFrameDocument;
+    DOMRange *range = [document createRange];
+    DOMNode *target = [document getElementById:@"target"];
+    [range selectNode:target];
+    NSImage *expectedImage = [range renderedImageForcingBlackText:YES];
+    NSSize expectedSize = [expectedImage size];
+    EXPECT_EQ(size.width, expectedSize.width);
+    EXPECT_EQ(size.height, expectedSize.height);
+    didCallGetImage = true;
+}
+
+TEST(WebKit2, FindMatches)
+{
+    WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate());
+    PlatformWebView webView(context.get());
+    
+    WKPageLoaderClient loaderClient;
+    memset(&loaderClient, 0, sizeof(loaderClient));
+    
+    loaderClient.version = 0;
+    loaderClient.didFinishLoadForFrame = didFinishLoadForFrame;
+    WKPageSetPageLoaderClient(webView.page(), &loaderClient);
+
+    WKPageFindMatchesClient findMatchesClient;
+    memset(&findMatchesClient, 0, sizeof(findMatchesClient));
+
+    findMatchesClient.version = 0;
+    findMatchesClient.didFindStringMatches = didFindStringMatches;
+    findMatchesClient.didGetImageForMatchResult = didGetImageForMatchResult;
+
+    WKPageSetPageFindMatchesClient(webView.page(), &findMatchesClient);
+
+    WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("find", "html"));
+    WKPageLoadURL(webView.page(), url.get());
+
+    Util::run(&didFinishLoad);
+
+    WKRetainPtr<WKStringRef> findString(AdoptWK, WKStringCreateWithUTF8CString("Hello"));
+ 
+    WKPageFindStringMatches(webView.page(), findString.get(), true, 100);
+    Util::run(&didCallFindStringMatches);
+
+    webkit1View.adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+    RetainPtr<FindMatchesWK1FrameLoadDelegate> frameLoadDelegate(AdoptNS, [FindMatchesWK1FrameLoadDelegate new]);
+
+    webkit1View.get().frameLoadDelegate = frameLoadDelegate.get();
+    [webkit1View.get().mainFrame loadHTMLString:@"Test search. Hello <span id=\"target\">Hello</span> Hello!" baseURL:[NSURL URLWithString:@"about:blank"]];
+
+    Util::run(&didFinishLoadWK1);
+
+    WKPageGetImageForFindMatch(webView.page(), 0);
+    Util::run(&didCallGetImage);
+
+    WKPageHideFindUI(webView.page());
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp
new file mode 100644
index 0000000..8aa7495
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PlatformUtilities.h"
+#include "PlatformWebView.h"
+#include "Test.h"
+#include <JavaScriptCore/JSContextRef.h>
+#include <WebKit2/WKRetainPtr.h>
+#include <WebKit2/WKSerializedScriptValue.h>
+
+namespace TestWebKitAPI {
+
+static bool testDone;
+
+static void didRunStep1StateChangeVisibleToHidden(WKSerializedScriptValueRef, WKErrorRef, void*);
+static void didRunStep2StateChangeHiddenToPrerender(WKSerializedScriptValueRef, WKErrorRef, void*);
+static void didRunStep3StateChangePrerenderToPreview(WKSerializedScriptValueRef, WKErrorRef, void*);
+static void didRunStep4InStatePreview(WKSerializedScriptValueRef, WKErrorRef, void*);
+
+static void setPageVisibilityStateWithEvalContinuation(PlatformWebView* webView, WKPageVisibilityState visibilityState, WKPageRunJavaScriptFunction callback)
+{
+    WKPageSetVisibilityState(webView->page(), visibilityState, false);
+    WKRetainPtr<WKStringRef> javaScriptString(AdoptWK, WKStringCreateWithUTF8CString("document.webkitVisibilityState"));
+    WKPageRunJavaScriptInMainFrame(webView->page(), javaScriptString.get(), static_cast<void*>(webView), callback);
+}
+
+static void assertSerializedScriptValueIsStringValue(WKSerializedScriptValueRef serializedValue, WKErrorRef error, const char *expected)
+{
+    EXPECT_NULL(error);
+    EXPECT_NOT_NULL(serializedValue);
+    if (error || !serializedValue)
+        return;
+
+    JSGlobalContextRef scriptContext = JSGlobalContextCreate(0);
+    JSValueRef scriptValue = WKSerializedScriptValueDeserialize(serializedValue, scriptContext, 0);
+    EXPECT_TRUE(JSValueIsString(scriptContext, scriptValue));
+    if (!JSValueIsString(scriptContext, scriptValue)) {
+        JSGlobalContextRelease(scriptContext);
+        return;
+    }
+
+    JSStringRef expectedString = JSStringCreateWithUTF8CString(expected);
+    JSStringRef scriptString = JSValueToStringCopy(scriptContext, scriptValue, 0);
+    EXPECT_TRUE(JSStringIsEqual(scriptString, expectedString));
+
+    JSStringRelease(scriptString);
+    JSStringRelease(expectedString);
+    JSGlobalContextRelease(scriptContext);
+}
+
+static void didRunStep1StateChangeVisibleToHidden(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context)
+{
+    assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "visible");
+    setPageVisibilityStateWithEvalContinuation(static_cast<PlatformWebView*>(context), kWKPageVisibilityStateHidden, didRunStep2StateChangeHiddenToPrerender);
+}
+
+static void didRunStep2StateChangeHiddenToPrerender(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context)
+{
+    assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "hidden");
+    setPageVisibilityStateWithEvalContinuation(static_cast<PlatformWebView*>(context), kWKPageVisibilityStatePrerender, didRunStep3StateChangePrerenderToPreview);
+}
+
+static void didRunStep3StateChangePrerenderToPreview(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context)
+{
+    assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "prerender");
+    setPageVisibilityStateWithEvalContinuation(static_cast<PlatformWebView*>(context), kWKPageVisibilityStatePreview, didRunStep4InStatePreview);
+}
+
+static void didRunStep4InStatePreview(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context)
+{
+    assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "preview");
+    testDone = true;
+}
+
+TEST(WebKit2, PageVisibilityState)
+{
+    WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate());
+
+    // Pass the PlatformWebView webView on as the context of the evals, so we can continue to eval on it.
+    PlatformWebView webView(context.get());
+    setPageVisibilityStateWithEvalContinuation(&webView, kWKPageVisibilityStateVisible, didRunStep1StateChangeVisibleToHidden);
+
+    Util::run(&testDone);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/PasteboardNotifications.mm b/Tools/TestWebKitAPI/Tests/WebKit2/PasteboardNotifications.mm
new file mode 100644
index 0000000..6635fae
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/PasteboardNotifications.mm
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PlatformUtilities.h"
+#include "PlatformWebView.h"
+#include "Test.h"
+
+#include <WebKit2/WKString.h>
+
+namespace TestWebKitAPI {
+
+static bool finished = false;
+
+static void didReceiveMessageFromInjectedBundle(WKContextRef context, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo)
+{
+    if (WKStringIsEqualToUTF8CString(messageName, "PasteboardNotificationTestDoneMessageName")
+        && WKStringIsEqualToUTF8CString(static_cast<WKStringRef>(messageBody), "didWriteToPasteboard")) {
+        NSData* data = [[NSPasteboard generalPasteboard] dataForType:@"AnotherArchivePasteboardType"];
+        EXPECT_NE(data, (NSData*)nil);
+        finished = true;
+    }
+}
+
+static void setInjectedBundleClient(WKContextRef context)
+{
+    WKContextInjectedBundleClient injectedBundleClient;
+    memset(&injectedBundleClient, 0, sizeof(injectedBundleClient));
+    injectedBundleClient.version = 0;
+    injectedBundleClient.clientInfo = 0;
+    injectedBundleClient.didReceiveMessageFromInjectedBundle = didReceiveMessageFromInjectedBundle;
+    WKContextSetInjectedBundleClient(context, &injectedBundleClient);
+}
+
+TEST(WebKit2, PasteboardNotifications)
+{
+    [[NSPasteboard generalPasteboard] clearContents];
+    
+    WKRetainPtr<WKContextRef> context = adoptWK(Util::createContextForInjectedBundleTest("PasteboardNotificationsTest"));
+    setInjectedBundleClient(context.get());
+
+    PlatformWebView webView(context.get());
+
+    WKRetainPtr<WKPreferencesRef> preferences(AdoptWK, WKPreferencesCreate());
+    WKPreferencesSetJavaScriptCanAccessClipboard(preferences.get(), true);
+
+    WKPageGroupRef pageGroup = WKPageGetPageGroup(webView.page());
+    WKPageGroupSetPreferences(pageGroup, preferences.get());
+
+    WKPageLoadURL(webView.page(), adoptWK(Util::createURLForResource("execCopy", "html")).get());
+    Util::run(&finished);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/PasteboardNotifications_Bundle.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/PasteboardNotifications_Bundle.cpp
new file mode 100644
index 0000000..d33b77b
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/PasteboardNotifications_Bundle.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "InjectedBundleTest.h"
+
+#include "PlatformUtilities.h"
+#include <WebKit2/WKArray.h>
+#include <WebKit2/WKBundlePage.h>
+#include <WebKit2/WKBundleBackForwardListItem.h>
+#include <WebKit2/WKWebArchive.h>
+
+namespace TestWebKitAPI {
+
+class PasteboardNotificationsTest : public InjectedBundleTest {
+public:
+    PasteboardNotificationsTest(const std::string& identifier);
+
+    virtual void didCreatePage(WKBundleRef, WKBundlePageRef);
+};
+
+static InjectedBundleTest::Register<PasteboardNotificationsTest> registrar("PasteboardNotificationsTest");
+
+static void willWriteToPasteboard(WKBundlePageRef page, WKBundleRangeHandleRef range,  const void*)
+{
+    if (!range)
+        WKBundlePostMessage(InjectedBundleController::shared().bundle(), Util::toWK("PasteboardNotificationTestDoneMessageName").get(), Util::toWK("willWritetoPasteboardFail").get());
+}
+
+static void getPasteboardDataForRange(WKBundlePageRef, WKBundleRangeHandleRef range, WKArrayRef* pasteboardTypes, WKArrayRef* pasteboardData, const void*)
+{
+    WKTypeRef typeName = WKStringCreateWithUTF8CString("AnotherArchivePasteboardType");
+    *pasteboardTypes = WKArrayCreateAdoptingValues(&typeName, 1);
+    WKTypeRef typeData = WKWebArchiveCopyData(WKWebArchiveCreateFromRange(range));
+    *pasteboardData = WKArrayCreateAdoptingValues(&typeData, 1);
+}
+
+static void didWriteToPasteboard(WKBundlePageRef, const void*)
+{
+    WKBundlePostMessage(InjectedBundleController::shared().bundle(), Util::toWK("PasteboardNotificationTestDoneMessageName").get(), Util::toWK("didWriteToPasteboard").get());
+}
+
+PasteboardNotificationsTest::PasteboardNotificationsTest(const std::string& identifier)
+    : InjectedBundleTest(identifier)
+{
+}
+
+void PasteboardNotificationsTest::didCreatePage(WKBundleRef bundle, WKBundlePageRef page)
+{    
+    WKBundlePageEditorClient pageEditorClient;
+
+    memset(&pageEditorClient, 0, sizeof(pageEditorClient));
+
+    pageEditorClient.version = 1;
+    pageEditorClient.clientInfo = this;
+    pageEditorClient.willWriteToPasteboard = willWriteToPasteboard;
+    pageEditorClient.getPasteboardDataForRange = getPasteboardDataForRange;
+    pageEditorClient.didWriteToPasteboard = didWriteToPasteboard;
+
+    WKBundlePageSetEditorClient(page, &pageEditorClient);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/ReloadPageAfterCrash.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/ReloadPageAfterCrash.cpp
new file mode 100644
index 0000000..7960dcb
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/ReloadPageAfterCrash.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2013 Adenilson Cavalcanti <cavalcantii@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PlatformUtilities.h"
+#include "PlatformWebView.h"
+#include "Test.h"
+#include <WebKit2/WKRetainPtr.h>
+
+namespace TestWebKitAPI {
+
+static bool loadBeforeCrash = false;
+static bool loadAfterCrash = false;
+
+static void didFinishLoad(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void* clientInfo)
+{
+    // First load before WebProcess was terminated.
+    if (!loadBeforeCrash) {
+        loadBeforeCrash = true;
+        return;
+    }
+
+    // Next load after WebProcess was terminated (hopefully
+    // it will be correctly re-spawned).
+    EXPECT_EQ(static_cast<uint32_t>(kWKFrameLoadStateFinished), WKFrameGetFrameLoadState(frame));
+    EXPECT_FALSE(loadAfterCrash);
+
+    // Set it, otherwise the loop will not end.
+    loadAfterCrash = true;
+}
+
+static void didCrash(WKPageRef page, const void*)
+{
+    // Test if first load actually worked.
+    EXPECT_TRUE(loadBeforeCrash);
+
+    // Reload should re-spawn webprocess.
+    WKPageReload(page);
+}
+
+TEST(WebKit2, ReloadPageAfterCrash)
+{
+    WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate());
+    PlatformWebView webView(context.get());
+
+    WKPageLoaderClient loaderClient;
+    memset(&loaderClient, 0, sizeof(loaderClient));
+    loaderClient.didFinishLoadForFrame = didFinishLoad;
+    loaderClient.processDidCrash = didCrash;
+    WKPageSetPageLoaderClient(webView.page(), &loaderClient);
+
+    WKRetainPtr<WKURLRef> url = adoptWK(WKURLCreateWithUTF8CString("about:blank"));
+    // Load a blank page and next kills WebProcess.
+    WKPageLoadURL(webView.page(), url.get());
+    Util::run(&loadBeforeCrash);
+    WKPageTerminate(webView.page());
+
+    // Let's try load a page and see what happens.
+    WKPageLoadURL(webView.page(), url.get());
+    Util::run(&loadAfterCrash);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/ResizeWindowAfterCrash.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/ResizeWindowAfterCrash.cpp
new file mode 100644
index 0000000..1af639d
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/ResizeWindowAfterCrash.cpp
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2013 Adenilson Cavalcanti <cavalcantii@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PlatformUtilities.h"
+#include "PlatformWebView.h"
+#include "Test.h"
+#include <WebKit2/WKRetainPtr.h>
+
+namespace TestWebKitAPI {
+
+struct TestStatesData {
+    TestStatesData(WKContextRef context)
+        : webView(context)
+        , firstLoad(false)
+        , resizeAfterCrash(false)
+    {
+    }
+
+    PlatformWebView webView;
+    bool firstLoad;
+    bool resizeAfterCrash;
+};
+
+static void didFinishLoad(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void* clientInfo)
+{
+    TestStatesData* states = const_cast<TestStatesData*>(static_cast<const TestStatesData*>(clientInfo));
+    if (!states->firstLoad) {
+        // Loading a blank page worked, next we will kill WebProcess.
+        states->firstLoad = true;
+        return;
+    }
+
+    EXPECT_FALSE(states->resizeAfterCrash);
+    states->resizeAfterCrash = true;
+}
+
+static void didCrash(WKPageRef page, const void* clientInfo)
+{
+    TestStatesData* states = const_cast<TestStatesData*>(static_cast<const TestStatesData*>(clientInfo));
+    EXPECT_TRUE(states->firstLoad);
+    // Resize should work after WebProcess was terminated, unless
+    // the port's View is accessing nulled WebProcess related data,
+    // which would cause a crash.
+    states->webView.resizeTo(100, 200);
+    states->webView.resizeTo(300, 400);
+
+    WKPageReload(page);
+}
+
+TEST(WebKit2, ResizeWindowAfterCrash)
+{
+    WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate());
+    TestStatesData states(context.get());
+
+    WKPageLoaderClient loaderClient;
+    memset(&loaderClient, 0, sizeof(loaderClient));
+    loaderClient.clientInfo = &states;
+    loaderClient.didFinishLoadForFrame = didFinishLoad;
+    loaderClient.processDidCrash = didCrash;
+    WKPageSetPageLoaderClient(states.webView.page(), &loaderClient);
+
+    WKRetainPtr<WKURLRef> url = adoptWK(WKURLCreateWithUTF8CString("about:blank"));
+    // Load a blank page and next kills WebProcess.
+    WKPageLoadURL(states.webView.page(), url.get());
+    Util::run(&states.firstLoad);
+    WKPageTerminate(states.webView.page());
+
+    // Let's try load a page and see what happens.
+    WKPageLoadURL(states.webView.page(), url.get());
+    Util::run(&states.resizeAfterCrash);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/ShouldGoToBackForwardListItem.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/ShouldGoToBackForwardListItem.cpp
index c13a5eb..c6f3b1b 100644
--- a/Tools/TestWebKitAPI/Tests/WebKit2/ShouldGoToBackForwardListItem.cpp
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/ShouldGoToBackForwardListItem.cpp
@@ -38,7 +38,7 @@
 static void didFinishLoadForFrame(WKPageRef, WKFrameRef frame, WKTypeRef, const void*)
 {
     // Only mark finished when the main frame loads
-    if (WKFrameGetParentFrame(frame))
+    if (!WKFrameIsMainFrame(frame))
         return;
 
     finished = true;
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/WKPreferences.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/WKPreferences.cpp
index 5c0751b..976e704 100644
--- a/Tools/TestWebKitAPI/Tests/WebKit2/WKPreferences.cpp
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/WKPreferences.cpp
@@ -57,7 +57,7 @@
     static const char* expectedCursiveFontFamily = "Apple Chancery";
     static const char* expectedFantasyFontFamily = "Papyrus";
     static const char* expectedPictographFontFamily = "Apple Color Emoji";
-#elif PLATFORM(GTK)
+#elif PLATFORM(GTK) || PLATFORM(EFL)
     static const char* expectedStandardFontFamily = "Times";
     static const char* expectedFixedFontFamily = "Courier New";
     static const char* expectedSerifFontFamily = "Times";
@@ -102,6 +102,7 @@
     EXPECT_FALSE(WKPreferencesGetCompositingRepaintCountersVisible(preference));
     EXPECT_FALSE(WKPreferencesGetNeedsSiteSpecificQuirks(preference));
     EXPECT_EQ(kWKAllowAllStorage, WKPreferencesGetStorageBlockingPolicy(preference));
+    EXPECT_FALSE(WKPreferencesGetTextAutosizingEnabled(preference));
 
     WKRelease(preference);
 }
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/WebKit2.pro b/Tools/TestWebKitAPI/Tests/WebKit2/WebKit2.pro
new file mode 100644
index 0000000..9452a5a
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/WebKit2.pro
@@ -0,0 +1,61 @@
+TEMPLATE = app
+TARGET = tst_webkit2
+
+SOURCES += \
+    AboutBlankLoad.cpp \
+    DocumentStartUserScriptAlertCrash.cpp \
+    DOMWindowExtensionBasic.cpp \
+    DOMWindowExtensionNoCache.cpp \
+    DocumentStartUserScriptAlertCrash.cpp \
+    EvaluateJavaScript.cpp \
+    FailedLoad.cpp \
+    Find.cpp \
+    FrameMIMETypeHTML.cpp \
+    FrameMIMETypePNG.cpp \
+    GetInjectedBundleInitializationUserDataCallback.cpp \
+    HitTestResultNodeHandle.cpp \
+    InjectedBundleBasic.cpp \
+    InjectedBundleFrameHitTest.cpp \
+    InjectedBundleInitializationUserDataCallbackWins.cpp \
+    LoadAlternateHTMLStringWithNonDirectoryURL.cpp \
+    LoadCanceledNoServerRedirectCallback.cpp \
+    MouseMoveAfterCrash.cpp \
+    PageLoadBasic.cpp \
+    PageLoadDidChangeLocationWithinPageForFrame.cpp \
+    PageVisibilityState.cpp \
+    ParentFrame.cpp \
+    PreventEmptyUserAgent.cpp \
+    PrivateBrowsingPushStateNoHistoryCallback.cpp \
+    ReloadPageAfterCrash.cpp \
+    ResizeWindowAfterCrash.cpp \
+    ResponsivenessTimerDoesntFireEarly.cpp \
+    UserMessage.cpp \
+    WillSendSubmitEvent.cpp \
+    WKConnection.cpp \
+    WKString.cpp \
+    WKStringJSString.cpp \
+    WKURL.cpp
+
+FAILING_SOURCES = \
+    CanHandleRequest.cpp \
+
+FAILING_SOURCES += ShouldGoToBackForwardListItem.cpp # Only stalls in flickable mode.
+FAILING_SOURCES += SpacebarScrolling.cpp # Only fails in flickable mode.
+
+SOURCES += $$FAILING_SOURCES
+
+# Tests skipped because they crash, stall or do not compile.
+SKIPPED_SOURCES = \
+    CookieManager.cpp \
+    DownloadDecideDestinationCrash.cpp \
+    ForceRepaint.cpp \
+    NewFirstVisuallyNonEmptyLayout.cpp \
+    NewFirstVisuallyNonEmptyLayoutFails.cpp \
+    NewFirstVisuallyNonEmptyLayoutForImages.cpp \
+    NewFirstVisuallyNonEmptyLayoutFrames.cpp \
+    RestoreSessionStateContainingFormData.cpp \
+    WebCoreStatisticsWithNoWebProcess.cpp
+
+include(../../TestWebKitAPI.pri)
+
+DEFINES += APITEST_SOURCE_DIR=\\\"$$PWD\\\"
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/efl/WKViewClientWebProcessCallbacks.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/efl/WKViewClientWebProcessCallbacks.cpp
new file mode 100644
index 0000000..450dcf1
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/efl/WKViewClientWebProcessCallbacks.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2013 Intel Corporation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ewk_view_private.h"
+#include "PlatformUtilities.h"
+#include "PlatformWebView.h"
+#include "Test.h"
+#include "WKView.h"
+#include <WebKit2/WKRetainPtr.h>
+
+namespace TestWebKitAPI {
+
+struct TestStatesData {
+    TestStatesData(WKViewRef view, WKURLRef url)
+        : view(view)
+        , url(url)
+        , didFinishLoad(false)
+        , didCrash(false)
+        , didRelaunch(false)
+    {
+    }
+
+    WKViewRef view;
+    WKURLRef url;
+    bool didFinishLoad;
+    bool didCrash;
+    bool didRelaunch;
+};
+
+static void didFinishLoadForFrame(WKPageRef, WKFrameRef, WKTypeRef, const void* clientInfo)
+{
+    TestStatesData* states = const_cast<TestStatesData*>(static_cast<const TestStatesData*>(clientInfo));
+    states->didFinishLoad = true;
+}
+
+static void setPageLoaderClient(WKPageRef page, const void* clientInfo)
+{
+    WKPageLoaderClient loaderClient;
+    memset(&loaderClient, 0, sizeof(loaderClient));
+
+    loaderClient.didFinishLoadForFrame = didFinishLoadForFrame;
+    loaderClient.clientInfo = clientInfo;
+
+    WKPageSetPageLoaderClient(page, &loaderClient);
+}
+
+void webProcessCrashed(WKViewRef view, WKURLRef url, const void* clientInfo)
+{
+    TestStatesData* states = const_cast<TestStatesData*>(static_cast<const TestStatesData*>(clientInfo));
+
+    EXPECT_EQ(states->view, view);
+    EXPECT_TRUE(WKURLIsEqual(url, states->url));
+
+    states->didCrash = true;
+}
+
+void webProcessDidRelaunch(WKViewRef view, const void* clientInfo)
+{
+    TestStatesData* states = const_cast<TestStatesData*>(static_cast<const TestStatesData*>(clientInfo));
+
+    EXPECT_EQ(states->view, view);
+
+    states->didRelaunch = true;
+}
+
+static void setViewClient(WKViewRef view, const void* clientInfo)
+{
+    WKViewClient viewClient;
+    memset(&viewClient, 0, sizeof(WKViewClient));
+
+    viewClient.version = kWKViewClientCurrentVersion;
+    viewClient.clientInfo = clientInfo;
+    viewClient.webProcessCrashed = webProcessCrashed;
+    viewClient.webProcessDidRelaunch = webProcessDidRelaunch;
+
+    WKViewSetViewClient(view, &viewClient);
+}
+
+TEST(WebKit2, WKViewClientWebProcessCallbacks)
+{
+    WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate());
+    WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("simple", "html"));
+
+    PlatformWebView view(context.get());
+    WKViewRef wkView = EWKViewGetWKView(view.platformView());
+
+    TestStatesData states = TestStatesData(wkView, url.get());
+
+    setPageLoaderClient(view.page(), &states);
+    setViewClient(wkView, &states);
+
+    WKPageLoadURL(view.page(), url.get());
+    Util::run(&states.didFinishLoad);
+
+    WKPageTerminate(view.page());
+    Util::run(&states.didCrash);
+
+    WKPageReload(view.page());
+    Util::run(&states.didRelaunch);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/execCopy.html b/Tools/TestWebKitAPI/Tests/WebKit2/execCopy.html
new file mode 100644
index 0000000..cf4608e
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2/execCopy.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+<script type="text/javascript">
+  function doCopy() {
+      document.execCommand("selectAll", true);
+      document.execCommand("copy");
+  }
+</script>
+</head>
+<body onLoad="doCopy()">
+    <div>Hello world.</div>
+    <div><b>Hello</b><i> world</i></div>
+    <div style="border: solid red 1px">Hello world</div>
+</body>
+</html>
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2ObjC/CustomProtocolsTest.mm b/Tools/TestWebKitAPI/Tests/WebKit2ObjC/CustomProtocolsTest.mm
new file mode 100644
index 0000000..0454f3f
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/WebKit2ObjC/CustomProtocolsTest.mm
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "Test.h"
+
+#import "PlatformUtilities.h"
+#import "TestBrowsingContextLoadDelegate.h"
+#import <Foundation/Foundation.h>
+#import <WebKit2/WebKit2.h>
+
+static NSString *testScheme = @"test";
+static NSString *testHost = @"test";
+static bool testFinished = false;
+
+@interface TestProtocol : NSURLProtocol {
+}
+@end
+
+@implementation TestProtocol
+
++ (BOOL)canInitWithRequest:(NSURLRequest *)request
+{
+    return [[[request URL] scheme] caseInsensitiveCompare:testScheme] == NSOrderedSame;
+}
+
++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
+{
+    return request;
+}
+
++ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b
+{
+    return NO;
+}
+
+- (void)startLoading
+{
+    EXPECT_TRUE([[[[self request] URL] scheme] isEqualToString:testScheme]);
+    EXPECT_TRUE([[[[self request] URL] host] isEqualToString:testHost]);
+    
+    NSData *data = [@"<body>PASS</body>" dataUsingEncoding:NSASCIIStringEncoding];
+    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[[self request] URL] MIMEType:@"text/html" expectedContentLength:[data length] textEncodingName:nil];
+    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
+    [[self client] URLProtocol:self didLoadData:data];
+    [[self client] URLProtocolDidFinishLoading:self];
+    [response release];
+}
+
+- (void)stopLoading
+{
+}
+
+@end
+
+TEST(WebKit2CustomProtocolsTest, CustomProtocolUsed)
+{
+    [NSURLProtocol registerClass:[TestProtocol class]];
+    [WKBrowsingContextController registerSchemeForCustomProtocol:testScheme];
+
+    WKProcessGroup *processGroup = [[WKProcessGroup alloc] init];
+    WKBrowsingContextGroup *browsingContextGroup = [[WKBrowsingContextGroup alloc] initWithIdentifier:@"TestIdentifier"];
+    WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup];
+    wkView.browsingContextController.loadDelegate = [[TestBrowsingContextLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
+        testFinished = true;
+    }];
+    [wkView.browsingContextController loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://%@", testScheme, testHost]]]];
+
+    TestWebKitAPI::Util::run(&testFinished);
+}
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm b/Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm
index d87ad5e..0258963 100644
--- a/Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm
+++ b/Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm
@@ -27,6 +27,7 @@
 #import "Test.h"
 
 #import "PlatformUtilities.h"
+#import "TestBrowsingContextLoadDelegate.h"
 #import <JavaScriptCore/JSRetainPtr.h>
 #import <JavaScriptCore/JavaScriptCore.h>
 #import <WebKit2/WKSerializedScriptValue.h>
@@ -42,40 +43,6 @@
 static const char* redInRGB = "rgb(255, 0, 0)";
 static const char* userScriptTestProperty = "window._userScriptInstalled";
 
-typedef void (^OnLoadBlock)(WKBrowsingContextController *);
-
-@interface UserContentTestLoadDelegate : NSObject <WKBrowsingContextLoadDelegate>
-{
-    OnLoadBlock _onLoadBlock;
-}
-
-@property (nonatomic, copy) OnLoadBlock onLoadBlock;
-
-- (id)initWithBlockToRunOnLoad:(OnLoadBlock)block;
-
-@end
-
-@implementation UserContentTestLoadDelegate
-
-@synthesize onLoadBlock = _onLoadBlock;
-
-- (id)initWithBlockToRunOnLoad:(OnLoadBlock)block
-{
-    if (!(self = [super init]))
-        return nil;
-    
-    self.onLoadBlock = block;
-    return self;
-}
-
-- (void)browsingContextControllerDidFinishLoad:(WKBrowsingContextController *)sender
-{
-    if (_onLoadBlock)
-        _onLoadBlock(sender);
-}
-
-@end
-
 namespace {
     class WebKit2UserContentTest : public ::testing::Test {
     public:
@@ -143,7 +110,7 @@
     
     WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup];
     WKStringRef backgroundColorQuery = WKStringCreateWithUTF8CString(backgroundColorScript);
-    wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
+    wkView.browsingContextController.loadDelegate = [[TestBrowsingContextLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
         WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, backgroundColorQuery, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) {
             expectScriptValueIsString(serializedScriptValue, greenInRGB);
             testFinished = true;
@@ -162,7 +129,7 @@
     
     WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup];
     WKStringRef backgroundColorQuery = WKStringCreateWithUTF8CString(backgroundColorScript);
-    wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
+    wkView.browsingContextController.loadDelegate = [[TestBrowsingContextLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
         WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, backgroundColorQuery, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) {
             expectScriptValueIsString(serializedScriptValue, greenInRGB);
             testFinished = true;
@@ -184,7 +151,7 @@
     
     WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup];
     WKStringRef backgroundColorQuery = WKStringCreateWithUTF8CString(backgroundColorScript);
-    wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
+    wkView.browsingContextController.loadDelegate = [[TestBrowsingContextLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
         WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, backgroundColorQuery, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) {
             expectScriptValueIsString(serializedScriptValue, redInRGB);
             testFinished = true;
@@ -206,7 +173,7 @@
     
     WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup];
     WKStringRef userScriptTestPropertyString = WKStringCreateWithUTF8CString(userScriptTestProperty);
-    wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
+    wkView.browsingContextController.loadDelegate = [[TestBrowsingContextLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
         WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, userScriptTestPropertyString, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) {
             expectScriptValueIsBoolean(serializedScriptValue, true);
             testFinished = true;
@@ -225,7 +192,7 @@
     
     WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup];
     WKStringRef userScriptTestPropertyString = WKStringCreateWithUTF8CString(userScriptTestProperty);
-    wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
+    wkView.browsingContextController.loadDelegate = [[TestBrowsingContextLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
         WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, userScriptTestPropertyString, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) {
             expectScriptValueIsBoolean(serializedScriptValue, true);
             testFinished = true;
@@ -247,7 +214,7 @@
     
     WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup];
     WKStringRef userScriptTestPropertyString = WKStringCreateWithUTF8CString(userScriptTestProperty);
-    wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
+    wkView.browsingContextController.loadDelegate = [[TestBrowsingContextLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) {
         WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, userScriptTestPropertyString, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) {
             expectScriptValueIsUndefined(serializedScriptValue);
             testFinished = true;
diff --git a/Tools/TestWebKitAPI/Tests/gtk/InputMethodFilter.cpp b/Tools/TestWebKitAPI/Tests/gtk/InputMethodFilter.cpp
index de40883..bfcc17d 100644
--- a/Tools/TestWebKitAPI/Tests/gtk/InputMethodFilter.cpp
+++ b/Tools/TestWebKitAPI/Tests/gtk/InputMethodFilter.cpp
@@ -80,21 +80,23 @@
     }
 
 protected:
-    virtual bool sendSimpleKeyEvent(GdkEventKey* event, WTF::String eventString)
+    virtual bool sendSimpleKeyEvent(GdkEventKey* event, WTF::String eventString, EventFakedForComposition faked)
     {
         const char* eventType = event->type == GDK_KEY_RELEASE ? "release" : "press";
+        const char* fakedString = faked == EventFaked ? " (faked)" : "";
         if (!eventString.isNull())
-            m_events.append(String::format("sendSimpleKeyEvent type=%s keycode=%x text='%s'", eventType, event->keyval, eventString.utf8().data()));
+            m_events.append(String::format("sendSimpleKeyEvent type=%s keycode=%x text='%s'%s", eventType, event->keyval, eventString.utf8().data(), fakedString));
         else
-            m_events.append(String::format("sendSimpleKeyEvent type=%s keycode=%x", eventType, event->keyval));
+            m_events.append(String::format("sendSimpleKeyEvent type=%s keycode=%x%s", eventType, event->keyval, fakedString));
 
         return true;
     }
 
-    virtual bool sendKeyEventWithCompositionResults(GdkEventKey* event, ResultsToSend resultsToSend)
+    virtual bool sendKeyEventWithCompositionResults(GdkEventKey* event, ResultsToSend resultsToSend, EventFakedForComposition faked)
     {
         const char* eventType = event->type == GDK_KEY_RELEASE ? "release" : "press";
-        m_events.append(String::format("sendKeyEventWithCompositionResults type=%s keycode=%u", eventType, event->keyval));
+        const char* fakedString = faked == EventFaked ? " (faked)" : "";
+        m_events.append(String::format("sendKeyEventWithCompositionResults type=%s keycode=%u%s", eventType, event->keyval, fakedString));
 
         if (resultsToSend & Composition && !m_confirmedComposition.isNull())
             confirmCompositionText(m_confirmedComposition);
@@ -241,12 +243,12 @@
 
     const Vector<String>& events = inputMethodFilter.events();
     ASSERT_EQ(6, events.size());
-    ASSERT_EQ(String("sendKeyEventWithCompositionResults type=press keycode=16777215"), events[0]);
+    ASSERT_EQ(String("sendKeyEventWithCompositionResults type=press keycode=16777215 (faked)"), events[0]);
     ASSERT_EQ(String("setPreedit text='preedit of doom, bringer of cheese' cursorOffset=3"), events[1]);
-    ASSERT_EQ(String("sendSimpleKeyEvent type=release keycode=ffffff"), events[2]);
-    ASSERT_EQ(String("sendKeyEventWithCompositionResults type=press keycode=16777215"), events[3]);
+    ASSERT_EQ(String("sendSimpleKeyEvent type=release keycode=ffffff (faked)"), events[2]);
+    ASSERT_EQ(String("sendKeyEventWithCompositionResults type=press keycode=16777215 (faked)"), events[3]);
     ASSERT_EQ(String("confirmComposition 'commit text'"), events[4]);
-    ASSERT_EQ(String("sendSimpleKeyEvent type=release keycode=ffffff"), events[5]);
+    ASSERT_EQ(String("sendSimpleKeyEvent type=release keycode=ffffff (faked)"), events[5]);
 }
 
 static bool gSawContextReset = false;
@@ -258,11 +260,10 @@
 
 static void verifyCanceledComposition(const Vector<String>& events)
 {
-    ASSERT_EQ(4, events.size());
+    ASSERT_EQ(3, events.size());
     ASSERT_EQ(String("sendKeyEventWithCompositionResults type=press keycode=39"), events[0]);
     ASSERT_EQ(String("setPreedit text='' cursorOffset=0"), events[1]);
     ASSERT_EQ(String("sendSimpleKeyEvent type=release keycode=27"), events[2]);
-    ASSERT_EQ(String("confirmCurrentcomposition"), events[3]);
     ASSERT(gSawContextReset);
 }
 
diff --git a/Tools/TestWebKitAPI/Tests/mac/DOMHTMLTableCellCellAbove.mm b/Tools/TestWebKitAPI/Tests/mac/DOMHTMLTableCellCellAbove.mm
new file mode 100644
index 0000000..d9c24a7
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/DOMHTMLTableCellCellAbove.mm
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PlatformUtilities.h"
+#include "PlatformWebView.h"
+#include <wtf/RetainPtr.h>
+
+#import <WebKit/DOMPrivate.h>
+#import <WebKit/WebViewPrivate.h>
+
+@interface HTMLTableCellElementCellAboveTest : NSObject
+@end
+
+static bool didFinishLoad;
+
+@implementation HTMLTableCellElementCellAboveTest
+
+- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
+{
+    didFinishLoad = true;
+}
+@end
+
+namespace TestWebKitAPI {
+
+static void expectCellAboveCell(DOMDocument *document, NSString *cellID, NSString *cellAboveID)
+{
+    DOMHTMLTableCellElement *cell = (DOMHTMLTableCellElement *)[document getElementById:cellID];
+    DOMHTMLTableCellElement *cellAbove = [cell _cellAbove];
+
+    EXPECT_WK_STREQ(cellAboveID, [cellAbove getAttribute:@"id"]);
+}
+
+TEST(WebKit1, HTMLTableCellElementCellAbove)
+{
+    RetainPtr<WebView> webView(AdoptNS, [[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+    RetainPtr<HTMLTableCellElementCellAboveTest> testController(AdoptNS, [HTMLTableCellElementCellAboveTest new]);
+
+    webView.get().frameLoadDelegate = testController.get();
+    [[webView.get() mainFrame] loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle]
+        URLForResource:@"DOMHTMLTableCellElementCellAbove" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
+
+    Util::run(&didFinishLoad);
+    didFinishLoad = false;
+
+    DOMDocument *document = webView.get().mainFrameDocument;
+
+    expectCellAboveCell(document, @"cell-4-2", @"cell-3-2");
+    expectCellAboveCell(document, @"cell-3-1", @"cell-2-1");
+    expectCellAboveCell(document, @"cell-2-1", @"cell-1-1");
+    expectCellAboveCell(document, @"cell-1-2", @"cell-h-2");
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/mac/DOMHTMLTableCellElementCellAbove.html b/Tools/TestWebKitAPI/Tests/mac/DOMHTMLTableCellElementCellAbove.html
new file mode 100644
index 0000000..79135fd
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/DOMHTMLTableCellElementCellAbove.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<body>
+    <table>
+        <tbody>
+            <tr>
+                <td id="cell-1-1">1-1</td>
+                <td id="cell-1-2">1-2</td>
+            </tr>
+            <tr>
+                <td id="cell-2-1">2-1</td>
+                <td id="cell-2-2">2-2</td>
+            </tr>
+        </tbody>
+        <thead>
+            <tr>
+                <th id="cell-h-1">h-1</th>
+                <th id="cell-h-2">h-2</th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr>
+                <td id="cell-3-1">3-1</td>
+                <td id="cell-3-2">3-2</td>
+            </tr>
+            <tr>
+                <td id="cell-4-1">4-1</td>
+                <td id="cell-4-2">4-2</td>
+            </tr>
+        </tbody>
+</body>
diff --git a/Tools/TestWebKitAPI/Tests/mac/DOMNodeFromJSObject.mm b/Tools/TestWebKitAPI/Tests/mac/DOMNodeFromJSObject.mm
new file mode 100644
index 0000000..7bd23ea
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/DOMNodeFromJSObject.mm
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#import <JavaScriptCore/JSRetainPtr.h>
+#import <WebKit/DOMPrivate.h>
+#import <WebKit/WebFramePrivate.h>
+#import <WebKit/WebScriptWorld.h>
+#import <objc/runtime.h>
+
+namespace TestWebKitAPI {
+
+TEST(WebKit1, DOMNodeFromJSObject)
+{
+    WebView *webView = [[WebView alloc] initWithFrame:NSZeroRect frameName:nil groupName:nil];
+
+    [webView stringByEvaluatingJavaScriptFromString:@"document.body.mainWorldProperty = true"];
+
+    WebScriptWorld *isolatedWorld = [WebScriptWorld world];
+    JSGlobalContextRef context = [[webView mainFrame] _globalContextForScriptWorld:isolatedWorld];
+
+    JSRetainPtr<JSStringRef> script(Adopt, JSStringCreateWithUTF8CString("document.body"));
+
+    JSValueRef value = JSEvaluateScript(context, script.get(), 0, 0, 0, 0);
+    JSObjectRef jsBody = JSValueToObject(context, value, 0);
+
+    id objcBody = [DOMNode _nodeFromJSWrapper:jsBody];
+
+    EXPECT_STREQ("DOMHTMLBodyElement", class_getName([objcBody class]));
+    EXPECT_EQ([[[webView mainFrame] DOMDocument] body], objcBody);
+
+    // Verify that the Objective-C wrapper is for the main world JS wrapper.
+    EXPECT_TRUE([[objcBody valueForKey:@"mainWorldProperty"] boolValue]);
+
+    [webView release];
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/mac/ElementAtPointInWebFrame.mm b/Tools/TestWebKitAPI/Tests/mac/ElementAtPointInWebFrame.mm
new file mode 100644
index 0000000..10fc581
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/ElementAtPointInWebFrame.mm
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "PlatformUtilities.h"
+#import <WebKit/WebFramePrivate.h>
+#import <wtf/RetainPtr.h>
+
+@interface ElementAtPointFrameLoadDelegate : NSObject
+@end
+
+static bool didFinishLoad;
+
+@implementation ElementAtPointFrameLoadDelegate
+
+- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
+{
+    didFinishLoad = true;
+}
+
+@end
+
+namespace TestWebKitAPI {
+
+TEST(WebKit1, ElementAtPoint)
+{
+    RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+    RetainPtr<ElementAtPointFrameLoadDelegate> frameLoadDelegate = adoptNS([[ElementAtPointFrameLoadDelegate alloc] init]);
+
+    webView.get().frameLoadDelegate = frameLoadDelegate.get();
+    WebFrame *mainFrame = webView.get().mainFrame;
+
+    [mainFrame loadHTMLString:@"<style> div { position:absolute; width:60px; height:100px; } </style> <div name='first'></div> <div name='second' style='left:60px; top:100px;'></div>"
+                      baseURL:[NSURL URLWithString:@"about:blank"]];
+
+    Util::run(&didFinishLoad);
+    
+    NSDictionary *elementDictionary = [mainFrame elementAtPoint:NSMakePoint(30, 50)];
+    DOMElement *domElement = [elementDictionary objectForKey:WebElementDOMNodeKey];
+    EXPECT_WK_STREQ(@"first", [domElement getAttribute:@"name"]);
+
+    elementDictionary = [mainFrame elementAtPoint:NSMakePoint(90, 150)];
+    domElement = [elementDictionary objectForKey:WebElementDOMNodeKey];
+    EXPECT_WK_STREQ(@"second", [domElement getAttribute:@"name"]);
+
+    elementDictionary = [mainFrame elementAtPoint:NSMakePoint(30, 150)];
+    domElement = [elementDictionary objectForKey:WebElementDOMNodeKey];
+    EXPECT_WK_STREQ(@"BODY", [domElement tagName]);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/mac/JSContextBackForwardCache1.html b/Tools/TestWebKitAPI/Tests/mac/JSContextBackForwardCache1.html
new file mode 100644
index 0000000..f736a78
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/JSContextBackForwardCache1.html
@@ -0,0 +1,10 @@
+<body>
+    <div id="test-div"></div>
+    <script>
+        var testDiv = document.getElementById("test-div");
+        if (!testDiv.myCustomProperty)
+            insertMyCustomProperty(testDiv);
+        else
+            checkForMyCustomProperty(testDiv);
+    </script>
+</body>
diff --git a/Tools/TestWebKitAPI/Tests/mac/JSContextBackForwardCache2.html b/Tools/TestWebKitAPI/Tests/mac/JSContextBackForwardCache2.html
new file mode 100644
index 0000000..1d26d21
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/JSContextBackForwardCache2.html
@@ -0,0 +1,10 @@
+<body>
+    <div id="test-div"></div>
+    <script>
+        var testDiv = document.getElementById("test-div");
+        if (testDiv.myCustomProperty)
+            myConsole.log("ERROR: found myCustomProperty.");
+        else
+            didCompleteTestSuccessfully();
+    </script>
+</body>
diff --git a/Tools/TestWebKitAPI/Tests/mac/JSWrapperForNodeInWebFrame.mm b/Tools/TestWebKitAPI/Tests/mac/JSWrapperForNodeInWebFrame.mm
new file mode 100644
index 0000000..5c41aaa
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/JSWrapperForNodeInWebFrame.mm
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "PlatformUtilities.h"
+#import <WebKit/WebFramePrivate.h>
+#import <WebKit/WebScriptWorld.h>
+#import <JavaScriptCore/JSContextRef.h>
+#import <JavaScriptCore/JSRetainPtr.h>
+#import <JavaScriptCore/JSStringRef.h>
+#import <JavaScriptCore/JSValueRef.h>
+#import <wtf/RetainPtr.h>
+
+@interface JSWrapperForNodeFrameLoadDelegate : NSObject {
+}
+@end
+
+static bool didFinishLoad;
+
+@implementation JSWrapperForNodeFrameLoadDelegate
+
+- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
+{
+    didFinishLoad = true;
+}
+
+@end
+
+namespace TestWebKitAPI {
+
+TEST(WebKit1, JSWrapperForNode)
+{
+    RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+    RetainPtr<JSWrapperForNodeFrameLoadDelegate> frameLoadDelegate = adoptNS([[JSWrapperForNodeFrameLoadDelegate alloc] init]);
+
+    webView.get().frameLoadDelegate = frameLoadDelegate.get();
+    WebFrame *mainFrame = webView.get().mainFrame;
+    [mainFrame loadHTMLString:@"<div id=\"target\"</div>" baseURL:[NSURL URLWithString:@"about:blank"]];
+    Util::run(&didFinishLoad);
+    DOMDocument *document = webView.get().mainFrameDocument;
+    DOMNode *target = [document getElementById:@"target"]; // This script object is in standard world.
+
+    // In an isolated script world, add a new property to the target node.
+    NSString *isolatedScriptString = @"var target = document.getElementById(\"target\"); target.isolatedProperty = true;";
+    WebScriptWorld *isolatedWorld = [WebScriptWorld world];
+    JSGlobalContextRef isolatedCtx = [mainFrame _globalContextForScriptWorld:isolatedWorld];
+    [mainFrame _stringByEvaluatingJavaScriptFromString:isolatedScriptString withGlobalObject:JSContextGetGlobalObject(isolatedCtx) inScriptWorld:isolatedWorld];
+    JSValueRef isolatedNodeJSValue = [mainFrame jsWrapperForNode:target inScriptWorld:isolatedWorld];
+    ASSERT_TRUE(JSValueIsObject(isolatedCtx, isolatedNodeJSValue));
+    JSObjectRef isolatedNodeJSObject = JSValueToObject(isolatedCtx, isolatedNodeJSValue, 0);
+
+    // In the standard script world, add a different property to the target node
+    NSString *normalScriptString = @"var target = document.getElementById(\"target\"); target.normalProperty = true;";
+    WebScriptWorld *normalWorld = [WebScriptWorld standardWorld];
+    JSGlobalContextRef normalCtx = [mainFrame _globalContextForScriptWorld:normalWorld];
+    [mainFrame _stringByEvaluatingJavaScriptFromString:normalScriptString withGlobalObject:JSContextGetGlobalObject(normalCtx) inScriptWorld:normalWorld];
+    JSValueRef normalNodeJSValue = [mainFrame jsWrapperForNode:target inScriptWorld:normalWorld];
+    ASSERT_TRUE(JSValueIsObject(normalCtx, normalNodeJSValue));
+    JSObjectRef normalNodeJSObject = JSValueToObject(normalCtx, normalNodeJSValue, 0);
+
+    JSRetainPtr<JSStringRef> isolatedPropertyJSString = JSStringCreateWithUTF8CString("isolatedProperty");
+    // Test for successful retrieval of the first property in the isolated script world
+    EXPECT_TRUE(JSValueIsBoolean(isolatedCtx, JSObjectGetProperty(isolatedCtx, isolatedNodeJSObject, isolatedPropertyJSString.get(), 0)));
+    // Test for failed retrieval of the first property in the standard script world
+    EXPECT_TRUE(JSValueIsUndefined(normalCtx, JSObjectGetProperty(normalCtx, normalNodeJSObject, isolatedPropertyJSString.get(), 0)));
+
+    JSRetainPtr<JSStringRef> normalPropertyJSString = JSStringCreateWithUTF8CString("normalProperty");
+    // Test for successful retrieval of the second property in the standard script world
+    EXPECT_TRUE(JSValueIsBoolean(normalCtx, JSObjectGetProperty(normalCtx, normalNodeJSObject, normalPropertyJSString.get(), 0)));
+    // Test for failed retrieval of the second property in the isolated script world
+    EXPECT_TRUE(JSValueIsUndefined(isolatedCtx, JSObjectGetProperty(isolatedCtx, isolatedNodeJSObject, normalPropertyJSString.get(), 0)));
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/mac/MemoryCachePruneWithinResourceLoadDelegate.mm b/Tools/TestWebKitAPI/Tests/mac/MemoryCachePruneWithinResourceLoadDelegate.mm
index b178abd..cf3d311 100644
--- a/Tools/TestWebKitAPI/Tests/mac/MemoryCachePruneWithinResourceLoadDelegate.mm
+++ b/Tools/TestWebKitAPI/Tests/mac/MemoryCachePruneWithinResourceLoadDelegate.mm
@@ -75,7 +75,7 @@
 
 namespace TestWebKitAPI {
 
-TEST(WebKit1, MemoryCachePruneWithinResourceLoadDelegate)
+TEST(WebKit1, DISABLED_MemoryCachePruneWithinResourceLoadDelegate)
 {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
diff --git a/Tools/TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.html b/Tools/TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.html
new file mode 100644
index 0000000..8a2bdc6
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.html
@@ -0,0 +1,6 @@
+<script>
+document.addEventListener("webkitvisibilitychange", function(event) {
+    // Send a signal to the test controller via alert.
+    alert('webkitvisibilitychange');
+});
+</script>
diff --git a/Tools/TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.mm b/Tools/TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.mm
new file mode 100644
index 0000000..cec138c
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/PageVisibilityStateWithWindowChanges.mm
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "JavaScriptTest.h"
+#import "Test.h"
+#import "WebKitAgnosticTest.h"
+#import <WebKit/WebView.h>
+#import <WebKit2/WKViewPrivate.h>
+#import <wtf/RetainPtr.h>
+
+static bool didGetPageSignalToContinue;
+
+// WebKit1 WebUIDelegate
+
+@interface PageVisibilityStateDelegate : NSObject
+@end
+
+@implementation PageVisibilityStateDelegate
+
+- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
+{
+    didGetPageSignalToContinue = true;
+}
+
+@end
+
+// WebKit2 WKPageUIClient
+
+static void runJavaScriptAlert(WKPageRef page, WKStringRef alertText, WKFrameRef frame, const void* clientInfo)
+{
+    didGetPageSignalToContinue = true;
+}
+
+// WebKitAgnosticTest
+
+namespace TestWebKitAPI {
+
+class PageVisibilityStateWithWindowChanges : public WebKitAgnosticTest {
+public:
+    template <typename View> void runTest(View);
+
+    // WebKitAgnosticTest
+    virtual NSURL *url() const OVERRIDE { return [[NSBundle mainBundle] URLForResource:@"PageVisibilityStateWithWindowChanges" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]; }
+    virtual void didLoadURL(WebView *webView) OVERRIDE { runTest(webView); }
+    virtual void didLoadURL(WKView *wkView) OVERRIDE { runTest(wkView); }
+
+    // Setup and teardown the UIDelegate which gets alert() signals from the page.
+    virtual void initializeView(WebView *) OVERRIDE;
+    virtual void initializeView(WKView *) OVERRIDE;
+    virtual void teardownView(WebView *) OVERRIDE;
+    virtual void teardownView(WKView *) OVERRIDE;
+};
+
+void PageVisibilityStateWithWindowChanges::initializeView(WebView *webView)
+{
+    // Released in teardownView.
+    webView.UIDelegate = [[PageVisibilityStateDelegate alloc] init];
+}
+
+void PageVisibilityStateWithWindowChanges::teardownView(WebView *webView)
+{
+    id uiDelegate = webView.UIDelegate;
+    webView.UIDelegate = nil;
+    [uiDelegate release];
+}
+
+void PageVisibilityStateWithWindowChanges::initializeView(WKView *wkView)
+{
+    WKPageUIClient uiClient;
+    memset(&uiClient, 0, sizeof(uiClient));
+    uiClient.version = 0;
+    uiClient.clientInfo = 0;
+    uiClient.runJavaScriptAlert = runJavaScriptAlert;
+    WKPageSetPageUIClient(wkView.pageRef, &uiClient);
+}
+
+void PageVisibilityStateWithWindowChanges::teardownView(WKView *wkView)
+{
+    // We do not need to teardown the WKPageUIClient.
+}
+
+template <typename View>
+void PageVisibilityStateWithWindowChanges::runTest(View view)
+{
+    // This WebView does not have a window and superview. PageVisibility should be "hidden".
+    EXPECT_NULL([view window]);
+    EXPECT_NULL([view superview]);
+    EXPECT_JS_EQ(view, "document.webkitVisibilityState", "hidden");
+
+    // Add it to a non-visible window. PageVisibility should still be "hidden".
+    RetainPtr<NSWindow> window(AdoptNS, [[NSWindow alloc] initWithContentRect:view.frame styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]);
+    [window.get().contentView addSubview:view];
+    EXPECT_NOT_NULL([view window]);
+    EXPECT_NOT_NULL([view superview]);
+    EXPECT_FALSE([window.get() isVisible]);
+    EXPECT_JS_EQ(view, "document.webkitVisibilityState", "hidden");
+
+    // Make the window visible. PageVisibility should become "visible".
+    didGetPageSignalToContinue = false;    
+    [window.get() makeKeyAndOrderFront:nil];
+    EXPECT_TRUE([window.get() isVisible]);
+    Util::run(&didGetPageSignalToContinue);
+    EXPECT_JS_EQ(view, "document.webkitVisibilityState", "visible");
+
+    // Minimize the window. PageVisibility should become "hidden".
+    didGetPageSignalToContinue = false;
+    [window.get() miniaturize:nil];
+    Util::run(&didGetPageSignalToContinue);
+    EXPECT_JS_EQ(view, "document.webkitVisibilityState", "hidden");
+
+    // Deminimize the window. PageVisibility should become "visible".
+    didGetPageSignalToContinue = false;
+    [window.get() deminiaturize:nil];
+    Util::run(&didGetPageSignalToContinue);
+    EXPECT_JS_EQ(view, "document.webkitVisibilityState", "visible");
+
+    // Remove the WebView from its superview. PageVisibility should become "hidden".
+    didGetPageSignalToContinue = false;
+    [view removeFromSuperview];
+    EXPECT_NULL([view window]);
+    EXPECT_NULL([view superview]);
+    EXPECT_TRUE([window.get() isVisible]);
+    Util::run(&didGetPageSignalToContinue);
+    EXPECT_JS_EQ(view, "document.webkitVisibilityState", "hidden");
+}
+    
+TEST_F(PageVisibilityStateWithWindowChanges, WebKit)
+{
+    runWebKit1Test();
+}
+
+TEST_F(PageVisibilityStateWithWindowChanges, WebKit2)
+{
+    runWebKit1Test();
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/Tests/mac/PublicSuffix.mm b/Tools/TestWebKitAPI/Tests/mac/PublicSuffix.mm
new file mode 100644
index 0000000..cb72414
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/PublicSuffix.mm
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if USE(PUBLIC_SUFFIX_LIST)
+
+#include "WTFStringUtilities.h"
+#include <WebCore/PublicSuffix.h>
+#include <wtf/MainThread.h>
+
+using namespace WebCore;
+
+namespace TestWebKitAPI {
+
+class PublicSuffix: public testing::Test {
+public:
+    virtual void SetUp()
+    {
+        WTF::initializeMainThread();
+        [WebView initialize];
+    }
+};
+
+TEST_F(PublicSuffix, IsPublicSuffix)
+{
+    EXPECT_TRUE(isPublicSuffix("com"));
+    EXPECT_FALSE(isPublicSuffix("test.com"));
+    EXPECT_FALSE(isPublicSuffix("com.com"));
+    EXPECT_TRUE(isPublicSuffix("net"));
+    EXPECT_TRUE(isPublicSuffix("org"));
+    EXPECT_TRUE(isPublicSuffix("co.uk"));
+    EXPECT_FALSE(isPublicSuffix("bl.uk"));
+    EXPECT_FALSE(isPublicSuffix("test.co.uk"));
+    EXPECT_TRUE(isPublicSuffix("xn--zf0ao64a.tw"));
+}
+
+TEST_F(PublicSuffix, TopPrivatelyControlledDomain)
+{
+    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("test.com"));
+    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("com.test.com"));
+    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("subdomain.test.com"));
+    EXPECT_EQ(String("com.com"), topPrivatelyControlledDomain("www.com.com"));
+    EXPECT_EQ(String("test.co.uk"), topPrivatelyControlledDomain("test.co.uk"));
+    EXPECT_EQ(String("test.co.uk"), topPrivatelyControlledDomain("subdomain.test.co.uk"));
+    EXPECT_EQ(String("bl.uk"), topPrivatelyControlledDomain("bl.uk"));
+    EXPECT_EQ(String("bl.uk"), topPrivatelyControlledDomain("subdomain.bl.uk"));
+    EXPECT_EQ(String("test.xn--zf0ao64a.tw"), topPrivatelyControlledDomain("test.xn--zf0ao64a.tw"));
+    EXPECT_EQ(String("test.xn--zf0ao64a.tw"), topPrivatelyControlledDomain("www.test.xn--zf0ao64a.tw"));
+    EXPECT_EQ(String("127.0.0.1"), topPrivatelyControlledDomain("127.0.0.1"));
+    EXPECT_EQ(String(), topPrivatelyControlledDomain("1"));
+    EXPECT_EQ(String(), topPrivatelyControlledDomain("com"));
+}
+
+}
+
+#endif
diff --git a/Tools/TestWebKitAPI/Tests/mac/WebViewDidCreateJavaScriptContext.mm b/Tools/TestWebKitAPI/Tests/mac/WebViewDidCreateJavaScriptContext.mm
new file mode 100644
index 0000000..39504dd
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/WebViewDidCreateJavaScriptContext.mm
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "PlatformUtilities.h"
+#import <JavaScriptCore/JSExport.h>
+#import <JavaScriptCore/JSContext.h>
+#import <WebKit/WebFrameLoadDelegatePrivate.h>
+#import <wtf/RetainPtr.h>
+
+#if JSC_OBJC_API_ENABLED
+
+@class MyConsole;
+
+static bool didFinishLoad = false;
+static bool didCompleteTestSuccessfully = false;
+static bool didCallWindowCallback = false;
+static bool didFindMyCustomProperty = false;
+static bool didInsertMyCustomProperty = true;
+
+@protocol MyConsole<JSExport>
+- (void)log:(NSString *)s;
+- (void)printHelloWorld;
+- (int)add:(int)a to:(int)b;
+@end
+
+@interface MyConsole : NSObject<MyConsole>
+@end
+
+@implementation MyConsole
+- (void)log:(NSString *)s
+{
+    NSLog(@"%@", s);
+}
+
+- (void)printHelloWorld
+{
+    NSLog(@"Hello, World!");
+}
+
+- (int)add:(int)a to:(int)b
+{
+    return a + b;
+}
+@end
+
+@interface DidCreateJavaScriptContextFrameLoadDelegate : NSObject
+@end
+
+@implementation DidCreateJavaScriptContextFrameLoadDelegate
+
+- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
+{
+    didFinishLoad = true;
+}
+
+- (void)webView:(WebView *)webView didCreateJavaScriptContext:(JSContext *)context forFrame:(WebFrame *)frame
+{
+    MyConsole *myConsole = [[MyConsole alloc] init];
+    context[@"myConsole"] = myConsole;
+    context.exceptionHandler = nil;
+    [myConsole release];
+
+    context[@"windowCallback"] = ^(JSValue *thisObject){
+        didCallWindowCallback = true;
+    };
+
+    context[@"didCompleteTestSuccessfully"] = ^{
+        didCompleteTestSuccessfully = true;
+    };
+
+    context[@"callMeBack"] = ^(JSValue *functionValue) {
+        [functionValue callWithArguments:[NSArray array]];
+    };
+
+    context[@"checkForMyCustomProperty"] = ^(JSValue *element) {
+        if ([element hasProperty:@"myCustomProperty"] && [[element valueForProperty:@"myCustomProperty"] toInt32] == 42)
+            didFindMyCustomProperty = true;
+        else
+            NSLog(@"ERROR: Did not find myCustomProperty.");
+    };
+
+    context[@"insertMyCustomProperty"] = ^(JSValue *element) {
+        JSValue *fortyTwo = [JSValue valueWithInt32:42 inContext:[JSContext currentContext]];
+        [element setValue:fortyTwo forProperty:@"myCustomProperty"];
+        didInsertMyCustomProperty = true;
+    };
+}
+
+@end
+
+namespace TestWebKitAPI {
+
+TEST(WebKit1, DidCreateJavaScriptContextSanity1)
+{
+    didFinishLoad = false;
+    @autoreleasepool {
+        RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+        RetainPtr<DidCreateJavaScriptContextFrameLoadDelegate> frameLoadDelegate = adoptNS([[DidCreateJavaScriptContextFrameLoadDelegate alloc] init]);
+
+        webView.get().frameLoadDelegate = frameLoadDelegate.get();
+        WebFrame *mainFrame = webView.get().mainFrame;
+
+        NSString *bodyString = 
+            @"<body> \
+                <script> \
+                    myConsole.printHelloWorld(); \
+                    myConsole.log(\"Loaded custom stuff.\"); \
+                    myConsole.log(myConsole.addTo(40, 2)); \
+                    didCompleteTestSuccessfully(); \
+                </script> \
+            </body>";
+        NSURL *aboutBlankURL = [NSURL URLWithString:@"about:blank"];
+
+        [mainFrame loadHTMLString:bodyString baseURL:aboutBlankURL];
+        Util::run(&didCompleteTestSuccessfully);
+    }
+}
+
+TEST(WebKit1, DidCreateJavaScriptContextSanity2)
+{
+    didCallWindowCallback = false;
+    @autoreleasepool {
+        RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+        RetainPtr<DidCreateJavaScriptContextFrameLoadDelegate> frameLoadDelegate = adoptNS([[DidCreateJavaScriptContextFrameLoadDelegate alloc] init]);
+
+        webView.get().frameLoadDelegate = frameLoadDelegate.get();
+        WebFrame *mainFrame = webView.get().mainFrame;
+
+        NSString *bodyString = 
+            @"<body> \
+                <script> \
+                    setTimeout(windowCallback, 100); \
+                </script> \
+            </body>";
+        NSURL *aboutBlankURL = [NSURL URLWithString:@"about:blank"];
+
+        [mainFrame loadHTMLString:bodyString baseURL:aboutBlankURL];
+        Util::run(&didCallWindowCallback);
+    }
+}
+
+TEST(WebKit1, DidCreateJavaScriptContextCallJSFunctionFromObjCCallbackTest)
+{
+    @autoreleasepool {
+        RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+        RetainPtr<DidCreateJavaScriptContextFrameLoadDelegate> frameLoadDelegate = adoptNS([[DidCreateJavaScriptContextFrameLoadDelegate alloc] init]);
+
+        webView.get().frameLoadDelegate = frameLoadDelegate.get();
+        WebFrame *mainFrame = webView.get().mainFrame;
+
+        NSString *bodyString = 
+            @"<body> \
+                <script> \
+                    callMeBack(function() { \
+                        didCompleteTestSuccessfully(); \
+                    }); \
+                </script> \
+            </body>";
+        NSURL *aboutBlankURL = [NSURL URLWithString:@"about:blank"];
+
+        [mainFrame loadHTMLString:bodyString baseURL:aboutBlankURL];
+        Util::run(&didCompleteTestSuccessfully);
+    }
+}
+
+TEST(WebKit1, DidCreateJavaScriptContextAddCustomPropertiesFromJSTest)
+{
+    didFindMyCustomProperty = false;
+    @autoreleasepool {
+        RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+        RetainPtr<DidCreateJavaScriptContextFrameLoadDelegate> frameLoadDelegate = adoptNS([[DidCreateJavaScriptContextFrameLoadDelegate alloc] init]);
+
+        webView.get().frameLoadDelegate = frameLoadDelegate.get();
+        WebFrame *mainFrame = webView.get().mainFrame;
+
+        NSString *bodyString = 
+        @"<body> \
+            <div id=\"test-div\"></div> \
+            <script> \
+                var testDiv = document.getElementById(\"test-div\"); \
+                testDiv.myCustomProperty = 42; \
+                checkForMyCustomProperty(testDiv); \
+            </script> \
+        </body>";
+        NSURL *aboutBlankURL = [NSURL URLWithString:@"about:blank"];
+
+        [mainFrame loadHTMLString:bodyString baseURL:aboutBlankURL];
+        Util::run(&didFindMyCustomProperty);
+    }
+}
+
+TEST(WebKit1, DidCreateJavaScriptContextAddCustomPropertiesFromObjCTest)
+{
+    didFindMyCustomProperty = false;
+    @autoreleasepool {
+        RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+        RetainPtr<DidCreateJavaScriptContextFrameLoadDelegate> frameLoadDelegate = adoptNS([[DidCreateJavaScriptContextFrameLoadDelegate alloc] init]);
+
+        webView.get().frameLoadDelegate = frameLoadDelegate.get();
+        WebFrame *mainFrame = webView.get().mainFrame;
+
+        NSString *bodyString = 
+            @"<body> \
+                <div id=\"test-div\"></div> \
+                <script> \
+                    var testDiv = document.getElementById(\"test-div\"); \
+                    insertMyCustomProperty(testDiv); \
+                    if (testDiv.myCustomProperty === 42) { \
+                        checkForMyCustomProperty(testDiv); \
+                    } \
+                </script> \
+            </body>";
+        NSURL *aboutBlankURL = [NSURL URLWithString:@"about:blank"];
+
+        [mainFrame loadHTMLString:bodyString baseURL:aboutBlankURL];
+        Util::run(&didFindMyCustomProperty);
+    }
+}
+
+TEST(WebKit1, DidCreateJavaScriptContextBackForwardCacheTest)
+{
+    didInsertMyCustomProperty = false;
+    didFindMyCustomProperty = false;
+    didCompleteTestSuccessfully = false;
+    @autoreleasepool {
+        RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+        RetainPtr<DidCreateJavaScriptContextFrameLoadDelegate> frameLoadDelegate = adoptNS([[DidCreateJavaScriptContextFrameLoadDelegate alloc] init]);
+
+        webView.get().frameLoadDelegate = frameLoadDelegate.get();
+        WebFrame *mainFrame = webView.get().mainFrame;
+
+        NSURL *url1 = [[NSBundle mainBundle] URLForResource:@"JSContextBackForwardCache1" 
+                                              withExtension:@"html" 
+                                               subdirectory:@"TestWebKitAPI.resources"];
+        [mainFrame loadRequest:[NSURLRequest requestWithURL:url1]];
+        Util::run(&didInsertMyCustomProperty);
+
+        NSURL *url2 = [[NSBundle mainBundle] URLForResource:@"JSContextBackForwardCache2" 
+                                              withExtension:@"html" 
+                                               subdirectory:@"TestWebKitAPI.resources"];
+        [mainFrame loadRequest:[NSURLRequest requestWithURL:url2]];
+        Util::run(&didCompleteTestSuccessfully);
+
+        didCompleteTestSuccessfully = false;
+        [[mainFrame javaScriptContext] evaluateScript:
+            @"var testDiv = document.getElementById(\"test-div\"); \
+            if (!testDiv.myCustomProperty) { \
+                didCompleteTestSuccessfully(); \
+            }"];
+        EXPECT_TRUE(didCompleteTestSuccessfully);
+
+        if ([webView.get() goBack]) {
+            [[mainFrame javaScriptContext] evaluateScript:
+                @"var testDiv = document.getElementById(\"test-div\"); \
+                checkForMyCustomProperty(testDiv);"];
+            EXPECT_TRUE(didFindMyCustomProperty);
+        } else
+            EXPECT_TRUE(false);
+    }
+}
+
+} // namespace TestWebKitAPI
+
+#endif // ENABLE(JSC_OBJC_API)
diff --git a/Tools/TestWebKitAPI/Tests/mac/WebViewDidRemoveFrameFromHierarchy.mm b/Tools/TestWebKitAPI/Tests/mac/WebViewDidRemoveFrameFromHierarchy.mm
new file mode 100644
index 0000000..fbe8af5
--- /dev/null
+++ b/Tools/TestWebKitAPI/Tests/mac/WebViewDidRemoveFrameFromHierarchy.mm
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "PlatformUtilities.h"
+#import <WebKit/WebFrameLoadDelegatePrivate.h>
+#import <wtf/RetainPtr.h>
+
+@interface DidRemoveFrameFromHierarchyFrameLoadDelegate : NSObject
+@end
+
+static bool didFinishLoad;
+static bool didRemoveFrame;
+
+@implementation DidRemoveFrameFromHierarchyFrameLoadDelegate
+
+- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
+{
+    didFinishLoad = true;
+}
+
+- (void)webView:(WebView *)sender didRemoveFrameFromHierarchy:(WebFrame *)frame
+{
+    didRemoveFrame = true;
+}
+
+@end
+
+namespace TestWebKitAPI {
+
+TEST(WebKit1, DidRemoveFrameFromHierarchy)
+{
+    RetainPtr<WebView> webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 120, 200) frameName:nil groupName:nil]);
+    RetainPtr<DidRemoveFrameFromHierarchyFrameLoadDelegate> frameLoadDelegate = adoptNS([[DidRemoveFrameFromHierarchyFrameLoadDelegate alloc] init]);
+
+    webView.get().frameLoadDelegate = frameLoadDelegate.get();
+    WebFrame *mainFrame = webView.get().mainFrame;
+
+    NSString *bodyWithIFrameString = @"<body><iframe id='iframe'></iframe></body>";
+    NSURL *aboutBlankURL = [NSURL URLWithString:@"about:blank"];
+
+    [mainFrame loadHTMLString:bodyWithIFrameString baseURL:aboutBlankURL];
+    Util::run(&didFinishLoad);
+    
+    EXPECT_FALSE(didRemoveFrame);
+    [webView.get() stringByEvaluatingJavaScriptFromString:@"document.body.removeChild(document.getElementById('iframe'))"];
+    EXPECT_TRUE(didRemoveFrame);
+
+    didFinishLoad = false;
+    didRemoveFrame = false;
+
+    [mainFrame loadHTMLString:bodyWithIFrameString baseURL:aboutBlankURL];
+    Util::run(&didFinishLoad);
+
+    // The delegate method is not called when the frame is removed due to navigation in an ancestor frame.
+    EXPECT_FALSE(didRemoveFrame);
+    [mainFrame loadHTMLString:@"<body></body>" baseURL:aboutBlankURL];
+    EXPECT_FALSE(didRemoveFrame);
+}
+
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/config.h b/Tools/TestWebKitAPI/config.h
index e796ebc..d4714cd 100644
--- a/Tools/TestWebKitAPI/config.h
+++ b/Tools/TestWebKitAPI/config.h
@@ -26,6 +26,8 @@
 #if defined(HAVE_CONFIG_H) && HAVE_CONFIG_H
 #ifdef BUILDING_WITH_CMAKE
 #include "cmakeconfig.h"
+#else
+#include "autotoolsconfig.h"
 #endif
 #endif
 
@@ -38,8 +40,12 @@
 #if defined(__APPLE__) && __APPLE__
 
 #ifdef __OBJC__
+#if PLATFORM(IOS)
+#import <Foundation/Foundation.h>
+#else
 #import <Cocoa/Cocoa.h>
 #endif
+#endif
 
 #elif defined(WIN32) || defined(_WIN32)
 
@@ -47,11 +53,24 @@
 #define NOMINMAX
 #endif
 
+#if PLATFORM(WIN_CAIRO)
+#undef WTF_USE_CG
+#define WTF_USE_CAIRO 1
+#define WTF_USE_CURL 1
+#ifndef _WINSOCKAPI_
+#define _WINSOCKAPI_ // Prevent inclusion of winsock.h in windows.h
+#endif
+#elif !OS(WINCE)
+#define WTF_USE_CG 1
+#undef WTF_USE_CAIRO
+#undef WTF_USE_CURL
+#endif
+
 #endif
 
 #include <stdint.h>
 
-#if !PLATFORM(CHROMIUM) || (PLATFORM(GTK) && defined(BUILDING_WEBKIT2__))
+#if !PLATFORM(IOS) && ((!PLATFORM(CHROMIUM) && !PLATFORM(WIN)) || (PLATFORM(GTK) && defined(BUILDING_WEBKIT2__)))
 #include <WebKit2/WebKit2_C.h>
 #endif
 
diff --git a/Tools/TestWebKitAPI/efl/PlatformUtilities.cpp b/Tools/TestWebKitAPI/efl/PlatformUtilities.cpp
index 9674545..65c54e1 100644
--- a/Tools/TestWebKitAPI/efl/PlatformUtilities.cpp
+++ b/Tools/TestWebKitAPI/efl/PlatformUtilities.cpp
@@ -42,7 +42,7 @@
 
 void sleep(double seconds)
 {
-    sleep(seconds);
+    usleep(seconds * 1000000);
 }
 
 WKURLRef createURLForResource(const char* resource, const char* extension)
@@ -64,6 +64,11 @@
     return WKURLCreateWithUTF8CString("file:///does-not-exist.html");
 }
 
+WKRetainPtr<WKStringRef> MIMETypeForWKURLResponse(WKURLResponseRef wkResponse)
+{
+    return adoptWK(WKURLResponseCopyMIMEType(wkResponse));
+}
+
 } // namespace Util
 
 } // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/efl/PlatformWebView.cpp b/Tools/TestWebKitAPI/efl/PlatformWebView.cpp
index 2e87f70..be29f0e 100644
--- a/Tools/TestWebKitAPI/efl/PlatformWebView.cpp
+++ b/Tools/TestWebKitAPI/efl/PlatformWebView.cpp
@@ -25,10 +25,12 @@
  */
 
 #include "config.h"
+#include "ewk_view_private.h"
 #include "PlatformWebView.h"
 
 #include "EWebKit2.h"
-#include "WebKit2/WKAPICast.h"
+#include <WebKit2/WKAPICast.h>
+#include <WebKit2/WKRetainPtr.h>
 #include <Ecore_Evas.h>
 
 extern bool useX11Window;
@@ -39,7 +41,8 @@
 
 static Ecore_Evas* initEcoreEvas()
 {
-    ASSERT(ecore_evas_init());
+    if (!ecore_evas_init())
+        return 0;
 
     const char* engine = 0;
 #if defined(WTF_USE_ACCELERATED_COMPOSITING) && defined(HAVE_ECORE_X)
@@ -54,18 +57,29 @@
     return ecoreEvas;
 }
 
+static void onWebProcessCrashed(void*, Evas_Object*, void* eventInfo)
+{
+    bool* handled = static_cast<bool*>(eventInfo);
+    *handled = true;
+}
+
 PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef)
 {
     m_window = initEcoreEvas();
-    Evas* evas = ecore_evas_get(m_window);
-    m_view = toImpl(WKViewCreate(evas, contextRef, pageGroupRef));
-    ewk_view_theme_set(m_view, THEME_DIR"/default.edj");
+
+    m_view = EWKViewCreate(contextRef, pageGroupRef, ecore_evas_get(m_window), /* smart */ 0);
+
+    WKRetainPtr<WKStringRef> wkTheme = adoptWK(WKStringCreateWithUTF8CString(THEME_DIR "/default.edj"));
+    WKViewSetThemePath(EWKViewGetWKView(m_view), wkTheme.get());
+
+    evas_object_smart_callback_add(m_view, "webprocess,crashed", onWebProcessCrashed, 0);
     resizeTo(600, 800);
 }
 
 PlatformWebView::~PlatformWebView()
 {
     evas_object_del(m_view);
+
     ecore_evas_free(m_window);
     ecore_evas_shutdown();
 }
@@ -77,7 +91,31 @@
 
 WKPageRef PlatformWebView::page() const
 {
-    return WKViewGetPage(toAPI(m_view));
+    return WKViewGetPage(EWKViewGetWKView(m_view));
+}
+
+void PlatformWebView::simulateSpacebarKeyPress()
+{
+    Evas* evas = evas_object_evas_get(m_view);
+    evas_object_focus_set(m_view, true);
+    evas_event_feed_key_down(evas, "space", "space", " ", 0, 0, 0);
+    evas_event_feed_key_up(evas, "space", "space", " ", 0, 1, 0);
+}
+
+void PlatformWebView::simulateMouseMove(unsigned x, unsigned y)
+{
+    Evas* evas = evas_object_evas_get(m_view);
+    evas_object_show(m_view);
+    evas_event_feed_mouse_move(evas, x, y, 0, 0);
+}
+
+void PlatformWebView::simulateRightClick(unsigned x, unsigned y)
+{
+    Evas* evas = evas_object_evas_get(m_view);
+    evas_object_show(m_view);
+    evas_event_feed_mouse_move(evas, x, y, 0, 0);
+    evas_event_feed_mouse_down(evas, 3, EVAS_BUTTON_NONE, 0, 0);
+    evas_event_feed_mouse_up(evas, 3, EVAS_BUTTON_NONE, 0, 0);
 }
 
 } // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp b/Tools/TestWebKitAPI/ios/mainIOS.mm
similarity index 78%
copy from Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
copy to Tools/TestWebKitAPI/ios/mainIOS.mm
index 5c4f42d..3eec9b0 100644
--- a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
+++ b/Tools/TestWebKitAPI/ios/mainIOS.mm
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,13 +23,16 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "config.h"
-#include "InjectedBundleController.h"
+#import "config.h"
+#import "TestsController.h"
 
-namespace TestWebKitAPI {
-
-void InjectedBundleController::platformInitialize()
+int main(int argc, char** argv)
 {
-}
+    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
-} // namespace TestWebKitAPI
+    bool passed = TestWebKitAPI::TestsController::shared().run(argc, argv);
+
+    [pool drain];
+
+    return passed ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h b/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h
index 20d9f0a..fe31a8a 100644
--- a/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h
+++ b/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h
@@ -26,7 +26,7 @@
 #ifndef InstanceMethodSwizzler_h
 #define InstanceMethodSwizzler_h
 
-#include <objc/objc-runtime.h>
+#include <objc/runtime.h>
 #include <wtf/Noncopyable.h>
 
 namespace TestWebKitAPI {
diff --git a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp b/Tools/TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.h
similarity index 76%
copy from Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
copy to Tools/TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.h
index 5c4f42d..d8f8ffa 100644
--- a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
+++ b/Tools/TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,13 +23,17 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "config.h"
-#include "InjectedBundleController.h"
+#import <WebKit2/WebKit2.h>
 
-namespace TestWebKitAPI {
+typedef void (^OnLoadBlock)(WKBrowsingContextController *);
 
-void InjectedBundleController::platformInitialize()
-{
+@interface TestBrowsingContextLoadDelegate : NSObject <WKBrowsingContextLoadDelegate> {
+@private
+    OnLoadBlock _onLoadBlock;
 }
 
-} // namespace TestWebKitAPI
+@property(nonatomic, copy) OnLoadBlock onLoadBlock;
+
+- (id)initWithBlockToRunOnLoad:(OnLoadBlock)block;
+
+@end
diff --git a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp b/Tools/TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.mm
similarity index 72%
copy from Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
copy to Tools/TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.mm
index 5c4f42d..a6c8cef 100644
--- a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
+++ b/Tools/TestWebKitAPI/mac/TestBrowsingContextLoadDelegate.mm
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -24,12 +24,25 @@
  */
 
 #include "config.h"
-#include "InjectedBundleController.h"
+#include "TestBrowsingContextLoadDelegate.h"
 
-namespace TestWebKitAPI {
+@implementation TestBrowsingContextLoadDelegate
 
-void InjectedBundleController::platformInitialize()
+@synthesize onLoadBlock = _onLoadBlock;
+
+- (id)initWithBlockToRunOnLoad:(OnLoadBlock)block
 {
+    if (!(self = [super init]))
+        return nil;
+    
+    self.onLoadBlock = block;
+    return self;
 }
 
-} // namespace TestWebKitAPI
+- (void)browsingContextControllerDidFinishLoad:(WKBrowsingContextController *)sender
+{
+    if (_onLoadBlock)
+        _onLoadBlock(sender);
+}
+
+@end
\ No newline at end of file
diff --git a/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.h b/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.h
index 9e5bf7c..c25c4b4 100644
--- a/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.h
+++ b/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.h
@@ -58,6 +58,9 @@
     virtual void initializeView(WebView *) { }
     virtual void initializeView(WKView *) { }
 
+    virtual void teardownView(WebView *) { }
+    virtual void teardownView(WKView *) { }
+
     bool didFinishLoad;
 };
 
diff --git a/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.mm b/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.mm
index 60caca5..ce25a84 100644
--- a/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.mm
+++ b/Tools/TestWebKitAPI/mac/WebKitAgnosticTest.mm
@@ -91,6 +91,7 @@
     loadURL(webView.get(), url());
     waitForLoadToFinish();
     didLoadURL(webView.get());
+    teardownView(webView.get());
 }
 
 void WebKitAgnosticTest::runWebKit2Test()
@@ -104,6 +105,7 @@
     loadURL(view.get(), url());
     waitForLoadToFinish();
     didLoadURL(view.get());
+    teardownView(view.get());
 }
 
 void WebKitAgnosticTest::loadURL(WebView *webView, NSURL *url)
diff --git a/Tools/TestWebKitAPI/mac/main.mm b/Tools/TestWebKitAPI/mac/mainMac.mm
similarity index 100%
rename from Tools/TestWebKitAPI/mac/main.mm
rename to Tools/TestWebKitAPI/mac/mainMac.mm
diff --git a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp b/Tools/TestWebKitAPI/qt/InjectedBundleControllerQt.cpp
similarity index 95%
rename from Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
rename to Tools/TestWebKitAPI/qt/InjectedBundleControllerQt.cpp
index 5c4f42d..5d55002 100644
--- a/Tools/TestWebKitAPI/win/InjectedBundleControllerWin.cpp
+++ b/Tools/TestWebKitAPI/qt/InjectedBundleControllerQt.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Igalia S.L.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
diff --git a/Tools/TestWebKitAPI/qt/PlatformUtilitiesQt.cpp b/Tools/TestWebKitAPI/qt/PlatformUtilitiesQt.cpp
new file mode 100644
index 0000000..5a3c13a
--- /dev/null
+++ b/Tools/TestWebKitAPI/qt/PlatformUtilitiesQt.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "PlatformUtilities.h"
+
+#include <WebKit2/WKStringQt.h>
+#include <WebKit2/WKNativeEvent.h>
+#include <WebKit2/WKURLQt.h>
+
+#include <QCoreApplication>
+#include <QDir>
+#include <QUrl>
+#include <QThread>
+
+namespace TestWebKitAPI {
+namespace Util {
+
+void run(bool* done)
+{
+    while (!*done)
+        QCoreApplication::processEvents();
+}
+
+void sleep(double seconds)
+{
+    QThread::sleep(seconds);
+}
+
+WKStringRef createInjectedBundlePath()
+{
+    QString path = QFileInfo(QStringLiteral(ROOT_BUILD_DIR "/lib/libTestWebKitAPIInjectedBundle")).absoluteFilePath();
+
+    return WKStringCreateWithQString(path);
+}
+
+WKURLRef createURLForResource(const char* resource, const char* extension)
+{
+    QDir path(QStringLiteral(APITEST_SOURCE_DIR));
+    QString filename = QString::fromLocal8Bit(resource) + QStringLiteral(".") + QString::fromLocal8Bit(extension);
+
+    return WKURLCreateWithQUrl(QUrl::fromLocalFile(path.absoluteFilePath(filename)));
+}
+
+WKURLRef URLForNonExistentResource()
+{
+    return WKURLCreateWithUTF8CString("file:///does-not-exist.html");
+}
+
+bool isKeyDown(WKNativeEventPtr event)
+{
+    return event->type() == QEvent::KeyPress;
+}
+
+} // namespace Util
+} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/qt/PlatformWebViewQt.cpp b/Tools/TestWebKitAPI/qt/PlatformWebViewQt.cpp
new file mode 100644
index 0000000..9949ade
--- /dev/null
+++ b/Tools/TestWebKitAPI/qt/PlatformWebViewQt.cpp
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 University of Szeged. All rights reserved.
+ * Copyright (C) 2013 Digia Plc. and/or its subsidiary(-ies).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "PlatformWebView.h"
+#include "qquickwebpage_p.h"
+#include "qquickwebview_p.h"
+
+#include <WebKit2/WKRetainPtr.h>
+
+#include <QCoreApplication>
+#include <QEventLoop>
+#include <QQmlProperty>
+#include <QtQuick/QQuickView>
+#include <qpa/qwindowsysteminterface.h>
+
+namespace TestWebKitAPI {
+
+class WrapperWindow : public QQuickView {
+    Q_OBJECT
+public:
+    WrapperWindow(QQuickWebView* view)
+        : QQuickView(QUrl(QStringLiteral("data:text/plain,import QtQuick 2.0\nItem { objectName: 'root' }")))
+        , m_view(view)
+    {
+        connect(this, SIGNAL(statusChanged(QQuickView::Status)), SLOT(handleStatusChanged(QQuickView::Status)));
+    }
+
+private Q_SLOTS:
+    void handleStatusChanged(QQuickView::Status status)
+    {
+        if (status != QQuickView::Ready)
+            return;
+
+        setGeometry(0, 0, 800, 600);
+
+        setResizeMode(QQuickView::SizeRootObjectToView);
+        m_view->setParentItem(rootObject());
+        QQmlProperty::write(m_view, QStringLiteral("anchors.fill"), qVariantFromValue(rootObject()));
+
+        m_view->experimental()->setRenderToOffscreenBuffer(true);
+
+        QWindowSystemInterface::handleWindowActivated(this);
+        m_view->page()->setFocus(true);
+    }
+
+private:
+    QQuickWebView* m_view;
+};
+
+PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef)
+{
+    m_view = new QQuickWebView(contextRef, pageGroupRef);
+    m_view->setAllowAnyHTTPSCertificateForLocalHost(true);
+    m_view->componentComplete();
+
+    m_window = new WrapperWindow(m_view);
+}
+
+PlatformWebView::~PlatformWebView()
+{
+    delete m_window;
+}
+
+void PlatformWebView::resizeTo(unsigned width, unsigned height)
+{
+    // If we do not have a platform window we will never get the necessary
+    // resize event, so simulate it in that case to make sure the quickview is
+    // resized to what the api tests expects.
+    if (!m_window->handle()) {
+        QRect newGeometry(m_window->x(), m_window->y(), width, height);
+        QWindowSystemInterface::handleGeometryChange(m_window, newGeometry);
+        QWindowSystemInterface::flushWindowSystemEvents();
+    }
+
+    m_window->resize(width, height);
+}
+
+WKPageRef PlatformWebView::page() const
+{
+    return m_view->pageRef();
+}
+
+void PlatformWebView::focus()
+{
+    m_view->setFocus(true);
+}
+
+void PlatformWebView::simulateSpacebarKeyPress()
+{
+    QKeyEvent event(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier);
+    QCoreApplication::sendEvent(m_window, &event);
+    QKeyEvent event2(QEvent::KeyRelease, Qt::Key_Space, Qt::NoModifier);
+    QCoreApplication::sendEvent(m_window, &event2);
+}
+
+void PlatformWebView::simulateAltKeyPress()
+{
+    QKeyEvent event(QEvent::KeyPress, Qt::Key_Alt, Qt::NoModifier);
+    QCoreApplication::sendEvent(m_window, &event);
+    QKeyEvent event2(QEvent::KeyRelease, Qt::Key_Alt, Qt::NoModifier);
+    QCoreApplication::sendEvent(m_window, &event2);
+}
+
+void PlatformWebView::simulateMouseMove(unsigned x, unsigned y)
+{
+    QPointF mousePos(x, y);
+    QMouseEvent event(QEvent::MouseMove, mousePos, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
+    QCoreApplication::sendEvent(m_window, &event);
+}
+
+void PlatformWebView::simulateRightClick(unsigned x, unsigned y)
+{
+    QPointF mousePos(x, y);
+    QMouseEvent event2(QEvent::MouseButtonPress, mousePos, Qt::RightButton, Qt::RightButton, Qt::NoModifier);
+    QCoreApplication::sendEvent(m_window, &event2);
+    QMouseEvent event3(QEvent::MouseButtonRelease, mousePos,  Qt::RightButton, Qt::NoButton, Qt::NoModifier);
+    QCoreApplication::sendEvent(m_window, &event3);
+}
+
+} // namespace TestWebKitAPI
+
+#include "PlatformWebViewQt.moc"
diff --git a/Tools/TestWebKitAPI/qt/main.cpp b/Tools/TestWebKitAPI/qt/main.cpp
new file mode 100644
index 0000000..efad5bb
--- /dev/null
+++ b/Tools/TestWebKitAPI/qt/main.cpp
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "TestsController.h"
+
+#include "qquickwebview_p.h"
+#include <QGuiApplication>
+
+void addQtWebProcessToPath()
+{
+    // Since tests won't find ./QtWebProcess, add it to PATH (at the end to prevent surprises).
+    // ROOT_BUILD_DIR should be defined by qmake.
+    qputenv("PATH", qgetenv("PATH") + QByteArray(":" ROOT_BUILD_DIR "/bin"));
+}
+
+void messageHandler(QtMsgType type, const QMessageLogContext&, const QString& message)
+{
+    if (type == QtCriticalMsg) {
+        fprintf(stderr, "%s\n", qPrintable(message));
+        return;
+    }
+
+    // Do nothing
+}
+
+int main(int argc, char** argv)
+{
+    bool suppressQtDebugOutput = true; // Suppress debug output from Qt if not started with --verbose.
+    bool useDesktopBehavior = true; // Use traditional desktop behavior if not started with --flickable.
+
+    for (int i = 1; i < argc; ++i) {
+        if (!qstrcmp(argv[i], "--verbose"))
+            suppressQtDebugOutput = false;
+        else if (!qstrcmp(argv[i], "--flickable"))
+            useDesktopBehavior = false;
+    }
+
+    QQuickWebViewExperimental::setFlickableViewportEnabled(!useDesktopBehavior);
+
+    // Has to be done before QApplication is constructed in case
+    // QApplication itself produces debug output.
+    if (suppressQtDebugOutput) {
+        qInstallMessageHandler(messageHandler);
+        if (qgetenv("QT_WEBKIT_SUPPRESS_WEB_PROCESS_OUTPUT").isEmpty())
+            qputenv("QT_WEBKIT_SUPPRESS_WEB_PROCESS_OUTPUT", "1");
+    }
+
+    QGuiApplication app(argc, argv);
+    addQtWebProcessToPath();
+
+    return TestWebKitAPI::TestsController::shared().run(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/Tools/TestWebKitAPI/win/PlatformUtilitiesWin.cpp b/Tools/TestWebKitAPI/win/PlatformUtilitiesWin.cpp
deleted file mode 100644
index 1b9823d..0000000
--- a/Tools/TestWebKitAPI/win/PlatformUtilitiesWin.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "PlatformUtilities.h"
-
-#include <WebKit2/WKStringCF.h>
-#include <WebKit2/WKURLCF.h>
-#include <wtf/RetainPtr.h>
-
-#if USE(CFNETWORK)
-#include <WebKit2/WKURLResponseCF.h>
-#endif
-
-namespace TestWebKitAPI {
-namespace Util {
-
-#ifdef DEBUG_ALL
-const char* injectedBundleDLL = "TestWebKitAPIInjectedBundle_debug.dll";
-#else
-const char* injectedBundleDLL = "TestWebKitAPIInjectedBundle.dll";
-#endif
-
-void run(bool* done)
-{
-    while (!*done) {
-        MSG msg;
-        BOOL result = ::GetMessageW(&msg, 0, 0, 0);
-        if (!result || result == -1)
-            break;
-        
-        if (shouldTranslateMessage(msg))
-            ::TranslateMessage(&msg);
-        ::DispatchMessage(&msg);
-    }
-}
-
-bool shouldTranslateMessage(const MSG& msg)
-{
-    // Only these four messages are actually translated by ::TranslateMessage or ::TranslateAccelerator.
-    // It's useless (though harmless) to call those functions for other messages, so we always allow other messages to be translated.
-    if (msg.message != WM_KEYDOWN && msg.message != WM_SYSKEYDOWN && msg.message != WM_KEYUP && msg.message != WM_SYSKEYUP)
-        return true;
-    
-    wchar_t className[256];
-    if (!::GetClassNameW(msg.hwnd, className, ARRAYSIZE(className)))
-        return true;
-
-    // Don't call TranslateMessage() on key events destined for a WebKit2 view, WebKit will do this if it doesn't handle the message.
-    // It would be nice to use some API here instead of hard-coding the window class name.
-    return wcscmp(className, L"WebKit2WebViewWindowClass");
-}
-
-void sleep(double seconds)
-{
-    ::Sleep(seconds * 1000);
-}
-
-RetainPtr<CFStringRef> cf(const char* utf8String)
-{
-    return RetainPtr<CFStringRef>(AdoptCF, CFStringCreateWithCString(kCFAllocatorDefault, utf8String, kCFStringEncodingUTF8));
-}
-
-WKStringRef createInjectedBundlePath()
-{
-    RetainPtr<CFURLRef> executableURL(AdoptCF, CFBundleCopyExecutableURL(CFBundleGetMainBundle()));
-    RetainPtr<CFURLRef> executableContainerURL(AdoptCF, CFURLCreateCopyDeletingLastPathComponent(0, executableURL.get()));
-    RetainPtr<CFStringRef> dllFilename(AdoptCF, CFStringCreateWithCStringNoCopy(0, injectedBundleDLL, kCFStringEncodingWindowsLatin1, kCFAllocatorNull));
-    RetainPtr<CFURLRef> bundleURL(AdoptCF, CFURLCreateCopyAppendingPathComponent(0, executableContainerURL.get(), dllFilename.get(), false));
-    RetainPtr<CFStringRef> bundlePath(AdoptCF, CFURLCopyFileSystemPath(bundleURL.get(), kCFURLWindowsPathStyle));
-    return WKStringCreateWithCFString(bundlePath.get());
-}
-
-WKURLRef createURLForResource(const char* resource, const char* extension)
-{
-    RetainPtr<CFURLRef> url(AdoptCF, CFBundleCopyResourceURL(CFBundleGetMainBundle(), cf(resource).get(), cf(extension).get(), 0));
-    return WKURLCreateWithCFURL(url.get());
-}
-
-WKURLRef URLForNonExistentResource()
-{
-    return WKURLCreateWithUTF8CString("file:///does-not-exist.html");
-}
-
-WKRetainPtr<WKStringRef> MIMETypeForWKURLResponse(WKURLResponseRef wkResponse)
-{
-#if USE(CFNETWORK)
-    RetainPtr<CFURLResponseRef> response(AdoptCF, WKURLResponseCopyCFURLResponse(0, wkResponse));
-    return adoptWK(WKStringCreateWithCFString(CFURLResponseGetMIMEType(response.get())));
-#else
-    return 0;
-#endif
-}
-
-bool isKeyDown(WKNativeEventPtr event)
-{
-    return event->message == WM_KEYDOWN;
-}
-
-} // namespace Util
-} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/win/PlatformWebViewWin.cpp b/Tools/TestWebKitAPI/win/PlatformWebViewWin.cpp
deleted file mode 100644
index 2015f26..0000000
--- a/Tools/TestWebKitAPI/win/PlatformWebViewWin.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "PlatformWebView.h"
-
-#include "WindowMessageObserver.h"
-
-namespace TestWebKitAPI {
-
-static const wchar_t* hostWindowClassName = L"org.WebKit.TestWebKitAPI.PlatformWebViewHostWindow";
-static const wchar_t* webViewPointerProperty = L"org.WebKit.TestWebKitAPI.PlatformWebView.InstancePointer";
-
-// These offsets come from rom <http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx>.
-static const size_t repeatCountBitOffset = 0;
-static const size_t scanCodeBitOffset = 16;
-static const size_t contextCodeBitOffset = 29;
-static const size_t previousStateBitOffset = 30;
-static const size_t transitionStateBitOffset = 31;
-
-void PlatformWebView::registerWindowClass()
-{
-    static bool initialized;
-    if (initialized)
-        return;
-    initialized = true;
-
-    WNDCLASSEXW wndClass = {0};
-    wndClass.cbSize = sizeof(wndClass);
-    wndClass.style = CS_HREDRAW | CS_VREDRAW;
-    wndClass.lpfnWndProc = wndProc;
-    wndClass.hCursor = LoadCursor(0, IDC_ARROW);
-    wndClass.lpszClassName = hostWindowClassName;
-
-    ::RegisterClassExW(&wndClass);
-}
-
-PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef)
-    : m_parentWindowMessageObserver(0)
-{
-    registerWindowClass();
-
-    RECT viewRect = {0, 0, 800, 600};
-    m_window = CreateWindowExW(0, hostWindowClassName, L"TestWebKitAPI", WS_OVERLAPPEDWINDOW, viewRect.left, viewRect.top, viewRect.right, viewRect.bottom, 0, 0, 0, this);
-    m_view = WKViewCreate(viewRect, contextRef, pageGroupRef, m_window);
-}
-
-PlatformWebView::~PlatformWebView()
-{
-    ::DestroyWindow(m_window);
-    WKRelease(m_view);
-}
-
-WKPageRef PlatformWebView::page() const
-{
-    return WKViewGetPage(m_view);
-}
-
-void PlatformWebView::resizeTo(unsigned width, unsigned height)
-{
-    ::SetWindowPos(WKViewGetWindow(m_view), 0, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS);
-}
-
-void PlatformWebView::simulateSpacebarKeyPress()
-{
-    HWND window = WKViewGetWindow(m_view);
-
-    // These values match what happens when you press the spacebar in Notepad, as observed by Spy++.
-    ::SendMessageW(window, WM_KEYDOWN, VK_SPACE, (1 << repeatCountBitOffset) | (39 << scanCodeBitOffset));
-    ::SendMessageW(window, WM_CHAR, ' ', (1 << repeatCountBitOffset) | (39 << scanCodeBitOffset));
-    ::SendMessageW(window, WM_KEYUP, VK_SPACE, (1 << repeatCountBitOffset) | (39 << scanCodeBitOffset) | (1 << previousStateBitOffset) | (1 << transitionStateBitOffset));
-}
-
-void PlatformWebView::simulateAKeyDown()
-{
-    HWND window = WKViewGetWindow(m_view);
-    
-    // These values match what happens when you press the 'A' key in Notepad, as observed by Spy++.
-    ::SendMessageW(window, WM_KEYDOWN, 'A', (1 << repeatCountBitOffset) | (30 << scanCodeBitOffset));
-}
-
-void PlatformWebView::simulateAltKeyPress()
-{
-    HWND window = WKViewGetWindow(m_view);
-
-    // These values match what happens when you press the Alt key in Notepad, as observed by Spy++.
-    ::SendMessageW(window, WM_SYSKEYDOWN, VK_MENU, (1 << repeatCountBitOffset) | (38 << scanCodeBitOffset) | (1 << contextCodeBitOffset));
-    ::SendMessageW(window, WM_SYSKEYUP, VK_MENU, (1 << repeatCountBitOffset) | (38 << scanCodeBitOffset) | (1 << previousStateBitOffset) | (1 << transitionStateBitOffset));
-}
-
-void PlatformWebView::simulateRightClick(unsigned x, unsigned y)
-{
-    HWND window = WKViewGetWindow(m_view);
-
-    ::SendMessageW(window, WM_RBUTTONDOWN, 0, MAKELPARAM(x, y));
-    ::SendMessageW(window, WM_RBUTTONUP, 0, MAKELPARAM(x, y));
-}
-
-void PlatformWebView::simulateMouseMove(unsigned x, unsigned y)
-{
-    HWND window = WKViewGetWindow(m_view);
-
-    ::SendMessageW(window, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
-}
-
-LRESULT PlatformWebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
-    PlatformWebView* webView;
-    if (message == WM_CREATE) {
-        CREATESTRUCT* createStruct = reinterpret_cast<CREATESTRUCT*>(lParam);
-        webView = static_cast<PlatformWebView*>(createStruct->lpCreateParams);
-        ::SetPropW(hWnd, webViewPointerProperty, webView);
-    } else
-        webView = reinterpret_cast<PlatformWebView*>(::GetPropW(hWnd, webViewPointerProperty));
-
-    if (webView && webView->m_parentWindowMessageObserver)
-        webView->m_parentWindowMessageObserver->windowReceivedMessage(hWnd, message, wParam, lParam);
-
-    if (message == WM_NCDESTROY)
-        ::RemovePropW(hWnd, webViewPointerProperty);
-
-    return ::DefWindowProcW(hWnd, message, wParam, lParam);
-}
-
-} // namespace TestWebKitAPI
diff --git a/Tools/TestWebKitAPI/win/TestWebKitAPI.sln b/Tools/TestWebKitAPI/win/TestWebKitAPI.sln
deleted file mode 100644
index c2728d3..0000000
--- a/Tools/TestWebKitAPI/win/TestWebKitAPI.sln
+++ /dev/null
@@ -1,66 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestWebKitAPI", "TestWebKitAPI.vcproj", "{3E48AB23-D249-488F-A1C4-43CDF52FBD28}"
-	ProjectSection(ProjectDependencies) = postProject
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86} = {45C45411-7F0E-404D-919A-4EE9BB60BE86}
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestWebKitAPIGenerated", "TestWebKitAPIGenerated.vcproj", "{45C45411-7F0E-404D-919A-4EE9BB60BE86}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestWebKitAPIInjectedBundle", "TestWebKitAPIInjectedBundle.vcproj", "{B0101604-B483-4F8C-9C51-90B46A2B1CD3}"
-	ProjectSection(ProjectDependencies) = postProject
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28} = {3E48AB23-D249-488F-A1C4-43CDF52FBD28}
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug_All|Win32 = Debug_All|Win32
-		Debug_Cairo_CFLite|Win32 = Debug_Cairo_CFLite|Win32
-		Debug|Win32 = Debug|Win32
-		Release_Cairo_CFLite|Win32 = Release_Cairo_CFLite|Win32
-		Production|Win32 = Production|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Debug_All|Win32.ActiveCfg = Debug_All|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Debug_All|Win32.Build.0 = Debug_All|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Debug_Cairo_CFLite|Win32.ActiveCfg = Debug_Cairo_CFLite|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Debug_Cairo_CFLite|Win32.Build.0 = Debug_Cairo_CFLite|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Debug|Win32.ActiveCfg = Debug|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Debug|Win32.Build.0 = Debug|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Release_Cairo_CFLite|Win32.ActiveCfg = Release_Cairo_CFLite|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Release_Cairo_CFLite|Win32.Build.0 = Release_Cairo_CFLite|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Production|Win32.ActiveCfg = Production|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Production|Win32.Build.0 = Production|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Release|Win32.ActiveCfg = Release|Win32
-		{3E48AB23-D249-488F-A1C4-43CDF52FBD28}.Release|Win32.Build.0 = Release|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Debug_All|Win32.ActiveCfg = Debug_All|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Debug_All|Win32.Build.0 = Debug_All|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Debug_Cairo_CFLite|Win32.ActiveCfg = Debug_Cairo_CFLite|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Debug_Cairo_CFLite|Win32.Build.0 = Debug_Cairo_CFLite|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Debug|Win32.ActiveCfg = Debug|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Debug|Win32.Build.0 = Debug|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Release_Cairo_CFLite|Win32.ActiveCfg = Release_Cairo_CFLite|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Release_Cairo_CFLite|Win32.Build.0 = Release_Cairo_CFLite|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Production|Win32.ActiveCfg = Production|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Production|Win32.Build.0 = Production|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Release|Win32.ActiveCfg = Release|Win32
-		{45C45411-7F0E-404D-919A-4EE9BB60BE86}.Release|Win32.Build.0 = Release|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Debug_All|Win32.ActiveCfg = Debug_All|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Debug_All|Win32.Build.0 = Debug_All|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Debug_Cairo_CFLite|Win32.ActiveCfg = Debug_Cairo_CFLite|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Debug_Cairo_CFLite|Win32.Build.0 = Debug_Cairo_CFLite|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Debug|Win32.ActiveCfg = Debug|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Debug|Win32.Build.0 = Debug|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Release_Cairo_CFLite|Win32.ActiveCfg = Release_Cairo_CFLite|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Release_Cairo_CFLite|Win32.Build.0 = Release_Cairo_CFLite|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Production|Win32.ActiveCfg = Production|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Production|Win32.Build.0 = Production|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Release|Win32.ActiveCfg = Release|Win32
-		{B0101604-B483-4F8C-9C51-90B46A2B1CD3}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/Tools/TestWebKitAPI/win/TestWebKitAPI.vcproj b/Tools/TestWebKitAPI/win/TestWebKitAPI.vcproj
index c12f024..66e48f4 100644
--- a/Tools/TestWebKitAPI/win/TestWebKitAPI.vcproj
+++ b/Tools/TestWebKitAPI/win/TestWebKitAPI.vcproj
@@ -397,198 +397,50 @@
 				>
 			</File>
 			<File
-				RelativePath=".\InjectedBundleControllerWin.cpp"
-				>
-			</File>
-			<File
 				RelativePath=".\main.cpp"
 				>
 			</File>
-			<File
-				RelativePath=".\PlatformUtilitiesWin.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\PlatformWebViewWin.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\WindowMessageObserver.h"
-				>
-			</File>
 		</Filter>
 		<Filter
 			Name="Tests"
 			>
 			<Filter
-				Name="WebKit2"
+				Name="WebCore"
 				>
 				<File
-					RelativePath="..\Tests\WebKit2\18-characters.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\AboutBlankLoad.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\CanHandleRequest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\CookieManager.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\DocumentStartUserScriptAlertCrash.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\DownloadDecideDestinationCrash.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\EvaluateJavaScript.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\FailedLoad.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\file-with-anchor.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\Find.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\find.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\ForceRepaint.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\FrameMIMETypeHTML.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\FrameMIMETypePNG.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\HitTestResultNodeHandle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\icon.png"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\InjectedBundleBasic.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\LoadAlternateHTMLStringWithNonDirectoryURL.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\LoadCanceledNoServerRedirectCallback.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\mouse-move-listener.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\MouseMoveAfterCrash.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\PageLoadBasic.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\PageLoadDidChangeLocationWithinPageForFrame.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\PreventEmptyUserAgent.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\PrivateBrowsingPushStateNoHistoryCallback.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\push-state.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\ResponsivenessTimerDoesntFireEarly.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\RestoreSessionStateContainingFormData.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\simple-accelerated-compositing.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\simple-form.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\simple-iframe.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\simple.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\spacebar-scrolling.html"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\SpacebarScrolling.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\UserMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\WebArchive.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\WKPreferences.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\WKString.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\WKStringJSString.cpp"
+					RelativePath="..\Tests\WebCore\LayoutUnit.cpp"
 					>
 				</File>
 				<Filter
 					Name="win"
 					>
 					<File
-						RelativePath="..\Tests\WebKit2\win\AltKeyGeneratesWMSysCommand.cpp"
+						RelativePath="..\Tests\WebCore\win\BitmapImage.cpp"
 						>
-					</File>
-					<File
-						RelativePath="..\Tests\WebKit2\win\DoNotCopyANullCFURLResponse.cpp"
-						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							ExcludedFromBuild="true"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							ExcludedFromBuild="true"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug_All|Win32"
+							ExcludedFromBuild="true"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+							/>
+						</FileConfiguration>
 						<FileConfiguration
 							Name="Debug_Cairo_CFLite|Win32"
 							ExcludedFromBuild="true"
@@ -605,40 +457,20 @@
 								Name="VCCLCompilerTool"
 							/>
 						</FileConfiguration>
-					</File>
-					<File
-						RelativePath="..\Tests\WebKit2\win\HideFindIndicator.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\Tests\WebKit2\win\ResizeViewWhileHidden.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\Tests\WebKit2\win\TranslateMessageGeneratesWMChar.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\Tests\WebKit2\win\WMCloseCallsUIClientClose.cpp"
-						>
+						<FileConfiguration
+							Name="Production|Win32"
+							ExcludedFromBuild="true"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+							/>
+						</FileConfiguration>
 					</File>
 				</Filter>
 			</Filter>
 			<Filter
 				Name="WTF"
 				>
-				<Filter
-						Name="cf"
-						>
-						<File
-								RelativePath="..\Tests\WTF\cf\RetainPtrHashing.cpp"
-								>
-						</File>
-						<File
-								RelativePath="..\Tests\WTF\cf\RetainPtr.cpp"
-								>
-						</File>
-				</Filter>
 				<File
 					RelativePath="..\Tests\WTF\CheckedArithmeticOperations.cpp"
 					>
@@ -664,6 +496,10 @@
 					>
 				</File>
 				<File
+					RelativePath="..\Tests\WTF\StringHasher.cpp"
+					>
+				</File>
+				<File
 					RelativePath="..\Tests\WTF\StringOperators.cpp"
 					>
 				</File>
@@ -683,6 +519,18 @@
 					RelativePath="..\Tests\WTF\VectorReverse.cpp"
 					>
 				</File>
+				<Filter
+					Name="cf"
+					>
+					<File
+						RelativePath="..\Tests\WTF\cf\RetainPtr.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\Tests\WTF\cf\RetainPtrHashing.cpp"
+						>
+					</File>
+				</Filter>
 			</Filter>
 			<Filter
 				Name="WebKit"
@@ -702,26 +550,6 @@
 			>
 		</File>
 		<File
-			RelativePath="..\JavaScriptTest.cpp"
-			>
-		</File>
-		<File
-			RelativePath="..\JavaScriptTest.h"
-			>
-		</File>
-		<File
-			RelativePath="..\PlatformUtilities.cpp"
-			>
-		</File>
-		<File
-			RelativePath="..\PlatformUtilities.h"
-			>
-		</File>
-		<File
-			RelativePath="..\PlatformWebView.h"
-			>
-		</File>
-		<File
 			RelativePath="..\Test.h"
 			>
 		</File>
diff --git a/Tools/TestWebKitAPI/win/TestWebKitAPIGenerated.vcproj b/Tools/TestWebKitAPI/win/TestWebKitAPIGenerated.vcproj
deleted file mode 100644
index 78bbdbf..0000000
--- a/Tools/TestWebKitAPI/win/TestWebKitAPIGenerated.vcproj
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="TestWebKitAPIGenerated"
-	ProjectGUID="{45C45411-7F0E-404D-919A-4EE9BB60BE86}"
-	Keyword="MakeFileProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			ConfigurationType="0"
-			InheritedPropertySheets=".\TestWebKitAPIGeneratedCommon.vsprops"
-			>
-			<Tool
-				Name="VCNMakeTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			ConfigurationType="0"
-			InheritedPropertySheets=".\TestWebKitAPIGeneratedCommon.vsprops"
-			>
-			<Tool
-				Name="VCNMakeTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Debug_All|Win32"
-			ConfigurationType="0"
-			InheritedPropertySheets=".\TestWebKitAPIGeneratedCommon.vsprops"
-			>
-			<Tool
-				Name="VCNMakeTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Production|Win32"
-			ConfigurationType="0"
-			InheritedPropertySheets=".\TestWebKitAPIGeneratedCommon.vsprops"
-			>
-			<Tool
-				Name="VCNMakeTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release_Cairo_CFLite|Win32"
-			ConfigurationType="0"
-			InheritedPropertySheets=".\TestWebKitAPIGeneratedCommon.vsprops"
-			>
-			<Tool
-				Name="VCNMakeTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Debug_Cairo_CFLite|Win32"
-			ConfigurationType="0"
-			InheritedPropertySheets=".\TestWebKitAPIGeneratedCommon.vsprops"
-			>
-			<Tool
-				Name="VCNMakeTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<File
-			RelativePath=".\copy-resources.cmd"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/Tools/TestWebKitAPI/win/TestWebKitAPIGeneratedCommon.vsprops b/Tools/TestWebKitAPI/win/TestWebKitAPIGeneratedCommon.vsprops
deleted file mode 100644
index 00348cb..0000000
--- a/Tools/TestWebKitAPI/win/TestWebKitAPIGeneratedCommon.vsprops
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioPropertySheet
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="TestWebKitAPIGeneratedCommon"
-	InheritedPropertySheets="$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops"
-	>
-	<Tool
-		Name="VCNMakeTool"
-		BuildCommandLine="set CONFIGURATIONBUILDDIR=$(ConfigurationBuildDir)&#x0D;&#x0A;copy-resources.cmd"
-		ReBuildCommandLine="set CONFIGURATIONBUILDDIR=$(ConfigurationBuildDir)&#x0D;&#x0A;copy-resources.cmd rebuild"
-		CleanCommandLine="set CONFIGURATIONBUILDDIR=$(ConfigurationBuildDir)&#x0D;&#x0A;copy-resources.cmd clean"
-	/>
-</VisualStudioPropertySheet>
diff --git a/Tools/TestWebKitAPI/win/TestWebKitAPIInjectedBundle.vcproj b/Tools/TestWebKitAPI/win/TestWebKitAPIInjectedBundle.vcproj
deleted file mode 100644
index c1ed01d..0000000
--- a/Tools/TestWebKitAPI/win/TestWebKitAPIInjectedBundle.vcproj
+++ /dev/null
@@ -1,471 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="TestWebKitAPIInjectedBundle"
-	ProjectGUID="{B0101604-B483-4F8C-9C51-90B46A2B1CD3}"
-	RootNamespace="TestWebKitAPIInjectedBundle"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			ConfigurationType="2"
-			InheritedPropertySheets="..\Configurations\TestWebKitAPIDebug.vsprops;..\Configurations\TestWebKitAPIInjectedBundleCommon.vsprops"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			ConfigurationType="2"
-			InheritedPropertySheets="..\Configurations\TestWebKitAPIRelease.vsprops;..\Configurations\TestWebKitAPIInjectedBundleCommon.vsprops"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Debug_All|Win32"
-			ConfigurationType="2"
-			InheritedPropertySheets="..\Configurations\TestWebKitAPIDebugAll.vsprops;..\Configurations\TestWebKitAPIInjectedBundleCommon.vsprops"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Production|Win32"
-			ConfigurationType="2"
-			InheritedPropertySheets="..\Configurations\TestWebKitAPIRelease.vsprops;..\Configurations\TestWebKitAPIInjectedBundleCommon.vsprops"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Debug_Cairo_CFLite|Win32"
-			ConfigurationType="2"
-			InheritedPropertySheets="..\Configurations\TestWebKitAPIDebugCairoCFLite.vsprops;..\Configurations\TestWebKitAPIInjectedBundleCommon.vsprops"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release_Cairo_CFLite|Win32"
-			ConfigurationType="2"
-			InheritedPropertySheets="..\Configurations\TestWebKitAPIReleaseCairoCFLite.vsprops;..\Configurations\TestWebKitAPIInjectedBundleCommon.vsprops"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="win"
-			>
-			<File
-				RelativePath=".\InjectedBundleControllerWin.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\PlatformUtilitiesWin.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Tests"
-			>
-			<Filter
-				Name="WebKit2"
-				>
-				<File
-					RelativePath="..\Tests\WebKit2\CanHandleRequest_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\DocumentStartUserScriptAlertCrash_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\HitTestResultNodeHandle_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\InjectedBundleBasic_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\LoadCanceledNoServerRedirectCallback_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\MouseMoveAfterCrash_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\ResponsivenessTimerDoesntFireEarly_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\UserMessage_Bundle.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\Tests\WebKit2\WebArchive_Bundle.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<File
-			RelativePath="..\InjectedBundleController.cpp"
-			>
-		</File>
-		<File
-			RelativePath="..\InjectedBundleController.h"
-			>
-		</File>
-		<File
-			RelativePath="..\InjectedBundleMain.cpp"
-			>
-		</File>
-		<File
-			RelativePath="..\InjectedBundleTest.h"
-			>
-		</File>
-		<File
-			RelativePath="..\PlatformUtilities.cpp"
-			>
-		</File>
-		<File
-			RelativePath="..\PlatformUtilities.h"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/Tools/TestWebKitAPI/win/WindowMessageObserver.h b/Tools/TestWebKitAPI/win/WindowMessageObserver.h
deleted file mode 100644
index 3388816..0000000
--- a/Tools/TestWebKitAPI/win/WindowMessageObserver.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WindowMessageObserver_h
-#define WindowMessageObserver_h
-
-namespace TestWebKitAPI {
-
-class WindowMessageObserver {
-public:
-    virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM) = 0;
-
-protected:
-    virtual ~WindowMessageObserver() { }
-};
-
-} // namespace TestWebKitAPI
-
-#endif // WindowMessageObserver_h
diff --git a/Tools/TestWebKitAPI/win/copy-resources.cmd b/Tools/TestWebKitAPI/win/copy-resources.cmd
deleted file mode 100755
index deaf744..0000000
--- a/Tools/TestWebKitAPI/win/copy-resources.cmd
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off
-
-set ResourcesDirectory=%CONFIGURATIONBUILDDIR%\bin\TestWebKitAPI.resources
-
-if "%1" EQU "clean" goto :clean
-if "%1" EQU "rebuild" call :clean
-
-echo Copying resources...
-mkdir 2>NUL "%ResourcesDirectory%"
-for %%f in (
-    ..\Tests\WebKit2\18-characters.html
-    ..\Tests\WebKit2\file-with-anchor.html
-    ..\Tests\WebKit2\find.html
-    ..\Tests\WebKit2\icon.png
-    ..\Tests\WebKit2\mouse-move-listener.html
-    ..\Tests\WebKit2\push-state.html
-    ..\Tests\WebKit2\simple.html
-    ..\Tests\WebKit2\simple-accelerated-compositing.html
-    ..\Tests\WebKit2\simple-form.html
-    ..\Tests\WebKit2\simple-iframe.html
-    ..\Tests\WebKit2\spacebar-scrolling.html
-) do (
-    xcopy /y /d %%f "%ResourcesDirectory%"
-)
-
-goto :EOF
-
-:clean
-
-echo Deleting resources...
-del /s /q "%ResourcesDirectory%"
diff --git a/Tools/TestWebKitAPI/win/main.cpp b/Tools/TestWebKitAPI/win/main.cpp
index 6782c47..9842d4b 100644
--- a/Tools/TestWebKitAPI/win/main.cpp
+++ b/Tools/TestWebKitAPI/win/main.cpp
@@ -25,6 +25,7 @@
 
 #include "config.h"
 #include "TestsController.h"
+#include <windows.h>
 
 int main(int argc, char** argv)
 {
diff --git a/Tools/Tools.pro b/Tools/Tools.pro
index dcc365b..5e2a45d 100644
--- a/Tools/Tools.pro
+++ b/Tools/Tools.pro
@@ -10,7 +10,6 @@
 build?(webkit1) {
     build?(testbrowser): SUBDIRS += QtTestBrowser/QtTestBrowser.pro
     build?(drt): SUBDIRS += DumpRenderTree/qt/DumpRenderTree.pro
-    build?(imagediff): SUBDIRS += DumpRenderTree/qt/ImageDiff.pro
 }
 
 build?(webkit2) {
@@ -21,8 +20,17 @@
         have?(QTQUICK): SUBDIRS += MiniBrowser/qt/MiniBrowser.pro
         SUBDIRS += MiniBrowser/qt/raw/MiniBrowserRaw.pro
     }
+
+    !production_build {
+        # Only tested on Linux so far.
+        linux* {
+            SUBDIRS += TestWebKitAPI
+        }
+    }
 }
 
+build?(imagediff): SUBDIRS += ImageDiff/ImageDiff.pro
+
 build?(test_npapi): SUBDIRS += DumpRenderTree/qt/TestNetscapePlugin/TestNetscapePlugin.pro
 
 OTHER_FILES = \
@@ -34,6 +42,7 @@
     qmake/config.tests/README \
     qmake/config.tests/fontconfig/* \
     qmake/config.tests/gccdepends/* \
+    qmake/config.tests/libexecdir/* \
     qmake/mkspecs/modules/* \
     qmake/mkspecs/features/*.prf \
     qmake/mkspecs/features/*.pri \
diff --git a/Tools/WebKitLauncher/WebKitLauncher.xcodeproj/project.pbxproj b/Tools/WebKitLauncher/WebKitLauncher.xcodeproj/project.pbxproj
index c130f45..4cf2f12 100644
--- a/Tools/WebKitLauncher/WebKitLauncher.xcodeproj/project.pbxproj
+++ b/Tools/WebKitLauncher/WebKitLauncher.xcodeproj/project.pbxproj
@@ -150,10 +150,10 @@
 		29B97317FDCFA39411CA2CEA /* Resources */ = {
 			isa = PBXGroup;
 			children = (
+				5D41141B0A50A9DE00C84CF0 /* VERSION */,
 				8D1107310486CEB800E47090 /* Info.plist */,
 				5D18A1FE103FE255006CA7C7 /* nightly.webkit.org.public.pem */,
 				5D4DF981097F89FB0083D5E5 /* start.html */,
-				5D41141B0A50A9DE00C84CF0 /* VERSION */,
 				5DB70524097B94CD009875EC /* webkit.icns */,
 			);
 			name = Resources;
@@ -263,11 +263,11 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				5D18A1FF103FE255006CA7C7 /* nightly.webkit.org.public.pem in Resources */,
 				5D4DF982097F89FB0083D5E5 /* start.html in Resources */,
 				5D41141C0A50A9DE00C84CF0 /* VERSION in Resources */,
 				5DB70525097B94CD009875EC /* webkit.icns in Resources */,
 				5D650F3A09DB8B410075E9A8 /* WebKitNightlyEnabler.dylib in Resources */,
-				5D18A1FF103FE255006CA7C7 /* nightly.webkit.org.public.pem in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Tools/WebKitTestRunner/CMakeLists.txt b/Tools/WebKitTestRunner/CMakeLists.txt
index 37c500a..b245660 100644
--- a/Tools/WebKitTestRunner/CMakeLists.txt
+++ b/Tools/WebKitTestRunner/CMakeLists.txt
@@ -1,9 +1,9 @@
-SET(WEBKIT_TESTRUNNER_DIR "${TOOLS_DIR}/WebKitTestRunner")
-SET(WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR "${TOOLS_DIR}/WebKitTestRunner/InjectedBundle")
+set(WEBKIT_TESTRUNNER_DIR "${TOOLS_DIR}/WebKitTestRunner")
+set(WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR "${TOOLS_DIR}/WebKitTestRunner/InjectedBundle")
 
-FILE(MAKE_DIRECTORY ${DERIVED_SOURCES_DIR}/InjectedBundle)
+file(MAKE_DIRECTORY ${DERIVED_SOURCES_DIR}/InjectedBundle)
 
-SET(WebKitTestRunner_SOURCES
+set(WebKitTestRunner_SOURCES
     ${WEBKIT_TESTRUNNER_DIR}/CyclicRedundancyCheck.cpp
     ${WEBKIT_TESTRUNNER_DIR}/GeolocationProviderMock.cpp
     ${WEBKIT_TESTRUNNER_DIR}/PixelDumpSupport.cpp
@@ -13,14 +13,14 @@
     ${WEBKIT_TESTRUNNER_DIR}/WorkQueueManager.cpp
 )
 
-SET(WebKitTestRunner_LIBRARIES
+set(WebKitTestRunner_LIBRARIES
     ${JavaScriptCore_LIBRARY_NAME}
     ${WebCore_LIBRARY_NAME}
     ${WebCoreTestSupport_LIBRARY_NAME}
     ${WebKit2_LIBRARY_NAME}
 )
 
-SET(WebKitTestRunner_INCLUDE_DIRECTORIES
+set(WebKitTestRunner_INCLUDE_DIRECTORIES
     ${WEBKIT_TESTRUNNER_DIR}
     ${WEBKIT_TESTRUNNER_DIR}/InjectedBundle
     ${WEBKIT_TESTRUNNER_DIR}/InjectedBundle/Bindings
@@ -40,6 +40,7 @@
     ${WEBKIT2_DIR}/UIProcess/API/C/efl
     ${WEBKIT2_DIR}/UIProcess/API/C/soup
     ${WTF_DIR}
+    ${DERIVED_SOURCES_WEBCORE_DIR}
     ${DERIVED_SOURCES_WEBCORE_DIR}/include
     ${DERIVED_SOURCES_WEBKIT2_DIR}/include
     ${DERIVED_SOURCES_DIR}/InjectedBundle
@@ -48,7 +49,7 @@
     ${LIBSOUP_INCLUDE_DIRS}
 )
 
-SET(WebKitTestRunnerInjectedBundle_SOURCES
+set(WebKitTestRunnerInjectedBundle_SOURCES
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/AccessibilityController.cpp
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/AccessibilityTextMarker.cpp
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/AccessibilityTextMarkerRange.cpp
@@ -64,7 +65,16 @@
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/JSWrapper.cpp
 )
 
-FILE(GLOB WebKitTestRunnerInjectedBundle_IDL_FILES "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/*.idl")
+set(WebKitTestRunnerInjectedBundle_IDL_FILES
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/AccessibilityController.idl"
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/AccessibilityTextMarker.idl"
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/AccessibilityTextMarkerRange.idl"
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/AccessibilityUIElement.idl"
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/EventSendingController.idl"
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/GCController.idl"
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/TestRunner.idl"
+    "${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings/TextInputController.idl"
+)
 
 GENERATE_BINDINGS(WebKitTestRunnerInjectedBundle_SOURCES
     "${WebKitTestRunnerInjectedBundle_IDL_FILES}"
@@ -72,17 +82,17 @@
     "--include=${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/Bindings"
     "${FEATURE_DEFINES_WITH_SPACE_SEPARATOR}"
     ${DERIVED_SOURCES_DIR}/InjectedBundle JS TestRunner
-    )
+    ${WEBCORE_DIR}/bindings/scripts/IDLAttributes.txt)
 
 INCLUDE_IF_EXISTS(${WEBKIT_TESTRUNNER_DIR}/Platform${PORT}.cmake)
 
-INCLUDE_DIRECTORIES(${WebKitTestRunner_INCLUDE_DIRECTORIES})
+include_directories(${WebKitTestRunner_INCLUDE_DIRECTORIES})
 
-ADD_LIBRARY(TestRunnerInjectedBundle SHARED ${WebKitTestRunnerInjectedBundle_SOURCES})
-TARGET_LINK_LIBRARIES(TestRunnerInjectedBundle ${WebKitTestRunner_LIBRARIES})
+add_library(TestRunnerInjectedBundle SHARED ${WebKitTestRunnerInjectedBundle_SOURCES})
+target_link_libraries(TestRunnerInjectedBundle ${WebKitTestRunner_LIBRARIES})
 
-ADD_EXECUTABLE(WebKitTestRunner ${WebKitTestRunner_SOURCES})
-TARGET_LINK_LIBRARIES(WebKitTestRunner ${WebKitTestRunner_LIBRARIES})
+add_executable(WebKitTestRunner ${WebKitTestRunner_SOURCES})
+target_link_libraries(WebKitTestRunner ${WebKitTestRunner_LIBRARIES})
 
-ADD_DEPENDENCIES(${WebKit2_LIBRARY_NAME} ${ForwardingHeadersForWebKitTestRunner_NAME})
-ADD_DEPENDENCIES(${WebKit2_LIBRARY_NAME} ${ForwardingNetworkHeadersForWebKitTestRunner_NAME})
+add_dependencies(${WebKit2_LIBRARY_NAME} ${ForwardingHeadersForWebKitTestRunner_NAME})
+add_dependencies(${WebKit2_LIBRARY_NAME} ${ForwardingNetworkHeadersForWebKitTestRunner_NAME})
diff --git a/Tools/WebKitTestRunner/DerivedSources.make b/Tools/WebKitTestRunner/DerivedSources.make
index 501df59..d3f3308 100644
--- a/Tools/WebKitTestRunner/DerivedSources.make
+++ b/Tools/WebKitTestRunner/DerivedSources.make
@@ -40,7 +40,6 @@
     $(WebCoreScripts)/CodeGenerator.pm \
     $(WebKitTestRunner)/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm \
     $(WebCoreScripts)/IDLParser.pm \
-    $(WebCoreScripts)/IDLStructure.pm \
     $(WebCoreScripts)/generate-bindings.pl \
 #
 
diff --git a/Tools/WebKitTestRunner/GNUmakefile.am b/Tools/WebKitTestRunner/GNUmakefile.am
index a8a2fad..1812569 100644
--- a/Tools/WebKitTestRunner/GNUmakefile.am
+++ b/Tools/WebKitTestRunner/GNUmakefile.am
@@ -94,6 +94,8 @@
 	Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h \
 	Tools/WebKitTestRunner/InjectedBundle/ActivateFonts.h \
+	Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp \
+	Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrappable.h \
 	Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/Bindings/JSWrapper.h \
@@ -101,10 +103,10 @@
 	Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h \
 	Tools/WebKitTestRunner/InjectedBundle/GCController.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/GCController.h \
-	Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityControllerGtk.cpp \
-	Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityUIElementGtk.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleGtk.cpp \
+	Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.cpp \
+	Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.h \
 	Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp \
 	Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h \
@@ -150,7 +152,6 @@
 	Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm \
 	Source/WebCore/bindings/scripts/CodeGenerator.pm \
 	Source/WebCore/bindings/scripts/IDLParser.pm \
-	Source/WebCore/bindings/scripts/IDLStructure.pm \
 	Source/WebCore/bindings/scripts/InFilesParser.pm \
 	Source/WebCore/bindings/scripts/generate-bindings.pl
 
@@ -168,7 +169,6 @@
 	$(srcdir)/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm \
 	$(srcdir)/Source/WebCore/bindings/scripts/CodeGenerator.pm \
 	$(srcdir)/Source/WebCore/bindings/scripts/IDLParser.pm \
-	$(srcdir)/Source/WebCore/bindings/scripts/IDLStructure.pm \
 	$(srcdir)/Source/WebCore/bindings/scripts/InFilesParser.pm \
 	$(srcdir)/Source/WebCore/bindings/scripts/generate-bindings.pl \
 	$(shell ls $(srcdir)/Tools/WebKitTestRunner/InjectedBundle/Bindings/*.idl)
diff --git a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp
index c6f7d75..03ec650 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp
@@ -44,7 +44,7 @@
 }
 
 AccessibilityController::AccessibilityController()
-#if PLATFORM(GTK)
+#if PLATFORM(GTK) || PLATFORM(EFL)
     : m_stateChangeListenerId(0)
     , m_focusEventListenerId(0)
     , m_activeDescendantChangedListenerId(0)
@@ -106,10 +106,13 @@
 #if !PLATFORM(MAC)
 bool AccessibilityController::addNotificationListener(JSValueRef) { return false; }
 bool AccessibilityController::removeNotificationListener() { return false; }
+#endif
+
+#if !PLATFORM(MAC) && !PLATFORM(GTK) && !PLATFORM(EFL)
 PassRefPtr<AccessibilityUIElement> AccessibilityController::accessibleElementById(JSStringRef attribute) { return 0; }
 #endif
 
-#if !PLATFORM(GTK)
+#if !PLATFORM(GTK) && !PLATFORM(EFL) && !PLATFORM(MAC)
 void AccessibilityController::logAccessibilityEvents() { }
 void AccessibilityController::resetToConsistentState() { }
 #endif
diff --git a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h
index f02feac..247de34 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h
@@ -68,7 +68,7 @@
     RetainPtr<NotificationHandler> m_globalNotificationHandler;
 #endif
 
-#if PLATFORM(GTK)
+#if PLATFORM(GTK) || PLATFORM(EFL)
     unsigned m_stateChangeListenerId;
     unsigned m_focusEventListenerId;
     unsigned m_activeDescendantChangedListenerId;
diff --git a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp
index 42e2571..f03fd4f 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp
@@ -52,9 +52,9 @@
 {
     return m_element;            
 }
-    
+
 // Unsupported methods on various platforms. As they're implemented on other platforms this list should be modified.
-#if !PLATFORM(MAC) && !PLATFORM(GTK)
+#if !PLATFORM(MAC) && !PLATFORM(GTK) && !PLATFORM(EFL)
 AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement) { }
 AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement&) { }
 AccessibilityUIElement::~AccessibilityUIElement() { }
@@ -85,7 +85,9 @@
 bool AccessibilityUIElement::boolAttributeValue(JSStringRef) { return false; }
 bool AccessibilityUIElement::isAttributeSupported(JSStringRef) { return false; }
 bool AccessibilityUIElement::isAttributeSettable(JSStringRef) { return false; }
-bool AccessibilityUIElement::isActionSupported(JSStringRef) { return false; }
+bool AccessibilityUIElement::isPressActionSupported() { return false; }
+bool AccessibilityUIElement::isIncrementActionSupported() { return false; }
+bool AccessibilityUIElement::isDecrementActionSupported() { return false; }
 JSRetainPtr<JSStringRef> AccessibilityUIElement::role() { return 0; }
 JSRetainPtr<JSStringRef> AccessibilityUIElement::subrole() { return 0; }
 JSRetainPtr<JSStringRef> AccessibilityUIElement::roleDescription() { return 0; }
@@ -177,7 +179,8 @@
 int AccessibilityUIElement::indexForTextMarker(AccessibilityTextMarker*) { return -1; }
 bool AccessibilityUIElement::isTextMarkerValid(AccessibilityTextMarker*) { return false; }
 PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::textMarkerForIndex(int) { return 0; }
-
+void AccessibilityUIElement::scrollToMakeVisible() { }
+JSRetainPtr<JSStringRef> AccessibilityUIElement::supportedActions() const { return 0; }
 #endif
 
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h
index 551f591..43c4180 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h
@@ -49,7 +49,7 @@
 #include <oleacc.h>
 
 typedef COMPtr<IAccessible> PlatformUIElement;
-#elif PLATFORM(GTK)
+#elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
 #include <atk/atk.h>
 typedef AtkObject* PlatformUIElement;
 #else
@@ -112,7 +112,9 @@
     bool boolAttributeValue(JSStringRef attribute);
     bool isAttributeSupported(JSStringRef attribute);
     bool isAttributeSettable(JSStringRef attribute);
-    bool isActionSupported(JSStringRef action);
+    bool isPressActionSupported();
+    bool isIncrementActionSupported();
+    bool isDecrementActionSupported();
     JSRetainPtr<JSStringRef> role();
     JSRetainPtr<JSStringRef> subrole();
     JSRetainPtr<JSStringRef> roleDescription();
@@ -209,6 +211,8 @@
     PassRefPtr<AccessibilityUIElement> horizontalScrollbar() const;
     PassRefPtr<AccessibilityUIElement> verticalScrollbar() const;
 
+    void scrollToMakeVisible();
+    
     // Text markers.
     PassRefPtr<AccessibilityTextMarkerRange> textMarkerRangeForElement(AccessibilityUIElement*);    
     PassRefPtr<AccessibilityTextMarkerRange> textMarkerRangeForMarkers(AccessibilityTextMarker* startMarker, AccessibilityTextMarker* endMarker);
@@ -225,6 +229,9 @@
     bool isTextMarkerValid(AccessibilityTextMarker*);
     PassRefPtr<AccessibilityTextMarker> textMarkerForIndex(int);
 
+    // Returns an ordered list of supported actions for an element.
+    JSRetainPtr<JSStringRef> supportedActions() const;
+
     // Notifications
     // Function callback should take one argument, the name of the notification.
     bool addNotificationListener(JSValueRef functionCallback);
@@ -245,7 +252,7 @@
     void getDocumentLinks(Vector<RefPtr<AccessibilityUIElement> >&);
 #endif
 
-#if PLATFORM(MAC) || PLATFORM(GTK)
+#if PLATFORM(MAC) || PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
     void getChildren(Vector<RefPtr<AccessibilityUIElement> >&);
     void getChildrenWithRange(Vector<RefPtr<AccessibilityUIElement> >&, unsigned location, unsigned length);
 #endif
diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl b/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl
index 96d8c62..44253e3 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl
+++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl
@@ -60,7 +60,9 @@
     boolean boolAttributeValue(in DOMString attr);
     boolean isAttributeSupported(in DOMString attr);
     boolean isAttributeSettable(in DOMString attr);
-    boolean isActionSupported(in DOMString attr);
+    boolean isPressActionSupported();
+    boolean isIncrementActionSupported();
+    boolean isDecrementActionSupported();
 
     readonly attribute DOMString stringValue;
     readonly attribute int intValue;
@@ -146,6 +148,8 @@
     readonly attribute AccessibilityUIElement horizontalScrollbar;
     readonly attribute AccessibilityUIElement verticalScrollbar;
 
+    void scrollToMakeVisible();
+
     // Text markers.
     AccessibilityTextMarkerRange textMarkerRangeForElement(in AccessibilityUIElement element);    
     AccessibilityTextMarkerRange textMarkerRangeForMarkers(in AccessibilityTextMarker startMarker, in AccessibilityTextMarker endMarker);
@@ -162,6 +166,9 @@
     boolean isTextMarkerValid(in AccessibilityTextMarker marker);
     AccessibilityTextMarker textMarkerForIndex(in int textIndex);
 
+    // Returns an ordered list of supported actions for an element.
+    readonly attribute DOMString supportedActions;
+
     // Notification support.
     boolean addNotificationListener(in object callbackFunction);
     boolean removeNotificationListener();
diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm b/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm
index 4429283..7383946 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm
+++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm
@@ -30,11 +30,10 @@
 
 sub new
 {
-    my ($class, $codeGenerator, $outputDir, $outputHeaderDir, $layerOnTop, $preprocessor, $writeDependencies, $verbose, $idlFilePath) = @_;
+    my ($class, $codeGenerator, $layerOnTop, $preprocessor, $writeDependencies, $verbose, $idlFilePath) = @_;
 
     my $reference = {
         codeGenerator => $codeGenerator,
-        outputDir => $outputDir,
         idlFilePath => $idlFilePath,
     };
 
@@ -42,25 +41,21 @@
     return $reference;
 }
 
-sub GenerateModule
+sub GenerateInterface
 {
 }
 
-sub GenerateInterface
+sub WriteData
 {
-    my ($self, $interface, $defines) = @_;
+    my ($self, $interface, $outputDir) = @_;
 
     foreach my $file ($self->_generateHeaderFile($interface), $self->_generateImplementationFile($interface)) {
-        open(FILE, ">", File::Spec->catfile($$self{outputDir}, $$file{name})) or die "Failed to open $$file{name} for writing: $!";
+        open(FILE, ">", File::Spec->catfile($outputDir, $$file{name})) or die "Failed to open $$file{name} for writing: $!";
         print FILE @{$$file{contents}};
         close(FILE) or die "Failed to close $$file{name} after writing: $!";
     }
 }
 
-sub finish
-{
-}
-
 sub _className
 {
     my ($idlType) = @_;
diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl b/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl
index 52a7a5b..65716f2 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl
+++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl
@@ -29,11 +29,13 @@
     void mouseMoveTo(in long x, in long y);
     void mouseScrollBy(in long x, in long y);
     void continuousMouseScrollBy(in long x, in long y, in [Optional] boolean paged);
+    object contextClick();
     void scheduleAsynchronousClick();
 
     void leapForward(in long milliseconds);
 
     void keyDown(in DOMString key, in object modifierArray, in long location);
+    void scheduleAsynchronousKeyDown(in DOMString key);
 
     // Zoom functions.
     void textZoomIn();
diff --git a/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl b/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
index 6dad1b2..9c642e8 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
+++ b/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
@@ -56,7 +56,6 @@
     void setXSSAuditorEnabled(in boolean value);
     void setAllowUniversalAccessFromFileURLs(in boolean value);
     void setAllowFileAccessFromFileURLs(in boolean value);
-    void setFrameFlatteningEnabled(in boolean value);
     void setPluginsEnabled(in boolean value);
     void setJavaScriptCanAccessClipboard(in boolean value);
     void setPrivateBrowsingEnabled(in boolean value);
@@ -67,23 +66,21 @@
     void removeOriginAccessWhitelistEntry(in DOMString sourceOrigin, in DOMString destinationProtocol, in DOMString destinationHost, in boolean allowDestinationSubdomains);
     void setUserStyleSheetEnabled(in boolean value);
     void setUserStyleSheetLocation(in DOMString location);
-    void setMinimumTimerInterval(in double interval); // Interval specified in seconds.
     void setSpatialNavigationEnabled(in boolean value);
     void setTabKeyCyclesThroughElements(in boolean enabled);
     void setSerializeHTTPLoads();
     void dispatchPendingLoadRequests();
+    void setCacheModel(in int model);
+    void setAsynchronousSpellCheckingEnabled(in boolean value);
 
     // Special DOM functions.
     void clearBackForwardList();
-    object computedStyleIncludingVisitedInfo(in object element);
     void execCommand(in DOMString name, in DOMString argument);
     boolean isCommandEnabled(in DOMString name);
-    DOMString markerTextForListItem(in object element);
     unsigned long windowCount();
 
     // Special DOM variables.
     attribute boolean globalFlag;
-    readonly attribute unsigned long workerThreadCount;
 
     // Repaint testing.
     void testRepaint();
@@ -95,12 +92,6 @@
 
     [PassContext] void setValueForUser(in object element, in DOMString value);
 
-    // Animation testing.
-    int numberOfActiveAnimations();
-    boolean pauseAnimationAtTimeOnElementWithId(in DOMString animationName, in double time, in DOMString elementId);
-    boolean pauseTransitionAtTimeOnElementWithId(in DOMString propertyName, in double time, in DOMString elementId);
-    void suspendAnimations();
-
     // UserContent testing.
     void addUserScript(in DOMString source, in boolean runAtStart, in boolean allFrames);
     void addUserStyleSheet(in DOMString source, in boolean allFrames);
@@ -142,10 +133,6 @@
     void setDefersLoading(in boolean flag);
     void setStopProvisionalFrameLoads();
 
-    // Web intents testing.
-    void sendWebIntentResponse(in DOMString reply);
-    void deliverWebIntent(in DOMString action, in DOMString type, in DOMString data);
-    
     // Focus testing.
     void addChromeInputField(in object callback);
     void removeChromeInputField(in object callback);
@@ -180,6 +167,9 @@
     void setMockGeolocationPosition(in double latitude, in double longitude, in double accuracy, in [Optional=DefaultIsUndefined] object altitude, in [Optional] object altitudeAccuracy, in [Optional] object heading, in [Optional] object speed);
     void setMockGeolocationPositionUnavailableError(in DOMString errorMessage);
 
+    // Audio testing.
+    [PassContext] void setAudioData(in object data);
+
     boolean callShouldCloseOnWebView();
 
     // Work queue.
@@ -190,5 +180,10 @@
     void queueReload();
     void queueLoadingScript(in DOMString script);
     void queueNonLoadingScript(in DOMString script);
+
+    // Authentication
+    void setHandlesAuthenticationChallenges(in boolean value);
+    void setAuthenticationUsername(in DOMString username);
+    void setAuthenticationPassword(in DOMString password);
 };
 
diff --git a/Tools/WebKitTestRunner/InjectedBundle/DerivedSources.pri b/Tools/WebKitTestRunner/InjectedBundle/DerivedSources.pri
index 8a2fa4d..54e4d34 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/DerivedSources.pri
+++ b/Tools/WebKitTestRunner/InjectedBundle/DerivedSources.pri
@@ -21,6 +21,8 @@
     Bindings/TestRunner.idl \
     Bindings/TextInputController.idl \
 
+qtPrepareTool(QMAKE_MOC, moc)
+
 # GENERATOR 1: IDL compiler
 idl.output = JS${QMAKE_FILE_BASE}.cpp
 idl.input = IDL_BINDINGS
@@ -29,7 +31,6 @@
 idl.depends = $${ROOT_WEBKIT_DIR}/Source/WebCore/bindings/scripts/CodeGenerator.pm \
               $$PWD/Bindings/CodeGeneratorTestRunner.pm \
               $${ROOT_WEBKIT_DIR}/Source/WebCore/bindings/scripts/IDLParser.pm \
-              $${ROOT_WEBKIT_DIR}/Source/WebCore/bindings/scripts/IDLStructure.pm \
               $${ROOT_WEBKIT_DIR}/Source/WebCore/bindings/scripts/InFilesParser.pm \
               $${ROOT_WEBKIT_DIR}/Source/WebCore/bindings/scripts/generate-bindings.pl
 GENERATORS += idl
diff --git a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp
index bf6d9bc..7005dd2 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp
@@ -247,14 +247,8 @@
     WKBundlePostMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), mouseUpMessageBody.get());
 }
 
-void EventSendingController::keyDown(JSStringRef key, JSValueRef modifierArray, int location)
+static WKRetainPtr<WKMutableDictionaryRef> createKeyDownMessageBody(JSStringRef key, WKEventModifiers modifiers, int location)
 {
-    WKBundlePageRef page = InjectedBundle::shared().page()->page();
-    WKBundleFrameRef frame = WKBundlePageGetMainFrame(page);
-    JSContextRef context = WKBundleFrameGetJavaScriptContext(frame);
-    WKEventModifiers modifiers = parseModifierArray(context, modifierArray);
-
-    WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender"));
     WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate());
 
     WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage"));
@@ -272,7 +266,28 @@
     WKRetainPtr<WKUInt64Ref> locationRef(AdoptWK, WKUInt64Create(location));
     WKDictionaryAddItem(EventSenderMessageBody.get(), locationKey.get(), locationRef.get());
 
-    WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
+    return EventSenderMessageBody;
+}
+
+void EventSendingController::keyDown(JSStringRef key, JSValueRef modifierArray, int location)
+{
+    WKBundlePageRef page = InjectedBundle::shared().page()->page();
+    WKBundleFrameRef frame = WKBundlePageGetMainFrame(page);
+    JSContextRef context = WKBundleFrameGetJavaScriptContext(frame);
+    WKEventModifiers modifiers = parseModifierArray(context, modifierArray);
+
+    WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender"));
+    WKRetainPtr<WKMutableDictionaryRef> keyDownMessageBody = createKeyDownMessageBody(key, modifiers, location);
+
+    WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), keyDownMessageBody.get(), 0);
+}
+
+void EventSendingController::scheduleAsynchronousKeyDown(JSStringRef key)
+{
+    WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender"));
+    WKRetainPtr<WKMutableDictionaryRef> keyDownMessageBody = createKeyDownMessageBody(key, 0 /* modifiers */, 0 /* location */);
+
+    WKBundlePostMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), keyDownMessageBody.get());
 }
 
 void EventSendingController::mouseScrollBy(int x, int y)
@@ -319,6 +334,37 @@
     WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
 }
 
+JSValueRef EventSendingController::contextClick()
+{
+    WKBundlePageRef page = InjectedBundle::shared().page()->page();
+    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page);
+    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
+#if ENABLE(CONTEXT_MENUS)
+    // Do mouse context click.
+    mouseDown(2, 0);
+    mouseUp(2, 0);
+
+    WKRetainPtr<WKArrayRef> entriesNames = adoptWK(WKBundlePageCopyContextMenuItemTitles(page));
+    JSRetainPtr<JSStringRef> jsPropertyName(Adopt, JSStringCreateWithUTF8CString("title"));
+    size_t entriesSize = WKArrayGetSize(entriesNames.get());
+    OwnArrayPtr<JSValueRef> jsValuesArray = adoptArrayPtr(new JSValueRef[entriesSize]);
+    for (size_t i = 0; i < entriesSize; ++i) {
+        ASSERT(WKGetTypeID(WKArrayGetItemAtIndex(entriesNames.get(), i)) == WKStringGetTypeID());
+
+        WKStringRef wkEntryName = static_cast<WKStringRef>(WKArrayGetItemAtIndex(entriesNames.get(), i));
+        JSObjectRef jsItemObject = JSObjectMake(context, /* JSClassRef */0, /* privData */0);
+        JSRetainPtr<JSStringRef> jsNameCopy(Adopt, WKStringCopyJSString(wkEntryName));
+        JSValueRef jsEntryName = JSValueMakeString(context, jsNameCopy.get());
+        JSObjectSetProperty(context, jsItemObject, jsPropertyName.get(), jsEntryName, kJSPropertyAttributeReadOnly, 0);
+        jsValuesArray[i] = jsItemObject;
+    }
+
+    return JSObjectMakeArray(context, entriesSize, jsValuesArray.get(), 0);
+#else
+    return JSValueMakeUndefined(context);
+#endif
+}
+
 #ifdef USE_WEBPROCESS_EVENT_SIMULATION
 void EventSendingController::updateClickCount(WKEventMouseButton button)
 {
diff --git a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h
index 413b91c..bdacfd3 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h
@@ -52,10 +52,12 @@
     void mouseMoveTo(int x, int y);
     void mouseScrollBy(int x, int y);
     void continuousMouseScrollBy(int x, int y, bool paged);
+    JSValueRef contextClick();
     void leapForward(int milliseconds);
     void scheduleAsynchronousClick();
 
     void keyDown(JSStringRef key, JSValueRef modifierArray, int location);
+    void scheduleAsynchronousKeyDown(JSStringRef key);
 
     // Zoom functions.
     void textZoomIn();
diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp
index 9a5e807..9094a66 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp
@@ -55,6 +55,7 @@
     , m_dumpPixels(false)
     , m_useWaitToDumpWatchdogTimer(true)
     , m_useWorkQueue(false)
+    , m_timeout(0)
 {
 }
 
@@ -86,7 +87,6 @@
 void InjectedBundle::initialize(WKBundleRef bundle, WKTypeRef initializationUserData)
 {
     m_bundle = bundle;
-    m_stringBuilder = WTF::adoptPtr(new WTF::StringBuilder());
 
     WKBundleClient client = {
         kWKBundleClientCurrentVersion,
@@ -103,6 +103,9 @@
 
     activateFonts();
     WKBundleActivateMacFontAscentHack(m_bundle);
+
+    // FIXME: We'd like to start with a clean state for every test, but this function can't be used more than once yet.
+    WKBundleSwitchNetworkLoaderToNewTestingSession(m_bundle);
 }
 
 void InjectedBundle::didCreatePage(WKBundlePageRef page)
@@ -151,6 +154,9 @@
         WKRetainPtr<WKStringRef> useWaitToDumpWatchdogTimerKey(AdoptWK, WKStringCreateWithUTF8CString("UseWaitToDumpWatchdogTimer"));
         m_useWaitToDumpWatchdogTimer = WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(messageBodyDictionary, useWaitToDumpWatchdogTimerKey.get())));
 
+        WKRetainPtr<WKStringRef> timeoutKey(AdoptWK, WKStringCreateWithUTF8CString("Timeout"));
+        m_timeout = (int)WKUInt64GetValue(static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, timeoutKey.get())));
+
         WKRetainPtr<WKStringRef> ackMessageName(AdoptWK, WKStringCreateWithUTF8CString("Ack"));
         WKRetainPtr<WKStringRef> ackMessageBody(AdoptWK, WKStringCreateWithUTF8CString("BeginTest"));
         WKBundlePostMessage(m_bundle, ackMessageName.get(), ackMessageBody.get());
@@ -174,6 +180,8 @@
         resetLocalSettings();
         m_testRunner->removeAllWebNotificationPermissions();
 
+        page()->resetAfterTest();
+
         return;
     }
     if (WKStringIsEqualToUTF8CString(messageName, "CallAddChromeInputFieldCallback")) {
@@ -215,9 +223,7 @@
     WKRetainPtr<WKStringRef> wkKey(AdoptWK, WKStringCreateWithUTF8CString(key));
     WKTypeRef value = WKDictionaryGetItemForKey(dictionary, wkKey.get());
     if (WKGetTypeID(value) != WKBooleanGetTypeID()) {
-        stringBuilder()->appendLiteral("Boolean value for key \"");
-        stringBuilder()->append(key);
-        stringBuilder()->appendLiteral("\" not found in dictionary\n");
+        outputText(makeString("Boolean value for key", key, " not found in dictionary\n"));
         return false;
     }
     return WKBooleanGetValue(static_cast<WKBooleanRef>(value));
@@ -229,7 +235,6 @@
 
     m_pixelResult.clear();
     m_repaintRects.clear();
-    m_stringBuilder->clear();
 
     m_testRunner = TestRunner::create();
     m_gcController = GCController::create();
@@ -242,11 +247,9 @@
     WKBundleSetAllowUniversalAccessFromFileURLs(m_bundle, m_pageGroup, true);
     WKBundleSetJavaScriptCanAccessClipboard(m_bundle, m_pageGroup, true);
     WKBundleSetPrivateBrowsingEnabled(m_bundle, m_pageGroup, false);
-    WKBundleSwitchNetworkLoaderToNewTestingSession(m_bundle);
     WKBundleSetAuthorAndUserStylesEnabled(m_bundle, m_pageGroup, true);
     WKBundleSetFrameFlatteningEnabled(m_bundle, m_pageGroup, false);
     WKBundleSetMinimumLogicalFontSize(m_bundle, m_pageGroup, 9);
-    WKBundleSetMinimumTimerInterval(m_bundle, m_pageGroup, 0.010); // 10 milliseconds (DOMTimer::s_minDefaultTimerInterval)
     WKBundleSetSpatialNavigationEnabled(m_bundle, m_pageGroup, false);
     WKBundleSetAllowFileAccessFromFileURLs(m_bundle, m_pageGroup, true);
     WKBundleSetPluginsEnabled(m_bundle, m_pageGroup, true);
@@ -254,6 +257,8 @@
     WKBundleSetAlwaysAcceptCookies(m_bundle, false);
     WKBundleSetSerialLoadingEnabled(m_bundle, false);
     WKBundleSetShadowDOMEnabled(m_bundle, true);
+    WKBundleSetSeamlessIFramesEnabled(m_bundle, true);
+    WKBundleSetCacheModel(m_bundle, 1 /*CacheModelDocumentBrowser*/);
 
     WKBundleRemoveAllUserContent(m_bundle, m_pageGroup);
 
@@ -264,6 +269,8 @@
     m_testRunner->setAcceptsEditing(true);
     m_testRunner->setTabKeyCyclesThroughElements(true);
 
+    m_testRunner->setCustomTimeout(m_timeout);
+
     page()->prepare();
 
     WKBundleClearAllDatabases(m_bundle);
@@ -289,22 +296,19 @@
     WKRetainPtr<WKStringRef> doneMessageName(AdoptWK, WKStringCreateWithUTF8CString("Done"));
     WKRetainPtr<WKMutableDictionaryRef> doneMessageBody(AdoptWK, WKMutableDictionaryCreate());
 
-    WKRetainPtr<WKStringRef> textOutputKey(AdoptWK, WKStringCreateWithUTF8CString("TextOutput"));
-    WKRetainPtr<WKStringRef> textOutput(AdoptWK, WKStringCreateWithUTF8CString(m_stringBuilder->toString().utf8().data()));
-    WKDictionaryAddItem(doneMessageBody.get(), textOutputKey.get(), textOutput.get());
-    
     WKRetainPtr<WKStringRef> pixelResultKey = adoptWK(WKStringCreateWithUTF8CString("PixelResult"));
     WKDictionaryAddItem(doneMessageBody.get(), pixelResultKey.get(), m_pixelResult.get());
 
     WKRetainPtr<WKStringRef> repaintRectsKey = adoptWK(WKStringCreateWithUTF8CString("RepaintRects"));
     WKDictionaryAddItem(doneMessageBody.get(), repaintRectsKey.get(), m_repaintRects.get());
 
+    WKRetainPtr<WKStringRef> audioResultKey = adoptWK(WKStringCreateWithUTF8CString("AudioResult"));
+    WKDictionaryAddItem(doneMessageBody.get(), audioResultKey.get(), m_audioResult.get());
+
     WKBundlePostMessage(m_bundle, doneMessageName.get(), doneMessageBody.get());
 
     closeOtherPages();
 
-    page()->resetAfterTest();
-
     m_state = Idle;
 }
 
@@ -319,13 +323,24 @@
         WKBundlePageClose(pagesToClose[i]);
 }
 
-void InjectedBundle::dumpBackForwardListsForAllPages()
+void InjectedBundle::dumpBackForwardListsForAllPages(StringBuilder& stringBuilder)
 {
     size_t size = m_pages.size();
     for (size_t i = 0; i < size; ++i)
-        m_pages[i]->dumpBackForwardList();
+        m_pages[i]->dumpBackForwardList(stringBuilder);
 }
-    
+
+void InjectedBundle::outputText(const String& output)
+{
+    if (m_state != Testing)
+        return;
+    if (output.isEmpty())
+        return;
+    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("TextOutput"));
+    WKRetainPtr<WKStringRef> messageBody(AdoptWK, WKStringCreateWithUTF8CString(output.utf8().data()));
+    WKBundlePostMessage(m_bundle, messageName.get(), messageBody.get());
+}
+
 void InjectedBundle::postNewBeforeUnloadReturnValue(bool value)
 {
     WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("BeforeUnloadReturnValue"));
@@ -455,6 +470,22 @@
     WKBundlePostMessage(m_bundle, messageName.get(), messageBody.get());
 }
 
+void InjectedBundle::setVisibilityState(WKPageVisibilityState visibilityState, bool isInitialState)
+{
+    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("SetVisibilityState"));
+    WKRetainPtr<WKMutableDictionaryRef> messageBody(AdoptWK, WKMutableDictionaryCreate());
+
+    WKRetainPtr<WKStringRef> visibilityStateKeyWK(AdoptWK, WKStringCreateWithUTF8CString("visibilityState"));
+    WKRetainPtr<WKUInt64Ref> visibilityStateWK(AdoptWK, WKUInt64Create(visibilityState));
+    WKDictionaryAddItem(messageBody.get(), visibilityStateKeyWK.get(), visibilityStateWK.get());
+
+    WKRetainPtr<WKStringRef> isInitialKeyWK(AdoptWK, WKStringCreateWithUTF8CString("isInitialState"));
+    WKRetainPtr<WKBooleanRef> isInitialWK(AdoptWK, WKBooleanCreate(isInitialState));
+    WKDictionaryAddItem(messageBody.get(), isInitialKeyWK.get(), isInitialWK.get());
+
+    WKBundlePostMessage(m_bundle, messageName.get(), messageBody.get());
+}
+
 bool InjectedBundle::shouldProcessWorkQueue() const
 {
     if (!m_useWorkQueue)
diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h
index 41469ec..170c8ac 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h
@@ -33,16 +33,12 @@
 #include "TextInputController.h"
 #include <WebKit2/WKBase.h>
 #include <WebKit2/WKRetainPtr.h>
+#include <sstream>
+#include <wtf/Forward.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/RefPtr.h>
 #include <wtf/Vector.h>
 
-#include <sstream>
-
-namespace WTF {
-class StringBuilder;
-}
-
 namespace WTR {
 
 class InjectedBundlePage;
@@ -67,10 +63,10 @@
     size_t pageCount() const { return m_pages.size(); }
     void closeOtherPages();
 
-    void dumpBackForwardListsForAllPages();
+    void dumpBackForwardListsForAllPages(StringBuilder&);
 
     void done();
-    WTF::StringBuilder* stringBuilder() { return m_stringBuilder.get(); }
+    void setAudioResult(WKDataRef audioData) { m_audioResult = audioData; }
     void setPixelResult(WKImageRef image) { m_pixelResult = image; }
     void setRepaintRects(WKArrayRef rects) { m_repaintRects = rects; }
 
@@ -82,6 +78,7 @@
     bool shouldDumpPixels() const { return m_dumpPixels; }
     bool useWaitToDumpWatchdogTimer() const { return m_useWaitToDumpWatchdogTimer; }
     
+    void outputText(const String&);
     void postNewBeforeUnloadReturnValue(bool);
     void postAddChromeInputField();
     void postRemoveChromeInputField();
@@ -98,6 +95,9 @@
     // Policy delegate.
     void setCustomPolicyDelegate(bool enabled, bool permissive);
 
+    // Page Visibility.
+    void setVisibilityState(WKPageVisibilityState, bool isInitialState);
+
     // Work queue.
     bool shouldProcessWorkQueue() const;
     void processWorkQueue();
@@ -144,8 +144,6 @@
 
     WKBundleFrameRef m_topLoadingFrame;
 
-    OwnPtr<WTF::StringBuilder> m_stringBuilder;
-    
     enum State {
         Idle,
         Testing,
@@ -156,7 +154,9 @@
     bool m_dumpPixels;
     bool m_useWaitToDumpWatchdogTimer;
     bool m_useWorkQueue;
+    int m_timeout;
 
+    WKRetainPtr<WKDataRef> m_audioResult;
     WKRetainPtr<WKImageRef> m_pixelResult;
     WKRetainPtr<WKArrayRef> m_repaintRects;
 };
diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp
index 0081975..6903be6 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp
@@ -52,14 +52,6 @@
 #include "DumpRenderTreeSupportQt.h"
 #endif
 
-#if ENABLE(WEB_INTENTS)
-#include <WebKit2/WKBundleIntent.h>
-#include <WebKit2/WKBundleIntentRequest.h>
-#endif
-#if ENABLE(WEB_INTENTS_TAG)
-#include <WebKit2/WKIntentServiceInfo.h>
-#endif
-
 using namespace std;
 
 namespace WTR {
@@ -104,7 +96,7 @@
 
     JSValueRef parentNode = propertyValue(context, nodeValue, "parentNode");
 
-    WTF::StringBuilder stringBuilder;
+    StringBuilder stringBuilder;
     stringBuilder.append(toWTFString(nodeName));
 
     if (parentNode && JSValueIsObject(context, parentNode)) {
@@ -153,7 +145,7 @@
     int startOffset = propertyValueInt(context, rangeObject, "startOffset");
     int endOffset = propertyValueInt(context, rangeObject, "endOffset");
 
-    WTF::StringBuilder stringBuilder;
+    StringBuilder stringBuilder;
     stringBuilder.appendLiteral("range from ");
     stringBuilder.appendNumber(startOffset);
     stringBuilder.appendLiteral(" of ");
@@ -189,14 +181,14 @@
     // DumpRenderTree calls -[DOMCSSStyleDeclaration description], which just dumps class name and object address.
     // No existing tests actually hit this code path at the time of this writing, because WebCore doesn't call
     // the editing client if the styling operation source is CommandFromDOM or CommandFromDOMWithUserInterface.
-    WTF::StringBuilder stringBuilder;
+    StringBuilder stringBuilder;
     stringBuilder.appendLiteral("<DOMCSSStyleDeclaration ADDRESS>");
     return stringBuilder.toString();
 }
 
 static WTF::String securityOriginToStr(WKSecurityOriginRef origin)
 {
-    WTF::StringBuilder stringBuilder;
+    StringBuilder stringBuilder;
     stringBuilder.append('{');
     stringBuilder.append(toWTFString(adoptWK(WKSecurityOriginCopyProtocol(origin))));
     stringBuilder.appendLiteral(", ");
@@ -211,7 +203,7 @@
 static WTF::String frameToStr(WKBundleFrameRef frame)
 {
     WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame));
-    WTF::StringBuilder stringBuilder;
+    StringBuilder stringBuilder;
     if (WKBundleFrameIsMainFrame(frame)) {
         if (!WKStringIsEmpty(name.get())) {
             stringBuilder.appendLiteral("main frame \"");
@@ -249,7 +241,7 @@
         return toWTFString(adoptWK(WKURLCopyString(fileUrl)));
 
     String pathString = toWTFString(adoptWK(WKURLCopyPath(fileUrl)));
-    WTF::StringBuilder stringBuilder;
+    StringBuilder stringBuilder;
 
     // Remove the leading path from file urls.
     const size_t indexBaseName = pathString.reverseFind(divider);
@@ -284,12 +276,12 @@
 
 static HashMap<uint64_t, String> assignedUrlsCache;
 
-static inline void dumpResourceURL(uint64_t identifier)
+static inline void dumpResourceURL(uint64_t identifier, StringBuilder& stringBuilder)
 {
     if (assignedUrlsCache.contains(identifier))
-        InjectedBundle::shared().stringBuilder()->append(assignedUrlsCache.get(identifier));
+        stringBuilder.append(assignedUrlsCache.get(identifier));
     else
-        InjectedBundle::shared().stringBuilder()->appendLiteral("<unknown>");
+        stringBuilder.appendLiteral("<unknown>");
 }
 
 InjectedBundlePage::InjectedBundlePage(WKBundlePageRef page)
@@ -327,8 +319,8 @@
         0, // willDestroyGlobalObjectForDOMWindowExtension
         didFinishProgress, // didFinishProgress
         0, // shouldForceUniversalAccessFromLocalURL
-        didReceiveIntentForFrame, // didReceiveIntentForFrame
-        registerIntentServiceForFrame, // registerIntentServiceForFrame
+        0, // didReceiveIntentForFrame
+        0, // registerIntentServiceForFrame
         0, // didLayout
     };
     WKBundlePageSetPageLoaderClient(m_page, &loaderClient);
@@ -376,6 +368,9 @@
         0, /*toolbarsAreVisible*/
         didReachApplicationCacheOriginQuota,
         didExceedDatabaseQuota,
+        0, /*plugInStartLabelTitle*/
+        0, /*plugInStartLabelSubtitle*/
+        0, /*plugInExtraStyleSheet*/
     };
     WKBundlePageSetUIClient(m_page, &uiClient);
 
@@ -392,7 +387,10 @@
         didBeginEditing,
         didEndEditing,
         didChange,
-        didChangeSelection
+        didChangeSelection,
+        0, /* willWriteToPasteboard */
+        0, /* getPasteboardDataForRange */
+        0  /* didWriteToPasteboard */
     };
     WKBundlePageSetEditorClient(m_page, &editorClient);
 
@@ -452,66 +450,76 @@
 // Loader Client Callbacks
 
 // String output must be identical to -[WebFrame _drt_descriptionSuitableForTestResult].
-static void dumpFrameDescriptionSuitableForTestResult(WKBundleFrameRef frame)
+static void dumpFrameDescriptionSuitableForTestResult(WKBundleFrameRef frame, StringBuilder& stringBuilder)
 {
     WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame));
     if (WKBundleFrameIsMainFrame(frame)) {
         if (WKStringIsEmpty(name.get())) {
-            InjectedBundle::shared().stringBuilder()->appendLiteral("main frame");
+            stringBuilder.appendLiteral("main frame");
             return;
         }
 
-        InjectedBundle::shared().stringBuilder()->appendLiteral("main frame \"");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(name));
-        InjectedBundle::shared().stringBuilder()->append('"');
+        stringBuilder.appendLiteral("main frame \"");
+        stringBuilder.append(toWTFString(name));
+        stringBuilder.append('"');
         return;
     }
 
     if (WKStringIsEmpty(name.get())) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("frame (anonymous)");
+        stringBuilder.appendLiteral("frame (anonymous)");
         return;
     }
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("frame \"");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(name));
-    InjectedBundle::shared().stringBuilder()->append('"');
+    stringBuilder.appendLiteral("frame \"");
+    stringBuilder.append(toWTFString(name));
+    stringBuilder.append('"');
 }
 
-static inline void dumpRequestDescriptionSuitableForTestResult(WKURLRequestRef request)
+static void dumpLoadEvent(WKBundleFrameRef frame, const char* eventName)
+{
+    StringBuilder stringBuilder;
+    dumpFrameDescriptionSuitableForTestResult(frame, stringBuilder);
+    stringBuilder.appendLiteral(" - ");
+    stringBuilder.append(eventName);
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
+}
+
+static inline void dumpRequestDescriptionSuitableForTestResult(WKURLRequestRef request, StringBuilder& stringBuilder)
 {
     WKRetainPtr<WKURLRef> url = adoptWK(WKURLRequestCopyURL(request));
     WKRetainPtr<WKURLRef> firstParty = adoptWK(WKURLRequestCopyFirstPartyForCookies(request));
     WKRetainPtr<WKStringRef> httpMethod = adoptWK(WKURLRequestCopyHTTPMethod(request));
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("<NSURLRequest URL ");
-    InjectedBundle::shared().stringBuilder()->append(pathSuitableForTestResult(url.get()));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(", main document URL ");
-    InjectedBundle::shared().stringBuilder()->append(urlSuitableForTestResult(firstParty.get()));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(", http method ");
+    stringBuilder.appendLiteral("<NSURLRequest URL ");
+    stringBuilder.append(pathSuitableForTestResult(url.get()));
+    stringBuilder.appendLiteral(", main document URL ");
+    stringBuilder.append(urlSuitableForTestResult(firstParty.get()));
+    stringBuilder.appendLiteral(", http method ");
 
     if (WKStringIsEmpty(httpMethod.get()))
-        InjectedBundle::shared().stringBuilder()->appendLiteral("(none)");
+        stringBuilder.appendLiteral("(none)");
     else
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(httpMethod));
+        stringBuilder.append(toWTFString(httpMethod));
 
-    InjectedBundle::shared().stringBuilder()->append('>');
+    stringBuilder.append('>');
 }
 
-static inline void dumpResponseDescriptionSuitableForTestResult(WKURLResponseRef response)
+static inline void dumpResponseDescriptionSuitableForTestResult(WKURLResponseRef response, StringBuilder& stringBuilder)
 {
     WKRetainPtr<WKURLRef> url = adoptWK(WKURLResponseCopyURL(response));
     if (!url) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("(null)");
+        stringBuilder.appendLiteral("(null)");
         return;
     }
-    InjectedBundle::shared().stringBuilder()->appendLiteral("<NSURLResponse ");
-    InjectedBundle::shared().stringBuilder()->append(pathSuitableForTestResult(url.get()));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(", http status code ");
-    InjectedBundle::shared().stringBuilder()->appendNumber(WKURLResponseHTTPStatusCode(response));
-    InjectedBundle::shared().stringBuilder()->append('>');
+    stringBuilder.appendLiteral("<NSURLResponse ");
+    stringBuilder.append(pathSuitableForTestResult(url.get()));
+    stringBuilder.appendLiteral(", http status code ");
+    stringBuilder.appendNumber(WKURLResponseHTTPStatusCode(response));
+    stringBuilder.append('>');
 }
 
-static inline void dumpErrorDescriptionSuitableForTestResult(WKErrorRef error)
+static inline void dumpErrorDescriptionSuitableForTestResult(WKErrorRef error, StringBuilder& stringBuilder)
 {
     WKRetainPtr<WKStringRef> errorDomain = adoptWK(WKErrorCopyDomain(error));
     int errorCode = WKErrorGetErrorCode(error);
@@ -525,20 +533,20 @@
     if (WKStringIsEqualToUTF8CString(errorDomain.get(), "WebKitPolicyError"))
         errorDomain = adoptWK(WKStringCreateWithUTF8CString("WebKitErrorDomain"));
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("<NSError domain ");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(errorDomain));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(", code ");
-    InjectedBundle::shared().stringBuilder()->appendNumber(errorCode);
+    stringBuilder.appendLiteral("<NSError domain ");
+    stringBuilder.append(toWTFString(errorDomain));
+    stringBuilder.appendLiteral(", code ");
+    stringBuilder.appendNumber(errorCode);
 
     WKRetainPtr<WKURLRef> url = adoptWK(WKErrorCopyFailingURL(error));
     if (url.get()) {
         WKRetainPtr<WKStringRef> urlString = adoptWK(WKURLCopyString(url.get()));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(", failing URL \"");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(urlString));
-        InjectedBundle::shared().stringBuilder()->append('"');
+        stringBuilder.appendLiteral(", failing URL \"");
+        stringBuilder.append(toWTFString(urlString));
+        stringBuilder.append('"');
     }
 
-    InjectedBundle::shared().stringBuilder()->append('>');
+    stringBuilder.append('>');
 }
 
 void InjectedBundlePage::didStartProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo)
@@ -571,83 +579,6 @@
     static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishProgress();
 }
 
-void InjectedBundlePage::didReceiveIntentForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKBundleIntentRequestRef intentRequest, WKTypeRef* userData, const void* clientInfo)
-{
-#if ENABLE(WEB_INTENTS)
-    static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->m_currentIntentRequest = intentRequest;
-    WKRetainPtr<WKBundleIntentRef> intent(AdoptWK, WKBundleIntentRequestCopyIntent(intentRequest));
-
-    InjectedBundle::shared().stringBuilder()->appendLiteral("Received Web Intent: action=");
-    WKRetainPtr<WKStringRef> wkAction(AdoptWK, WKBundleIntentCopyAction(intent.get()));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(wkAction.get()));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" type=");
-    WKRetainPtr<WKStringRef> wkType(AdoptWK, WKBundleIntentCopyType(intent.get()));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(wkType.get()));
-    InjectedBundle::shared().stringBuilder()->append('\n');
-
-    const size_t numMessagePorts = WKBundleIntentMessagePortCount(intent.get());
-    if (numMessagePorts) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("Have ");
-        InjectedBundle::shared().stringBuilder()->appendNumber(numMessagePorts);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" ports\n");
-    }
-
-    WKRetainPtr<WKURLRef> wkServiceUrl(AdoptWK, WKBundleIntentCopyService(intent.get()));
-    if (wkServiceUrl) {
-        WKRetainPtr<WKStringRef> wkService(AdoptWK, WKURLCopyString(wkServiceUrl.get()));
-        if (wkService && !WKStringIsEmpty(wkService.get())) {
-            InjectedBundle::shared().stringBuilder()->appendLiteral("Explicit intent service: ");
-            InjectedBundle::shared().stringBuilder()->append(toWTFString(wkService.get()));
-            InjectedBundle::shared().stringBuilder()->append('\n');
-        }
-    }
-
-    WKRetainPtr<WKDictionaryRef> wkExtras(AdoptWK, WKBundleIntentCopyExtras(intent.get()));
-    WKRetainPtr<WKArrayRef> wkExtraKeys(AdoptWK, WKDictionaryCopyKeys(wkExtras.get()));
-    const size_t numExtraKeys = WKArrayGetSize(wkExtraKeys.get());
-    for (size_t i = 0; i < numExtraKeys; ++i) {
-        WKStringRef wkKey = static_cast<WKStringRef>(WKArrayGetItemAtIndex(wkExtraKeys.get(), i));
-        WKStringRef wkValue = static_cast<WKStringRef>(WKDictionaryGetItemForKey(wkExtras.get(), wkKey));
-        InjectedBundle::shared().stringBuilder()->appendLiteral("Extras[");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(wkKey));
-        InjectedBundle::shared().stringBuilder()->appendLiteral("] = ");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(wkValue));
-        InjectedBundle::shared().stringBuilder()->append('\n');
-    }
-
-    WKRetainPtr<WKArrayRef> wkSuggestions(AdoptWK, WKBundleIntentCopySuggestions(intent.get()));
-    const size_t numSuggestions = WKArrayGetSize(wkSuggestions.get());
-    for (size_t i = 0; i < numSuggestions; ++i) {
-        WKStringRef wkSuggestion = static_cast<WKStringRef>(WKArrayGetItemAtIndex(wkSuggestions.get(), i));
-        InjectedBundle::shared().stringBuilder()->appendLiteral("Have suggestion ");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(wkSuggestion));
-        InjectedBundle::shared().stringBuilder()->append('\n');
-    }
-#endif
-}
-
-void InjectedBundlePage::registerIntentServiceForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKIntentServiceInfoRef serviceInfo, WKTypeRef* userData, const void* clientInfo)
-{
-#if ENABLE(WEB_INTENTS_TAG)
-    InjectedBundle::shared().stringBuilder()->appendLiteral("Registered Web Intent Service: action=");
-    WKRetainPtr<WKStringRef> wkAction(AdoptWK, WKIntentServiceInfoCopyAction(serviceInfo));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(wkAction.get()));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" type=");
-    WKRetainPtr<WKStringRef> wkType(AdoptWK, WKIntentServiceInfoCopyType(serviceInfo));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(wkType.get()));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" title=");
-    WKRetainPtr<WKStringRef> wkTitle(AdoptWK, WKIntentServiceInfoCopyTitle(serviceInfo));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(wkTitle.get()));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" url=");
-    WKRetainPtr<WKURLRef> wkUrl(AdoptWK, WKIntentServiceInfoCopyHref(serviceInfo));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(adoptWK(WKURLCopyString(wkUrl.get()))));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" disposition=");
-    WKRetainPtr<WKStringRef> wkDisposition(AdoptWK, WKIntentServiceInfoCopyDisposition(serviceInfo));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(wkDisposition.get()));
-    InjectedBundle::shared().stringBuilder()->append('\n');
-#endif
-}
-
 void InjectedBundlePage::didFinishDocumentLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void* clientInfo)
 {
     static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishDocumentLoadForFrame(frame);
@@ -745,19 +676,14 @@
 
     platformDidStartProvisionalLoadForFrame(frame);
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didStartProvisionalLoadForFrame\n");
-    }
+    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
+        dumpLoadEvent(frame, "didStartProvisionalLoadForFrame");
 
     if (!InjectedBundle::shared().topLoadingFrame())
         InjectedBundle::shared().setTopLoadingFrame(frame);
 
-    if (InjectedBundle::shared().testRunner()->shouldStopProvisionalFrameLoads()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - stopping load in didStartProvisionalLoadForFrame callback\n");
-        WKBundleFrameStopLoading(frame);
-    }
+    if (InjectedBundle::shared().testRunner()->shouldStopProvisionalFrameLoads())
+        dumpLoadEvent(frame, "stopping load in didStartProvisionalLoadForFrame callback");
 }
 
 void InjectedBundlePage::didReceiveServerRedirectForProvisionalLoadForFrame(WKBundleFrameRef frame)
@@ -768,8 +694,7 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
         return;
 
-    dumpFrameDescriptionSuitableForTestResult(frame);
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" - didReceiveServerRedirectForProvisionalLoadForFrame\n");
+    dumpLoadEvent(frame, "didReceiveServerRedirectForProvisionalLoadForFrame");
 }
 
 void InjectedBundlePage::didFailProvisionalLoadWithErrorForFrame(WKBundleFrameRef frame, WKErrorRef)
@@ -777,10 +702,8 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didFailProvisionalLoadWithError\n");
-    }
+    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
+        dumpLoadEvent(frame, "didFailProvisionalLoadWithError");
 
     frameDidChangeLocation(frame);
 }
@@ -793,8 +716,7 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
         return;
 
-    dumpFrameDescriptionSuitableForTestResult(frame);
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" - didCommitLoadForFrame\n");
+    dumpLoadEvent(frame, "didCommitLoadForFrame");
 }
 
 void InjectedBundlePage::didFinishProgress()
@@ -805,46 +727,47 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpProgressFinishedCallback())
         return;
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("postProgressFinishedNotification\n");
+    InjectedBundle::shared().outputText("postProgressFinishedNotification\n");
 }
 
 enum FrameNamePolicy { ShouldNotIncludeFrameName, ShouldIncludeFrameName };
 
-static void dumpFrameScrollPosition(WKBundleFrameRef frame, FrameNamePolicy shouldIncludeFrameName = ShouldNotIncludeFrameName)
+static void dumpFrameScrollPosition(WKBundleFrameRef frame, StringBuilder& stringBuilder, FrameNamePolicy shouldIncludeFrameName = ShouldNotIncludeFrameName)
 {
     double x = numericWindowPropertyValue(frame, "pageXOffset");
     double y = numericWindowPropertyValue(frame, "pageYOffset");
-    if (fabs(x) > 0.00000001 || fabs(y) > 0.00000001) {
-        if (shouldIncludeFrameName) {
-            WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame));
-            InjectedBundle::shared().stringBuilder()->appendLiteral("frame '");
-            InjectedBundle::shared().stringBuilder()->append(toWTFString(name));
-            InjectedBundle::shared().stringBuilder()->appendLiteral("' ");
-        }
-        InjectedBundle::shared().stringBuilder()->appendLiteral("scrolled to ");
-        InjectedBundle::shared().stringBuilder()->append(WTF::String::number(x));
-        InjectedBundle::shared().stringBuilder()->append(',');
-        InjectedBundle::shared().stringBuilder()->append(WTF::String::number(y));
-        InjectedBundle::shared().stringBuilder()->append('\n');
+    if (fabs(x) <= 0.00000001 && fabs(y) <= 0.00000001)
+        return;
+
+    if (shouldIncludeFrameName) {
+        WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame));
+        stringBuilder.appendLiteral("frame '");
+        stringBuilder.append(toWTFString(name));
+        stringBuilder.appendLiteral("' ");
     }
+    stringBuilder.appendLiteral("scrolled to ");
+    stringBuilder.append(WTF::String::number(x));
+    stringBuilder.append(',');
+    stringBuilder.append(WTF::String::number(y));
+    stringBuilder.append('\n');
 }
 
-static void dumpDescendantFrameScrollPositions(WKBundleFrameRef frame)
+static void dumpDescendantFrameScrollPositions(WKBundleFrameRef frame, StringBuilder& stringBuilder)
 {
     WKRetainPtr<WKArrayRef> childFrames(AdoptWK, WKBundleFrameCopyChildFrames(frame));
     size_t size = WKArrayGetSize(childFrames.get());
     for (size_t i = 0; i < size; ++i) {
         WKBundleFrameRef subframe = static_cast<WKBundleFrameRef>(WKArrayGetItemAtIndex(childFrames.get(), i));
-        dumpFrameScrollPosition(subframe, ShouldIncludeFrameName);
-        dumpDescendantFrameScrollPositions(subframe);
+        dumpFrameScrollPosition(subframe, stringBuilder, ShouldIncludeFrameName);
+        dumpDescendantFrameScrollPositions(subframe, stringBuilder);
     }
 }
 
-void InjectedBundlePage::dumpAllFrameScrollPositions()
+void InjectedBundlePage::dumpAllFrameScrollPositions(StringBuilder& stringBuilder)
 {
     WKBundleFrameRef frame = WKBundlePageGetMainFrame(m_page);
-    dumpFrameScrollPosition(frame);
-    dumpDescendantFrameScrollPositions(frame);
+    dumpFrameScrollPosition(frame, stringBuilder);
+    dumpDescendantFrameScrollPositions(frame, stringBuilder);
 }
 
 static JSRetainPtr<JSStringRef> toJS(const char* string)
@@ -871,7 +794,7 @@
     return JSValueToBoolean(context, documentElementValue);
 }
 
-static void dumpFrameText(WKBundleFrameRef frame)
+static void dumpFrameText(WKBundleFrameRef frame, StringBuilder& stringBuilder)
 {
     // If the frame doesn't have a document element, its inner text will be an empty string, so
     // we'll end up just appending a single newline below. But DumpRenderTree doesn't append
@@ -880,30 +803,36 @@
         return;
 
     WKRetainPtr<WKStringRef> text(AdoptWK, WKBundleFrameCopyInnerText(frame));
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(text));
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    stringBuilder.append(toWTFString(text));
+    stringBuilder.append('\n');
 }
 
-static void dumpDescendantFramesText(WKBundleFrameRef frame)
+static void dumpDescendantFramesText(WKBundleFrameRef frame, StringBuilder& stringBuilder)
 {
     WKRetainPtr<WKArrayRef> childFrames(AdoptWK, WKBundleFrameCopyChildFrames(frame));
     size_t size = WKArrayGetSize(childFrames.get());
     for (size_t i = 0; i < size; ++i) {
         WKBundleFrameRef subframe = static_cast<WKBundleFrameRef>(WKArrayGetItemAtIndex(childFrames.get(), i));
         WKRetainPtr<WKStringRef> subframeName(AdoptWK, WKBundleFrameCopyName(subframe));
-        InjectedBundle::shared().stringBuilder()->appendLiteral("\n--------\nFrame: '");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(subframeName));
-        InjectedBundle::shared().stringBuilder()->appendLiteral("'\n--------\n");
-        dumpFrameText(subframe);
-        dumpDescendantFramesText(subframe);
+
+        // DumpRenderTree ignores empty frames, so do the same thing here.
+        if (!hasDocumentElement(subframe))
+            continue;
+
+        stringBuilder.appendLiteral("\n--------\nFrame: '");
+        stringBuilder.append(toWTFString(subframeName));
+        stringBuilder.appendLiteral("'\n--------\n");
+
+        dumpFrameText(subframe, stringBuilder);
+        dumpDescendantFramesText(subframe, stringBuilder);
     }
 }
 
-void InjectedBundlePage::dumpAllFramesText()
+void InjectedBundlePage::dumpAllFramesText(StringBuilder& stringBuilder)
 {
     WKBundleFrameRef frame = WKBundlePageGetMainFrame(m_page);
-    dumpFrameText(frame);
-    dumpDescendantFramesText(frame);
+    dumpFrameText(frame, stringBuilder);
+    dumpDescendantFramesText(frame, stringBuilder);
 }
 
 void InjectedBundlePage::dump()
@@ -921,27 +850,31 @@
     if (url.find("dumpAsText/") != WTF::notFound)
         InjectedBundle::shared().testRunner()->dumpAsText(false);
 
+    StringBuilder stringBuilder;
+
     switch (InjectedBundle::shared().testRunner()->whatToDump()) {
     case TestRunner::RenderTree: {
         WKRetainPtr<WKStringRef> text(AdoptWK, WKBundlePageCopyRenderTreeExternalRepresentation(m_page));
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(text));
+        stringBuilder.append(toWTFString(text));
         break;
     }
     case TestRunner::MainFrameText:
-        dumpFrameText(WKBundlePageGetMainFrame(m_page));
+        dumpFrameText(WKBundlePageGetMainFrame(m_page), stringBuilder);
         break;
     case TestRunner::AllFramesText:
-        dumpAllFramesText();
+        dumpAllFramesText(stringBuilder);
+        break;
+    case TestRunner::Audio:
         break;
     }
 
     if (InjectedBundle::shared().testRunner()->shouldDumpAllFrameScrollPositions())
-        dumpAllFrameScrollPositions();
+        dumpAllFrameScrollPositions(stringBuilder);
     else if (InjectedBundle::shared().testRunner()->shouldDumpMainFrameScrollPosition())
-        dumpFrameScrollPosition(WKBundlePageGetMainFrame(m_page));
+        dumpFrameScrollPosition(WKBundlePageGetMainFrame(m_page), stringBuilder);
 
     if (InjectedBundle::shared().testRunner()->shouldDumpBackForwardListsForAllWindows())
-        InjectedBundle::shared().dumpBackForwardListsForAllPages();
+        InjectedBundle::shared().dumpBackForwardListsForAllPages(stringBuilder);
 
     if (InjectedBundle::shared().shouldDumpPixels() && InjectedBundle::shared().testRunner()->shouldDumpPixels()) {
         WKSnapshotOptions options = kWKSnapshotOptionsShareable | kWKSnapshotOptionsInViewCoordinates;
@@ -953,6 +886,7 @@
             InjectedBundle::shared().setRepaintRects(adoptWK(WKBundlePageCopyTrackedRepaintRects(m_page)).get());
     }
 
+    InjectedBundle::shared().outputText(stringBuilder.toString());
     InjectedBundle::shared().done();
 }
 
@@ -961,10 +895,8 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didFinishLoadForFrame\n");
-    }
+    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
+        dumpLoadEvent(frame, "didFinishLoadForFrame");
 
     frameDidChangeLocation(frame, /*shouldDump*/ true);
 }
@@ -974,10 +906,8 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didFailLoadWithError\n");
-    }
+    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
+        dumpLoadEvent(frame, "didFailLoadWithError");
 
     frameDidChangeLocation(frame);
 }
@@ -987,19 +917,21 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
+    StringBuilder stringBuilder;
     if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didReceiveTitle: ");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(title));
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        dumpFrameDescriptionSuitableForTestResult(frame, stringBuilder);
+        stringBuilder.appendLiteral(" - didReceiveTitle: ");
+        stringBuilder.append(toWTFString(title));
+        stringBuilder.append('\n');
     }
 
-    if (!InjectedBundle::shared().testRunner()->shouldDumpTitleChanges())
-        return;
+    if (InjectedBundle::shared().testRunner()->shouldDumpTitleChanges()) {
+        stringBuilder.appendLiteral("TITLE CHANGED: '");
+        stringBuilder.append(toWTFString(title));
+        stringBuilder.appendLiteral("'\n");
+    }
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("TITLE CHANGED: '");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(title));
-    InjectedBundle::shared().stringBuilder()->appendLiteral("'\n");
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didClearWindowForFrame(WKBundleFrameRef frame, WKBundleScriptWorldRef world)
@@ -1037,8 +969,7 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
         return;
 
-    dumpFrameDescriptionSuitableForTestResult(frame);
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" - didCancelClientRedirectForFrame\n");
+    dumpLoadEvent(frame, "didCancelClientRedirectForFrame");
 }
 
 void InjectedBundlePage::willPerformClientRedirectForFrame(WKBundleFrameRef frame, WKURLRef url, double delay, double date)
@@ -1049,10 +980,12 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
         return;
 
-    dumpFrameDescriptionSuitableForTestResult(frame);
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" - willPerformClientRedirectToURL: ");
-    InjectedBundle::shared().stringBuilder()->append(pathSuitableForTestResult(url));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" \n");
+    StringBuilder stringBuilder;
+    dumpFrameDescriptionSuitableForTestResult(frame, stringBuilder);
+    stringBuilder.appendLiteral(" - willPerformClientRedirectToURL: ");
+    stringBuilder.append(pathSuitableForTestResult(url));
+    stringBuilder.appendLiteral(" \n");
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didSameDocumentNavigationForFrame(WKBundleFrameRef frame, WKSameDocumentNavigationType type)
@@ -1064,17 +997,17 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didFinishDocumentLoadForFrame\n");
-    }
+    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
+        dumpLoadEvent(frame, "didFinishDocumentLoadForFrame");
 
     unsigned pendingFrameUnloadEvents = WKBundleFrameGetPendingUnloadCount(frame);
     if (pendingFrameUnloadEvents) {
-        InjectedBundle::shared().stringBuilder()->append(frameToStr(frame));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - has ");
-        InjectedBundle::shared().stringBuilder()->appendNumber(pendingFrameUnloadEvents);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" onunload handler(s)\n");
+        StringBuilder stringBuilder;
+        stringBuilder.append(frameToStr(frame));
+        stringBuilder.appendLiteral(" - has ");
+        stringBuilder.appendNumber(pendingFrameUnloadEvents);
+        stringBuilder.appendLiteral(" onunload handler(s)\n");
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
 }
 
@@ -1083,28 +1016,26 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks()) {
-        dumpFrameDescriptionSuitableForTestResult(frame);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didHandleOnloadEventsForFrame\n");
-    }
+    if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
+        dumpLoadEvent(frame, "didHandleOnloadEventsForFrame");
 }
 
 void InjectedBundlePage::didDisplayInsecureContentForFrame(WKBundleFrameRef frame)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("didDisplayInsecureContent\n");
+        InjectedBundle::shared().outputText("didDisplayInsecureContent\n");
 }
 
 void InjectedBundlePage::didRunInsecureContentForFrame(WKBundleFrameRef frame)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("didRunInsecureContent\n");
+        InjectedBundle::shared().outputText("didRunInsecureContent\n");
 }
 
 void InjectedBundlePage::didDetectXSSForFrame(WKBundleFrameRef frame)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFrameLoadCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("didDetectXSS\n");
+        InjectedBundle::shared().outputText("didDetectXSS\n");
 }
 
 void InjectedBundlePage::didInitiateLoadForResource(WKBundlePageRef, WKBundleFrameRef, uint64_t identifier, WKURLRequestRef request, bool)
@@ -1135,12 +1066,14 @@
 {
     if (InjectedBundle::shared().isTestRunning()
         && InjectedBundle::shared().testRunner()->shouldDumpResourceLoadCallbacks()) {
-        dumpResourceURL(identifier);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - willSendRequest ");
-        dumpRequestDescriptionSuitableForTestResult(request);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" redirectResponse ");
-        dumpResponseDescriptionSuitableForTestResult(response);
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        dumpResourceURL(identifier, stringBuilder);
+        stringBuilder.appendLiteral(" - willSendRequest ");
+        dumpRequestDescriptionSuitableForTestResult(request, stringBuilder);
+        stringBuilder.appendLiteral(" redirectResponse ");
+        dumpResponseDescriptionSuitableForTestResult(response, stringBuilder);
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
 
     if (InjectedBundle::shared().isTestRunning() && InjectedBundle::shared().testRunner()->willSendRequestReturnsNull())
@@ -1148,7 +1081,7 @@
 
     WKRetainPtr<WKURLRef> redirectURL = adoptWK(WKURLResponseCopyURL(response));
     if (InjectedBundle::shared().isTestRunning() && InjectedBundle::shared().testRunner()->willSendRequestReturnsNullOnRedirect() && redirectURL) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("Returning null for this redirect\n");
+        InjectedBundle::shared().outputText("Returning null for this redirect\n");
         return 0;
     }
 
@@ -1172,9 +1105,11 @@
             mainFrameIsExternal = isHTTPOrHTTPSScheme(mainFrameScheme.get()) && !isLocalHost(mainFrameHost.get());
         }
         if (!mainFrameIsExternal) {
-            InjectedBundle::shared().stringBuilder()->appendLiteral("Blocked access to external URL ");
-            InjectedBundle::shared().stringBuilder()->append(toWTFString(urlString));
-            InjectedBundle::shared().stringBuilder()->append('\n');
+            StringBuilder stringBuilder;
+            stringBuilder.appendLiteral("Blocked access to external URL ");
+            stringBuilder.append(toWTFString(urlString));
+            stringBuilder.append('\n');
+            InjectedBundle::shared().outputText(stringBuilder.toString());
             return 0;
         }
     }
@@ -1189,10 +1124,12 @@
         return;
 
     if (InjectedBundle::shared().testRunner()->shouldDumpResourceLoadCallbacks()) {
-        dumpResourceURL(identifier);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" - didReceiveResponse ");
-        dumpResponseDescriptionSuitableForTestResult(response);
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        dumpResourceURL(identifier, stringBuilder);
+        stringBuilder.appendLiteral(" - didReceiveResponse ");
+        dumpResponseDescriptionSuitableForTestResult(response, stringBuilder);
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
 
 
@@ -1203,10 +1140,12 @@
     WKRetainPtr<WKStringRef> urlString = adoptWK(WKURLCopyLastPathComponent(url.get()));
     WKRetainPtr<WKStringRef> mimeTypeString = adoptWK(WKURLResponseCopyMIMEType(response));
 
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(urlString));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" has MIME type ");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(mimeTypeString));
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    StringBuilder stringBuilder;
+    stringBuilder.append(toWTFString(urlString));
+    stringBuilder.appendLiteral(" has MIME type ");
+    stringBuilder.append(toWTFString(mimeTypeString));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didReceiveContentLengthForResource(WKBundlePageRef, WKBundleFrameRef, uint64_t, uint64_t)
@@ -1221,8 +1160,10 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpResourceLoadCallbacks())
         return;
 
-    dumpResourceURL(identifier);
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" - didFinishLoading\n");
+    StringBuilder stringBuilder;
+    dumpResourceURL(identifier, stringBuilder);
+    stringBuilder.appendLiteral(" - didFinishLoading\n");
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didFailLoadForResource(WKBundlePageRef, WKBundleFrameRef, uint64_t identifier, WKErrorRef error)
@@ -1233,11 +1174,13 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpResourceLoadCallbacks())
         return;
 
-    dumpResourceURL(identifier);
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" - didFailLoadingWithError: ");
+    StringBuilder stringBuilder;
+    dumpResourceURL(identifier, stringBuilder);
+    stringBuilder.appendLiteral(" - didFailLoadingWithError: ");
 
-    dumpErrorDescriptionSuitableForTestResult(error);
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    dumpErrorDescriptionSuitableForTestResult(error, stringBuilder);
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 bool InjectedBundlePage::shouldCacheResponse(WKBundlePageRef, WKBundleFrameRef, uint64_t identifier)
@@ -1248,8 +1191,10 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpWillCacheResponse())
         return true;
 
-    InjectedBundle::shared().stringBuilder()->appendNumber(identifier);
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" - willCacheResponse: called\n");
+    StringBuilder stringBuilder;
+    stringBuilder.appendNumber(identifier);
+    stringBuilder.appendLiteral(" - willCacheResponse: called\n");
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 
     // The default behavior is the cache the response.
     return true;
@@ -1289,24 +1234,26 @@
     WKRetainPtr<WKURLRef> url = adoptWK(WKURLRequestCopyURL(request));
     WKRetainPtr<WKStringRef> urlScheme = adoptWK(WKURLCopyScheme(url.get()));
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("Policy delegate: attempt to load ");
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("Policy delegate: attempt to load ");
     if (isLocalFileScheme(urlScheme.get())) {
         WKRetainPtr<WKStringRef> filename = adoptWK(WKURLCopyLastPathComponent(url.get()));
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(filename));
+        stringBuilder.append(toWTFString(filename));
     } else {
         WKRetainPtr<WKStringRef> urlString = adoptWK(WKURLCopyString(url.get()));
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(urlString));
+        stringBuilder.append(toWTFString(urlString));
     }
-    InjectedBundle::shared().stringBuilder()->appendLiteral(" with navigation type \'");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(NavigationTypeToString(WKBundleNavigationActionGetNavigationType(navigationAction))));
-    InjectedBundle::shared().stringBuilder()->appendLiteral("\'");
+    stringBuilder.appendLiteral(" with navigation type \'");
+    stringBuilder.append(toWTFString(NavigationTypeToString(WKBundleNavigationActionGetNavigationType(navigationAction))));
+    stringBuilder.appendLiteral("\'");
     WKBundleHitTestResultRef hitTestResultRef = WKBundleNavigationActionCopyHitTestResult(navigationAction);
     if (hitTestResultRef) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" originating from ");
-        InjectedBundle::shared().stringBuilder()->append(dumpPath(m_page, m_world.get(), WKBundleHitTestResultCopyNodeHandle(hitTestResultRef)));
+        stringBuilder.appendLiteral(" originating from ");
+        stringBuilder.append(dumpPath(m_page, m_world.get(), WKBundleHitTestResultCopyNodeHandle(hitTestResultRef)));
     }
 
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
     InjectedBundle::shared().testRunner()->notifyDone();
 
     if (InjectedBundle::shared().testRunner()->isPolicyDelegatePermissive())
@@ -1322,10 +1269,12 @@
 WKBundlePagePolicyAction InjectedBundlePage::decidePolicyForResponse(WKBundlePageRef page, WKBundleFrameRef, WKURLResponseRef response, WKURLRequestRef, WKTypeRef*)
 {
     if (WKURLResponseIsAttachment(response)) {
+        StringBuilder stringBuilder;
         WKRetainPtr<WKStringRef> filename = adoptWK(WKURLResponseCopySuggestedFilename(response));
-        InjectedBundle::shared().stringBuilder()->appendLiteral("Policy delegate: resource is an attachment, suggested file name \'");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(filename));
-        InjectedBundle::shared().stringBuilder()->appendLiteral("\'\n");
+        stringBuilder.appendLiteral("Policy delegate: resource is an attachment, suggested file name \'");
+        stringBuilder.append(toWTFString(filename));
+        stringBuilder.appendLiteral("\'\n");
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
 
     WKRetainPtr<WKStringRef> mimeType = adoptWK(WKURLResponseCopyMIMEType(response));
@@ -1399,20 +1348,25 @@
         return;
 
     WTF::String messageString = toWTFString(message);
+    size_t nullCharPos = messageString.find(UChar(0));
+    if (nullCharPos != WTF::notFound)
+        messageString.truncate(nullCharPos);
+
     size_t fileProtocolStart = messageString.find("file://");
     if (fileProtocolStart != WTF::notFound)
         // FIXME: The code below does not handle additional text after url nor multiple urls. This matches DumpRenderTree implementation.
         messageString = messageString.substring(0, fileProtocolStart) + lastFileURLPathComponent(messageString.substring(fileProtocolStart));
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("CONSOLE MESSAGE: ");
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("CONSOLE MESSAGE: ");
     if (lineNumber) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("line ");
-        InjectedBundle::shared().stringBuilder()->appendNumber(lineNumber);
-        InjectedBundle::shared().stringBuilder()->appendLiteral(": ");
+        stringBuilder.appendLiteral("line ");
+        stringBuilder.appendNumber(lineNumber);
+        stringBuilder.appendLiteral(": ");
     }
-    InjectedBundle::shared().stringBuilder()->append(messageString);
-    InjectedBundle::shared().stringBuilder()->append('\n');
-
+    stringBuilder.append(messageString);
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::willSetStatusbarText(WKStringRef statusbarText)
@@ -1423,9 +1377,11 @@
     if (!InjectedBundle::shared().testRunner()->shouldDumpStatusCallbacks())
         return;
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("UI DELEGATE STATUS CALLBACK: setStatusText:");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(statusbarText));
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("UI DELEGATE STATUS CALLBACK: setStatusText:");
+    stringBuilder.append(toWTFString(statusbarText));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::willRunJavaScriptAlert(WKStringRef message, WKBundleFrameRef)
@@ -1433,9 +1389,11 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("ALERT: ");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(message));
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("ALERT: ");
+    stringBuilder.append(toWTFString(message));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::willRunJavaScriptConfirm(WKStringRef message, WKBundleFrameRef)
@@ -1443,18 +1401,22 @@
     if (!InjectedBundle::shared().isTestRunning())
         return;
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("CONFIRM: ");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(message));
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("CONFIRM: ");
+    stringBuilder.append(toWTFString(message));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::willRunJavaScriptPrompt(WKStringRef message, WKStringRef defaultValue, WKBundleFrameRef)
 {
-    InjectedBundle::shared().stringBuilder()->appendLiteral("PROMPT: ");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(message));
-    InjectedBundle::shared().stringBuilder()->appendLiteral(", default text: ");
-    InjectedBundle::shared().stringBuilder()->append(toWTFString(defaultValue));
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("PROMPT: ");
+    stringBuilder.append(toWTFString(message));
+    stringBuilder.appendLiteral(", default text: ");
+    stringBuilder.append(toWTFString(defaultValue));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didReachApplicationCacheOriginQuota(WKSecurityOriginRef origin, int64_t totalBytesNeeded)
@@ -1466,11 +1428,13 @@
         // above or below a threshold.
         int64_t truncatedSpaceNeeded = (totalBytesNeeded / 10000) * 10000;
 
-        InjectedBundle::shared().stringBuilder()->appendLiteral("UI DELEGATE APPLICATION CACHE CALLBACK: exceededApplicationCacheOriginQuotaForSecurityOrigin:");
-        InjectedBundle::shared().stringBuilder()->append(securityOriginToStr(origin));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" totalSpaceNeeded:~");
-        InjectedBundle::shared().stringBuilder()->appendNumber(truncatedSpaceNeeded);
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("UI DELEGATE APPLICATION CACHE CALLBACK: exceededApplicationCacheOriginQuotaForSecurityOrigin:");
+        stringBuilder.append(securityOriginToStr(origin));
+        stringBuilder.appendLiteral(" totalSpaceNeeded:~");
+        stringBuilder.appendNumber(truncatedSpaceNeeded);
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
 
     if (InjectedBundle::shared().testRunner()->shouldDisallowIncreaseForApplicationCacheQuota())
@@ -1483,11 +1447,13 @@
 uint64_t InjectedBundlePage::didExceedDatabaseQuota(WKSecurityOriginRef origin, WKStringRef databaseName, WKStringRef databaseDisplayName, uint64_t currentQuotaBytes, uint64_t currentOriginUsageBytes, uint64_t currentDatabaseUsageBytes, uint64_t expectedUsageBytes)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpDatabaseCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:");
-        InjectedBundle::shared().stringBuilder()->append(securityOriginToStr(origin));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" database:");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(databaseName));
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:");
+        stringBuilder.append(securityOriginToStr(origin));
+        stringBuilder.appendLiteral(" database:");
+        stringBuilder.append(toWTFString(databaseName));
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
 
     static const uint64_t defaultQuota = 5 * 1024 * 1024;
@@ -1557,9 +1523,11 @@
         return true;
 
     if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: shouldBeginEditingInDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), range));
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("EDITING DELEGATE: shouldBeginEditingInDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), range));
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
     return InjectedBundle::shared().testRunner()->shouldAllowEditing();
 }
@@ -1570,9 +1538,11 @@
         return true;
 
     if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: shouldEndEditingInDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), range));
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("EDITING DELEGATE: shouldEndEditingInDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), range));
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
     return InjectedBundle::shared().testRunner()->shouldAllowEditing();
 }
@@ -1589,13 +1559,15 @@
     };
 
     if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: shouldInsertNode:");
-        InjectedBundle::shared().stringBuilder()->append(dumpPath(m_page, m_world.get(), node));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" replacingDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), rangeToReplace));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" givenAction:");
-        InjectedBundle::shared().stringBuilder()->append(insertactionstring[action]);
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("EDITING DELEGATE: shouldInsertNode:");
+        stringBuilder.append(dumpPath(m_page, m_world.get(), node));
+        stringBuilder.appendLiteral(" replacingDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), rangeToReplace));
+        stringBuilder.appendLiteral(" givenAction:");
+        stringBuilder.append(insertactionstring[action]);
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
     return InjectedBundle::shared().testRunner()->shouldAllowEditing();
 }
@@ -1612,13 +1584,15 @@
     };
 
     if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: shouldInsertText:");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(text));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" replacingDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), rangeToReplace));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" givenAction:");
-        InjectedBundle::shared().stringBuilder()->append(insertactionstring[action]);
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("EDITING DELEGATE: shouldInsertText:");
+        stringBuilder.append(toWTFString(text));
+        stringBuilder.appendLiteral(" replacingDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), rangeToReplace));
+        stringBuilder.appendLiteral(" givenAction:");
+        stringBuilder.append(insertactionstring[action]);
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
     return InjectedBundle::shared().testRunner()->shouldAllowEditing();
 }
@@ -1629,9 +1603,11 @@
         return true;
 
     if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: shouldDeleteDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), range));
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("EDITING DELEGATE: shouldDeleteDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), range));
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
     return InjectedBundle::shared().testRunner()->shouldAllowEditing();
 }
@@ -1651,15 +1627,17 @@
     };
 
     if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: shouldChangeSelectedDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), fromRange));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" toDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), toRange));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" affinity:");
-        InjectedBundle::shared().stringBuilder()->append(affinitystring[affinity]); 
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" stillSelecting:");
-        InjectedBundle::shared().stringBuilder()->append(boolstring[stillSelecting]); 
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("EDITING DELEGATE: shouldChangeSelectedDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), fromRange));
+        stringBuilder.appendLiteral(" toDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), toRange));
+        stringBuilder.appendLiteral(" affinity:");
+        stringBuilder.append(affinitystring[affinity]); 
+        stringBuilder.appendLiteral(" stillSelecting:");
+        stringBuilder.append(boolstring[stillSelecting]); 
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
     return InjectedBundle::shared().testRunner()->shouldAllowEditing();
 }
@@ -1670,11 +1648,13 @@
         return true;
 
     if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: shouldApplyStyle:");
-        InjectedBundle::shared().stringBuilder()->append(styleDecToStr(style));
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" toElementsInDOMRange:");
-        InjectedBundle::shared().stringBuilder()->append(rangeToStr(m_page, m_world.get(), range));
-        InjectedBundle::shared().stringBuilder()->append('\n');
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("EDITING DELEGATE: shouldApplyStyle:");
+        stringBuilder.append(styleDecToStr(style));
+        stringBuilder.appendLiteral(" toElementsInDOMRange:");
+        stringBuilder.append(rangeToStr(m_page, m_world.get(), range));
+        stringBuilder.append('\n');
+        InjectedBundle::shared().outputText(stringBuilder.toString());
     }
     return InjectedBundle::shared().testRunner()->shouldAllowEditing();
 }
@@ -1683,62 +1663,70 @@
 {
     if (!InjectedBundle::shared().isTestRunning())
         return;
+    if (!InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks())
+        return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: webViewDidBeginEditing:");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(notificationName));
-        InjectedBundle::shared().stringBuilder()->append('\n');
-    }
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("EDITING DELEGATE: webViewDidBeginEditing:");
+    stringBuilder.append(toWTFString(notificationName));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didEndEditing(WKStringRef notificationName)
 {
     if (!InjectedBundle::shared().isTestRunning())
         return;
+    if (!InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks())
+        return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: webViewDidEndEditing:");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(notificationName));
-        InjectedBundle::shared().stringBuilder()->append('\n');
-    }
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("EDITING DELEGATE: webViewDidEndEditing:");
+    stringBuilder.append(toWTFString(notificationName));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didChange(WKStringRef notificationName)
 {
     if (!InjectedBundle::shared().isTestRunning())
         return;
+    if (!InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks())
+        return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: webViewDidChange:");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(notificationName));
-        InjectedBundle::shared().stringBuilder()->append('\n');
-    }
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("EDITING DELEGATE: webViewDidChange:");
+    stringBuilder.append(toWTFString(notificationName));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 void InjectedBundlePage::didChangeSelection(WKStringRef notificationName)
 {
     if (!InjectedBundle::shared().isTestRunning())
         return;
+    if (!InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks())
+        return;
 
-    if (InjectedBundle::shared().testRunner()->shouldDumpEditingCallbacks()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("EDITING DELEGATE: webViewDidChangeSelection:");
-        InjectedBundle::shared().stringBuilder()->append(toWTFString(notificationName));
-        InjectedBundle::shared().stringBuilder()->append('\n');
-    }
+    StringBuilder stringBuilder;
+    stringBuilder.appendLiteral("EDITING DELEGATE: webViewDidChangeSelection:");
+    stringBuilder.append(toWTFString(notificationName));
+    stringBuilder.append('\n');
+    InjectedBundle::shared().outputText(stringBuilder.toString());
 }
 
 #if ENABLE(FULLSCREEN_API)
 bool InjectedBundlePage::supportsFullScreen(WKBundlePageRef pageRef, WKFullScreenKeyboardRequestType requestType)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFullScreenCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("supportsFullScreen() == true\n");
+        InjectedBundle::shared().outputText("supportsFullScreen() == true\n");
     return true;
 }
 
 void InjectedBundlePage::enterFullScreenForElement(WKBundlePageRef pageRef, WKBundleNodeHandleRef elementRef)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFullScreenCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("enterFullScreenForElement()\n");
+        InjectedBundle::shared().outputText("enterFullScreenForElement()\n");
 
     if (!InjectedBundle::shared().testRunner()->hasCustomFullScreenBehavior()) {
         WKBundlePageWillEnterFullScreen(pageRef);
@@ -1749,7 +1737,7 @@
 void InjectedBundlePage::exitFullScreenForElement(WKBundlePageRef pageRef, WKBundleNodeHandleRef elementRef)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFullScreenCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("exitFullScreenForElement()\n");
+        InjectedBundle::shared().outputText("exitFullScreenForElement()\n");
 
     if (!InjectedBundle::shared().testRunner()->hasCustomFullScreenBehavior()) {
         WKBundlePageWillExitFullScreen(pageRef);
@@ -1760,19 +1748,19 @@
 void InjectedBundlePage::beganEnterFullScreen(WKBundlePageRef, WKRect, WKRect)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFullScreenCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("beganEnterFullScreen()\n");
+        InjectedBundle::shared().outputText("beganEnterFullScreen()\n");
 }
 
 void InjectedBundlePage::beganExitFullScreen(WKBundlePageRef, WKRect, WKRect)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFullScreenCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("beganExitFullScreen()\n");
+        InjectedBundle::shared().outputText("beganExitFullScreen()\n");
 }
 
 void InjectedBundlePage::closeFullScreen(WKBundlePageRef pageRef)
 {
     if (InjectedBundle::shared().testRunner()->shouldDumpFullScreenCallbacks())
-        InjectedBundle::shared().stringBuilder()->appendLiteral("closeFullScreen()\n");
+        InjectedBundle::shared().outputText("closeFullScreen()\n");
 
     if (!InjectedBundle::shared().testRunner()->hasCustomFullScreenBehavior()) {
         WKBundlePageWillExitFullScreen(pageRef);
@@ -1786,15 +1774,15 @@
     return toSTD(adoptWK(WKBundleBackForwardListItemCopyTarget(item1))) < toSTD(adoptWK(WKBundleBackForwardListItemCopyTarget(item2)));
 }
 
-static void dumpBackForwardListItem(WKBundleBackForwardListItemRef item, unsigned indent, bool isCurrentItem)
+static void dumpBackForwardListItem(WKBundleBackForwardListItemRef item, unsigned indent, bool isCurrentItem, StringBuilder& stringBuilder)
 {
     unsigned column = 0;
     if (isCurrentItem) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral("curr->");
+        stringBuilder.appendLiteral("curr->");
         column = 6;
     }
     for (unsigned i = column; i < indent; i++)
-        InjectedBundle::shared().stringBuilder()->append(' ');
+        stringBuilder.append(' ');
 
     WTF::String url = toWTFString(adoptWK(WKURLCopyString(adoptWK(WKBundleBackForwardListItemCopyURL(item)).get())));
     if (hasPrefix(url, "file:")) {
@@ -1804,23 +1792,23 @@
             start = 0;
         else
             start += directoryName.length();
-        InjectedBundle::shared().stringBuilder()->appendLiteral("(file test):");
-        InjectedBundle::shared().stringBuilder()->append(url.substring(start));
+        stringBuilder.appendLiteral("(file test):");
+        stringBuilder.append(url.substring(start));
     } else
-        InjectedBundle::shared().stringBuilder()->append(url);
+        stringBuilder.append(url);
 
     WTF::String target = toWTFString(adoptWK(WKBundleBackForwardListItemCopyTarget(item)));
     if (target.length()) {
-        InjectedBundle::shared().stringBuilder()->appendLiteral(" (in frame \"");
-        InjectedBundle::shared().stringBuilder()->append(target);
-        InjectedBundle::shared().stringBuilder()->appendLiteral("\")");
+        stringBuilder.appendLiteral(" (in frame \"");
+        stringBuilder.append(target);
+        stringBuilder.appendLiteral("\")");
     }
 
     // FIXME: Need WKBackForwardListItemIsTargetItem.
     if (WKBundleBackForwardListItemIsTargetItem(item))
-        InjectedBundle::shared().stringBuilder()->appendLiteral("  **nav target**");
+        stringBuilder.appendLiteral("  **nav target**");
 
-    InjectedBundle::shared().stringBuilder()->append('\n');
+    stringBuilder.append('\n');
 
     if (WKRetainPtr<WKArrayRef> kids = adoptWK(WKBundleBackForwardListItemCopyChildren(item))) {
         // Sort to eliminate arbitrary result ordering which defeats reproducible testing.
@@ -1830,13 +1818,13 @@
             sortedKids[i] = static_cast<WKBundleBackForwardListItemRef>(WKArrayGetItemAtIndex(kids.get(), i));
         stable_sort(sortedKids.begin(), sortedKids.end(), compareByTargetName);
         for (size_t i = 0; i < size; ++i)
-            dumpBackForwardListItem(sortedKids[i], indent + 4, false);
+            dumpBackForwardListItem(sortedKids[i], indent + 4, false, stringBuilder);
     }
 }
 
-void InjectedBundlePage::dumpBackForwardList()
+void InjectedBundlePage::dumpBackForwardList(StringBuilder& stringBuilder)
 {
-    InjectedBundle::shared().stringBuilder()->appendLiteral("\n============== Back Forward List ==============\n");
+    stringBuilder.appendLiteral("\n============== Back Forward List ==============\n");
 
     WKBundleBackForwardListRef list = WKBundlePageGetBackForwardList(m_page);
 
@@ -1865,9 +1853,9 @@
     }
 
     for (int i = itemsToPrint.size() - 1; i >= 0; i--)
-        dumpBackForwardListItem(itemsToPrint[i].get(), 8, i == currentItemIndex);
+        dumpBackForwardListItem(itemsToPrint[i].get(), 8, i == currentItemIndex, stringBuilder);
 
-    InjectedBundle::shared().stringBuilder()->appendLiteral("===============================================\n");
+    stringBuilder.appendLiteral("===============================================\n");
 }
 
 #if !PLATFORM(MAC)
diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h
index 7708a6f..317294d 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h
@@ -29,6 +29,7 @@
 #include <WebKit2/WKBundlePage.h>
 #include <WebKit2/WKBundleScriptWorld.h>
 #include <WebKit2/WKRetainPtr.h>
+#include <wtf/text/WTFString.h>
 
 namespace WTR {
 
@@ -39,10 +40,6 @@
 
     WKBundlePageRef page() const { return m_page; }
 
-#if ENABLE(WEB_INTENTS)
-    WKBundleIntentRequestRef currentIntentRequest() const { return m_currentIntentRequest.get(); }
-#endif
-
     void dump();
 
     void stopLoading();
@@ -50,7 +47,7 @@
     void prepare();
     void resetAfterTest();
 
-    void dumpBackForwardList();
+    void dumpBackForwardList(WTF::StringBuilder&);
 
 private:
     // Loader Client
@@ -78,8 +75,6 @@
     static void didFinishLoadForResource(WKBundlePageRef, WKBundleFrameRef, uint64_t identifier, const void*);
     static void didFailLoadForResource(WKBundlePageRef, WKBundleFrameRef, uint64_t identifier, WKErrorRef, const void*);
     static bool shouldCacheResponse(WKBundlePageRef, WKBundleFrameRef, uint64_t identifier, const void*);
-    static void didReceiveIntentForFrame(WKBundlePageRef, WKBundleFrameRef, WKBundleIntentRequestRef, WKTypeRef*, const void*);
-    static void registerIntentServiceForFrame(WKBundlePageRef, WKBundleFrameRef, WKIntentServiceInfoRef, WKTypeRef*, const void*);
 
     void didStartProvisionalLoadForFrame(WKBundleFrameRef);
     void didReceiveServerRedirectForProvisionalLoadForFrame(WKBundleFrameRef);
@@ -169,8 +164,8 @@
     void didChange(WKStringRef notificationName);
     void didChangeSelection(WKStringRef notificationName);
 
-    void dumpAllFramesText();
-    void dumpAllFrameScrollPositions();
+    void dumpAllFramesText(WTF::StringBuilder&);
+    void dumpAllFrameScrollPositions(WTF::StringBuilder&);
 
     void platformDidStartProvisionalLoadForFrame(WKBundleFrameRef);
 
@@ -179,10 +174,6 @@
     WKBundlePageRef m_page;
     WKRetainPtr<WKBundleScriptWorldRef> m_world;
     WKRetainPtr<WKBundleBackForwardListItemRef> m_previousTestBackForwardListItem;
-
-#if ENABLE(WEB_INTENTS)
-    WKRetainPtr<WKBundleIntentRequestRef> m_currentIntentRequest;
-#endif
 };
 
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/InjectedBundle/Target.pri b/Tools/WebKitTestRunner/InjectedBundle/Target.pri
index d7305e3..b009119 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/Target.pri
+++ b/Tools/WebKitTestRunner/InjectedBundle/Target.pri
@@ -48,7 +48,7 @@
 
 DESTDIR = $${ROOT_BUILD_DIR}/lib
 
-QT += widgets webkitwidgets
+QT += widgets webkit
 
 WEBKIT += wtf javascriptcore webcore
 
diff --git a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
index a294da7..2cc8b49 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -32,15 +32,17 @@
 #include "PlatformWebView.h"
 #include "StringFunctions.h"
 #include "TestController.h"
-#include <WebCore/PageVisibilityState.h>
+#include <WebKit2/WKBundle.h>
 #include <WebKit2/WKBundleBackForwardList.h>
 #include <WebKit2/WKBundleFrame.h>
 #include <WebKit2/WKBundleFramePrivate.h>
 #include <WebKit2/WKBundleInspector.h>
 #include <WebKit2/WKBundleNodeHandlePrivate.h>
+#include <WebKit2/WKBundlePage.h>
 #include <WebKit2/WKBundlePagePrivate.h>
 #include <WebKit2/WKBundlePrivate.h>
 #include <WebKit2/WKBundleScriptWorld.h>
+#include <WebKit2/WKData.h>
 #include <WebKit2/WKRetainPtr.h>
 #include <WebKit2/WKSerializedScriptValue.h>
 #include <WebKit2/WebKit2_C.h>
@@ -51,11 +53,6 @@
 #include <wtf/text/CString.h>
 #include <wtf/text/StringBuilder.h>
 
-#if ENABLE(WEB_INTENTS)
-#include <WebKit2/WKBundleIntent.h>
-#include <WebKit2/WKBundleIntentRequest.h>
-#endif
-
 namespace WTR {
 
 const double TestRunner::waitToDumpWatchdogTimerInterval = 30;
@@ -149,9 +146,7 @@
 void TestRunner::waitToDumpWatchdogTimerFired()
 {
     invalidateWaitToDumpWatchdogTimer();
-    const char* message = "FAIL: Timed out waiting for notifyDone to be called\n";
-    InjectedBundle::shared().stringBuilder()->append(message);
-    InjectedBundle::shared().stringBuilder()->append("\n");
+    InjectedBundle::shared().outputText("FAIL: Timed out waiting for notifyDone to be called\n\n");
     InjectedBundle::shared().done();
 }
 
@@ -166,34 +161,9 @@
     m_waitToDump = false;
 }
 
-unsigned TestRunner::numberOfActiveAnimations() const
+void TestRunner::setCustomTimeout(int timeout)
 {
-    // FIXME: Is it OK this works only for the main frame?
-    // FIXME: If this is needed only for the main frame, then why is the function on WKBundleFrame instead of WKBundlePage?
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    return WKBundleFrameGetNumberOfActiveAnimations(mainFrame);
-}
-
-bool TestRunner::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
-{
-    // FIXME: Is it OK this works only for the main frame?
-    // FIXME: If this is needed only for the main frame, then why is the function on WKBundleFrame instead of WKBundlePage?
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    return WKBundleFramePauseAnimationOnElementWithId(mainFrame, toWK(animationName).get(), toWK(elementId).get(), time);
-}
-
-bool TestRunner::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
-{
-    // FIXME: Is it OK this works only for the main frame?
-    // FIXME: If this is needed only for the main frame, then why is the function on WKBundleFrame instead of WKBundlePage?
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    return WKBundleFramePauseTransitionOnElementWithId(mainFrame, toWK(propertyName).get(), toWK(elementId).get(), time);
-}
-
-void TestRunner::suspendAnimations()
-{
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    WKBundleFrameSuspendAnimations(mainFrame);
+    m_timeout = timeout;
 }
 
 void TestRunner::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
@@ -220,31 +190,6 @@
     WKBundleSetShouldTrackVisitedLinks(InjectedBundle::shared().bundle(), true);
 }
 
-JSValueRef TestRunner::computedStyleIncludingVisitedInfo(JSValueRef element)
-{
-    // FIXME: Is it OK this works only for the main frame?
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
-    if (!JSValueIsObject(context, element))
-        return JSValueMakeUndefined(context);
-    JSValueRef value = WKBundleFrameGetComputedStyleIncludingVisitedInfo(mainFrame, const_cast<JSObjectRef>(element));
-    if (!value)
-        return JSValueMakeUndefined(context);
-    return value;
-}
-
-JSRetainPtr<JSStringRef> TestRunner::markerTextForListItem(JSValueRef element)
-{
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
-    if (!element || !JSValueIsObject(context, element))
-        return 0;
-    WKRetainPtr<WKStringRef> text(AdoptWK, WKBundleFrameCopyMarkerText(mainFrame, const_cast<JSObjectRef>(element)));
-    if (WKStringIsEmpty(text.get()))
-        return 0;
-    return toJS(text);
-}
-
 void TestRunner::execCommand(JSStringRef name, JSStringRef argument)
 {
     WKBundlePageExecuteEditingCommand(InjectedBundle::shared().page()->page(), toWK(name).get(), toWK(argument).get());
@@ -380,11 +325,6 @@
     WKBundleSetAllowFileAccessFromFileURLs(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), enabled);
 }
 
-void TestRunner::setFrameFlatteningEnabled(bool enabled)
-{
-    WKBundleSetFrameFlatteningEnabled(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), enabled);
-}
-
 void TestRunner::setPluginsEnabled(bool enabled)
 {
     WKBundleSetPluginsEnabled(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), enabled);
@@ -435,6 +375,13 @@
     WKBundleNodeHandleSetHTMLInputElementValueForUser(nodeHandle.get(), toWK(value).get());
 }
 
+void TestRunner::setAudioData(JSContextRef context, JSValueRef data)
+{
+    WKRetainPtr<WKDataRef> audioData(AdoptWK, WKBundleCreateWKDataFromUInt8Array(InjectedBundle::shared().bundle(), context, data));
+    InjectedBundle::shared().setAudioResult(audioData.get());
+    m_whatToDump = Audio;
+}
+
 unsigned TestRunner::windowCount()
 {
     return InjectedBundle::shared().pageCount();
@@ -539,21 +486,21 @@
 
 void TestRunner::setPageVisibility(JSStringRef state)
 {
-    WebCore::PageVisibilityState visibilityState = WebCore::PageVisibilityStateVisible;
+    WKPageVisibilityState visibilityState = kWKPageVisibilityStateVisible;
 
     if (JSStringIsEqualToUTF8CString(state, "hidden"))
-        visibilityState = WebCore::PageVisibilityStateHidden;
+        visibilityState = kWKPageVisibilityStateHidden;
     else if (JSStringIsEqualToUTF8CString(state, "prerender"))
-        visibilityState = WebCore::PageVisibilityStatePrerender;
+        visibilityState = kWKPageVisibilityStatePrerender;
     else if (JSStringIsEqualToUTF8CString(state, "preview"))
-        visibilityState = WebCore::PageVisibilityStatePreview;
+        visibilityState = kWKPageVisibilityStatePreview;
 
-    WKBundleSetPageVisibilityState(InjectedBundle::shared().bundle(), InjectedBundle::shared().page()->page(), visibilityState, /* isInitialState */ false);
+    InjectedBundle::shared().setVisibilityState(visibilityState, false);
 }
 
 void TestRunner::resetPageVisibility()
 {
-    WKBundleSetPageVisibilityState(InjectedBundle::shared().bundle(), InjectedBundle::shared().page()->page(), WebCore::PageVisibilityStateVisible, /* isInitialState */ true);
+    InjectedBundle::shared().setVisibilityState(kWKPageVisibilityStateVisible, true);
 }
 
 typedef WTF::HashMap<unsigned, JSValueRef> CallbackMap;
@@ -592,11 +539,6 @@
     JSValueUnprotect(context, callback);
 }
 
-unsigned TestRunner::workerThreadCount()
-{
-    return WKBundleGetWorkerThreadCount(InjectedBundle::shared().bundle());
-}
-
 void TestRunner::addChromeInputField(JSValueRef callback)
 {
     cacheTestRunnerCallback(AddChromeInputFieldCallbackID, callback);
@@ -657,52 +599,6 @@
     WKBundleOverrideBoolPreferenceForTestRunner(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), toWK(preference).get(), toBool(value));
 }
 
-void TestRunner::sendWebIntentResponse(JSStringRef reply)
-{
-#if ENABLE(WEB_INTENTS)
-    WKRetainPtr<WKBundleIntentRequestRef> currentRequest = InjectedBundle::shared().page()->currentIntentRequest();
-    if (!currentRequest)
-        return;
-
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
-
-    if (reply) {
-        WKRetainPtr<WKSerializedScriptValueRef> serializedData(AdoptWK, WKSerializedScriptValueCreate(context, JSValueMakeString(context, reply), 0));
-        WKBundleIntentRequestPostResult(currentRequest.get(), serializedData.get());
-    } else {
-        JSRetainPtr<JSStringRef> errorReply(JSStringCreateWithUTF8CString("ERROR"));
-        WKRetainPtr<WKSerializedScriptValueRef> serializedData(AdoptWK, WKSerializedScriptValueCreate(context, JSValueMakeString(context, errorReply.get()), 0));
-        WKBundleIntentRequestPostFailure(currentRequest.get(), serializedData.get());
-    }
-#endif
-}
-
-void TestRunner::deliverWebIntent(JSStringRef action, JSStringRef type, JSStringRef data)
-{
-#if ENABLE(WEB_INTENTS)
-    WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
-    JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
-
-    WKRetainPtr<WKStringRef> actionWK = toWK(action);
-    WKRetainPtr<WKStringRef> typeWK = toWK(type);
-    WKRetainPtr<WKSerializedScriptValueRef> dataWK(AdoptWK, WKSerializedScriptValueCreate(context, JSValueMakeString(context, data), 0));
-
-    WKRetainPtr<WKMutableDictionaryRef> intentInitDict(AdoptWK, WKMutableDictionaryCreate());
-    WKRetainPtr<WKStringRef> actionKey(AdoptWK, WKStringCreateWithUTF8CString("action"));
-    WKDictionaryAddItem(intentInitDict.get(), actionKey.get(), actionWK.get());
-
-    WKRetainPtr<WKStringRef> typeKey(AdoptWK, WKStringCreateWithUTF8CString("type"));
-    WKDictionaryAddItem(intentInitDict.get(), typeKey.get(), typeWK.get());
-
-    WKRetainPtr<WKStringRef> dataKey(AdoptWK, WKStringCreateWithUTF8CString("data"));
-    WKDictionaryAddItem(intentInitDict.get(), dataKey.get(), dataWK.get());
-
-    WKRetainPtr<WKBundleIntentRef> wkIntent(AdoptWK, WKBundleIntentCreate(intentInitDict.get()));
-    WKBundlePageDeliverIntentToFrame(InjectedBundle::shared().page()->page(), mainFrame, wkIntent.get());
-#endif
-}
-
 void TestRunner::setAlwaysAcceptCookies(bool accept)
 {
     WKBundleSetAlwaysAcceptCookies(InjectedBundle::shared().bundle(), accept);
@@ -730,11 +626,6 @@
         setUserStyleSheetEnabled(true);
 }
 
-void TestRunner::setMinimumTimerInterval(double seconds)
-{
-    WKBundleSetMinimumTimerInterval(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), seconds);
-}
-
 void TestRunner::setSpatialNavigationEnabled(bool enabled)
 {
     WKBundleSetSpatialNavigationEnabled(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), enabled);
@@ -755,6 +646,16 @@
     WKBundleDispatchPendingLoadRequests(InjectedBundle::shared().bundle());
 }
 
+void TestRunner::setCacheModel(int model)
+{
+    WKBundleSetCacheModel(InjectedBundle::shared().bundle(), model);
+}
+
+void TestRunner::setAsynchronousSpellCheckingEnabled(bool enabled)
+{
+    WKBundleSetAsynchronousSpellCheckingEnabled(InjectedBundle::shared().bundle(), InjectedBundle::shared().pageGroup(), enabled);
+}
+
 void TestRunner::grantWebNotificationPermission(JSStringRef origin)
 {
     WKRetainPtr<WKStringRef> originWK = toWK(origin);
@@ -879,4 +780,25 @@
     InjectedBundle::shared().queueNonLoadingScript(scriptWK.get());
 }
 
+void TestRunner::setHandlesAuthenticationChallenges(bool handlesAuthenticationChallenges)
+{
+    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("SetHandlesAuthenticationChallenge"));
+    WKRetainPtr<WKBooleanRef> messageBody(AdoptWK, WKBooleanCreate(handlesAuthenticationChallenges));
+    WKBundlePostMessage(InjectedBundle::shared().bundle(), messageName.get(), messageBody.get());
+}
+
+void TestRunner::setAuthenticationUsername(JSStringRef username)
+{
+    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("SetAuthenticationUsername"));
+    WKRetainPtr<WKStringRef> messageBody(AdoptWK, WKStringCreateWithJSString(username));
+    WKBundlePostMessage(InjectedBundle::shared().bundle(), messageName.get(), messageBody.get());
+}
+
+void TestRunner::setAuthenticationPassword(JSStringRef password)
+{
+    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("SetAuthenticationPassword"));
+    WKRetainPtr<WKStringRef> messageBody(AdoptWK, WKStringCreateWithJSString(password));
+    WKBundlePostMessage(InjectedBundle::shared().bundle(), messageName.get(), messageBody.get());
+}
+
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
index 48b922c..f249ae6 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
@@ -45,7 +45,11 @@
 #elif PLATFORM(GTK)
 typedef unsigned int PlatformTimerRef;
 #elif PLATFORM(EFL)
+#if USE(EO)
+typedef struct _Eo Ecore_Timer;
+#else
 typedef struct _Ecore_Timer Ecore_Timer;
+#endif
 typedef Ecore_Timer* PlatformTimerRef;
 #endif
 
@@ -96,7 +100,6 @@
     void setXSSAuditorEnabled(bool);
     void setAllowUniversalAccessFromFileURLs(bool);
     void setAllowFileAccessFromFileURLs(bool);
-    void setFrameFlatteningEnabled(bool);
     void setPluginsEnabled(bool);
     void setJavaScriptCanAccessClipboard(bool);
     void setPrivateBrowsingEnabled(bool);
@@ -107,30 +110,23 @@
     void removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains);
     void setUserStyleSheetEnabled(bool);
     void setUserStyleSheetLocation(JSStringRef);
-    void setMinimumTimerInterval(double seconds); // Interval specified in seconds.
     void setSpatialNavigationEnabled(bool);
     void setTabKeyCyclesThroughElements(bool);
     void setSerializeHTTPLoads();
     void dispatchPendingLoadRequests();
+    void setCacheModel(int);
+    void setAsynchronousSpellCheckingEnabled(bool);
 
     // Special DOM functions.
-    JSValueRef computedStyleIncludingVisitedInfo(JSValueRef element);
     void clearBackForwardList();
     void execCommand(JSStringRef name, JSStringRef argument);
     bool isCommandEnabled(JSStringRef name);
-    JSRetainPtr<JSStringRef> markerTextForListItem(JSValueRef element);
     unsigned windowCount();
 
     // Repaint testing.
     void testRepaint() { m_testRepaint = true; }
     void repaintSweepHorizontally() { m_testRepaintSweepHorizontally = true; }
     void display();
-
-    // Animation testing.
-    unsigned numberOfActiveAnimations() const;
-    bool pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId);
-    bool pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId);
-    void suspendAnimations();
     
     // UserContent testing.
     void addUserScript(JSStringRef source, bool runAtStart, bool allFrames);
@@ -157,9 +153,17 @@
     // Printing
     bool isPageBoxVisible(int pageIndex);
 
+    // Authentication
+    void setHandlesAuthenticationChallenges(bool);
+    void setAuthenticationUsername(JSStringRef);
+    void setAuthenticationPassword(JSStringRef);
+
     void setValueForUser(JSContextRef, JSValueRef element, JSStringRef value);
 
-    enum WhatToDump { RenderTree, MainFrameText, AllFramesText };
+    // Audio testing.
+    void setAudioData(JSContextRef, JSValueRef data);
+
+    enum WhatToDump { RenderTree, MainFrameText, AllFramesText, Audio };
     WhatToDump whatToDump() const { return m_whatToDump; }
 
     bool shouldDumpAllFrameScrollPositions() const { return m_shouldDumpAllFrameScrollPositions; }
@@ -216,8 +220,6 @@
     bool globalFlag() const { return m_globalFlag; }
     void setGlobalFlag(bool value) { m_globalFlag = value; }
 
-    unsigned workerThreadCount();
-    
     void addChromeInputField(JSValueRef);
     void removeChromeInputField(JSValueRef);
     void focusWebView(JSValueRef);
@@ -232,10 +234,6 @@
 
     void overridePreference(JSStringRef preference, JSStringRef value);
 
-    // Web intents testing.
-    void sendWebIntentResponse(JSStringRef reply);
-    void deliverWebIntent(JSStringRef action, JSStringRef type, JSStringRef data);
-
     // Cookies testing
     void setAlwaysAcceptCookies(bool);
 
@@ -261,6 +259,8 @@
 
     bool callShouldCloseOnWebView();
 
+    void setCustomTimeout(int duration);
+
     // Work queue.
     void queueBackNavigation(unsigned howFarBackward);
     void queueForwardNavigation(unsigned howFarForward);
@@ -313,6 +313,8 @@
     bool m_globalFlag;
     bool m_customFullScreenBehavior;
 
+    int m_timeout;
+
     bool m_userStyleSheetEnabled;
     WKRetainPtr<WKStringRef> m_userStyleSheetLocation;
 
diff --git a/Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityControllerGtk.cpp b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp
similarity index 71%
rename from Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityControllerGtk.cpp
rename to Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp
index 489c9a5..458472b 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityControllerGtk.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp
@@ -29,6 +29,9 @@
 #include "AccessibilityController.h"
 
 #include "InjectedBundle.h"
+#include "InjectedBundlePage.h"
+
+#include <WebKit2/WKBundlePagePrivate.h>
 #include <atk/atk.h>
 #include <cstdio>
 #include <wtf/gobject/GOwnPtr.h>
@@ -55,7 +58,7 @@
 
     GOwnPtr<gchar> signalNameAndValue(signalValue ? g_strdup_printf("%s = %s", signalName, signalValue) : g_strdup(signalName));
     GOwnPtr<gchar> accessibilityEventString(g_strdup_printf("Accessibility object emitted \"%s\" / Name: \"%s\" / Role: %d\n", signalNameAndValue.get(), objectName, objectRole));
-    InjectedBundle::shared().stringBuilder()->append(accessibilityEventString.get());
+    InjectedBundle::shared().outputText(String::fromUTF8(accessibilityEventString.get()));
 }
 
 static gboolean axObjectEventListener(GSignalInvocationHint *signalHint, guint numParamValues, const GValue *paramValues, gpointer data)
@@ -68,25 +71,25 @@
     if (!accessible || !ATK_IS_OBJECT(accessible))
         return TRUE;
 
-    GSignalQuery signal_query;
+    GSignalQuery signalQuery;
     GOwnPtr<gchar> signalName;
     GOwnPtr<gchar> signalValue;
 
-    g_signal_query(signalHint->signal_id, &signal_query);
+    g_signal_query(signalHint->signal_id, &signalQuery);
 
-    if (!g_strcmp0(signal_query.signal_name, "state-change")) {
+    if (!g_strcmp0(signalQuery.signal_name, "state-change")) {
         signalName.set(g_strdup_printf("state-change:%s", g_value_get_string(&paramValues[1])));
         signalValue.set(g_strdup_printf("%d", g_value_get_boolean(&paramValues[2])));
-    } else if (!g_strcmp0(signal_query.signal_name, "focus-event")) {
+    } else if (!g_strcmp0(signalQuery.signal_name, "focus-event")) {
         signalName.set(g_strdup("focus-event"));
         signalValue.set(g_strdup_printf("%d", g_value_get_boolean(&paramValues[1])));
-    } else if (!g_strcmp0(signal_query.signal_name, "children-changed")) {
+    } else if (!g_strcmp0(signalQuery.signal_name, "children-changed")) {
         signalName.set(g_strdup("children-changed"));
         signalValue.set(g_strdup_printf("%d", g_value_get_uint(&paramValues[1])));
-    } else if (!g_strcmp0(signal_query.signal_name, "property-change"))
+    } else if (!g_strcmp0(signalQuery.signal_name, "property-change"))
         signalName.set(g_strdup_printf("property-change:%s", g_quark_to_string(signalHint->detail)));
     else
-        signalName.set(g_strdup(signal_query.signal_name));
+        signalName.set(g_strdup(signalQuery.signal_name));
 
     printAccessibilityEvent(accessible, signalName.get(), signalValue.get());
 
@@ -103,12 +106,12 @@
     rootElement();
 
     // Add global listeners for AtkObject's signals.
-    m_stateChangeListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:state-change");
-    m_focusEventListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:focus-event");
-    m_activeDescendantChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:active-descendant-changed");
-    m_childrenChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:children-changed");
-    m_propertyChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:property-change");
-    m_visibleDataChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "Gtk:AtkObject:visible-data-changed");
+    m_stateChangeListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:state-change");
+    m_focusEventListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:focus-event");
+    m_activeDescendantChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:active-descendant-changed");
+    m_childrenChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:children-changed");
+    m_propertyChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:property-change");
+    m_visibleDataChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:visible-data-changed");
 
     // Ensure the Atk interface types are registered, otherwise
     // the AtkDocument signal handlers below won't get registered.
@@ -147,4 +150,46 @@
     }
 }
 
+static AtkObject* childElementById(AtkObject* parent, const char* id)
+{
+    if (!ATK_IS_OBJECT(parent))
+        return 0;
+
+    AtkAttributeSet* attributeSet = atk_object_get_attributes(parent);
+    for (GSList* attributes = attributeSet; attributes; attributes = attributes->next) {
+        AtkAttribute* attribute = static_cast<AtkAttribute*>(attributes->data);
+        if (!strcmp(attribute->name, "html-id")) {
+            if (!strcmp(attribute->value, id))
+                return parent;
+            break;
+        }
+    }
+
+    int childCount = atk_object_get_n_accessible_children(parent);
+    for (int i = 0; i < childCount; i++) {
+        AtkObject* result = childElementById(atk_object_ref_accessible_child(parent, i), id);
+        if (ATK_IS_OBJECT(result))
+            return result;
+    }
+
+    return 0;
+}
+
+PassRefPtr<AccessibilityUIElement> AccessibilityController::accessibleElementById(JSStringRef id)
+{
+    AtkObject* root = ATK_OBJECT(WKAccessibilityRootObject(InjectedBundle::shared().page()->page()));
+    if (!root)
+        return 0;
+
+    size_t bufferSize = JSStringGetMaximumUTF8CStringSize(id);
+    GOwnPtr<gchar> idBuffer(static_cast<gchar*>(g_malloc(bufferSize)));
+    JSStringGetUTF8CString(id, idBuffer.get(), bufferSize);
+
+    AtkObject* result = childElementById(root, idBuffer.get());
+    if (ATK_IS_OBJECT(result))
+        return AccessibilityUIElement::create(result);
+
+    return 0;
+}
+
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityUIElementGtk.cpp b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp
similarity index 78%
rename from Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityUIElementGtk.cpp
rename to Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp
index 6599346..361d11b 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/gtk/AccessibilityUIElementGtk.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp
@@ -27,14 +27,18 @@
 #include "config.h"
 #include "AccessibilityUIElement.h"
 
+#if HAVE(ACCESSIBILITY)
+
 #include "InjectedBundle.h"
 #include "InjectedBundlePage.h"
 #include <JavaScriptCore/JSStringRef.h>
 #include <atk/atk.h>
-#include <gtk/gtk.h>
 #include <wtf/Assertions.h>
 #include <wtf/gobject/GOwnPtr.h>
 #include <wtf/gobject/GRefPtr.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/WTFString.h>
+#include <wtf/unicode/CharacterNames.h>
 
 namespace WTR {
 
@@ -55,7 +59,7 @@
 static bool checkElementState(PlatformUIElement element, AtkStateType stateType)
 {
     if (!ATK_IS_OBJECT(element))
-         return false;
+        return false;
 
     GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(element)));
     return atk_state_set_contains_state(stateSet.get(), stateType);
@@ -121,6 +125,130 @@
     g_value_unset(&currentValue);
 }
 
+static gchar* replaceCharactersForResults(gchar* str)
+{
+    WTF::String uString = WTF::String::fromUTF8(str);
+
+    // The object replacement character is passed along to ATs so we need to be
+    // able to test for their presence and do so without causing test failures.
+    uString.replace(objectReplacementCharacter, "<obj>");
+
+    // The presence of newline characters in accessible text of a single object
+    // is appropriate, but it makes test results (especially the accessible tree)
+    // harder to read.
+    uString.replace("\n", "<\\n>");
+
+    return g_strdup(uString.utf8().data());
+}
+
+static const gchar* roleToString(AtkRole role)
+{
+    switch (role) {
+    case ATK_ROLE_ALERT:
+        return "AXRole: AXAlert";
+    case ATK_ROLE_CANVAS:
+        return "AXRole: AXCanvas";
+    case ATK_ROLE_CHECK_BOX:
+        return "AXRole: AXCheckBox";
+    case ATK_ROLE_COLUMN_HEADER:
+        return "AXRole: AXColumnHeader";
+    case ATK_ROLE_COMBO_BOX:
+        return "AXRole: AXComboBox";
+    case ATK_ROLE_DOCUMENT_FRAME:
+        return "AXRole: AXWebArea";
+    case ATK_ROLE_ENTRY:
+        return "AXRole: AXTextField";
+    case ATK_ROLE_FOOTER:
+        return "AXRole: AXFooter";
+    case ATK_ROLE_FORM:
+        return "AXRole: AXForm";
+    case ATK_ROLE_GROUPING:
+        return "AXRole: AXGroup";
+    case ATK_ROLE_HEADING:
+        return "AXRole: AXHeading";
+    case ATK_ROLE_IMAGE:
+        return "AXRole: AXImage";
+    case ATK_ROLE_IMAGE_MAP:
+        return "AXRole: AXImageMap";
+    case ATK_ROLE_LABEL:
+        return "AXRole: AXLabel";
+    case ATK_ROLE_LINK:
+        return "AXRole: AXLink";
+    case ATK_ROLE_LIST:
+        return "AXRole: AXList";
+    case ATK_ROLE_LIST_BOX:
+        return "AXRole: AXListBox";
+    case ATK_ROLE_LIST_ITEM:
+        return "AXRole: AXListItem";
+    case ATK_ROLE_MENU:
+        return "AXRole: AXMenu";
+    case ATK_ROLE_MENU_BAR:
+        return "AXRole: AXMenuBar";
+    case ATK_ROLE_MENU_ITEM:
+        return "AXRole: AXMenuItem";
+    case ATK_ROLE_PAGE_TAB:
+        return "AXRole: AXTab";
+    case ATK_ROLE_PAGE_TAB_LIST:
+        return "AXRole: AXTabGroup";
+    case ATK_ROLE_PANEL:
+        return "AXRole: AXGroup";
+    case ATK_ROLE_PARAGRAPH:
+        return "AXRole: AXParagraph";
+    case ATK_ROLE_PASSWORD_TEXT:
+        return "AXRole: AXPasswordField";
+    case ATK_ROLE_PUSH_BUTTON:
+        return "AXRole: AXButton";
+    case ATK_ROLE_RADIO_BUTTON:
+        return "AXRole: AXRadioButton";
+    case ATK_ROLE_ROW_HEADER:
+        return "AXRole: AXRowHeader";
+    case ATK_ROLE_RULER:
+        return "AXRole: AXRuler";
+    case ATK_ROLE_SCROLL_BAR:
+        return "AXRole: AXScrollBar";
+    case ATK_ROLE_SCROLL_PANE:
+        return "AXRole: AXScrollArea";
+    case ATK_ROLE_SECTION:
+        return "AXRole: AXDiv";
+    case ATK_ROLE_SEPARATOR:
+        return "AXRole: AXHorizontalRule";
+    case ATK_ROLE_SLIDER:
+        return "AXRole: AXSlider";
+    case ATK_ROLE_SPIN_BUTTON:
+        return "AXRole: AXSpinButton";
+    case ATK_ROLE_TABLE:
+        return "AXRole: AXTable";
+    case ATK_ROLE_TABLE_CELL:
+        return "AXRole: AXCell";
+    case ATK_ROLE_TABLE_COLUMN_HEADER:
+        return "AXRole: AXColumnHeader";
+    case ATK_ROLE_TABLE_ROW:
+        return "AXRole: AXRow";
+    case ATK_ROLE_TABLE_ROW_HEADER:
+        return "AXRole: AXRowHeader";
+    case ATK_ROLE_TOGGLE_BUTTON:
+        return "AXRole: AXToggleButton";
+    case ATK_ROLE_TOOL_BAR:
+        return "AXRole: AXToolbar";
+    case ATK_ROLE_TOOL_TIP:
+        return "AXRole: AXUserInterfaceTooltip";
+    case ATK_ROLE_TREE:
+        return "AXRole: AXTree";
+    case ATK_ROLE_TREE_TABLE:
+        return "AXRole: AXTreeGrid";
+    case ATK_ROLE_TREE_ITEM:
+        return "AXRole: AXTreeItem";
+    case ATK_ROLE_WINDOW:
+        return "AXRole: AXWindow";
+    case ATK_ROLE_UNKNOWN:
+        return "AXRole: AXUnknown";
+    default:
+        // We want to distinguish ATK_ROLE_UNKNOWN from a known AtkRole which
+        // our DRT isn't properly handling.
+        return "AXRole: FIXME not identified";
+    }
+}
+
 AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
     : m_element(element)
 {
@@ -255,8 +383,26 @@
 
 PassRefPtr<AccessibilityUIElement> AccessibilityUIElement::titleUIElement()
 {
-    // FIXME: implement
-    return 0;
+    if (!m_element)
+        return 0;
+
+    AtkRelationSet* set = atk_object_ref_relation_set(ATK_OBJECT(m_element));
+    if (!set)
+        return 0;
+
+    AtkObject* target = 0;
+    int count = atk_relation_set_get_n_relations(set);
+    for (int i = 0; i < count; i++) {
+        AtkRelation* relation = atk_relation_set_get_relation(set, i);
+        if (atk_relation_get_relation_type(relation) == ATK_RELATION_LABELLED_BY) {
+            GPtrArray* targetList = atk_relation_get_target(relation);
+            if (targetList->len)
+                target = static_cast<AtkObject*>(g_ptr_array_index(targetList, 0));
+        }
+    }
+
+    g_object_unref(set);
+    return target ? AccessibilityUIElement::create(target) : 0;
 }
 
 PassRefPtr<AccessibilityUIElement> AccessibilityUIElement::parentElement()
@@ -352,9 +498,7 @@
     if (!role)
         return JSStringCreateWithCharacters(0, 0);
 
-    const gchar* roleName = atk_role_get_name(role);
-    GOwnPtr<gchar> axRole(g_strdup_printf("AXRole: %s", roleName));
-
+    GOwnPtr<gchar> axRole(g_strdup(roleToString(role)));
     return JSStringCreateWithUTF8CString(axRole.get());
 }
 
@@ -376,10 +520,7 @@
         return JSStringCreateWithCharacters(0, 0);
 
     const gchar* name = atk_object_get_name(ATK_OBJECT(m_element));
-    if (!name)
-        return JSStringCreateWithCharacters(0, 0);
-
-    GOwnPtr<gchar> axTitle(g_strdup_printf("AXTitle: %s", name));
+    GOwnPtr<gchar> axTitle(g_strdup_printf("AXTitle: %s", name ? name : ""));
 
     return JSStringCreateWithUTF8CString(axTitle.get());
 }
@@ -400,14 +541,31 @@
 
 JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const
 {
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
+    if (!m_element || !ATK_IS_OBJECT(m_element))
+        return JSStringCreateWithCharacters(0, 0);
+
+    const gchar* axOrientation = 0;
+    if (checkElementState(m_element, ATK_STATE_HORIZONTAL))
+        axOrientation = "AXOrientation: AXHorizontalOrientation";
+    else if (checkElementState(m_element, ATK_STATE_VERTICAL))
+        axOrientation = "AXOrientation: AXVerticalOrientation";
+
+    if (!axOrientation)
+        return JSStringCreateWithCharacters(0, 0);
+
+    return JSStringCreateWithUTF8CString(axOrientation);
 }
 
 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringValue()
 {
-    // FIXME: implement
-    return JSStringCreateWithCharacters(0, 0);
+    if (!m_element || !ATK_IS_TEXT(m_element))
+        return JSStringCreateWithCharacters(0, 0);
+
+    GOwnPtr<gchar> text(atk_text_get_text(ATK_TEXT(m_element), 0, -1));
+    GOwnPtr<gchar> textWithReplacedCharacters(replaceCharactersForResults(text.get()));
+    GOwnPtr<gchar> axValue(g_strdup_printf("AXValue: %s", textWithReplacedCharacters.get()));
+
+    return JSStringCreateWithUTF8CString(axValue.get());
 }
 
 JSRetainPtr<JSStringRef> AccessibilityUIElement::language()
@@ -527,7 +685,19 @@
     return -1;
 }
 
-bool AccessibilityUIElement::isActionSupported(JSStringRef action)
+bool AccessibilityUIElement::isPressActionSupported()
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isIncrementActionSupported()
+{
+    // FIXME: implement
+    return false;
+}
+
+bool AccessibilityUIElement::isDecrementActionSupported()
 {
     // FIXME: implement
     return false;
@@ -712,8 +882,10 @@
     if (!m_element || !ATK_IS_TABLE(m_element))
         return 0;
 
-    AtkObject* foundCell = atk_table_ref_at(ATK_TABLE(m_element), row, col);
-    return foundCell ? AccessibilityUIElement::create(foundCell) : 0;
+    // Adopt the AtkObject representing the cell because
+    // at_table_ref_at() transfers full ownership.
+    GRefPtr<AtkObject> foundCell = adoptGRef(atk_table_ref_at(ATK_TABLE(m_element), row, col));
+    return foundCell ? AccessibilityUIElement::create(foundCell.get()) : 0;
 }
 
 PassRefPtr<AccessibilityUIElement> AccessibilityUIElement::horizontalScrollbar() const
@@ -968,5 +1140,17 @@
     return 0;
 }
 
+void AccessibilityUIElement::scrollToMakeVisible()
+{
+    // FIXME: implement
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::supportedActions() const
+{
+    // FIXME: implement
+    return 0;
+}
 
 } // namespace WTR
+
+#endif
diff --git a/Tools/WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp b/Tools/WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp
index c843591..83ae272 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/gtk/ActivateFontsGtk.cpp
@@ -31,6 +31,7 @@
 #include "config.h"
 #include "ActivateFonts.h"
 
+#include "InjectedBundleUtilities.h"
 #include <fontconfig/fontconfig.h>
 #include <gtk/gtk.h>
 #include <wtf/gobject/GlibUtilities.h>
@@ -49,30 +50,17 @@
                  "gtk-xft-hinting", 0,
                  "gtk-font-name", "Liberation Sans 12",
                  "gtk-theme-name", "Raleigh",
+                 "gtk-icon-theme-name", "gnome",
                  "gtk-xft-rgba", "none", NULL);
 }
 
-static CString getTopLevelPath()
-{
-    if (const char* topLevelDirectory = g_getenv("WEBKIT_TOP_LEVEL"))
-        return topLevelDirectory;
-
-    // If the environment variable wasn't provided then assume we were built into
-    // WebKitBuild/Debug or WebKitBuild/Release. Obviously this will fail if the build
-    // directory is non-standard, but we can't do much more about this.
-    GOwnPtr<char> parentPath(g_path_get_dirname(getCurrentExecutablePath().data()));
-    GOwnPtr<char> layoutTestsPath(g_build_filename(parentPath.get(), "..", "..", "..", NULL));
-    GOwnPtr<char> absoluteTopLevelPath(realpath(layoutTestsPath.get(), 0));
-    return absoluteTopLevelPath.get();
-}
-
 CString getOutputDir()
 {
     const char* webkitOutputDir = g_getenv("WEBKITOUTPUTDIR");
     if (webkitOutputDir)
         return webkitOutputDir;
 
-    CString topLevelPath = getTopLevelPath();
+    CString topLevelPath = WTR::topLevelPath();
     GOwnPtr<char> outputDir(g_build_filename(topLevelPath.data(), "WebKitBuild", NULL));
     return outputDir.get();
 }
@@ -116,8 +104,7 @@
     if (fontsPath.isNull())
         g_error("Could not locate test fonts at %s. Is WEBKIT_TOP_LEVEL set?", fontsPath.data());
 
-    GOwnPtr<GError> error;
-    GOwnPtr<GDir> fontsDirectory(g_dir_open(fontsPath.data(), 0, &error.outPtr()));
+    GOwnPtr<GDir> fontsDirectory(g_dir_open(fontsPath.data(), 0, 0));
     while (const char* directoryEntry = g_dir_read_name(fontsDirectory.get())) {
         if (!g_str_has_suffix(directoryEntry, ".ttf") && !g_str_has_suffix(directoryEntry, ".otf"))
             continue;
diff --git a/Tools/DumpRenderTree/qt/GCControllerQt.h b/Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.cpp
similarity index 62%
copy from Tools/DumpRenderTree/qt/GCControllerQt.h
copy to Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.cpp
index bcc9f23..1f539ba 100644
--- a/Tools/DumpRenderTree/qt/GCControllerQt.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.cpp
@@ -1,6 +1,5 @@
 /*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
+ * Copyright (C) 2013 Igalia S.L.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,25 +25,28 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#ifndef GCControllerQt_h
-#define GCControllerQt_h
 
-#include <QObject>
+#include "config.h"
+#include "InjectedBundleUtilities.h"
 
-class QWebPage;
-class DumpRenderTreeSupportQt;
+#include <gtk/gtk.h>
+#include <wtf/gobject/GOwnPtr.h>
+#include <wtf/gobject/GlibUtilities.h>
 
-class GCController : public QObject
+namespace WTR {
+
+CString topLevelPath()
 {
-    Q_OBJECT
-public:
-    GCController(QWebPage* parent);
+    if (const char* topLevelDirectory = g_getenv("WEBKIT_TOP_LEVEL"))
+        return topLevelDirectory;
 
-public Q_SLOTS:
-    void collect() const;
-    void collectOnAlternateThread(bool waitUntilDone) const;
-    unsigned int getJSObjectCount() const;
+    // If the environment variable wasn't provided then assume we were built into
+    // WebKitBuild/Debug or WebKitBuild/Release. Obviously this will fail if the build
+    // directory is non-standard, but we can't do much more about this.
+    GOwnPtr<char> parentPath(g_path_get_dirname(getCurrentExecutablePath().data()));
+    GOwnPtr<char> layoutTestsPath(g_build_filename(parentPath.get(), "..", "..", "..", NULL));
+    GOwnPtr<char> absoluteTopLevelPath(realpath(layoutTestsPath.get(), 0));
+    return absoluteTopLevelPath.get();
+}
 
-};
-
-#endif
+} // namespace WTR
diff --git a/Tools/DumpRenderTree/qt/GCControllerQt.h b/Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.h
similarity index 74%
rename from Tools/DumpRenderTree/qt/GCControllerQt.h
rename to Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.h
index bcc9f23..50f89de 100644
--- a/Tools/DumpRenderTree/qt/GCControllerQt.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/gtk/InjectedBundleUtilities.h
@@ -1,6 +1,5 @@
 /*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
+ * Copyright (C) 2013 Igalia S.L.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,25 +25,16 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#ifndef GCControllerQt_h
-#define GCControllerQt_h
 
-#include <QObject>
+#ifndef InjectedBundleUtilities_h
+#define InjectedBundleUtilities_h
 
-class QWebPage;
-class DumpRenderTreeSupportQt;
+#include <wtf/text/CString.h>
 
-class GCController : public QObject
-{
-    Q_OBJECT
-public:
-    GCController(QWebPage* parent);
+namespace WTR {
 
-public Q_SLOTS:
-    void collect() const;
-    void collectOnAlternateThread(bool waitUntilDone) const;
-    unsigned int getJSObjectCount() const;
+CString topLevelPath();
 
-};
+} // namespace WTR
 
-#endif
+#endif // InjectedBundleUtilities_h
diff --git a/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp b/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp
index 3010382..b50a332 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp
@@ -28,7 +28,9 @@
 #include "TestRunner.h"
 
 #include "InjectedBundle.h"
+#include "InjectedBundleUtilities.h"
 #include <glib.h>
+#include <wtf/gobject/GOwnPtr.h>
 
 namespace WTR {
 
@@ -62,7 +64,17 @@
 
 JSRetainPtr<JSStringRef> TestRunner::pathToLocalResource(JSStringRef url)
 {
-    return url;
+    size_t urlSize = JSStringGetMaximumUTF8CStringSize(url);
+    GOwnPtr<gchar> urlString(static_cast<gchar*>(g_malloc(urlSize)));
+    JSStringGetUTF8CString(url, urlString.get(), urlSize);
+
+    if (!g_str_has_prefix(urlString.get(), "file:///tmp/LayoutTests/"))
+        return JSStringRetain(url);
+
+    const gchar* layoutTestsSuffix = urlString.get() + strlen("file:///tmp/");
+    GOwnPtr<gchar> testPath(g_build_filename(WTR::topLevelPath().data(), layoutTestsSuffix, NULL));
+    GOwnPtr<gchar> testURI(g_filename_to_uri(testPath.get(), 0, 0));
+    return JSStringCreateWithUTF8CString(testURI.get());
 }
 
 JSRetainPtr<JSStringRef> TestRunner::platformName()
diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm
index 9e54908..fefddc7 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm
+++ b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm
@@ -49,8 +49,6 @@
     if (!functionCallback)
         return false;
 
-    // Mac programmers should not be adding more than one global notification listener.
-    // Other platforms may be different.
     if (m_globalNotificationHandler)
         return false;
     m_globalNotificationHandler = [[AccessibilityNotificationHandler alloc] init];
@@ -62,13 +60,24 @@
 
 bool AccessibilityController::removeNotificationListener()
 {
-    // Mac programmers should not be trying to remove a listener that's already removed.
     ASSERT(m_globalNotificationHandler);
+    
+    [m_globalNotificationHandler.get() stopObserving];
     m_globalNotificationHandler.clear();
 
     return true;
 }
 
+void AccessibilityController::logAccessibilityEvents()
+{
+}
+
+void AccessibilityController::resetToConsistentState()
+{
+    if (m_globalNotificationHandler)
+        removeNotificationListener();
+}
+
 static id findAccessibleObjectById(id obj, NSString *idAttribute)
 {
     BEGIN_AX_OBJC_EXCEPTIONS
diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.h b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.h
index 6725d19..2c16088 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.h
+++ b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.h
@@ -42,6 +42,7 @@
 - (void)setPlatformElement:(id)platformElement;
 - (void)setCallback:(JSValueRef)callback;
 - (void)startObserving;
+- (void)stopObserving;
 
 @end
 
diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm
index 1d85bca..a3a0233 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm
+++ b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm
@@ -75,7 +75,7 @@
 
 - (void)dealloc
 {
-    [[NSNotificationCenter defaultCenter] removeObserver:self];
+    [self stopObserving];
 
     WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(WTR::InjectedBundle::shared().page()->page());
     JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);
@@ -112,6 +112,11 @@
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_notificationReceived:) name:@"AXDRTNotification" object:nil];
 }
 
+- (void)stopObserving
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
 - (void)_notificationReceived:(NSNotification *)notification
 {
     NSString *notificationName = [[notification userInfo] objectForKey:@"notificationName"];
diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm
index 24eef08..ec0bd30 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm
+++ b/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm
@@ -87,6 +87,8 @@
 
 bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement)
 {
+    if (!otherElement)
+        return false;
     return platformUIElement() == otherElement->platformUIElement();
 }
     
@@ -679,11 +681,31 @@
     return -1;
 }
 
-bool AccessibilityUIElement::isActionSupported(JSStringRef action)
+bool AccessibilityUIElement::isPressActionSupported()
 {
     BEGIN_AX_OBJC_EXCEPTIONS
     NSArray* actions = [m_element accessibilityActionNames];
-    return [actions containsObject:[NSString stringWithJSStringRef:action]];
+    return [actions containsObject:NSAccessibilityPressAction];
+    END_AX_OBJC_EXCEPTIONS
+    
+    return false;
+}
+
+bool AccessibilityUIElement::isIncrementActionSupported()
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    NSArray* actions = [m_element accessibilityActionNames];
+    return [actions containsObject:NSAccessibilityIncrementAction];
+    END_AX_OBJC_EXCEPTIONS
+    
+    return false;
+}
+
+bool AccessibilityUIElement::isDecrementActionSupported()
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    NSArray* actions = [m_element accessibilityActionNames];
+    return [actions containsObject:NSAccessibilityDecrementAction];
     END_AX_OBJC_EXCEPTIONS
     
     return false;
@@ -1076,6 +1098,13 @@
     return 0;
 }
 
+void AccessibilityUIElement::scrollToMakeVisible()
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    [m_element accessibilityPerformAction:@"AXScrollToVisible"];
+    END_AX_OBJC_EXCEPTIONS
+}
+    
 JSRetainPtr<JSStringRef> AccessibilityUIElement::selectedTextRange()
 {
     NSRange range = NSMakeRange(NSNotFound, 0);
@@ -1416,6 +1445,15 @@
     return 0;                                                                          
 }
 
+JSRetainPtr<JSStringRef> AccessibilityUIElement::supportedActions() const
+{
+    BEGIN_AX_OBJC_EXCEPTIONS
+    NSArray *names = [m_element accessibilityActionNames];
+    return [[names componentsJoinedByString:@","] createJSStringRef];
+    END_AX_OBJC_EXCEPTIONS
+    
+    return 0;
+}
 
 } // namespace WTR
 
diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm b/Tools/WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm
index f13dd9d..c2768db 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm
+++ b/Tools/WebKitTestRunner/InjectedBundle/mac/ActivateFonts.mm
@@ -28,7 +28,6 @@
 
 #import <AppKit/AppKit.h>
 #import <CoreFoundation/CoreFoundation.h>
-#import <objc/objc-runtime.h>
 #import <wtf/ObjcRuntimeExtras.h>
 #import <wtf/RetainPtr.h>
 
diff --git a/Tools/WebKitTestRunner/InjectedBundle/mac/InjectedBundleMac.mm b/Tools/WebKitTestRunner/InjectedBundle/mac/InjectedBundleMac.mm
index 996acbb..1ad19ae 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/mac/InjectedBundleMac.mm
+++ b/Tools/WebKitTestRunner/InjectedBundle/mac/InjectedBundleMac.mm
@@ -31,6 +31,9 @@
 +(void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString *)host;
 @end
 
+@interface NSSound (Details)
++ (void)_setAlertType:(NSUInteger)alertType;
+@end
 
 namespace WTR {
 
@@ -47,12 +50,17 @@
         [NSNumber numberWithBool:NO],     @"NSOverlayScrollersEnabled",
         @"Always",                        @"AppleShowScrollBars",
         [NSArray arrayWithObject:@"en"],  @"AppleLanguages",
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+        [NSDictionary dictionaryWithObjectsAndKeys:@"notational", @"notationl", nil], @"NSTestCorrectionDictionary",
+#endif
         nil];
 
     [[NSUserDefaults standardUserDefaults] setVolatileDomain:dict forName:NSArgumentDomain];
 
     [NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:@"localhost"];
     [NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:@"127.0.0.1"];
+
+    [NSSound _setAlertType:0];
 }
 
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp b/Tools/WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp
index 332ffcf..ff24aa5 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/qt/ActivateFontsQt.cpp
@@ -39,6 +39,7 @@
 {
     WebKit::QtTestSupport::initializeTestFonts();
     QCoreApplication::setAttribute(Qt::AA_Use96Dpi, true);
+    DumpRenderTreeSupportQt::disableDefaultTypesettingFeatures();
 }
 
 }
diff --git a/Tools/WebKitTestRunner/InjectedBundle/qt/InjectedBundleQt.cpp b/Tools/WebKitTestRunner/InjectedBundle/qt/InjectedBundleQt.cpp
index 8450973..d14dd87 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/qt/InjectedBundleQt.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/qt/InjectedBundleQt.cpp
@@ -28,7 +28,8 @@
 #include "InjectedBundle.h"
 #include <QApplication>
 #include <QByteArray>
-#include <QWindowsStyle>
+#include <QStyle>
+#include <QStyleFactory>
 #include <stdio.h>
 #include <stdlib.h>
 #include <wtf/AlwaysInline.h>
@@ -38,7 +39,7 @@
 
 void InjectedBundle::platformInitialize(WKTypeRef)
 {
-    QWindowsStyle* styleForTests = new QWindowsStyle;
+    QStyle* styleForTests = QStyleFactory::create(QLatin1String("windows"));
     QApplication::setStyle(styleForTests);
     // Force Qt to use the style's standard palette, instead of platform default palette. This is needed
     // because we are setting the style after QApplication is instantiated.
diff --git a/Tools/WebKitTestRunner/InjectedBundle/qt/TestRunnerQt.cpp b/Tools/WebKitTestRunner/InjectedBundle/qt/TestRunnerQt.cpp
index 1671ac7..95ed46d 100644
--- a/Tools/WebKitTestRunner/InjectedBundle/qt/TestRunnerQt.cpp
+++ b/Tools/WebKitTestRunner/InjectedBundle/qt/TestRunnerQt.cpp
@@ -74,13 +74,18 @@
 
 void TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded()
 {
+    int timerInterval;
     if (qgetenv("QT_WEBKIT2_DEBUG") == "1")
         return;
 
     if (m_waitToDumpWatchdogTimer.isActive())
         return;
+    if (m_timeout > 0)
+        timerInterval = m_timeout;
+    else
+        timerInterval = waitToDumpWatchdogTimerInterval * 1000;
 
-    m_waitToDumpWatchdogTimer.start(waitToDumpWatchdogTimerInterval * 1000);
+    m_waitToDumpWatchdogTimer.start(timerInterval);
 }
 
 JSRetainPtr<JSStringRef> TestRunner::pathToLocalResource(JSStringRef url)
diff --git a/Tools/WebKitTestRunner/PlatformEfl.cmake b/Tools/WebKitTestRunner/PlatformEfl.cmake
index 1c69472..0a8ab37 100644
--- a/Tools/WebKitTestRunner/PlatformEfl.cmake
+++ b/Tools/WebKitTestRunner/PlatformEfl.cmake
@@ -1,14 +1,14 @@
-ADD_CUSTOM_TARGET(forwarding-headersEflForWebKitTestRunner
+add_custom_target(forwarding-headersEflForWebKitTestRunner
     COMMAND ${PERL_EXECUTABLE} ${WEBKIT2_DIR}/Scripts/generate-forwarding-headers.pl ${WEBKIT_TESTRUNNER_DIR} ${DERIVED_SOURCES_WEBKIT2_DIR}/include efl
 )
-SET(ForwardingHeadersForWebKitTestRunner_NAME forwarding-headersEflForWebKitTestRunner)
+set(ForwardingHeadersForWebKitTestRunner_NAME forwarding-headersEflForWebKitTestRunner)
 
-ADD_CUSTOM_TARGET(forwarding-headersSoupForWebKitTestRunner
+add_custom_target(forwarding-headersSoupForWebKitTestRunner
     COMMAND ${PERL_EXECUTABLE} ${WEBKIT2_DIR}/Scripts/generate-forwarding-headers.pl ${WEBKIT_TESTRUNNER_DIR} ${DERIVED_SOURCES_WEBKIT2_DIR}/include soup
 )
-SET(ForwardingNetworkHeadersForWebKitTestRunner_NAME forwarding-headersSoupForWebKitTestRunner)
+set(ForwardingNetworkHeadersForWebKitTestRunner_NAME forwarding-headersSoupForWebKitTestRunner)
 
-LIST(APPEND WebKitTestRunner_SOURCES
+list(APPEND WebKitTestRunner_SOURCES
     ${WEBKIT_TESTRUNNER_DIR}/cairo/TestInvocationCairo.cpp
 
     ${WEBKIT_TESTRUNNER_DIR}/efl/EventSenderProxyEfl.cpp
@@ -17,42 +17,44 @@
     ${WEBKIT_TESTRUNNER_DIR}/efl/main.cpp
 )
 
-LIST(APPEND WebKitTestRunner_INCLUDE_DIRECTORIES
+list(APPEND WebKitTestRunner_INCLUDE_DIRECTORIES
     ${TOOLS_DIR}/DumpRenderTree/efl/
     ${WEBKIT2_DIR}/UIProcess/API/efl
     "${WTF_DIR}/wtf/gobject"
-
     ${CAIRO_INCLUDE_DIRS}
-    ${ECORE_INCLUDE_DIRS}
     ${ECORE_EVAS_INCLUDE_DIRS}
+    ${ECORE_FILE_INCLUDE_DIRS}
+    ${ECORE_INCLUDE_DIRS}
     ${EINA_INCLUDE_DIRS}
+    ${EO_INCLUDE_DIRS}
     ${EVAS_INCLUDE_DIRS}
     ${GLIB_INCLUDE_DIRS}
 )
 
-LIST(APPEND WebKitTestRunner_LIBRARIES
+list(APPEND WebKitTestRunner_LIBRARIES
     ${CAIRO_LIBRARIES}
     ${ECORE_LIBRARIES}
     ${ECORE_EVAS_LIBRARIES}
     ${EINA_LIBRARIES}
+    ${EO_LIBRARIES}
     ${EVAS_LIBRARIES}
     ${GLIB_LIBRARIES}
     ${OPENGL_LIBRARIES}
     ${WTF_LIBRARY_NAME}
 )
 
-IF (ENABLE_ECORE_X)
-    LIST(APPEND WebKitTestRunner_INCLUDE_DIRECTORIES
+if (ENABLE_ECORE_X)
+    list(APPEND WebKitTestRunner_INCLUDE_DIRECTORIES
         ${ECORE_X_INCLUDE_DIRS}
     )
 
-    LIST(APPEND WebKitTestRunner_LIBRARIES
+    list(APPEND WebKitTestRunner_LIBRARIES
         ${ECORE_X_LIBRARIES}
         ${X11_Xext_LIB}
     )
-ENDIF ()
+endif ()
 
-LIST(APPEND WebKitTestRunnerInjectedBundle_SOURCES
+list(APPEND WebKitTestRunnerInjectedBundle_SOURCES
     ${TOOLS_DIR}/DumpRenderTree/efl/FontManagement.cpp
 
     ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/efl/ActivateFontsEfl.cpp
@@ -62,6 +64,19 @@
 
 # FIXME: DOWNLOADED_FONTS_DIR should not hardcode the directory
 # structure. See <https://bugs.webkit.org/show_bug.cgi?id=81475>.
-ADD_DEFINITIONS(-DFONTS_CONF_DIR="${TOOLS_DIR}/DumpRenderTree/gtk/fonts"
+add_definitions(-DFONTS_CONF_DIR="${TOOLS_DIR}/DumpRenderTree/gtk/fonts"
                 -DDOWNLOADED_FONTS_DIR="${CMAKE_SOURCE_DIR}/WebKitBuild/Dependencies/Source/webkitgtk-test-fonts-0.0.3"
                 -DTHEME_DIR="${THEME_BINARY_DIR}")
+
+if (ENABLE_ACCESSIBILITY)
+    list(APPEND WebKitTestRunnerInjectedBundle_SOURCES
+        ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/atk/AccessibilityControllerAtk.cpp
+        ${WEBKIT_TESTRUNNER_INJECTEDBUNDLE_DIR}/atk/AccessibilityUIElementAtk.cpp
+    )
+    list(APPEND WebKitTestRunner_INCLUDE_DIRECTORIES
+        ${ATK_INCLUDE_DIRS}
+    )
+    list(APPEND WebKitTestRunner_LIBRARIES
+        ${ATK_LIBRARIES}
+    )
+endif ()
diff --git a/Tools/WebKitTestRunner/PlatformWebView.h b/Tools/WebKitTestRunner/PlatformWebView.h
index 60d2fc1..8df1144 100644
--- a/Tools/WebKitTestRunner/PlatformWebView.h
+++ b/Tools/WebKitTestRunner/PlatformWebView.h
@@ -54,8 +54,8 @@
 typedef WKViewRef PlatformWKView;
 typedef GtkWidget* PlatformWindow;
 #elif PLATFORM(EFL)
-typedef struct _Evas_Object Evas_Object;
 typedef struct _Ecore_Evas Ecore_Evas;
+typedef struct _Evas_Object Evas_Object;
 typedef Evas_Object* PlatformWKView;
 typedef Ecore_Evas* PlatformWindow;
 #endif
@@ -82,6 +82,8 @@
 
     WKRect windowFrame();
     void setWindowFrame(WKRect);
+
+    void didInitializeClients();
     
     void addChromeInputField();
     void removeChromeInputField();
@@ -89,18 +91,23 @@
     void setWindowIsKey(bool isKey) { m_windowIsKey = isKey; }
     bool windowIsKey() const { return m_windowIsKey; }
 
-#if PLATFORM(MAC)
+#if PLATFORM(MAC) || PLATFORM(EFL) || PLATFORM(QT)
     bool viewSupportsOptions(WKDictionaryRef) const;
 #else
     bool viewSupportsOptions(WKDictionaryRef) const { return true; }
 #endif
 
     WKRetainPtr<WKImageRef> windowSnapshotImage();
+    WKDictionaryRef options() const { return m_options.get(); }
 
 private:
     PlatformWKView m_view;
     PlatformWindow m_window;
     bool m_windowIsKey;
+    WKRetainPtr<WKDictionaryRef> m_options;
+#if PLATFORM(EFL) || PLATFORM(QT)
+    bool m_usingFixedLayout;
+#endif
 #if PLATFORM(QT)
     QEventLoop* m_modalEventLoop;
 #endif
diff --git a/Tools/WebKitTestRunner/StringFunctions.h b/Tools/WebKitTestRunner/StringFunctions.h
index 129e7be..13f6e58 100644
--- a/Tools/WebKitTestRunner/StringFunctions.h
+++ b/Tools/WebKitTestRunner/StringFunctions.h
@@ -38,6 +38,7 @@
 #include <wtf/OwnArrayPtr.h>
 #include <wtf/PassOwnArrayPtr.h>
 #include <wtf/Platform.h>
+#include <wtf/text/CString.h>
 #include <wtf/text/WTFString.h>
 #include <wtf/Vector.h>
 
@@ -55,6 +56,11 @@
     return toWK(string.get());
 }
 
+inline WKRetainPtr<WKStringRef> toWK(const WTF::String& string)
+{
+    return adoptWK(WKStringCreateWithUTF8CString(string.utf8().data()));
+}
+
 inline JSRetainPtr<JSStringRef> toJS(WKStringRef string)
 {
     return JSRetainPtr<JSStringRef>(Adopt, WKStringCopyJSString(string));
diff --git a/Tools/WebKitTestRunner/TestController.cpp b/Tools/WebKitTestRunner/TestController.cpp
index 2eb635b..be7620f 100644
--- a/Tools/WebKitTestRunner/TestController.cpp
+++ b/Tools/WebKitTestRunner/TestController.cpp
@@ -29,7 +29,10 @@
 #include "PlatformWebView.h"
 #include "StringFunctions.h"
 #include "TestInvocation.h"
+#include <WebKit2/WKAuthenticationChallenge.h>
+#include <WebKit2/WKAuthenticationDecisionListener.h>
 #include <WebKit2/WKContextPrivate.h>
+#include <WebKit2/WKCredential.h>
 #include <WebKit2/WKNotification.h>
 #include <WebKit2/WKNotificationManager.h>
 #include <WebKit2/WKNotificationPermissionRequest.h>
@@ -44,6 +47,7 @@
 #include <stdlib.h>
 #include <string>
 #include <wtf/PassOwnPtr.h>
+#include <wtf/text/CString.h>
 
 #if PLATFORM(MAC)
 #include <WebKit2/WKPagePrivateMac.h>
@@ -93,6 +97,7 @@
     , m_noTimeout(defaultNoTimeout)
     , m_useWaitToDumpWatchdogTimer(true)
     , m_forceNoTimeout(false)
+    , m_timeout(0)
     , m_didPrintWebProcessCrashedMessage(false)
     , m_shouldExitWhenWebProcessCrashes(true)
     , m_beforeUnloadReturnValue(true)
@@ -109,6 +114,7 @@
 
 TestController::~TestController()
 {
+    platformDestroy();
 }
 
 static WKRect getWindowFrame(WKPageRef page, const void* clientInfo)
@@ -169,9 +175,16 @@
     TestController::shared().handleGeolocationPermissionRequest(permissionRequest);
 }
 
-WKPageRef TestController::createOtherPage(WKPageRef oldPage, WKURLRequestRef, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void*)
+int TestController::getCustomTimeout()
 {
-    PlatformWebView* view = new PlatformWebView(WKPageGetContext(oldPage), WKPageGetPageGroup(oldPage));
+    return m_timeout;
+}
+
+WKPageRef TestController::createOtherPage(WKPageRef oldPage, WKURLRequestRef, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void* clientInfo)
+{
+    PlatformWebView* parentView = static_cast<PlatformWebView*>(const_cast<void*>(clientInfo));
+
+    PlatformWebView* view = new PlatformWebView(WKPageGetContext(oldPage), WKPageGetPageGroup(oldPage), parentView->options());
     WKPageRef newPage = view->page();
 
     view->resizeTo(800, 600);
@@ -221,12 +234,15 @@
         createOtherPage,
         0, // mouseDidMoveOverElement
         0, // decidePolicyForNotificationPermissionRequest
-        0, // unavailablePluginButtonClicked
+        0, // unavailablePluginButtonClicked_deprecatedForUseWithV1
         0, // showColorPicker
         0, // hideColorPicker
+        0, // unavailablePluginButtonClicked
     };
     WKPageSetPageUIClient(newPage, &otherPageUIClient);
 
+    view->didInitializeClients();
+
     WKRetain(newPage);
     return newPage;
 }
@@ -331,7 +347,6 @@
         WKContextSetDiskCacheDirectory(m_context.get(), dumpRenderTreeTempWK.get());
         WKContextSetCookieStorageDirectory(m_context.get(), dumpRenderTreeTempWK.get());
 
-        std::string iconDatabaseFileTemp(dumpRenderTreeTemp);
         // WebCore::pathByAppendingComponent is not used here because of the namespace,
         // which leads us to this ugly #ifdef and file path concatenation.
 #if OS(WINDOWS)
@@ -339,9 +354,8 @@
 #else
         const char separator = '/';
 #endif
-        iconDatabaseFileTemp = iconDatabaseFileTemp + separator + "WebpageIcons.db";
-        WKRetainPtr<WKStringRef> iconDatabaseFileTempWK = WKStringCreateWithUTF8CString(iconDatabaseFileTemp.c_str());
-        WKContextSetIconDatabasePath(m_context.get(), iconDatabaseFileTempWK.get());
+        String iconDatabaseFileTemp = String::fromUTF8(dumpRenderTreeTemp) + separator + String(ASCIILiteral("WebpageIcons.db"));
+        WKContextSetIconDatabasePath(m_context.get(), toWK(iconDatabaseFileTemp).get());
     }
 
     platformInitializeContext();
@@ -413,9 +427,10 @@
         createOtherPage,
         0, // mouseDidMoveOverElement
         decidePolicyForNotificationPermissionRequest, // decidePolicyForNotificationPermissionRequest
-        0, // unavailablePluginButtonClicked
+        0, // unavailablePluginButtonClicked_deprecatedForUseWithV1
         0, // showColorPicker
         0, // hideColorPicker
+        unavailablePluginButtonClicked,
     };
     WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient);
 
@@ -437,7 +452,7 @@
         0, // didFailToInitializePlugin
         0, // didDisplayInsecureContentForFrame
         0, // canAuthenticateAgainstProtectionSpaceInFrame
-        0, // didReceiveAuthenticationChallengeInFrame
+        didReceiveAuthenticationChallengeInFrame, // didReceiveAuthenticationChallengeInFrame
         0, // didStartProgress
         0, // didChangeProgress
         0, // didFinishProgress
@@ -451,10 +466,12 @@
         0, // didNewFirstVisuallyNonEmptyLayout
         0, // willGoToBackForwardListItem
         0, // interactionOccurredWhileProcessUnresponsive
-        0, // pluginDidFail
+        0, // pluginDidFail_deprecatedForUseWithV1
         0, // didReceiveIntentForFrame
         0, // registerIntentServiceForFrame
         0, // didLayout
+        0, // pluginLoadPolicy
+        0, // pluginDidFail
     };
     WKPageSetPageLoaderClient(m_mainWebView->page(), &pageLoaderClient);
 
@@ -467,6 +484,8 @@
         0, // unableToImplementPolicy
     };
     WKPageSetPagePolicyClient(m_mainWebView->page(), &pagePolicyClient);
+
+    m_mainWebView->didInitializeClients();
 }
 
 void TestController::ensureViewSupportsOptions(WKDictionaryRef options)
@@ -554,6 +573,7 @@
 #endif
     WKPreferencesSetScreenFontSubstitutionEnabled(preferences, true);
     WKPreferencesSetInspectorUsesWebKitUserInterface(preferences, true);
+    WKPreferencesSetAsynchronousSpellCheckingEnabled(preferences, false);
 #if !PLATFORM(MAC)
     WKTextCheckerContinuousSpellCheckingEnabledStateChanged(true);
 #endif
@@ -565,6 +585,13 @@
     // Re-set to the default backing scale factor by setting the custom scale factor to 0.
     WKPageSetCustomBackingScaleFactor(m_mainWebView->page(), 0);
 
+#if PLATFORM(EFL)
+    // EFL use a real window while other ports such as Qt don't.
+    // In EFL, we need to resize the window to the original size after calls to window.resizeTo.
+    WKRect rect = m_mainWebView->windowFrame();
+    m_mainWebView->setWindowFrame(WKRectMake(rect.origin.x, rect.origin.y, 800, 600));
+#endif
+
     // Reset notification permissions
     m_webNotificationProvider.reset();
 
@@ -578,6 +605,10 @@
 
     m_workQueueManager.clearWorkQueue();
 
+    m_handlesAuthenticationChallenges = false;
+    m_authenticationUsername = String();
+    m_authenticationPassword = String();
+
     // Reset main page back to about:blank
     m_doneResetting = false;
 
@@ -587,11 +618,12 @@
 }
 
 struct TestCommand {
-    TestCommand() : shouldDumpPixels(false) { }
+    TestCommand() : shouldDumpPixels(false), timeout(0) { }
 
     std::string pathOrURL;
     bool shouldDumpPixels;
     std::string expectedPixelHash;
+    int timeout;
 };
 
 class CommandTokenizer {
@@ -653,18 +685,20 @@
     if (!tokenizer.hasNext())
         die(inputLine);
 
-    result.pathOrURL = tokenizer.next();
-    if (!tokenizer.hasNext())
-        return result;
-
     std::string arg = tokenizer.next();
-    if (arg != std::string("-p") && arg != std::string("--pixel-test"))
-        die(inputLine);
-    result.shouldDumpPixels = true;
-
-    if (tokenizer.hasNext())
-        result.expectedPixelHash = tokenizer.next();
-
+    result.pathOrURL = arg;
+    while (tokenizer.hasNext()) {
+        arg = tokenizer.next();
+        if (arg == std::string("--timeout")) {
+            std::string timeoutToken = tokenizer.next();
+            result.timeout = atoi(timeoutToken.c_str());
+        } else if (arg == std::string("-p") || arg == std::string("--pixel-test")) {
+            result.shouldDumpPixels = true;
+            if (tokenizer.hasNext())
+                result.expectedPixelHash = tokenizer.next();
+        } else
+            die(inputLine);
+    }
     return result;
 }
 
@@ -677,6 +711,8 @@
     m_currentInvocation = adoptPtr(new TestInvocation(command.pathOrURL));
     if (command.shouldDumpPixels || m_shouldDumpPixelsForAllTests)
         m_currentInvocation->setIsPixelTest(command.expectedPixelHash);
+    if (command.timeout > 0)
+        m_currentInvocation->setCustomTimeout(command.timeout);
 
     m_currentInvocation->invoke();
     m_currentInvocation.clear();
@@ -728,6 +764,9 @@
         case LongTimeout:
             timeout = m_longTimeout;
             break;
+        case CustomTimeout:
+            timeout = m_timeout;
+            break;
         case NoTimeout:
         default:
             timeout = m_noTimeout;
@@ -750,6 +789,26 @@
     *returnData = static_cast<TestController*>(const_cast<void*>(clientInfo))->didReceiveSynchronousMessageFromInjectedBundle(messageName, messageBody).leakRef();
 }
 
+void TestController::didReceiveKeyDownMessageFromInjectedBundle(WKDictionaryRef messageBodyDictionary, bool synchronous)
+{
+    WKRetainPtr<WKStringRef> keyKey = adoptWK(WKStringCreateWithUTF8CString("Key"));
+    WKStringRef key = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, keyKey.get()));
+
+    WKRetainPtr<WKStringRef> modifiersKey = adoptWK(WKStringCreateWithUTF8CString("Modifiers"));
+    WKEventModifiers modifiers = static_cast<WKEventModifiers>(WKUInt64GetValue(static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, modifiersKey.get()))));
+
+    WKRetainPtr<WKStringRef> locationKey = adoptWK(WKStringCreateWithUTF8CString("Location"));
+    unsigned location = static_cast<unsigned>(WKUInt64GetValue(static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, locationKey.get()))));
+
+    if (synchronous)
+        WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), true);
+
+    m_eventSenderProxy->keyDown(key, modifiers, location);
+
+    if (synchronous)
+        WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), false);
+}
+
 void TestController::didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody)
 {
 #if PLATFORM(MAC) || PLATFORM(QT) || PLATFORM(GTK) || PLATFORM(EFL)
@@ -776,6 +835,13 @@
 
             return;
         }
+
+        if (WKStringIsEqualToUTF8CString(subMessageName, "KeyDown")) {
+            didReceiveKeyDownMessageFromInjectedBundle(messageBodyDictionary, false);
+
+            return;
+        }
+
         ASSERT_NOT_REACHED();
     }
 #endif
@@ -797,19 +863,8 @@
         WKStringRef subMessageName = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, subMessageKey.get()));
 
         if (WKStringIsEqualToUTF8CString(subMessageName, "KeyDown")) {
-            WKRetainPtr<WKStringRef> keyKey = adoptWK(WKStringCreateWithUTF8CString("Key"));
-            WKStringRef key = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, keyKey.get()));
+            didReceiveKeyDownMessageFromInjectedBundle(messageBodyDictionary, true);
 
-            WKRetainPtr<WKStringRef> modifiersKey = adoptWK(WKStringCreateWithUTF8CString("Modifiers"));
-            WKEventModifiers modifiers = static_cast<WKEventModifiers>(WKUInt64GetValue(static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, modifiersKey.get()))));
-
-            WKRetainPtr<WKStringRef> locationKey = adoptWK(WKStringCreateWithUTF8CString("Location"));
-            unsigned location = static_cast<unsigned>(WKUInt64GetValue(static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, locationKey.get()))));
-
-            // Forward to WebProcess
-            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), true);
-            m_eventSenderProxy->keyDown(key, modifiers, location);
-            WKPageSetShouldSendEventsSynchronously(mainWebView()->page(), false);
             return 0;
         }
 
@@ -996,6 +1051,11 @@
     static_cast<TestController*>(const_cast<void*>(clientInfo))->didFinishLoadForFrame(page, frame);
 }
 
+void TestController::didReceiveAuthenticationChallengeInFrame(WKPageRef page, WKFrameRef frame, WKAuthenticationChallengeRef authenticationChallenge, const void *clientInfo)
+{
+    static_cast<TestController*>(const_cast<void*>(clientInfo))->didReceiveAuthenticationChallengeInFrame(page, frame, authenticationChallenge);
+}
+
 void TestController::processDidCrash(WKPageRef page, const void* clientInfo)
 {
     static_cast<TestController*>(const_cast<void*>(clientInfo))->processDidCrash();
@@ -1025,6 +1085,26 @@
     shared().notifyDone();
 }
 
+void TestController::didReceiveAuthenticationChallengeInFrame(WKPageRef page, WKFrameRef frame, WKAuthenticationChallengeRef authenticationChallenge)
+{
+    String message;
+    if (!m_handlesAuthenticationChallenges)
+        message = "<unknown> - didReceiveAuthenticationChallenge - Simulating cancelled authentication sheet\n";
+    else
+        message = String::format("<unknown> - didReceiveAuthenticationChallenge - Responding with %s:%s\n", m_authenticationUsername.utf8().data(), m_authenticationPassword.utf8().data());
+    m_currentInvocation->outputText(message);
+
+    WKAuthenticationDecisionListenerRef decisionListener = WKAuthenticationChallengeGetDecisionListener(authenticationChallenge);
+    if (!m_handlesAuthenticationChallenges) {
+        WKAuthenticationDecisionListenerUseCredential(decisionListener, 0);
+        return;
+    }
+    WKRetainPtr<WKStringRef> username(AdoptWK, WKStringCreateWithUTF8CString(m_authenticationUsername.utf8().data()));
+    WKRetainPtr<WKStringRef> password(AdoptWK, WKStringCreateWithUTF8CString(m_authenticationPassword.utf8().data()));
+    WKRetainPtr<WKCredentialRef> credential(AdoptWK, WKCredentialCreate(username.get(), password.get(), kWKCredentialPersistenceForSession));
+    WKAuthenticationDecisionListenerUseCredential(decisionListener, credential.get());
+}
+
 void TestController::processDidCrash()
 {
     // This function can be called multiple times when crash logs are being saved on Windows, so
@@ -1078,6 +1158,11 @@
     m_policyDelegatePermissive = permissive;
 }
 
+void TestController::setVisibilityState(WKPageVisibilityState visibilityState, bool isInitialState)
+{
+    WKPageSetVisibilityState(m_mainWebView->page(), visibilityState, isInitialState);
+}
+
 void TestController::decidePolicyForGeolocationPermissionRequestIfPossible()
 {
     if (!m_isGeolocationPermissionSet)
@@ -1103,6 +1188,11 @@
     WKNotificationPermissionRequestAllow(request);
 }
 
+void TestController::unavailablePluginButtonClicked(WKPageRef, WKPluginUnavailabilityReason, WKDictionaryRef, const void*)
+{
+    printf("MISSING PLUGIN BUTTON PRESSED\n");
+}
+
 void TestController::decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKURLRequestRef, WKFramePolicyListenerRef listener, WKTypeRef, const void* clientInfo)
 {
     static_cast<TestController*>(const_cast<void*>(clientInfo))->decidePolicyForNavigationAction(listener);
diff --git a/Tools/WebKitTestRunner/TestController.h b/Tools/WebKitTestRunner/TestController.h
index 56c3c47..0f65c9f 100644
--- a/Tools/WebKitTestRunner/TestController.h
+++ b/Tools/WebKitTestRunner/TestController.h
@@ -60,10 +60,12 @@
     void ensureViewSupportsOptions(WKDictionaryRef options);
     
     // Runs the run loop until `done` is true or the timeout elapses.
-    enum TimeoutDuration { ShortTimeout, LongTimeout, NoTimeout };
+    enum TimeoutDuration { ShortTimeout, LongTimeout, NoTimeout, CustomTimeout };
     bool useWaitToDumpWatchdogTimer() { return m_useWaitToDumpWatchdogTimer; }
     void runUntil(bool& done, TimeoutDuration);
     void notifyDone();
+
+    int getCustomTimeout();
     
     bool beforeUnloadReturnValue() const { return m_beforeUnloadReturnValue; }
     void setBeforeUnloadReturnValue(bool value) { m_beforeUnloadReturnValue = value; }
@@ -79,10 +81,17 @@
     // Policy delegate.
     void setCustomPolicyDelegate(bool enabled, bool permissive);
 
+    // Page Visibility.
+    void setVisibilityState(WKPageVisibilityState, bool isInitialState);
+
     bool resetStateToConsistentValues();
 
     WorkQueueManager& workQueueManager() { return m_workQueueManager; }
 
+    void setHandlesAuthenticationChallenges(bool value) { m_handlesAuthenticationChallenges = value; }
+    void setAuthenticationUsername(String username) { m_authenticationUsername = username; }
+    void setAuthenticationPassword(String password) { m_authenticationPassword = password; }
+
 private:
     void initialize(int argc, const char* argv[]);
     void createWebViewWithOptions(WKDictionaryRef);
@@ -92,6 +101,7 @@
     bool runTest(const char* pathOrURL);
 
     void platformInitialize();
+    void platformDestroy();
     void platformInitializeContext();
     void platformRunUntil(bool& done, double timeout);
     void platformDidCommitLoadForFrame(WKPageRef, WKFrameRef);
@@ -106,6 +116,8 @@
     void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
     WKRetainPtr<WKTypeRef> didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
 
+    void didReceiveKeyDownMessageFromInjectedBundle(WKDictionaryRef messageBodyDictionary, bool synchronous);
+
     // WKPageLoaderClient
     static void didCommitLoadForFrame(WKPageRef, WKFrameRef, WKTypeRef userData, const void*);
     void didCommitLoadForFrame(WKPageRef, WKFrameRef);
@@ -119,6 +131,11 @@
     static void decidePolicyForNotificationPermissionRequest(WKPageRef, WKSecurityOriginRef, WKNotificationPermissionRequestRef, const void*);
     void decidePolicyForNotificationPermissionRequest(WKPageRef, WKSecurityOriginRef, WKNotificationPermissionRequestRef);
 
+    static void unavailablePluginButtonClicked(WKPageRef, WKPluginUnavailabilityReason, WKDictionaryRef, const void*);
+
+    static void didReceiveAuthenticationChallengeInFrame(WKPageRef, WKFrameRef, WKAuthenticationChallengeRef, const void *clientInfo);
+    void didReceiveAuthenticationChallengeInFrame(WKPageRef, WKFrameRef, WKAuthenticationChallengeRef);
+
     // WKPagePolicyClient
     static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKURLRequestRef, WKFramePolicyListenerRef, WKTypeRef, const void*);
     void decidePolicyForNavigationAction(WKFramePolicyListenerRef);
@@ -165,6 +182,8 @@
     bool m_useWaitToDumpWatchdogTimer;
     bool m_forceNoTimeout;
 
+    int m_timeout;
+
     bool m_didPrintWebProcessCrashedMessage;
     bool m_shouldExitWhenWebProcessCrashes;
     
@@ -178,10 +197,19 @@
     bool m_policyDelegateEnabled;
     bool m_policyDelegatePermissive;
 
+    bool m_handlesAuthenticationChallenges;
+    String m_authenticationUsername;
+    String m_authenticationPassword;
+
 #if PLATFORM(MAC) || PLATFORM(QT) || PLATFORM(GTK) || PLATFORM(EFL)
     OwnPtr<EventSenderProxy> m_eventSenderProxy;
 #endif
 
+#if PLATFORM(QT)
+    class RunLoop;
+    RunLoop* m_runLoop;
+#endif
+
     WorkQueueManager m_workQueueManager;
 };
 
diff --git a/Tools/WebKitTestRunner/TestInvocation.cpp b/Tools/WebKitTestRunner/TestInvocation.cpp
index ef17437..789eaa3 100644
--- a/Tools/WebKitTestRunner/TestInvocation.cpp
+++ b/Tools/WebKitTestRunner/TestInvocation.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Intel Corporation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -31,12 +32,14 @@
 #include "TestController.h"
 #include <climits>
 #include <cstdio>
-#include <WebKit2/WKDictionary.h>
 #include <WebKit2/WKContextPrivate.h>
+#include <WebKit2/WKData.h>
+#include <WebKit2/WKDictionary.h>
 #include <WebKit2/WKInspector.h>
 #include <WebKit2/WKRetainPtr.h>
 #include <wtf/OwnArrayPtr.h>
 #include <wtf/PassOwnArrayPtr.h>
+#include <wtf/PassOwnPtr.h>
 #include <wtf/text/CString.h>
 
 #if PLATFORM(MAC)
@@ -100,11 +103,12 @@
     : m_url(AdoptWK, createWKURL(pathOrURL.c_str()))
     , m_pathOrURL(pathOrURL)
     , m_dumpPixels(false)
+    , m_timeout(0)
     , m_gotInitialResponse(false)
     , m_gotFinalMessage(false)
     , m_gotRepaint(false)
     , m_error(false)
-    , m_webProcessIsUnrensponsive(false)
+    , m_webProcessIsUnresponsive(false)
 {
 }
 
@@ -118,6 +122,11 @@
     m_expectedPixelHash = expectedPixelHash;
 }
 
+void TestInvocation::setCustomTimeout(int timeout)
+{
+    m_timeout = timeout;
+}
+
 static const unsigned w3cSVGWidth = 480;
 static const unsigned w3cSVGHeight = 360;
 static const unsigned normalWidth = 800;
@@ -165,11 +174,41 @@
 #endif
 }
 
+static bool shouldUseFixedLayout(const char* pathOrURL)
+{
+#if ENABLE(CSS_DEVICE_ADAPTATION)
+    if (strstr(pathOrURL, "device-adapt/") || strstr(pathOrURL, "device-adapt\\"))
+        return true;
+#endif
+
+#if USE(TILED_BACKING_STORE) && PLATFORM(EFL)
+    if (strstr(pathOrURL, "sticky/") || strstr(pathOrURL, "sticky\\"))
+        return true;
+#endif
+    return false;
+
+    UNUSED_PARAM(pathOrURL);
+}
+
+static void updateLayoutType(const char* pathOrURL)
+{
+    WKRetainPtr<WKMutableDictionaryRef> viewOptions = adoptWK(WKMutableDictionaryCreate());
+    WKRetainPtr<WKStringRef> useFixedLayoutKey = adoptWK(WKStringCreateWithUTF8CString("UseFixedLayout"));
+    WKRetainPtr<WKBooleanRef> useFixedLayoutValue = adoptWK(WKBooleanCreate(shouldUseFixedLayout(pathOrURL)));
+    WKDictionaryAddItem(viewOptions.get(), useFixedLayoutKey.get(), useFixedLayoutValue.get());
+
+    TestController::shared().ensureViewSupportsOptions(viewOptions.get());
+}
+
 void TestInvocation::invoke()
 {
+    TestController::TimeoutDuration timeoutToUse = TestController::LongTimeout;
     sizeWebViewForCurrentTest(m_pathOrURL.c_str());
+    updateLayoutType(m_pathOrURL.c_str());
     updateTiledDrawingForCurrentTest(m_pathOrURL.c_str());
 
+    m_textOutput.clear();
+
     WKRetainPtr<WKStringRef> messageName = adoptWK(WKStringCreateWithUTF8CString("BeginTest"));
     WKRetainPtr<WKMutableDictionaryRef> beginTestMessageBody = adoptWK(WKMutableDictionaryCreate());
 
@@ -185,12 +224,16 @@
     WKRetainPtr<WKBooleanRef> useWaitToDumpWatchdogTimerValue = adoptWK(WKBooleanCreate(TestController::shared().useWaitToDumpWatchdogTimer()));
     WKDictionaryAddItem(beginTestMessageBody.get(), useWaitToDumpWatchdogTimerKey.get(), useWaitToDumpWatchdogTimerValue.get());
 
+    WKRetainPtr<WKStringRef> timeoutKey = adoptWK(WKStringCreateWithUTF8CString("Timeout"));
+    WKRetainPtr<WKUInt64Ref> timeoutValue = adoptWK(WKUInt64Create(m_timeout));
+    WKDictionaryAddItem(beginTestMessageBody.get(), timeoutKey.get(), timeoutValue.get());
+
     WKContextPostMessageToInjectedBundle(TestController::shared().context(), messageName.get(), beginTestMessageBody.get());
 
     TestController::shared().runUntil(m_gotInitialResponse, TestController::ShortTimeout);
     if (!m_gotInitialResponse) {
         m_errorMessage = "Timed out waiting for initial response from web process\n";
-        m_webProcessIsUnrensponsive = true;
+        m_webProcessIsUnresponsive = true;
         goto end;
     }
     if (m_error)
@@ -203,10 +246,16 @@
 
     WKPageLoadURL(TestController::shared().mainWebView()->page(), m_url.get());
 
-    TestController::shared().runUntil(m_gotFinalMessage, TestController::shared().useWaitToDumpWatchdogTimer() ? TestController::LongTimeout : TestController::NoTimeout);
+    if (TestController::shared().useWaitToDumpWatchdogTimer()) {
+        if (m_timeout > 0)
+            timeoutToUse = TestController::CustomTimeout;
+    } else
+        timeoutToUse = TestController::NoTimeout;
+    TestController::shared().runUntil(m_gotFinalMessage, timeoutToUse);
+
     if (!m_gotFinalMessage) {
         m_errorMessage = "Timed out waiting for final message from web process\n";
-        m_webProcessIsUnrensponsive = true;
+        m_webProcessIsUnresponsive = true;
         goto end;
     }
     if (m_error)
@@ -220,7 +269,7 @@
         WKInspectorClose(WKPageGetInspector(TestController::shared().mainWebView()->page()));
 #endif // ENABLE(INSPECTOR)
 
-    if (m_webProcessIsUnrensponsive)
+    if (m_webProcessIsUnresponsive)
         dumpWebProcessUnresponsiveness();
     else if (!TestController::shared().resetStateToConsistentValues()) {
         m_errorMessage = "Timed out loading about:blank before the next test";
@@ -261,13 +310,42 @@
 
 void TestInvocation::dumpResults()
 {
-    dump(toWTFString(m_textOutput.get()).utf8().data());
+    if (m_textOutput.length() || !m_audioResult)
+        dump(m_textOutput.toString().utf8().data());
+    else
+        dumpAudio(m_audioResult.get());
 
     if (m_dumpPixels && m_pixelResult)
         dumpPixelsAndCompareWithExpected(m_pixelResult.get(), m_repaintRects.get());
 
     fputs("#EOF\n", stdout);
     fflush(stdout);
+    fflush(stderr);
+}
+
+void TestInvocation::dumpAudio(WKDataRef audioData)
+{
+    size_t length = WKDataGetSize(audioData);
+    if (!length)
+        return;
+
+    const unsigned char* data = WKDataGetBytes(audioData);
+
+    printf("Content-Type: audio/wav\n");
+    printf("Content-Length: %lu\n", static_cast<unsigned long>(length));
+
+    const size_t bytesToWriteInOneChunk = 1 << 15;
+    size_t dataRemainingToWrite = length;
+    while (dataRemainingToWrite) {
+        size_t bytesToWriteInThisChunk = std::min(dataRemainingToWrite, bytesToWriteInOneChunk);
+        size_t bytesWritten = fwrite(data, 1, bytesToWriteInThisChunk, stdout);
+        if (bytesWritten != bytesToWriteInThisChunk)
+            break;
+        dataRemainingToWrite -= bytesWritten;
+        data += bytesWritten;
+    }
+    printf("#EOF\n");
+    fprintf(stderr, "#EOF\n");
 }
 
 bool TestInvocation::compareActualHashToExpectedAndDumpResults(const char actualHash[33])
@@ -313,9 +391,6 @@
         ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID());
         WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody);
 
-        WKRetainPtr<WKStringRef> textOutputKey(AdoptWK, WKStringCreateWithUTF8CString("TextOutput"));
-        m_textOutput = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, textOutputKey.get()));
-
         WKRetainPtr<WKStringRef> pixelResultKey = adoptWK(WKStringCreateWithUTF8CString("PixelResult"));
         m_pixelResult = static_cast<WKImageRef>(WKDictionaryGetItemForKey(messageBodyDictionary, pixelResultKey.get()));
         ASSERT(!m_pixelResult || m_dumpPixels);
@@ -323,11 +398,21 @@
         WKRetainPtr<WKStringRef> repaintRectsKey = adoptWK(WKStringCreateWithUTF8CString("RepaintRects"));
         m_repaintRects = static_cast<WKArrayRef>(WKDictionaryGetItemForKey(messageBodyDictionary, repaintRectsKey.get()));
 
+        WKRetainPtr<WKStringRef> audioResultKey =  adoptWK(WKStringCreateWithUTF8CString("AudioResult"));
+        m_audioResult = static_cast<WKDataRef>(WKDictionaryGetItemForKey(messageBodyDictionary, audioResultKey.get()));
+
         m_gotFinalMessage = true;
         TestController::shared().notifyDone();
         return;
     }
-    
+
+    if (WKStringIsEqualToUTF8CString(messageName, "TextOutput")) {
+        ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID());
+        WKStringRef textOutput = static_cast<WKStringRef>(messageBody);
+        m_textOutput.append(toWTFString(textOutput));
+        return;
+    }
+
     if (WKStringIsEqualToUTF8CString(messageName, "BeforeUnloadReturnValue")) {
         ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
         WKBooleanRef beforeUnloadReturnValue = static_cast<WKBooleanRef>(messageBody);
@@ -455,6 +540,22 @@
         return;
     }
 
+    if (WKStringIsEqualToUTF8CString(messageName, "SetVisibilityState")) {
+        ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID());
+        WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody);
+
+        WKRetainPtr<WKStringRef> visibilityStateKeyWK(AdoptWK, WKStringCreateWithUTF8CString("visibilityState"));
+        WKUInt64Ref visibilityStateWK = static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, visibilityStateKeyWK.get()));
+        WKPageVisibilityState visibilityState = static_cast<WKPageVisibilityState>(WKUInt64GetValue(visibilityStateWK));
+
+        WKRetainPtr<WKStringRef> isInitialKeyWK(AdoptWK, WKStringCreateWithUTF8CString("isInitialState"));
+        WKBooleanRef isInitialWK = static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(messageBodyDictionary, isInitialKeyWK.get()));
+        bool isInitialState = WKBooleanGetValue(isInitialWK);
+
+        TestController::shared().setVisibilityState(visibilityState, isInitialState);
+        return;
+    }
+
     if (WKStringIsEqualToUTF8CString(messageName, "ProcessWorkQueue")) {
         if (TestController::shared().workQueueManager().processWorkQueue()) {
             WKRetainPtr<WKStringRef> messageName = adoptWK(WKStringCreateWithUTF8CString("WorkQueueProcessedCallback"));
@@ -527,6 +628,27 @@
         return;
     }
 
+    if (WKStringIsEqualToUTF8CString(messageName, "SetHandlesAuthenticationChallenge")) {
+        ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
+        WKBooleanRef value = static_cast<WKBooleanRef>(messageBody);
+        TestController::shared().setHandlesAuthenticationChallenges(WKBooleanGetValue(value));
+        return;
+    }
+
+    if (WKStringIsEqualToUTF8CString(messageName, "SetAuthenticationUsername")) {
+        ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID());
+        WKStringRef username = static_cast<WKStringRef>(messageBody);
+        TestController::shared().setAuthenticationUsername(toWTFString(username));
+        return;
+    }
+
+    if (WKStringIsEqualToUTF8CString(messageName, "SetAuthenticationPassword")) {
+        ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID());
+        WKStringRef password = static_cast<WKStringRef>(messageBody);
+        TestController::shared().setAuthenticationPassword(toWTFString(password));
+        return;
+    }
+
     ASSERT_NOT_REACHED();
 }
 
@@ -549,4 +671,9 @@
     return 0;
 }
 
+void TestInvocation::outputText(const WTF::String& text)
+{
+    m_textOutput.append(text);
+}
+
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/TestInvocation.h b/Tools/WebKitTestRunner/TestInvocation.h
index c14b060..1ae7f33 100644
--- a/Tools/WebKitTestRunner/TestInvocation.h
+++ b/Tools/WebKitTestRunner/TestInvocation.h
@@ -29,6 +29,8 @@
 #include <string>
 #include <WebKit2/WKRetainPtr.h>
 #include <wtf/Noncopyable.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/text/StringBuilder.h>
 
 namespace WTR {
 
@@ -40,20 +42,23 @@
 
     void setIsPixelTest(const std::string& expectedPixelHash);
 
+    void setCustomTimeout(int duration);
+
     void invoke();
     void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
     WKRetainPtr<WKTypeRef> didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
 
     void dumpWebProcessUnresponsiveness();
+    void outputText(const WTF::String&);
 private:
     void dumpResults();
     static void dump(const char* textToStdout, const char* textToStderr = 0, bool seenError = false);
     void dumpPixelsAndCompareWithExpected(WKImageRef, WKArrayRef repaintRects);
+    void dumpAudio(WKDataRef);
     bool compareActualHashToExpectedAndDumpResults(const char[33]);
 
-#if PLATFORM(QT)
+#if PLATFORM(QT) || PLATFORM(EFL)
     static void forceRepaintDoneCallback(WKErrorRef, void* context);
-    void forceRepaintDone();
 #endif
     
     WKRetainPtr<WKURLRef> m_url;
@@ -62,17 +67,20 @@
     bool m_dumpPixels;
     std::string m_expectedPixelHash;
 
+    int m_timeout;
+
     // Invocation state
     bool m_gotInitialResponse;
     bool m_gotFinalMessage;
     bool m_gotRepaint;
     bool m_error;
 
-    WKRetainPtr<WKStringRef> m_textOutput;
+    StringBuilder m_textOutput;
+    WKRetainPtr<WKDataRef> m_audioResult;
     WKRetainPtr<WKImageRef> m_pixelResult;
     WKRetainPtr<WKArrayRef> m_repaintRects;
     std::string m_errorMessage;
-    bool m_webProcessIsUnrensponsive;
+    bool m_webProcessIsUnresponsive;
 
 };
 
diff --git a/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj b/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj
index 530347b..88bb732 100644
--- a/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj
+++ b/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj
@@ -221,9 +221,9 @@
 			buildActionMask = 2147483647;
 			files = (
 				BC7934A511906584005EA8E2 /* Cocoa.framework in Frameworks */,
-				BC7934AC1190658C005EA8E2 /* WebKit2.framework in Frameworks */,
 				BCDA2B9A1191051F00C3BC47 /* JavaScriptCore.framework in Frameworks */,
 				0F5169CB1445222D00E0A9D7 /* WebKit.framework in Frameworks */,
+				BC7934AC1190658C005EA8E2 /* WebKit2.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -232,10 +232,10 @@
 			buildActionMask = 2147483647;
 			files = (
 				BC25193E11D15D8B002EBC01 /* Cocoa.framework in Frameworks */,
-				BC25193F11D15D8B002EBC01 /* WebKit2.framework in Frameworks */,
 				BC25194011D15D8B002EBC01 /* JavaScriptCore.framework in Frameworks */,
 				A664BC7613A5F3A9009A7B25 /* libWebCoreTestSupport.dylib in Frameworks */,
 				0F5169CC1445222D00E0A9D7 /* WebKit.framework in Frameworks */,
+				BC25193F11D15D8B002EBC01 /* WebKit2.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -270,15 +270,15 @@
 				5322FB4413FDA0EA0041ABCC /* PixelDumpSupport.cpp */,
 				5322FB4513FDA0EA0041ABCC /* PixelDumpSupport.h */,
 				BC7934DD119066EC005EA8E2 /* PlatformWebView.h */,
-				BC79342F118F7F19005EA8E2 /* TestController.h */,
 				BC793430118F7F19005EA8E2 /* TestController.cpp */,
-				BCD7D2F611921278006DB7EE /* TestInvocation.h */,
+				BC79342F118F7F19005EA8E2 /* TestController.h */,
 				BCD7D2F711921278006DB7EE /* TestInvocation.cpp */,
+				BCD7D2F611921278006DB7EE /* TestInvocation.h */,
 				BC251A1711D16774002EBC01 /* WebKitTestRunnerPrefix.h */,
-				3110BE0F15BA011400D216AC /* WebNotificationProvider.h */,
 				3164C8EF15D1ADA100EF1FE0 /* WebNotificationProvider.cpp */,
-				4429FC611627089600F66D8B /* WorkQueueManager.h */,
+				3110BE0F15BA011400D216AC /* WebNotificationProvider.h */,
 				4429FC5E1627089600F66D8B /* WorkQueueManager.cpp */,
+				4429FC611627089600F66D8B /* WorkQueueManager.h */,
 			);
 			name = TestRunner;
 			sourceTree = "<group>";
@@ -287,11 +287,11 @@
 			isa = PBXGroup;
 			children = (
 				BC7934A411906584005EA8E2 /* Cocoa.framework */,
-				BC7934AB1190658C005EA8E2 /* WebKit2.framework */,
-				0F5169CA1445222D00E0A9D7 /* WebKit.framework */,
 				BCDA2B991191051F00C3BC47 /* JavaScriptCore.framework */,
-				4181731B138AD39D0057AAA4 /* WebCoreTestSupport.h */,
 				41230E16138C78BF00BCCFCA /* libWebCoreTestSupport.dylib */,
+				4181731B138AD39D0057AAA4 /* WebCoreTestSupport.h */,
+				0F5169CA1445222D00E0A9D7 /* WebKit.framework */,
+				BC7934AB1190658C005EA8E2 /* WebKit2.framework */,
 			);
 			name = "External Frameworks and Libraries";
 			sourceTree = "<group>";
@@ -308,21 +308,21 @@
 		29A8FCE0145F035D009045A6 /* Accessibility */ = {
 			isa = PBXGroup;
 			children = (
+				29210EAB144CACB200835BB6 /* AccessibilityCommonMac.mm */,
+				29210EA2144CAAA500835BB5 /* AccessibilityController.cpp */,
+				29210EA3144CAAA500835BB5 /* AccessibilityController.h */,
 				8034C6611487636400AC32E9 /* AccessibilityControllerMac.mm */,
 				8097338814874A5A008156D9 /* AccessibilityNotificationHandler.h */,
 				8097338914874A5A008156D9 /* AccessibilityNotificationHandler.mm */,
-				29210EA2144CAAA500835BB5 /* AccessibilityController.cpp */,
-				29210EA3144CAAA500835BB5 /* AccessibilityController.h */,
-				29210EA9144CACB200835BB5 /* AccessibilityUIElement.cpp */,
-				29210EAA144CACB200835BB5 /* AccessibilityUIElement.h */,
-				29210EAB144CACB200835BB5 /* AccessibilityUIElementMac.mm */,
-				29210EAB144CACB200835BB6 /* AccessibilityCommonMac.mm */,
 				29210EB1144CACD400835BB5 /* AccessibilityTextMarker.cpp */,
 				29210EB2144CACD400835BB5 /* AccessibilityTextMarker.h */,
 				29210EB3144CACD400835BB5 /* AccessibilityTextMarkerMac.mm */,
 				29A8FCE1145F037B009045A6 /* AccessibilityTextMarkerRange.cpp */,
 				29A8FCDF145F0358009045A6 /* AccessibilityTextMarkerRange.h */,
 				29A8FCE4145F0464009045A6 /* AccessibilityTextMarkerRangeMac.mm */,
+				29210EA9144CACB200835BB5 /* AccessibilityUIElement.cpp */,
+				29210EAA144CACB200835BB5 /* AccessibilityUIElement.h */,
+				29210EAB144CACB200835BB5 /* AccessibilityUIElementMac.mm */,
 			);
 			name = Accessibility;
 			sourceTree = "<group>";
@@ -357,9 +357,9 @@
 		BC25183511D1571D002EBC01 /* InjectedBundle */ = {
 			isa = PBXGroup;
 			children = (
-				BC952D3A11F3BF1F003398B4 /* Derived Sources */,
 				BC952C0A11F3B939003398B4 /* Bindings */,
 				BC14E4E0120E02F900826C0C /* Controllers */,
+				BC952D3A11F3BF1F003398B4 /* Derived Sources */,
 				65EB859E11EC67CC0034D300 /* mac */,
 				65EB859D11EC67CC0034D300 /* ActivateFonts.h */,
 				BCC997A011D3C8F60017BCA2 /* InjectedBundle.cpp */,
@@ -374,8 +374,9 @@
 		BC25194411D15DBE002EBC01 /* Resources */ = {
 			isa = PBXGroup;
 			children = (
-				BC25186311D15D54002EBC01 /* InjectedBundle-Info.plist */,
 				6510A77711EC643800410867 /* AHEM____.TTF */,
+				BC25186311D15D54002EBC01 /* InjectedBundle-Info.plist */,
+				8CCDA822151A570B0003F937 /* SampleFont.sfont */,
 				6510A77911EC643800410867 /* WebKitWeightWatcher100.ttf */,
 				6510A77A11EC643800410867 /* WebKitWeightWatcher200.ttf */,
 				6510A77B11EC643800410867 /* WebKitWeightWatcher300.ttf */,
@@ -385,7 +386,6 @@
 				6510A77F11EC643800410867 /* WebKitWeightWatcher700.ttf */,
 				6510A78011EC643800410867 /* WebKitWeightWatcher800.ttf */,
 				6510A78111EC643800410867 /* WebKitWeightWatcher900.ttf */,
-				8CCDA822151A570B0003F937 /* SampleFont.sfont */,
 			);
 			name = Resources;
 			sourceTree = "<group>";
@@ -423,16 +423,16 @@
 		BC952C0A11F3B939003398B4 /* Bindings */ = {
 			isa = PBXGroup;
 			children = (
-				BC952ED311F3C318003398B4 /* CodeGeneratorTestRunner.pm */,
-				BC952C0E11F3B97B003398B4 /* JSWrappable.h */,
-				BC952C0C11F3B965003398B4 /* JSWrapper.cpp */,
-				BC952C0B11F3B965003398B4 /* JSWrapper.h */,
 				29210EA8144CAB8800835BB5 /* AccessibilityController.idl */,
 				29A8FCC5145B93C6009045A6 /* AccessibilityTextMarker.idl */,
 				29A8FCD2145EF8F2009045A6 /* AccessibilityTextMarkerRange.idl */,
 				29210EDC144CD56E00835BB5 /* AccessibilityUIElement.idl */,
+				BC952ED311F3C318003398B4 /* CodeGeneratorTestRunner.pm */,
 				BC8FD8CB120E52B000F3E71A /* EventSendingController.idl */,
 				BC14E4E1120E032000826C0C /* GCController.idl */,
+				BC952C0E11F3B97B003398B4 /* JSWrappable.h */,
+				BC952C0C11F3B965003398B4 /* JSWrapper.cpp */,
+				BC952C0B11F3B965003398B4 /* JSWrapper.h */,
 				BC952ED211F3C29F003398B4 /* TestRunner.idl */,
 				5664A49614326377008881BE /* TextInputController.idl */,
 			);
@@ -542,6 +542,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				6510A78211EC643800410867 /* AHEM____.TTF in Resources */,
+				8CCDA823151A570B0003F937 /* SampleFont.sfont in Resources */,
 				6510A78411EC643800410867 /* WebKitWeightWatcher100.ttf in Resources */,
 				6510A78511EC643800410867 /* WebKitWeightWatcher200.ttf in Resources */,
 				6510A78611EC643800410867 /* WebKitWeightWatcher300.ttf in Resources */,
@@ -551,7 +552,6 @@
 				6510A78A11EC643800410867 /* WebKitWeightWatcher700.ttf in Resources */,
 				6510A78B11EC643800410867 /* WebKitWeightWatcher800.ttf in Resources */,
 				6510A78C11EC643800410867 /* WebKitWeightWatcher900.ttf in Resources */,
-				8CCDA823151A570B0003F937 /* SampleFont.sfont in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -579,16 +579,16 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				BC793400118F7C84005EA8E2 /* main.mm in Sources */,
 				5322FB4313FDA0CD0041ABCC /* CyclicRedundancyCheck.cpp in Sources */,
+				5670B8281386FCA5002EB355 /* EventSenderProxy.mm in Sources */,
 				26D758E7160BECDD00268472 /* GeolocationProviderMock.cpp in Sources */,
+				BC793400118F7C84005EA8E2 /* main.mm in Sources */,
 				5322FB4613FDA0EA0041ABCC /* PixelDumpSupport.cpp in Sources */,
 				BC7934E811906846005EA8E2 /* PlatformWebViewMac.mm in Sources */,
 				BC793431118F7F19005EA8E2 /* TestController.cpp in Sources */,
 				BC8C795C11D2785D004535A1 /* TestControllerMac.mm in Sources */,
 				BCD7D2F811921278006DB7EE /* TestInvocation.cpp in Sources */,
 				BC9192051333E4F8003011DC /* TestInvocationCG.cpp in Sources */,
-				5670B8281386FCA5002EB355 /* EventSenderProxy.mm in Sources */,
 				3164C8F015D1ADA100EF1FE0 /* WebNotificationProvider.cpp in Sources */,
 				4429FC5F1627089600F66D8B /* WorkQueueManager.cpp in Sources */,
 			);
@@ -598,36 +598,36 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				BC251A3E11D16831002EBC01 /* InjectedBundleMain.cpp in Sources */,
-				BCC997A411D3C8F60017BCA2 /* InjectedBundle.cpp in Sources */,
-				BCC997A511D3C8F60017BCA2 /* InjectedBundlePage.cpp in Sources */,
-				BCC9981811D3F51E0017BCA2 /* TestRunner.cpp in Sources */,
-				65EB85A011EC67CC0034D300 /* ActivateFonts.mm in Sources */,
-				BC952C0D11F3B965003398B4 /* JSWrapper.cpp in Sources */,
-				BC952F1F11F3C652003398B4 /* JSTestRunner.cpp in Sources */,
-				BC14E4DB120E02D000826C0C /* GCController.cpp in Sources */,
-				BC14E4EA120E03D800826C0C /* JSGCController.cpp in Sources */,
-				BC8DAD7B1316D91000EC96FC /* InjectedBundleMac.mm in Sources */,
-				BC8FD8CA120E527F00F3E71A /* EventSendingController.cpp in Sources */,
-				BC8FD8D2120E545B00F3E71A /* JSEventSendingController.cpp in Sources */,
-				C0CE720B1247C93300BC0EC4 /* TestRunnerMac.mm in Sources */,
-				5664A49A14326384008881BE /* TextInputController.cpp in Sources */,
-				5641E2D014335E95008307E5 /* JSTextInputController.cpp in Sources */,
-				29210EAE144CACB700835BB5 /* AccessibilityUIElement.cpp in Sources */,
+				29210EDA144CC3EA00835BB6 /* AccessibilityCommonMac.mm in Sources */,
 				29210EB0144CACBD00835BB5 /* AccessibilityController.cpp in Sources */,
+				8034C6621487636400AC32E9 /* AccessibilityControllerMac.mm in Sources */,
+				8097338A14874A5A008156D9 /* AccessibilityNotificationHandler.mm in Sources */,
 				29210EB4144CACD500835BB5 /* AccessibilityTextMarker.cpp in Sources */,
 				29210EB5144CACD500835BB5 /* AccessibilityTextMarkerMac.mm in Sources */,
-				29210EDA144CC3EA00835BB5 /* AccessibilityUIElementMac.mm in Sources */,
-				29210EDA144CC3EA00835BB6 /* AccessibilityCommonMac.mm in Sources */,
-				29210EDB144CD47900835BB5 /* JSAccessibilityController.cpp in Sources */,
-				29210EE1144CDB2600835BB5 /* JSAccessibilityUIElement.cpp in Sources */,
-				29A8FCCB145EF02E009045A6 /* JSAccessibilityTextMarker.cpp in Sources */,
-				29A8FCDD145F0337009045A6 /* JSAccessibilityTextMarkerRange.cpp in Sources */,
 				29A8FCE2145F037B009045A6 /* AccessibilityTextMarkerRange.cpp in Sources */,
 				29A8FCE5145F0464009045A6 /* AccessibilityTextMarkerRangeMac.mm in Sources */,
-				8097338A14874A5A008156D9 /* AccessibilityNotificationHandler.mm in Sources */,
-				8034C6621487636400AC32E9 /* AccessibilityControllerMac.mm in Sources */,
+				29210EAE144CACB700835BB5 /* AccessibilityUIElement.cpp in Sources */,
+				29210EDA144CC3EA00835BB5 /* AccessibilityUIElementMac.mm in Sources */,
+				65EB85A011EC67CC0034D300 /* ActivateFonts.mm in Sources */,
+				BC8FD8CA120E527F00F3E71A /* EventSendingController.cpp in Sources */,
+				BC14E4DB120E02D000826C0C /* GCController.cpp in Sources */,
+				BCC997A411D3C8F60017BCA2 /* InjectedBundle.cpp in Sources */,
+				BC8DAD7B1316D91000EC96FC /* InjectedBundleMac.mm in Sources */,
+				BC251A3E11D16831002EBC01 /* InjectedBundleMain.cpp in Sources */,
+				BCC997A511D3C8F60017BCA2 /* InjectedBundlePage.cpp in Sources */,
 				0FAF67EF160D6C100077CB2B /* InjectedBundlePageMac.mm in Sources */,
+				29210EDB144CD47900835BB5 /* JSAccessibilityController.cpp in Sources */,
+				29A8FCCB145EF02E009045A6 /* JSAccessibilityTextMarker.cpp in Sources */,
+				29A8FCDD145F0337009045A6 /* JSAccessibilityTextMarkerRange.cpp in Sources */,
+				29210EE1144CDB2600835BB5 /* JSAccessibilityUIElement.cpp in Sources */,
+				BC8FD8D2120E545B00F3E71A /* JSEventSendingController.cpp in Sources */,
+				BC14E4EA120E03D800826C0C /* JSGCController.cpp in Sources */,
+				BC952F1F11F3C652003398B4 /* JSTestRunner.cpp in Sources */,
+				5641E2D014335E95008307E5 /* JSTextInputController.cpp in Sources */,
+				BC952C0D11F3B965003398B4 /* JSWrapper.cpp in Sources */,
+				BCC9981811D3F51E0017BCA2 /* TestRunner.cpp in Sources */,
+				C0CE720B1247C93300BC0EC4 /* TestRunnerMac.mm in Sources */,
+				5664A49A14326384008881BE /* TextInputController.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Tools/WebKitTestRunner/cairo/TestInvocationCairo.cpp b/Tools/WebKitTestRunner/cairo/TestInvocationCairo.cpp
index 498be14..eb3a0d3 100644
--- a/Tools/WebKitTestRunner/cairo/TestInvocationCairo.cpp
+++ b/Tools/WebKitTestRunner/cairo/TestInvocationCairo.cpp
@@ -30,6 +30,8 @@
 #include "TestInvocation.h"
 
 #include "PixelDumpSupport.h"
+#include "PlatformWebView.h"
+#include "TestController.h"
 #include <WebKit2/WKImageCairo.h>
 #include <cairo/cairo.h>
 #include <cstdio>
@@ -61,7 +63,7 @@
         hash[8], hash[9], hash[10], hash[11], hash[12], hash[13], hash[14], hash[15]);
 }
 
-static cairo_status_t writeFunction(void* closure, const unsigned char* data, unsigned int length)
+static cairo_status_t writeFunction(void* closure, const unsigned char* data, unsigned length)
 {
     Vector<unsigned char>* in = reinterpret_cast<Vector<unsigned char>*>(closure);
     in->append(data, length);
@@ -104,9 +106,37 @@
     cairo_destroy(context);
 }
 
+#if PLATFORM(EFL)
+void TestInvocation::forceRepaintDoneCallback(WKErrorRef, void *context)
+{
+    static_cast<TestInvocation*>(context)->m_gotRepaint = true;
+    TestController::shared().notifyDone();
+}
+#endif
+
 void TestInvocation::dumpPixelsAndCompareWithExpected(WKImageRef wkImage, WKArrayRef repaintRects)
 {
+#if USE(ACCELERATED_COMPOSITING) && PLATFORM(EFL)
+    UNUSED_PARAM(wkImage);
+
+    cairo_surface_t* surface;
+
+    WKPageRef page = TestController::shared().mainWebView()->page();
+    WKPageForceRepaint(page, this, &forceRepaintDoneCallback);
+
+    TestController::shared().runUntil(m_gotRepaint, TestController::ShortTimeout);
+
+    if (!m_gotRepaint) {
+        m_error = true;
+        m_errorMessage = "Timed out waiting for repaint\n";
+        m_webProcessIsUnresponsive = true;
+        return;
+    }
+
+    surface = WKImageCreateCairoSurface(TestController::shared().mainWebView()->windowSnapshotImage().get());
+#else
     cairo_surface_t* surface = WKImageCreateCairoSurface(wkImage);
+#endif
 
     if (repaintRects)
         paintRepaintRectOverlay(surface, repaintRects);
diff --git a/Tools/WebKitTestRunner/cg/TestInvocationCG.cpp b/Tools/WebKitTestRunner/cg/TestInvocationCG.cpp
index 5b68dac..99355f0 100644
--- a/Tools/WebKitTestRunner/cg/TestInvocationCG.cpp
+++ b/Tools/WebKitTestRunner/cg/TestInvocationCG.cpp
@@ -165,7 +165,7 @@
 
     RetainPtr<CGContextRef> context;
     if (windowSnapshot)
-        context.adoptCF(createCGContextFromImage(windowSnapshot.get(), FlipGraphicsContext));
+        context.adoptCF(createCGContextFromImage(windowSnapshot.get(), DontFlipGraphicsContext));
     else
         context.adoptCF(createCGContextFromImage(image));
 
diff --git a/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp b/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp
index f2829a9..424974d 100644
--- a/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp
+++ b/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp
@@ -314,14 +314,16 @@
 
 void EventSenderProxy::dispatchEvent(const WTREvent& event)
 {
+    Evas* evas = evas_object_evas_get(m_testController->mainWebView()->platformView());
+
     if (event.eventType == WTREventTypeMouseDown)
-        dispatchMouseDownEvent(ecore_evas_get(m_testController->mainWebView()->platformWindow()), event.button, event.modifiers, m_clickCount);
+        dispatchMouseDownEvent(evas, event.button, event.modifiers, m_clickCount);
     else if (event.eventType == WTREventTypeMouseUp)
-        dispatchMouseUpEvent(ecore_evas_get(m_testController->mainWebView()->platformWindow()), event.button, event.modifiers);
+        dispatchMouseUpEvent(evas, event.button, event.modifiers);
     else if (event.eventType == WTREventTypeMouseMove)
-        dispatchMouseMoveEvent(ecore_evas_get(m_testController->mainWebView()->platformWindow()), static_cast<int>(m_position.x), static_cast<int>(m_position.y));
+        dispatchMouseMoveEvent(evas, static_cast<int>(m_position.x), static_cast<int>(m_position.y));
     else if (event.eventType == WTREventTypeMouseScrollBy)
-        dispatchMouseScrollByEvent(ecore_evas_get(m_testController->mainWebView()->platformWindow()), event.horizontal, event.vertical);
+        dispatchMouseScrollByEvent(evas, event.horizontal, event.vertical);
 }
 
 void EventSenderProxy::replaySavedEvents()
@@ -412,7 +414,7 @@
     if ((strlen(keyName) == 1) && (keyName[0] >= 'A' && keyName[0] <= 'Z'))
         wkModifiers |= kWKEventModifiersShiftKey;
 
-    Evas* evas = ecore_evas_get(m_testController->mainWebView()->platformWindow());
+    Evas* evas = evas_object_evas_get(m_testController->mainWebView()->platformView());
 
     int eventIndex = 0;
     // Mimic the emacs ctrl-o binding by inserting a paragraph
@@ -490,12 +492,14 @@
 
 void EventSenderProxy::setTouchModifier(WKEventModifiers modifier, bool enable)
 {
+    Evas_Object* ewkView = m_testController->mainWebView()->platformView();
+
     for (unsigned index = 0; index < (sizeof(modifierNames) / sizeof(char*)); ++index) {
         if (modifier & (1 << index)) {
             if (enable)
-                evas_key_modifier_on(evas_object_evas_get(m_testController->mainWebView()->platformView()), modifierNames[index]);
+                evas_key_modifier_on(evas_object_evas_get(ewkView), modifierNames[index]);
             else
-                evas_key_modifier_off(evas_object_evas_get(m_testController->mainWebView()->platformView()), modifierNames[index]);
+                evas_key_modifier_off(evas_object_evas_get(ewkView), modifierNames[index]);
         }
     }
 }
diff --git a/Tools/WebKitTestRunner/efl/PlatformWebViewEfl.cpp b/Tools/WebKitTestRunner/efl/PlatformWebViewEfl.cpp
index cb957d5..bda1b08 100644
--- a/Tools/WebKitTestRunner/efl/PlatformWebViewEfl.cpp
+++ b/Tools/WebKitTestRunner/efl/PlatformWebViewEfl.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2012 Samsung Electronics
+ * Copyright (C) 2012 Intel Corporation. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -18,11 +19,15 @@
  */
 
 #include "config.h"
+#include "ewk_view_private.h"
 #include "PlatformWebView.h"
 
 #include "EWebKit2.h"
 #include "WebKit2/WKAPICast.h"
 #include <Ecore_Evas.h>
+#include <WebCore/RefPtrCairo.h>
+#include <WebKit2/WKImageCairo.h>
+#include <cairo.h>
 
 using namespace WebKit;
 
@@ -30,11 +35,15 @@
 
 static Ecore_Evas* initEcoreEvas()
 {
-    const char* engine = 0;
+    Ecore_Evas* ecoreEvas = 0;
 #if defined(WTF_USE_ACCELERATED_COMPOSITING) && defined(HAVE_ECORE_X)
-    engine = "opengl_x11";
+    const char* engine = "opengl_x11";
+    ecoreEvas = ecore_evas_new(engine, 0, 0, 800, 600, 0);
+    // Graceful fallback to software rendering if evas_gl engine is not available.
+    if (!ecoreEvas)
 #endif
-    Ecore_Evas* ecoreEvas = ecore_evas_new(engine, 0, 0, 800, 600, 0);
+    ecoreEvas = ecore_evas_new(0, 0, 0, 800, 600, 0);
+
     if (!ecoreEvas)
         return 0;
 
@@ -44,11 +53,20 @@
     return ecoreEvas;
 }
 
-PlatformWebView::PlatformWebView(WKContextRef context, WKPageGroupRef pageGroup, WKDictionaryRef /*options*/)
+PlatformWebView::PlatformWebView(WKContextRef context, WKPageGroupRef pageGroup, WKDictionaryRef options)
+    : m_options(options)
 {
+    WKRetainPtr<WKStringRef> useFixedLayoutKey(AdoptWK, WKStringCreateWithUTF8CString("UseFixedLayout"));
+    m_usingFixedLayout = options ? WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useFixedLayoutKey.get()))) : false;
+
     m_window = initEcoreEvas();
-    Evas* evas = ecore_evas_get(m_window);
-    m_view = toImpl(WKViewCreate(evas, context, pageGroup));
+
+    m_view = EWKViewCreate(context, pageGroup, ecore_evas_get(m_window), /* smart */ 0);
+
+    WKPageSetUseFixedLayout(WKViewGetPage(EWKViewGetWKView(m_view)), m_usingFixedLayout);
+
+    if (m_usingFixedLayout)
+        resizeTo(800, 600);
 
     ewk_view_theme_set(m_view, THEME_DIR"/default.edj");
     m_windowIsKey = false;
@@ -58,6 +76,7 @@
 PlatformWebView::~PlatformWebView()
 {
     evas_object_del(m_view);
+
     ecore_evas_free(m_window);
 }
 
@@ -68,7 +87,7 @@
 
 WKPageRef PlatformWebView::page()
 {
-    return WKViewGetPage(toAPI(m_view));
+    return WKViewGetPage(EWKViewGetWKView(m_view));
 }
 
 void PlatformWebView::focus()
@@ -85,16 +104,14 @@
 {
     int x, y, width, height;
 
-    Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_view));
-    ecore_evas_request_geometry_get(ee, &x, &y, &width, &height);
+    ecore_evas_request_geometry_get(m_window, &x, &y, &width, &height);
 
     return WKRectMake(x, y, width, height);
 }
 
 void PlatformWebView::setWindowFrame(WKRect frame)
 {
-    Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_view));
-    ecore_evas_move_resize(ee, frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
+    ecore_evas_move_resize(m_window, frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
 }
 
 void PlatformWebView::addChromeInputField()
@@ -111,9 +128,23 @@
 
 WKRetainPtr<WKImageRef> PlatformWebView::windowSnapshotImage()
 {
-    // FIXME: implement to capture pixels in the UI process,
-    // which may be necessary to capture things like 3D transforms.
-    return 0;
+    int width;
+    int height;
+    ecore_evas_geometry_get(m_window, 0, 0, &width, &height);
+    ASSERT(width > 0 && height > 0);
+
+    return adoptWK(WKViewCreateSnapshot(EWKViewGetWKView(m_view)));
+}
+
+bool PlatformWebView::viewSupportsOptions(WKDictionaryRef options) const
+{
+    WKRetainPtr<WKStringRef> useFixedLayoutKey(AdoptWK, WKStringCreateWithUTF8CString("UseFixedLayout"));
+
+    return m_usingFixedLayout == (options ? WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useFixedLayoutKey.get()))) : false);
+}
+
+void PlatformWebView::didInitializeClients()
+{
 }
 
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/efl/TestControllerEfl.cpp b/Tools/WebKitTestRunner/efl/TestControllerEfl.cpp
index f68351d..c69b3c9 100644
--- a/Tools/WebKitTestRunner/efl/TestControllerEfl.cpp
+++ b/Tools/WebKitTestRunner/efl/TestControllerEfl.cpp
@@ -57,14 +57,17 @@
     }
 }
 
+void TestController::platformDestroy()
+{
+}
+
 void TestController::platformRunUntil(bool& condition, double timeout)
 {
     if (timeout == m_noTimeout) {
         // Never timeout if we are debugging or not meant to timeout.
-        while (!condition) {
+        while (!condition)
             ecore_main_loop_iterate();
-            sleep(1);
-        }
+
         return;
     }
     timer = ecore_timer_loop_add(timeout, timerFired, 0);
diff --git a/Tools/WebKitTestRunner/efl/main.cpp b/Tools/WebKitTestRunner/efl/main.cpp
index b02ff35..6b50669 100644
--- a/Tools/WebKitTestRunner/efl/main.cpp
+++ b/Tools/WebKitTestRunner/efl/main.cpp
@@ -45,8 +45,12 @@
     if (!ewk_init())
         return 1;
 
-    // Prefer the not installed web and plugin processes.
-    WTR::TestController controller(argc, const_cast<const char**>(argv));
+    {
+        // Test controller has own ptr containing WebView and WebView must be deleted
+        // before its evas object is deleted. Call of ewk_shutdown() leads to evas objects deletion.
+
+        WTR::TestController controller(argc, const_cast<const char**>(argv));
+    }
 
     ewk_shutdown();
 
diff --git a/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp b/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp
index bbef04e..75052ff 100644
--- a/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp
+++ b/Tools/WebKitTestRunner/gtk/PlatformWebViewGtk.cpp
@@ -33,10 +33,11 @@
 
 namespace WTR {
 
-PlatformWebView::PlatformWebView(WKContextRef context, WKPageGroupRef pageGroup, WKDictionaryRef /*options*/)
+PlatformWebView::PlatformWebView(WKContextRef context, WKPageGroupRef pageGroup, WKDictionaryRef options)
     : m_view(WKViewCreate(context, pageGroup))
     , m_window(gtk_window_new(GTK_WINDOW_POPUP))
     , m_windowIsKey(true)
+    , m_options(options)
 {
     gtk_container_add(GTK_CONTAINER(m_window), GTK_WIDGET(m_view));
 
@@ -56,7 +57,7 @@
 
 void PlatformWebView::resizeTo(unsigned width, unsigned height)
 {
-    GtkAllocation size = { 0, 0, width, height };
+    GtkAllocation size = { 0, 0, static_cast<int>(width), static_cast<int>(height) };
     gtk_widget_size_allocate(m_window, &size);
     gtk_window_resize(GTK_WINDOW(m_window), width, height);
 
@@ -120,5 +121,9 @@
     return 0;
 }
 
+void PlatformWebView::didInitializeClients()
+{
+}
+
 } // namespace WTR
 
diff --git a/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp b/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp
index 90bdb72..4aeb65f 100644
--- a/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp
+++ b/Tools/WebKitTestRunner/gtk/TestControllerGtk.cpp
@@ -54,6 +54,10 @@
 {
 }
 
+void TestController::platformDestroy()
+{
+}
+
 static gboolean timeoutCallback(gpointer)
 {
     fprintf(stderr, "FAIL: TestControllerRunLoop timed out.\n");
diff --git a/Tools/WebKitTestRunner/mac/EventSenderProxy.mm b/Tools/WebKitTestRunner/mac/EventSenderProxy.mm
index ece5b52..87c1cf7 100644
--- a/Tools/WebKitTestRunner/mac/EventSenderProxy.mm
+++ b/Tools/WebKitTestRunner/mac/EventSenderProxy.mm
@@ -49,6 +49,13 @@
     NoMouseButton = -1
 };
 
+struct KeyMappingEntry {
+    int macKeyCode;
+    int macNumpadKeyCode;
+    unichar character;
+    NSString* characterName;
+};
+
 static NSEventType eventTypeForMouseButtonAndAction(int button, MouseAction action)
 {
     switch (button) {
@@ -324,14 +331,6 @@
         keyCode = 0x4C;
     else if ([character isEqualToString:@"\x8"])
         keyCode = 0x33;
-    else if ([character isEqualToString:@"7"])
-        keyCode = 0x1A;
-    else if ([character isEqualToString:@"5"])
-        keyCode = 0x17;
-    else if ([character isEqualToString:@"9"])
-        keyCode = 0x19;
-    else if ([character isEqualToString:@"0"])
-        keyCode = 0x1D;
     else if ([character isEqualToString:@"a"])
         keyCode = 0x00;
     else if ([character isEqualToString:@"b"])
@@ -341,6 +340,38 @@
     else if ([character isEqualToString:@"e"])
         keyCode = 0x0E;
 
+    KeyMappingEntry table[] = {
+        {0x2F, 0x41, '.', nil},
+        {0,    0x43, '*', nil},
+        {0,    0x45, '+', nil},
+        {0,    0x47, NSClearLineFunctionKey, @"clear"},
+        {0x2C, 0x4B, '/', nil},
+        {0,    0x4C, 3, @"enter" },
+        {0x1B, 0x4E, '-', nil},
+        {0x18, 0x51, '=', nil},
+        {0x1D, 0x52, '0', nil},
+        {0x12, 0x53, '1', nil},
+        {0x13, 0x54, '2', nil},
+        {0x14, 0x55, '3', nil},
+        {0x15, 0x56, '4', nil},
+        {0x17, 0x57, '5', nil},
+        {0x16, 0x58, '6', nil},
+        {0x1A, 0x59, '7', nil},
+        {0x1C, 0x5B, '8', nil},
+        {0x19, 0x5C, '9', nil},
+    };
+    for (unsigned i = 0; i < WTF_ARRAY_LENGTH(table); ++i) {
+        NSString* currentCharacterString = [NSString stringWithCharacters:&table[i].character length:1];
+        if ([character isEqualToString:currentCharacterString] || [character isEqualToString:table[i].characterName]) {
+            if (keyLocation == 0x03 /*DOM_KEY_LOCATION_NUMPAD*/)
+                keyCode = table[i].macNumpadKeyCode;
+            else
+                keyCode = table[i].macKeyCode;
+            eventCharacter = currentCharacterString;
+            break;
+        }
+    }
+
     NSString *charactersIgnoringModifiers = eventCharacter;
 
     int modifierFlags = 0;
diff --git a/Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm b/Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm
index 4c7b15f..b55d32c 100644
--- a/Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm
+++ b/Tools/WebKitTestRunner/mac/PlatformWebViewMac.mm
@@ -101,26 +101,42 @@
     return NSMakeRect(_fakeOrigin.x, _fakeOrigin.y, currentFrame.size.width, currentFrame.size.height);
 }
 
+- (CGFloat)backingScaleFactor
+{
+    return 1;
+}
+
+@end
+
+@interface NSWindow (Details)
+
+- (void)_setWindowResolution:(CGFloat)resolution displayIfChanged:(BOOL)displayIfChanged;
+
 @end
 
 namespace WTR {
 
 PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef, WKDictionaryRef options)
     : m_windowIsKey(true)
+    , m_options(options)
 {
     WKRetainPtr<WKStringRef> useTiledDrawingKey(AdoptWK, WKStringCreateWithUTF8CString("TiledDrawing"));
-    bool useTiledDrawing = options ? WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useTiledDrawingKey.get()))) : false;
+    WKTypeRef useTiledDrawingValue = options ? WKDictionaryGetItemForKey(options, useTiledDrawingKey.get()) : NULL;
+    bool useTiledDrawing = useTiledDrawingValue && WKBooleanGetValue(static_cast<WKBooleanRef>(useTiledDrawingValue));
 
     NSRect rect = NSMakeRect(0, 0, 800, 600);
     m_view = [[TestRunnerWKView alloc] initWithFrame:rect contextRef:contextRef pageGroupRef:pageGroupRef useTiledDrawing:useTiledDrawing];
+    [m_view setWindowOcclusionDetectionEnabled:NO];
 
     NSRect windowRect = NSOffsetRect(rect, -10000, [(NSScreen *)[[NSScreen screens] objectAtIndex:0] frame].size.height - rect.size.height + 10000);
     m_window = [[WebKitTestRunnerWindow alloc] initWithContentRect:windowRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES];
     m_window.platformWebView = this;
     [m_window setColorSpace:[[NSScreen mainScreen] colorSpace]];
+    [m_window setCollectionBehavior:NSWindowCollectionBehaviorStationary];
     [[m_window contentView] addSubview:m_view];
     [m_window orderBack:nil];
     [m_window setReleasedWhenClosed:NO];
+    [m_window _setWindowResolution:1 displayIfChanged:YES];
 }
 
 void PlatformWebView::resizeTo(unsigned width, unsigned height)
@@ -164,6 +180,14 @@
     [m_window setFrame:NSMakeRect(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height) display:YES];
 }
 
+void PlatformWebView::didInitializeClients()
+{
+    // Set a temporary 1x1 window frame to force a WindowAndViewFramesChanged notification. <rdar://problem/13380145>
+    WKRect wkFrame = windowFrame();
+    [m_window setFrame:NSMakeRect(0, 0, 1, 1) display:YES];
+    setWindowFrame(wkFrame);
+}
+
 void PlatformWebView::addChromeInputField()
 {
     NSTextField* textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 20)];
@@ -201,7 +225,8 @@
 bool PlatformWebView::viewSupportsOptions(WKDictionaryRef options) const
 {
     WKRetainPtr<WKStringRef> useTiledDrawingKey(AdoptWK, WKStringCreateWithUTF8CString("TiledDrawing"));
-    bool useTiledDrawing = WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useTiledDrawingKey.get())));
+    WKTypeRef useTiledDrawingValue = WKDictionaryGetItemForKey(options, useTiledDrawingKey.get());
+    bool useTiledDrawing = useTiledDrawingValue && WKBooleanGetValue(static_cast<WKBooleanRef>(useTiledDrawingValue));
 
     return useTiledDrawing == [(TestRunnerWKView *)m_view useTiledDrawing];
 }
diff --git a/Tools/WebKitTestRunner/mac/TestControllerMac.mm b/Tools/WebKitTestRunner/mac/TestControllerMac.mm
index a9e9f31..fbae256 100644
--- a/Tools/WebKitTestRunner/mac/TestControllerMac.mm
+++ b/Tools/WebKitTestRunner/mac/TestControllerMac.mm
@@ -40,6 +40,10 @@
 {
 }
 
+void TestController::platformDestroy()
+{
+}
+
 void TestController::initializeInjectedBundlePath()
 {
     NSString *nsBundlePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"WebKitTestRunnerInjectedBundle.bundle"];
@@ -53,12 +57,10 @@
 
 void TestController::platformRunUntil(bool& done, double timeout)
 {
-    // FIXME: No timeout should occur if timeout is equal to m_noTimeout (necessary when running performance tests).
-    CFAbsoluteTime end = CFAbsoluteTimeGetCurrent() + timeout;
-    CFDateRef endDate = CFDateCreate(0, end);
-    while (!done && CFAbsoluteTimeGetCurrent() < end)
-        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:(NSDate *)endDate];
-    CFRelease(endDate);
+    NSDate *endDate = (timeout > 0) ? [NSDate dateWithTimeIntervalSinceNow:timeout] : [NSDate distantFuture];
+
+    while (!done && [endDate compare:[NSDate date]] == NSOrderedDescending)
+        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:endDate];
 }
 
 void TestController::platformInitializeContext()
diff --git a/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp b/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp
index e1cce48..37fd98e 100644
--- a/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp
+++ b/Tools/WebKitTestRunner/qt/PlatformWebViewQt.cpp
@@ -77,14 +77,20 @@
     QQuickWebView* m_view;
 };
 
-PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef, WKDictionaryRef /*options*/)
-    : m_view(new QQuickWebView(contextRef, pageGroupRef))
-    , m_window(new WrapperWindow(m_view))
-    , m_windowIsKey(true)
+PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef, WKDictionaryRef options)
+    : m_windowIsKey(true)
+    , m_options(options)
     , m_modalEventLoop(0)
 {
+    WKRetainPtr<WKStringRef> useFixedLayoutKey(AdoptWK, WKStringCreateWithUTF8CString("UseFixedLayout"));
+    m_usingFixedLayout = options ? WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useFixedLayoutKey.get()))) : false;
+    QQuickWebViewExperimental::setFlickableViewportEnabled(m_usingFixedLayout);
+
+    m_view = new QQuickWebView(contextRef, pageGroupRef);
     m_view->setAllowAnyHTTPSCertificateForLocalHost(true);
     m_view->componentComplete();
+
+    m_window = new WrapperWindow(m_view);
 }
 
 PlatformWebView::~PlatformWebView()
@@ -172,6 +178,17 @@
     return result;
 }
 
+bool PlatformWebView::viewSupportsOptions(WKDictionaryRef options) const
+{
+    WKRetainPtr<WKStringRef> useFixedLayoutKey(AdoptWK, WKStringCreateWithUTF8CString("UseFixedLayout"));
+
+    return m_usingFixedLayout == (options ? WKBooleanGetValue(static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(options, useFixedLayoutKey.get()))) : false);
+}
+
+void PlatformWebView::didInitializeClients()
+{
+}
+
 } // namespace WTR
 
 #include "PlatformWebViewQt.moc"
diff --git a/Tools/WebKitTestRunner/qt/TestControllerQt.cpp b/Tools/WebKitTestRunner/qt/TestControllerQt.cpp
index 04ddb8b..9d3515c 100644
--- a/Tools/WebKitTestRunner/qt/TestControllerQt.cpp
+++ b/Tools/WebKitTestRunner/qt/TestControllerQt.cpp
@@ -32,44 +32,106 @@
 
 #include <cstdlib>
 #include <QCoreApplication>
-#include <QElapsedTimer>
 #include <QEventLoop>
 #include <QFileInfo>
 #include <QLibrary>
 #include <QObject>
-#include <qquickwebview_p.h>
+#include <QTimer>
 #include <QtGlobal>
+#include <qquickwebview_p.h>
 #include <wtf/Platform.h>
 #include <wtf/text/WTFString.h>
 
 namespace WTR {
 
+class TestController::RunLoop : public QObject {
+    Q_OBJECT
+public:
+    RunLoop();
+
+    void runUntil(double timeout);
+    void notifyDone();
+    void runModal(PlatformWebView*);
+public Q_SLOTS:
+    void timerFired();
+private:
+    QEventLoop m_runUntilLoop;
+    QEventLoop m_modalLoop;
+    QTimer m_runUntilLoopTimer;
+    bool m_runUntilLoopClosePending;
+};
+
+TestController::RunLoop::RunLoop()
+    : m_runUntilLoopClosePending(false)
+{
+    m_runUntilLoopTimer.setSingleShot(true);
+    QObject::connect(&m_runUntilLoopTimer, SIGNAL(timeout()), this, SLOT(timerFired()));
+}
+
+void TestController::RunLoop::runUntil(double timeout)
+{
+    ASSERT(!m_runUntilLoop.isRunning());
+    if (timeout) {
+        const int timeoutInMilliSecs = timeout * 1000;
+        m_runUntilLoopTimer.start(timeoutInMilliSecs);
+    }
+    m_runUntilLoop.exec(QEventLoop::ExcludeUserInputEvents);
+}
+
+void TestController::RunLoop::notifyDone()
+{
+    if (m_modalLoop.isRunning()) {
+        // Wait for the modal loop first. We only kill it if we timeout.
+        m_runUntilLoopClosePending = true;
+        return;
+    }
+
+    m_runUntilLoopTimer.stop();
+    m_runUntilLoop.exit();
+}
+
+void TestController::RunLoop::timerFired()
+{
+    if (m_modalLoop.isRunning()) {
+        m_runUntilLoopClosePending = true;
+        m_modalLoop.exit();
+        return;
+    }
+
+    m_runUntilLoop.exit();
+}
+
+void TestController::RunLoop::runModal(PlatformWebView* view)
+{
+    ASSERT(!m_modalLoop.isRunning());
+    view->setModalEventLoop(&m_modalLoop);
+    m_modalLoop.exec(QEventLoop::ExcludeUserInputEvents);
+
+    if (m_runUntilLoopClosePending)
+        m_runUntilLoop.exit();
+}
+
 void TestController::notifyDone()
 {
+    m_runLoop->notifyDone();
 }
 
 void TestController::platformInitialize()
 {
+    m_runLoop = new RunLoop;
     QQuickWebView::platformInitialize();
 }
 
+void TestController::platformDestroy()
+{
+    delete m_runLoop;
+}
+
 void TestController::platformRunUntil(bool& condition, double timeout)
 {
-    if (qgetenv("QT_WEBKIT2_DEBUG") == "1" || timeout == m_noTimeout) {
-        // Never timeout if we are debugging or not meant to timeout.
-        while (!condition)
-            QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 50);
-        return;
-    }
-
-    int timeoutInMSecs = timeout * 1000;
-    QElapsedTimer timer;
-    timer.start();
-    while (!condition) {
-        if (timer.elapsed() > timeoutInMSecs)
-            return;
-        QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, timeoutInMSecs - timer.elapsed());
-    }
+    UNUSED_PARAM(condition);
+    const bool shouldTimeout = !(qgetenv("QT_WEBKIT2_DEBUG") == "1" || timeout == m_noTimeout);
+    m_runLoop->runUntil(shouldTimeout ? timeout : 0);
 }
 
 static bool isExistingLibrary(const QString& path)
@@ -113,9 +175,7 @@
 
 void TestController::runModal(PlatformWebView* view)
 {
-    QEventLoop eventLoop;
-    view->setModalEventLoop(&eventLoop);
-    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
+    shared().m_runLoop->runModal(view);
 }
 
 const char* TestController::platformLibraryPathForTesting()
@@ -124,3 +184,5 @@
 }
 
 } // namespace WTR
+
+#include "TestControllerQt.moc"
diff --git a/Tools/WebKitTestRunner/qt/TestInvocationQt.cpp b/Tools/WebKitTestRunner/qt/TestInvocationQt.cpp
index 682a637..99d5d0e 100644
--- a/Tools/WebKitTestRunner/qt/TestInvocationQt.cpp
+++ b/Tools/WebKitTestRunner/qt/TestInvocationQt.cpp
@@ -85,7 +85,7 @@
         else {
             m_error = true;
             m_errorMessage = "Timed out waiting for repaint\n";
-            m_webProcessIsUnrensponsive = true;
+            m_webProcessIsUnresponsive = true;
             return;
         }
     } else
diff --git a/Tools/WebKitTestRunner/qt/main.cpp b/Tools/WebKitTestRunner/qt/main.cpp
index 3c9d311..ac0ee24 100644
--- a/Tools/WebKitTestRunner/qt/main.cpp
+++ b/Tools/WebKitTestRunner/qt/main.cpp
@@ -122,7 +122,6 @@
     WebKit::QtTestSupport::initializeTestFonts();
     QCoreApplication::setAttribute(Qt::AA_Use96Dpi, true);
 
-    QQuickWebViewExperimental::setFlickableViewportEnabled(false);
     QApplication app(argc, argv);
     Launcher launcher(argc, argv);
     QTimer::singleShot(0, &launcher, SLOT(launch()));
diff --git a/Tools/WebKitTestRunner/win/PlatformWebViewWin.cpp b/Tools/WebKitTestRunner/win/PlatformWebViewWin.cpp
index 91a03d2..e5de871 100644
--- a/Tools/WebKitTestRunner/win/PlatformWebViewWin.cpp
+++ b/Tools/WebKitTestRunner/win/PlatformWebViewWin.cpp
@@ -118,4 +118,8 @@
     return 0;
 }
 
+void PlatformWebView::didInitializeClients()
+{
+}
+
 } // namespace WTR
diff --git a/Tools/WebKitTestRunner/win/TestControllerWin.cpp b/Tools/WebKitTestRunner/win/TestControllerWin.cpp
index ba4f753..8f2eaaf 100644
--- a/Tools/WebKitTestRunner/win/TestControllerWin.cpp
+++ b/Tools/WebKitTestRunner/win/TestControllerWin.cpp
@@ -121,6 +121,10 @@
     webProcessCrashingEvent = ::CreateEventA(0, FALSE, FALSE, webProcessCrashingEventName);
 }
 
+void TestController::platformDestroy()
+{
+}
+
 void TestController::initializeInjectedBundlePath()
 {
     CFStringRef exeContainerPath = CFURLCopyFileSystemPath(CFURLCreateCopyDeletingLastPathComponent(0, CFBundleCopyExecutableURL(CFBundleGetMainBundle())), kCFURLWindowsPathStyle);
diff --git a/Tools/WinCELauncher/CMakeLists.txt b/Tools/WinCELauncher/CMakeLists.txt
index 6cb260f..06f70ca 100644
--- a/Tools/WinCELauncher/CMakeLists.txt
+++ b/Tools/WinCELauncher/CMakeLists.txt
@@ -1,4 +1,4 @@
-SET(WinCELauncher_INCLUDE_DIRECTORIES
+set(WinCELauncher_INCLUDE_DIRECTORIES
     "${WEBKIT_DIR}/wince"
     "${WEBCORE_DIR}"
     "${WEBCORE_DIR}/platform"
@@ -11,17 +11,17 @@
     "${CMAKE_BINARY_DIR}"
 )
 
-SET(WinCELauncher_SOURCES
+set(WinCELauncher_SOURCES
     ${TOOLS_DIR}/WinCELauncher/main.cpp
 )
 
-SET(WinCELauncher_LIBRARIES
+set(WinCELauncher_LIBRARIES
     ${WebKit_LIBRARY_NAME}
 )
 
-INCLUDE_DIRECTORIES(${WinCELauncher_INCLUDE_DIRECTORIES})
-ADD_EXECUTABLE(WinCELauncher ${WinCELauncher_SOURCES})
-ADD_DEPENDENCIES(WinCELauncher ${WebKit_LIBRARY_NAME})
-TARGET_LINK_LIBRARIES(WinCELauncher ${WinCELauncher_LIBRARIES})
-SET_TARGET_PROPERTIES(WinCELauncher PROPERTIES FOLDER "Tools")
-SET_TARGET_PROPERTIES(WinCELauncher PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
+include_directories(${WinCELauncher_INCLUDE_DIRECTORIES})
+add_executable(WinCELauncher WIN32 ${WinCELauncher_SOURCES})
+add_dependencies(WinCELauncher ${WebKit_LIBRARY_NAME})
+target_link_libraries(WinCELauncher ${WinCELauncher_LIBRARIES})
+set_target_properties(WinCELauncher PROPERTIES FOLDER "Tools")
+set_target_properties(WinCELauncher PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.ico b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.ico
new file mode 100644
index 0000000..d551aa3
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.ico
Binary files differ
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.rc b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.rc
new file mode 100644
index 0000000..605098c
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.rc
@@ -0,0 +1,76 @@
+// Microsoft Visual C++ generated resource script.

+//

+#include "WinLauncherResource.h"

+

+#define APSTUDIO_READONLY_SYMBOLS

+/////////////////////////////////////////////////////////////////////////////

+//

+// Generated from the TEXTINCLUDE 2 resource.

+//

+#define APSTUDIO_HIDDEN_SYMBOLS

+#include "windows.h"

+#undef APSTUDIO_HIDDEN_SYMBOLS

+

+/////////////////////////////////////////////////////////////////////////////

+#undef APSTUDIO_READONLY_SYMBOLS

+

+/////////////////////////////////////////////////////////////////////////////

+// English (U.S.) resources

+

+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

+#ifdef _WIN32

+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

+#pragma code_page(1252)

+#endif //_WIN32

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// Icon

+//

+

+// Icon with lowest ID value placed first to ensure application icon

+// remains consistent on all systems.

+IDI_WINLAUNCHER         ICON                    "WinLauncher.ico"

+

+#ifdef APSTUDIO_INVOKED

+/////////////////////////////////////////////////////////////////////////////

+//

+// TEXTINCLUDE

+//

+

+1 TEXTINCLUDE 

+BEGIN

+    "WinLauncherResource.\0"

+END

+

+2 TEXTINCLUDE 

+BEGIN

+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"

+    "#include ""windows.h""\r\n"

+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"

+    "\0"

+END

+

+3 TEXTINCLUDE 

+BEGIN

+    "\r\n"

+    "\0"

+END

+

+#endif    // APSTUDIO_INVOKED

+

+#endif    // English (U.S.) resources

+/////////////////////////////////////////////////////////////////////////////

+

+

+

+#ifndef APSTUDIO_INVOKED

+/////////////////////////////////////////////////////////////////////////////

+//

+// Generated from the TEXTINCLUDE 3 resource.

+//

+

+

+/////////////////////////////////////////////////////////////////////////////

+#endif    // not APSTUDIO_INVOKED

+

diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj
new file mode 100644
index 0000000..cc12a70
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{767B10FB-76C1-44D0-8005-85ED7F9AA5E4}</ProjectGuid>

+    <RootNamespace>WinLauncherLauncher</RootNamespace>

+    <Keyword>Win32Proj</Keyword>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherProduction.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClInclude Include="WinLauncherResource.h" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\win\DLLLauncher\DLLLauncherMain.cpp" />

+  </ItemGroup>

+  <ItemGroup>

+    <ResourceCompile Include="WinLauncher.rc" />

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="WinLauncher.ico" />

+    <None Include="WinLauncherPostBuild.cmd" />

+    <None Include="WinLauncherPreBuild.cmd" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj.filters b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj.filters
new file mode 100644
index 0000000..9bdcce3
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncher.vcxproj.filters
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Source Files">

+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>

+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>

+    </Filter>

+    <Filter Include="Resource Files">

+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>

+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="WinLauncherResource.h" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\..\win\DLLLauncher\DLLLauncherMain.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ResourceCompile Include="WinLauncher.rc">

+      <Filter>Resource Files</Filter>

+    </ResourceCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="WinLauncher.ico">

+      <Filter>Resource Files</Filter>

+    </None>

+    <None Include="WinLauncherPostBuild.cmd" />

+    <None Include="WinLauncherPreBuild.cmd" />

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherCommon.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherCommon.props
new file mode 100644
index 0000000..f45dcd9
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherCommon.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemDefinitionGroup>

+    <Link>

+      <AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>

+      <OutputFile>$(OutDir)WinLauncher.exe</OutputFile>

+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>

+    </Link>

+    <ClCompile />

+    <ClCompile />

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherDebug.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherDebug.props
new file mode 100644
index 0000000..084ff52
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherDebug.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="WinLauncherCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.rc b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.rc
new file mode 100644
index 0000000..8a101ea
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.rc
@@ -0,0 +1,137 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "WinLauncherLibResource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_WINLAUNCHER         ICON                    "WinLauncher.ico"
+IDI_SMALL               ICON                    "small.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDC_WINLAUNCHER MENU 
+BEGIN
+    POPUP "&File"
+    BEGIN
+        MENUITEM "&Print\tCtrl-P",              IDM_PRINT
+        MENUITEM "E&xit",                       IDM_EXIT
+    END
+    POPUP "&Help"
+    BEGIN
+        MENUITEM "&About ...",                  IDM_ABOUT
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDC_WINLAUNCHER ACCELERATORS 
+BEGIN
+    "?",            IDM_ABOUT,              ASCII,  ALT
+    "/",            IDM_ABOUT,              ASCII,  ALT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ABOUTBOX DIALOGEX 22, 17, 230, 75
+STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "About"
+FONT 8, "System", 0, 0, 0x0
+BEGIN
+    ICON            IDI_WINLAUNCHER,IDC_MYICON,14,9,20,20
+    LTEXT           "WinLauncher Version 1.2",IDC_STATIC,49,10,119,8,SS_NOPREFIX
+    LTEXT           "Copyright (C) 2009",IDC_STATIC,49,20,119,8
+    DEFPUSHBUTTON   "OK",IDOK,195,6,30,11,WS_GROUP
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "WinLauncherLibResource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+    "#include ""windows.h""\r\n"
+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE 
+BEGIN
+    IDS_APP_TITLE           "WinLauncher"
+    IDC_WINLAUNCHER         "WINLAUNCHER"
+END
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj
new file mode 100644
index 0000000..448be47
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{114FCA11-216B-4C8C-957E-30A75AE80443}</ProjectGuid>

+    <RootNamespace>WinLauncher</RootNamespace>

+    <Keyword>Win32Proj</Keyword>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherLibRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherLibRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherLibProduction.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherLibDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherLibDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="WinLauncherLibDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup>

+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <None Include="small.ico" />

+    <None Include="WinLauncher.ico" />

+    <None Include="WinLauncherLibPostBuild.cmd" />

+    <None Include="WinLauncherLibPreBuild.cmd" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\PrintWebUIDelegate.cpp" />

+    <ClCompile Include="..\stdafx.cpp">

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">Create</PrecompiledHeader>

+    </ClCompile>

+    <ClCompile Include="..\WinLauncher.cpp" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\DOMDefaultImpl.h" />

+    <ClInclude Include="..\PrintWebUIDelegate.h" />

+    <ClInclude Include="..\stdafx.h" />

+    <ClInclude Include="..\WinLauncher.h" />

+    <ClInclude Include="WinLauncherLibResource.h" />

+  </ItemGroup>

+  <ItemGroup>

+    <ResourceCompile Include="WinLauncherLib.rc" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj.filters b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj.filters
new file mode 100644
index 0000000..0176009
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLib.vcxproj.filters
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Source Files">

+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>

+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>

+    </Filter>

+    <Filter Include="Header Files">

+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>

+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>

+    </Filter>

+    <Filter Include="Resource Files">

+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>

+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="small.ico">

+      <Filter>Resource Files</Filter>

+    </None>

+    <None Include="WinLauncher.ico">

+      <Filter>Resource Files</Filter>

+    </None>

+    <None Include="WinLauncherLibPostBuild.cmd" />

+    <None Include="WinLauncherLibPreBuild.cmd" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="..\PrintWebUIDelegate.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\stdafx.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\WinLauncher.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="..\DOMDefaultImpl.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="..\PrintWebUIDelegate.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="..\stdafx.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="..\WinLauncher.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="WinLauncherLibResource.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+  </ItemGroup>

+  <ItemGroup>

+    <ResourceCompile Include="WinLauncherLib.rc">

+      <Filter>Resource Files</Filter>

+    </ResourceCompile>

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibCommon.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibCommon.props
new file mode 100644
index 0000000..18b956e
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibCommon.props
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <TargetName>WinLauncher</TargetName>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+    <ClCompile>

+      <AdditionalIncludeDirectories>$(ProjectDir)\..;$(ConfigurationBuildDir)\include\WebKit;$(ConfigurationBuildDir)\Include\private;$(ConfigurationBuildDir)\Include;$(ConfigurationBuildDir)\Include\WebCore;$(ConfigurationBuildDir)\Include\WebCore\ForwardingHeaders;$(ConfigurationBuildDir)\Include\JavaScriptCore;$(ConfigurationBuildDir)\obj\WebKit\DerivedSources;$(WebKit_Libraries)\Include;$(WebKit_Libraries)\Include\private;$(WebKit_Libraries)\Include\WebCore;$(WebKit_Libraries)\Include\WebCore\ForwardingHeaders;$(WebKit_Libraries)\Include\JavaScriptCore;$(IntDir)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

+      <PrecompiledHeader>Use</PrecompiledHeader>

+      <PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>

+    </ClCompile>

+    <Link>

+      <AdditionalDependencies>comdlg32.lib;gdi32.lib;comctl32.lib;shlwapi.lib;user32.lib;ole32.lib;oleaut32.lib;WebKitGUID.lib;WebKit.lib;%(AdditionalDependencies)</AdditionalDependencies>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibDebug.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibDebug.props
new file mode 100644
index 0000000..8c4c7d9
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibDebug.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="WinLauncherLibCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibPostBuild.cmd b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibPostBuild.cmd
new file mode 100644
index 0000000..26707ca
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibPostBuild.cmd
@@ -0,0 +1 @@
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" del "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibPreBuild.cmd b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibPreBuild.cmd
new file mode 100644
index 0000000..a770776
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibPreBuild.cmd
@@ -0,0 +1,6 @@
+%SystemDrive%\cygwin\bin\which.exe bash
+if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH%
+cmd /c
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" grep XX%PROJECTNAME%XX "%CONFIGURATIONBUILDDIR%\buildfailed"
+if errorlevel 1 exit 1
+echo XX%PROJECTNAME%XX > "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibProduction.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibProduction.props
new file mode 100644
index 0000000..8f7f126
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibProduction.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="WinLauncherLibCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibRelease.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibRelease.props
new file mode 100644
index 0000000..7cb9b66
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibRelease.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="WinLauncherLibCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibResource.h b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibResource.h
new file mode 100644
index 0000000..c98fac7
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherLibResource.h
@@ -0,0 +1,28 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by WinLauncher.rc
+//
+#define IDC_MYICON                      2
+#define IDD_WINLAUNCHER_DIALOG          102
+#define IDS_APP_TITLE                   103
+#define IDD_ABOUTBOX                    103
+#define IDM_ABOUT                       104
+#define IDM_EXIT                        105
+#define IDM_PRINT                       106
+#define IDI_WINLAUNCHER                 107
+#define IDI_SMALL                       108
+#define IDC_WINLAUNCHER                 109
+#define IDR_MAINFRAME                   128
+#define IDC_STATIC                      -1
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NO_MFC                     1
+#define _APS_NEXT_RESOURCE_VALUE        129
+#define _APS_NEXT_COMMAND_VALUE         32771
+#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_SYMED_VALUE           110
+#endif
+#endif
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherPostBuild.cmd b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherPostBuild.cmd
new file mode 100644
index 0000000..26707ca
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherPostBuild.cmd
@@ -0,0 +1 @@
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" del "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherPreBuild.cmd b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherPreBuild.cmd
new file mode 100644
index 0000000..a770776
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherPreBuild.cmd
@@ -0,0 +1,6 @@
+%SystemDrive%\cygwin\bin\which.exe bash
+if errorlevel 1 set PATH=%SystemDrive%\cygwin\bin;%PATH%
+cmd /c
+if exist "%CONFIGURATIONBUILDDIR%\buildfailed" grep XX%PROJECTNAME%XX "%CONFIGURATIONBUILDDIR%\buildfailed"
+if errorlevel 1 exit 1
+echo XX%PROJECTNAME%XX > "%CONFIGURATIONBUILDDIR%\buildfailed"
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherProduction.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherProduction.props
new file mode 100644
index 0000000..7f3c032
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherProduction.props
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="WinLauncherCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherRelease.props b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherRelease.props
new file mode 100644
index 0000000..0a3a226
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherRelease.props
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="WinLauncherCommon.props" />

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherResource.h b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherResource.h
new file mode 100644
index 0000000..961fb17
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/WinLauncherResource.h
@@ -0,0 +1,20 @@
+//{{NO_DEPENDENCIES}}

+// Microsoft Visual C++ generated include file.

+// Used by WinLauncherLauncher.rc

+//

+#define IDD_WINLAUNCHER_DIALOG          102

+#define IDI_WINLAUNCHER                 107

+#define IDR_MAINFRAME                   128

+#define IDC_STATIC                      -1

+

+// Next default values for new objects

+// 

+#ifdef APSTUDIO_INVOKED

+#ifndef APSTUDIO_READONLY_SYMBOLS

+#define _APS_NO_MFC                     1

+#define _APS_NEXT_RESOURCE_VALUE        129

+#define _APS_NEXT_COMMAND_VALUE         32771

+#define _APS_NEXT_CONTROL_VALUE         1000

+#define _APS_NEXT_SYMED_VALUE           110

+#endif

+#endif

diff --git a/Tools/WinLauncher/WinLauncher.vcxproj/small.ico b/Tools/WinLauncher/WinLauncher.vcxproj/small.ico
new file mode 100644
index 0000000..d551aa3
--- /dev/null
+++ b/Tools/WinLauncher/WinLauncher.vcxproj/small.ico
Binary files differ
diff --git a/Tools/WinLauncher/stdafx.h b/Tools/WinLauncher/stdafx.h
index 86f76cc..b38e221 100644
--- a/Tools/WinLauncher/stdafx.h
+++ b/Tools/WinLauncher/stdafx.h
@@ -32,12 +32,12 @@
 
 // Modify the following defines if you have to target a platform prior to the ones specified below.
 // Refer to MSDN for the latest info on corresponding values for different platforms.
-#ifndef WINVER                // Allow use of features specific to Windows XP or later.
-#define WINVER 0x0501        // Change this to the appropriate value to target other versions of Windows.
+#ifndef WINVER // Allow use of features specific to Windows XP SP2 or later.
+#define WINVER 0x0502 // Change this to the appropriate value to target other versions of Windows.
 #endif
 
-#ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.                   
-#define _WIN32_WINNT 0x0501    // Change this to the appropriate value to target other versions of Windows.
+#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP SP2 or later.
+#define _WIN32_WINNT 0x0502 // Change this to the appropriate value to target other versions of Windows.
 #endif                        
 
 #ifndef _WIN32_WINDOWS        // Allow use of features specific to Windows 98 or later.
diff --git a/Tools/clang/ReportMemoryUsagePlugin/CMakeLists.txt b/Tools/clang/ReportMemoryUsagePlugin/CMakeLists.txt
index 53225f7..1cc4783 100644
--- a/Tools/clang/ReportMemoryUsagePlugin/CMakeLists.txt
+++ b/Tools/clang/ReportMemoryUsagePlugin/CMakeLists.txt
@@ -1,6 +1,6 @@
 set(MODULE TRUE)
 
-set( LLVM_LINK_COMPONENTS support mc)
+set(LLVM_LINK_COMPONENTS support mc)
 
 add_clang_library(ReportMemoryUsage ReportMemoryUsage.cpp)
 
diff --git a/Tools/clang/ReportMemoryUsagePlugin/ReportMemoryUsage.cpp b/Tools/clang/ReportMemoryUsagePlugin/ReportMemoryUsage.cpp
index f5d45f5..f309947 100644
--- a/Tools/clang/ReportMemoryUsagePlugin/ReportMemoryUsage.cpp
+++ b/Tools/clang/ReportMemoryUsagePlugin/ReportMemoryUsage.cpp
@@ -39,31 +39,16 @@
 
 namespace {
 
-typedef std::vector<std::string> Strings;
+using namespace std;
+typedef vector<string> Strings;
 
 Strings instrumentationMethods;
-const std::string instrimentingMethodName("reportMemoryUsage");
+const char instrumentingMethodName[] = "reportMemoryUsage";
 
 class AddMemberCallVisitor : public RecursiveASTVisitor<AddMemberCallVisitor> {
 public:
-    bool VisitCallExpr(CallExpr* callExpr)
-    {
-        CXXMemberCallExpr* methodCallExpr = dyn_cast<CXXMemberCallExpr>(callExpr);
-        bool instrumented = false;
-        if (methodCallExpr) {
-            std::string methodName = methodCallExpr->getMethodDecl()->getNameAsString();
-            Strings::iterator i = find(instrumentationMethods.begin(), instrumentationMethods.end(), methodName);
-            instrumented = i != instrumentationMethods.end();
-        }
-        if (instrumented || !methodCallExpr) {
-            for (CallExpr::arg_iterator i = callExpr->arg_begin(); i != callExpr->arg_end(); ++i) {
-                if (MemberExpr* memberExpr = dyn_cast<MemberExpr>(*i))
-                    m_instrumentedMembers.push_back(memberExpr->getMemberNameInfo().getAsString());
-            }
-        }
-        return true;
-    }
 
+    bool VisitCallExpr(CallExpr*);
     const Strings& instrumentedMembers() const { return m_instrumentedMembers; }
 
 private:
@@ -76,75 +61,13 @@
         : m_instance(instance)
         , m_context(context) { }
 
-    bool VisitCXXMethodDecl(clang::CXXMethodDecl* decl)
-    {
-        if (decl->doesThisDeclarationHaveABody() && decl->getNameAsString() == instrimentingMethodName) {
-            FullSourceLoc fullLocation = m_context->getFullLoc(decl->getLocStart());
-            if (fullLocation.isValid()) {
-                AddMemberCallVisitor visitor;
-                visitor.TraverseStmt(decl->getBody());
-                CheckMembersCoverage(decl->getParent(), visitor.instrumentedMembers(), decl->getLocStart());
-            }
-        }
-        return true;
-    }
+    bool VisitCXXMethodDecl(clang::CXXMethodDecl*);
 
 private:
-    void emitWarning(SourceLocation loc, const char* rawError)
-    {
-        FullSourceLoc full(loc, m_instance.getSourceManager());
-        std::string err("[webkit-style] ");
-        err += rawError;
-        DiagnosticsEngine& diagnostic = m_instance.getDiagnostics();
-        DiagnosticsEngine::Level level = diagnostic.getWarningsAsErrors() ? DiagnosticsEngine::Error : DiagnosticsEngine::Warning;
-        unsigned id = diagnostic.getCustomDiagID(level, err);
-        DiagnosticBuilder builder = diagnostic.Report(full, id);
-    }
-
-    CXXMethodDecl* findInstrumentationMethod(CXXRecordDecl* record)
-    {
-        for (CXXRecordDecl::method_iterator m = record->method_begin(); m != record->method_end(); ++m) {
-            if (m->getNameInfo().getAsString() == instrimentingMethodName)
-                return *m;
-        }
-        return 0;
-    }
-
-    bool needsToBeInstrumented(const Type* type)
-    {
-        if (type->isBuiltinType())
-            return false;
-        if (type->isEnumeralType())
-            return false;
-        if (type->isClassType()) {
-            const RecordType* recordType = dyn_cast<RecordType>(type);
-            if (recordType) {
-                CXXRecordDecl* decl = dyn_cast<CXXRecordDecl>(recordType->getDecl());
-                if (decl->getNameAsString() == "String")
-                    return true;
-                if (!decl || !findInstrumentationMethod(decl))
-                    return false;
-            }
-        }
-        if (type->isArrayType()) {
-            const ArrayType* arrayType = dyn_cast<const ArrayType>(type);
-            return needsToBeInstrumented(arrayType->getElementType().getTypePtr());
-        }
-        return true;
-    }
-
-    void CheckMembersCoverage(const CXXRecordDecl* instrumentedClass, const Strings& instrumentedMembers, SourceLocation location)
-    {
-        for (CXXRecordDecl::field_iterator i = instrumentedClass->field_begin(); i != instrumentedClass->field_end(); ++i) {
-            std::string fieldName = i->getNameAsString();
-            if (find(instrumentedMembers.begin(), instrumentedMembers.end(), fieldName) == instrumentedMembers.end()) {
-                if (!needsToBeInstrumented(i->getType().getTypePtr()))
-                    continue;
-                emitWarning(i->getSourceRange().getBegin(), "class member needs to be instrumented in reportMemoryUsage function");
-                emitWarning(location, "located here");
-            }
-        }
-    }
+    void emitWarning(SourceLocation, const char* rawError);
+    CXXMethodDecl* findInstrumentationMethod(CXXRecordDecl*);
+    bool needsToBeInstrumented(const Type*);
+    void checkMembersCoverage(const CXXRecordDecl* instrumentedClass, const Strings& instrumentedMembers, SourceLocation);
 
     CompilerInstance& m_instance;
     ASTContext* m_context;
@@ -156,18 +79,9 @@
         : m_visitor(instance, context)
     {
         instrumentationMethods.push_back("addMember");
-        instrumentationMethods.push_back("addInstrumentedMember");
-        instrumentationMethods.push_back("addVector");
-        instrumentationMethods.push_back("addVectorPtr");
-        instrumentationMethods.push_back("addInstrumentedVector");
-        instrumentationMethods.push_back("addInstrumentedVectorPtr");
-        instrumentationMethods.push_back("addHashSet");
-        instrumentationMethods.push_back("addInstrumentedHashSet");
-        instrumentationMethods.push_back("addHashMap");
-        instrumentationMethods.push_back("addInstrumentedHashMap");
-        instrumentationMethods.push_back("addListHashSet");
         instrumentationMethods.push_back("addRawBuffer");
-        instrumentationMethods.push_back("addString");
+        instrumentationMethods.push_back("addWeakPointer");
+        instrumentationMethods.push_back("ignoreMember");
     }
 
     virtual void HandleTranslationUnit(clang::ASTContext& context)
@@ -186,7 +100,7 @@
         return new ReportMemoryUsageConsumer(CI, &CI.getASTContext());
     }
 
-    bool ParseArgs(const CompilerInstance& CI, const std::vector<std::string>& args)
+    bool ParseArgs(const CompilerInstance& CI, const vector<string>& args)
     {
         if (args.size() && args[0] == "help")
             llvm::errs() << m_helpText;
@@ -200,22 +114,118 @@
     "This plugin is checking native memory instrumentation code.\n"
     "The class is instrumented if it has reportMemoryUsage member function.\n"
     "Sample:\n"
-    "class InstrumentedClass {\n"
+    "class InstrumentedClass : public BaseInstrumentedClass {\n"
     "public:\n"
     "    void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const\n"
     "    {\n"
-    "        MemoryClassInfo<InstrumentedClass> info(memoryObjectInfo, this, MemoryInstrumentation::DOM);\n"
-    "        info.addMember(m_notInstrumentedPtr);\n"
-    "        info.addInstrumentedMember(m_instrumentedObject);\n"
+    "        MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM);\n"
+    "        BaseInstrumentedClass::reportMemoryUsage(memoryObjectInfo);\n"
+    "        info.addMember(m_notInstrumentedObject);\n"
+    "        info.addMember(m_instrumentedObject);\n"
+    "        info.addRawBuffer(m_pointer, m_length);\n"
+    "        info.ignoreMember(m_pointerToInternalField);\n"
     "    }\n"
     "\n"
     "private:\n"
     "    NotInstrumentedClass* m_notInstrumentedPtr;\n"
     "    InstrumentedClass m_instrumentedObject;\n"
+    "    long m_length;\n"
+    "    double* m_pointer;\n"
+    "    Data* m_pointerToInternalField;\n"
     "}\n";
 
+bool AddMemberCallVisitor::VisitCallExpr(CallExpr* callExpr)
+{
+    CXXMemberCallExpr* methodCallExpr = dyn_cast<CXXMemberCallExpr>(callExpr);
+    bool instrumented = false;
+    if (methodCallExpr) {
+        string methodName = methodCallExpr->getMethodDecl()->getNameAsString();
+        Strings::iterator i = find(instrumentationMethods.begin(), instrumentationMethods.end(), methodName);
+        instrumented = i != instrumentationMethods.end();
+    }
+    if (instrumented || !methodCallExpr) {
+        for (CallExpr::arg_iterator i = callExpr->arg_begin(); i != callExpr->arg_end(); ++i) {
+            Expr* expr = *i;
+            while (ImplicitCastExpr::classof(expr))
+                expr = static_cast<ImplicitCastExpr*>(expr)->getSubExpr();
+            if (MemberExpr* memberExpr = dyn_cast<MemberExpr>(expr))
+                m_instrumentedMembers.push_back(memberExpr->getMemberNameInfo().getAsString());
+        }
+    }
+    return true;
 }
 
+bool ReportMemoryUsageVisitor::VisitCXXMethodDecl(clang::CXXMethodDecl* decl)
+{
+    if (decl->doesThisDeclarationHaveABody() && decl->getNameAsString() == instrumentingMethodName) {
+        FullSourceLoc fullLocation = m_context->getFullLoc(decl->getLocStart());
+        if (fullLocation.isValid()) {
+            AddMemberCallVisitor visitor;
+            visitor.TraverseStmt(decl->getBody());
+            checkMembersCoverage(decl->getParent(), visitor.instrumentedMembers(), decl->getLocStart());
+        }
+    }
+    return true;
+}
+
+void ReportMemoryUsageVisitor::emitWarning(SourceLocation loc, const char* rawError)
+{
+    FullSourceLoc full(loc, m_instance.getSourceManager());
+    string err("[webkit-style] ");
+    err += rawError;
+    DiagnosticsEngine& diagnostic = m_instance.getDiagnostics();
+    DiagnosticsEngine::Level level = diagnostic.getWarningsAsErrors() ? DiagnosticsEngine::Error : DiagnosticsEngine::Warning;
+    unsigned id = diagnostic.getCustomDiagID(level, err);
+    DiagnosticBuilder builder = diagnostic.Report(full, id);
+}
+
+CXXMethodDecl* ReportMemoryUsageVisitor::findInstrumentationMethod(CXXRecordDecl* record)
+{
+    for (CXXRecordDecl::method_iterator m = record->method_begin(); m != record->method_end(); ++m) {
+        if (m->getNameInfo().getAsString() == instrumentingMethodName)
+            return *m;
+    }
+    return 0;
+}
+
+bool ReportMemoryUsageVisitor::needsToBeInstrumented(const Type* type)
+{
+    if (type->isBuiltinType())
+        return false;
+    if (type->isEnumeralType())
+        return false;
+    if (type->isClassType()) {
+        const RecordType* recordType = dyn_cast<RecordType>(type);
+        if (recordType) {
+            CXXRecordDecl* decl = dyn_cast<CXXRecordDecl>(recordType->getDecl());
+            if (decl->getNameAsString() == "String")
+                return true;
+            if (!decl || !findInstrumentationMethod(decl))
+                return false;
+        }
+    }
+    if (type->isArrayType()) {
+        const ArrayType* arrayType = dyn_cast<const ArrayType>(type);
+        return needsToBeInstrumented(arrayType->getElementType().getTypePtr());
+    }
+    return true;
+}
+
+void ReportMemoryUsageVisitor::checkMembersCoverage(const CXXRecordDecl* instrumentedClass, const Strings& instrumentedMembers, SourceLocation location)
+{
+    for (CXXRecordDecl::field_iterator i = instrumentedClass->field_begin(); i != instrumentedClass->field_end(); ++i) {
+        string fieldName = i->getNameAsString();
+        if (find(instrumentedMembers.begin(), instrumentedMembers.end(), fieldName) == instrumentedMembers.end()) {
+            if (!needsToBeInstrumented(i->getType().getTypePtr()))
+                continue;
+            emitWarning(i->getSourceRange().getBegin(), "class member needs to be instrumented in reportMemoryUsage function");
+            emitWarning(location, "located here");
+        }
+    }
+}
+
+} // namespace
+
 static FrontendPluginRegistry::Add<ReportMemoryUsageAction>
 X("report-memory-usage", "Checks reportMemoryUsage function consistency");
 
diff --git a/Tools/efl/jhbuild.modules b/Tools/efl/jhbuild.modules
index 5528788..9e5cf26 100644
--- a/Tools/efl/jhbuild.modules
+++ b/Tools/efl/jhbuild.modules
@@ -19,6 +19,11 @@
       <dep package="efreet"/>
       <dep package="elementary"/>
       <dep package="libxml2"/>
+      <dep package="gstreamer"/>
+      <dep package="gst-plugins-base"/>
+      <dep package="gst-plugins-good"/>
+      <dep package="gst-plugins-bad"/>
+      <dep package="gst-libav"/>
     </dependencies>
   </metamodule>
 
@@ -44,6 +49,8 @@
       href="ftp://xmlsoft.org"/> 
   <repository type="tarball" name="download.enlightenment.org"
       href="http://download.enlightenment.org"/>
+  <repository type="tarball" name="gstreamer"
+      href="http://gstreamer.freedesktop.org/src/"/>
 
   <autotools id="cairo" autogen-sh="configure">
     <dependencies>
@@ -83,9 +90,9 @@
   </autotools>
 
   <tarball id="freetype6">
-    <source href="download.savannah.gnu.org/releases/freetype/freetype-2.4.2.tar.bz2" version="2.4.2"
-            hash="sha256:9a987aef8c50d9bcfdfdc9f012f8bd0de6095cc1a5524e62c1a037deb8dacbfe"
-            md5sum="647ee8ed266f9a4117c8d0a4855b3d3e"/>
+    <source href="download.savannah.gnu.org/releases/freetype/freetype-2.4.11.tar.bz2" version="2.4.11"
+            hash="sha256:ef9d0bcb64647d9e5125dc7534d7ca371c98310fec87677c410f397f71ffbe3f"
+            md5sum="b93435488942486c8d0ca22e8f768034" />
   </tarball>
 
   <autotools id="p11-kit">
@@ -113,6 +120,7 @@
   </autotools>
 
   <autotools id="glib"
+             autogen-sh="configure"
              autogenargs="--disable-dtrace">
     <dependencies>
       <dep package="libffi"/>
@@ -138,10 +146,11 @@
     <dependencies>
       <dep package="glib-networking"/>
     </dependencies>
-    <branch module="/pub/gnome/sources/libsoup/2.39/libsoup-2.39.4.1.tar.xz" version="2.39.4.1"
+    <branch module="/pub/gnome/sources/libsoup/2.40/libsoup-2.40.3.tar.xz" version="2.40.3"
             repo="ftp.gnome.org"
-            hash="sha256:0740c3f6e393d31f87f166f0c6d11de5ebaa013d382c59ed924a1384c575612e"
-            md5sum="895ed1e0c949a2ce50aeaeb58661bfc3"/>
+            hash="sha256:82c92f1f6f4cbfd501df783ed87e7de9410b4a12a3bb0b19c64722e185d2bbc9">
+      <patch file="libsoup-2.40-auth-fix.patch" strip="1"/>
+    </branch>
   </autotools>
 
   <autotools id="fontconfig" autogen-sh="configure">
@@ -153,50 +162,46 @@
   </autotools>
 
  <autotools id="harfbuzz" autogen-sh="configure">
-   <branch module="software/harfbuzz/release/harfbuzz-0.9.2.tar.bz2" version="0.9.2"
-           checkoutdir="harfbuzz-0.9.2"
+   <branch module="software/harfbuzz/release/harfbuzz-0.9.14.tar.bz2" version="0.9.14"
+           checkoutdir="harfbuzz-0.9.14"
            repo="freedesktop.org"
-           hash="sha256:c9b581d6357a32043b84ec78179390b582448de790deb487dfdb90b632dc8558"
-           md5sum="f1c1a2793b44b4d6613f58cc92caa366">
+           hash="sha256:d07c0ffdbbbfdfbb6c65e73fe9c76466e87dbf04b094cbd0abf5fd7d571a4004"
+           md5sum="7e1990b79060e98e2d31f677a0ac9eed">
    </branch>
  </autotools>
 
-  <autotools id="eina">
-    <branch module="releases/eina-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="eina-1.7.1"
+  <autotools id="eina" autogen-sh="configure">
+    <branch module="releases/eina-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:af0b316734ba72d92fa7716005efd380f28677c76f0e0b6a3c5a9b524575a6ce"
-            md5sum="552c5e9042d9cb3dbdebbc0e211ef30b">
+            hash="sha256:fc08c8aa3a225e3a42793afbf109788ab003de7595a542607a6a65694d08a44d"
+            md5sum="ea505aa52729de68ed6c00e1e45c3c50">
     </branch>
   </autotools>
 
-  <autotools id="embryo">
-    <branch module="releases/embryo-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="embryo-1.7.1"
+  <autotools id="embryo" autogen-sh="configure">
+    <branch module="releases/embryo-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:043563b8c1a66de117cfaaf76a4d9736e111007ce5c0cdcf2b1d83dd8b4df575"
-            md5sum="d66a0e91dfc37eeb4c362b2c46bd91ab">
+            hash="sha256:a946d6b4e6aa94b39537aa6746f4653d9235d8b9ca3a0dc0734df07482d28e80"
+            md5sum="a52682ebfd04a0e787028732ee8f11f9">
     </branch>
     <dependencies>
       <dep package="eina"/>
     </dependencies>
   </autotools>
 
-  <autotools id="evas">
-    <branch module="releases/evas-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="evas-1.7.1"
+  <autotools id="evas" autogen-sh="configure">
+    <branch module="releases/evas-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:57966a16fdb20e94deefe83ec0f990607413f7952f9755ed23ce81aea49b670c"
-            md5sum="e33c1d270b16e45c2337424aa2faaaa0">
+            hash="sha256:70b350a970b2086787622845896f3e54de278fe698b8069796fd752e70427374"
+            md5sum="2c965b836128a839292161d4ca89380d">
     </branch>
   </autotools>
 
-  <autotools id="ecore">
-    <branch module="releases/ecore-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="ecore-1.7.1"
+  <autotools id="ecore" autogen-sh="configure">
+    <branch module="releases/ecore-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:fb5f547a0a6556b5f0e274b65cfbe42f4eb8371f20d00005cd4f5a78a6b6a5d8"
-            md5sum="94fd264e478323a1100b3cfff833d28d">
+            hash="sha256:4bbaba2153db0c356d13c45adfbcc90c7118abd112d0817581417e708d6a9222"
+            md5sum="9ea98367ec40f7121ea61948bb395553">
     </branch>
     <dependencies>
       <dep package="eina"/>
@@ -204,12 +209,11 @@
     </dependencies>
   </autotools>
 
-  <autotools id="eet">
-    <branch module="releases/eet-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="eet-1.7.1"
+  <autotools id="eet" autogen-sh="configure">
+    <branch module="releases/eet-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:3e5679c06792f0a1c4b5b158468afbcec3b510c60345055d5964fdbe2abba3eb"
-            md5sum="2974f892e2be5e2fa08296714e97c407">
+            hash="sha256:c79cc6e5d3304ae5761307c266835c4d8337cc0418ea43ace8c915b2d329427b"
+            md5sum="ec3fffbeff0be2699aeed1ed4377ee9d">
     </branch>
     <dependencies>
       <dep package="libgcrypt"/>
@@ -217,12 +221,11 @@
     </dependencies>
   </autotools>
 
-  <autotools id="edje">
-    <branch module="releases/edje-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="edje-1.7.1"
+  <autotools id="edje" autogen-sh="configure">
+    <branch module="releases/edje-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:d924d7ade92055a5c83d3c43171982b7f006db9f5c923fb39e0523405ec4534c"
-            md5sum="766747bc1b8a1755952e275b6058cf30">
+            hash="sha256:c7b329ac6548378c1c74e9cdf60a34c33f4fdc2d8224577d6a9ea4b90c915ec3"
+            md5sum="56d7ba080088627773bc6369e9a924fe">
     </branch>
     <dependencies>
       <dep package="eet"/>
@@ -232,12 +235,11 @@
     </dependencies>
   </autotools>
 
-  <autotools id="e_dbus">
-    <branch module="releases/e_dbus-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="e_dbus-1.7.1"
+  <autotools id="e_dbus" autogen-sh="configure">
+    <branch module="releases/e_dbus-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:d3a3e0b81f6bb69d2fc3886c9885dad27ebf14b60c4a0bbd5a2a510b5a5ff2d1"
-            md5sum="3fa25de2880c2ff9d78d070d4792f570">
+            hash="sha256:d88886c13b470f9aee84f1a95a68eca5501506417362ee8066a117feffcd9399"
+            md5sum="a197ae1c8e93debf20728e3e7693b868">
     </branch>
     <dependencies>
       <dep package="ecore"/>
@@ -245,12 +247,11 @@
     </dependencies>
   </autotools>
 
-  <autotools id="eeze">
-    <branch module="releases/eeze-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="eeze-1.7.1"
+  <autotools id="eeze" autogen-sh="configure">
+    <branch module="releases/eeze-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:6a696e2fe1ad14983ca7555eed2c50dd39f9a084e04475f0d25fd31d32e3cd58"
-            md5sum="0e9d008a9ae17de2aea82a34ee62691e">
+            hash="sha256:b9cf6843d703c63930d5ff33be3dc640c28f58ce2e7def812086bfce8876e408"
+            md5sum="0891f831e2d25bd48a5c26e8793b1714">
     </branch>
     <dependencies>
       <dep package="ecore"/>
@@ -258,12 +259,11 @@
     </dependencies>
   </autotools>
 
-  <autotools id="efreet">
-    <branch module="releases/efreet-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="efreet-1.7.1"
+  <autotools id="efreet" autogen-sh="configure">
+    <branch module="releases/efreet-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:c844ed545f1c9438c73af4e4d037401a653babaab0a4e4b69377a2de49431eea"
-            md5sum="0fc2b3bf93dc3a9f293c348339163ba3">
+            hash="sha256:8f5a043a76d8905f87600da5e0dddfcdf3b44f517724b376f8da32dc9ac487fb"
+            md5sum="d21e59631022d6fbdfa0e19b6b2ff93a">
     </branch>
     <dependencies>
         <deb package="ecore"/>
@@ -273,12 +273,12 @@
   </autotools>
 
   <autotools id="elementary"
-             autogenargs="--disable-web">
-    <branch module="releases/elementary-1.7.1.tar.bz2" version="1.7.1"
-            checkoutdir="elementary-1.7.1"
+             autogen-sh="configure"
+             autogenargs="--disable-emap --disable-ethumb --disable-eweather --disable-web">
+    <branch module="releases/elementary-1.7.5.tar.bz2" version="1.7.5"
             repo="download.enlightenment.org"
-            hash="sha256:54dd82ca156f024de91e375ae9f7ad9579cb0d8fb0bcbf9b16e5b4165d5ac483"
-            md5sum="9f43658594d8e837773c8b6573b654dd">
+            hash="sha256:898a4a7f8135c65359d4271ccab593b8a0b10d85fb6fd2d0cabea76152278b21"
+            md5sum="7f2cbea027fba8b58c41aaacfe68c155">
     </branch>
     <dependencies>
         <deb package="edje"/>
@@ -293,6 +293,57 @@
             repo="xmlsoft.org"
             hash="sha256:f2e2d0e322685193d1affec83b21dc05d599e17a7306d7b90de95bb5b9ac622a"
             md5sum="c62106f02ee00b6437f0fb9d370c1093"/>
+  </autotools>
+
+  <autotools id="gstreamer" autogen-sh="configure">
+    <branch repo="gstreamer"
+            module="gstreamer/gstreamer-1.0.5.tar.xz" version="1.0.5"
+            hash="sha256:26c2827567f09a46d0a3bc1e7f8696b2ae72b047306539178079abae487c5b77"/>
+  </autotools>
+
+  <autotools id="gst-plugins-base"
+             autogen-sh="configure"
+             autogenargs="--disable-examples --enable-theora --enable-vorbis">
+    <dependencies>
+      <dep package="gstreamer"/>
+    </dependencies>
+    <branch repo="gstreamer"
+            module="gst-plugins-base/gst-plugins-base-1.0.5.tar.xz" version="1.0.5"
+            hash="sha256:37ce6e09b99ef3879111c861ee5090582b4fd4c764e81ab6eb2b2b4dd77d7173"/>
+  </autotools>
+
+  <autotools id="gst-plugins-good"
+             autogen-sh="configure"
+             autogenargs="--disable-examples --enable-pulse">
+    <dependencies>
+      <dep package="cairo"/>
+      <dep package="gst-plugins-base"/>
+    </dependencies>
+    <branch repo="gstreamer"
+            module="gst-plugins-good/gst-plugins-good-1.0.5.tar.xz" version="1.0.5"
+            hash="sha256:53bd0b848e7896f1b22548ca4e8be56cf425e5100e121c472dff8272d5140bc5"/>
+  </autotools>
+
+  <autotools id="gst-plugins-bad"
+             autogen-sh="configure"
+             autogenargs="--disable-examples --enable-faad">
+    <dependencies>
+      <dep package="gst-plugins-base"/>
+    </dependencies>
+    <branch repo="gstreamer"
+            module="gst-plugins-bad/gst-plugins-bad-1.0.5.tar.xz" version="1.0.5"
+            hash="sha256:2e8f5b9a2fd274142d0a916b6425b9466028978b85858dc835dc80de744b276a"/>
+  </autotools>
+
+  <autotools id="gst-libav"
+             autogen-sh="configure"
+             autogenargs="--with-libav-extra-configure='--disable-yasm'">
+    <dependencies>
+      <dep package="gst-plugins-base"/>
+    </dependencies>
+    <branch repo="gstreamer"
+            module="gst-libav/gst-libav-1.0.5.tar.xz" version="1.0.5"
+            hash="sha256:aef8be665096b3a4e64424fb39d7c5da57faaaf95e9fea6c1bb44295d4fb32d5"/>
   </autotools> 
 
 </moduleset>
diff --git a/Tools/efl/patches/libsoup-2.40-auth-fix.patch b/Tools/efl/patches/libsoup-2.40-auth-fix.patch
new file mode 100644
index 0000000..343dc27
--- /dev/null
+++ b/Tools/efl/patches/libsoup-2.40-auth-fix.patch
@@ -0,0 +1,50 @@
+From f9816e366e53004618abcee1741885b69e9466a8 Mon Sep 17 00:00:00 2001
+From: Martin Robinson <mrobinson@igalia.com>
+Date: Tue, 4 Dec 2012 17:48:45 -0800
+Subject: [PATCH] Better handle the failure of URI embedded credentials
+
+When using credentials embedded in the URI, clear them so that a failure
+will trigger the authentication signal and the use of previously
+remembered credentials.
+---
+ libsoup/soup-auth-manager.c |    7 ++++---
+ tests/auth-test.c           |    5 ++++-
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/libsoup/soup-auth-manager.c b/libsoup/soup-auth-manager.c
+index b3ef9f6..2a2030c 100644
+--- a/libsoup/soup-auth-manager.c
++++ b/libsoup/soup-auth-manager.c
+@@ -411,9 +411,10 @@ authenticate_auth (SoupAuthManager *manager, SoupAuth *auth,
+ 	/* If a password is specified explicitly in the URI, use it
+ 	 * even if the auth had previously already been authenticated.
+ 	 */
+-	if (uri->password) {
+-		if (!prior_auth_failed)
+-			soup_auth_authenticate (auth, uri->user, uri->password);
++	if (uri->password && uri->user) {
++		soup_auth_authenticate (auth, uri->user, uri->password);
++		soup_uri_set_password (uri, NULL);
++		soup_uri_set_user (uri, NULL);
+ 	} else if (!soup_auth_is_authenticated (auth) && can_interact) {
+ 		soup_auth_manager_emit_authenticate (manager, msg, auth,
+ 						     prior_auth_failed);
+diff --git a/tests/auth-test.c b/tests/auth-test.c
+index 85c4d41..334033b 100644
+--- a/tests/auth-test.c
++++ b/tests/auth-test.c
+@@ -146,7 +146,10 @@ static SoupAuthTest main_tests[] = {
+ 	  "Digest/realm1/not/", "1", FALSE, /* should not be used */ "1", SOUP_STATUS_UNAUTHORIZED },
+ 
+ 	{ "Make sure we've forgotten it",
+-	  "Digest/realm1/", "", FALSE, "0", SOUP_STATUS_UNAUTHORIZED }
++	  "Digest/realm1/", "", FALSE, "0", SOUP_STATUS_UNAUTHORIZED },
++
++	{ "Fail with URI-embedded password, then use right password in the authenticate signal",
++	  "Basic/realm3/", "43", TRUE, "43", SOUP_STATUS_OK }
+ };
+ 
+ static const char *auths[] = {
+-- 
+1.7.10.4
+
diff --git a/Tools/efl/run-with-jhbuild b/Tools/efl/run-with-jhbuild
deleted file mode 100755
index 666797f..0000000
--- a/Tools/efl/run-with-jhbuild
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2011 Igalia S.L.
-# Copyright (C) 2012 Intel Corporation
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-import common
-import os
-import sys
-
-
-jhbuild_wrapper = common.top_level_path('Tools', 'jhbuild', 'jhbuild-wrapper')
-os.execve(jhbuild_wrapper, [jhbuild_wrapper, '--efl', 'run'] + sys.argv[1:], os.environ)
diff --git a/Tools/gtk/common.py b/Tools/gtk/common.py
index dd32e08..6bffc09 100644
--- a/Tools/gtk/common.py
+++ b/Tools/gtk/common.py
@@ -36,7 +36,7 @@
     return os.path.join(*((script_path('..', '..'),) + args))
 
 
-def get_build_path():
+def get_build_path(build_types=('Release', 'Debug')):
     global build_dir
     if build_dir:
         return build_dir
@@ -57,7 +57,7 @@
     if is_valid_build_directory(build_dir):
         return build_dir
 
-    for build_type in ('Release', 'Debug'):
+    for build_type in build_types:
         build_dir = top_level_path('WebKitBuild', build_type)
         if is_valid_build_directory(build_dir):
             return build_dir
@@ -75,18 +75,22 @@
     if is_valid_build_directory(build_dir):
         return build_dir
 
-    print 'Could not determine build directory.'
+    print('Could not determine build directory.')
     sys.exit(1)
 
 
+def build_path_for_build_types(build_types, *args):
+    return os.path.join(*(get_build_path(build_types),) + args)
+
+
 def build_path(*args):
-    return os.path.join(*(get_build_path(),) + args)
+    return build_path_for_build_types(('Release', 'Debug'), *args)
 
 
 def pkg_config_file_variable(package, variable):
     process = subprocess.Popen(['pkg-config', '--variable=%s' % variable, package],
                                stdout=subprocess.PIPE)
-    stdout = process.communicate()[0]
+    stdout = process.communicate()[0].decode("utf-8")
     if process.returncode:
         return None
     return stdout.strip()
@@ -99,7 +103,7 @@
 def gtk_version_of_pkg_config_file(pkg_config_path):
     process = subprocess.Popen(['pkg-config', pkg_config_path, '--print-requires'],
                                stdout=subprocess.PIPE)
-    stdout = process.communicate()[0]
+    stdout = process.communicate()[0].decode("utf-8")
 
     if 'gtk+-3.0' in stdout:
         return 3
diff --git a/Tools/gtk/generate-feature-defines-files b/Tools/gtk/generate-feature-defines-files
new file mode 100755
index 0000000..f5b2c7e
--- /dev/null
+++ b/Tools/gtk/generate-feature-defines-files
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+import os
+import re
+import sys
+
+def read_feature_defines_override(feature_defines):
+    feature_defines_overriding_file = 'WebKitFeatureOverrides.txt'
+    if not os.path.exists(feature_defines_overriding_file):
+        return
+
+    print("The following feature defines were overriden:")
+    with open(feature_defines_overriding_file) as f:
+        match_iter = re.findall(r"((?:ENABLE_)\w+)=(0|1)", f.read())
+
+    for match in match_iter:
+        feature = match[0]
+        value = int(match[1])
+
+        if feature in feature_defines and value != feature_defines[feature]:
+            print("\t{0}: {1} => {2}".format(feature, feature_defines[feature], value))
+        feature_defines[feature] = value
+
+def write_file_if_contents_changed(filename, contents):
+    if os.path.exists(filename):
+        with open(filename, 'r') as f:
+            old_contents = f.read()
+        if old_contents == contents:
+            return
+    with open(filename, 'w') as f:
+        f.write(contents)
+
+def write_feature_defines_header(feature_defines):
+    contents = ''
+    for (feature, value) in feature_defines.items():
+        contents += '#define {0} {1}\n'.format(feature, value)
+    write_file_if_contents_changed("WebKitFeatures.h", contents)
+
+def write_flattened_feature_defines_file(feature_defines):
+    contents = ''
+    for (feature, value) in feature_defines.items():
+        contents += '{0}={1}\n'.format(feature, value)
+    write_file_if_contents_changed("WebKitFeatures.txt", contents)
+
+def generate_feature_defines_files(default_features):
+    build_dir = os.getcwd()
+    feature_defines = {}
+
+    for feature_define in default_features:
+        (feature, value) = feature_define.split("=")
+        feature_defines[feature] = int(value)
+
+    read_feature_defines_override(feature_defines)
+    write_feature_defines_header(feature_defines)
+    write_flattened_feature_defines_file(feature_defines)
+
+if __name__=='__main__':
+    generate_feature_defines_files(sys.argv[1:])
diff --git a/Tools/gtk/generate-gtkdoc b/Tools/gtk/generate-gtkdoc
index d40daeb..a1d5109 100755
--- a/Tools/gtk/generate-gtkdoc
+++ b/Tools/gtk/generate-gtkdoc
@@ -77,6 +77,8 @@
         return common.build_path(*(('DerivedSources', 'WebKit2') + args))
     def src_path(*args):
         return common.top_level_path(*(('Source', 'WebKit2', 'UIProcess', 'API', 'gtk') + args))
+    def injected_bundle_src_path(*args):
+        return common.top_level_path(*(('Source', 'WebKit2', 'WebProcess', 'InjectedBundle', 'API', 'gtk') + args))
 
     xref_deps = get_common_xref_deps().copy()
     xref_deps.update({
@@ -88,7 +90,7 @@
         'module_name' : 'webkit2gtk',
         'doc_dir' : src_path('docs'),
         'output_dir' : common.build_path('Documentation', 'webkit2gtk'),
-        'source_dirs' : [src_path(), derived_sources_path('webkit2gtk', 'webkit2')],
+        'source_dirs' : [src_path(), derived_sources_path('webkit2gtk', 'webkit2'), injected_bundle_src_path()],
         'cflags' : ' -I' + derived_sources_path('webkit2gtk', 'include') + \
                    ' -I' + derived_sources_path('webkit2gtk') + \
                    ' -I' + derived_sources_path('include') + \
@@ -96,10 +98,13 @@
                    ' -I' + src_path(),
         'cross_reference_deps' : get_gtkdoc_module_paths(xref_deps),
         'ignored_files': glob.glob(src_path('*Private.h')) + \
+                         glob.glob(injected_bundle_src_path('*Private.h')) + \
                          glob.glob(src_path('*Client*')) + \
-                         glob.glob(src_path('WebKitWebViewBaseAccessible.*')) + \
+                         glob.glob(src_path('WebKit2GtkAuthenticationDialog.*')) + \
                          glob.glob(src_path('WebKitGeolocationProvider.*')) + \
                          glob.glob(src_path('WebKitTextChecker.*')) + \
+                         glob.glob(src_path('WebKitWebViewBaseAccessible.*')) + \
+                         glob.glob(src_path('WebViewBaseInputMethodFilter.*')) + \
                          glob.glob(derived_sources_path('webkit2gtk', 'webkit2', 'WebKitMarshal.*')) + \
                          glob.glob(derived_sources_path('webkit2gtk', 'webkit2', 'WebKitEnumTypes.*')) + \
                          glob.glob(src_path('tests/*.h'))
@@ -141,9 +146,9 @@
     missing_api = generator.api_missing_documentation()
     if not missing_api:
         return
-    print "\nThe following API are missing documentation:"
+    print("\nThe following API are missing documentation:")
     for api in missing_api:
-        print "\t%s" % api
+        print("\t%s" % api)
 
 def generate_doc(generator):
     generator.generate(html='--skip-html' not in sys.argv)
@@ -160,6 +165,17 @@
 if pkg_config_path:
     os.environ['PKG_CONFIG_PATH'] += ':' + pkg_config_path
 
+# Newer versions of glib have deprecated g_type_init, so we need to disable
+# that warning when running gtkdoc-scanobj by overriding the CFLAGS we use
+# to compile it.
+cflags = os.environ.get('CFLAGS', '')
+cflags += ' -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_32'
+os.environ['CFLAGS'] = cflags
+
+# Clang can be noisy, throwing unnecessary warnings for unused arguments.
+if os.environ.get('CC') == "clang":
+    os.environ['CFLAGS'] += ' -Qunused-arguments'
+
 saw_webkit1_warnings = saw_webkit2_warnings = False
 
 pkg_config_path = common.build_path('Source', 'WebKit', 'gtk', 'webkitgtk-3.0.pc')
@@ -169,27 +185,27 @@
     options = get_webkit1_options(common.gtk_version_of_pkg_config_file(pkg_config_path))
     generator = gtkdoc.PkgConfigGTKDoc(pkg_config_path, options)
     if '--rebase' not in sys.argv:
-        print "Generating WebKit1 documentation..."
+        print("Generating WebKit1 documentation...")
         saw_webkit1_warnings = generate_doc(generator)
     else:
-        print "Rebasing WebKit1 documentation..."
+        print("Rebasing WebKit1 documentation...")
         try:
             generator.rebase_installed_docs()
-        except Exception,e:
-            print "Rebase did not happen, likely no documentation is present."
+        except Exception:
+            print("Rebase did not happen, likely no documentation is present.")
 
 # WebKit2 might not be enabled, so check for the pkg-config file before building documentation.
 pkg_config_path = common.build_path('Source', 'WebKit2', 'webkit2gtk-3.0.pc')
 if os.path.exists(pkg_config_path):
     generator = gtkdoc.PkgConfigGTKDoc(pkg_config_path, get_webkit2_options())
     if '--rebase' not in sys.argv:
-        print "\nGenerating WebKit2 documentation..."
+        print("\nGenerating WebKit2 documentation...")
         saw_webkit2_warnings = generate_doc(generator)
     else:
-        print "\nRebasing WebKit2 documentation..."
+        print("\nRebasing WebKit2 documentation...")
         try:
             generator.rebase_installed_docs()
-        except Exception,e:
-            print "Rebase did not happen, likely no documentation is present."
+        except Exception:
+            print("Rebase did not happen, likely no documentation is present.")
 
 sys.exit(saw_webkit1_warnings or saw_webkit2_warnings)
diff --git a/Tools/gtk/gtkdoc.py b/Tools/gtk/gtkdoc.py
index 7f7f0ad..0cbccf1 100644
--- a/Tools/gtk/gtkdoc.py
+++ b/Tools/gtk/gtkdoc.py
@@ -107,7 +107,7 @@
 
         self.logger = logging.getLogger('gtkdoc')
 
-        for key, value in args.iteritems():
+        for key, value in iter(args.items()):
             setattr(self, key, value)
 
         def raise_error_if_not_specified(key):
@@ -185,7 +185,7 @@
         process = subprocess.Popen(args, env=env, cwd=cwd,
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)
-        stdout, stderr = process.communicate()
+        stdout, stderr = [b.decode("utf-8") for b in process.communicate()]
 
         if print_output:
             if stdout:
diff --git a/Tools/gtk/install-dependencies b/Tools/gtk/install-dependencies
new file mode 100755
index 0000000..2e1f1b3
--- /dev/null
+++ b/Tools/gtk/install-dependencies
@@ -0,0 +1,165 @@
+#!/bin/bash
+
+# This script needs to be run with root rights.
+if [ $UID -ne 0 ]; then
+    sudo $0
+    exit 0
+fi
+
+function printNotSupportedMessageAndExit() {
+    echo
+    echo "Currently this script only works for distributions supporting apt-get and yum."
+    echo "Please add support for your distribution: http://webkit.org/b/110693"
+    echo
+    exit 1
+}
+
+function checkInstaller {
+    # apt-get - Debian based distributions
+    apt-get --version &> /dev/null
+    if [ $? -eq 0 ]; then
+        installDependenciesWithApt
+        exit 0
+    fi
+
+    # yum - Fedora
+    yum --version &> /dev/null
+    if [ $? -eq 0 ]; then
+        installDependenciesWithYum
+        exit 0
+    fi
+
+    printNotSupportedMessageAndExit
+}
+
+function installDependenciesWithApt {
+    # These are dependencies necessary for building WebKitGTK+.
+    apt-get install \
+        autoconf \
+        automake \
+        autopoint \
+        autotools-dev \
+        bison \
+        flex \
+        gail-3.0 \
+        gawk \
+        gnome-common \
+        gperf \
+        gtk-doc-tools \
+        intltool \
+        libatk1.0-dev \
+        libenchant-dev \
+        libfaad-dev \
+        libgail-3-dev \
+        libgail-dev \
+        libgeoclue-dev \
+        libgirepository1.0-dev \
+        libgl1-mesa-dev \
+        libgl1-mesa-glx \
+        libgnutls-dev \
+        libgudev-1.0-dev \
+        libicu-dev \
+        libjpeg62-dev \
+        libmpg123-dev \
+        libopus-dev \
+        libpango1.0-dev \
+        libpng12-dev \
+        libpulse-dev \
+        librsvg2-dev \
+        libsecret-1-dev \
+        libsqlite3-dev \
+        libtheora-dev \
+        libtool \
+        libvorbis-dev \
+        libwebp-dev \
+        libxslt1-dev \
+        libxt-dev \
+        libxtst-dev \
+        ruby
+
+    # These are dependencies necessary for running tests.
+    apt-get install \
+        apache2 \
+        curl \
+        libapache2-mod-bw \
+        libapache2-mod-php5 \
+        libgpg-error-dev \
+        pulseaudio-utils \
+        python-gi \
+        ruby \
+        xvfb
+
+    # These are dependencies necessary for building the jhbuild.
+    apt-get install \
+        gobject-introspection \
+        icon-naming-utils \
+        libgcrypt11-dev \
+        libgpg-error-dev \
+        libp11-kit-dev \
+        libtiff4-dev \
+        libcroco3-dev
+}
+
+function installDependenciesWithYum {
+    # These are dependencies necessary for building WebKitGTK+.
+    yum install \
+        autoconf \
+        automake \
+        bison \
+        atk-devel \
+        cairo-devel \
+        enchant-devel \
+        flex \
+        fontconfig-devel \
+        freetype-devel \
+        gcc-c++ \
+        geoclue-devel \
+        gettext \
+        gobject-introspection-devel \
+        gperf \
+        gstreamer1-devel \
+        gstreamer1-plugins-base-devel \
+        gtk2-devel \
+        gtk3-devel \
+        gtk-doc \
+        harfbuzz-devel \
+        libsoup-devel \
+        libicu-devel \
+        libjpeg-turbo-devel \
+        libpng-devel \
+        libsecret-devel \
+        libwebp-devel \
+        libxslt-devel \
+        libXt-devel \
+        libgudev1-devel \
+        mesa-libGL-devel \
+        pcre-devel \
+        ruby \
+        sqlite-devel \
+        perl-Switch \
+        perl-version
+
+    # These are dependencies necessary for running tests.
+    yum install \
+        httpd \
+        curl \
+        mod_bw \
+        libgpg-error-devel \
+        pulseaudio-utils \
+        pygobject3-base \
+        ruby \
+        xorg-x11-server-Xvfb
+
+    # These are dependencies necessary for building the jhbuild.
+    yum install \
+        gobject-introspection \
+        icon-naming-utils \
+        libgcrypt-devel \
+        libgpg-error-devel \
+        libp11-devel \
+        libtiff-devel \
+        libcroco-devel
+}
+
+checkInstaller
+
diff --git a/Tools/gtk/jhbuild-optional.modules b/Tools/gtk/jhbuild-optional.modules
new file mode 100644
index 0000000..de858a8
--- /dev/null
+++ b/Tools/gtk/jhbuild-optional.modules
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!DOCTYPE moduleset SYSTEM "moduleset.dtd">
+<?xml-stylesheet type="text/xsl" href="moduleset.xsl"?>
+<moduleset>
+
+  <!-- This file contains a set of modules that are hard to get on
+       certain distributions. Feel free to add more here, within reason,
+       as long as they are not built by default. -->
+
+  <metamodule id="webkitgtk-clutter-dependencies">
+    <dependencies>
+      <dep package="atk"/>
+      <dep package="clutter"/>
+      <dep package="clutter-gtk"/>
+      <dep package="cogl"/>
+    </dependencies>
+  </metamodule>
+
+  <repository type="tarball" name="ftp.gnome.org"
+      href="http://ftp.gnome.org"/>
+
+  <autotools id="libsecret" autogen-sh="configure">
+    <branch repo="ftp.gnome.org"
+            module="/pub/GNOME/sources/libsecret/0.11/libsecret-0.11.tar.xz" version="0.11"
+            hash="sha256:e5399dfb61376a7500d20cb22715152780aa3a2c8a64281ec6bc8f0ebeb8b689"/>
+  </autotools>
+
+  <autotools id="cogl"
+            autogen-sh="configure"
+            autogenargs="--disable-introspection">
+    <branch module="/pub/GNOME/sources/cogl/1.12/cogl-1.12.0.tar.xz" version="1.12.0"
+            repo="ftp.gnome.org" 
+            hash="sha256:4e7b5abbf0a1e51d74618db1b513551e7c71b486e17e98373f4db93e7710e2f2"/>
+  </autotools>
+
+  <autotools id="clutter"
+           autogen-sh="configure"
+           autogenargs="--disable-introspection">
+    <dependencies>
+      <dep package="cogl"/>
+      <dep package="atk"/>
+    </dependencies>
+    <branch module="/pub/GNOME/sources/clutter/1.12/clutter-1.12.0.tar.xz" version="1.12.0"
+            repo="ftp.gnome.org" 
+            hash="sha256:e75130a5df6dbe97e8d350259278331c6352b2d213230712127160e42053e558"/>
+  </autotools>
+
+  <autotools id="clutter-gtk"
+           autogen-sh="configure"
+           autogenargs="--disable-introspection">
+    <dependencies>
+      <dep package="clutter"/>
+    </dependencies>
+    <branch module="/pub/GNOME/sources/clutter-gtk/1.3/clutter-gtk-1.3.2.tar.xz" version="1.3.2"
+            repo="ftp.gnome.org"             
+            hash="sha256:ee50538daca9447be6ad1ed0d049fbb2dc5a1bcaecd13fda847b9b66f922ee37"/>
+  </autotools>
+
+  <autotools id="atk"
+           autogen-sh="configure"
+           autogenargs="--disable-introspection">
+    <branch module="/pub/GNOME/sources/atk/2.5/atk-2.5.3.tar.xz" version="2.5.3"
+            repo="ftp.gnome.org"
+            hash="sha256:ac118ef34ef5490fa113cf50cffdff7735d6293723bf35df958a89fbda876313"/>
+  </autotools>
+
+</moduleset>
diff --git a/Tools/gtk/jhbuild.modules b/Tools/gtk/jhbuild.modules
index 0abf145..d04a090 100644
--- a/Tools/gtk/jhbuild.modules
+++ b/Tools/gtk/jhbuild.modules
@@ -10,25 +10,34 @@
       <dep package="fonts"/>
       <dep package="fontconfig"/>
       <dep package="freetype6"/>
+      <dep package="harfbuzz"/>
       <dep package="libxml2"/>
       <dep package="gdk-pixbuf"/>
       <dep package="gtk+"/>
       <dep package="glib"/>
       <dep package="glib-networking"/>
       <dep package="gnome-icon-theme"/>
+      <dep package="gnome-icon-theme-symbolic"/>
       <dep package="gnome-themes-standard"/>
       <dep package="libsoup"/>
       <dep package="at-spi2-core"/>
       <dep package="at-spi2-atk"/>
+      <dep package="gstreamer"/>
+      <dep package="gst-plugins-base"/>
+      <dep package="gst-plugins-good"/>
+      <dep package="gst-plugins-bad"/>
+      <dep package="gst-libav"/>
     </dependencies>
   </metamodule>
 
+  <include href="jhbuild-optional.modules"/>
+
   <repository type="tarball" name="ftp.gnu.org"
       href="ftp://ftp.gnu.org/gnu/"/>
-  <repository type="tarball" name="github.com"
-      href="https://github.com"/>
-  <repository type="tarball" name="sourceware.org"
-      href="ftp://sourceware.org"/>
+  <repository type="git" name="github.com"
+      href="git://github.com"/>
+  <repository type="tarball" name="sourceware.org-mirror"
+      href="ftp://mirrors.kernel.org/sources.redhat.com/"/>
   <repository type="tarball" name="ftp.gnome.org"
       href="http://ftp.gnome.org"/>
   <repository type="git" name="git.gnome.org"
@@ -39,6 +48,8 @@
       href="http://www.freedesktop.org"/>
   <repository type="tarball" name="xmlsoft.org"
       href="ftp://xmlsoft.org"/>
+  <repository type="git" name="gstreamer"
+      href="git://anongit.freedesktop.org/git/gstreamer/"/>
 
   <autotools id="make" autogen-sh="configure">
     <branch repo="ftp.gnu.org"
@@ -72,11 +83,7 @@
 
   <autotools id="fonts"
              skip-autogen="true">
-    <branch module="downloads/mrobinson/webkitgtk-test-fonts/webkitgtk-test-fonts-0.0.3.tar.gz" version="0.0.3"
-            repo="github.com"
-            hash="sha256:4a0a01f00855997cdcc7201f164b33a4e4144e8eadf40a5e542a1c448e035de5"
-            md5sum="10e74de1a8ba961d9037994d427b1dd2">
-    </branch>
+    <branch repo="github.com" module="mrobinson/webkitgtk-test-fonts.git" checkoutdir="webkitgtk-test-fonts" tag="0.0.4"/>
   </autotools>
 
   <tarball id="freetype6">
@@ -85,9 +92,18 @@
             md5sum="647ee8ed266f9a4117c8d0a4855b3d3e"/>
   </tarball>
 
+  <autotools id="harfbuzz" autogen-sh="configure">
+    <branch module="software/harfbuzz/release/harfbuzz-0.9.14.tar.bz2" version="0.9.14"
+            checkoutdir="harfbuzz-0.9.14"
+            repo="freedesktop.org"
+            hash="sha256:d07c0ffdbbbfdfbb6c65e73fe9c76466e87dbf04b094cbd0abf5fd7d571a4004"
+            md5sum="7e1990b79060e98e2d31f677a0ac9eed">
+    </branch>
+  </autotools>
+
   <autotools id="libffi" autogen-sh="configure">
-    <branch module="/pub/libffi/libffi-3.0.10.tar.gz" version="3.0.10"
-             repo="sourceware.org"
+    <branch module="libffi/libffi-3.0.10.tar.gz" version="3.0.10"
+             repo="sourceware.org-mirror"
              hash="sha256:f01eb9027e9eb56aeaeef636649877756d475d714ef8b47f627f65bc5f3b492f"
              md5sum="79390673f5d07a8fb342bc09b5055b6f"/>
   </autotools>
@@ -97,10 +113,10 @@
     <dependencies>
       <dep package="glib"/>
     </dependencies>
-    <branch module="/pub/GNOME/sources/gdk-pixbuf/2.26/gdk-pixbuf-2.26.0.tar.xz" version="2.26.0"
+    <branch module="/pub/GNOME/sources/gdk-pixbuf/2.26/gdk-pixbuf-2.26.5.tar.xz" version="2.26.5"
             repo="ftp.gnome.org"
-            hash="sha256:a5028d3a33710cbb6c6264bc561b6e252b37f067dff7b5b52473621e064f254d"
-            md5sum="1c186f9903a20e96587b9afb27944b40"/>
+            hash="sha256:77696fd163bca95a130a1883dbd78d0ae4d782de2fc85a9a38556d13681f5c84"
+            md5sum="339329e6d619ee3e1cb93979111b04c0"/>
   </autotools>
 
   <autotools id="librsvg" autogen-sh="configure"
@@ -114,25 +130,11 @@
             md5sum="89d483f30a7c77245b7ee02faaea5a5a"/>
   </autotools>
 
-  <autotools id="pango"
-             autogenargs="--disable-introspection">
-    <dependencies>
-      <dep package="glib"/>
-      <dep package="freetype6"/>
-      <dep package="cairo"/>
-    </dependencies>
-    <branch module="/pub/GNOME/sources/pango/1.30/pango-1.30.0.tar.xz" version="1.30.0"
-            repo="ftp.gnome.org"
-            hash="sha256:7c6d2ab024affaed0e942f9279b818235f9c6a36d9fc50688f48d387f4102dff"
-            md5sum="2a70627ffd9f43c52c04cc0b05fe359f"/>
-  </autotools>
-
   <autotools id="gtk+" autogen-sh="configure"
              autogenargs="--disable-introspection">
     <dependencies>
       <dep package="glib"/>
       <dep package="cairo"/>
-      <dep package="pango"/>
       <dep package="gdk-pixbuf"/>
     </dependencies>
     <branch module="/pub/GNOME/sources/gtk+/3.4/gtk+-3.4.2.tar.xz" version="3.4.2"
@@ -142,14 +144,14 @@
   </autotools>
 
   <autotools id="glib"
+             autogen-sh="configure"
              autogenargs="--disable-dtrace">
     <dependencies>
       <dep package="libffi"/>
     </dependencies>
-    <branch module="/pub/GNOME/sources/glib/2.33/glib-2.33.2.tar.xz" version="2.33.2"
+    <branch module="/pub/GNOME/sources/glib/2.35/glib-2.35.2.tar.xz" version="2.35.2"
             repo="ftp.gnome.org"
-            hash="sha256:b7163e9f159775d13ecfb433d67c3f0883e0e518e85b2e970d4ad9773d7cd0b4"
-            md5sum="06ef0099fed22afcf34ade39ddff9a5b"/>
+            hash="sha256:84fffa2041850352b83a7b27c127f1c4e8b3d169aa3a000b100820ba10f8c19e"/>
   </autotools>
 
   <autotools id="glib-networking">
@@ -167,9 +169,9 @@
     <dependencies>
       <dep package="glib-networking"/>
     </dependencies>
-    <branch module="libsoup" version="2.39.2"
+    <branch module="libsoup" version="2.40.2-r1"
             repo="git.gnome.org"
-            tag="LIBSOUP_2_39_2"/>
+            revision="5651d18eb8c9edff5961a32c488641bf6776ca6b"/>
   </autotools>
 
   <autotools id="fontconfig" autogen-sh="configure">
@@ -191,6 +193,17 @@
     </branch>
   </autotools>
 
+  <autotools id="gnome-icon-theme-symbolic" autogen-sh="configure">
+    <dependencies>
+      <dep package="gtk+"/>
+    </dependencies>
+    <branch module="pub/GNOME/sources/gnome-icon-theme-symbolic/3.2/gnome-icon-theme-symbolic-3.2.1.tar.xz" version="3.2.1"
+            repo="ftp.gnome.org"
+            hash="sha256:a558af2f87f761f00421f49c1addd2149b70228158e09327fa861219ac1a63cb"
+            md5sum="94137d3c256f2cc80298a9bef15d68c4">
+    </branch>
+  </autotools>
+
   <autotools id="gnome-themes-standard" autogen-sh="configure">
     <dependencies>
       <dep package="gtk+"/>
@@ -228,10 +241,44 @@
   </autotools>
 
   <autotools id="libxml2">
-    <branch module="/libxml2/libxml2-2.8.0.tar.gz" version="2.8.0"
+    <branch module="/libxml2/libxml2-2.9.0.tar.gz" version="2.9.0"
             repo="xmlsoft.org"
-            hash="sha256:f2e2d0e322685193d1affec83b21dc05d599e17a7306d7b90de95bb5b9ac622a"
-            md5sum="c62106f02ee00b6437f0fb9d370c1093"/>
+            hash="sha256:ad25d91958b7212abdc12b9611cfb4dc4e5cddb6d1e9891532f48aacee422b82"
+            md5sum="5b9bebf4f5d2200ae2c4efe8fa6103f7">
+      <patch file="libxml2-2.9.0-dtd.patch" strip="1"/>
+    </branch>
+  </autotools>
+
+  <autotools id="gstreamer">
+    <branch repo="gstreamer" module="gstreamer" checkoutdir="gstreamer" tag="1.0.4"/>
+  </autotools>
+
+  <autotools id="gst-plugins-base" autogenargs="--disable-examples">
+    <dependencies>
+      <dep package="gstreamer"/>
+    </dependencies>
+    <branch repo="gstreamer" module="gst-plugins-base" checkoutdir="gst-plugins-base" tag="1.0.4"/>
+  </autotools>
+
+  <autotools id="gst-plugins-good" autogenargs="--disable-examples">
+    <dependencies>
+      <dep package="gst-plugins-base"/>
+    </dependencies>
+    <branch repo="gstreamer" module="gst-plugins-good" checkoutdir="gst-plugins-good" tag="1.0.4"/>
+  </autotools>
+
+  <autotools id="gst-plugins-bad" autogenargs="--disable-examples">
+    <dependencies>
+      <dep package="gst-plugins-base"/>
+    </dependencies>
+    <branch repo="gstreamer" module="gst-plugins-bad" checkoutdir="gst-plugins-bad" tag="1.0.4"/>
+  </autotools>
+
+  <autotools id="gst-libav" autogenargs="--with-libav-extra-configure='--disable-yasm'">
+    <dependencies>
+      <dep package="gst-plugins-base"/>
+    </dependencies>
+    <branch repo="gstreamer" module="gst-libav" checkoutdir="gst-libav" tag="1.0.4"/>
   </autotools>
 
 </moduleset>
diff --git a/Tools/gtk/jhbuildrc b/Tools/gtk/jhbuildrc
index 6f33ed1..eec89a1 100644
--- a/Tools/gtk/jhbuildrc
+++ b/Tools/gtk/jhbuildrc
@@ -46,16 +46,5 @@
 notrayicon = True
 os.environ['MAKEFLAGS'] = '-j%d' % multiprocessing.cpu_count()
 
-# Use system libraries while building.
-if use_lib64:
-    _libdir = 'lib64'
-else:
-    _libdir = 'lib'
-addpath('PKG_CONFIG_PATH', os.path.join(os.sep, 'usr', _libdir, 'pkgconfig'))
-addpath('PKG_CONFIG_PATH', os.path.join(os.sep, 'usr', 'share', 'pkgconfig'))
-
-addpath('XDG_DATA_DIRS', '/usr/share')
-addpath('XDG_CONFIG_DIRS', '/etc/xdg')
-
 # GTK+ 3.0.12 misses the -lm flag when linking the tests.
 module_makeargs['gtk+'] = 'LDFLAGS="-lm" ' + makeargs
diff --git a/Tools/gtk/patches/libxml2-2.9.0-dtd.patch b/Tools/gtk/patches/libxml2-2.9.0-dtd.patch
new file mode 100644
index 0000000..7ed953b
--- /dev/null
+++ b/Tools/gtk/patches/libxml2-2.9.0-dtd.patch
@@ -0,0 +1,27 @@
+From cf8f0424db45c43ecda812b7c238ece5e2398107 Mon Sep 17 00:00:00 2001
+From: Dan Winship <danw@gnome.org>
+Date: Fri, 21 Dec 2012 11:13:31 +0800
+Subject: [PATCH] Fix an error in the progressive DTD parsing code
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=689958
+We were looking for the wrong character in the input stream
+---
+ parser.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/parser.c b/parser.c
+index c7802cf..e719c9f 100644
+--- a/parser.c
++++ b/parser.c
+@@ -12042,7 +12042,7 @@ xmlParseCheckTransition(xmlParserCtxtPtr ctxt, const char *chunk, int size) {
+     }
+     if ((ctxt->progressive == XML_PARSER_DTD) ||
+         (ctxt->instate == XML_PARSER_DTD)) {
+-        if (memchr(chunk, ']', size) != NULL)
++        if (memchr(chunk, '>', size) != NULL)
+             return(1);
+         return(0);
+     }
+-- 
+1.8.0.1
+
diff --git a/Tools/gtk/run-with-jhbuild b/Tools/gtk/run-with-jhbuild
deleted file mode 100755
index a9affff..0000000
--- a/Tools/gtk/run-with-jhbuild
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2011 Igalia S.L.
-# Copyright (C) 2012 Gustavo Noronha Silva <gns@gnome.org>
-# Copyright (C) 2012 Intel Corporation
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-import common
-import os
-import subprocess
-import sys
-
-sys.path.append(common.top_level_path('Tools', 'jhbuild'))
-import jhbuildutils
-
-if (not os.path.exists(jhbuildutils.get_dependencies_path())):
-    os.execve(sys.argv[1], sys.argv[1:], os.environ)
-else:
-    wrapper = common.top_level_path('Tools', 'jhbuild', 'jhbuild-wrapper')
-    os.execve(wrapper, [wrapper, '--gtk', 'run'] + sys.argv[1:], os.environ)
-
diff --git a/Tools/lldb/lldb_webkit.py b/Tools/lldb/lldb_webkit.py
index 37844f8..4adc438 100644
--- a/Tools/lldb/lldb_webkit.py
+++ b/Tools/lldb/lldb_webkit.py
@@ -37,7 +37,9 @@
     debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFStringImpl_SummaryProvider WTF::StringImpl')
     debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFAtomicString_SummaryProvider WTF::AtomicString')
     debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFVector_SummaryProvider -x "WTF::Vector<.+>$"')
+    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFHashTable_SummaryProvider -x "WTF::HashTable<.+>$"')
     debugger.HandleCommand('type synthetic add -x "WTF::Vector<.+>$" --python-class lldb_webkit.WTFVectorProvider')
+    debugger.HandleCommand('type synthetic add -x "WTF::HashTable<.+>$" --python-class lldb_webkit.WTFHashTableProvider')
 
 
 def WTFString_SummaryProvider(valobj, dict):
@@ -58,6 +60,11 @@
     provider = WTFVectorProvider(valobj, dict)
     return "{ size = %d, capacity = %d }" % (provider.size, provider.capacity)
 
+
+def WTFHashTable_SummaryProvider(valobj, dict):
+    provider = WTFHashTableProvider(valobj, dict)
+    return "{ tableSize = %d, keyCount = %d }" % (provider.tableSize(), provider.keyCount())
+
 # FIXME: Provide support for the following types:
 # def WTFVector_SummaryProvider(valobj, dict):
 # def WTFCString_SummaryProvider(valobj, dict):
@@ -190,3 +197,56 @@
 
     def has_children(self):
         return True
+
+
+class WTFHashTableProvider:
+    def __init__(self, valobj, internal_dict):
+        self.valobj = valobj
+        self.update()
+
+    def num_children(self):
+        return self.tableSize() + 5
+
+    def get_child_index(self, name):
+        if name == "m_table":
+            return self.tableSize()
+        elif name == "m_tableSize":
+            return self.tableSize() + 1
+        elif name == "m_tableSizeMask":
+            return self.tableSize() + 2
+        elif name == "m_keyCount":
+            return self.tableSize() + 3
+        elif name == "m_deletedCount":
+            return self.tableSize() + 4
+        else:
+            return int(name.lstrip('[').rstrip(']'))
+
+    def get_child_at_index(self, index):
+        if index == self.tableSize():
+            return self.valobj.GetChildMemberWithName('m_table')
+        elif index == self.tableSize() + 1:
+            return self.valobj.GetChildMemberWithName('m_tableSize')
+        elif index == self.tableSize() + 2:
+            return self.valobj.GetChildMemberWithName('m_tableSizeMask')
+        elif index == self.tableSize() + 3:
+            return self.valobj.GetChildMemberWithName('m_keyCount')
+        elif index == self.tableSize() + 4:
+            return self.valobj.GetChildMemberWithName('m_deletedCount')
+        elif index < self.tableSize():
+            table = self.valobj.GetChildMemberWithName('m_table')
+            return table.CreateChildAtOffset('[' + str(index) + ']', index * self.data_size, self.data_type)
+        else:
+            return None
+
+    def tableSize(self):
+        return self.valobj.GetChildMemberWithName('m_tableSize').GetValueAsUnsigned(0)
+
+    def keyCount(self):
+        return self.valobj.GetChildMemberWithName('m_keyCount').GetValueAsUnsigned(0)
+
+    def update(self):
+        self.data_type = self.valobj.GetType().GetTemplateArgumentType(0)
+        self.data_size = self.data_type.GetByteSize()
+
+    def has_children(self):
+        return True
diff --git a/Tools/qmake/config.tests/gccdepends/empty.cpp b/Tools/qmake/config.tests/gccdepends/empty.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tools/qmake/config.tests/gccdepends/empty.cpp
diff --git a/Tools/qmake/config.tests/libjpeg/libjpeg.cpp b/Tools/qmake/config.tests/libjpeg/libjpeg.cpp
deleted file mode 100644
index cb44f0e..0000000
--- a/Tools/qmake/config.tests/libjpeg/libjpeg.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) Zoltan Horvath (zoltan@webkit.org) 2012 University of Szeged.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <jpeglib.h>
-
-int main(int, char**)
-{
-    struct jpeg_compress_struct cinfo;
-    jpeg_create_compress(&cinfo);
-
-    return 0;
-}
diff --git a/Tools/qmake/config.tests/libjpeg/libjpeg.pro b/Tools/qmake/config.tests/libjpeg/libjpeg.pro
deleted file mode 100644
index b84c3e0..0000000
--- a/Tools/qmake/config.tests/libjpeg/libjpeg.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-SOURCES = libjpeg.cpp
-OBJECTS_DIR = obj
-LIBS += -ljpeg
diff --git a/Tools/qmake/config.tests/libpng/libpng.cpp b/Tools/qmake/config.tests/libpng/libpng.cpp
deleted file mode 100644
index 7fb5861..0000000
--- a/Tools/qmake/config.tests/libpng/libpng.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) Zoltan Horvath (zoltan@webkit.org) 2012 University of Szeged.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <png.h>
-
-int main(int, char**)
-{
-    png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
-
-    return 0;
-}
diff --git a/Tools/qmake/config.tests/libpng/libpng.pro b/Tools/qmake/config.tests/libpng/libpng.pro
deleted file mode 100644
index 23a39a9..0000000
--- a/Tools/qmake/config.tests/libpng/libpng.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-SOURCES = libpng.cpp
-OBJECTS_DIR = obj
-LIBS += -lpng
diff --git a/Tools/qmake/config.tests/libxml2/libxml2.cpp b/Tools/qmake/config.tests/libxml2/libxml2.cpp
index dfde5a3..2117b5b 100644
--- a/Tools/qmake/config.tests/libxml2/libxml2.cpp
+++ b/Tools/qmake/config.tests/libxml2/libxml2.cpp
@@ -23,7 +23,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <libxml2/libxml/xmlreader.h>
+#include <libxml/xmlreader.h>
 
 int main(int, char**)
 {
diff --git a/Tools/qmake/config.tests/libxml2/libxml2.pro b/Tools/qmake/config.tests/libxml2/libxml2.pro
index d5add8f..bd72944 100644
--- a/Tools/qmake/config.tests/libxml2/libxml2.pro
+++ b/Tools/qmake/config.tests/libxml2/libxml2.pro
@@ -1,4 +1,9 @@
 CONFIG -= qt
 SOURCES = libxml2.cpp
-CONFIG += link_pkgconfig
-PKGCONFIG += libxml-2.0
+mac {
+    INCLUDEPATH += /usr/include/libxml2
+    LIBS += -lxml2
+} else {
+    PKGCONFIG += libxml-2.0
+    CONFIG += link_pkgconfig
+}
diff --git a/Tools/qmake/config.tests/libxslt/libxslt.pro b/Tools/qmake/config.tests/libxslt/libxslt.pro
index 6359de3..1943485 100644
--- a/Tools/qmake/config.tests/libxslt/libxslt.pro
+++ b/Tools/qmake/config.tests/libxslt/libxslt.pro
@@ -1,4 +1,9 @@
 CONFIG -= qt
 SOURCES = libxslt.cpp
-CONFIG += link_pkgconfig
-PKGCONFIG += libxslt
+mac {
+    INCLUDEPATH += /usr/include/libxslt /usr/include/libxml2
+    LIBS += -lxslt
+} else {
+    PKGCONFIG += libxslt
+    CONFIG += link_pkgconfig
+}
diff --git a/Tools/qmake/mkspecs/features/configure.prf b/Tools/qmake/mkspecs/features/configure.prf
index 3954a94..66fcfd8 100644
--- a/Tools/qmake/mkspecs/features/configure.prf
+++ b/Tools/qmake/mkspecs/features/configure.prf
@@ -17,7 +17,8 @@
     build_imagediff \
     build_test_npapi \
     build_testbrowser \
-    build_minibrowser
+    build_minibrowser \
+    build_qttestsupport
 
 defineTest(runConfigure) {
     !webkit_configured:!print_defaults {
@@ -95,7 +96,7 @@
 
     win32|!enable?(NETSCAPE_PLUGIN_API): WEBKIT_CONFIG -= build_test_npapi
 
-    wince* {
+    win* {
         WEBKIT_CONFIG -= build_drt
     }
 
@@ -108,8 +109,17 @@
         error(Done computing defaults)
     }
 
-    # Sanity check that would prevent us from building the whole project altogether.
-    !mac:!contains(QT_CONFIG,icu): error("To build QtWebKit with Qt 5 you need to build Qt 5 with libICU support. Check for ICU support being mentioned in qtbase/config.summary.")
+    # Sanity checks that would prevent us from building the whole project altogether.
+    !mac:!contains(QT_CONFIG,icu) {
+        addReasonForSkippingBuild("ICU is required. To build QtWebKit with Qt 5 you need to build Qt 5 with libICU support. Check for ICU support being mentioned in qtbase/config.summary.")
+    }
+    production_build:blackberry {
+        addReasonForSkippingBuild("Build not supported on BB10 yet.")
+    }
+    requiredPrograms = gperf python perl bison ruby flex
+    for(program, requiredPrograms): \
+        !programExistsInPath($$program): \
+            addReasonForSkippingBuild("Missing $$program from PATH")
 
     # Detect changes to the configuration. Changes need a clean build.
     webkit_configured {
@@ -206,6 +216,7 @@
         log(All-in-one files .............. $$configEnabled(use_all_in_one_files)$$EOL)
         log(GNUmake ....................... $$configEnabled(GNUmake)$$EOL)
         log(Static libs as shared ......... $$configEnabled(force_static_libs_as_shared)$$EOL)
+        log(Static libs as thin archives .. $$configEnabled(gnu_thin_archives)$$EOL)
         log(Production build .............. $$configEnabled(production_build)$$EOL)
         log($$EOL)
 
@@ -225,7 +236,13 @@
             }
         }
 
-        log("$${EOL}WebKit is now configured for building. Just run 'make'.$${EOL}$${EOL}")
+        !isEmpty(skipBuildReason) {
+            log("$${EOL}The WebKit build was disabled for the following reasons: $$skipBuildReason $${EOL}$${EOL}")
+            SUBDIRS=
+            export(SUBDIRS)
+        } else {
+            log("$${EOL}WebKit is now configured for building. Just run 'make'.$${EOL}$${EOL}")
+        }
 
         configuration_changed {
             log(WARNING: The configuration was changed since the last build:$${EOL}$${EOL})
diff --git a/Tools/qmake/mkspecs/features/default_post.prf b/Tools/qmake/mkspecs/features/default_post.prf
index 4776d1d..6efb089 100644
--- a/Tools/qmake/mkspecs/features/default_post.prf
+++ b/Tools/qmake/mkspecs/features/default_post.prf
@@ -11,7 +11,13 @@
 CONFIG += config_step
 
 # Enable dynamic instead of static libraries for development
-!production_build:!buildbot:!win*: CONFIG += force_static_libs_as_shared
+# Avoid it with debug_and_release, it can cause the application to load both the debug and release
+# dependent libraries when using frameworks on Mac.
+!production_build:!debug_and_release:!buildbot:!win*:!build?(webkit2): CONFIG += force_static_libs_as_shared
+
+# Don't create .prl files for intermediate libraries because their contents get used when linking against
+# them, breaking "-Wl,-whole-archive -lMyIntermediateLib --Wl,-no-whole-archive"
+staticlib: CONFIG -= create_prl
 
 root_project_file: finalizeConfigure()
 
@@ -36,9 +42,6 @@
 
 DEFINES += $$configDefines()
 
-CONFIG += depend_includepath
-DEPENDPATH += $$OUT_PWD
-
 INCLUDEPATH += \
     $${ROOT_WEBKIT_DIR}/Source \
     $${ROOT_BUILD_DIR}/Source/include \
@@ -46,7 +49,7 @@
 
 CONFIG -= warn_on
 
-*-g++*: QMAKE_CXXFLAGS = \
+!compiling_thirdparty_code:*-g++*: QMAKE_CXXFLAGS = \
     -Wall \
     -Wextra \
     -Wreturn-type \
@@ -120,6 +123,9 @@
 } else {
     # Make sure the generated sources are compiled as well
     for(generator, GENERATORS) {
+        prependEach($${generator}.extra_sources, $${GENERATED_SOURCES_DESTDIR}/)
+        SOURCES += $$eval($${generator}.extra_sources)
+
         isEqual($${generator}.add_output_to_sources, false): next()
 
         output = $$eval($${generator}.output)
@@ -145,34 +151,10 @@
                 eval($$output_variable += $$output_file)
             }
         }
-
-        prependEach($${generator}.extra_sources, $${GENERATED_SOURCES_DESTDIR}/)
-        SOURCES += $$eval($${generator}.extra_sources)
     }
 }
 
-contains(TEMPLATE, lib) {
-    # Triggers the right export macros for WebKit internals
-    DEFINES += BUILDING_$${TARGET}
-
-    # Triggers the right export macro for the QtWebKit API (see qwebkitglobal.h)
-    DEFINES += BUILDING_WEBKIT
-
-    # Prevent name clashes when building both debug and release. Qt5's module
-    # system already takes care of this for the top level QtWebKit library.
-    !qt_install_module:debug_and_release: TARGET = $$qtLibraryTarget($$TARGET)
-
-    isEmpty(DESTDIR): DESTDIR = $$activeBuildConfig()
-
-    DEFINES += QT_ASCII_CAST_WARNINGS
-
-    !plugin {
-        contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
-        unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions
-    }
-}
-
-contains(QT, webkitwidgets) {
+contains(QT, webkit)|contains(QT, webkitwidgets) {
     # In addition to the main shared QtWebKit library we also
     # need to link to any intermediate shared libraries.
     force_static_libs_as_shared {
@@ -193,12 +175,12 @@
         contains(libraries, $$TARGET): return(true)
 
         # Or anything that uses QtWebKit in this special config
-        contains(QT, webkitwidgets): return(true)
+        contains(QT, webkit): return(true)
     }
 
     # Lastly, we allow apps (jsc) to link directly to the intermediate
     # libraries intead of using the exported symbols from QtWebKit.
-    contains(TEMPLATE, app):!contains(QT, webkitwidgets): return(true)
+    contains(TEMPLATE, app):!contains(QT, webkit):!contains(QT, webkitwidgets): return(true)
 
     # Anything else should just get include paths, etc, not link
     return(false)
@@ -222,6 +204,10 @@
     # to end up in as public API dependenices in the QtWebKit prl file.
     LIBS_PRIVATE += $$LIBS
     unset(LIBS)
+    # Copy Qt module dependencies from QT to QT_PRIVATE to ensure the
+    # Qt libraries are linked after the private static libraries that
+    # depend on them
+    QT_PRIVATE += $$QT
 }
 
 equals(_PRO_FILE_, $${ROOT_WEBKIT_DIR}/WebKit.pro):!isEmpty(OVERRIDE_SUBDIRS) {
@@ -247,7 +233,7 @@
     # qmake_all and generate all the derived sources, just to
     # build documentation.
     previous_subdir =
-    doc_targets = docs install_docs uninstall_docs
+    doc_targets = docs install_docs uninstall_docs prepare_docs generate_docs
     for(subdir, SUBDIRS) {
         equals(subdir, QtWebKit) {
             for(doc_target, doc_targets) {
@@ -270,10 +256,32 @@
 incremental.commands = $(MAKE) -f $(MAKEFILE) qmake_all && $(MAKE) -f $(MAKEFILE)
 QMAKE_EXTRA_TARGETS += incremental
 
-# Don't set OBJECTS_DIR for subdirs, as that will unconditionally
-# create the directory, even if we're not using it.
-contains(TEMPLATE, subdirs) {
-    unset(OBJECTS_DIR)
+contains(TEMPLATE, lib) {
+    # Triggers the right export macros for WebKit internals
+    DEFINES += BUILDING_$${TARGET}
+
+    # Triggers the right export macro for the QtWebKit API (see qwebkitglobal.h)
+    !contains(QT, webkit)|equals(MODULE, webkitwidgets): DEFINES += BUILDING_WEBKIT
+
+    # Prevent name clashes when building both debug and release. Qt5's module
+    # system already takes care of this for the top level QtWebKit library.
+    !qt_install_module:debug_and_release: TARGET = $$qtLibraryTarget($$TARGET)
+
+    gnu_thin_archives {
+        # Replace the hardcoded archiver command line
+        # options to use GNU ar's thin archive format.
+        AR_COMMAND = $$split(QMAKE_AR, " ")
+        QMAKE_AR = $$member(AR_COMMAND, 0) cruT
+    }
+
+    isEmpty(DESTDIR): DESTDIR = $$targetSubDir()
+
+    DEFINES += QT_ASCII_CAST_WARNINGS
+
+    !plugin {
+        contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
+        unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions
+    }
 }
 
 # Remove duplicated sources
@@ -301,6 +309,6 @@
 # desination dir is absolute and contains a static path component
 # that also contains either of those two words, so we make DESTDIR
 # relative.
-DESTDIR = $$replace(DESTDIR, ^$${ROOT_BUILD_DIR}, $${BUILD_ROOT_RELATIVE_TO_OUT_PWD})
+DESTDIR = $$replace(DESTDIR, ^$$re_escape($${ROOT_BUILD_DIR}), $${BUILD_ROOT_RELATIVE_TO_OUT_PWD})
 
 load(default_post) # Load Qt's defaults
diff --git a/Tools/qmake/mkspecs/features/default_pre.prf b/Tools/qmake/mkspecs/features/default_pre.prf
index 39eec9b..5bae7dc 100644
--- a/Tools/qmake/mkspecs/features/default_pre.prf
+++ b/Tools/qmake/mkspecs/features/default_pre.prf
@@ -11,10 +11,6 @@
 
 load(functions)
 
-# Derived sources often need QMAKE_MOC
-load(qt_functions)
-load(moc)
-
 # FIXME: In this case we probably want to exit early so that we
 # don't load all of the custom build tweaks needlessly.
 pro_file = $$_PRO_FILE_ # Checking the variable directly does not work
@@ -22,8 +18,8 @@
 
 # Resolve root directories for source and build
 ROOT_WEBKIT_DIR = $$replace(PWD, /Tools/qmake/mkspecs/features$,)
-WEBKIT_SUBDIR = $$replace(_PRO_FILE_PWD_, $${ROOT_WEBKIT_DIR},)
-ROOT_BUILD_DIR = $$replace(OUT_PWD, $${WEBKIT_SUBDIR}$,)
+WEBKIT_SUBDIR = $$replace(_PRO_FILE_PWD_, $$re_escape($${ROOT_WEBKIT_DIR}),)
+ROOT_BUILD_DIR = $$replace(OUT_PWD, $$re_escape($${WEBKIT_SUBDIR})$,)
 
 # Now we're ready to load default_pre from Qt
 load(default_pre)
@@ -32,7 +28,7 @@
     !recursive_include:CONFIG += root_project_file
     BUILD_ROOT_RELATIVE_TO_OUT_PWD = .
 } else {
-    subdir_parts = $$replace(OUT_PWD, ^$${ROOT_BUILD_DIR}/,)
+    subdir_parts = $$replace(OUT_PWD, ^$$re_escape($${ROOT_BUILD_DIR})/,)
     subdir_parts = $$split(subdir_parts, /)
     for(subdir, subdir_parts) {
         BUILD_ROOT_RELATIVE_TO_OUT_PWD += ..
@@ -66,11 +62,6 @@
 MAKEFILE_NOOP_COMMAND = @echo -n
 win32-msvc*: MAKEFILE_NOOP_COMMAND = @echo >NUL
 
-# Help keep the build tree clean
-MOC_DIR = moc
-RCC_DIR = rcc
-OBJECTS_DIR = obj/$$activeBuildConfig()
-
 # Set up a default python version
 scratchbox: PYTHON = python2.6
 else: PYTHON = python
@@ -94,22 +85,21 @@
 # Set some defaults for specific platforms
 CONFIG += include_webinspector
 
+# Make sure we process the PKGCONFIG variable if applicable
+!mac: CONFIG += link_pkgconfig
+
 # By default we enable "production build", and build-webkit, which is
 # used by bots and developers, will disable it, to enable warnings etc.
 CONFIG += production_build
 
+!debug_and_release:*-g++*: CONFIG += gnu_thin_archives
+
 # Pick up Qt's defaults for debug/release/debug_and_release
 if(win32|mac):!macx-xcode {
     contains(QT_CONFIG, debug_and_release): CONFIG += debug_and_release
     contains(QT_CONFIG, build_all): CONFIG += build_all
 }
 
-# Try to locate sqlite3 source (for WebCore)
-SQLITE3SRCDIR = $$(SQLITE3SRCDIR)
-isEmpty(SQLITE3SRCDIR) {
-    SQLITE3SRCDIR = $$QT.core.sources/../3rdparty/sqlite/
-}
-
 # A newer version of flex is required on Windows. At the moment the only
 # one that appears to provide binaries and is not cygwin is winflex.
 FLEX = flex
diff --git a/Tools/qmake/mkspecs/features/features.prf b/Tools/qmake/mkspecs/features/features.prf
index bc285a2..86ed06f 100644
--- a/Tools/qmake/mkspecs/features/features.prf
+++ b/Tools/qmake/mkspecs/features/features.prf
@@ -36,16 +36,20 @@
     haveQtModule(printsupport): WEBKIT_CONFIG += have_qtprintsupport
     haveQtModule(widgets): WEBKIT_CONFIG += have_qstyle
     haveQtModule(testlib): WEBKIT_CONFIG += have_qttestlib
+    haveQtModule(location): WEBKIT_CONFIG += have_qtlocation
+    haveQtModule(sensors): WEBKIT_CONFIG += have_qtsensors
 
     config_libxml2: WEBKIT_CONFIG += use_libxml2
     config_libxslt: WEBKIT_CONFIG += xslt
     config_libzlib: WEBKIT_CONFIG += use_zlib
     config_libwebp: WEBKIT_CONFIG += use_webp
 
-    config_libjpeg: WEBKIT_CONFIG += use_libjpeg
+    # We can't use Qt's 3rdparty sources for libjpeg and libpng outside of qtbase, but if Qt
+    # is using the system libraries, use them to take advantage of the WebCore image decoders as well.
+    contains(QT_CONFIG, system-jpeg): WEBKIT_CONFIG += use_libjpeg
     else: CONFIGURE_WARNINGS += "JPEG library not found, QImageDecoder will decode JPEG images"
 
-    config_libpng: WEBKIT_CONFIG += use_libpng
+    contains(QT_CONFIG, system-png): WEBKIT_CONFIG += use_libpng
     else: CONFIGURE_WARNINGS += "PNG library not found, QImageDecoder will decode PNG images"
 
     linux-* {
@@ -95,11 +99,13 @@
     # Enable CSS shaders when CSS filters and WebGL are enabled
     enable?(css_filters):enable?(webgl): WEBKIT_CONFIG += css_shaders
 
-    # Geolocation support if QtMobility exists
-    haveQtModule(location): WEBKIT_CONFIG += geolocation
+    # Geolocation support if QtLocation exists or if we're doing a developer build (Mock implementation exists
+    # and used for layout tests)
+    have?(qtlocation)|!production_build: WEBKIT_CONFIG += geolocation
 
-    # Orientation support
-    haveQtModule(sensors): WEBKIT_CONFIG += orientation_events device_orientation
+    # Orientation support if QtSensors exists or if we're doing a developer build (Mock implementation exists
+    # and used for layout tests)
+    have?(qtsensors)|!production_build: WEBKIT_CONFIG += orientation_events device_orientation
 
     # HTML5 Media Support
     mac {
@@ -111,8 +117,10 @@
         }
 
     } else: linux-* {
-        !contains(QT_CONFIG, no-pkg-config):packagesExist("glib-2.0 gio-2.0 \'gstreamer-0.10 >= 0.10.30\' \'gstreamer-plugins-base-0.10 >= 0.10.30\'") {
+        !contains(QT_CONFIG, no-pkg-config):packagesExist("glib-2.0 gio-2.0 gstreamer-1.0 gstreamer-plugins-base-1.0") {
             WEBKIT_CONFIG += video use_gstreamer
+        } else:!contains(QT_CONFIG, no-pkg-config):packagesExist("glib-2.0 gio-2.0 \'gstreamer-0.10 >= 0.10.30\' \'gstreamer-plugins-base-0.10 >= 0.10.30\'") {
+            WEBKIT_CONFIG += video use_gstreamer use_gstreamer010
         } else {
             CONFIGURE_WARNINGS += "Missing GLib/Gio/GStreamer, disabling media element support"
         }
@@ -120,6 +128,14 @@
         WEBKIT_CONFIG += video use_qt_multimedia
     }
 
+    # Try to use an system wide SQlite installation
+    if(!contains(QT_CONFIG, no-pkg-config):packagesExist("sqlite3"))|mac {
+        WEBKIT_CONFIG += have_sqlite3
+    } else {
+        SQLITE3SRCDIR = $$(SQLITE3SRCDIR)
+        isEmpty(SQLITE3SRCDIR):isEmpty(_QMAKE_SUPER_CACHE_): error("WebKit requires SQLite. Either make it available via pkg-config, set $SQLITE3SRCDIR or build WebKit under qt5.git.")
+    }
+
     # Gamepad API Support
     packagesExist(libudev): WEBKIT_CONFIG += gamepad
 
@@ -128,12 +144,16 @@
     use?(3d_graphics) {
         mac: WEBKIT_CONFIG += use_graphics_surface
         win32:contains(QT_CONFIG, opengles2): WEBKIT_CONFIG += use_graphics_surface
-        linux-*:contains(WEBKIT_CONFIG, have_glx):contains(WEBKIT_CONFIG, have_xcomposite):contains(WEBKIT_CONFIG, have_xrender): WEBKIT_CONFIG += use_graphics_surface
+        linux-*:contains(WEBKIT_CONFIG, have_glx):contains(WEBKIT_CONFIG, have_xcomposite):contains(WEBKIT_CONFIG, have_xrender): WEBKIT_CONFIG += use_graphics_surface use_glx
     }
 
     # Slider Touch is sensible to use when compiling WebKit2
     enable?(touch_events): WEBKIT_CONFIG += touch_slider
 
+
+    # Minibrowser must be able to query for QtTestSupport
+    build?(qttestsupport): WEBKIT_CONFIG += have_qttestsupport
+
     # ---------------- Sanitize features -------------------
 
     export(WEBKIT_CONFIG)
@@ -156,5 +176,8 @@
     # WK2's plugin process code requires NPAPI
     !enable?(netscape_plugin_api): WEBKIT_CONFIG -= plugin_process
 
+    # Web Audio requires GStreamer.
+    !use?(gstreamer): WEBKIT_CONFIG -= web_audio
+
     export(WEBKIT_CONFIG)
 }
diff --git a/Tools/qmake/mkspecs/features/features.pri b/Tools/qmake/mkspecs/features/features.pri
index 1272ece..3c4f3da 100644
--- a/Tools/qmake/mkspecs/features/features.pri
+++ b/Tools/qmake/mkspecs/features/features.pri
@@ -15,9 +15,10 @@
 FEATURE_DEFAULTS = \
     ENABLE_3D_RENDERING=1 \
     ENABLE_ACCELERATED_2D_CANVAS=0 \
-    ENABLE_ANIMATION_API=0 \
     ENABLE_BATTERY_STATUS=0 \
     ENABLE_BLOB=1 \
+    ENABLE_CANVAS_PATH=1 \
+    ENABLE_CANVAS_PROXY=0 \
     ENABLE_CHANNEL_MESSAGING=1 \
     ENABLE_CSP_NEXT=0 \
     ENABLE_CSS_BOX_DECORATION_BREAK=1 \
@@ -32,9 +33,11 @@
     ENABLE_CSS_REGIONS=1 \
     ENABLE_CSS_SHADERS=0 \
     ENABLE_CSS_STICKY_POSITION=1 \
+    ENABLE_CSS_TRANSFORMS_ANIMATIONS_UNPREFIXED=1 \
     ENABLE_CSS_VARIABLES=0 \
     ENABLE_CSS3_CONDITIONAL_RULES=0 \
     ENABLE_CSS3_TEXT=0 \
+    ENABLE_CSS3_TEXT_LINE_BREAK=0 \
     ENABLE_DASHBOARD_SUPPORT=0 \
     ENABLE_DATAGRID=0 \
     ENABLE_DATALIST_ELEMENT=1 \
@@ -46,6 +49,7 @@
     ENABLE_FAST_MOBILE_SCROLLING=1 \
     ENABLE_FILE_SYSTEM=0 \
     ENABLE_FILTERS=1 \
+    ENABLE_FONT_LOAD_EVENTS=0 \
     ENABLE_FTPDIR=1 \
     ENABLE_FULLSCREEN_API=1 \
     ENABLE_GAMEPAD=0 \
@@ -70,25 +74,29 @@
     ENABLE_LEGACY_NOTIFICATIONS=1 \
     ENABLE_LEGACY_VIEWPORT_ADAPTION=1 \
     ENABLE_LEGACY_VENDOR_PREFIXES=1 \
-    ENABLE_LINK_PREFETCH=0 \
+    ENABLE_LEGACY_WEB_AUDIO=1 \
+    ENABLE_LINK_PREFETCH=1 \
     ENABLE_LINK_PRERENDER=0 \
     ENABLE_MATHML=0 \
     ENABLE_MEDIA_SOURCE=0 \
     ENABLE_MEDIA_STATISTICS=0 \
     ENABLE_MEDIA_STREAM=0 \
     ENABLE_METER_ELEMENT=1 \
-    ENABLE_MHTML=0 \
+    ENABLE_MHTML=1 \
     ENABLE_MICRODATA=0 \
-    ENABLE_MUTATION_OBSERVERS=0 \
+    ENABLE_MOUSE_CURSOR_SCALE=0 \
     ENABLE_NAVIGATOR_CONTENT_UTILS=0 \
     ENABLE_NETSCAPE_PLUGIN_API=0 \
     ENABLE_NETWORK_INFO=0 \
+    ENABLE_NOSNIFF=0 \
     ENABLE_NOTIFICATIONS=1 \
     ENABLE_ORIENTATION_EVENTS=0 \
     ENABLE_PAGE_VISIBILITY_API=1 \
     ENABLE_PROGRESS_ELEMENT=1 \
+    ENABLE_PROXIMITY_EVENTS=0 \
     ENABLE_QUOTA=0 \
     ENABLE_RESOLUTION_MEDIA_QUERY=1 \
+    ENABLE_RESOURCE_TIMING=0 \
     ENABLE_REQUEST_ANIMATION_FRAME=1 \
     ENABLE_SCRIPTED_SPEECH=0 \
     ENABLE_SHADOW_DOM=0 \
@@ -99,18 +107,22 @@
     ENABLE_SVG=1 \
     ENABLE_SVG_DOM_OBJC_BINDINGS=0 \
     ENABLE_SVG_FONTS=1 \
+    ENABLE_TEMPLATE_ELEMENT=0 \
     ENABLE_TEXT_AUTOSIZING=0 \
     ENABLE_TEXT_NOTIFICATIONS_ONLY=0 \
+    ENABLE_THREADED_HTML_PARSER=0 \
     ENABLE_TOUCH_ADJUSTMENT=1 \
     ENABLE_TOUCH_EVENTS=1 \
     ENABLE_TOUCH_ICON_LOADING=0 \
+    ENABLE_USER_TIMING=0 \
     ENABLE_VIBRATION=0 \
     ENABLE_VIDEO=0 \
     ENABLE_VIDEO_TRACK=0 \
+    ENABLE_VIEW_MODE_CSS_MEDIA=1 \
     ENABLE_WEBGL=0 \
     ENABLE_WEB_AUDIO=0 \
     ENABLE_WEB_SOCKETS=1 \
     ENABLE_WEB_TIMING=1 \
     ENABLE_WORKERS=1 \
-    ENABLE_XHR_TIMEOUT = 0 \
+    ENABLE_XHR_TIMEOUT=1 \
     ENABLE_XSLT=0 \
diff --git a/Tools/qmake/mkspecs/features/functions.prf b/Tools/qmake/mkspecs/features/functions.prf
index c54a262..10a9764 100644
--- a/Tools/qmake/mkspecs/features/functions.prf
+++ b/Tools/qmake/mkspecs/features/functions.prf
@@ -24,8 +24,12 @@
     return($$replace(1, \\\\, \\\\\\\\))
 }
 
-defineReplace(activeBuildConfig) {
-    CONFIG(debug, debug|release): return(debug)
+defineReplace(targetSubDir) {
+    # The paths to the elements of the thin archive are stored
+    # relative to the archive itself, thus we have to prevent
+    # qmake from moving the archive after creation.
+    gnu_thin_archives: return()
+    else: CONFIG(debug, debug|release): return(debug)
     else: return(release)
 }
 
@@ -53,7 +57,7 @@
     }
 
     # Make directory relative
-    !isEmpty(subdirectory):subdirectory = $$replace(subdirectory, ^$${_PRO_FILE_PWD_}/,)
+    !isEmpty(subdirectory):subdirectory = $$replace(subdirectory, ^$$re_escape($${_PRO_FILE_PWD_})/,)
 
     !isEmpty(subdirectory) {
         subdir_command = cd $$toSystemPath($${subdirectory}$${QMAKE_DIR_SEP}) &&
@@ -129,8 +133,8 @@
     }
 
     # Make sure the order is right
-    SUBDIRS -= $$firstSubdir $$secondSubdir
-    SUBDIRS += $$firstSubdir $$secondSubdir
+    SUBDIRS -= $$secondSubdir
+    SUBDIRS += $$secondSubdir
     NO_RECURSIVE_QMAKE_SUBDIRS += $$firstSubdir $$secondSubdir
     CONFIG *= ordered
 
@@ -199,6 +203,25 @@
     return(false)
 }
 
+defineTest(programExistsInPath) {
+    win_cmd_shell: program = $${1}.exe
+    else: program = $$1
+
+    PATH = "$$(PATH)"
+    paths=$$split(PATH, $$QMAKE_DIRLIST_SEP)
+
+    GNUTOOLS_DIR=$$[QT_HOST_DATA]/../gnuwin32/bin
+    exists($$GNUTOOLS_DIR): paths += $$GNUTOOLS_DIR
+
+    for(p, paths): exists($$p/$$program):return(true)
+    return(false)
+}
+
+defineTest(addReasonForSkippingBuild) {
+    skipBuildReason = "$$skipBuildReason$${EOL}    * $$1"
+    export(skipBuildReason)
+}
+
 defineTest(prependEach) {
     unset(variable)
     unset(prefix)
@@ -245,7 +268,7 @@
 
     target = $$resolveFinalLibraryName($$target)
 
-    path = $$replace(source_dir, $${ROOT_WEBKIT_DIR}, $${ROOT_BUILD_DIR})/$$activeBuildConfig()
+    path = $$replace(source_dir, $$re_escape($${ROOT_WEBKIT_DIR}), $${ROOT_BUILD_DIR})/$$targetSubDir()
 
     force_static_libs_as_shared {
             LIBS += -L$${ROOT_BUILD_DIR}/lib -l$$target
@@ -256,6 +279,7 @@
         } else:win32-msvc*|wince*|win32-icc {
             LIBS += /OPT:REF -l$$target
         } else {
+            CONFIG *= no_smart_library_merge
             LIBS += -Wl,-whole-archive -l$$target -Wl,-no-whole-archive
         }
 
diff --git a/Tools/qmake/mkspecs/features/production_build.prf b/Tools/qmake/mkspecs/features/production_build.prf
index b3f36ab..c980d09 100644
--- a/Tools/qmake/mkspecs/features/production_build.prf
+++ b/Tools/qmake/mkspecs/features/production_build.prf
@@ -8,7 +8,7 @@
 # by compiling any static library like WTF or JSC with release flags instead and keep debug
 # symbols for the static libraries that implement API.
 linux-*|win32-g++*:if(CONFIG(debug, debug|release)|contains(QT_CONFIG,separate_debug_info)):contains(TEMPLATE, lib):staticlib {
-    !equals(TARGET, WebKit2):!equals(TARGET, WebKit1) {
+    !equals(TARGET, WebKit2):!equals(TARGET, WebKitWidgets) {
         CONFIG += no_debug_info
         CONFIG -= separate_debug_info
         QMAKE_CFLAGS += $$QMAKE_CFLAGS_RELEASE
diff --git a/Tools/qmake/mkspecs/features/unix/default_post.prf b/Tools/qmake/mkspecs/features/unix/default_post.prf
index 5a73f17..8c36146 100644
--- a/Tools/qmake/mkspecs/features/unix/default_post.prf
+++ b/Tools/qmake/mkspecs/features/unix/default_post.prf
@@ -10,9 +10,13 @@
 linux-g++*:isEqual(QT_ARCH,i386) {
     QMAKE_CFLAGS += -march=pentium4 -msse2 -mfpmath=sse
     QMAKE_CXXFLAGS += -march=pentium4 -msse2 -mfpmath=sse
+
+    # Use the stabs format for 32 bit debug builds to make the object files a bit smaller.
+    QMAKE_CXXFLAGS_DEBUG -= -g
+    QMAKE_CXXFLAGS_DEBUG += -gstabs
 }
 
-linux-g++* {
+linux-*g++* {
     !production_build {
         # Treat warnings as errors on x86/Linux/GCC
         isEqual(QT_ARCH,x86_64)|isEqual(QT_ARCH,i386): QMAKE_CXXFLAGS += -Werror
diff --git a/Tools/qmake/mkspecs/features/unix/default_pre.prf b/Tools/qmake/mkspecs/features/unix/default_pre.prf
index 83b7cc4..aafc48c 100644
--- a/Tools/qmake/mkspecs/features/unix/default_pre.prf
+++ b/Tools/qmake/mkspecs/features/unix/default_pre.prf
@@ -16,9 +16,6 @@
 # flag that can be used to test for either of these situations.
 contains(QT_CONFIG, qpa)|contains(QT_CONFIG, embedded): CONFIG += embedded
 
-# Make sure we process the PKGCONFIG variable if applicable
-!mac: CONFIG += link_pkgconfig
-
 # Reduce linking memory pressure on 32-bit debug builds on Linux
 linux-g++*:CONFIG(debug, debug|release):isEqual(QT_ARCH,i386): CONFIG += use_all_in_one_files
 
diff --git a/Tools/qmake/mkspecs/features/webkit_modules.prf b/Tools/qmake/mkspecs/features/webkit_modules.prf
index b2f3353..2a520d7 100644
--- a/Tools/qmake/mkspecs/features/webkit_modules.prf
+++ b/Tools/qmake/mkspecs/features/webkit_modules.prf
@@ -7,7 +7,7 @@
 
 # Reorder libraries so that the link and include order is correct,
 # and make sure the case matches the original case.
-libraries = WebKit1 WebKit2 WebCore ANGLE JavaScriptCore WTF
+libraries = WebKit1 WebKit2QML WebKit2 WebCore ANGLE JavaScriptCore WTF
 for(library, libraries) {
     contains(WEBKIT, $$lower($$library)) {
         WEBKIT -= $$lower($$library)
@@ -34,11 +34,9 @@
 
     # Anything not linking dynamically to QtWebKit should make sure to have its export
     # macros synchronized with the code that it will be linked with statically.
-    !contains(QT, webkitwidgets): DEFINES += STATICALLY_LINKED_WITH_$$library
+    !contains(QT, webkit): DEFINES += STATICALLY_LINKED_WITH_$$library
 }
 
-!isEmpty(MODULE): CONFIG += creating_module
-
 creating_module {
     # Sanitize PKGCONFIG as we don't want any of these libraries
     # to end up in as public API dependenices in the QtWebKit prl file.
diff --git a/Tools/qmake/mkspecs/features/win32/default_post.prf b/Tools/qmake/mkspecs/features/win32/default_post.prf
index 93861ef..acf2e86 100644
--- a/Tools/qmake/mkspecs/features/win32/default_post.prf
+++ b/Tools/qmake/mkspecs/features/win32/default_post.prf
@@ -39,5 +39,3 @@
     GENERATED_SOURCES += $$forwarded_exports.target
 }
 
-# To ensure the Qt export macros are set to dllexport
-contains(TEMPLATE, lib):!contains(QT, webkitwidgets): DEFINES += QT_MAKEDLL
diff --git a/Tools/qmake/mkspecs/modules/webkit2qml.prf b/Tools/qmake/mkspecs/modules/webkit2qml.prf
new file mode 100644
index 0000000..06566f4
--- /dev/null
+++ b/Tools/qmake/mkspecs/modules/webkit2qml.prf
@@ -0,0 +1,9 @@
+# -------------------------------------------------------------------
+# Module file for WebKit2, used by targets that depend on WebKit2
+#
+# See 'Tools/qmake/README' for an overview of the build system
+# -------------------------------------------------------------------
+
+WEBKIT.webkit2qml.root_source_dir = $${ROOT_WEBKIT_DIR}/Source/WebKit2
+
+#include($${WEBKIT.webkit2.root_source_dir}/WebKit2QML.pri)
diff --git a/Tools/svn-config b/Tools/svn-config
new file mode 100644
index 0000000..2684c7c
--- /dev/null
+++ b/Tools/svn-config
@@ -0,0 +1,11 @@
+# This file contains the expected SVN config for developing WebKit.
+# You may either copy it to ~/.subversion/config or merge it with your existing SVN configuration.
+
+[miscellany]
+enable-auto-props = yes
+
+[auto-props]
+*.png = svn:mime-type=image/png
+*.sln = svn:eol-style=native
+*.vcproj = svn:eol-style=native
+*.vsprops = svn:eol-style=native
\ No newline at end of file
diff --git a/Tools/win/AssembleBuildLogs/AssembleBuildLogs.vcxproj b/Tools/win/AssembleBuildLogs/AssembleBuildLogs.vcxproj
new file mode 100644
index 0000000..a126101
--- /dev/null
+++ b/Tools/win/AssembleBuildLogs/AssembleBuildLogs.vcxproj
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{67A61940-F80B-42A0-A29D-B6DB1C27BCEE}</ProjectGuid>

+    <Keyword>MakeFileProj</Keyword>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Makefile</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Makefile</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>Makefile</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <NMakePreprocessorDefinitions>WIN32;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>

+    <NMakeBuildCommandLine>AssembleLogs.cmd</NMakeBuildCommandLine>

+    <NMakeReBuildCommandLine>AssembleLogs.cmd</NMakeReBuildCommandLine>

+    <NMakeCleanCommandLine>if exist "%CONFIGURATIONBUILDDIR%\BuildOutput.htm" del "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"</NMakeCleanCommandLine>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <NMakePreprocessorDefinitions>WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>

+    <NMakeBuildCommandLine>AssembleLogs.cmd</NMakeBuildCommandLine>

+    <NMakeReBuildCommandLine>AssembleLogs.cmd</NMakeReBuildCommandLine>

+    <NMakeCleanCommandLine>if exist "%CONFIGURATIONBUILDDIR%\BuildOutput.htm" del "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"</NMakeCleanCommandLine>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">

+    <NMakePreprocessorDefinitions>WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>

+    <NMakeBuildCommandLine>AssembleLogs.cmd</NMakeBuildCommandLine>

+    <NMakeReBuildCommandLine>AssembleLogs.cmd</NMakeReBuildCommandLine>

+    <NMakeCleanCommandLine>if exist "%CONFIGURATIONBUILDDIR%\BuildOutput.htm" del "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"</NMakeCleanCommandLine>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <None Include="AssembleLogs.cmd" />

+    <None Include="readme.txt" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/win/AssembleBuildLogs/AssembleBuildLogs.vcxproj.filters b/Tools/win/AssembleBuildLogs/AssembleBuildLogs.vcxproj.filters
new file mode 100644
index 0000000..bc53a0c
--- /dev/null
+++ b/Tools/win/AssembleBuildLogs/AssembleBuildLogs.vcxproj.filters
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <None Include="readme.txt" />

+    <None Include="AssembleLogs.cmd" />

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/win/AssembleBuildLogs/AssembleLogs.cmd b/Tools/win/AssembleBuildLogs/AssembleLogs.cmd
new file mode 100755
index 0000000..31b7718
--- /dev/null
+++ b/Tools/win/AssembleBuildLogs/AssembleLogs.cmd
@@ -0,0 +1,165 @@
+if exist "%CONFIGURATIONBUILDDIR%\BuildOutput.htm" del "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WTFGenerated...                                 >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WTFGenerated\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WTF...                                          >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WTF\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING JavaScriptCoreGenerated...                      >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\JavaScriptCoreGenerated\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING LLIntDesiredOffsets...                          >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\LLIntDesiredOffsets\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING LLIntOffsetsExtractor...                        >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\LLIntOffsetsExtractor\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING LLIntAssembly...                                >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\LLIntAssembly\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING JavaScriptCoreExportGenerator...                >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\JavaScriptCoreExportGenerator\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING JavaScriptCore...                               >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\JavaScriptCore\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING jsc...                                          >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\jsc\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING testRegExp...                                   >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\testRegExp\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING testapi...                                      >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\testapi\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebKitSystemInterfaceGenerated...               >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebKitSystemInterfaceGenerated\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebKitSystemInterface...                        >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebKitSystemInterface\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebKitQuartzCoreAdditionsGenerated...           >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebKitQuartzCoreAdditionsGenerated\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebKitQuartzCoreAdditions...                    >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebKitQuartzCoreAdditions\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebCoreGenerated...                             >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebCoreGenerated\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING QTMovieWin...                                   >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\QTMovieWin\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebCore...                                      >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebCore\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebCoreTestSupport...                           >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebCoreTestSupport\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING Interfaces...                                   >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\Interfaces\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebKitGUID...                                   >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebKitGUID\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebKitExportGenerator...                        >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebKitExportGenerator\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WebKit...                                       >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WebKit\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WinLauncherLib...                               >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WinLauncherLib\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING WinLauncher...                                  >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\WinLauncher\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING TestNetscapePlugin...                           >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\TestNetscapePlugin\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING ImageDiff...                                    >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\ImageDiff\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING ImageDiffLauncher...                            >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\ImageDiffLauncher\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING DumpRenderTree...                               >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\DumpRenderTree\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING DumpRenderTreeLauncher...                       >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\DumpRenderTreeLauncher\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING record-memory...                                >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\record-memory\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING gtest-md...                                     >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\gtest-md\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo COMPILING TestWebKitAPI...                                >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+echo _________________________________________________________ >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
+type "%CONFIGURATIONBUILDDIR%\obj\TestWebKitAPI\BuildLog.htm" >> "%CONFIGURATIONBUILDDIR%\BuildOutput.htm"
\ No newline at end of file
diff --git a/Tools/win/AssembleBuildLogs/README b/Tools/win/AssembleBuildLogs/README
new file mode 100644
index 0000000..6371d98
--- /dev/null
+++ b/Tools/win/AssembleBuildLogs/README
@@ -0,0 +1,10 @@
+The purpose of this project is to concatenate all the BuildLog.htm 
+output files from each project into a single output file.
+
+This is useful for compiling with VCExpress using command line build
+because VCExpress does not output any single unified build log for the
+whole solution. Thus, we need to rely on pieceing together build logs
+for each individual project.
+
+If any project is added to the solution it should be made sure that it 
+is added to the AssembleLogs.cmd script.
\ No newline at end of file
diff --git a/Tools/win/record-memory/main.cpp b/Tools/win/record-memory/main.cpp
new file mode 100644
index 0000000..934f101
--- /dev/null
+++ b/Tools/win/record-memory/main.cpp
@@ -0,0 +1,213 @@
+#include <windows.h>

+#include <assert.h>

+#include <psapi.h>

+#include <stdio.h>

+#include <tchar.h>

+#include <time.h>

+#include <tlhelp32.h>

+#include "Shlwapi.h"

+

+#pragma comment(lib, "psapi.lib")

+#pragma comment(lib, "shlwapi.lib")

+

+int gQueryInterval = 5; // seconds

+time_t gDuration = 0;   // seconds

+LPTSTR gCommandLine;

+

+HRESULT ProcessArgs(int argc, TCHAR *argv[]);

+HRESULT PrintUsage();

+void UseImage(void (functionForQueryType(HANDLE)));

+void QueryContinuously(HANDLE hProcess);

+int EvalProcesses(HANDLE hProcess);

+time_t ElapsedTime(time_t startTime);

+

+int __cdecl _tmain (int argc, TCHAR *argv[])

+{

+    HRESULT result = ProcessArgs(argc, argv);

+    if (FAILED(result))

+        return result;

+

+    UseImage(QueryContinuously);

+    return S_OK;

+}

+

+HRESULT ProcessArgs(int argc, TCHAR *argv[])

+{

+    LPTSTR argument;

+    for( int count = 1; count < argc; count++ ) {

+        argument = argv[count] ;

+        if (wcsstr(argument, _T("-h")) || wcsstr(argument, _T("--help")))

+            return PrintUsage();

+        else if (wcsstr(argument, _T("--exe"))) {

+            gCommandLine = argv[++count];

+        } else if (wcsstr(argument, _T("-i")) || 

+            wcsstr(argument, _T("--interval"))) {

+            gQueryInterval = _wtoi(argv[++count]);

+            if (gQueryInterval < 1) {

+                printf("ERROR: invalid interval\n");

+                return E_INVALIDARG;

+            }

+        } else if (wcsstr(argument, _T("-d")) ||

+            wcsstr(argument, _T("--duration"))) {

+            gDuration = _wtoi(argv[++count]);

+            if (gDuration < 1) {

+                printf("ERROR: invalid duration\n");

+                return E_INVALIDARG;

+            }

+        } else {

+            _tprintf(_T("ERROR: unrecognized argument \"%s\"\n"), (LPCTSTR)argument);

+            return PrintUsage();

+        }

+    }

+    if (argc < 2 || !wcslen(gCommandLine) ) {

+        printf("ERROR: executable path is required\n");

+        return PrintUsage();

+    }

+    return S_OK;

+}

+

+HRESULT PrintUsage()

+{

+    printf("record-memory-win --exe EXE_PATH\n");

+    printf("    Launch an executable and print the memory usage (in Private Bytes)\n");

+    printf("    of the process.\n\n");

+    printf("Usage:\n");

+    printf("-h [--help]         : Print usage\n");

+    printf("--exe arg           : Launch specified image.  Required\n");

+    printf("-i [--interval] arg : Print memory usage every arg seconds.  Default: 5 seconds\n");

+    printf("-d [--duration] arg : Run for up to arg seconds.  Default: no limit\n\n");

+    printf("Examples:\n");

+    printf("    record-memory-win --exe \"C:\\Program Files\\Safari\\Safari.exe /newprocess\"\n");

+    printf("    record-memory-win --exe \"Safari.exe /newprocess\" -i 10 -d 7200\n");

+    printf("    NOTE: Close all other browser intances to ensure launching in a new process\n");

+    printf("          Or, pass the /newprocess (or equivalent) argument to the browser\n");

+    return E_FAIL;

+}

+

+unsigned int getMemoryInfo(DWORD processID)

+{

+    unsigned int memInfo = 0;

+    HANDLE hProcess;

+    PROCESS_MEMORY_COUNTERS_EX pmc;

+

+    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |

+                                    PROCESS_VM_READ,

+                                    FALSE, processID );

+    if (NULL == hProcess)

+        return 0;

+

+    if (GetProcessMemoryInfo( hProcess, (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc))) {

+        memInfo = (pmc.PrivateUsage);

+    }

+

+    CloseHandle( hProcess );

+    return memInfo;

+}

+

+void printProcessInfo(DWORD processID)

+{

+    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

+   

+    // Get a handle to the process.

+    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |

+                                   PROCESS_VM_READ,

+                                   FALSE, processID );

+

+    // Get the process name.

+    if (NULL != hProcess) {

+        HMODULE hMod;       // An array that receives the list of module handles.

+        DWORD cbNeeded;     //The number of bytes required to store all module handles in the Module array

+

+        if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) {

+            GetModuleBaseName(hProcess, hMod, szProcessName, 

+                               sizeof(szProcessName)/sizeof(TCHAR));

+        }

+    }

+

+    // Print the process name and identifier of matching strings, ignoring case

+    _tprintf(TEXT("%s  (PID: %u)\n"), szProcessName, processID);

+    

+    // Release the handle to the process.

+    CloseHandle( hProcess );

+}

+

+int evalProcesses(HANDLE hProcess)

+{

+    if (NULL == hProcess)

+        return 0;

+

+    unsigned int totalMemUsage = 0;

+    DWORD processID = GetProcessId(hProcess);

+  

+    HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

+

+    PROCESSENTRY32 processEntry = { 0 };

+    processEntry.dwSize = sizeof(PROCESSENTRY32);

+

+    // Retrieves information about the first process encountered in a system snapshot

+    if(Process32First(hProcessSnapshot, &processEntry)) {

+        do {

+            // if th32processID = processID, we are the parent process!  

+            // if th32ParentProcessID = processID, we are a child process!

+            if ((processEntry.th32ProcessID == processID) || (processEntry.th32ParentProcessID == processID)) {

+                unsigned int procMemUsage = 0;

+                // Record parent process memory

+                procMemUsage = getMemoryInfo(processEntry.th32ProcessID);

+                totalMemUsage += procMemUsage;

+            }

+          // Retrieves information about the next process recorded in a system snapshot.   

+        } while(Process32Next(hProcessSnapshot, &processEntry));

+    }

+

+    CloseHandle(hProcessSnapshot);

+    return totalMemUsage;

+}

+

+

+void UseImage(void (functionForQueryType(HANDLE)))

+{

+    STARTUPINFO si = {0};

+    si.cb = sizeof(STARTUPINFO);

+    PROCESS_INFORMATION pi = {0};

+

+    // Start the child process. 

+    if(!CreateProcess( NULL,   // No module name (use command line)

+        gCommandLine,        // Command line

+        NULL,           // Process handle not inheritable

+        NULL,           // Thread handle not inheritable

+        FALSE,          // Set handle inheritance to FALSE

+        0,              // No creation flags

+        NULL,           // Use parent's environment block

+        NULL,           // Use parent's starting directory 

+        &si,            // Pointer to STARTUPINFO structure

+        &pi ))          // Pointer to PROCESS_INFORMATION structure

+        printf("CreateProcess failed (%d)\n", GetLastError());

+    else {

+        printf("Created process with id: %d\n", pi.dwProcessId);

+        functionForQueryType(pi.hProcess);

+        // Close process and thread handles. 

+        CloseHandle( pi.hProcess );

+        CloseHandle( pi.hThread );

+    }

+}

+

+void QueryContinuously(HANDLE hProcess)

+{

+    Sleep(2000); // give the process some time to launch

+    bool pastDuration = false;

+    time_t startTime = time(NULL);

+    unsigned int memUsage = evalProcesses(hProcess);

+    while(memUsage && !pastDuration) {

+        printf( "%u\n", memUsage );

+        Sleep(gQueryInterval*1000);

+        memUsage = evalProcesses(hProcess);

+        pastDuration = gDuration > 0 ? ElapsedTime(startTime) > gDuration : false;

+    } 

+}

+

+// returns elapsed time in seconds

+time_t ElapsedTime(time_t startTime)

+{

+    time_t currentTime = time(NULL);

+    return currentTime - startTime;

+}

diff --git a/Tools/win/record-memory/record-memory.vcxproj b/Tools/win/record-memory/record-memory.vcxproj
new file mode 100644
index 0000000..11a2064
--- /dev/null
+++ b/Tools/win/record-memory/record-memory.vcxproj
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="DebugSuffix|Win32">

+      <Configuration>DebugSuffix</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug_WinCairo|Win32">

+      <Configuration>Debug_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Production|Win32">

+      <Configuration>Production</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release_WinCairo|Win32">

+      <Configuration>Release_WinCairo</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{F93EBE5A-20F3-44C1-B192-C4AA2BA95FD5}</ProjectGuid>

+    <Keyword>Win32Proj</Keyword>

+    <RootNamespace>recordmemory</RootNamespace>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="record-memoryDebug.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="record-memoryDebugWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="record-memoryDebug.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debugsuffix.props" />

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="record-memoryRelease.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="record-memoryReleaseWinCairo.props" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+    <Import Project="record-memoryProduction.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'" />

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+    </ClCompile>

+    <Link />

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="main.cpp" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/win/record-memory/record-memory.vcxproj.filters b/Tools/win/record-memory/record-memory.vcxproj.filters
new file mode 100644
index 0000000..1d7e58f
--- /dev/null
+++ b/Tools/win/record-memory/record-memory.vcxproj.filters
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <ClCompile Include="main.cpp" />

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/Tools/win/record-memory/record-memoryCommon.props b/Tools/win/record-memory/record-memoryCommon.props
new file mode 100644
index 0000000..a840483
--- /dev/null
+++ b/Tools/win/record-memory/record-memoryCommon.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets" />

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup>

+    <Link>

+      <SubSystem>Console</SubSystem>

+    </Link>

+    <ClCompile />

+  </ItemDefinitionGroup>

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/win/record-memory/record-memoryDebug.props b/Tools/win/record-memory/record-memoryDebug.props
new file mode 100644
index 0000000..5061a80
--- /dev/null
+++ b/Tools/win/record-memory/record-memoryDebug.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="record-memoryCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/win/record-memory/record-memoryDebugWinCairo.props b/Tools/win/record-memory/record-memoryDebugWinCairo.props
new file mode 100644
index 0000000..00dc04f
--- /dev/null
+++ b/Tools/win/record-memory/record-memoryDebugWinCairo.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefinesCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\debug.props" />

+    <Import Project="record-memoryCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/win/record-memory/record-memoryProduction.props b/Tools/win/record-memory/record-memoryProduction.props
new file mode 100644
index 0000000..9dc78e2
--- /dev/null
+++ b/Tools/win/record-memory/record-memoryProduction.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\production.props" />

+    <Import Project="record-memoryCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/win/record-memory/record-memoryRelease.props b/Tools/win/record-memory/record-memoryRelease.props
new file mode 100644
index 0000000..798046d
--- /dev/null
+++ b/Tools/win/record-memory/record-memoryRelease.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefines.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="record-memoryCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>
\ No newline at end of file
diff --git a/Tools/win/record-memory/record-memoryReleaseWinCairo.props b/Tools/win/record-memory/record-memoryReleaseWinCairo.props
new file mode 100644
index 0000000..2d040cc
--- /dev/null
+++ b/Tools/win/record-memory/record-memoryReleaseWinCairo.props
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ImportGroup Label="PropertySheets">

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\FeatureDefinesCairo.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\common.props" />

+    <Import Project="$(WebKit_Libraries)\tools\vsprops\release.props" />

+    <Import Project="record-memoryCommon.props" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup />

+  <ItemDefinitionGroup />

+  <ItemGroup />

+</Project>