Chromedriver remote test support

My team is writing remote webdriver tests for ChromeOS. This
requires two changes to the local chromedriver server script:
*Allowing remote connections
*Leaving the server running after the script completes

BUG=None
TEST=Started server on vm guest, ran webdriver tests from vm host.

Change-Id: I8d1562ca59ec6ad4fe5916f263630c705cfcfcff
Reviewed-on: https://chromium-review.googlesource.com/272535
Reviewed-by: Dan Shi <dshi@chromium.org>
Reviewed-by: David Abrahams <resetswitch@chromium.org>
Trybot-Ready: David Abrahams <resetswitch@chromium.org>
Commit-Queue: David Abrahams <resetswitch@chromium.org>
Tested-by: David Abrahams <resetswitch@chromium.org>
diff --git a/client/common_lib/cros/chromedriver.py b/client/common_lib/cros/chromedriver.py
index 404c444..2a3808c 100644
--- a/client/common_lib/cros/chromedriver.py
+++ b/client/common_lib/cros/chromedriver.py
@@ -28,7 +28,8 @@
 
     def __init__(self, extra_chrome_flags=[], subtract_extra_chrome_flags=[],
                  extension_paths=[], is_component=True, username=None,
-                 password=None, server_port=None, *args, **kwargs):
+                 password=None, server_port=None, skip_cleanup=False, *args,
+                 **kwargs):
         """Initialize.
 
         @param extra_chrome_flags: Extra chrome flags to pass to chrome, if any.
@@ -41,7 +42,11 @@
         @param password: Log in using this password instead of the default.
         @param server_port: Port number for the chromedriver server. If None,
                             an available port is chosen at random.
+        @param skip_cleanup: If True, leave the server and browser running
+                             so that remote tests can run after this script
+                             ends. Default is False.
         """
+        self._cleanup = not skip_cleanup
         assert os.geteuid() == 0, 'Need superuser privileges'
 
         # Log in with telemetry
@@ -57,7 +62,8 @@
 
         # Start ChromeDriver server
         self._server = chromedriver_server(CHROMEDRIVER_EXE_PATH,
-                                           port=server_port)
+                                           port=server_port,
+                                           skip_cleanup=skip_cleanup)
 
         # Open a new tab using Chrome remote debugging. ChromeDriver expects
         # a tab opened for remote to work. Tabs opened using Telemetry will be
@@ -90,13 +96,14 @@
             self.driver.close()
             del self.driver
 
-        if hasattr(self, '_server') and self._server:
-            self._server.close()
-            del self._server
+        if not hasattr(self, '_cleanup') or self._cleanup:
+            if hasattr(self, '_server') and self._server:
+                self._server.close()
+                del self._server
 
-        if hasattr(self, '_browser') and self._browser:
-            self._browser.Close()
-            del self._browser
+            if hasattr(self, '_browser') and self._browser:
+                self._browser.Close()
+                del self._browser
 
 
     def get_extension(self, extension_path):
@@ -116,21 +123,28 @@
     src/chrome/test/chromedriver/server/server.py
     """
 
-    def __init__(self, exe_path, port=None):
+    def __init__(self, exe_path, port=None, skip_cleanup=False):
         """Starts the ChromeDriver server and waits for it to be ready.
 
         Args:
             exe_path: path to the ChromeDriver executable
             port: server port. If None, an available port is chosen at random.
+            skip_cleanup: If True, leave the server running so that remote
+                          tests can run after this script ends. Default is
+                          False.
         Raises:
             RuntimeError if ChromeDriver fails to start
         """
         if not os.path.exists(exe_path):
             raise RuntimeError('ChromeDriver exe not found at: ' + exe_path)
 
-        if not port:
+        chromedriver_args = [exe_path]
+        if port:
+            # Allow remote connections if a port was specified
+            chromedriver_args.append('--whitelisted-ips')
+        else:
             port = utils.get_unused_port()
-        chromedriver_args = [exe_path, '--port=%d' % port]
+        chromedriver_args.append('--port=%d' % port)
 
         # Chromedriver will look for an X server running on the display
         # specified through the DISPLAY environment variable.
@@ -155,7 +169,8 @@
 
         logging.debug('Chrome Driver server is up and listening at port %d.',
                       port)
-        atexit.register(self.close)
+        if not skip_cleanup:
+            atexit.register(self.close)
 
 
     def is_running(self):