1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
# 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()
|