13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.core.backends.webdriver import webdriver_tab_backend
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class WebDriverTabListBackend(object):
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def __init__(self, browser_backend):
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._browser_backend = browser_backend
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    # Stores the window handles.
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._tab_list = []
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._UpdateTabList()
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def New(self, timeout=None):
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    # Webdriver API doesn't support tab controlling.
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    raise NotImplementedError()
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def __iter__(self):
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._UpdateTabList()
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return self._tab_list.__iter__()
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def __len__(self):
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._UpdateTabList()
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return len(self._tab_list)
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def __getitem__(self, index):
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._UpdateTabList()
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if len(self._tab_list) <= index:
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      raise IndexError('list index out of range')
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return self._tab_list[index]
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def _UpdateTabList(self):
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    window_handles = self._browser_backend.driver.window_handles
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    old_tab_list = self._tab_list
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._tab_list = []
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    for window_handle in window_handles:
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      tab = None
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      for old_tab in old_tab_list:
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if old_tab.window_handle == window_handle:
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          tab = old_tab
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          break
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      else:
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        tab = webdriver_tab_backend.WebDriverTabBackend(
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            self._browser_backend, window_handle)
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      self._tab_list.append(tab)
47