1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Dictionary of constants (initialized by browser).
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvar LogEventType = null;
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvar LogEventPhase = null;
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvar ClientInfo = null;
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvar LogSourceType = null;
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvar LogLevelType = null;
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvar NetError = null;
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvar LoadFlag = null;
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvar AddressFamily = null;
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Object to communicate between the renderer and the browser.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @type {!BrowserBridge}
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvar g_browser = null;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Main entry point. called once the page has loaded.
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction onLoaded() {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_browser = new BrowserBridge();
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create the view which displays events lists, and lets you select, filter
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and delete them.
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  var eventsView = new EventsView('eventsListTableBody',
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'filterInput',
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'filterCount',
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'deleteSelected',
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'deleteAll',
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'selectAll',
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'sortById',
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'sortBySource',
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  'sortByDescription',
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  // IDs for the details view.
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'detailsTabHandles',
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'detailsLogTab',
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'detailsTimelineTab',
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'detailsLogBox',
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'detailsTimelineBox',
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  // IDs for the layout boxes.
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'filterBox',
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'eventsBox',
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'actionBox',
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                  'splitterBox');
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a view which will display info on the proxy setup.
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var proxyView = new ProxyView('proxyTabContent',
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                'proxyOriginalSettings',
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                'proxyEffectiveSettings',
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                'proxyReloadSettings',
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                'badProxiesTableBody',
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                'clearBadProxies',
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                'proxyResolverLog');
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a view which will display information on the host resolver.
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var dnsView = new DnsView('dnsTabContent',
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'hostResolverCacheTbody',
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'clearHostResolverCache',
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'hostResolverDefaultFamily',
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'hostResolverIPv6Disabled',
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'hostResolverEnableIPv6',
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'hostResolverCacheCapacity',
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'hostResolverCacheTTLSuccess',
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            'hostResolverCacheTTLFailure');
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a view which will display import/export options to control the
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // captured data.
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var dataView = new DataView('dataTabContent', 'exportedDataText',
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              'exportToText', 'securityStrippingCheckbox',
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'byteLoggingCheckbox', 'passivelyCapturedCount',
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'activelyCapturedCount', 'dataViewDeleteAll',
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'dataViewDumpDataDiv', 'dataViewLoadDataDiv',
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'dataViewLoadLogFile',
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'dataViewCapturingTextSpan',
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'dataViewLoggingTextSpan');
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a view which will display the results and controls for connection
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tests.
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var testView = new TestView('testTabContent', 'testUrlInput',
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              'connectionTestsForm', 'testSummary');
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Create a view which allows the user to query and alter the HSTS database.
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  var hstsView = new HSTSView('hstsTabContent',
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              'hstsQueryInput', 'hstsQueryForm',
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              'hstsQueryOutput',
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              'hstsAddInput', 'hstsAddForm', 'hstsCheckInput',
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              'hstsAddPins',
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              'hstsDeleteInput', 'hstsDeleteForm');
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var httpCacheView = new HttpCacheView('httpCacheTabContent',
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        'httpCacheStats');
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var socketsView = new SocketsView('socketsTabContent',
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                    'socketPoolDiv',
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    'socketPoolGroupsDiv',
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    'socketPoolCloseIdleButton',
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    'socketPoolFlushButton');
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var spdyView = new SpdyView('spdyTabContent',
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'spdyEnabledSpan',
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'spdyUseAlternateProtocolSpan',
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'spdyForceAlwaysSpan',
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'spdyForceOverSslSpan',
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'spdyNextProtocolsSpan',
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              'spdyAlternateProtocolMappingsDiv',
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              'spdySessionNoneSpan',
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              'spdySessionLinkSpan',
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              'spdySessionDiv');
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  var serviceView;
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (g_browser.isPlatformWindows()) {
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    serviceView = new ServiceProvidersView('serviceProvidersTab',
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           'serviceProvidersTabContent',
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           'serviceProvidersTbody',
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           'namespaceProvidersTbody');
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var httpThrottlingView = new HttpThrottlingView(
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      'httpThrottlingTabContent', 'enableHttpThrottlingCheckbox');
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a view which lets you tab between the different sub-views.
13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  var categoryTabSwitcher = new TabSwitcherView('categoryTabHandles');
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  g_browser.setTabSwitcher(categoryTabSwitcher);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Populate the main tabs.
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  categoryTabSwitcher.addTab('eventsTab', eventsView, false);
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  categoryTabSwitcher.addTab('proxyTab', proxyView, false);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  categoryTabSwitcher.addTab('dnsTab', dnsView, false);
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  categoryTabSwitcher.addTab('socketsTab', socketsView, false);
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  categoryTabSwitcher.addTab('spdyTab', spdyView, false);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  categoryTabSwitcher.addTab('httpCacheTab', httpCacheView, false);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  categoryTabSwitcher.addTab('dataTab', dataView, false);
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (g_browser.isPlatformWindows())
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    categoryTabSwitcher.addTab('serviceProvidersTab', serviceView, false);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  categoryTabSwitcher.addTab('testTab', testView, false);
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  categoryTabSwitcher.addTab('hstsTab', hstsView, false);
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  categoryTabSwitcher.addTab('httpThrottlingTab', httpThrottlingView, false);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Build a map from the anchor name of each tab handle to its "tab ID".
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We will consider navigations to the #hash as a switch tab request.
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var anchorMap = {};
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var tabIds = categoryTabSwitcher.getAllTabIds();
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (var i = 0; i < tabIds.length; ++i) {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    var aNode = document.getElementById(tabIds[i]);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    anchorMap[aNode.hash] = tabIds[i];
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Default the empty hash to the data tab.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  anchorMap['#'] = anchorMap[''] = 'dataTab';
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  window.onhashchange = onUrlHashChange.bind(null, anchorMap,
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                             categoryTabSwitcher);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make this category tab widget the primary view, that fills the whole page.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var windowView = new WindowView(categoryTabSwitcher);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Trigger initial layout.
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  windowView.resetGeometry();
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Select the initial view based on the current URL.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window.onhashchange();
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Inform observers a log file is not currently being displayed.
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  g_browser.setIsViewingLogFile_(false);
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tell the browser that we are ready to start receiving log events.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_browser.sendReady();
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * This class provides a "bridge" for communicating between the javascript and
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * the browser.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @constructor
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction BrowserBridge() {
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // List of observers for various bits of browser state.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.logObservers_ = [];
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.connectionTestsObservers_ = [];
187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.hstsObservers_ = [];
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  this.httpThrottlingObservers_ = [];
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_ = {};
191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.proxySettings =
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new PollableDataHelper('onProxySettingsChanged',
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             this.sendGetProxySettings.bind(this));
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.badProxies =
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new PollableDataHelper('onBadProxiesChanged',
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             this.sendGetBadProxies.bind(this));
197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.httpCacheInfo =
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new PollableDataHelper('onHttpCacheInfoChanged',
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             this.sendGetHttpCacheInfo.bind(this));
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.hostResolverInfo =
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new PollableDataHelper('onHostResolverInfoChanged',
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             this.sendGetHostResolverInfo.bind(this));
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.socketPoolInfo =
204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new PollableDataHelper('onSocketPoolInfoChanged',
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             this.sendGetSocketPoolInfo.bind(this));
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.spdySessionInfo =
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new PollableDataHelper('onSpdySessionInfoChanged',
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             this.sendGetSpdySessionInfo.bind(this));
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.pollableDataHelpers_.spdyStatus =
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new PollableDataHelper('onSpdyStatusChanged',
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             this.sendGetSpdyStatus.bind(this));
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.pollableDataHelpers_.spdyAlternateProtocolMappings =
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new PollableDataHelper('onSpdyAlternateProtocolMappingsChanged',
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             this.sendGetSpdyAlternateProtocolMappings.bind(
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 this));
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (this.isPlatformWindows()) {
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    this.pollableDataHelpers_.serviceProviders =
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        new PollableDataHelper('onServiceProvidersChanged',
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                               this.sendGetServiceProviders.bind(this));
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cache of the data received.
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  this.numPassivelyCapturedEvents_ = 0;
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  this.capturedEvents_ = [];
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Next unique id to be assigned to a log entry without a source.
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Needed to simplify deletion, identify associated GUI elements, etc.
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  this.nextSourcelessEventId_ = -1;
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // True when viewing a log file rather than actively logged events.
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // When viewing a log file, all tabs are hidden except the event view,
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // and all received events are ignored.
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.isViewingLogFile_ = false;
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // True when cookies and authentication information should be removed from
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // displayed events.  When true, such information should be hidden from
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // all pages.
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  this.enableSecurityStripping_ = true;
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/*
242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Takes the current hash in form of "#tab&param1=value1&param2=value2&...".
243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Puts the parameters in an object, and passes the resulting object to
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * |categoryTabSwitcher|.  Uses tab and |anchorMap| to find a tab ID,
245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * which it also passes to the tab switcher.
246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Parameters and values are decoded with decodeURIComponent().
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick */
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickfunction onUrlHashChange(anchorMap, categoryTabSwitcher) {
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var parameters = window.location.hash.split('&');
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var tabId = anchorMap[parameters[0]];
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!tabId)
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Split each string except the first around the '='.
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var paramDict = null;
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (var i = 1; i < parameters.length; i++) {
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    var paramStrings = parameters[i].split('=');
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (paramStrings.length != 2)
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      continue;
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (paramDict == null)
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      paramDict = {};
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    var key = decodeURIComponent(paramStrings[0]);
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    var value = decodeURIComponent(paramStrings[1]);
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    paramDict[key] = value;
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  categoryTabSwitcher.switchToTab(tabId, paramDict);
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Delay in milliseconds between updates of certain browser information.
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.POLL_INTERVAL_MS = 5000;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Messages sent to the browser
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendReady = function() {
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('notifyReady');
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Some of the data we are interested is not currently exposed as a stream,
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // so we will poll the browser to find out when it changes and then notify
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the observers.
287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  window.setInterval(this.checkForUpdatedInfo.bind(this, false),
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                     BrowserBridge.POLL_INTERVAL_MS);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.isPlatformWindows = function() {
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return /Win/.test(navigator.platform);
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendGetProxySettings = function() {
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The browser will call receivedProxySettings on completion.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('getProxySettings');
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendReloadProxySettings = function() {
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('reloadProxySettings');
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendGetBadProxies = function() {
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The browser will call receivedBadProxies on completion.
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('getBadProxies');
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.sendGetHostResolverInfo = function() {
310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The browser will call receivedHostResolverInfo on completion.
311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  chrome.send('getHostResolverInfo');
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendClearBadProxies = function() {
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('clearBadProxies');
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendClearHostResolverCache = function() {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('clearHostResolverCache');
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendStartConnectionTests = function(url) {
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('startConnectionTests', [url]);
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
326dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBrowserBridge.prototype.sendHSTSQuery = function(domain) {
327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.send('hstsQuery', [domain]);
328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.sendHSTSAdd = function(domain,
331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               include_subdomains,
332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               pins) {
333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.send('hstsAdd', [domain, include_subdomains, pins]);
334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
336dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBrowserBridge.prototype.sendHSTSDelete = function(domain) {
337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.send('hstsDelete', [domain]);
338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.sendGetHttpCacheInfo = function() {
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chrome.send('getHttpCacheInfo');
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.sendGetSocketPoolInfo = function() {
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chrome.send('getSocketPoolInfo');
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.sendCloseIdleSockets = function() {
349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.send('closeIdleSockets');
350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.sendFlushSocketPools = function() {
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.send('flushSocketPools');
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
356731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.sendGetSpdySessionInfo = function() {
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  chrome.send('getSpdySessionInfo');
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.sendGetSpdyStatus = function() {
36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  chrome.send('getSpdyStatus');
36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.sendGetSpdyAlternateProtocolMappings = function() {
36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  chrome.send('getSpdyAlternateProtocolMappings');
36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.sendGetServiceProviders = function() {
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  chrome.send('getServiceProviders');
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
372731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.enableIPv6 = function() {
373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  chrome.send('enableIPv6');
374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
376731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.setLogLevel = function(logLevel) {
377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  chrome.send('setLogLevel', ['' + logLevel]);
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.enableHttpThrottling = function(enable) {
381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.send('enableHttpThrottling', [enable]);
382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.loadLogFile = function() {
38572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  chrome.send('loadLogFile');
38672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
38772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Messages received from the browser
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3923f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenBrowserBridge.prototype.receivedLogEntries = function(logEntries) {
39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Does nothing if viewing a log file.
39472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (this.isViewingLogFile_)
39572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
39672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.addLogEntries(logEntries);
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedLogEventTypeConstants = function(constantsMap) {
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LogEventType = constantsMap;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedClientInfo =
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction(info) {
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClientInfo = info;
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedLogEventPhaseConstants =
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction(constantsMap) {
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LogEventPhase = constantsMap;
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedLogSourceTypeConstants =
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction(constantsMap) {
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LogSourceType = constantsMap;
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.receivedLogLevelConstants =
419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickfunction(constantsMap) {
420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  LogLevelType = constantsMap;
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedLoadFlagConstants = function(constantsMap) {
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadFlag = constantsMap;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedNetErrorConstants = function(constantsMap) {
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetError = constantsMap;
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.receivedAddressFamilyConstants =
432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickfunction(constantsMap) {
433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddressFamily = constantsMap;
434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedTimeTickOffset = function(timeTickOffset) {
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.timeTickOffset_ = timeTickOffset;
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedProxySettings = function(proxySettings) {
441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.proxySettings.update(proxySettings);
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedBadProxies = function(badProxies) {
445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.badProxies.update(badProxies);
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
448731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.receivedHostResolverInfo =
449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickfunction(hostResolverInfo) {
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.hostResolverInfo.update(hostResolverInfo);
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.receivedSocketPoolInfo = function(socketPoolInfo) {
454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.socketPoolInfo.update(socketPoolInfo);
455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
457731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.receivedSpdySessionInfo = function(spdySessionInfo) {
458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.spdySessionInfo.update(spdySessionInfo);
4593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.receivedSpdyStatus = function(spdyStatus) {
46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.pollableDataHelpers_.spdyStatus.update(spdyStatus);
46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.receivedSpdyAlternateProtocolMappings =
46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    function(spdyAlternateProtocolMappings) {
46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.pollableDataHelpers_.spdyAlternateProtocolMappings.update(
46872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      spdyAlternateProtocolMappings);
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.receivedServiceProviders = function(serviceProviders) {
472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.serviceProviders.update(serviceProviders);
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedPassiveLogEntries = function(entries) {
47621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Due to an expected race condition, it is possible to receive actively
47721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // captured log entries before the passively logged entries are received.
47821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  //
47921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // When that happens, we create a copy of the actively logged entries, delete
48021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // all entries, and, after handling all the passively logged entries, add back
48121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // the deleted actively logged entries.
48221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  var earlyActivelyCapturedEvents = this.capturedEvents_.slice(0);
48321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (earlyActivelyCapturedEvents.length > 0)
48421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    this.deleteAllEvents();
48521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
48621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  this.numPassivelyCapturedEvents_ = entries.length;
4873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  for (var i = 0; i < entries.length; ++i)
4883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    entries[i].wasPassivelyCaptured = true;
4893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  this.receivedLogEntries(entries);
49021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
49121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Add back early actively captured events, if any.
4923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (earlyActivelyCapturedEvents.length)
4933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    this.receivedLogEntries(earlyActivelyCapturedEvents);
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedStartConnectionTestSuite = function() {
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (var i = 0; i < this.connectionTestsObservers_.length; ++i)
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    this.connectionTestsObservers_[i].onStartedConnectionTestSuite();
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedStartConnectionTestExperiment = function(
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    experiment) {
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (var i = 0; i < this.connectionTestsObservers_.length; ++i) {
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    this.connectionTestsObservers_[i].onStartedConnectionTestExperiment(
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        experiment);
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedCompletedConnectionTestExperiment =
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction(info) {
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (var i = 0; i < this.connectionTestsObservers_.length; ++i) {
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    this.connectionTestsObservers_[i].onCompletedConnectionTestExperiment(
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        info.experiment, info.result);
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedCompletedConnectionTestSuite = function() {
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (var i = 0; i < this.connectionTestsObservers_.length; ++i)
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    this.connectionTestsObservers_[i].onCompletedConnectionTestSuite();
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
523dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBrowserBridge.prototype.receivedHSTSResult = function(info) {
524dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (var i = 0; i < this.hstsObservers_.length; ++i)
525dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    this.hstsObservers_[i].onHSTSQueryResult(info);
526dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
527dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.receivedHttpCacheInfo = function(info) {
529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.httpCacheInfo.update(info);
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.receivedHttpThrottlingEnabledPrefChanged = function(
533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    enabled) {
534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (var i = 0; i < this.httpThrottlingObservers_.length; ++i) {
535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    this.httpThrottlingObservers_[i].onHttpThrottlingEnabledPrefChanged(
536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        enabled);
537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.loadedLogFile = function(logFileContents) {
54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var match;
54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Replace carriage returns with linebreaks and then split around linebreaks.
54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var lines = logFileContents.replace(/\r/g, '\n').split('\n');
54472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var entries = [];
54572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var numInvalidLines = 0;
54672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (var i = 0; i < lines.length; ++i) {
54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (lines[i].trim().length == 0)
54972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      continue;
55072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Parse all valid lines, skipping any others.
55172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    try {
55272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      var entry = JSON.parse(lines[i]);
55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (entry &&
55472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          typeof(entry) == 'object' &&
55572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          entry.phase != undefined &&
55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          entry.source != undefined &&
55772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          entry.time != undefined &&
55872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          entry.type != undefined) {
55972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        entries.push(entry);
56072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        continue;
56172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
56272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } catch (err) {
56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
56472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ++numInvalidLines;
56572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    console.log('Unable to parse log line: ' + lines[i]);
56672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
56772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
56872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (entries.length == 0) {
56972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    window.alert('Loading log file failed.');
57072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
57172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
57272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
57372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.deleteAllEvents();
57472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
57572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.setIsViewingLogFile_(true);
57672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
57772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var validEntries = [];
57872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (var i = 0; i < entries.length; ++i) {
57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entries[i].wasPassivelyCaptured = true;
58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (LogEventType[entries[i].type] != undefined &&
58172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        LogSourceType[entries[i].source.type] != undefined &&
58272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        LogEventPhase[entries[i].phase] != undefined) {
58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      entries[i].type = LogEventType[entries[i].type];
58472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      entries[i].source.type = LogSourceType[entries[i].source.type];
58572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      entries[i].phase = LogEventPhase[entries[i].phase];
58672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      validEntries.push(entries[i]);
58772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else {
58872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // TODO(mmenke):  Do something reasonable when the event type isn't
58972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      //                found, which could happen when event types are
59072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      //                removed or added between versions.  Could also happen
59172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      //                with source types, but less likely.
59272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      console.log(
59372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        'Unrecognized values in log entry: ' + JSON.stringify(entry));
59472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
59572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
59672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
59772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.numPassivelyCapturedEvents_ = validEntries.length;
59872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.addLogEntries(validEntries);
59972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
60072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var numInvalidEntries = entries.length - validEntries.length;
60172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (numInvalidEntries > 0 || numInvalidLines > 0) {
60272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    window.alert(
60372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      numInvalidLines.toString() +
60472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ' could not be parsed as JSON strings, and ' +
60572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      numInvalidEntries.toString() +
60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ' entries don\'t have valid data.\n\n' +
60772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      'Unparseable lines may indicate log file corruption.\n' +
60872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      'Entries with invalid data may be caused by version differences.\n\n' +
60972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      'See console for more information.');
61072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
61172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
61272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//------------------------------------------------------------------------------
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
61672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Sets the |categoryTabSwitcher_| of BrowserBridge.  Since views depend on
61772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * g_browser being initialized, have to have a BrowserBridge prior to tab
61872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * construction.
61972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */
62072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.setTabSwitcher = function(categoryTabSwitcher) {
62172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.categoryTabSwitcher_ = categoryTabSwitcher;
62272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
62372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
62472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/**
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Adds a listener of log entries. |observer| will be called back when new log
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * data arrives, through:
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onLogEntryAdded(logEntry)
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.addLogObserver = function(observer) {
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.logObservers_.push(observer);
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Adds a listener of the proxy settings. |observer| will be called back when
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * data is received, through:
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onProxySettingsChanged(proxySettings)
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
6403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * |proxySettings| is a dictionary with (up to) two properties:
6413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
6423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *   "original"  -- The settings that chrome was configured to use
6433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *                  (i.e. system settings.)
6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *   "effective" -- The "effective" proxy settings that chrome is using.
6453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *                  (decides between the manual/automatic modes of the
6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *                  fetched settings).
6473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Each of these two configurations is formatted as a string, and may be
6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * omitted if not yet initialized.
6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * TODO(eroman): send a dictionary instead.
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.addProxySettingsObserver = function(observer) {
654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.proxySettings.addObserver(observer);
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Adds a listener of the proxy settings. |observer| will be called back when
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * data is received, through:
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onBadProxiesChanged(badProxies)
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * |badProxies| is an array, where each entry has the property:
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   badProxies[i].proxy_uri: String identify the proxy.
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   badProxies[i].bad_until: The time when the proxy stops being considered
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *                            bad. Note the time is in time ticks.
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
668731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.addBadProxiesObserver = function(observer) {
669731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.badProxies.addObserver(observer);
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Adds a listener of the host resolver info. |observer| will be called back
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * when data is received, through:
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *   observer.onHostResolverInfoChanged(hostResolverInfo)
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
678731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.addHostResolverInfoObserver = function(observer) {
679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.hostResolverInfo.addObserver(observer);
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Adds a listener of the socket pool. |observer| will be called back
6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * when data is received, through:
6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
6863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *   observer.onSocketPoolInfoChanged(socketPoolInfo)
6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */
6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.addSocketPoolInfoObserver = function(observer) {
689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.socketPoolInfo.addObserver(observer);
690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/**
693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Adds a listener of the SPDY info. |observer| will be called back
694731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * when data is received, through:
695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *
696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *   observer.onSpdySessionInfoChanged(spdySessionInfo)
697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick */
698731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.addSpdySessionInfoObserver = function(observer) {
699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.spdySessionInfo.addObserver(observer);
7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/**
70372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Adds a listener of the SPDY status. |observer| will be called back
70472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * when data is received, through:
70572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
70672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *   observer.onSpdyStatusChanged(spdyStatus)
70772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */
70872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.addSpdyStatusObserver = function(observer) {
70972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.pollableDataHelpers_.spdyStatus.addObserver(observer);
71072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
71172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
71272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/**
71372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Adds a listener of the AlternateProtocolMappings. |observer| will be called
71472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * back when data is received, through:
71572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *
71672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *   observer.onSpdyAlternateProtocolMappingsChanged(
71772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *       spdyAlternateProtocolMappings)
71872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */
71972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.addSpdyAlternateProtocolMappingsObserver =
72072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    function(observer) {
72172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.pollableDataHelpers_.spdyAlternateProtocolMappings.addObserver(observer);
72272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
72372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
72472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/**
7253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Adds a listener of the service providers info. |observer| will be called
7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * back when data is received, through:
7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *   observer.onServiceProvidersChanged(serviceProviders)
7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */
7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.addServiceProvidersObserver = function(observer) {
731731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.serviceProviders.addObserver(observer);
7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/**
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Adds a listener for the progress of the connection tests.
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * The observer will be called back with:
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onStartedConnectionTestSuite();
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onStartedConnectionTestExperiment(experiment);
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onCompletedConnectionTestExperiment(experiment, result);
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onCompletedConnectionTestSuite();
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.addConnectionTestsObserver = function(observer) {
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.connectionTestsObservers_.push(observer);
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Adds a listener for the http cache info results.
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * The observer will be called back with:
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   observer.onHttpCacheInfoChanged(info);
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.addHttpCacheInfoObserver = function(observer) {
754731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.pollableDataHelpers_.httpCacheInfo.addObserver(observer);
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
758dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen * Adds a listener for the results of HSTS (HTTPS Strict Transport Security)
759dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen * queries. The observer will be called back with:
760dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *
761dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *   observer.onHSTSQueryResult(result);
762dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen */
763dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBrowserBridge.prototype.addHSTSObserver = function(observer) {
764dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.hstsObservers_.push(observer);
765dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
766dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
767dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen/**
768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Adds a listener for HTTP throttling-related events. |observer| will be called
769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * back when HTTP throttling is enabled/disabled, through:
770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *
771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *   observer.onHttpThrottlingEnabledPrefChanged(enabled);
772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */
773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.addHttpThrottlingObserver = function(observer) {
774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  this.httpThrottlingObservers_.push(observer);
775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/**
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * The browser gives us times in terms of "time ticks" in milliseconds.
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * This function converts the tick count to a Date() object.
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param {String} timeTicks.
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @returns {Date} The time that |timeTicks| represents.
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserBridge.prototype.convertTimeTicksToDate = function(timeTicks) {
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note that the subtraction by 0 is to cast to a number (probably a float
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // since the numbers are big).
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var timeStampMs = (this.timeTickOffset_ - 0) + (timeTicks - 0);
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var d = new Date();
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  d.setTime(timeStampMs);
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return d;
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Returns a list of all captured events.
7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */
7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.getAllCapturedEvents = function() {
7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return this.capturedEvents_;
7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/**
8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Returns the number of events that were captured while we were
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * listening for events.
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.getNumActivelyCapturedEvents = function() {
8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return this.capturedEvents_.length - this.numPassivelyCapturedEvents_;
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
8093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Returns the number of events that were captured passively by the
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * browser prior to when the net-internals page was started.
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.getNumPassivelyCapturedEvents = function() {
8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return this.numPassivelyCapturedEvents_;
8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/**
81772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Sends each entry to all log observers, and updates |capturedEvents_|.
81872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Also assigns unique ids to log entries without a source.
81972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */
82072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.addLogEntries = function(logEntries) {
82172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (var e = 0; e < logEntries.length; ++e) {
82272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    var logEntry = logEntries[e];
82372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
82472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Assign unique ID, if needed.
82572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (logEntry.source.id == 0) {
82672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      logEntry.source.id = this.nextSourcelessEventId_;
82772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      --this.nextSourcelessEventId_;
82872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
82972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    this.capturedEvents_.push(logEntry);
83072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    for (var i = 0; i < this.logObservers_.length; ++i)
83172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.logObservers_[i].onLogEntryAdded(logEntry);
83272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
83372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
83472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
83572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/**
8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Deletes captured events with source IDs in |sourceIds|.
8373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */
8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.deleteEventsBySourceId = function(sourceIds) {
8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  var sourceIdDict = {};
8403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (var i = 0; i < sourceIds.length; i++)
8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    sourceIdDict[sourceIds[i]] = true;
8423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  var newEventList = [];
8443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (var i = 0; i < this.capturedEvents_.length; ++i) {
8453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    var id = this.capturedEvents_[i].source.id;
8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (id in sourceIdDict) {
8473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (this.capturedEvents_[i].wasPassivelyCaptured)
8483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        --this.numPassivelyCapturedEvents_;
8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      continue;
8503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
8513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    newEventList.push(this.capturedEvents_[i]);
8523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
8533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  this.capturedEvents_ = newEventList;
8543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (var i = 0; i < this.logObservers_.length; ++i)
8563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    this.logObservers_[i].onLogEntriesDeleted(sourceIds);
8573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
8583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick/**
8603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Deletes all captured events.
8613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */
8623345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBrowserBridge.prototype.deleteAllEvents = function() {
8633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  this.capturedEvents_ = [];
8643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  this.numPassivelyCapturedEvents_ = 0;
8653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (var i = 0; i < this.logObservers_.length; ++i)
8663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    this.logObservers_[i].onAllLogEntriesDeleted();
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
869731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/**
870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Sets the value of |enableSecurityStripping_| and informs log observers
871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * of the change.
872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */
873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.setSecurityStripping =
874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    function(enableSecurityStripping) {
875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  this.enableSecurityStripping_ = enableSecurityStripping;
876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (var i = 0; i < this.logObservers_.length; ++i) {
877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (this.logObservers_[i].onSecurityStrippingChanged)
878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.logObservers_[i].onSecurityStrippingChanged();
879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/**
883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Returns whether or not cookies and authentication information should be
884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * displayed for events that contain them.
885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */
886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserBridge.prototype.getSecurityStripping = function() {
887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return this.enableSecurityStripping_;
888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/**
89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Informs log observers whether or not future events will be from a log file.
89272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Hides all tabs except the events and data tabs when viewing a log file, shows
89372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * them all otherwise.
89472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */
89572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.setIsViewingLogFile_ = function(isViewingLogFile) {
89672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  this.isViewingLogFile_ = isViewingLogFile;
89772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  var tabIds = this.categoryTabSwitcher_.getAllTabIds();
89872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
89972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (var i = 0; i < this.logObservers_.length; ++i)
90072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    this.logObservers_[i].onSetIsViewingLogFile(isViewingLogFile);
90172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
90272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Shows/hides tabs not used when viewing a log file.
90372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (var i = 0; i < tabIds.length; ++i) {
90472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (tabIds[i] == 'eventsTab' || tabIds[i] == 'dataTab')
90572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      continue;
90672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    this.categoryTabSwitcher_.showTabHandleNode(tabIds[i], !isViewingLogFile);
90772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
90872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
90972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (isViewingLogFile) {
91072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    var activeTab = this.categoryTabSwitcher_.findActiveTab();
91172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (activeTab.id != 'eventsTab')
91272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      this.categoryTabSwitcher_.switchToTab('dataTab', null);
91372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
91472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
91572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
91672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/**
91772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Returns true if a log file is currently being viewed.
91872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */
91972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowserBridge.prototype.isViewingLogFile = function() {
92072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return this.isViewingLogFile_;
92172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
92272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
92372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/**
924731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * If |force| is true, calls all startUpdate functions.  Otherwise, just
925731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * runs updates with active observers.
926731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick */
927731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.checkForUpdatedInfo = function(force) {
928731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (name in this.pollableDataHelpers_) {
929731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    var helper = this.pollableDataHelpers_[name];
930731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (force || helper.hasActiveObserver())
931731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      helper.startUpdate();
932731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
933731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
934731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
935731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/**
936731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Calls all startUpdate functions and, if |callback| is non-null,
937731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * calls it with the results of all updates.
938731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick */
939731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserBridge.prototype.updateAllInfo = function(callback) {
940731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (callback)
941731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    new UpdateAllObserver(callback, this.pollableDataHelpers_);
942731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.checkForUpdatedInfo(true);
943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * This is a helper class used by BrowserBridge, to keep track of:
947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   - the list of observers interested in some piece of data.
948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   - the last known value of that piece of data.
949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *   - the name of the callback method to invoke on observers.
950731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *   - the update function.
951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @constructor
952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
953731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickfunction PollableDataHelper(observerMethodName, startUpdateFunction) {
954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.observerMethodName_ = observerMethodName;
955731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.startUpdate = startUpdateFunction;
956731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.observerInfos_ = [];
957731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
958731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
959731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPollableDataHelper.prototype.getObserverMethodName = function() {
960731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return this.observerMethodName_;
961731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
962731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
963731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/**
964731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * This is a helper class used by PollableDataHelper, to keep track of
965731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * each observer and whether or not it has received any data.  The
966731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * latter is used to make sure that new observers get sent data on the
967731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * update following their creation.
968731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * @constructor
969731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick */
970731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickfunction ObserverInfo(observer) {
971731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.observer = observer;
972731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.hasReceivedData = false;
973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
975c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPollableDataHelper.prototype.addObserver = function(observer) {
976731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.observerInfos_.push(new ObserverInfo(observer));
977731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
978731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
979731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPollableDataHelper.prototype.removeObserver = function(observer) {
980731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (var i = 0; i < this.observerInfos_.length; ++i) {
981731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (this.observerInfos_[i].observer == observer) {
982731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      this.observerInfos_.splice(i, 1);
983731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
984731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
985731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Helper function to handle calling all the observers, but ONLY if the data has
990731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * actually changed since last time or the observer has yet to receive any data.
991731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * This is used for data we received from browser on an update loop.
992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
993c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPollableDataHelper.prototype.update = function(data) {
994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var prevData = this.currentData_;
995731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  var changed = false;
996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
997731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If the data hasn't changed since last time, will only need to notify
998731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // observers that have not yet received any data.
999731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!prevData || JSON.stringify(prevData) != JSON.stringify(data)) {
1000731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    changed = true;
1001731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    this.currentData_ = data;
1002731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1004731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Notify the observers of the change, as needed.
1005731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (var i = 0; i < this.observerInfos_.length; ++i) {
1006731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    var observerInfo = this.observerInfos_[i];
1007731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (changed || !observerInfo.hasReceivedData) {
1008731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      observerInfo.observer[this.observerMethodName_](this.currentData_);
1009731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      observerInfo.hasReceivedData = true;
1010731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
1011731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1012731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
1013731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1014731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/**
1015731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * Returns true if one of the observers actively wants the data
1016731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * (i.e. is visible).
1017731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick */
1018731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPollableDataHelper.prototype.hasActiveObserver = function() {
1019731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (var i = 0; i < this.observerInfos_.length; ++i) {
1020731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (this.observerInfos_[i].observer.isActive())
1021731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return true;
1022731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1023731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return false;
1024731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
1025731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1026731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/**
1027731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * This is a helper class used by BrowserBridge to send data to
1028731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * a callback once data from all polls has been received.
1029731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *
1030731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * It works by keeping track of how many polling functions have
1031731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * yet to receive data, and recording the data as it it received.
1032731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *
1033731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * @constructor
1034731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick */
1035731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickfunction UpdateAllObserver(callback, pollableDataHelpers) {
1036731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.callback_ = callback;
1037731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.observingCount_ = 0;
1038731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.updatedData_ = {};
1039731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1040731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (name in pollableDataHelpers) {
1041731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ++this.observingCount_;
1042731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    var helper = pollableDataHelpers[name];
1043731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    helper.addObserver(this);
1044731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    this[helper.getObserverMethodName()] =
1045731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        this.onDataReceived_.bind(this, helper, name);
1046731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1047731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1048731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1049731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickUpdateAllObserver.prototype.isActive = function() {
1050731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return true;
1051731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1053731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickUpdateAllObserver.prototype.onDataReceived_ = function(helper, name, data) {
1054731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  helper.removeObserver(this);
1055731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  --this.observingCount_;
1056731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  this.updatedData_[name] = data;
1057731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (this.observingCount_ == 0)
1058731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    this.callback_(this.updatedData_);
1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1060