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.
5 """The tab switching measurement.
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.
15 from metrics
import power
16 from telemetry
.core
import util
17 from telemetry
.page
import page_test
18 from telemetry
.value
import histogram
19 from telemetry
.value
import histogram_util
21 # TODO: Revisit this test once multitab support is finalized.
23 class TabSwitching(page_test
.PageTest
):
25 # Amount of time to measure, in seconds.
29 super(TabSwitching
, self
).__init
__()
30 self
._first
_page
_in
_pageset
= True
31 self
._power
_metric
= None
33 def CustomizeBrowserOptions(self
, options
):
34 options
.AppendExtraBrowserArgs([
35 '--enable-stats-collection-bindings'
37 # Enable background networking so we can test its impact on power usage.
38 options
.disable_background_networking
= False
39 power
.PowerMetric
.CustomizeBrowserOptions(options
)
41 def WillStartBrowser(self
, platform
):
42 self
._first
_page
_in
_pageset
= True
43 self
._power
_metric
= power
.PowerMetric(platform
, TabSwitching
.SAMPLE_TIME
)
45 def TabForPage(self
, page
, browser
):
46 if self
._first
_page
_in
_pageset
:
47 # The initial browser window contains a single tab, navigate that tab
48 # rather than creating a new one.
49 self
._first
_page
_in
_pageset
= False
50 return browser
.tabs
[0]
52 return browser
.tabs
.New()
54 def StopBrowserAfterPage(self
, browser
, page
):
55 # Restart the browser after the last page in the pageset.
56 return len(browser
.tabs
) >= len(page
.page_set
.pages
)
58 def ValidateAndMeasurePage(self
, page
, tab
, results
):
59 """On the last tab, cycle through each tab that was opened and then record
60 a single histogram for the tab switching metric."""
61 if len(tab
.browser
.tabs
) != len(page
.page_set
.pages
):
64 # Measure power usage of tabs after quiescence.
65 util
.WaitFor(tab
.HasReachedQuiescence
, 60)
67 if tab
.browser
.platform
.CanMonitorPower():
68 self
._power
_metric
.Start(page
, tab
)
69 time
.sleep(TabSwitching
.SAMPLE_TIME
)
70 self
._power
_metric
.Stop(page
, tab
)
71 self
._power
_metric
.AddResults(tab
, results
,)
73 histogram_name
= 'MPArch.RWH_TabSwitchPaintDuration'
74 histogram_type
= histogram_util
.BROWSER_HISTOGRAM
75 display_name
= 'MPArch_RWH_TabSwitchPaintDuration'
76 first_histogram
= histogram_util
.GetHistogram(
77 histogram_type
, histogram_name
, tab
)
78 prev_histogram
= first_histogram
80 for i
in xrange(len(tab
.browser
.tabs
)):
81 t
= tab
.browser
.tabs
[i
]
84 cur_histogram
= histogram_util
.GetHistogram(
85 histogram_type
, histogram_name
, tab
)
86 diff_histogram
= histogram_util
.SubtractHistogram(
87 cur_histogram
, prev_histogram
)
89 util
.WaitFor(_IsDone
, 30)
90 prev_histogram
= histogram_util
.GetHistogram(
91 histogram_type
, histogram_name
, tab
)
93 last_histogram
= histogram_util
.GetHistogram(
94 histogram_type
, histogram_name
, tab
)
95 diff_histogram
= histogram_util
.SubtractHistogram(last_histogram
,
98 results
.AddSummaryValue(
99 histogram
.HistogramValue(None, display_name
, 'ms',
100 raw_value_json
=diff_histogram
,