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¶m1=value1¶m2=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