Index: chrome/test/functional/tracing/tab_tracker.py |
diff --git a/chrome/test/functional/tracing/tab_tracker.py b/chrome/test/functional/tracing/tab_tracker.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4b3145ee24abe144796478cd86e8c7cccc6fa3b0 |
--- /dev/null |
+++ b/chrome/test/functional/tracing/tab_tracker.py |
@@ -0,0 +1,83 @@ |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import uuid |
+ |
+ |
+class TabTracker(object): |
+ """Uniquely track tabs within a window. |
+ |
+ This allows the creation of tabs whose indices can be |
+ determined even after lower indexed tabs have been closed, therefore changing |
+ that tab's index. |
+ |
+ This is accomplished via a containing window which is created and tracked via |
+ the window's index. As a result of this, all calls to open and close tabs in |
+ this TabTracker's window must go through the appropriate instance of the |
+ TabTracker. Also note that if a lower indexed window is closed after this |
+ TabTracker is instantiated, this TabTracker will lose track of its window |
+ """ |
+ |
+ def __init__(self, browser, visible=False): |
+ """ |
+ Args: |
+ browser: an instance of PyUITest |
+ visible: whether or not this TabTracker's window will be visible |
+ """ |
+ # A binary search tree would be faster, but this is easier to write. |
+ # If this needs to become faster, understand that the important operations |
+ # here are append, arbitrary deletion and searching. |
+ self._uuids = [None] |
+ self._window_idx = browser.GetBrowserWindowCount() |
+ self._browser = browser |
+ browser.OpenNewBrowserWindow(visible) |
+ # We leave the 0'th tab empty to have something to close on __del__ |
+ |
+ def __del__(self): |
+ self._browser.CloseBrowserWindow(self._window_idx) |
+ |
+ def CreateTab(self, url='about:blank'): |
+ """Create a tracked tab and return its uuid. |
+ |
+ Args: |
+ url: a URL to navigate to |
+ |
+ Returns: |
+ a uuid uniquely identifying that tab within this TabTracker |
+ """ |
+ self._browser.AppendTab(url, self._window_idx) |
+ # We use uuids here rather than a monotonic integer to prevent confusion |
+ # with the tab index. |
+ tab_uuid = uuid.uuid4() |
+ self._uuids.append(tab_uuid) |
+ return tab_uuid |
+ |
+ def ReleaseTab(self, tab_uuid): |
+ """Release and close a tab tracked by this TabTracker. |
+ |
+ Args: |
+ tab_uuid: the uuid of the tab to close |
+ """ |
+ idx = self.GetTabIndex(tab_uuid) |
+ self._browser.GetBrowserWindow(self._window_idx).GetTab(idx).Close() |
+ del self._uuids[idx] |
+ |
+ def GetTabIndex(self, tab_uuid): |
+ """Get the index of a tracked tab within this TabTracker's window. |
+ |
+ Args: |
+ tab_uuid: the uuid of the tab to close |
+ |
+ Returns: |
+ the index of the tab within this TabTracker's window |
+ """ |
+ return self._uuids.index(tab_uuid) |
+ |
+ def GetWindowIndex(self): |
+ """Get the index of this TabTracker's window. |
+ |
+ Returns: |
+ the index of this TabTracker's window |
+ """ |
+ return self._window_idx |