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; |