/* * Copyright (C) 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ WebInspector.DashboardView = function(element) { WebInspector.Object.call(this); this._element = element; this._items = { resourcesCount: { tooltip: WebInspector.UIString("Total number of resources, click to show the Resources navigation sidebar"), handler: this._resourcesWasClicked }, resourcesSize: { tooltip: WebInspector.UIString("Total size of all resources, click to show the Network Requests timeline"), handler: this._networkItemWasClicked }, time: { tooltip: WebInspector.UIString("Time until the load event fired, click to show the Network Requests timeline"), handler: this._networkItemWasClicked }, logs: { tooltip: WebInspector.UIString("Console logs, click to show the Console"), handler: this._consoleItemWasClicked.bind(this, WebInspector.LogContentView.Scopes.Logs) }, errors: { tooltip: WebInspector.UIString("Console errors, click to show the Console"), handler: this._consoleItemWasClicked.bind(this, WebInspector.LogContentView.Scopes.Errors) }, issues: { tooltip: WebInspector.UIString("Console warnings, click to show the Console"), handler: this._consoleItemWasClicked.bind(this, WebInspector.LogContentView.Scopes.Warnings) } }; for (var name in this._items) this._appendElementForNamedItem(name); this.resourcesCount = 0; this.resourcesSize = 0; this.time = 0; this.logs = 0; this.errors = 0; this.issues = 0; }; WebInspector.DashboardView.EnabledStyleClassName = "enabled"; WebInspector.DashboardView.prototype = { constructor: WebInspector.DashboardView, // Public get logs() { return this._logs; }, set logs(logs) { this._setConsoleItemValue("logs", logs); }, get issues() { return this._issues; }, set issues(issues) { this._setConsoleItemValue("issues", issues); }, get errors() { return this._errors; }, set errors(errors) { this._setConsoleItemValue("errors", errors); }, set time(time) { var item = this._items.time; item.text = time ? Number.secondsToString(time) : "\u2014"; this._setItemEnabled(item, time > 0); }, get resourcesCount() { return this._resourcesCount; }, set resourcesCount(resourcesCount) { this._resourcesCount = resourcesCount; var item = this._items.resourcesCount; item.text = this._formatPossibleLargeNumber(resourcesCount); this._setItemEnabled(item, resourcesCount > 0); }, get resourcesSize() { return this._resourcesSize; }, set resourcesSize(resourcesSize) { this._resourcesSize = resourcesSize; var item = this._items.resourcesSize; item.text = resourcesSize ? Number.bytesToString(resourcesSize, false) : "\u2014"; this._setItemEnabled(item, resourcesSize > 0); }, // Private _formatPossibleLargeNumber: function(number) { return number > 999 ? WebInspector.UIString("999+") : number; }, _appendElementForNamedItem: function(name) { var item = this._items[name]; item.container = this._element.appendChild(document.createElement("div")); item.container.className = "item " + name; item.container.title = item.tooltip; item.container.appendChild(document.createElement("img")); item.outlet = item.container.appendChild(document.createElement("div")); Object.defineProperty(item, "text", { set: function(newText) { if (newText === item.outlet.textContent) return; item.outlet.textContent = newText; } }); item.container.addEventListener("click", function(event) { this._itemWasClicked(name); }.bind(this)); }, _itemWasClicked: function(name) { var item = this._items[name]; if (!item.container.classList.contains(WebInspector.DashboardView.EnabledStyleClassName)) return; if (item.handler) item.handler.call(this); }, _resourcesWasClicked: function() { WebInspector.navigationSidebar.selectedSidebarPanel = WebInspector.resourceSidebarPanel; WebInspector.navigationSidebar.collapsed = false; }, _networkItemWasClicked: function() { WebInspector.navigationSidebar.selectedSidebarPanel = WebInspector.timelineSidebarPanel; }, _consoleItemWasClicked: function(scope) { WebInspector.showConsoleView(scope); }, _setConsoleItemValue: function(itemName, newValue) { var iVarName = "_" + itemName; var previousValue = this[iVarName]; this[iVarName] = newValue; var item = this._items[itemName]; item.text = this._formatPossibleLargeNumber(newValue); this._setItemEnabled(item, newValue > 0); if (newValue <= previousValue) return; var container = item.container; function animationEnded(event) { if (event.target === container) { container.classList.remove("pulsing"); container.removeEventListener("webkitAnimationEnd", animationEnded); } } // We need to force a style invalidation in the case where we already // were animating this item after we've removed the pulsing CSS class. if (container.classList.contains("pulsing")) { container.classList.remove("pulsing"); container.recalculateStyles(); } else container.addEventListener("webkitAnimationEnd", animationEnded); container.classList.add("pulsing"); }, _setItemEnabled: function(item, enabled) { if (enabled) item.container.classList.add(WebInspector.DashboardView.EnabledStyleClassName); else item.container.classList.remove(WebInspector.DashboardView.EnabledStyleClassName); } }; WebInspector.DashboardView.prototype.__proto__ = WebInspector.Object.prototype;