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