- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / functional / tracing / tab_tracker.py
1 # Copyright (c) 2012 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
5 import uuid
6
7
8 class TabTracker(object):
9   """Uniquely track tabs within a window.
10
11   This allows the creation of tabs whose indices can be
12   determined even after lower indexed tabs have been closed, therefore changing
13   that tab's index.
14
15   This is accomplished via a containing window which is created and tracked via
16   the window's index. As a result of this, all calls to open and close tabs in
17   this TabTracker's window must go through the appropriate instance of the
18   TabTracker. Also note that if a lower indexed window is closed after this
19   TabTracker is instantiated, this TabTracker will lose track of its window
20   """
21
22   def __init__(self, browser, visible=False):
23     """
24     Args:
25       browser: an instance of PyUITest
26       visible: whether or not this TabTracker's window will be visible
27     """
28     # A binary search tree would be faster, but this is easier to write.
29     # If this needs to become faster, understand that the important operations
30     # here are append, arbitrary deletion and searching.
31     self._uuids = [None]
32     self._window_idx = browser.GetBrowserWindowCount()
33     self._browser = browser
34     browser.OpenNewBrowserWindow(visible)
35     # We leave the 0'th tab empty to have something to close on __del__
36
37   def __del__(self):
38     self._browser.CloseBrowserWindow(self._window_idx)
39
40   def CreateTab(self, url='about:blank'):
41     """Create a tracked tab and return its uuid.
42
43     Args:
44       url: a URL to navigate to
45
46     Returns:
47       a uuid uniquely identifying that tab within this TabTracker
48     """
49     self._browser.AppendTab(url, self._window_idx)
50     # We use uuids here rather than a monotonic integer to prevent confusion
51     # with the tab index.
52     tab_uuid = uuid.uuid4()
53     self._uuids.append(tab_uuid)
54     return tab_uuid
55
56   def ReleaseTab(self, tab_uuid):
57     """Release and close a tab tracked by this TabTracker.
58
59     Args:
60       tab_uuid: the uuid of the tab to close
61     """
62     idx = self.GetTabIndex(tab_uuid)
63     self._browser.CloseTab(tab_index=idx, windex=self._window_idx)
64     del self._uuids[idx]
65
66   def GetTabIndex(self, tab_uuid):
67     """Get the index of a tracked tab within this TabTracker's window.
68
69     Args:
70       tab_uuid: the uuid of the tab to close
71
72     Returns:
73       the index of the tab within this TabTracker's window
74     """
75     return self._uuids.index(tab_uuid)
76
77   def GetWindowIndex(self):
78     """Get the index of this TabTracker's window.
79
80     Returns:
81       the index of this TabTracker's window
82     """
83     return self._window_idx