• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2012 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.
4
5/**
6 * This view displays the progress and results from the "connection tester".
7 *
8 *   - Has an input box to specify the URL.
9 *   - Has a button to start running the tests.
10 *   - Shows the set of experiments that have been run so far, and their
11 *     result.
12 */
13var TestView = (function() {
14  'use strict';
15
16  // We inherit from DivView.
17  var superClass = DivView;
18
19  /**
20   * @constructor
21   */
22  function TestView() {
23    assertFirstConstructorCall(TestView);
24
25    // Call superclass's constructor.
26    superClass.call(this, TestView.MAIN_BOX_ID);
27
28    this.urlInput_ = $(TestView.URL_INPUT_ID);
29    this.summaryDiv_ = $(TestView.SUMMARY_DIV_ID);
30
31    var form = $(TestView.FORM_ID);
32    form.addEventListener('submit', this.onSubmitForm_.bind(this), false);
33
34    // Register to test information as it's received.
35    g_browser.addConnectionTestsObserver(this);
36  }
37
38  TestView.TAB_ID = 'tab-handle-tests';
39  TestView.TAB_NAME = 'Tests';
40  TestView.TAB_HASH = '#tests';
41
42  // IDs for special HTML elements in test_view.html
43  TestView.MAIN_BOX_ID = 'test-view-tab-content';
44  TestView.FORM_ID = 'test-view-connection-tests-form';
45  TestView.URL_INPUT_ID = 'test-view-url-input';
46  TestView.SUMMARY_DIV_ID = 'test-view-summary';
47  // Needed by tests.
48  TestView.SUBMIT_BUTTON_ID = 'test-view-connection-tests-submit';
49
50
51  cr.addSingletonGetter(TestView);
52
53  TestView.prototype = {
54    // Inherit the superclass's methods.
55    __proto__: superClass.prototype,
56
57    onSubmitForm_: function(event) {
58      g_browser.sendStartConnectionTests(this.urlInput_.value);
59      event.preventDefault();
60    },
61
62    /**
63     * Callback for when the connection tests have begun.
64     */
65    onStartedConnectionTestSuite: function() {
66      this.summaryDiv_.innerHTML = '';
67
68      var p = addNode(this.summaryDiv_, 'p');
69      addTextNode(p, 'Started connection test suite suite on ');
70      timeutil.addNodeWithDate(p, new Date());
71
72      // Add a table that will hold the individual test results.
73      var table = addNode(this.summaryDiv_, 'table');
74      table.className = 'styled-table';
75      var thead = addNode(table, 'thead');
76      thead.innerHTML = '<tr><th>Result</th><th>Experiment</th>' +
77                        '<th>Error</th><th>Time (ms)</th></tr>';
78
79      this.tbody_ = addNode(table, 'tbody');
80    },
81
82    /**
83     * Callback for when an individual test in the suite has begun.
84     */
85    onStartedConnectionTestExperiment: function(experiment) {
86      var tr = addNode(this.tbody_, 'tr');
87
88      var passFailCell = addNode(tr, 'td');
89
90      var experimentCell = addNode(tr, 'td');
91
92      var resultCell = addNode(tr, 'td');
93      addTextNode(resultCell, '?');
94
95      var dtCell = addNode(tr, 'td');
96      addTextNode(dtCell, '?');
97
98      // We will fill in result cells with actual values (to replace the
99      // placeholder '?') once the test has completed. For now we just
100      // save references to these cells.
101      this.currentExperimentRow_ = {
102        experimentCell: experimentCell,
103        dtCell: dtCell,
104        resultCell: resultCell,
105        passFailCell: passFailCell,
106        startTime: timeutil.getCurrentTime()
107      };
108
109      addTextNode(experimentCell, 'Fetch ' + experiment.url);
110
111      if (experiment.proxy_settings_experiment ||
112          experiment.host_resolver_experiment) {
113        var ul = addNode(experimentCell, 'ul');
114
115        if (experiment.proxy_settings_experiment) {
116          var li = addNode(ul, 'li');
117          addTextNode(li, experiment.proxy_settings_experiment);
118        }
119
120        if (experiment.host_resolver_experiment) {
121          var li = addNode(ul, 'li');
122          addTextNode(li, experiment.host_resolver_experiment);
123        }
124      }
125    },
126
127    /**
128     * Callback for when an individual test in the suite has finished.
129     */
130    onCompletedConnectionTestExperiment: function(experiment, result) {
131      var r = this.currentExperimentRow_;
132
133      var endTime = timeutil.getCurrentTime();
134
135      r.dtCell.innerHTML = '';
136      addTextNode(r.dtCell, (endTime - r.startTime));
137
138      r.resultCell.innerHTML = '';
139
140      if (result == 0) {
141        r.passFailCell.style.color = 'green';
142        addTextNode(r.passFailCell, 'PASS');
143      } else {
144        addTextNode(r.resultCell,
145                    netErrorToString(result) + ' (' + result + ')');
146        r.passFailCell.style.color = '#e00';
147        addTextNode(r.passFailCell, 'FAIL');
148      }
149
150      this.currentExperimentRow_ = null;
151    },
152
153    /**
154     * Callback for when the last test in the suite has finished.
155     */
156    onCompletedConnectionTestSuite: function() {
157      var p = addNode(this.summaryDiv_, 'p');
158      addTextNode(p, 'Completed connection test suite suite');
159    }
160  };
161
162  return TestView;
163})();
164