// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // webpagereplay/start.js - Start Web Page Replay (WPR) test. // // This script is included by webpagereplay/start.html. // The query parameter "test=TEST_NAME" is required to load the // test configuration from webpagereplay/tests/TEST_NAME.js // That JavaScript file defines a global, "pageSets", as a list of lists: // [ [url_1, url_2], [url_3], ...], // - Before each sublist: // Run chrome.browingData.remove and close the connections. // - Before each url in a sublist: // Close the connections. // // These WPR tests use a Chrome extension to load the test URLs. // The extension loads the test configuration via a DOM elemment // (id=json). This script sets the content of that DOM element. // // The test runs immediately after being loaded. // var options = location.search.substring(1).split('&'); function getopt(name) { var r = new RegExp('^' + name + '='); for (i = 0; i < options.length; ++i) { if (options[i].match(r)) { return options[i].substring(name.length + 1); } } return null; } function LoadTestConfigurationScript(testUrl, callback) { var testjs = document.createElement('script'); testjs.type = 'text/javascript'; testjs.async = true; testjs.src = testUrl var s = document.getElementsByTagName('script')[0]; testjs.addEventListener('load', callback, false); s.parentNode.insertBefore(testjs, s); } function ReloadIfStuck() { setTimeout(function() { var status = document.getElementById('status'); // The status text is set to 'STARTING' by the extension. if (status.textContent != 'STARTING') { console.log('Benchmark stuck? Reloading.'); window.location.reload(true); } }, 30000); } function RenderForm() { var form = document.createElement('FORM'); form.setAttribute('action', 'start.html'); var label = document.createTextNode('Iterations: '); form.appendChild(label); var input = document.createElement('INPUT'); var iterations = getopt('iterations'); input.setAttribute('name', 'iterations'); input.setAttribute('value', iterations ? iterations : '5'); form.appendChild(input); form.appendChild(document.createElement('P')); var label = document.createTextNode('Test: '); form.appendChild(label); var input = document.createElement('INPUT'); input.setAttribute('name', 'test'); var test = getopt('test'); input.setAttribute('value', test ? test : ''); form.appendChild(input); var input = document.createElement('INPUT'); input.setAttribute('name', 'auto'); var auto = getopt('auto'); input.setAttribute('value', 1); input.setAttribute('type', 'hidden'); form.appendChild(input); form.appendChild(document.createElement('P')); input = document.createElement('INPUT'); input.setAttribute('type', 'submit'); input.setAttribute('value', 'Start'); form.appendChild(input); document.getElementById('startform').appendChild(form); } var iterations = getopt('iterations'); var test_name = getopt('test'); var is_auto_start = getopt('auto'); RenderForm(); if (test_name) { var testUrl = 'tests/' + test_name + '.js'; LoadTestConfigurationScript(testUrl, function() { var testConfig = {}; if (iterations) { testConfig['iterations'] = iterations; } // The pageSets global is set by test configuration script. testConfig['pageSets'] = pageSets; if (is_auto_start) { testConfig['shouldStart'] = 1; ReloadIfStuck(); } // Write testConfig to "json" DOM element for the Chrome extension. document.getElementById('json').textContent = JSON.stringify(testConfig); }); } else { console.log('Need "test=TEST_NAME" query parameter.'); }