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 histogram_util
16 from metrics
import power
17 from telemetry
.core
import util
18 from telemetry
.page
import page_test
19 from telemetry
.value
import histogram
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 power
.PowerMetric
.CustomizeBrowserOptions(options
)
39 def WillStartBrowser(self
, browser
):
40 self
._first
_page
_in
_pageset
= True
41 self
._power
_metric
= power
.PowerMetric(browser
, TabSwitching
.SAMPLE_TIME
)
43 def TabForPage(self
, page
, browser
):
44 if self
._first
_page
_in
_pageset
:
45 # The initial browser window contains a single tab, navigate that tab
46 # rather than creating a new one.
47 self
._first
_page
_in
_pageset
= False
48 return browser
.tabs
[0]
50 return browser
.tabs
.New()
52 def StopBrowserAfterPage(self
, browser
, page
):
53 # Restart the browser after the last page in the pageset.
54 return len(browser
.tabs
) >= len(page
.page_set
.pages
)
56 def ValidateAndMeasurePage(self
, page
, tab
, results
):
57 """On the last tab, cycle through each tab that was opened and then record
58 a single histogram for the tab switching metric."""
59 if len(tab
.browser
.tabs
) != len(page
.page_set
.pages
):
62 # Measure power usage of tabs after quiescence.
63 util
.WaitFor(tab
.HasReachedQuiescence
, 60)
65 if tab
.browser
.platform
.CanMonitorPower():
66 self
._power
_metric
.Start(page
, tab
)
67 time
.sleep(TabSwitching
.SAMPLE_TIME
)
68 self
._power
_metric
.Stop(page
, tab
)
69 self
._power
_metric
.AddResults(tab
, results
,)
71 histogram_name
= 'MPArch.RWH_TabSwitchPaintDuration'
72 histogram_type
= histogram_util
.BROWSER_HISTOGRAM
73 display_name
= 'MPArch_RWH_TabSwitchPaintDuration'
74 first_histogram
= histogram_util
.GetHistogram(
75 histogram_type
, histogram_name
, tab
)
76 prev_histogram
= first_histogram
78 for i
in xrange(len(tab
.browser
.tabs
)):
79 t
= tab
.browser
.tabs
[i
]
82 cur_histogram
= histogram_util
.GetHistogram(
83 histogram_type
, histogram_name
, tab
)
84 diff_histogram
= histogram_util
.SubtractHistogram(
85 cur_histogram
, prev_histogram
)
87 util
.WaitFor(_IsDone
, 30)
88 prev_histogram
= histogram_util
.GetHistogram(
89 histogram_type
, histogram_name
, tab
)
91 last_histogram
= histogram_util
.GetHistogram(
92 histogram_type
, histogram_name
, tab
)
93 diff_histogram
= histogram_util
.SubtractHistogram(last_histogram
,
96 results
.AddSummaryValue(
97 histogram
.HistogramValue(None, display_name
, '',
98 raw_value_json
=diff_histogram
,