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()
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)
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)
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)
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)
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)
def testSocketError(self): with self.assertRaises( devtools_http.DevToolsClientConnectionError) as e: devtools_http.DevToolsHttp(1000).Request('') self.assertnotisinstance(e, devtools_http.devtoolsclienturlerror)
def testUrlError(self): with self.assertRaises(devtools_http.DevToolsClientUrlError): devtools_http.DevToolsHttp(1000).Request('')