Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / tools / perf / measurements / tab_switching.py
1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 """The tab switching measurement.
6
7 This measurement opens pages in different tabs. After all the tabs have opened,
8 it cycles through each tab in sequence, and records a histogram of the time
9 between when a tab was first requested to be shown, and when it was painted.
10 Power usage is also measured.
11 """
12
13 import time
14
15 from metrics import histogram_util
16 from metrics import power
17 from telemetry.core import util
18 from telemetry.page import page_measurement
19 from telemetry.value import histogram
20
21 # TODO: Revisit this test once multitab support is finalized.
22
23 class TabSwitching(page_measurement.PageMeasurement):
24   def __init__(self):
25     super(TabSwitching, self).__init__()
26     self._first_page_in_pageset = True
27     self._power_metric = power.PowerMetric()
28
29   def CustomizeBrowserOptions(self, options):
30     options.AppendExtraBrowserArgs([
31         '--enable-stats-collection-bindings'
32     ])
33     power.PowerMetric.CustomizeBrowserOptions(options)
34
35   def DidStartBrowser(self, browser):
36     self._first_page_in_pageset = True
37
38   def TabForPage(self, page, browser):
39     if self._first_page_in_pageset:
40       # The initial browser window contains a single tab, navigate that tab
41       # rather than creating a new one.
42       self._first_page_in_pageset = False
43       return browser.tabs[0]
44
45     return browser.tabs.New()
46
47   def StopBrowserAfterPage(self, browser, page):
48     # Restart the browser after the last page in the pageset.
49     return len(browser.tabs) >= len(page.page_set.pages)
50
51   def MeasurePage(self, page, tab, results):
52     """On the last tab, cycle through each tab that was opened and then record
53     a single histogram for the tab switching metric."""
54     if len(tab.browser.tabs) != len(page.page_set.pages):
55       return
56
57     # Measure power usage of tabs after quiescence.
58     util.WaitFor(tab.HasReachedQuiescence, 60)
59
60     self._power_metric.Start(page, tab)
61     time.sleep(60)
62     self._power_metric.Stop(page, tab)
63     self._power_metric.AddResults(tab, results,)
64
65     histogram_name = 'MPArch.RWH_TabSwitchPaintDuration'
66     histogram_type = histogram_util.BROWSER_HISTOGRAM
67     display_name = 'MPArch_RWH_TabSwitchPaintDuration'
68     first_histogram = histogram_util.GetHistogram(
69         histogram_type, histogram_name, tab)
70     prev_histogram = first_histogram
71
72     for i in xrange(len(tab.browser.tabs)):
73       t = tab.browser.tabs[i]
74       t.Activate()
75       def _IsDone():
76         cur_histogram = histogram_util.GetHistogram(
77             histogram_type, histogram_name, tab)
78         diff_histogram = histogram_util.SubtractHistogram(
79             cur_histogram, prev_histogram)
80         return diff_histogram
81       util.WaitFor(_IsDone, 30)
82       prev_histogram = histogram_util.GetHistogram(
83           histogram_type, histogram_name, tab)
84
85     last_histogram = histogram_util.GetHistogram(
86         histogram_type, histogram_name, tab)
87     diff_histogram = histogram_util.SubtractHistogram(last_histogram,
88         first_histogram)
89
90     results.AddSummaryValue(
91         histogram.HistogramValue(None, display_name, '',
92                                  raw_value_json=diff_histogram,
93                                  important=False))