1// Copyright (c) 2014 The Chromium OS 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.
4
5var cycle_tabs = {};
6var cycles = {};
7var time_ratio = 3600 * 1000 / test_time_ms; // default test time is 1 hour
8var preexisting_windows = [];
9
10function setupTest() {
11  chrome.windows.getAll(null, function(windows) {
12    preexisting_windows = windows;
13    for (var i = 0; i < tasks.length; i++) {
14      setTimeout(launch_task, tasks[i].start / time_ratio, tasks[i]);
15    }
16    var end = 3600 * 1000 / time_ratio
17    setTimeout(send_status, end);
18  });
19}
20
21function testListener(request, sender, sendResponse) {
22  if (sender.tab.id in cycle_tabs) {
23    cycle = cycle_tabs[sender.tab.id];
24    cycle.successful_loads++;
25    if (request.action == "should_scroll" && cycle.focus) {
26      sendResponse({"should_scroll": should_scroll,
27                    "should_scroll_up": should_scroll_up,
28                    "scroll_loop": scroll_loop,
29                    "scroll_interval": scroll_interval_ms,
30                    "scroll_by": scroll_by_pixels});
31    }
32    delete cycle_tabs[sender.tab.id];
33  }
34}
35
36function close_preexisting_windows() {
37  for (var i = 0; i < preexisting_windows.length; i++) {
38    chrome.windows.remove(preexisting_windows[i].id);
39  }
40  preexisting_windows.length = 0;
41}
42
43function cycle_navigate(cycle) {
44  cycle_tabs[cycle.id] = cycle;
45  var url = cycle.urls[cycle.idx];
46  chrome.tabs.update(cycle.id, {'url': url, 'selected': true});
47  cycle.idx = (cycle.idx + 1) % cycle.urls.length;
48  if (cycle.timeout < cycle.delay / time_ratio && cycle.timeout > 0) {
49    cycle.timer = setTimeout(cycle_check_timeout, cycle.timeout, cycle);
50  } else {
51    cycle.timer = setTimeout(cycle_navigate, cycle.delay / time_ratio, cycle);
52  }
53}
54
55function cycle_check_timeout(cycle) {
56  if (cycle.id in cycle_tabs) {
57    cycle.failed_loads++;
58    cycle_navigate(cycle);
59  } else {
60    cycle.timer = setTimeout(cycle_navigate,
61                             cycle.delay / time_ratio - cycle.timeout,
62                             cycle);
63  }
64}
65
66function launch_task(task) {
67  if (task.type == 'window' && task.tabs) {
68    chrome.windows.create({'url': 'about:blank'}, function (win) {
69      close_preexisting_windows();
70      chrome.tabs.getSelected(win.id, function(tab) {
71        chrome.tabs.update(tab.id, {'url': task.tabs[0], 'selected': true});
72        for (var i = 1; i < task.tabs.length; i++) {
73          chrome.tabs.create({'windowId': win.id, url: task.tabs[i]});
74        }
75        setTimeout(chrome.windows.remove, task.duration / time_ratio, win.id);
76      });
77    });
78  } else if (task.type == 'cycle' && task.urls) {
79    chrome.windows.create({'url': 'about:blank'}, function (win) {
80      close_preexisting_windows();
81      chrome.tabs.getSelected(win.id, function(tab) {
82        var cycle = {
83           'timeout': task.timeout,
84           'name': task.name,
85           'delay': task.delay,
86           'urls': task.urls,
87           'id': tab.id,
88           'idx': 0,
89           'timer': null,
90           'focus': !!task.focus,
91           'successful_loads': 0,
92           'failed_loads': 0
93        };
94        cycles[task.name] = cycle;
95        cycle_navigate(cycle);
96        setTimeout(function(cycle, win_id) {
97          clearTimeout(cycle.timer);
98          chrome.windows.remove(win_id);
99        }, task.duration / time_ratio, cycle, win.id);
100      });
101    });
102  }
103}
104
105function send_status() {
106  var post = ["status=good"];
107
108  for (var name in cycles) {
109    var cycle = cycles[name];
110    post.push(name + "_successful_loads=" + cycle.successful_loads);
111    post.push(name + "_failed_loads=" + cycle.failed_loads);
112  }
113
114  chrome.runtime.onMessage.removeListener(testListener);
115
116  var log_url = 'http://localhost:8001/status';
117  var req = new XMLHttpRequest();
118  req.open('POST', log_url, true);
119  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
120  req.send(post.join("&"));
121  console.log(post.join("&"));
122}
123
124function startTest() {
125  time_ratio = 3600 * 1000 / test_time_ms; // default test time is 1 hour
126  chrome.runtime.onMessage.addListener(testListener);
127  setTimeout(setupTest, 1000);
128}
129
130function initialize() {
131  // Called when the user clicks on the browser action.
132  chrome.browserAction.onClicked.addListener(function(tab) {
133    // Start the test with default settings.
134    chrome.runtime.onMessage.addListener(testListener);
135    setTimeout(setupTest, 1000);
136  });
137}
138
139window.addEventListener("load", initialize);
140