• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2010 Google 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 are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/**
32 * @fileoverview DevTools' implementation of the InspectorController API.
33 */
34
35if (!this.devtools)
36    devtools = {};
37
38devtools.InspectorBackendImpl = function()
39{
40    WebInspector.InspectorBackendStub.call(this);
41    this.installInspectorControllerDelegate_("clearMessages");
42    this.installInspectorControllerDelegate_("copyNode");
43    this.installInspectorControllerDelegate_("deleteCookie");
44    this.installInspectorControllerDelegate_("didEvaluateForTestInFrontend");
45    this.installInspectorControllerDelegate_("disableResourceTracking");
46    this.installInspectorControllerDelegate_("disableTimeline");
47    this.installInspectorControllerDelegate_("enableResourceTracking");
48    this.installInspectorControllerDelegate_("enableTimeline");
49    this.installInspectorControllerDelegate_("getChildNodes");
50    this.installInspectorControllerDelegate_("getCookies");
51    this.installInspectorControllerDelegate_("getDatabaseTableNames");
52    this.installInspectorControllerDelegate_("getDOMStorageEntries");
53    this.installInspectorControllerDelegate_("getEventListenersForNode");
54    this.installInspectorControllerDelegate_("getResourceContent");
55    this.installInspectorControllerDelegate_("highlightDOMNode");
56    this.installInspectorControllerDelegate_("hideDOMNodeHighlight");
57    this.installInspectorControllerDelegate_("releaseWrapperObjectGroup");
58    this.installInspectorControllerDelegate_("removeAttribute");
59    this.installInspectorControllerDelegate_("removeDOMStorageItem");
60    this.installInspectorControllerDelegate_("removeNode");
61    this.installInspectorControllerDelegate_("saveFrontendSettings");
62    this.installInspectorControllerDelegate_("setAttribute");
63    this.installInspectorControllerDelegate_("setDOMStorageItem");
64    this.installInspectorControllerDelegate_("setInjectedScriptSource");
65    this.installInspectorControllerDelegate_("setTextNodeValue");
66    this.installInspectorControllerDelegate_("startTimelineProfiler");
67    this.installInspectorControllerDelegate_("stopTimelineProfiler");
68    this.installInspectorControllerDelegate_("storeLastActivePanel");
69};
70devtools.InspectorBackendImpl.prototype.__proto__ = WebInspector.InspectorBackendStub.prototype;
71
72
73/**
74 * {@inheritDoc}.
75 */
76devtools.InspectorBackendImpl.prototype.toggleNodeSearch = function()
77{
78    WebInspector.InspectorBackendStub.prototype.toggleNodeSearch.call(this);
79    this.callInspectorController_.call(this, "toggleNodeSearch");
80    if (!this.searchingForNode()) {
81        // This is called from ElementsPanel treeOutline's focusNodeChanged().
82        DevToolsHost.activateWindow();
83    }
84};
85
86
87/**
88 * @override
89 */
90devtools.InspectorBackendImpl.prototype.debuggerEnabled = function()
91{
92    return true;
93};
94
95
96/**
97 * @override
98 */
99devtools.InspectorBackendImpl.prototype.profilerEnabled = function()
100{
101    return true;
102};
103
104
105devtools.InspectorBackendImpl.prototype.addBreakpoint = function(sourceID, line, condition)
106{
107    devtools.tools.getDebuggerAgent().addBreakpoint(sourceID, line, condition);
108};
109
110
111devtools.InspectorBackendImpl.prototype.removeBreakpoint = function(sourceID, line)
112{
113    devtools.tools.getDebuggerAgent().removeBreakpoint(sourceID, line);
114};
115
116devtools.InspectorBackendImpl.prototype.updateBreakpoint = function(sourceID, line, condition)
117{
118    devtools.tools.getDebuggerAgent().updateBreakpoint(sourceID, line, condition);
119};
120
121devtools.InspectorBackendImpl.prototype.pauseInDebugger = function()
122{
123    devtools.tools.getDebuggerAgent().pauseExecution();
124};
125
126
127devtools.InspectorBackendImpl.prototype.resumeDebugger = function()
128{
129    devtools.tools.getDebuggerAgent().resumeExecution();
130};
131
132
133devtools.InspectorBackendImpl.prototype.stepIntoStatementInDebugger = function()
134{
135    devtools.tools.getDebuggerAgent().stepIntoStatement();
136};
137
138
139devtools.InspectorBackendImpl.prototype.stepOutOfFunctionInDebugger = function()
140{
141    devtools.tools.getDebuggerAgent().stepOutOfFunction();
142};
143
144
145devtools.InspectorBackendImpl.prototype.stepOverStatementInDebugger = function()
146{
147    devtools.tools.getDebuggerAgent().stepOverStatement();
148};
149
150/**
151 * @override
152 */
153devtools.InspectorBackendImpl.prototype.setPauseOnExceptionsState = function(state)
154{
155    this._setPauseOnExceptionsState = state;
156    // TODO(yurys): support all three states. See http://crbug.com/32877
157    var enabled = (state !== WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
158    return devtools.tools.getDebuggerAgent().setPauseOnExceptions(enabled);
159};
160
161/**
162 * @override
163 */
164devtools.InspectorBackendImpl.prototype.pauseOnExceptionsState = function()
165{
166    return (this._setPauseOnExceptionsState || WebInspector.ScriptsPanel.PauseOnExceptionsState.DontPauseOnExceptions);
167};
168
169/**
170 * @override
171 */
172devtools.InspectorBackendImpl.prototype.pauseOnExceptions = function()
173{
174    return devtools.tools.getDebuggerAgent().pauseOnExceptions();
175};
176
177
178/**
179 * @override
180 */
181devtools.InspectorBackendImpl.prototype.setPauseOnExceptions = function(value)
182{
183    return devtools.tools.getDebuggerAgent().setPauseOnExceptions(value);
184};
185
186
187/**
188 * @override
189 */
190devtools.InspectorBackendImpl.prototype.startProfiling = function()
191{
192    devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
193};
194
195
196/**
197 * @override
198 */
199devtools.InspectorBackendImpl.prototype.stopProfiling = function()
200{
201    devtools.tools.getProfilerAgent().stopProfiling( devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_CPU);
202};
203
204
205/**
206 * @override
207 */
208devtools.InspectorBackendImpl.prototype.getProfileHeaders = function(callId)
209{
210    WebInspector.didGetProfileHeaders(callId, []);
211};
212
213
214/**
215 * Emulate WebKit InspectorController behavior. It stores profiles on renderer side,
216 * and is able to retrieve them by uid using "getProfile".
217 */
218devtools.InspectorBackendImpl.prototype.addFullProfile = function(profile)
219{
220    WebInspector.__fullProfiles = WebInspector.__fullProfiles || {};
221    WebInspector.__fullProfiles[profile.uid] = profile;
222};
223
224
225/**
226 * @override
227 */
228devtools.InspectorBackendImpl.prototype.getProfile = function(callId, uid)
229{
230    if (WebInspector.__fullProfiles && (uid in WebInspector.__fullProfiles))
231        WebInspector.didGetProfile(callId, WebInspector.__fullProfiles[uid]);
232};
233
234
235/**
236 * @override
237 */
238devtools.InspectorBackendImpl.prototype.takeHeapSnapshot = function()
239{
240    devtools.tools.getProfilerAgent().startProfiling(devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_SNAPSHOT
241        | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_HEAP_STATS
242        | devtools.ProfilerAgent.ProfilerModules.PROFILER_MODULE_JS_CONSTRUCTORS);
243};
244
245
246/**
247 * @override
248 */
249devtools.InspectorBackendImpl.prototype.dispatchOnInjectedScript = function(callId, injectedScriptId, methodName, argsString, async)
250{
251    // Encode injectedScriptId into callId
252    if (typeof injectedScriptId !== "number")
253        injectedScriptId = 0;
254    RemoteToolsAgent.dispatchOnInjectedScript(callId, injectedScriptId, methodName, argsString, async);
255};
256
257
258/**
259 * Installs delegating handler into the inspector controller.
260 * @param {string} methodName Method to install delegating handler for.
261 */
262devtools.InspectorBackendImpl.prototype.installInspectorControllerDelegate_ = function(methodName)
263{
264    this[methodName] = this.callInspectorController_.bind(this, methodName);
265};
266
267
268/**
269 * Bound function with the installInjectedScriptDelegate_ actual
270 * implementation.
271 */
272devtools.InspectorBackendImpl.prototype.callInspectorController_ = function(methodName, var_arg)
273{
274    var args = Array.prototype.slice.call(arguments, 1);
275    RemoteToolsAgent.dispatchOnInspectorController(WebInspector.Callback.wrap(function(){}), methodName, JSON.stringify(args));
276};
277
278
279InspectorBackend = new devtools.InspectorBackendImpl();
280