17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)from metrics import cpu
63240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochfrom metrics import media
7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochfrom metrics import system_memory
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from metrics import power
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_test
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class Media(page_test.PageTest):
133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  """The MediaMeasurement class gathers media-related metrics on a page set.
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  Media metrics recorded are controlled by metrics/media.js.  At the end of the
163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  test each metric for every media element in the page are reported.
173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  """
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def __init__(self):
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    super(Media, self).__init__('RunMediaMetrics')
213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    self._media_metric = None
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    # Used to add browser power and CPU metrics to results per test.
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self._add_browser_metrics = False
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self._cpu_metric = None
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self._memory_metric = None
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._power_metric = None
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def WillStartBrowser(self, platform):
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._power_metric = power.PowerMetric(platform)
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def CustomizeBrowserOptions(self, options):
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Needed to run media actions in JS on touch-based devices as on Android.
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options.AppendExtraBrowserArgs(
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '--disable-gesture-requirement-for-media-playback')
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    power.PowerMetric.CustomizeBrowserOptions(options)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def DidNavigateToPage(self, page, tab):
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """Override to do operations right after the page is navigated."""
393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    self._media_metric = media.MediaMetric(tab)
403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    self._media_metric.Start(page, tab)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    # Reset to false for every page.
43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self._add_browser_metrics = (page.add_browser_metrics
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        if hasattr(page, 'add_browser_metrics') else False)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if self._add_browser_metrics:
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      self._cpu_metric = cpu.CpuMetric(tab.browser)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      self._cpu_metric.Start(page, tab)
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      self._memory_metric = system_memory.SystemMemoryMetric(tab.browser)
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      self._memory_metric.Start(page, tab)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      self._power_metric.Start(page, tab)
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """Measure the page's performance."""
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    self._media_metric.Stop(page, tab)
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    trace_name = self._media_metric.AddResults(tab, results)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if self._add_browser_metrics:
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      self._cpu_metric.Stop(page, tab)
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      self._memory_metric.Stop(page, tab)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      self._power_metric.Stop(page, tab)
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      self._cpu_metric.AddResults(tab, results, trace_name=trace_name)
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      exclude_metrics = ['WorkingSetSizePeak', 'SystemCommitCharge', 'VMPeak',
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                         'VM']
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      self._memory_metric.AddResults(tab, results,
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                     trace_name=trace_name,
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                     exclude_metrics=exclude_metrics)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      self._power_metric.AddResults(tab, results)
69