tizen beta release
[framework/web/webkit-efl.git] / Source / WebCore / inspector / front-end / CallStackSidebarPane.js
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 /**
27  * @constructor
28  * @extends {WebInspector.SidebarPane}
29  */
30 WebInspector.CallStackSidebarPane = function(model)
31 {
32     WebInspector.SidebarPane.call(this, WebInspector.UIString("Call Stack"));
33     this._model = model;
34
35     this.bodyElement.addEventListener("contextmenu", this._contextMenu.bind(this), true);
36 }
37
38 WebInspector.CallStackSidebarPane.prototype = {
39     update: function(callFrames)
40     {
41         this.bodyElement.removeChildren();
42
43         if (this.placards) {
44             for (var i = 0; i < this.placards.length; ++i)
45                 this.placards[i].discard();
46         }
47         this.placards = [];
48
49         if (!callFrames) {
50             var infoElement = document.createElement("div");
51             infoElement.className = "info";
52             infoElement.textContent = WebInspector.UIString("Not Paused");
53             this.bodyElement.appendChild(infoElement);
54             return;
55         }
56
57         for (var i = 0; i < callFrames.length; ++i) {
58             var callFrame = callFrames[i];
59             var placard = this._model.createPlacard(callFrame);
60             placard.callFrame = callFrame;
61             placard.element.addEventListener("click", this._placardSelected.bind(this, placard), false);
62             this.placards.push(placard);
63             this.bodyElement.appendChild(placard.element);
64         }
65     },
66
67     set selectedCallFrame(x)
68     {
69         for (var i = 0; i < this.placards.length; ++i) {
70             var placard = this.placards[i];
71             placard.selected = (placard.callFrame === x);
72         }
73     },
74
75     _selectNextCallFrameOnStack: function()
76     {
77         var index = this._selectedCallFrameIndex();
78         if (index == -1)
79             return;
80         this._selectedPlacardByIndex(index + 1);
81     },
82
83     _selectPreviousCallFrameOnStack: function()
84     {
85         var index = this._selectedCallFrameIndex();
86         if (index == -1)
87             return;
88         this._selectedPlacardByIndex(index - 1);
89     },
90
91     _selectedPlacardByIndex: function(index)
92     {
93         if (index < 0 || index >= this.placards.length)
94             return;
95         this._placardSelected(this.placards[index])
96     },
97
98     _selectedCallFrameIndex: function()
99     {
100         if (!this._model.selectedCallFrame)
101             return -1;
102         for (var i = 0; i < this.placards.length; ++i) {
103             var placard = this.placards[i];
104             if (placard.callFrame === this._model.selectedCallFrame)
105                 return i;
106         }
107         return -1;
108     },
109
110     _placardSelected: function(placard)
111     {
112         this._model.selectedCallFrame = placard.callFrame;
113     },
114
115     _contextMenu: function(event)
116     {
117         if (!this.placards.length)
118             return;
119
120         var contextMenu = new WebInspector.ContextMenu();
121         contextMenu.appendItem(WebInspector.UIString("Copy Stack Trace"), this._copyStackTrace.bind(this));
122         contextMenu.show(event);
123     },
124
125     _copyStackTrace: function()
126     {
127         var text = "";
128         for (var i = 0; i < this.placards.length; ++i)
129             text += this.placards[i]._text + "\n";
130         InspectorFrontendHost.copyText(text);
131     },
132
133     registerShortcuts: function(section, registerShortcutDelegate)
134     {
135         var nextCallFrame = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Period,
136             WebInspector.KeyboardShortcut.Modifiers.Ctrl);
137         registerShortcutDelegate(nextCallFrame.key, this._selectNextCallFrameOnStack.bind(this));
138
139         var prevCallFrame = WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Comma,
140             WebInspector.KeyboardShortcut.Modifiers.Ctrl);
141         registerShortcutDelegate(prevCallFrame.key, this._selectPreviousCallFrameOnStack.bind(this));
142
143         section.addRelatedKeys([ nextCallFrame.name, prevCallFrame.name ], WebInspector.UIString("Next/previous call frame"));
144     },
145
146     setStatus: function(status)
147     {
148         var statusMessageElement = document.createElement("div");
149         statusMessageElement.className = "info";
150         if (typeof status === "string")
151             statusMessageElement.textContent = status;
152         else
153             statusMessageElement.appendChild(status);
154         this.bodyElement.appendChild(statusMessageElement);
155     }
156 }
157
158 WebInspector.CallStackSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;