summaryrefslogtreecommitdiffstats
path: root/tools/chrome_proxy/integration_tests/chrome_proxy_metrics.js
blob: 63fc81fcaf2022f577b01ab213bc1a78b43fb5da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2014 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.

// This file contains common utilities to find chrome proxy related elements on
// a page and collect info from them.

(function() {
  var PROXY_VIEW_ID = 'proxy-view-tab-content';
  var PROXY_VIEW_EFFECTIVE_SETTINGS_ID = 'proxy-view-effective-settings';
  var PROXY_VIEW_BAD_PROXIES_ID = 'proxy-view-bad-proxies-div';
  var PROXY_VIEW_BAD_PROXIES_TBODY = 'proxy-view-bad-proxies-tbody';
  var PRXOY_SETTINGS_PREFIX = 'Proxy server for HTTP: ['
  var PROXY_SETTINGS_SIGNATURE = 'proxy.googlezip.net:443, ' +
    'compress.googlezip.net:80, direct://';

  // Returns the effective proxy in an array from settings.
  // An example of the settings is:
  // "Proxy server for HTTP: [proxy.googlezip.net:443, " +
  // "compress.googlezip.net:80, direct://]"
  function getEffectiveProxies(doc) {
    var settings = doc.getElementById(PROXY_VIEW_EFFECTIVE_SETTINGS_ID);
    if (settings && settings.innerHTML &&
      settings.innerHTML.indexOf(PRXOY_SETTINGS_PREFIX) == 0) {
      var left = settings.innerHTML.indexOf('[');
      var right = settings.innerHTML.indexOf(']');
      if (left >= 0 && right > left) {
        return settings.innerHTML.substring(left + 1, right).split(/[ ,]+/);
      }
    }
    return [];
  }

  // Returns an array of bad proxies. Each element is a bad proxy with
  // attribute 'proxy' as the proxy name and attribute 'retry' as the
  // next retry time.
  function getBadProxyList(doc) {
    var bad_proxies = doc.getElementById(PROXY_VIEW_BAD_PROXIES_ID);
    if (bad_proxies.hasAttribute('style') &&
        ('cssText' in bad_proxies.style) &&
        bad_proxies.style.cssText == 'display: none;') {
          return null;
        }
    var tbody = doc.getElementById(PROXY_VIEW_BAD_PROXIES_TBODY);
    results = [];
    for (var r = 0, n = tbody.rows.length; r < n; r++) {
      results[r] = {};
      results[r].proxy = tbody.rows[r].cells[0].innerHTML;
      timeSpan = tbody.rows[r].cells[1].getElementsByTagName('span')[0];
      if (timeSpan.hasAttribute('title') && timeSpan.title.indexOf('t=') == 0) {
        results[r].retry = timeSpan.title.substr(2);
      } else {
        results[r].retry = '-1';
      }
    }
    return results;
  }

  function getChromeProxyInfo() {
    if (!document.getElementById(PROXY_VIEW_ID)) {
      return null;
    }
    info = {};
    info.proxies = getEffectiveProxies(document);
    info.enabled = (info.proxies.length > 1 &&
        info.proxies[info.proxies.length - 1] == 'direct://' &&
        info.proxies[info.proxies.length - 2] != 'direct://');
    info.badProxies = getBadProxyList(document);
    return info;
  };
  window.__getChromeProxyInfo = getChromeProxyInfo;
})();