blob: 43e77733b76e87301009d31dd1f8cdc5d01aac28 [file] [log] [blame]
# 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()