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