11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)# found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)import hardware_accelerated_feature_expectations as expectations
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liufrom telemetry.page import page as page_module
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)from telemetry.page import page_set
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)from telemetry.page import page_test
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)test_harness_script = r"""
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  function VerifyHardwareAccelerated(feature) {
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    feature += ': '
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    var list = document.querySelector('.feature-status-list');
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (var i=0; i < list.childElementCount; i++) {
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      var span_list = list.children[i].getElementsByTagName('span');
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      var feature_str = span_list[0].textContent;
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      var value_str = span_list[1].textContent;
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if ((feature_str == feature) &&
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          (value_str == 'Hardware accelerated')) {
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return true;
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)""";
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class _HardwareAcceleratedFeatureValidator(page_test.PageTest):
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    feature = page.feature
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if not tab.EvaluateJavaScript('VerifyHardwareAccelerated("%s")' % feature):
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      print 'Test failed. Printing page contents:'
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      print tab.EvaluateJavaScript('document.body.innerHTML')
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      raise page_test.Failure('%s not hardware accelerated' % feature)
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)def safe_feature_name(feature):
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return feature.lower().replace(' ', '_')
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ChromeGpuPage(page_module.Page):
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  def __init__(self, page_set, feature):
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    super(ChromeGpuPage, self).__init__(
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      url='chrome://gpu', page_set=page_set, base_dir=page_set.base_dir,
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      name=('HardwareAcceleratedFeature.%s_accelerated' %
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            safe_feature_name(feature)))
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.feature = feature
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.script_to_evaluate_on_commit = test_harness_script
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass HardwareAcceleratedFeature(benchmark.Benchmark):
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  """Tests GPU acceleration is reported as active for various features"""
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  test = _HardwareAcceleratedFeatureValidator
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  def CreateExpectations(self, page_set):
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return expectations.HardwareAcceleratedFeatureExpectations()
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  def CreatePageSet(self, options):
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    features = ['WebGL', 'Canvas']
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ps = page_set.PageSet(user_agent_type='desktop', file_path='')
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for feature in features:
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ps.AddPage(ChromeGpuPage(page_set=ps, feature=feature))
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ps
63