15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This class provides a "bridge" for communicating between the javascript and
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the browser.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var BrowserBridge = (function() {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'use strict';
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Delay in milliseconds between updates of certain browser information.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var POLL_INTERVAL_MS = 5000;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function BrowserBridge() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assertFirstConstructorCall(BrowserBridge);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // List of observers for various bits of browser state.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.connectionTestsObservers_ = [];
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.hstsObservers_ = [];
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.constantsObservers_ = [];
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.crosONCFileParseObservers_ = [];
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.storeDebugLogsObservers_ = [];
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.setNetworkDebugModeObservers_ = [];
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Unprocessed data received before the constants.  This serves to protect
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // against passing along data before having information on how to interpret
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // it.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.earlyReceivedData_ = [];
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_ = {};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.proxySettings =
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onProxySettingsChanged',
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetProxySettings.bind(this));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.badProxies =
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onBadProxiesChanged',
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetBadProxies.bind(this));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.httpCacheInfo =
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onHttpCacheInfoChanged',
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetHttpCacheInfo.bind(this));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.hostResolverInfo =
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onHostResolverInfoChanged',
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetHostResolverInfo.bind(this));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.socketPoolInfo =
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onSocketPoolInfoChanged',
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetSocketPoolInfo.bind(this));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.sessionNetworkStats =
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PollableDataHelper('onSessionNetworkStatsChanged',
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             this.sendGetSessionNetworkStats.bind(this));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.historicNetworkStats =
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PollableDataHelper('onHistoricNetworkStatsChanged',
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             this.sendGetHistoricNetworkStats.bind(this));
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.pollableDataHelpers_.quicInfo =
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new PollableDataHelper('onQuicInfoChanged',
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               this.sendGetQuicInfo.bind(this));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.spdySessionInfo =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onSpdySessionInfoChanged',
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetSpdySessionInfo.bind(this));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.spdyStatus =
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onSpdyStatusChanged',
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetSpdyStatus.bind(this));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.spdyAlternateProtocolMappings =
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onSpdyAlternateProtocolMappingsChanged',
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetSpdyAlternateProtocolMappings.bind(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   this));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cr.isWindows) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.serviceProviders =
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new PollableDataHelper('onServiceProvidersChanged',
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 this.sendGetServiceProviders.bind(this));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollableDataHelpers_.prerenderInfo =
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new PollableDataHelper('onPrerenderInfoChanged',
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               this.sendGetPrerenderInfo.bind(this));
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.pollableDataHelpers_.extensionInfo =
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new PollableDataHelper('onExtensionInfoChanged',
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               this.sendGetExtensionInfo.bind(this));
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (cr.isChromeOS) {
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      this.pollableDataHelpers_.systemLog =
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          new PollableDataHelper('onSystemLogChanged',
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               this.getSystemLog.bind(this, 'syslog'));
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setting this to true will cause messages from the browser to be ignored,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and no messages will be sent to the browser, either.  Intended for use
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when viewing log files.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.disabled_ = false;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Interval id returned by window.setInterval for polling timer.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.pollIntervalId_ = null;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cr.addSingletonGetter(BrowserBridge);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserBridge.prototype = {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //--------------------------------------------------------------------------
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Messages sent to the browser
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //--------------------------------------------------------------------------
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Wraps |chrome.send|.  Doesn't send anything when disabled.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    send: function(value1, value2) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!this.disabled_) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (arguments.length == 1) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome.send(value1);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (arguments.length == 2) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome.send(value1, value2);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          throw 'Unsupported number of arguments.';
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendReady: function() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('notifyReady');
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.setPollInterval(POLL_INTERVAL_MS);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Some of the data we are interested is not currently exposed as a
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * stream.  This starts polling those with active observers (visible
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * views) every |intervalMs|.  Subsequent calls override previous calls
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * to this function.  If |intervalMs| is 0, stops polling.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setPollInterval: function(intervalMs) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.pollIntervalId_ !== null) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window.clearInterval(this.pollIntervalId_);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.pollIntervalId_ = null;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (intervalMs > 0) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.pollIntervalId_ =
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            window.setInterval(this.checkForUpdatedInfo.bind(this, false),
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               intervalMs);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetProxySettings: function() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The browser will call receivedProxySettings on completion.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getProxySettings');
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendReloadProxySettings: function() {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('reloadProxySettings');
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetBadProxies: function() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The browser will call receivedBadProxies on completion.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getBadProxies');
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetHostResolverInfo: function() {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The browser will call receivedHostResolverInfo on completion.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getHostResolverInfo');
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendClearBadProxies: function() {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('clearBadProxies');
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendClearHostResolverCache: function() {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('clearHostResolverCache');
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendClearBrowserCache: function() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('clearBrowserCache');
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendClearAllCache: function() {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.sendClearHostResolverCache();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.sendClearBrowserCache();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendStartConnectionTests: function(url) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('startConnectionTests', [url]);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendHSTSQuery: function(domain) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('hstsQuery', [domain]);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    sendHSTSAdd: function(domain, sts_include_subdomains,
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          pkp_include_subdomains, pins) {
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      this.send('hstsAdd', [domain, sts_include_subdomains,
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            pkp_include_subdomains, pins]);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendHSTSDelete: function(domain) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('hstsDelete', [domain]);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetHttpCacheInfo: function() {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getHttpCacheInfo');
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetSocketPoolInfo: function() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getSocketPoolInfo');
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetSessionNetworkStats: function() {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getSessionNetworkStats');
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetHistoricNetworkStats: function() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getHistoricNetworkStats');
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendCloseIdleSockets: function() {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('closeIdleSockets');
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendFlushSocketPools: function() {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('flushSocketPools');
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sendGetQuicInfo: function() {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.send('getQuicInfo');
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetSpdySessionInfo: function() {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getSpdySessionInfo');
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetSpdyStatus: function() {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getSpdyStatus');
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetSpdyAlternateProtocolMappings: function() {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getSpdyAlternateProtocolMappings');
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetServiceProviders: function() {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getServiceProviders');
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendGetPrerenderInfo: function() {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getPrerenderInfo');
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sendGetExtensionInfo: function() {
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.send('getExtensionInfo');
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enableIPv6: function() {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('enableIPv6');
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setLogLevel: function(logLevel) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('setLogLevel', ['' + logLevel]);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    refreshSystemLogs: function() {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('refreshSystemLogs');
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getSystemLog: function(log_key, cellId) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('getSystemLog', [log_key, cellId]);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    importONCFile: function(fileContent, passcode) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('importONCFile', [fileContent, passcode]);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storeDebugLogs: function() {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('storeDebugLogs');
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setNetworkDebugMode: function(subsystem) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.send('setNetworkDebugMode', [subsystem]);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //--------------------------------------------------------------------------
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Messages received from the browser.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //--------------------------------------------------------------------------
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receive: function(command, params) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Does nothing if disabled.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.disabled_)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // If no constants have been received, and params does not contain the
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // constants, delay handling the data.
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (Constants == null && command != 'receivedConstants') {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.earlyReceivedData_.push({ command: command, params: params });
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this[command](params);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Handle any data that was received early in the order it was received,
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // once the constants have been processed.
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (this.earlyReceivedData_ != null) {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (var i = 0; i < this.earlyReceivedData_.length; i++) {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          var command = this.earlyReceivedData_[i];
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          this[command.command](command.params);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.earlyReceivedData_ = null;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedConstants: function(constants) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.constantsObservers_.length; i++)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.constantsObservers_[i].onReceivedConstants(constants);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedLogEntries: function(logEntries) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EventsTracker.getInstance().addLogEntries(logEntries);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedProxySettings: function(proxySettings) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.proxySettings.update(proxySettings);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedBadProxies: function(badProxies) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.badProxies.update(badProxies);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedHostResolverInfo: function(hostResolverInfo) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.hostResolverInfo.update(hostResolverInfo);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedSocketPoolInfo: function(socketPoolInfo) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.socketPoolInfo.update(socketPoolInfo);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedSessionNetworkStats: function(sessionNetworkStats) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.sessionNetworkStats.update(sessionNetworkStats);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedHistoricNetworkStats: function(historicNetworkStats) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.historicNetworkStats.update(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          historicNetworkStats);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    receivedQuicInfo: function(quicInfo) {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.pollableDataHelpers_.quicInfo.update(quicInfo);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedSpdySessionInfo: function(spdySessionInfo) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.spdySessionInfo.update(spdySessionInfo);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedSpdyStatus: function(spdyStatus) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.spdyStatus.update(spdyStatus);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedSpdyAlternateProtocolMappings:
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        function(spdyAlternateProtocolMappings) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.spdyAlternateProtocolMappings.update(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          spdyAlternateProtocolMappings);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedServiceProviders: function(serviceProviders) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.serviceProviders.update(serviceProviders);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedStartConnectionTestSuite: function() {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.connectionTestsObservers_.length; i++)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.connectionTestsObservers_[i].onStartedConnectionTestSuite();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedStartConnectionTestExperiment: function(experiment) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.connectionTestsObservers_.length; i++) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.connectionTestsObservers_[i].onStartedConnectionTestExperiment(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            experiment);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedCompletedConnectionTestExperiment: function(info) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.connectionTestsObservers_.length; i++) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.connectionTestsObservers_[i].onCompletedConnectionTestExperiment(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info.experiment, info.result);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedCompletedConnectionTestSuite: function() {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.connectionTestsObservers_.length; i++)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.connectionTestsObservers_[i].onCompletedConnectionTestSuite();
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedHSTSResult: function(info) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.hstsObservers_.length; i++)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.hstsObservers_[i].onHSTSQueryResult(info);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedONCFileParse: function(error) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.crosONCFileParseObservers_.length; i++)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.crosONCFileParseObservers_[i].onONCFileParse(error);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedStoreDebugLogs: function(status) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.storeDebugLogsObservers_.length; i++)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.storeDebugLogsObservers_[i].onStoreDebugLogs(status);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedSetNetworkDebugMode: function(status) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.setNetworkDebugModeObservers_.length; i++)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.setNetworkDebugModeObservers_[i].onSetNetworkDebugMode(status);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedHttpCacheInfo: function(info) {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.httpCacheInfo.update(info);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    receivedPrerenderInfo: function(prerenderInfo) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.prerenderInfo.update(prerenderInfo);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    receivedExtensionInfo: function(extensionInfo) {
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.pollableDataHelpers_.extensionInfo.update(extensionInfo);
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    getSystemLogCallback: function(systemLog) {
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      this.pollableDataHelpers_.systemLog.update(systemLog);
4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    },
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //--------------------------------------------------------------------------
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Prevents receiving/sending events to/from the browser.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disable: function() {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.disabled_ = true;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.setPollInterval(0);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns true if the BrowserBridge has been disabled.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isDisabled: function() {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.disabled_;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the proxy settings. |observer| will be called back
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * when data is received, through:
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onProxySettingsChanged(proxySettings)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * |proxySettings| is a dictionary with (up to) two properties:
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   "original"  -- The settings that chrome was configured to use
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                  (i.e. system settings.)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   "effective" -- The "effective" proxy settings that chrome is using.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                  (decides between the manual/automatic modes of the
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                  fetched settings).
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Each of these two configurations is formatted as a string, and may be
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * omitted if not yet initialized.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If |ignoreWhenUnchanged| is true, data is only sent when it changes.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If it's false, data is sent whenever it's received from the browser.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addProxySettingsObserver: function(observer, ignoreWhenUnchanged) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.proxySettings.addObserver(observer,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          ignoreWhenUnchanged);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the proxy settings. |observer| will be called back
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * when data is received, through:
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onBadProxiesChanged(badProxies)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * |badProxies| is an array, where each entry has the property:
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   badProxies[i].proxy_uri: String identify the proxy.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   badProxies[i].bad_until: The time when the proxy stops being considered
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                            bad. Note the time is in time ticks.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addBadProxiesObserver: function(observer, ignoreWhenUnchanged) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.badProxies.addObserver(observer,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       ignoreWhenUnchanged);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the host resolver info. |observer| will be called back
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * when data is received, through:
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onHostResolverInfoChanged(hostResolverInfo)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addHostResolverInfoObserver: function(observer, ignoreWhenUnchanged) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.hostResolverInfo.addObserver(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observer, ignoreWhenUnchanged);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the socket pool. |observer| will be called back
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * when data is received, through:
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onSocketPoolInfoChanged(socketPoolInfo)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addSocketPoolInfoObserver: function(observer, ignoreWhenUnchanged) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.socketPoolInfo.addObserver(observer,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           ignoreWhenUnchanged);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the network session. |observer| will be called back
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * when data is received, through:
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onSessionNetworkStatsChanged(sessionNetworkStats)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addSessionNetworkStatsObserver: function(observer, ignoreWhenUnchanged) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.sessionNetworkStats.addObserver(
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observer, ignoreWhenUnchanged);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of persistent network session data. |observer| will be
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * called back when data is received, through:
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onHistoricNetworkStatsChanged(historicNetworkStats)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addHistoricNetworkStatsObserver: function(observer, ignoreWhenUnchanged) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.historicNetworkStats.addObserver(
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observer, ignoreWhenUnchanged);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Adds a listener of the QUIC info. |observer| will be called back
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * when data is received, through:
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *   observer.onQuicInfoChanged(quicInfo)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    addQuicInfoObserver: function(observer, ignoreWhenUnchanged) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.pollableDataHelpers_.quicInfo.addObserver(
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          observer, ignoreWhenUnchanged);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the SPDY info. |observer| will be called back
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * when data is received, through:
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onSpdySessionInfoChanged(spdySessionInfo)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addSpdySessionInfoObserver: function(observer, ignoreWhenUnchanged) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.spdySessionInfo.addObserver(
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observer, ignoreWhenUnchanged);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the SPDY status. |observer| will be called back
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * when data is received, through:
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onSpdyStatusChanged(spdyStatus)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addSpdyStatusObserver: function(observer, ignoreWhenUnchanged) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.spdyStatus.addObserver(observer,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       ignoreWhenUnchanged);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the AlternateProtocolMappings. |observer| will be
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * called back when data is received, through:
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onSpdyAlternateProtocolMappingsChanged(
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *       spdyAlternateProtocolMappings)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addSpdyAlternateProtocolMappingsObserver: function(observer,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       ignoreWhenUnchanged) {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.spdyAlternateProtocolMappings.addObserver(
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observer, ignoreWhenUnchanged);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener of the service providers info. |observer| will be called
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * back when data is received, through:
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onServiceProvidersChanged(serviceProviders)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Will do nothing if on a platform other than Windows, as service providers
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * are only present on Windows.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addServiceProvidersObserver: function(observer, ignoreWhenUnchanged) {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.pollableDataHelpers_.serviceProviders) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.pollableDataHelpers_.serviceProviders.addObserver(
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            observer, ignoreWhenUnchanged);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for the progress of the connection tests.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The observer will be called back with:
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onStartedConnectionTestSuite();
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onStartedConnectionTestExperiment(experiment);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onCompletedConnectionTestExperiment(experiment, result);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onCompletedConnectionTestSuite();
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addConnectionTestsObserver: function(observer) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.connectionTestsObservers_.push(observer);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for the http cache info results.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The observer will be called back with:
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onHttpCacheInfoChanged(info);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addHttpCacheInfoObserver: function(observer, ignoreWhenUnchanged) {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.httpCacheInfo.addObserver(
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observer, ignoreWhenUnchanged);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for the results of HSTS (HTTPS Strict Transport Security)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * queries. The observer will be called back with:
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onHSTSQueryResult(result);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addHSTSObserver: function(observer) {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.hstsObservers_.push(observer);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for ONC file parse status. The observer will be called
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * back with:
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onONCFileParse(error);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addCrosONCFileParseObserver: function(observer) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.crosONCFileParseObservers_.push(observer);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for storing log file status. The observer will be called
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * back with:
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onStoreDebugLogs(status);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addStoreDebugLogsObserver: function(observer) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.storeDebugLogsObservers_.push(observer);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for network debugging mode status. The observer
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * will be called back with:
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onSetNetworkDebugMode(status);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addSetNetworkDebugModeObserver: function(observer) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.setNetworkDebugModeObservers_.push(observer);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for the received constants event. |observer| will be
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * called back when the constants are received, through:
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onReceivedConstants(constants);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addConstantsObserver: function(observer) {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.constantsObservers_.push(observer);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Adds a listener for updated prerender info events
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * |observer| will be called back with:
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   observer.onPrerenderInfoChanged(prerenderInfo);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addPrerenderInfoObserver: function(observer, ignoreWhenUnchanged) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.pollableDataHelpers_.prerenderInfo.addObserver(
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observer, ignoreWhenUnchanged);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Adds a listener of extension information. |observer| will be called
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * back when data is received, through:
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *   observer.onExtensionInfoChanged(extensionInfo)
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    addExtensionInfoObserver: function(observer, ignoreWhenUnchanged) {
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.pollableDataHelpers_.extensionInfo.addObserver(
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          observer, ignoreWhenUnchanged);
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    },
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
6837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * Adds a listener of system log information. |observer| will be called
6847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     * back when data is received, through:
6857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     *
6867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     *   observer.onSystemLogChanged(systemLogInfo)
6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     */
6887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    addSystemLogObserver: function(observer, ignoreWhenUnchanged) {
689eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (this.pollableDataHelpers_.systemLog) {
690eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this.pollableDataHelpers_.systemLog.addObserver(
691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            observer, ignoreWhenUnchanged);
692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    },
6947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    /**
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If |force| is true, calls all startUpdate functions.  Otherwise, just
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * runs updates with active observers.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkForUpdatedInfo: function(force) {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var name in this.pollableDataHelpers_) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var helper = this.pollableDataHelpers_[name];
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (force || helper.hasActiveObserver())
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          helper.startUpdate();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Calls all startUpdate functions and, if |callback| is non-null,
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * calls it with the results of all updates.
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateAllInfo: function(callback) {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (callback)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new UpdateAllObserver(callback, this.pollableDataHelpers_);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.checkForUpdatedInfo(true);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * This is a helper class used by BrowserBridge, to keep track of:
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   - the list of observers interested in some piece of data.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   - the last known value of that piece of data.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   - the name of the callback method to invoke on observers.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   - the update function.
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function PollableDataHelper(observerMethodName, startUpdateFunction) {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.observerMethodName_ = observerMethodName;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.startUpdate = startUpdateFunction;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.observerInfos_ = [];
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PollableDataHelper.prototype = {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getObserverMethodName: function() {
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.observerMethodName_;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isObserver: function(object) {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.observerInfos_.length; i++) {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (this.observerInfos_[i].observer === object)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return true;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If |ignoreWhenUnchanged| is true, we won't send data again until it
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * changes.
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addObserver: function(observer, ignoreWhenUnchanged) {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.observerInfos_.push(new ObserverInfo(observer, ignoreWhenUnchanged));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    removeObserver: function(observer) {
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.observerInfos_.length; i++) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (this.observerInfos_[i].observer === observer) {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.observerInfos_.splice(i, 1);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Helper function to handle calling all the observers, but ONLY if the data
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * has actually changed since last time or the observer has yet to receive
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * any data. This is used for data we received from browser on an update
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * loop.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update: function(data) {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var prevData = this.currentData_;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var changed = false;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If the data hasn't changed since last time, will only need to notify
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // observers that have not yet received any data.
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!prevData || JSON.stringify(prevData) != JSON.stringify(data)) {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changed = true;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.currentData_ = data;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Notify the observers of the change, as needed.
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.observerInfos_.length; i++) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var observerInfo = this.observerInfos_[i];
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (changed || !observerInfo.hasReceivedData ||
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            !observerInfo.ignoreWhenUnchanged) {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observerInfo.observer[this.observerMethodName_](this.currentData_);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          observerInfo.hasReceivedData = true;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns true if one of the observers actively wants the data
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * (i.e. is visible).
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hasActiveObserver: function() {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < this.observerInfos_.length; i++) {
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (this.observerInfos_[i].observer.isActive())
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return true;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * This is a helper class used by PollableDataHelper, to keep track of
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * each observer and whether or not it has received any data.  The
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * latter is used to make sure that new observers get sent data on the
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * update following their creation.
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function ObserverInfo(observer, ignoreWhenUnchanged) {
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.observer = observer;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.hasReceivedData = false;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.ignoreWhenUnchanged = ignoreWhenUnchanged;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * This is a helper class used by BrowserBridge to send data to
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * a callback once data from all polls has been received.
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * It works by keeping track of how many polling functions have
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * yet to receive data, and recording the data as it it received.
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function UpdateAllObserver(callback, pollableDataHelpers) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.callback_ = callback;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.observingCount_ = 0;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.updatedData_ = {};
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var name in pollableDataHelpers) {
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++this.observingCount_;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var helper = pollableDataHelpers[name];
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      helper.addObserver(this);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this[helper.getObserverMethodName()] =
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this.onDataReceived_.bind(this, helper, name);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAllObserver.prototype = {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isActive: function() {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    onDataReceived_: function(helper, name, data) {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      helper.removeObserver(this);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      --this.observingCount_;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.updatedData_[name] = data;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.observingCount_ == 0)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.callback_(this.updatedData_);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowserBridge;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
855