Chromium Code Reviews| Index: chrome/browser/resources/net_internals/mobile_main.js |
| =================================================================== |
| --- chrome/browser/resources/net_internals/mobile_main.js (revision 0) |
| +++ chrome/browser/resources/net_internals/mobile_main.js (revision 0) |
| @@ -0,0 +1,232 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +/** |
| + * Dictionary of constants (Initialized soon after loading by data from browser, |
| + * updated on load log). The *Types dictionaries map strings to numeric IDs, |
| + * while the *TypeNames are the other way around. |
| + */ |
| +var EventType = null; |
| +var EventTypeNames = null; |
| +var EventPhase = null; |
| +var EventSourceType = null; |
| +var EventSourceTypeNames = null; |
| +var LogLevelType = null; |
| +var ClientInfo = null; |
| +var NetError = null; |
| +var LoadFlag = null; |
| +var LoadState = null; |
| +var AddressFamily = null; |
| + |
| +/** |
| + * Dictionary of all constants, used for saving log files. |
| + */ |
| +var Constants = null; |
| + |
| +/** |
| + * Object to communicate between the renderer and the browser. |
| + * @type {!BrowserBridge} |
| + */ |
| +var g_browser = null; |
| + |
| +/** |
| + * This class is the root view object of the page. It owns all the other |
| + * views, and manages switching between them. It is also responsible for |
| + * initializing the views and the BrowserBridge. |
| + */ |
| +var MainView = (function() { |
| + 'use strict'; |
| + |
| + // We inherit from HorizontalSplitView |
| + var superClass = HorizontalSplitView; |
| + |
| + /** |
| + * Main entry point. Called once the page has loaded. |
| + * @constructor |
| + */ |
| + function MainView() { |
| + assertFirstConstructorCall(MainView); |
| + |
| + if (hasTouchScreen()) |
| + document.body.classList.add('touch'); |
| + |
| + // This must be initialized before the tabs, so they can register as |
| + // observers. |
| + g_browser = BrowserBridge.getInstance(); |
| + |
| + // This must be the first constants observer, so other constants observers |
| + // can safely use the globals, rather than depending on walking through |
| + // the constants themselves. |
| + g_browser.addConstantsObserver(new ConstantsObserver()); |
| + |
| + // This view is a left navigation bar. |
| + this.categoryTabSwitcher_ = new TabSwitcherView(); |
| + var tabs = this.categoryTabSwitcher_; |
| + |
| + // Call superclass's constructor, initializing the view which lets you tab |
| + // between the different sub-views. |
| + superClass.call(this, |
| + new DivView(MainView.CATEGORY_TAB_HANDLES_ID), |
| + tabs); |
| + |
| + // Populate the main tabs. Even tabs that don't contain information for the |
| + // running OS should be created, so they can load log dumps from other |
| + // OSes. |
| + tabs.addTab(MobileView.TAB_HANDLE_ID, MobileView.getInstance(), |
| + false, true); |
|
mmenke
2013/01/04 16:22:09
You're planning on getting rid of these in a later
|
| + |
| + // Build a map from the anchor name of each tab handle to its "tab ID". |
| + // We will consider navigations to the #hash as a switch tab request. |
| + var anchorMap = {}; |
| + var tabIds = tabs.getAllTabIds(); |
| + for (var i = 0; i < tabIds.length; ++i) { |
| + var aNode = $(tabIds[i]); |
| + anchorMap[aNode.hash] = tabIds[i]; |
| + } |
| + // Default the empty hash to the data tab. |
| + anchorMap['#'] = anchorMap[''] = MobileView.TAB_HANDLE_ID; |
| + |
| + window.onhashchange = onUrlHashChange.bind(null, tabs, anchorMap); |
| + |
| + // Cut out a small vertical strip at the top of the window, to display |
| + // a high level status (i.e. if we are capturing events, or displaying a |
| + // log file). Below it we will position the main tabs and their content |
| + // area. |
| + this.statusView_ = StatusView.getInstance(this); |
| + var verticalSplitView = new VerticalSplitView(this.statusView_, this); |
| + this.statusView_.setLayoutParent(verticalSplitView); |
| + var windowView = new WindowView(verticalSplitView); |
| + |
| + // Don't cache events from browser in renderer process. |
| + var softLimit = 10; |
| + var hardLimit = 20; |
| + EventsTracker.getInstance().setLimits(softLimit, hardLimit); |
| + |
| + // Trigger initial layout. |
| + windowView.resetGeometry(); |
| + |
| + // Select the initial view based on the current URL. |
| + window.onhashchange(); |
| + |
| + // Tell the browser that we are ready to start receiving log events. |
| + g_browser.sendReady(); |
| + } |
| + |
| + // IDs for special HTML elements in index.html |
| + MainView.CATEGORY_TAB_HANDLES_ID = 'category-tab-handles'; |
| + |
| + cr.addSingletonGetter(MainView); |
| + |
| + // On mobile, disable viewing of a loaded log file. |
| + var isViewingLoadedLog = false; |
| + |
| + MainView.isViewingLoadedLog = function() { |
| + return isViewingLoadedLog; |
| + }; |
| + |
| + MainView.prototype = { |
| + // Inherit the superclass's methods. |
| + __proto__: superClass.prototype, |
| + |
| + // This is exposed so that log_util.js can call it. |
| + categoryTabSwitcher: function() { |
| + return this.categoryTabSwitcher_; |
| + }, |
| + |
| + /** |
| + * Disabled loading of log files on Mobile. |
| + */ |
| + onLoadLog: function(opt_fileName) { |
| + }, |
| + |
| + switchToViewOnlyMode: function() { |
| + }, |
| + |
| + stopCapturing: function() { |
| + g_browser.disable(); |
| + document.styleSheets[0].insertRule( |
| + '.hide-when-not-capturing { display: none; }'); |
| + } |
| + }; |
| + |
| + /** |
| + * Takes the current hash in form of "#tab¶m1=value1¶m2=value2&...". |
| + * Puts the parameters in an object, and passes the resulting object to |
| + * |categoryTabSwitcher|. Uses tab and |anchorMap| to find a tab ID, |
| + * which it also passes to the tab switcher. |
| + * |
| + * Parameters and values are decoded with decodeURIComponent(). |
| + */ |
| + function onUrlHashChange(categoryTabSwitcher, anchorMap) { |
| + var parameters = window.location.hash.split('&'); |
| + |
| + var tabId = anchorMap[parameters[0]]; |
| + if (!tabId) |
| + return; |
| + |
| + // Split each string except the first around the '='. |
| + var paramDict = null; |
| + for (var i = 1; i < parameters.length; i++) { |
| + var paramStrings = parameters[i].split('='); |
| + if (paramStrings.length != 2) |
| + continue; |
| + if (paramDict == null) |
| + paramDict = {}; |
| + var key = decodeURIComponent(paramStrings[0]); |
| + var value = decodeURIComponent(paramStrings[1]); |
| + paramDict[key] = value; |
| + } |
| + |
| + categoryTabSwitcher.switchToTab(tabId, paramDict); |
| + } |
| + |
| + return MainView; |
| +})(); |
| + |
| +function ConstantsObserver() {} |
|
mmenke
2013/01/04 16:22:09
Think it's worth moving the constants stuff to a s
|
| + |
| +/** |
| + * Loads all constants from |constants|. On failure, global dictionaries are |
| + * not modifed. |
| + * @param {Object} receivedConstants The map of received constants. |
| + */ |
| +ConstantsObserver.prototype.onReceivedConstants = function(receivedConstants) { |
| + if (!areValidConstants(receivedConstants)) |
| + return; |
| + |
| + Constants = receivedConstants; |
| + |
| + EventType = Constants.logEventTypes; |
| + EventTypeNames = makeInverseMap(EventType); |
| + EventPhase = Constants.logEventPhase; |
| + EventSourceType = Constants.logSourceType; |
| + EventSourceTypeNames = makeInverseMap(EventSourceType); |
| + LogLevelType = Constants.logLevelType; |
| + ClientInfo = Constants.clientInfo; |
| + LoadFlag = Constants.loadFlag; |
| + NetError = Constants.netError; |
| + AddressFamily = Constants.addressFamily; |
| + LoadState = Constants.loadState; |
| + |
| + timeutil.setTimeTickOffset(Constants.timeTickOffset); |
| +}; |
| + |
| +/** |
| + * Returns true if it's given a valid-looking constants object. |
| + * @param {Object} receivedConstants The received map of constants. |
| + * @return {boolean} True if the |receivedConstants| object appears valid. |
| + */ |
| +function areValidConstants(receivedConstants) { |
| + return typeof(receivedConstants) == 'object' && |
| + typeof(receivedConstants.logEventTypes) == 'object' && |
| + typeof(receivedConstants.clientInfo) == 'object' && |
| + typeof(receivedConstants.logEventPhase) == 'object' && |
| + typeof(receivedConstants.logSourceType) == 'object' && |
| + typeof(receivedConstants.logLevelType) == 'object' && |
| + typeof(receivedConstants.loadFlag) == 'object' && |
| + typeof(receivedConstants.netError) == 'object' && |
| + typeof(receivedConstants.addressFamily) == 'object' && |
| + typeof(receivedConstants.timeTickOffset) == 'string' && |
| + typeof(receivedConstants.logFormatVersion) == 'number'; |
| +} |