| Index: tools/telemetry/telemetry/internal/browser/browser.py
|
| diff --git a/tools/telemetry/telemetry/internal/browser/browser.py b/tools/telemetry/telemetry/internal/browser/browser.py
|
| deleted file mode 100644
|
| index a36631f724807cd2e3d65a02835d3f45972fb9d8..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/internal/browser/browser.py
|
| +++ /dev/null
|
| @@ -1,286 +0,0 @@
|
| -# Copyright 2012 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 logging
|
| -import sys
|
| -
|
| -from catapult_base import cloud_storage # pylint: disable=import-error
|
| -
|
| -from telemetry.core import exceptions
|
| -from telemetry.core import profiling_controller
|
| -from telemetry import decorators
|
| -from telemetry.internal import app
|
| -from telemetry.internal.backends import browser_backend
|
| -from telemetry.internal.browser import browser_credentials
|
| -from telemetry.internal.browser import extension_dict
|
| -from telemetry.internal.browser import tab_list
|
| -from telemetry.internal.browser import web_contents
|
| -from telemetry.internal.util import exception_formatter
|
| -
|
| -
|
| -class Browser(app.App):
|
| - """A running browser instance that can be controlled in a limited way.
|
| -
|
| - To create a browser instance, use browser_finder.FindBrowser.
|
| -
|
| - Be sure to clean up after yourself by calling Close() when you are done with
|
| - the browser. Or better yet:
|
| - browser_to_create = FindBrowser(options)
|
| - with browser_to_create.Create(options) as browser:
|
| - ... do all your operations on browser here
|
| - """
|
| - def __init__(self, backend, platform_backend, credentials_path):
|
| - super(Browser, self).__init__(app_backend=backend,
|
| - platform_backend=platform_backend)
|
| - try:
|
| - self._browser_backend = backend
|
| - self._platform_backend = platform_backend
|
| - self._tabs = tab_list.TabList(backend.tab_list_backend)
|
| - self.credentials = browser_credentials.BrowserCredentials()
|
| - self.credentials.credentials_path = credentials_path
|
| - self._platform_backend.DidCreateBrowser(self, self._browser_backend)
|
| - browser_options = self._browser_backend.browser_options
|
| - self.platform.FlushDnsCache()
|
| - if browser_options.clear_sytem_cache_for_browser_and_profile_on_start:
|
| - if self.platform.CanFlushIndividualFilesFromSystemCache():
|
| - self.platform.FlushSystemCacheForDirectory(
|
| - self._browser_backend.profile_directory)
|
| - self.platform.FlushSystemCacheForDirectory(
|
| - self._browser_backend.browser_directory)
|
| - else:
|
| - self.platform.FlushEntireSystemCache()
|
| -
|
| - self._browser_backend.SetBrowser(self)
|
| - self._browser_backend.Start()
|
| - self._platform_backend.DidStartBrowser(self, self._browser_backend)
|
| - self._profiling_controller = profiling_controller.ProfilingController(
|
| - self._browser_backend.profiling_controller_backend)
|
| - except Exception:
|
| - exc_info = sys.exc_info()
|
| - logging.exception('Failure while starting browser backend.')
|
| - try:
|
| - self._platform_backend.WillCloseBrowser(self, self._browser_backend)
|
| - except Exception:
|
| - exception_formatter.PrintFormattedException(
|
| - msg='Exception raised while closing platform backend')
|
| - raise exc_info[0], exc_info[1], exc_info[2]
|
| -
|
| - @property
|
| - def profiling_controller(self):
|
| - return self._profiling_controller
|
| -
|
| - @property
|
| - def browser_type(self):
|
| - return self.app_type
|
| -
|
| - @property
|
| - def supports_extensions(self):
|
| - return self._browser_backend.supports_extensions
|
| -
|
| - @property
|
| - def supports_tab_control(self):
|
| - return self._browser_backend.supports_tab_control
|
| -
|
| - @property
|
| - def tabs(self):
|
| - return self._tabs
|
| -
|
| - @property
|
| - def foreground_tab(self):
|
| - for i in xrange(len(self._tabs)):
|
| - # The foreground tab is the first (only) one that isn't hidden.
|
| - # This only works through luck on Android, due to crbug.com/322544
|
| - # which means that tabs that have never been in the foreground return
|
| - # document.hidden as false; however in current code the Android foreground
|
| - # tab is always tab 0, which will be the first one that isn't hidden
|
| - if self._tabs[i].EvaluateJavaScript('!document.hidden'):
|
| - return self._tabs[i]
|
| - raise Exception("No foreground tab found")
|
| -
|
| - @property
|
| - @decorators.Cache
|
| - def extensions(self):
|
| - if not self.supports_extensions:
|
| - raise browser_backend.ExtensionsNotSupportedException(
|
| - 'Extensions not supported')
|
| - return extension_dict.ExtensionDict(self._browser_backend.extension_backend)
|
| -
|
| - def _GetStatsCommon(self, pid_stats_function):
|
| - browser_pid = self._browser_backend.pid
|
| - result = {
|
| - 'Browser': dict(pid_stats_function(browser_pid), **{'ProcessCount': 1}),
|
| - 'Renderer': {'ProcessCount': 0},
|
| - 'Gpu': {'ProcessCount': 0},
|
| - 'Other': {'ProcessCount': 0}
|
| - }
|
| - process_count = 1
|
| - for child_pid in self._platform_backend.GetChildPids(browser_pid):
|
| - try:
|
| - child_cmd_line = self._platform_backend.GetCommandLine(child_pid)
|
| - child_stats = pid_stats_function(child_pid)
|
| - except exceptions.ProcessGoneException:
|
| - # It is perfectly fine for a process to have gone away between calling
|
| - # GetChildPids() and then further examining it.
|
| - continue
|
| - child_process_name = self._browser_backend.GetProcessName(child_cmd_line)
|
| - process_name_type_key_map = {'gpu-process': 'Gpu', 'renderer': 'Renderer'}
|
| - if child_process_name in process_name_type_key_map:
|
| - child_process_type_key = process_name_type_key_map[child_process_name]
|
| - else:
|
| - # TODO: identify other process types (zygote, plugin, etc), instead of
|
| - # lumping them in a single category.
|
| - child_process_type_key = 'Other'
|
| - result[child_process_type_key]['ProcessCount'] += 1
|
| - for k, v in child_stats.iteritems():
|
| - if k in result[child_process_type_key]:
|
| - result[child_process_type_key][k] += v
|
| - else:
|
| - result[child_process_type_key][k] = v
|
| - process_count += 1
|
| - for v in result.itervalues():
|
| - if v['ProcessCount'] > 1:
|
| - for k in v.keys():
|
| - if k.endswith('Peak'):
|
| - del v[k]
|
| - del v['ProcessCount']
|
| - result['ProcessCount'] = process_count
|
| - return result
|
| -
|
| - @property
|
| - def memory_stats(self):
|
| - """Returns a dict of memory statistics for the browser:
|
| - { 'Browser': {
|
| - 'VM': R,
|
| - 'VMPeak': S,
|
| - 'WorkingSetSize': T,
|
| - 'WorkingSetSizePeak': U,
|
| - 'ProportionalSetSize': V,
|
| - 'PrivateDirty': W
|
| - },
|
| - 'Gpu': {
|
| - 'VM': R,
|
| - 'VMPeak': S,
|
| - 'WorkingSetSize': T,
|
| - 'WorkingSetSizePeak': U,
|
| - 'ProportionalSetSize': V,
|
| - 'PrivateDirty': W
|
| - },
|
| - 'Renderer': {
|
| - 'VM': R,
|
| - 'VMPeak': S,
|
| - 'WorkingSetSize': T,
|
| - 'WorkingSetSizePeak': U,
|
| - 'ProportionalSetSize': V,
|
| - 'PrivateDirty': W
|
| - },
|
| - 'SystemCommitCharge': X,
|
| - 'SystemTotalPhysicalMemory': Y,
|
| - 'ProcessCount': Z,
|
| - }
|
| - Any of the above keys may be missing on a per-platform basis.
|
| - """
|
| - self._platform_backend.PurgeUnpinnedMemory()
|
| - result = self._GetStatsCommon(self._platform_backend.GetMemoryStats)
|
| - commit_charge = self._platform_backend.GetSystemCommitCharge()
|
| - if commit_charge:
|
| - result['SystemCommitCharge'] = commit_charge
|
| - total = self._platform_backend.GetSystemTotalPhysicalMemory()
|
| - if total:
|
| - result['SystemTotalPhysicalMemory'] = total
|
| - return result
|
| -
|
| - @property
|
| - def cpu_stats(self):
|
| - """Returns a dict of cpu statistics for the system.
|
| - { 'Browser': {
|
| - 'CpuProcessTime': S,
|
| - 'TotalTime': T
|
| - },
|
| - 'Gpu': {
|
| - 'CpuProcessTime': S,
|
| - 'TotalTime': T
|
| - },
|
| - 'Renderer': {
|
| - 'CpuProcessTime': S,
|
| - 'TotalTime': T
|
| - }
|
| - }
|
| - Any of the above keys may be missing on a per-platform basis.
|
| - """
|
| - result = self._GetStatsCommon(self._platform_backend.GetCpuStats)
|
| - del result['ProcessCount']
|
| -
|
| - # We want a single time value, not the sum for all processes.
|
| - cpu_timestamp = self._platform_backend.GetCpuTimestamp()
|
| - for process_type in result:
|
| - # Skip any process_types that are empty
|
| - if not len(result[process_type]):
|
| - continue
|
| - result[process_type].update(cpu_timestamp)
|
| - return result
|
| -
|
| - def Close(self):
|
| - """Closes this browser."""
|
| - if self._browser_backend.IsBrowserRunning():
|
| - self._platform_backend.WillCloseBrowser(self, self._browser_backend)
|
| -
|
| - self._browser_backend.profiling_controller_backend.WillCloseBrowser()
|
| - if self._browser_backend.supports_uploading_logs:
|
| - try:
|
| - self._browser_backend.UploadLogsToCloudStorage()
|
| - except cloud_storage.CloudStorageError as e:
|
| - logging.error('Cannot upload browser log: %s' % str(e))
|
| - self._browser_backend.Close()
|
| - self.credentials = None
|
| -
|
| -
|
| - def GetStandardOutput(self):
|
| - return self._browser_backend.GetStandardOutput()
|
| -
|
| - def GetStackTrace(self):
|
| - return self._browser_backend.GetStackTrace()
|
| -
|
| - @property
|
| - def supports_system_info(self):
|
| - return self._browser_backend.supports_system_info
|
| -
|
| - def GetSystemInfo(self):
|
| - """Returns low-level information about the system, if available.
|
| -
|
| - See the documentation of the SystemInfo class for more details."""
|
| - return self._browser_backend.GetSystemInfo()
|
| -
|
| - @property
|
| - def supports_memory_dumping(self):
|
| - return self._browser_backend.supports_memory_dumping
|
| -
|
| - def DumpMemory(self, timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT):
|
| - return self._browser_backend.DumpMemory(timeout)
|
| -
|
| - @property
|
| - def supports_overriding_memory_pressure_notifications(self):
|
| - return (
|
| - self._browser_backend.supports_overriding_memory_pressure_notifications)
|
| -
|
| - def SetMemoryPressureNotificationsSuppressed(
|
| - self, suppressed, timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT):
|
| - self._browser_backend.SetMemoryPressureNotificationsSuppressed(
|
| - suppressed, timeout)
|
| -
|
| - def SimulateMemoryPressureNotification(
|
| - self, pressure_level, timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT):
|
| - self._browser_backend.SimulateMemoryPressureNotification(
|
| - pressure_level, timeout)
|
| -
|
| - @property
|
| - def supports_cpu_metrics(self):
|
| - return self._browser_backend.supports_cpu_metrics
|
| -
|
| - @property
|
| - def supports_memory_metrics(self):
|
| - return self._browser_backend.supports_memory_metrics
|
| -
|
| - @property
|
| - def supports_power_metrics(self):
|
| - return self._browser_backend.supports_power_metrics
|
|
|