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
5import logging
6
7from telemetry.core import bitmap
8
9
10class WebDriverTabBackend(object):
11  def __init__(self, browser_backend, window_handle):
12    self._browser_backend = browser_backend
13    self._window_handle = window_handle
14
15  @property
16  def browser(self):
17    return self._browser_backend.browser
18
19  @property
20  def window_handle(self):
21    return self._window_handle
22
23  @property
24  def url(self):
25    self._browser_backend.driver.switch_to_window(self._window_handle)
26    return self._browser_backend.driver.current_url
27
28  def Activate(self):
29    # Webdriver doesn't support tab control.
30    raise NotImplementedError()
31
32  def Close(self):
33    self._browser_backend.driver.switch_to_window(self._window_handle)
34    self._browser_backend.driver.close()
35
36  def WaitForDocumentReadyStateToBeComplete(self, timeout=None):
37    # TODO(chrisgao): Double check of document state.
38    pass
39
40  def WaitForDocumentReadyStateToBeInteractiveOrBetter(self, timeout=None):
41    # TODO(chrisgao): Double check of document state.
42    pass
43
44  @property
45  def screenshot_supported(self):
46    return True
47
48  def Screenshot(self, timeout=None):  # pylint: disable=W0613
49    if timeout:
50      logging.warning('timeout is not supported')
51    self._browser_backend.driver.switch_to_window(self._window_handle)
52    snap = self._browser_backend.driver.get_screenshot_as_base64()
53    if snap:
54      return bitmap.Bitmap.FromPng(snap)
55    return None
56
57  @property
58  def message_output_stream(self):
59    # Webdriver has no API for grabbing console messages.
60    raise NotImplementedError()
61
62  @message_output_stream.setter
63  def message_output_stream(self, stream):
64    raise NotImplementedError()
65
66  def GetDOMStats(self, timeout=None):
67    # Webdriver has no API for DOM status.
68    raise NotImplementedError()
69
70  def WaitForNavigate(self):
71    raise NotImplementedError()
72
73  def Navigate(self, url, script_to_evaluate_on_commit=None, timeout=None):
74    if script_to_evaluate_on_commit:
75      raise NotImplementedError('script_to_evaluate_on_commit is NOT supported')
76    self._browser_backend.driver.switch_to_window(self._window_handle)
77    if timeout:
78      self._browser_backend.driver.set_page_load_timeout(timeout * 1000)
79    self._browser_backend.driver.get(url)
80
81  def GetCookieByName(self, name, timeout=None):
82    if timeout:
83      logging.warning('timeout is not supported')
84    self._browser_backend.driver.switch_to_window(self._window_handle)
85    cookie = self._browser_backend.driver.get_cookie(name)
86    if cookie:
87      return cookie['value']
88    return None
89
90  def ExecuteJavaScript(self, expr, timeout=None):
91    self._browser_backend.driver.switch_to_window(self._window_handle)
92    if timeout:
93      logging.warning('timeout is not supported')
94    self._browser_backend.driver.execute_script(expr)
95
96  def EvaluateJavaScript(self, expr, timeout=None):
97    self._browser_backend.driver.switch_to_window(self._window_handle)
98    if timeout:
99      logging.warning('timeout is not supported')
100    return self._browser_backend.driver.execute_script(
101        'return eval(\'%s\')' % expr.replace('\'', '\\\'').replace('\n', ' '))
102
103  @property
104  def timeline_model(self):
105    # IE/Firefox has no timeline.
106    raise NotImplementedError()
107
108  @property
109  def id(self):
110    raise NotImplementedError()
111
112  def StartTimelineRecording(self):
113    raise NotImplementedError()
114
115  def StopTimelineRecording(self):
116    raise NotImplementedError()
117
118  def ClearCache(self):
119    # Can't find a way to clear cache of a tab in IE/Firefox.
120    raise NotImplementedError()
121