Пример #1
0
def IsDevToolsAgentAvailable(port, app_backend):
  """Returns True if a DevTools agent is available on the given port."""
  if (isinstance(app_backend, browser_backend.BrowserBackend) and
      app_backend.supports_tracing):
    inspector_websocket_instance = inspector_websocket.InspectorWebsocket()
    try:
      if not _IsInspectorWebsocketAvailable(inspector_websocket_instance, port):
        return False
    finally:
      inspector_websocket_instance.Disconnect()

  devtools_http_instance = devtools_http.DevToolsHttp(port)
  try:
    return _IsDevToolsAgentAvailable(devtools_http_instance)
  finally:
    devtools_http_instance.Disconnect()
Пример #2
0
    def __init__(self, devtools_port, browser_target, remote_devtools_port,
                 app_backend):
        """Creates a new DevToolsClientBackend.

    A DevTools agent must exist on the given devtools_port.

    Args:
      devtools_port: The port to use to connect to DevTools agent.
      remote_devtools_port: In some cases (e.g., app running on
          Android device, devtools_port is the forwarded port on the
          host platform. We also need to know the remote_devtools_port
          so that we can uniquely identify the DevTools agent.
      app_backend: For the app that contains the DevTools agent.
    """
        self._devtools_port = devtools_port
        self._browser_target = browser_target or '/devtools/browser'
        self._remote_devtools_port = remote_devtools_port
        self._devtools_http = devtools_http.DevToolsHttp(devtools_port)
        self._browser_inspector_websocket = None
        self._tracing_backend = None
        self._memory_backend = None
        self._system_info_backend = None
        self._app_backend = app_backend
        self._devtools_context_map_backend = _DevToolsContextMapBackend(
            self._app_backend, self)

        self._tab_ids = None

        if not self.supports_tracing:
            return
        chrome_tracing_devtools_manager.RegisterDevToolsClient(
            self, self._app_backend.platform_backend)

        # Telemetry has started Chrome tracing if there is trace config, so start
        # tracing on this newly created devtools client if needed.
        trace_config = (self._app_backend.platform_backend.
                        tracing_controller_backend.GetChromeTraceConfig())
        if not trace_config:
            self._CreateTracingBackendIfNeeded(is_tracing_running=False)
            return

        if self.support_startup_tracing:
            self._CreateTracingBackendIfNeeded(is_tracing_running=True)
            return

        self._CreateTracingBackendIfNeeded(is_tracing_running=False)
        self.StartChromeTracing(trace_config)
Пример #3
0
    def _Connect(self, devtools_port, browser_target):
        """Attempt to connect to the DevTools client.

    Args:
      devtools_port: The devtools_port uniquely identifies the DevTools agent.
      browser_target: An optional string to override the default path used to
        establish a websocket connection with the browser inspector.

    Raises:
      Any of _DEVTOOLS_CONNECTION_ERRORS if failed to establish the connection.
    """
        self._browser_target = browser_target or '/devtools/browser'
        self._forwarder = self.platform_backend.forwarder_factory.Create(
            local_port=None,  # Forwarder will choose an available port.
            remote_port=devtools_port,
            reverse=True)
        self._local_port = self._forwarder._local_port
        self._remote_port = self._forwarder._remote_port

        self._devtools_http = devtools_http.DevToolsHttp(self.local_port)
        # If the agent is not alive and ready, trying to get the branch number will
        # raise a devtools_http.DevToolsClientConnectionError.
        branch_number = self.GetChromeBranchNumber()
        if branch_number < MIN_SUPPORTED_BRANCH_NUMBER:
            raise UnsupportedVersionError(
                'Chrome branch number %d is no longer supported' %
                branch_number)

        # Ensure that the inspector websocket is ready. This may raise a
        # inspector_websocket.WebSocketException or socket.error if not ready.
        self._browser_websocket = inspector_websocket.InspectorWebsocket()
        self._browser_websocket.Connect(self.browser_target_url, timeout=10)

        chrome_tracing_devtools_manager.RegisterDevToolsClient(self)

        # If there is a trace_config it means that Telemetry has already started
        # Chrome tracing via a startup config. The TracingBackend also needs needs
        # this config to initialize itself correctly.
        trace_config = (self.platform_backend.tracing_controller_backend.
                        GetChromeTraceConfig())
        self._tracing_backend = tracing_backend.TracingBackend(
            self._browser_websocket, trace_config)
Пример #4
0
    def __init__(self, devtools_config):
        """Creates a new DevToolsClientBackend.

    Clients should consider using DevToolsClientConfig.WaitForAndCreate rather
    than directly instantiating this class.

    Args:
      devtools_config: A DevToolsClientConfig instance.
    """
        self._devtools_config = devtools_config
        self._browser_inspector_websocket = None
        self._tracing_backend = None
        self._memory_backend = None
        self._system_info_backend = None
        self._wm_backend = None
        self._tab_ids = None

        self._devtools_http = devtools_http.DevToolsHttp(
            self._devtools_config.local_port)
        self._devtools_context_map_backend = _DevToolsContextMapBackend(
            self._devtools_config.app_backend, self)

        if not self.supports_tracing:
            return

        chrome_tracing_devtools_manager.RegisterDevToolsClient(
            self, self._devtools_config.app_backend.platform_backend)

        # Telemetry has started Chrome tracing if there is trace config, so start
        # tracing on this newly created devtools client if needed.
        trace_config = (self._devtools_config.app_backend.platform_backend.
                        tracing_controller_backend.GetChromeTraceConfig())
        if not trace_config:
            self._CreateTracingBackendIfNeeded(is_tracing_running=False)
            return

        if self.support_startup_tracing:
            self._CreateTracingBackendIfNeeded(is_tracing_running=True)
            return

        self._CreateTracingBackendIfNeeded(is_tracing_running=False)
        self.StartChromeTracing(trace_config)
Пример #5
0
    def __init__(self, devtools_port, remote_devtools_port, app_backend):
        """Creates a new DevToolsClientBackend.

    A DevTools agent must exist on the given devtools_port.

    Args:
      devtools_port: The port to use to connect to DevTools agent.
      remote_devtools_port: In some cases (e.g., app running on
          Android device, devtools_port is the forwarded port on the
          host platform. We also need to know the remote_devtools_port
          so that we can uniquely identify the DevTools agent.
      app_backend: For the app that contains the DevTools agent.
    """
        self._devtools_port = devtools_port
        self._remote_devtools_port = remote_devtools_port
        self._devtools_http = devtools_http.DevToolsHttp(devtools_port)
        self._tracing_backend = None
        self._app_backend = app_backend
        self._devtools_context_map_backend = _DevToolsContextMapBackend(
            self._app_backend, self)

        chrome_tracing_agent.ChromeTracingAgent.RegisterDevToolsClient(
            self, self._app_backend.platform_backend)
Пример #6
0
  def _Connect(self, devtools_port, browser_target):
    """Attempt to connect to the DevTools client.

    Args:
      devtools_port: The devtools_port uniquely identifies the DevTools agent.
      browser_target: An optional string to override the default path used to
        establish a websocket connection with the browser inspector.

    Raises:
      Any of _DEVTOOLS_CONNECTION_ERRORS if failed to establish the connection.
    """
    self._browser_target = browser_target or '/devtools/browser'
    self._forwarder = self.platform_backend.forwarder_factory.Create(
        local_port=None,  # Forwarder will choose an available port.
        remote_port=devtools_port, reverse=True)
    self._local_port = self._forwarder._local_port
    self._remote_port = self._forwarder._remote_port

    self._devtools_http = devtools_http.DevToolsHttp(self.local_port)
    # If the agent is not alive and ready, this will raise a
    # devtools_http.DevToolsClientConnectionError.
    self.GetVersion()

    # Ensure that the inspector websocket is ready. This may raise a
    # inspector_websocket.WebSocketException or socket.error if not ready.
    self._browser_websocket = inspector_websocket.InspectorWebsocket()
    self._browser_websocket.Connect(self.browser_target_url, timeout=10)

    chrome_tracing_devtools_manager.RegisterDevToolsClient(self)

    # Telemetry has started Chrome tracing if there is a trace config, we use
    # this info to create the TracingBackend in the correct state.
    is_tracing_running = bool(
        self.platform_backend.tracing_controller_backend.GetChromeTraceConfig())
    self._tracing_backend = tracing_backend.TracingBackend(
        self._browser_websocket, is_tracing_running)
Пример #7
0
 def testSocketError(self):
     with self.assertRaises(
             devtools_http.DevToolsClientConnectionError) as e:
         devtools_http.DevToolsHttp(1000).Request('')
         self.assertnotisinstance(e, devtools_http.devtoolsclienturlerror)
Пример #8
0
 def testUrlError(self):
     with self.assertRaises(devtools_http.DevToolsClientUrlError):
         devtools_http.DevToolsHttp(1000).Request('')