1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5from telemetry.core import forwarders 6from telemetry.core.backends import browser_backend 7from telemetry.core.backends.webdriver import webdriver_tab_list_backend 8 9 10class WebDriverBrowserBackend(browser_backend.BrowserBackend): 11 """The webdriver-based backend for controlling a locally-executed browser 12 instance, on Linux, Mac, and Windows. 13 """ 14 15 def __init__(self, driver_creator, supports_extensions, browser_options): 16 super(WebDriverBrowserBackend, self).__init__( 17 supports_extensions=supports_extensions, 18 browser_options=browser_options, 19 tab_list_backend=webdriver_tab_list_backend.WebDriverTabListBackend) 20 21 self._driver_creator = driver_creator 22 self._driver = None 23 self.wpr_port_pairs = forwarders.PortPairs( 24 http=forwarders.PortPair(80, 80), 25 https=forwarders.PortPair(443, 443), 26 dns=forwarders.PortPair(53, 53)) 27 28 def Start(self): 29 assert not self._driver 30 self._driver = self._driver_creator() 31 32 @property 33 def driver(self): 34 assert self._driver 35 return self._driver 36 37 @property 38 def supports_tab_control(self): 39 # Based on webdriver protocol API, only closing a tab is supported while 40 # activating or creating a tab is not. Thus, tab control is not supported. 41 return False 42 43 @property 44 def supports_tracing(self): 45 # Tracing is not available in IE/Firefox yet and not supported through 46 # webdriver API. 47 return False 48 49 def GetProcessName(self, cmd_line): 50 # Leave implementation details to subclass as process name depends on the 51 # type of browser. 52 raise NotImplementedError() 53 54 def Close(self): 55 if self._driver: 56 self._driver.quit() 57 self._driver = None 58 59 def IsBrowserRunning(self): 60 # Assume the browser is running if not explicitly closed. 61 return self._driver is not None 62 63 def __del__(self): 64 self.Close() 65