 Chromium Code Reviews
 Chromium Code Reviews Issue 1264133002:
  Devtools: [WIP] Implement enhanced devtools extension language APIs 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master
    
  
    Issue 1264133002:
  Devtools: [WIP] Implement enhanced devtools extension language APIs 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master| OLD | NEW | 
|---|---|
| 1 /* | 1 /* | 
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 
| 3 * | 3 * | 
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without | 
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are | 
| 6 * met: | 6 * met: | 
| 7 * | 7 * | 
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright | 
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. | 
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above | 
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 | 30 | 
| 31 /** | 31 /** | 
| 32 * @constructor | 32 * @constructor | 
| 33 * @extends {WebInspector.SDKModel} | 33 * @extends {WebInspector.SDKModel} | 
| 34 * @param {!WebInspector.Target} target | 34 * @param {!WebInspector.Target} target | 
| 35 */ | 35 */ | 
| 36 WebInspector.RuntimeModel = function(target) | 36 WebInspector.RuntimeModel = function(target) | 
| 37 { | 37 { | 
| 38 WebInspector.SDKModel.call(this, WebInspector.RuntimeModel, target); | 38 WebInspector.SDKModel.call(this, WebInspector.RuntimeModel, target); | 
| 39 | 39 | 
| 40 /** | |
| 41 * @param {!WebInspector.DebuggerModel.Location} raw | |
| 42 * @suppress {missingProperties} | |
| 43 */ | |
| 44 this._locationResolver = raw => { | |
| 
pfeldman
2015/08/13 21:15:46
SDK can't depend on the bindings, source mappings
 
wes
2015/08/14 00:55:05
This was literally a hack I threw in the other day
 
pfeldman
2015/08/17 21:15:52
Your _locationResolver looks very similar to the s
 
wes
2015/08/25 18:13:18
Already gone. :3
 | |
| 45 if (!WebInspector.debuggerWorkspaceBinding) return; | |
| 46 var loc = WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation( raw); | |
| 47 return { | |
| 48 source: loc.uiSourceCode.contentURL(), | |
| 49 line: loc.lineNumber, | |
| 50 column: loc.columnNumber | |
| 51 }; | |
| 52 }; | |
| 40 this._agent = target.runtimeAgent(); | 53 this._agent = target.runtimeAgent(); | 
| 41 this.target().registerRuntimeDispatcher(new WebInspector.RuntimeDispatcher(t his)); | 54 this.target().registerRuntimeDispatcher(new WebInspector.RuntimeDispatcher(t his)); | 
| 42 if (target.hasJSContext()) | 55 if (target.hasJSContext()) | 
| 43 this._agent.enable(); | 56 this._agent.enable(); | 
| 44 /** | 57 /** | 
| 45 * @type {!Object.<number, !WebInspector.ExecutionContext>} | 58 * @type {!Object.<number, !WebInspector.ExecutionContext>} | 
| 46 */ | 59 */ | 
| 47 this._executionContextById = {}; | 60 this._executionContextById = {}; | 
| 48 | 61 | 
| 49 if (!Runtime.experiments.isEnabled("customObjectFormatters")) | 62 if (!Runtime.experiments.isEnabled("customObjectFormatters")) | 
| (...skipping 24 matching lines...) Expand all Loading... | |
| 74 | 87 | 
| 75 /** | 88 /** | 
| 76 * @param {!RuntimeAgent.ExecutionContextDescription} context | 89 * @param {!RuntimeAgent.ExecutionContextDescription} context | 
| 77 */ | 90 */ | 
| 78 _executionContextCreated: function(context) | 91 _executionContextCreated: function(context) | 
| 79 { | 92 { | 
| 80 // The private script context should be hidden behind an experiment. | 93 // The private script context should be hidden behind an experiment. | 
| 81 if (context.name == WebInspector.RuntimeModel._privateScript && !context .origin && !Runtime.experiments.isEnabled("privateScriptInspection")) { | 94 if (context.name == WebInspector.RuntimeModel._privateScript && !context .origin && !Runtime.experiments.isEnabled("privateScriptInspection")) { | 
| 82 return; | 95 return; | 
| 83 } | 96 } | 
| 84 var executionContext = new WebInspector.ExecutionContext(this.target(), context.id, context.name, context.origin, !!context.isPageContext, context.frame Id); | 97 var executionContext = new WebInspector.ExecutionContext(this.target(), this._locationResolver, context.id, context.name, context.origin, !!context.isPa geContext, context.frameId); | 
| 85 this._executionContextById[executionContext.id] = executionContext; | 98 this._executionContextById[executionContext.id] = executionContext; | 
| 86 this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.Execution ContextCreated, executionContext); | 99 this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.Execution ContextCreated, executionContext); | 
| 87 }, | 100 }, | 
| 88 | 101 | 
| 89 /** | 102 /** | 
| 90 * @param {number} executionContextId | 103 * @param {number} executionContextId | 
| 91 */ | 104 */ | 
| 92 _executionContextDestroyed: function(executionContextId) | 105 _executionContextDestroyed: function(executionContextId) | 
| 93 { | 106 { | 
| 94 var executionContext = this._executionContextById[executionContextId]; | 107 var executionContext = this._executionContextById[executionContextId]; | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 193 { | 206 { | 
| 194 this._runtimeModel._executionContextsCleared(); | 207 this._runtimeModel._executionContextsCleared(); | 
| 195 } | 208 } | 
| 196 | 209 | 
| 197 } | 210 } | 
| 198 | 211 | 
| 199 /** | 212 /** | 
| 200 * @constructor | 213 * @constructor | 
| 201 * @extends {WebInspector.SDKObject} | 214 * @extends {WebInspector.SDKObject} | 
| 202 * @param {!WebInspector.Target} target | 215 * @param {!WebInspector.Target} target | 
| 216 * @param {function(!WebInspector.DebuggerModel.Location): ({source: string, lin e: number, column: number}|undefined)} locationResolver | |
| 203 * @param {number|undefined} id | 217 * @param {number|undefined} id | 
| 204 * @param {string} name | 218 * @param {string} name | 
| 205 * @param {string} origin | 219 * @param {string} origin | 
| 206 * @param {boolean} isPageContext | 220 * @param {boolean} isPageContext | 
| 207 * @param {string=} frameId | 221 * @param {string=} frameId | 
| 208 */ | 222 */ | 
| 209 WebInspector.ExecutionContext = function(target, id, name, origin, isPageContext , frameId) | 223 WebInspector.ExecutionContext = function(target, locationResolver, id, name, ori gin, isPageContext, frameId) | 
| 210 { | 224 { | 
| 211 WebInspector.SDKObject.call(this, target); | 225 WebInspector.SDKObject.call(this, target); | 
| 226 this._locationResolver = locationResolver; | |
| 212 this.id = id; | 227 this.id = id; | 
| 213 this.name = name; | 228 this.name = name; | 
| 214 this.origin = origin; | 229 this.origin = origin; | 
| 215 this.isMainWorldContext = isPageContext; | 230 this.isMainWorldContext = isPageContext; | 
| 216 this.runtimeModel = target.runtimeModel; | 231 this.runtimeModel = target.runtimeModel; | 
| 217 this.debuggerModel = WebInspector.DebuggerModel.fromTarget(target); | 232 this.debuggerModel = WebInspector.DebuggerModel.fromTarget(target); | 
| 218 this.frameId = frameId; | 233 this.frameId = frameId; | 
| 219 } | 234 } | 
| 220 | 235 | 
| 221 /** | 236 /** | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 315 return; | 330 return; | 
| 316 } | 331 } | 
| 317 | 332 | 
| 318 if (returnByValue) | 333 if (returnByValue) | 
| 319 callback(null, !!wasThrown, wasThrown ? null : result, exception Details); | 334 callback(null, !!wasThrown, wasThrown ? null : result, exception Details); | 
| 320 else | 335 else | 
| 321 callback(this.runtimeModel.createRemoteObject(result), !!wasThro wn, undefined, exceptionDetails); | 336 callback(this.runtimeModel.createRemoteObject(result), !!wasThro wn, undefined, exceptionDetails); | 
| 322 } | 337 } | 
| 323 this.target().runtimeAgent().evaluate(expression, objectGroup, includeCo mmandLineAPI, doNotPauseOnExceptionsAndMuteConsole, this.id, returnByValue, gene ratePreview, evalCallback.bind(this)); | 338 this.target().runtimeAgent().evaluate(expression, objectGroup, includeCo mmandLineAPI, doNotPauseOnExceptionsAndMuteConsole, this.id, returnByValue, gene ratePreview, evalCallback.bind(this)); | 
| 324 }, | 339 }, | 
| 340 | |
| 341 /** | |
| 342 * @return {({source: string, line: number, column: number}|undefined)} | |
| 343 */ | |
| 344 pauseLocation: function() { | |
| 345 var frame = this.debuggerModel.selectedCallFrame(); | |
| 346 var raw; | |
| 347 if (frame && (raw = frame.location())) { | |
| 348 return this._locationResolver(raw); | |
| 349 } | |
| 350 return; | |
| 351 }, | |
| 325 | 352 | 
| 326 /** | 353 /** | 
| 327 * @param {string} expressionString | 354 * @param {string} expressionString | 
| 355 * @param {string} text | |
| 356 * @param {number} cursorOffset | |
| 328 * @param {string} prefix | 357 * @param {string} prefix | 
| 329 * @param {boolean} force | 358 * @param {boolean} force | 
| 330 * @param {function(!Array.<string>, number=)} completionsReadyCallback | 359 * @param {function(!Array.<string>, number=)} completionsReadyCallback | 
| 331 */ | 360 */ | 
| 332 completionsForExpression: function(expressionString, prefix, force, completi onsReadyCallback) | 361 completionsForExpression: function(expressionString, text, cursorOffset, pre fix, force, completionsReadyCallback) | 
| 333 { | 362 { | 
| 363 var location = this.pauseLocation(); | |
| 
pfeldman
2015/08/13 21:15:46
You should transpile expressionString prior to get
 
wes
2015/08/14 00:55:05
Is expressionString supposed to be an identifier f
 
pfeldman
2015/08/17 21:15:52
This would also go into your module
 
wes
2015/08/25 18:13:18
And so it has.
 | |
| 364 | |
| 365 function handleDebuggerCompletionsComplete(vals) { | |
| 366 if (!vals) { | |
| 367 completionsReadyCallback([]); | |
| 368 } | |
| 369 completionsReadyCallback(vals.map(function(v) { return v.text; })); | |
| 370 } | |
| 371 | |
| 372 //If possible, ceede to the language service | |
| 373 if (location) { //paused - get active mime from pause location | |
| 374 var mime = WebInspector.ResourceType.mimeFromUrl(location.source); | |
| 375 | |
| 376 if (WebInspector.languageService.handles.debuggerCompletions(mime)) { | |
| 377 WebInspector.languageService.debuggerCompletions(mime, text, cur sorOffset, prefix, location).then(handleDebuggerCompletionsComplete); | |
| 378 return; | |
| 379 } | |
| 380 } else { //not paused - get active mime from source pane | |
| 381 var activeDocMime = WebInspector.ResourceType.fromActivePanel(); | |
| 382 | |
| 383 if (WebInspector.languageService.handles.debuggerCompletions(activeD ocMime)) { | |
| 384 WebInspector.languageService.debuggerCompletions(activeDocMime, text, cursorOffset, prefix, undefined).then(handleDebuggerCompletionsComplete); | |
| 385 return; | |
| 386 } | |
| 387 } | |
| 388 | |
| 334 var lastIndex = expressionString.length - 1; | 389 var lastIndex = expressionString.length - 1; | 
| 335 | 390 | 
| 336 var dotNotation = (expressionString[lastIndex] === "."); | 391 var dotNotation = (expressionString[lastIndex] === "."); | 
| 337 var bracketNotation = (expressionString[lastIndex] === "["); | 392 var bracketNotation = (expressionString[lastIndex] === "["); | 
| 338 | 393 | 
| 339 if (dotNotation || bracketNotation) | 394 if (dotNotation || bracketNotation) | 
| 340 expressionString = expressionString.substr(0, lastIndex); | 395 expressionString = expressionString.substr(0, lastIndex); | 
| 341 | 396 | 
| 342 if (expressionString && parseInt(expressionString, 10) == expressionStri ng) { | 397 if (expressionString && parseInt(expressionString, 10) == expressionStri ng) { | 
| 343 // User is entering float value, do not suggest anything. | 398 // User is entering float value, do not suggest anything. | 
| 344 completionsReadyCallback([]); | 399 completionsReadyCallback([]); | 
| 345 return; | 400 return; | 
| 346 } | 401 } | 
| 347 | 402 | 
| 348 if (!prefix && !expressionString && !force) { | 403 if (!prefix && !expressionString && !force) { | 
| 349 completionsReadyCallback([]); | 404 completionsReadyCallback([]); | 
| 350 return; | 405 return; | 
| 351 } | 406 } | 
| 352 | 407 | 
| 353 if (!expressionString && this.debuggerModel.selectedCallFrame()) | 408 var frame = this.debuggerModel.selectedCallFrame(); | 
| 354 this.debuggerModel.selectedCallFrame().variableNames(receivedPropert yNames.bind(this)); | 409 if (!expressionString && frame) | 
| 410 frame.variableNames(receivedPropertyNames.bind(this)); | |
| 355 else | 411 else | 
| 356 this.evaluate(expressionString, "completion", true, true, false, fal se, evaluated.bind(this)); | 412 this.evaluate(expressionString, "completion", true, true, false, fal se, evaluated.bind(this)); | 
| 357 | 413 | 
| 358 /** | 414 /** | 
| 359 * @this {WebInspector.ExecutionContext} | 415 * @this {WebInspector.ExecutionContext} | 
| 360 */ | 416 */ | 
| 361 function evaluated(result, wasThrown) | 417 function evaluated(result, wasThrown) | 
| 362 { | 418 { | 
| 363 if (!result || wasThrown) { | 419 if (!result || wasThrown) { | 
| 364 completionsReadyCallback([]); | 420 completionsReadyCallback([]); | 
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 553 /** | 609 /** | 
| 554 * @return {!RuntimeAgent.RemoteObjectId} | 610 * @return {!RuntimeAgent.RemoteObjectId} | 
| 555 */ | 611 */ | 
| 556 objectId: function() | 612 objectId: function() | 
| 557 { | 613 { | 
| 558 return this._objectId; | 614 return this._objectId; | 
| 559 }, | 615 }, | 
| 560 | 616 | 
| 561 __proto__: WebInspector.SDKObject.prototype | 617 __proto__: WebInspector.SDKObject.prototype | 
| 562 } | 618 } | 
| OLD | NEW |