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.backends.webdriver import webdriver_tab_backend
6
7
8class WebDriverTabListBackend(object):
9  def __init__(self, browser_backend):
10    self._browser_backend = browser_backend
11    # Stores the window handles.
12    self._tab_list = []
13    self._UpdateTabList()
14
15  def New(self, timeout=None):
16    # Webdriver API doesn't support tab controlling.
17    raise NotImplementedError()
18
19  def __iter__(self):
20    self._UpdateTabList()
21    return self._tab_list.__iter__()
22
23  def __len__(self):
24    self._UpdateTabList()
25    return len(self._tab_list)
26
27  def __getitem__(self, index):
28    self._UpdateTabList()
29    if len(self._tab_list) <= index:
30      raise IndexError('list index out of range')
31    return self._tab_list[index]
32
33  def _UpdateTabList(self):
34    window_handles = self._browser_backend.driver.window_handles
35    old_tab_list = self._tab_list
36    self._tab_list = []
37    for window_handle in window_handles:
38      tab = None
39      for old_tab in old_tab_list:
40        if old_tab.window_handle == window_handle:
41          tab = old_tab
42          break
43      else:
44        tab = webdriver_tab_backend.WebDriverTabBackend(
45            self._browser_backend, window_handle)
46      self._tab_list.append(tab)
47