# Copyright 2013 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 import sys from py_utils import cloud_storage # pylint: disable=import-error from telemetry import decorators from telemetry.internal.backends import app_backend from telemetry.internal.browser import web_contents from telemetry.internal.platform import profiling_controller_backend class ExtensionsNotSupportedException(Exception): pass class BrowserBackend(app_backend.AppBackend): """A base class for browser backends.""" def __init__(self, platform_backend, supports_extensions, browser_options, tab_list_backend): assert browser_options.browser_type super(BrowserBackend, self).__init__( browser_options.browser_type, platform_backend) self._supports_extensions = supports_extensions self.browser_options = browser_options self._tab_list_backend_class = tab_list_backend self._profiling_controller_backend = ( profiling_controller_backend.ProfilingControllerBackend( platform_backend, self)) def SetBrowser(self, browser): super(BrowserBackend, self).SetApp(app=browser) @property def log_file_path(self): # Specific browser backend is responsible for overriding this properly. raise NotImplementedError def GetLogFileContents(self): if not self.log_file_path: return 'No log file' with file(self.log_file_path) as f: return f.read() def UploadLogsToCloudStorage(self): """ Uploading log files produce by this browser instance to cloud storage. Check supports_uploading_logs before calling this method. """ assert self.supports_uploading_logs remote_path = (self.browser_options.logs_cloud_remote_path or 'log_%s' % uuid.uuid4()) cloud_url = cloud_storage.Insert( bucket=self.browser_options.logs_cloud_bucket, remote_path=remote_path, local_path=self.log_file_path) sys.stderr.write('Uploading browser log to %s\n' % cloud_url) @property def browser(self): return self.app @property def profiling_controller_backend(self): return self._profiling_controller_backend @property def browser_type(self): return self.app_type @property def supports_uploading_logs(self): # Specific browser backend is responsible for overriding this properly. return False @property def supports_extensions(self): """True if this browser backend supports extensions.""" return self._supports_extensions @property def supports_tab_control(self): raise NotImplementedError() @property @decorators.Cache def tab_list_backend(self): return self._tab_list_backend_class(self) @property def supports_tracing(self): raise NotImplementedError() @property def supports_system_info(self): return False def StartTracing(self, trace_options, timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT): raise NotImplementedError() def StopTracing(self): raise NotImplementedError() def CollectTracingData(self, trace_data_builder): raise NotImplementedError() def Start(self): raise NotImplementedError() def IsBrowserRunning(self): raise NotImplementedError() def IsAppRunning(self): return self.IsBrowserRunning() def GetStandardOutput(self): raise NotImplementedError() def GetStackTrace(self): raise NotImplementedError() def GetMostRecentMinidumpPath(self): raise NotImplementedError() def GetAllMinidumpPaths(self): raise NotImplementedError() def GetAllUnsymbolizedMinidumpPaths(self): raise NotImplementedError() def SymbolizeMinidump(self, minidump_path): raise NotImplementedError() def GetSystemInfo(self): raise NotImplementedError() @property def supports_memory_dumping(self): return False def DumpMemory(self, timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT): raise NotImplementedError() @property def supports_overriding_memory_pressure_notifications(self): return False def SetMemoryPressureNotificationsSuppressed( self, suppressed, timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT): raise NotImplementedError() def SimulateMemoryPressureNotification( self, pressure_level, timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT): raise NotImplementedError() @property def supports_cpu_metrics(self): raise NotImplementedError() @property def supports_memory_metrics(self): raise NotImplementedError() @property def supports_power_metrics(self): raise NotImplementedError()