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.
4from telemetry import benchmark
5from telemetry.page import page
6from telemetry.page import page_set
7from telemetry.page import page_test
8
9from webgl_conformance import WebglConformanceValidator
10from webgl_conformance import conformance_harness_script
11from webgl_conformance import conformance_path
12
13
14robustness_harness_script = conformance_harness_script + r"""
15  var robustnessTestHarness = {};
16  robustnessTestHarness._contextLost = false;
17  robustnessTestHarness.initialize = function() {
18    var canvas = document.getElementById('example');
19    canvas.addEventListener('webglcontextlost', function() {
20      robustnessTestHarness._contextLost = true;
21    });
22  }
23  robustnessTestHarness.runTestLoop = function() {
24    // Run the test in a loop until the context is lost.
25    main();
26    if (!robustnessTestHarness._contextLost)
27      window.requestAnimationFrame(robustnessTestHarness.runTestLoop);
28    else
29      robustnessTestHarness.notifyFinished();
30  }
31  robustnessTestHarness.notifyFinished = function() {
32    // The test may fail in unpredictable ways depending on when the context is
33    // lost. We ignore such errors and only require that the browser doesn't
34    // crash.
35    webglTestHarness._allTestSucceeded = true;
36    // Notify test completion after a delay to make sure the browser is able to
37    // recover from the lost context.
38    setTimeout(webglTestHarness.notifyFinished, 3000);
39  }
40
41  window.confirm = function() {
42    robustnessTestHarness.initialize();
43    robustnessTestHarness.runTestLoop();
44    return false;
45  }
46  window.webglRobustnessTestHarness = robustnessTestHarness;
47"""
48
49class WebglRobustnessPage(page.Page):
50  def __init__(self, page_set, base_dir):
51    super(WebglRobustnessPage, self).__init__(
52      url='file://extra/lots-of-polys-example.html',
53      page_set=page_set,
54      base_dir=base_dir)
55    self.script_to_evaluate_on_commit = robustness_harness_script
56
57  def RunNavigateSteps(self, action_runner):
58    action_runner.NavigateToPage(self)
59    action_runner.WaitForJavaScriptCondition('webglTestHarness._finished')
60
61class WebglRobustness(benchmark.Benchmark):
62  test = WebglConformanceValidator
63
64  def CreatePageSet(self, options):
65    ps = page_set.PageSet(
66      file_path=conformance_path,
67      user_agent_type='desktop',
68      serving_dirs=[''])
69    ps.AddPage(WebglRobustnessPage(ps, ps.base_dir))
70    return ps
71