Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4859)

Unified Diff: chrome_frame/tools/test/reference_build/chrome/resources/inspector/ProfilesPanel.js

Issue 218019: Initial import of the Chrome Frame codebase. Integration in chrome.gyp coming... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome_frame/tools/test/reference_build/chrome/resources/inspector/ProfilesPanel.js
===================================================================
--- chrome_frame/tools/test/reference_build/chrome/resources/inspector/ProfilesPanel.js (revision 0)
+++ chrome_frame/tools/test/reference_build/chrome/resources/inspector/ProfilesPanel.js (revision 0)
@@ -0,0 +1,534 @@
+/*
+ * Copyright (C) 2008 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. ``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
+ * 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.
+ */
+
+const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
+
+WebInspector.ProfilesPanel = function()
+{
+ WebInspector.Panel.call(this);
+
+ this.element.addStyleClass("profiles");
+
+ var panelEnablerHeading = WebInspector.UIString("You need to enable profiling before you can use the Profiles panel.");
+ var panelEnablerDisclaimer = WebInspector.UIString("Enabling profiling will make scripts run slower.");
+ var panelEnablerButton = WebInspector.UIString("Enable Profiling");
+ this.panelEnablerView = new WebInspector.PanelEnablerView("profiles", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
+ this.panelEnablerView.addEventListener("enable clicked", this._enableProfiling, this);
+
+ this.element.appendChild(this.panelEnablerView.element);
+
+ this.sidebarElement = document.createElement("div");
+ this.sidebarElement.id = "profiles-sidebar";
+ this.sidebarElement.className = "sidebar";
+ this.element.appendChild(this.sidebarElement);
+
+ this.sidebarResizeElement = document.createElement("div");
+ this.sidebarResizeElement.className = "sidebar-resizer-vertical";
+ this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarDragging.bind(this), false);
+ this.element.appendChild(this.sidebarResizeElement);
+
+ this.sidebarTreeElement = document.createElement("ol");
+ this.sidebarTreeElement.className = "sidebar-tree";
+ this.sidebarElement.appendChild(this.sidebarTreeElement);
+
+ this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
+
+ this.profilesListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("CPU PROFILES"), null, true);
+ this.sidebarTree.appendChild(this.profilesListTreeElement);
+ this.profilesListTreeElement.expand();
+
+ this.snapshotsListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("HEAP SNAPSHOTS"), null, true);
+ if (Preferences.heapProfilerPresent) {
+ this.sidebarTree.appendChild(this.snapshotsListTreeElement);
+ this.snapshotsListTreeElement.expand();
+ }
+
+ this.profileViews = document.createElement("div");
+ this.profileViews.id = "profile-views";
+ this.element.appendChild(this.profileViews);
+
+ this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
+ this.enableToggleButton.addEventListener("click", this._toggleProfiling.bind(this), false);
+
+ this.recordButton = new WebInspector.StatusBarButton(WebInspector.UIString("Start profiling."), "record-profile-status-bar-item");
+ this.recordButton.addEventListener("click", this._recordClicked.bind(this), false);
+
+ this.recording = false;
+
+ this.snapshotButton = new WebInspector.StatusBarButton(WebInspector.UIString("Take heap snapshot."), "heap-snapshot-status-bar-item");
+ this.snapshotButton.visible = Preferences.heapProfilerPresent;
+ this.snapshotButton.addEventListener("click", this._snapshotClicked.bind(this), false);
+
+ this.profileViewStatusBarItemsContainer = document.createElement("div");
+ this.profileViewStatusBarItemsContainer.id = "profile-view-status-bar-items";
+
+ this.reset();
+}
+
+WebInspector.ProfilesPanel.prototype = {
+ toolbarItemClass: "profiles",
+
+ get toolbarItemLabel()
+ {
+ return WebInspector.UIString("Profiles");
+ },
+
+ get statusBarItems()
+ {
+ return [this.enableToggleButton.element, this.recordButton.element, this.snapshotButton.element, this.profileViewStatusBarItemsContainer];
+ },
+
+ show: function()
+ {
+ WebInspector.Panel.prototype.show.call(this);
+ this._updateSidebarWidth();
+ if (this._shouldPopulateProfiles)
+ this._populateProfiles();
+ },
+
+ populateInterface: function()
+ {
+ if (this.visible)
+ this._populateProfiles();
+ else
+ this._shouldPopulateProfiles = true;
+ },
+
+ profilerWasEnabled: function()
+ {
+ this.reset();
+ this.populateInterface();
+ },
+
+ profilerWasDisabled: function()
+ {
+ this.reset();
+ },
+
+ reset: function()
+ {
+ if (this._profiles) {
+ var profiledLength = this._profiles.length;
+ for (var i = 0; i < profiledLength; ++i) {
+ var profile = this._profiles[i];
+ delete profile._profileView;
+ }
+ }
+
+ delete this.currentQuery;
+ this.searchCanceled();
+
+ this._profiles = [];
+ this._profilesIdMap = {};
+ this._profileGroups = {};
+ this._profileGroupsForLinks = {}
+
+ this.sidebarTreeElement.removeStyleClass("some-expandable");
+
+ this.profilesListTreeElement.removeChildren();
+ this.snapshotsListTreeElement.removeChildren();
+ this.profileViews.removeChildren();
+
+ this.profileViewStatusBarItemsContainer.removeChildren();
+
+ this._updateInterface();
+ },
+
+ handleKeyEvent: function(event)
+ {
+ this.sidebarTree.handleKeyEvent(event);
+ },
+
+ addProfile: function(profile)
+ {
+ this._profiles.push(profile);
+ this._profilesIdMap[profile.uid] = profile;
+
+ var sidebarParent = this.profilesListTreeElement;
+ var small = false;
+ var alternateTitle;
+
+ if (profile.title.indexOf(UserInitiatedProfileName) !== 0) {
+ if (!(profile.title in this._profileGroups))
+ this._profileGroups[profile.title] = [];
+
+ var group = this._profileGroups[profile.title];
+ group.push(profile);
+
+ if (group.length === 2) {
+ // Make a group TreeElement now that there are 2 profiles.
+ group._profilesTreeElement = new WebInspector.ProfileGroupSidebarTreeElement(profile.title);
+
+ // Insert at the same index for the first profile of the group.
+ var index = this.sidebarTree.children.indexOf(group[0]._profilesTreeElement);
+ this.sidebarTree.insertChild(group._profilesTreeElement, index);
+
+ // Move the first profile to the group.
+ var selected = group[0]._profilesTreeElement.selected;
+ this.sidebarTree.removeChild(group[0]._profilesTreeElement);
+ group._profilesTreeElement.appendChild(group[0]._profilesTreeElement);
+ if (selected) {
+ group[0]._profilesTreeElement.select();
+ group[0]._profilesTreeElement.reveal();
+ }
+
+ group[0]._profilesTreeElement.small = true;
+ group[0]._profilesTreeElement.mainTitle = WebInspector.UIString("Run %d", 1);
+
+ this.sidebarTreeElement.addStyleClass("some-expandable");
+ }
+
+ if (group.length >= 2) {
+ sidebarParent = group._profilesTreeElement;
+ alternateTitle = WebInspector.UIString("Run %d", group.length);
+ small = true;
+ }
+ }
+
+ var profileTreeElement = new WebInspector.ProfileSidebarTreeElement(profile);
+ profileTreeElement.small = small;
+ if (alternateTitle)
+ profileTreeElement.mainTitle = alternateTitle;
+ profile._profilesTreeElement = profileTreeElement;
+
+ sidebarParent.appendChild(profileTreeElement);
+ },
+
+ showProfile: function(profile)
+ {
+ if (!profile)
+ return;
+
+ if (this.visibleView)
+ this.visibleView.hide();
+
+ var view = this.profileViewForProfile(profile);
+
+ view.show(this.profileViews);
+
+ profile._profilesTreeElement.select(true);
+ profile._profilesTreeElement.reveal();
+
+ this.visibleView = view;
+
+ this.profileViewStatusBarItemsContainer.removeChildren();
+
+ var statusBarItems = view.statusBarItems;
+ for (var i = 0; i < statusBarItems.length; ++i)
+ this.profileViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
+ },
+
+ showView: function(view)
+ {
+ this.showProfile(view.profile);
+ },
+
+ profileViewForProfile: function(profile)
+ {
+ if (!profile)
+ return null;
+ if (!profile._profileView)
+ profile._profileView = new WebInspector.ProfileView(profile);
+ return profile._profileView;
+ },
+
+ showProfileById: function(uid)
+ {
+ this.showProfile(this._profilesIdMap[uid]);
+ },
+
+ closeVisibleView: function()
+ {
+ if (this.visibleView)
+ this.visibleView.hide();
+ delete this.visibleView;
+ },
+
+ displayTitleForProfileLink: function(title)
+ {
+ title = unescape(title);
+ if (title.indexOf(UserInitiatedProfileName) === 0) {
+ title = WebInspector.UIString("Profile %d", title.substring(UserInitiatedProfileName.length + 1));
+ } else {
+ if (!(title in this._profileGroupsForLinks))
+ this._profileGroupsForLinks[title] = 0;
+
+ groupNumber = ++this._profileGroupsForLinks[title];
+
+ if (groupNumber > 2)
+ // The title is used in the console message announcing that a profile has started so it gets
+ // incremented twice as often as it's displayed
+ title += " " + WebInspector.UIString("Run %d", groupNumber / 2);
+ }
+
+ return title;
+ },
+
+ get searchableViews()
+ {
+ var views = [];
+
+ const visibleView = this.visibleView;
+ if (visibleView && visibleView.performSearch)
+ views.push(visibleView);
+
+ var profilesLength = this._profiles.length;
+ for (var i = 0; i < profilesLength; ++i) {
+ var view = this.profileViewForProfile(this._profiles[i]);
+ if (!view.performSearch || view === visibleView)
+ continue;
+ views.push(view);
+ }
+
+ return views;
+ },
+
+ searchMatchFound: function(view, matches)
+ {
+ view.profile._profilesTreeElement.searchMatches = matches;
+ },
+
+ searchCanceled: function(startingNewSearch)
+ {
+ WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
+
+ if (!this._profiles)
+ return;
+
+ for (var i = 0; i < this._profiles.length; ++i) {
+ var profile = this._profiles[i];
+ profile._profilesTreeElement.searchMatches = 0;
+ }
+ },
+
+ setRecordingProfile: function(isProfiling)
+ {
+ this.recording = isProfiling;
+
+ if (isProfiling) {
+ this.recordButton.toggled = true;
+ this.recordButton.title = WebInspector.UIString("Stop profiling.");
+ } else {
+ this.recordButton.toggled = false;
+ this.recordButton.title = WebInspector.UIString("Start profiling.");
+ }
+ },
+
+ resize: function()
+ {
+ var visibleView = this.visibleView;
+ if (visibleView && "resize" in visibleView)
+ visibleView.resize();
+ },
+
+ _updateInterface: function()
+ {
+ if (InspectorController.profilerEnabled()) {
+ this.enableToggleButton.title = WebInspector.UIString("Profiling enabled. Click to disable.");
+ this.enableToggleButton.toggled = true;
+ this.recordButton.visible = true;
+ if (Preferences.heapProfilerPresent)
+ this.snapshotButton.visible = true;
+ this.profileViewStatusBarItemsContainer.removeStyleClass("hidden");
+ this.panelEnablerView.visible = false;
+ } else {
+ this.enableToggleButton.title = WebInspector.UIString("Profiling disabled. Click to enable.");
+ this.enableToggleButton.toggled = false;
+ this.recordButton.visible = false;
+ this.snapshotButton.visible = false;
+ this.profileViewStatusBarItemsContainer.addStyleClass("hidden");
+ this.panelEnablerView.visible = true;
+ }
+ },
+
+ _recordClicked: function()
+ {
+ this.recording = !this.recording;
+
+ if (this.recording)
+ InspectorController.startProfiling();
+ else
+ InspectorController.stopProfiling();
+ },
+
+ _snapshotClicked: function()
+ {
+ InspectorController.takeHeapSnapshot();
+ },
+
+ _enableProfiling: function()
+ {
+ if (InspectorController.profilerEnabled())
+ return;
+ this._toggleProfiling(this.panelEnablerView.alwaysEnabled);
+ },
+
+ _toggleProfiling: function(optionalAlways)
+ {
+ if (InspectorController.profilerEnabled())
+ InspectorController.disableProfiler(true);
+ else
+ InspectorController.enableProfiler(!!optionalAlways);
+ },
+
+ _populateProfiles: function()
+ {
+ if (this.sidebarTree.children.length)
+ return;
+
+ var profiles = InspectorController.profiles();
+ var profilesLength = profiles.length;
+ for (var i = 0; i < profilesLength; ++i) {
+ var profile = profiles[i];
+ this.addProfile(profile);
+ }
+
+ if (this.sidebarTree.children[0])
+ this.sidebarTree.children[0].select();
+
+ delete this._shouldPopulateProfiles;
+ },
+
+ _startSidebarDragging: function(event)
+ {
+ WebInspector.elementDragStart(this.sidebarResizeElement, this._sidebarDragging.bind(this), this._endSidebarDragging.bind(this), event, "col-resize");
+ },
+
+ _sidebarDragging: function(event)
+ {
+ this._updateSidebarWidth(event.pageX);
+
+ event.preventDefault();
+ },
+
+ _endSidebarDragging: function(event)
+ {
+ WebInspector.elementDragEnd(event);
+ },
+
+ _updateSidebarWidth: function(width)
+ {
+ if (this.sidebarElement.offsetWidth <= 0) {
+ // The stylesheet hasn't loaded yet or the window is closed,
+ // so we can't calculate what is need. Return early.
+ return;
+ }
+
+ if (!("_currentSidebarWidth" in this))
+ this._currentSidebarWidth = this.sidebarElement.offsetWidth;
+
+ if (typeof width === "undefined")
+ width = this._currentSidebarWidth;
+
+ width = Number.constrain(width, Preferences.minSidebarWidth, window.innerWidth / 2);
+
+ this._currentSidebarWidth = width;
+
+ this.sidebarElement.style.width = width + "px";
+ this.profileViews.style.left = width + "px";
+ this.profileViewStatusBarItemsContainer.style.left = width + "px";
+ this.sidebarResizeElement.style.left = (width - 3) + "px";
+
+ var visibleView = this.visibleView;
+ if (visibleView && "resize" in visibleView)
+ visibleView.resize();
+ }
+}
+
+WebInspector.ProfilesPanel.prototype.__proto__ = WebInspector.Panel.prototype;
+
+WebInspector.ProfileSidebarTreeElement = function(profile)
+{
+ this.profile = profile;
+
+ if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
+ this._profileNumber = this.profile.title.substring(UserInitiatedProfileName.length + 1);
+
+ WebInspector.SidebarTreeElement.call(this, "profile-sidebar-tree-item", "", "", profile, false);
+
+ this.refreshTitles();
+}
+
+WebInspector.ProfileSidebarTreeElement.prototype = {
+ onselect: function()
+ {
+ WebInspector.panels.profiles.showProfile(this.profile);
+ },
+
+ get mainTitle()
+ {
+ if (this._mainTitle)
+ return this._mainTitle;
+ if (this.profile.title.indexOf(UserInitiatedProfileName) === 0)
+ return WebInspector.UIString("Profile %d", this._profileNumber);
+ return this.profile.title;
+ },
+
+ set mainTitle(x)
+ {
+ this._mainTitle = x;
+ this.refreshTitles();
+ },
+
+ get subtitle()
+ {
+ // There is no subtitle.
+ },
+
+ set subtitle(x)
+ {
+ // Can't change subtitle.
+ },
+
+ set searchMatches(matches)
+ {
+ if (!matches) {
+ if (!this.bubbleElement)
+ return;
+ this.bubbleElement.removeStyleClass("search-matches");
+ this.bubbleText = "";
+ return;
+ }
+
+ this.bubbleText = matches;
+ this.bubbleElement.addStyleClass("search-matches");
+ }
+}
+
+WebInspector.ProfileSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.ProfileGroupSidebarTreeElement = function(title, subtitle)
+{
+ WebInspector.SidebarTreeElement.call(this, "profile-group-sidebar-tree-item", title, subtitle, null, true);
+}
+
+WebInspector.ProfileGroupSidebarTreeElement.prototype = {
+ onselect: function()
+ {
+ WebInspector.panels.profiles.showProfile(this.children[this.children.length - 1].profile);
+ }
+}
+
+WebInspector.ProfileGroupSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;

Powered by Google App Engine
This is Rietveld 408576698