| Index: tools/telemetry/telemetry/tab.py
|
| ===================================================================
|
| --- tools/telemetry/telemetry/tab.py (revision 177224)
|
| +++ tools/telemetry/telemetry/tab.py (working copy)
|
| @@ -2,6 +2,13 @@
|
| # Use of this source code is governed by a BSD-style license that can be
|
| # found in the LICENSE file.
|
|
|
| +from telemetry import inspector_backend
|
| +from telemetry import inspector_console
|
| +from telemetry import inspector_page
|
| +from telemetry import inspector_runtime
|
| +from telemetry import inspector_timeline
|
| +from telemetry import util
|
| +
|
| DEFAULT_TAB_TIMEOUT = 60
|
|
|
| class Tab(object):
|
| @@ -10,40 +17,59 @@
|
| The important parts of the Tab object are in the runtime and page objects.
|
| E.g.:
|
| # Navigates the tab to a given url.
|
| - tab.Navigate('http://www.google.com/')
|
| + tab.page.Navigate('http://www.google.com/')
|
|
|
| # Evaluates 1+1 in the tab's javascript context.
|
| - tab.Evaluate('1+1')
|
| + tab.runtime.Evaluate('1+1')
|
| """
|
| - def __init__(self, backend):
|
| - self._backend = backend
|
| + def __init__(self, browser, browser_backend, debugger_url):
|
| + assert debugger_url
|
| + self._browser = browser
|
| + self._browser_backend = browser_backend
|
| + self._debugger_url = debugger_url
|
|
|
| - # TODO(dtu): Remove these property methods: console, page, runtime, timeline.
|
| - @property
|
| - def console(self):
|
| - return self._backend._console # pylint: disable=W0212
|
| + self._inspector_backend = None
|
| + self._console = None
|
| + self._page = None
|
| + self._runtime = None
|
| + self._timeline = None
|
|
|
| - @property
|
| - def page(self):
|
| - return self._backend._page # pylint: disable=W0212
|
| + def __del__(self):
|
| + self.Disconnect()
|
|
|
| - @property
|
| - def runtime(self):
|
| - return self._backend._runtime # pylint: disable=W0212
|
| + def _Connect(self):
|
| + if self._inspector_backend:
|
| + return
|
|
|
| - @property
|
| - def timeline(self):
|
| - return self._backend._timeline # pylint: disable=W0212
|
| + self._inspector_backend = inspector_backend.InspectorBackend(
|
| + self._browser_backend, self._debugger_url)
|
| + self._console = inspector_console.InspectorConsole(
|
| + self._inspector_backend, self)
|
| + self._page = inspector_page.InspectorPage(self._inspector_backend, self)
|
| + self._runtime = inspector_runtime.InspectorRuntime(
|
| + self._inspector_backend, self)
|
| + self._timeline = inspector_timeline.InspectorTimeline(
|
| + self._inspector_backend, self)
|
|
|
| - @property
|
| - def browser(self):
|
| - """The browser in which this tab resides."""
|
| - return self._backend.browser
|
| + def Disconnect(self):
|
| + """Closes the connection to this tab."""
|
| + self._console = None
|
| + self._page = None
|
| + self._runtime = None
|
| + self._timeline = None
|
| + if self._inspector_backend:
|
| + self._inspector_backend.Close()
|
| + self._inspector_backend = None
|
| + self._browser = None
|
|
|
| - @property
|
| - def url(self):
|
| - return self._backend.url
|
| + def Close(self):
|
| + """Closes this tab.
|
|
|
| + Not all browsers or browser versions support this method.
|
| + Be sure to check browser.supports_tab_control."""
|
| + self.Disconnect()
|
| + self._browser_backend.tabs.CloseTab(self._debugger_url)
|
| +
|
| def Activate(self):
|
| """Brings this tab to the foreground asynchronously.
|
|
|
| @@ -54,84 +80,51 @@
|
| and the page's documentVisibilityState becoming 'visible', and yet more
|
| delay until the actual tab is visible to the user. None of these delays
|
| are included in this call."""
|
| - self._backend.Activate()
|
| + self._Connect()
|
| + self._browser_backend.tabs.ActivateTab(self._debugger_url)
|
|
|
| - def Close(self):
|
| - """Closes this tab.
|
| + @property
|
| + def browser(self):
|
| + """The browser in which this tab resides."""
|
| + return self._browser
|
|
|
| - Not all browsers or browser versions support this method.
|
| - Be sure to check browser.supports_tab_control."""
|
| - self._backend.Close()
|
| + @property
|
| + def url(self):
|
| + return self._browser_backend.tabs.GetTabUrl(self._debugger_url)
|
|
|
| - def WaitForDocumentReadyStateToBeComplete(self, timeout=DEFAULT_TAB_TIMEOUT):
|
| - self._backend.WaitForDocumentReadyStateToBeComplete(timeout)
|
| + @property
|
| + def console(self):
|
| + """Methods for interacting with the page's console object."""
|
| + self._Connect()
|
| + return self._console
|
|
|
| - def WaitForDocumentReadyStateToBeInteractiveOrBetter(
|
| - self, timeout=DEFAULT_TAB_TIMEOUT):
|
| - self._backend.WaitForDocumentReadyStateToBeInteractiveOrBetter(timeout)
|
| -
|
| @property
|
| - def screenshot_supported(self):
|
| - """True if the browser instance is capable of capturing screenshots"""
|
| - return self._backend.screenshot_supported
|
| + def page(self):
|
| + """Methods for interacting with the current page."""
|
| + self._Connect()
|
| + return self._page
|
|
|
| - def Screenshot(self, timeout=DEFAULT_TAB_TIMEOUT):
|
| - """Capture a screenshot of the window for rendering validation"""
|
| - return self._backend.Screenshot(timeout)
|
| -
|
| @property
|
| - def message_output_stream(self):
|
| - return self._backend.message_output_stream
|
| + def runtime(self):
|
| + """Methods for interacting with the page's javascript runtime."""
|
| + self._Connect()
|
| + return self._runtime
|
|
|
| - @message_output_stream.setter
|
| - def message_output_stream(self, stream):
|
| - self._backend.message_output_stream = stream
|
| -
|
| - def PerformActionAndWaitForNavigate(
|
| - self, action_function, timeout=DEFAULT_TAB_TIMEOUT):
|
| - """Executes action_function, and waits for the navigation to complete.
|
| -
|
| - action_function must be a Python function that results in a navigation.
|
| - This function returns when the navigation is complete or when
|
| - the timeout has been exceeded.
|
| - """
|
| - self._backend.PerformActionAndWaitForNavigate(action_function, timeout)
|
| -
|
| - def Navigate(self, url, timeout=DEFAULT_TAB_TIMEOUT):
|
| - """Navigates to url."""
|
| - self._backend.Navigate(url, timeout)
|
| -
|
| - def GetCookieByName(self, name, timeout=DEFAULT_TAB_TIMEOUT):
|
| - """Returns the value of the cookie by the given |name|."""
|
| - return self._backend.GetCookieByName(name, timeout)
|
| -
|
| - def ExecuteJavascript(self, expr, timeout=DEFAULT_TAB_TIMEOUT):
|
| - """Executes expr in javascript. Does not return the result.
|
| -
|
| - If the expression failed to evaluate, EvaluateException will be raised.
|
| - """
|
| - self._backend.ExecuteJavascript(expr, timeout)
|
| -
|
| - def EvaluateJavascript(self, expr, timeout=DEFAULT_TAB_TIMEOUT):
|
| - """Evalutes expr in javascript and returns the JSONized result.
|
| -
|
| - Consider using ExecuteJavascript for cases where the result of the
|
| - expression is not needed.
|
| -
|
| - If evaluation throws in javascript, a python EvaluateException will
|
| - be raised.
|
| -
|
| - If the result of the evaluation cannot be JSONized, then an
|
| - EvaluationException will be raised.
|
| - """
|
| - return self._backend.EvaluateJavascript(expr, timeout)
|
| -
|
| @property
|
| - def timeline_events(self):
|
| - return self._backend.timeline_events
|
| + def timeline(self):
|
| + """Methods for interacting with the inspector timeline."""
|
| + self._Connect()
|
| + return self._timeline
|
|
|
| - def StartTimelineRecording(self):
|
| - self._backend.StartTimelineRecording()
|
| + def WaitForDocumentReadyStateToBeComplete(self, timeout=DEFAULT_TAB_TIMEOUT):
|
| + util.WaitFor(
|
| + lambda: self._runtime.Evaluate('document.readyState') == 'complete',
|
| + timeout)
|
|
|
| - def StopTimelineRecording(self):
|
| - self._backend.StopTimelineRecording()
|
| + def WaitForDocumentReadyStateToBeInteractiveOrBetter(
|
| + self, timeout=DEFAULT_TAB_TIMEOUT):
|
| + def IsReadyStateInteractiveOrBetter():
|
| + rs = self._runtime.Evaluate('document.readyState')
|
| + return rs == 'complete' or rs == 'interactive'
|
| + util.WaitFor(IsReadyStateInteractiveOrBetter, timeout)
|
| +
|
|
|