<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[209090] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/209090">209090</a></dd>
<dt>Author</dt> <dd>clopez@igalia.com</dd>
<dt>Date</dt> <dd>2016-11-29 14:15:52 -0800 (Tue, 29 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Linux] run-benchmark should be able to execute the benchmarks with more browsers.
https://bugs.webkit.org/show_bug.cgi?id=164792

Reviewed by Michael Catanzaro.

This removes the GTKBrowserDriver (and the platform 'gtk') from the run-benchmark script,
and adds a new LinuxBrowserDriver with a platform 'linux'.

It add also drivers for Chrome (Chromium), Firefox, Epiphany and MiniBrowser-GTK (previously MiniBrowser).

The detection of the platform is now done automatically, so it is not longer needed to pass a &quot;--platform&quot; parameter.

The tracking of the browser process is now more robust, we track the pid of the browser process and we only try to
kill the ones that were executed by this script, instead of doing a 'killall $browser' (like before).
We also check for browser process childs and we kill them if they are still alive after the main browser process has been killed.
This depends on psutil, so this will only be done if psutil is installed.

* BuildSlaveSupport/build.webkit.org-config/master.cfg:
(RunBenchmarkTests.start): The platform is now autodetected and the MiniBrowser driver is renamed to MiniBrowser-GTK.
* Scripts/webkitpy/benchmark_runner/benchmark_runner.py:
(BenchmarkRunner._run_benchmark): Fix a bug that caused close_browsers to be called twice. Its already called inside BenchmarkRunner._run_one_test.
* Scripts/webkitpy/benchmark_runner/browser_driver/linux_browser_driver.py: Added.
(LinuxBrowserDriver): Implement base class that has all the needed functionality for driving the browsers.
(LinuxBrowserDriver.__init__):
(LinuxBrowserDriver.prepare_env):
(LinuxBrowserDriver.restore_env):
(LinuxBrowserDriver.close_browsers): Made the dependency on psutil optional (because it was listed as such on the README file &lt;Tools/Scripts/webkitpy/benchmark_runner/README.md&gt;)
(LinuxBrowserDriver.launch_url):
(LinuxBrowserDriver._get_first_executable_path_from_list):
(LinuxBrowserDriver._screen_size):
* Scripts/webkitpy/benchmark_runner/browser_driver/linux_chrome_driver.py: Copied from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py.
(LinuxChromeDriver):
(LinuxChromeDriver.launch_url):
* Scripts/webkitpy/benchmark_runner/browser_driver/linux_epiphany_driver.py: Renamed from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_browser_driver.py.
(EpiphanyBrowserDriver):
(EpiphanyBrowserDriver.launch_url):
* Scripts/webkitpy/benchmark_runner/browser_driver/linux_firefox_driver.py: Copied from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py.
(LinuxFirefoxDriver):
(LinuxFirefoxDriver.launch_url):
* Scripts/webkitpy/benchmark_runner/browser_driver/linux_minibrowsergtk_driver.py: Renamed from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py.
(GTKMiniBrowserDriver):
(GTKMiniBrowserDriver.launch_url):
* Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py:
(SimpleHTTPServerDriver):
* Scripts/webkitpy/benchmark_runner/run_benchmark.py:
(getplatform):
(getdefaultbrowser):
(parse_args):
* Scripts/webkitpy/benchmark_runner/utils.py:
(load_subclasses): The loading of subclasses was still (even after <a href="http://trac.webkit.org/projects/webkit/changeset/196979">r196979</a>) sensitive to the order in which the modules are loaded.
We have to ensure that the files containing subclasses of the base_class_file are loaded after the base_class_file,
we can do that by matching against the base_class_file pattern when the list is created.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigmastercfg">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbenchmark_runnerpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driversimple_http_server_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerrun_benchmarkpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/run_benchmark.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerutilspy">trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_browser_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_browser_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_chrome_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_chrome_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_epiphany_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_epiphany_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_firefox_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_firefox_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_minibrowsergtk_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_minibrowsergtk_driver.py</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_browser_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_browser_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_minibrowser_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigmastercfg"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -701,7 +701,7 @@
</span><span class="cx">     def start(self):
</span><span class="cx">         platform = self.getProperty(&quot;platform&quot;)
</span><span class="cx">         if platform == &quot;gtk&quot;:
</span><del>-            self.command += [&quot;--platform&quot;, &quot;gtk&quot;, &quot;--browser&quot;, &quot;minibrowser&quot;]
</del><ins>+            self.command += [&quot;--browser&quot;, &quot;minibrowser-gtk&quot;]
</ins><span class="cx">         self.setCommand(self.command)
</span><span class="cx">         return shell.Test.start(self)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/ChangeLog        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -1,3 +1,58 @@
</span><ins>+2016-11-29  Carlos Alberto Lopez Perez  &lt;clopez@igalia.com&gt;
+
+        [Linux] run-benchmark should be able to execute the benchmarks with more browsers.
+        https://bugs.webkit.org/show_bug.cgi?id=164792
+
+        Reviewed by Michael Catanzaro.
+
+        This removes the GTKBrowserDriver (and the platform 'gtk') from the run-benchmark script,
+        and adds a new LinuxBrowserDriver with a platform 'linux'.
+
+        It add also drivers for Chrome (Chromium), Firefox, Epiphany and MiniBrowser-GTK (previously MiniBrowser).
+
+        The detection of the platform is now done automatically, so it is not longer needed to pass a &quot;--platform&quot; parameter.
+
+        The tracking of the browser process is now more robust, we track the pid of the browser process and we only try to
+        kill the ones that were executed by this script, instead of doing a 'killall $browser' (like before).
+        We also check for browser process childs and we kill them if they are still alive after the main browser process has been killed.
+        This depends on psutil, so this will only be done if psutil is installed.
+
+        * BuildSlaveSupport/build.webkit.org-config/master.cfg:
+        (RunBenchmarkTests.start): The platform is now autodetected and the MiniBrowser driver is renamed to MiniBrowser-GTK.
+        * Scripts/webkitpy/benchmark_runner/benchmark_runner.py:
+        (BenchmarkRunner._run_benchmark): Fix a bug that caused close_browsers to be called twice. Its already called inside BenchmarkRunner._run_one_test.
+        * Scripts/webkitpy/benchmark_runner/browser_driver/linux_browser_driver.py: Added.
+        (LinuxBrowserDriver): Implement base class that has all the needed functionality for driving the browsers.
+        (LinuxBrowserDriver.__init__):
+        (LinuxBrowserDriver.prepare_env):
+        (LinuxBrowserDriver.restore_env):
+        (LinuxBrowserDriver.close_browsers): Made the dependency on psutil optional (because it was listed as such on the README file &lt;Tools/Scripts/webkitpy/benchmark_runner/README.md&gt;)
+        (LinuxBrowserDriver.launch_url):
+        (LinuxBrowserDriver._get_first_executable_path_from_list):
+        (LinuxBrowserDriver._screen_size):
+        * Scripts/webkitpy/benchmark_runner/browser_driver/linux_chrome_driver.py: Copied from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py.
+        (LinuxChromeDriver):
+        (LinuxChromeDriver.launch_url):
+        * Scripts/webkitpy/benchmark_runner/browser_driver/linux_epiphany_driver.py: Renamed from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_browser_driver.py.
+        (EpiphanyBrowserDriver):
+        (EpiphanyBrowserDriver.launch_url):
+        * Scripts/webkitpy/benchmark_runner/browser_driver/linux_firefox_driver.py: Copied from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py.
+        (LinuxFirefoxDriver):
+        (LinuxFirefoxDriver.launch_url):
+        * Scripts/webkitpy/benchmark_runner/browser_driver/linux_minibrowsergtk_driver.py: Renamed from Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py.
+        (GTKMiniBrowserDriver):
+        (GTKMiniBrowserDriver.launch_url):
+        * Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py:
+        (SimpleHTTPServerDriver):
+        * Scripts/webkitpy/benchmark_runner/run_benchmark.py:
+        (getplatform):
+        (getdefaultbrowser):
+        (parse_args):
+        * Scripts/webkitpy/benchmark_runner/utils.py:
+        (load_subclasses): The loading of subclasses was still (even after r196979) sensitive to the order in which the modules are loaded.
+        We have to ensure that the files containing subclasses of the base_class_file are loaded after the base_class_file,
+        we can do that by matching against the base_class_file pattern when the list is created.
+
</ins><span class="cx"> 2016-11-29  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Cocoa] Enable two clang warnings recommended by Xcode
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbenchmark_runnerpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -107,7 +107,6 @@
</span><span class="cx"> 
</span><span class="cx">             finally:
</span><span class="cx">                 self._browser_driver.restore_env()
</span><del>-                self._browser_driver.close_browsers()
</del><span class="cx"> 
</span><span class="cx">             _log.info('End the iteration {current_iteration} of {iterations} for current benchmark'.format(current_iteration=iteration, iterations=count))
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_browser_driverpy"></a>
<div class="delfile"><h4>Deleted: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_browser_driver.py (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_browser_driver.py        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_browser_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -1,66 +0,0 @@
</span><del>-# Copyright (C) 2016 Igalia S.L. 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
-# &quot;AS IS&quot; 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 subprocess
-from browser_driver import BrowserDriver
-
-_log = logging.getLogger(__name__)
-
-
-class GTKBrowserDriver(BrowserDriver):
-    process_name = None
-    platform = 'gtk'
-
-    def prepare_env(self, device_id):
-        self.close_browsers()
-
-    def restore_env(self):
-        pass
-
-    def close_browsers(self):
-        self._terminate_processes(self.process_name)
-
-    @classmethod
-    def _launch_process(cls, args, env=None):
-        process = subprocess.Popen(args)
-        return process
-
-    @classmethod
-    def _terminate_processes(cls, process_name):
-        _log.info('Closing all processes with name %s' % process_name)
-        subprocess.call(['/usr/bin/killall', process_name])
-
-    @classmethod
-    def _screen_size(cls):
-        # load_subclasses() from __init__.py will load this file to
-        # check the platform defined. Do here a lazy import instead of
-        # trying to import the Gtk module on the global scope of this
-        # file to avoid ImportError errors on other platforms.
-        # Python imports are cached and only run once, so this should be ok.
-        from gi.repository import Gtk
-        screen = Gtk.Window().get_screen()
-        return screen.get_monitor_geometry(screen.get_primary_monitor())
</del></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_minibrowser_driverpy"></a>
<div class="delfile"><h4>Deleted: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -1,53 +0,0 @@
</span><del>-# Copyright (C) 2016 Igalia S.L. 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
-# &quot;AS IS&quot; 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 sys
-from gtk_browser_driver import GTKBrowserDriver
-
-_log = logging.getLogger(__name__)
-
-
-class GTKMiniBrowserDriver(GTKBrowserDriver):
-    process_name = 'MiniBrowser'
-    browser_name = 'minibrowser'
-
-    def prepare_env(self, device_id):
-        self._minibrowser_process = None
-        super(GTKMiniBrowserDriver, self).prepare_env(device_id)
-
-    def launch_url(self, url, options, browser_build_path):
-        args = ['Tools/Scripts/run-minibrowser', '--gtk']
-        args.append(&quot;--geometry=%sx%s&quot; % (self._screen_size().width, self._screen_size().height))
-        args.append(url)
-        _log.info('Launching Minibrowser with url: %s' % url)
-        self._minibrowser_process = GTKBrowserDriver._launch_process(args)
-
-    def close_browsers(self):
-        super(GTKMiniBrowserDriver, self).close_browsers()
-        if self._minibrowser_process and self._minibrowser_process.returncode:
-            _log.error('MiniBrowser crashed with exitcode %d' % self._minibrowser_process.returncode)
-            sys.exit(1)
</del></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_browser_driverpy"></a>
<div class="addfile"><h4>Added: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_browser_driver.py (0 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_browser_driver.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_browser_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -0,0 +1,125 @@
</span><ins>+# Copyright (C) 2016 Igalia S.L. 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
+# &quot;AS IS&quot; 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 sys
+import tempfile
+import logging
+import subprocess
+try:
+    import psutil
+except ImportError:
+    pass
+from webkitpy.benchmark_runner.utils import force_remove
+from browser_driver import BrowserDriver
+
+
+_log = logging.getLogger(__name__)
+
+
+class LinuxBrowserDriver(BrowserDriver):
+    browser_name = None
+    process_search_list = []
+    platform = 'linux'
+
+    def __init__(self):
+        self.process_name = self._get_first_executable_path_from_list(self.process_search_list)
+        if self.process_name is None:
+            raise ValueError('Cant find executable for browser {browser_name}. Searched list: {browser_process_list}'.format(
+                              browser_name=self.browser_name, browser_process_list=self.process_search_list))
+
+    def prepare_env(self, device_id):
+        self._browser_process = None
+        self._browser_arguments = None
+        self._temp_profiledir = tempfile.mkdtemp()
+        self._test_environ = dict(os.environ)
+        self._test_environ['HOME'] = self._temp_profiledir
+
+    def restore_env(self):
+        force_remove(self._temp_profiledir)
+
+    def close_browsers(self):
+        if self._browser_process:
+            if self._browser_process.poll() is None:  # still running
+                if 'psutil' in sys.modules:
+                    main_browser_process = psutil.Process(self._browser_process.pid)
+                    browser_children = main_browser_process.children(recursive=True)
+                    _log.info('Killing browser {browser_name} with pid {browser_pid} and cmd: {browser_cmd}'.format(
+                               browser_name=self.browser_name, browser_pid=self._browser_process.pid,
+                               browser_cmd=' '.join(main_browser_process.cmdline()).strip() or main_browser_process.name()))
+                    main_browser_process.kill()
+                    for browser_child in browser_children:
+                        if browser_child.is_running():
+                            _log.info('Killing still alive {browser_name} child with pid {browser_pid} and cmd: {browser_cmd}'.format(
+                                       browser_name=self.browser_name, browser_pid=browser_child.pid,
+                                       browser_cmd=' '.join(browser_child.cmdline()).strip() or browser_child.name()))
+                            browser_child.kill()
+                else:
+                    _log.info('Killing browser {browser_name} with pid {browser_pid}'.format(
+                               browser_name=self.browser_name, browser_pid=self._browser_process.pid))
+                    self._browser_process.kill()
+                    _log.warning('python psutil not found, cant check for '
+                                 'still-alive browser childs to kill.')
+            else:
+                _log.error('Browser {browser_name} with pid {browser_pid} ended prematurely with return code {browser_retcode}.'.format(
+                            browser_name=self.browser_name, browser_pid=self._browser_process.pid,
+                            browser_retcode=self._browser_process.returncode))
+
+    def launch_url(self, url, options, browser_build_path):
+        if not self._browser_arguments:
+            self._browser_arguments = [url]
+        exec_args = [self.process_name] + self._browser_arguments
+        _log.info('Executing: {browser_cmdline}'.format(browser_cmdline=' '.join(exec_args)))
+        self._browser_process = subprocess.Popen(exec_args, env=self._test_environ,
+                                                 stdout=subprocess.PIPE,
+                                                 stderr=subprocess.STDOUT)
+
+    def _get_first_executable_path_from_list(self, searchlist):
+        searchpath = [os.path.curdir] + os.environ['PATH'].split(os.pathsep)
+        for program in searchlist:
+            for path in searchpath:
+                fullpath = os.path.abspath(os.path.join(path, program))
+                if  os.path.isfile(fullpath) and os.access(fullpath, os.X_OK):
+                    return fullpath
+        return None
+
+    def _screen_size(self):
+        # load_subclasses() from __init__.py will load this file to
+        # check the platform defined. Do here a lazy import instead of
+        # trying to import the Gtk module on the global scope of this
+        # file to avoid ImportError errors on other platforms.
+        # Python imports are cached and only run once, so this should be ok.
+        import gi
+        gi.require_version('Gtk', '3.0')
+        gi.require_version('Gdk', '3.0')
+        from gi.repository import Gtk, Gdk
+        if Gtk.get_major_version() == 3 and Gtk.get_minor_version() &lt; 22:
+            screen = Gtk.Window().get_screen()
+            return screen.get_monitor_geometry(screen.get_primary_monitor())
+        else:
+            display = Gdk.Display.get_default()
+            monitor = display.get_primary_monitor()
+            return monitor.get_geometry()
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_chrome_driverpyfromrev209089trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_browser_driverpy"></a>
<div class="copfile"><h4>Copied: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_chrome_driver.py (from rev 209089, trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_browser_driver.py) (0 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_chrome_driver.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_chrome_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+# Copyright (C) 2016 Igalia S.L. 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
+# &quot;AS IS&quot; 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 linux_browser_driver import LinuxBrowserDriver
+
+
+class LinuxChromeDriver(LinuxBrowserDriver):
+    browser_name = 'chrome'
+    process_search_list = ['chromium', 'chromium-browser', 'chrome']
+
+    def launch_url(self, url, options, browser_build_path):
+        self._browser_arguments = ['--temp-profile', '--start-maximized',
+                                   '--homepage', url]
+        super(LinuxChromeDriver, self).launch_url(url, options, browser_build_path)
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_epiphany_driverpyfromrev209089trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_minibrowser_driverpy"></a>
<div class="copfile"><h4>Copied: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_epiphany_driver.py (from rev 209089, trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py) (0 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_epiphany_driver.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_epiphany_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+# Copyright (C) 2016 Igalia S.L. 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
+# &quot;AS IS&quot; 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 linux_browser_driver import LinuxBrowserDriver
+
+
+class EpiphanyBrowserDriver(LinuxBrowserDriver):
+    browser_name = 'epiphany'
+    process_search_list = ['epiphany', 'epiphany-browser']
+
+    def launch_url(self, url, options, browser_build_path):
+        self._browser_arguments = ['--new-window', '-p',
+                                   '--profile={profile}'.format(profile=self._temp_profiledir),
+                                   url]
+        super(EpiphanyBrowserDriver, self).launch_url(url, options, browser_build_path)
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_firefox_driverpyfromrev209089trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_minibrowser_driverpy"></a>
<div class="copfile"><h4>Copied: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_firefox_driver.py (from rev 209089, trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py) (0 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_firefox_driver.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_firefox_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+# Copyright (C) 2016 Igalia S.L. 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
+# &quot;AS IS&quot; 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 linux_browser_driver import LinuxBrowserDriver
+
+
+class LinuxFirefoxDriver(LinuxBrowserDriver):
+    browser_name = 'firefox'
+    process_search_list = ['firefox']
+
+    def launch_url(self, url, options, browser_build_path):
+        self._browser_arguments = ['-new-instance', '-profile', self._temp_profiledir,
+                                   '-width', str(self._screen_size().width),
+                                   '-height', str(self._screen_size().height),
+                                   url]
+        super(LinuxFirefoxDriver, self).launch_url(url, options, browser_build_path)
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverlinux_minibrowsergtk_driverpyfromrev209089trunkToolsScriptswebkitpybenchmark_runnerbrowser_drivergtk_minibrowser_driverpy"></a>
<div class="copfile"><h4>Copied: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_minibrowsergtk_driver.py (from rev 209089, trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/gtk_minibrowser_driver.py) (0 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_minibrowsergtk_driver.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/linux_minibrowsergtk_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -0,0 +1,40 @@
</span><ins>+# Copyright (C) 2016 Igalia S.L. 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
+# &quot;AS IS&quot; 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 linux_browser_driver import LinuxBrowserDriver
+
+
+class GTKMiniBrowserDriver(LinuxBrowserDriver):
+    browser_name = 'minibrowser-gtk'
+    process_search_list = ['Tools/Scripts/run-minibrowser', 'MiniBrowser']
+
+    def launch_url(self, url, options, browser_build_path):
+        self._browser_arguments = []
+        if self.process_name.endswith('run-minibrowser'):
+            self._browser_arguments.append('--gtk')
+        self._browser_arguments.append('--geometry={w}x{h}'.format(w=self._screen_size().width, h=self._screen_size().height))
+        self._browser_arguments.append(url)
+        super(GTKMiniBrowserDriver, self).launch_url(url, options, browser_build_path)
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driversimple_http_server_driverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx">     &quot;&quot;&quot;This class depends on unix environment, need to be modified to achieve crossplatform compability
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    platforms = ['osx', 'gtk']
</del><ins>+    platforms = ['osx', 'linux']
</ins><span class="cx"> 
</span><span class="cx">     def __init__(self):
</span><span class="cx">         self._server_process = None
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerrun_benchmarkpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/run_benchmark.py (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/run_benchmark.py        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/run_benchmark.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -5,6 +5,7 @@
</span><span class="cx"> import logging
</span><span class="cx"> import platform
</span><span class="cx"> import os
</span><ins>+import sys
</ins><span class="cx"> 
</span><span class="cx"> from benchmark_runner import BenchmarkRunner
</span><span class="cx"> from browser_driver.browser_driver_factory import BrowserDriverFactory
</span><span class="lines">@@ -13,13 +14,24 @@
</span><span class="cx"> _log = logging.getLogger(__name__)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+def default_platform():
+    if sys.platform.startswith('linux'):
+        return 'linux'
+    return 'osx'
+
+
+def default_browser():
+    if sys.platform.startswith('linux'):
+        return 'minibrowser-gtk'
+    return 'safari'
+
+
</ins><span class="cx"> def parse_args():
</span><span class="cx">     parser = argparse.ArgumentParser(description='Automate the browser based performance benchmarks')
</span><span class="cx">     parser.add_argument('--output-file', dest='output', default=None)
</span><span class="cx">     parser.add_argument('--build-directory', dest='buildDir', help='Path to the browser executable. e.g. WebKitBuild/Release/')
</span><del>-    parser.add_argument('--platform', dest='platform', default='osx', choices=BrowserDriverFactory.available_platforms())
-    # FIXME: Should we add chrome as an option? Well, chrome uses webkit in iOS.
-    parser.add_argument('--browser', dest='browser', default='safari', choices=BrowserDriverFactory.available_browsers())
</del><ins>+    parser.add_argument('--platform', dest='platform', default=default_platform(), choices=BrowserDriverFactory.available_platforms())
+    parser.add_argument('--browser', dest='browser', default=default_browser(), choices=BrowserDriverFactory.available_browsers())
</ins><span class="cx">     parser.add_argument('--debug', action='store_true')
</span><span class="cx">     parser.add_argument('--local-copy', dest='localCopy', help='Path to a local copy of the benchmark. e.g. PerformanceTests/SunSpider/')
</span><span class="cx">     parser.add_argument('--count', dest='countOverride', type=int, help='Number of times to run the benchmark. e.g. 5')
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerutilspy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py (209089 => 209090)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py        2016-11-29 21:49:51 UTC (rev 209089)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py        2016-11-29 22:15:52 UTC (rev 209090)
</span><span class="lines">@@ -19,7 +19,8 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> def load_subclasses(dirname, base_class_name, base_class_file, loader):
</span><del>-    filelist = [base_class_file] + [f for f in os.listdir(dirname) if f.endswith('.py') and f not in ['__init__.py', base_class_file]]
</del><ins>+    filelist = [base_class_file] + [f for f in os.listdir(dirname) if f.endswith('_' + base_class_file)]
+    filelist += [f for f in os.listdir(dirname) if f.endswith('.py') and f not in ['__init__.py'] + filelist]
</ins><span class="cx">     for filename in filelist:
</span><span class="cx">         module_name = os.path.splitext(filename)[0]
</span><span class="cx">         module = imp.load_source(module_name, os.path.join(dirname, filename))
</span></span></pre>
</div>
</div>

</body>
</html>