Index: Source/devtools/front_end/sdk/RuntimeModel.js |
diff --git a/Source/devtools/front_end/sdk/RuntimeModel.js b/Source/devtools/front_end/sdk/RuntimeModel.js |
index 44f8c32c01b7ee86eb0fe3153e64c7d3c95c310e..f402b5a95a147a0d09f312d28fdff537f69c3f80 100644 |
--- a/Source/devtools/front_end/sdk/RuntimeModel.js |
+++ b/Source/devtools/front_end/sdk/RuntimeModel.js |
@@ -37,6 +37,19 @@ WebInspector.RuntimeModel = function(target) |
{ |
WebInspector.SDKModel.call(this, WebInspector.RuntimeModel, target); |
+ /** |
+ * @param {!WebInspector.DebuggerModel.Location} raw |
+ * @suppress {missingProperties} |
+ */ |
+ 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
|
+ if (!WebInspector.debuggerWorkspaceBinding) return; |
+ var loc = WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(raw); |
+ return { |
+ source: loc.uiSourceCode.contentURL(), |
+ line: loc.lineNumber, |
+ column: loc.columnNumber |
+ }; |
+ }; |
this._agent = target.runtimeAgent(); |
this.target().registerRuntimeDispatcher(new WebInspector.RuntimeDispatcher(this)); |
if (target.hasJSContext()) |
@@ -81,7 +94,7 @@ WebInspector.RuntimeModel.prototype = { |
if (context.name == WebInspector.RuntimeModel._privateScript && !context.origin && !Runtime.experiments.isEnabled("privateScriptInspection")) { |
return; |
} |
- var executionContext = new WebInspector.ExecutionContext(this.target(), context.id, context.name, context.origin, !!context.isPageContext, context.frameId); |
+ var executionContext = new WebInspector.ExecutionContext(this.target(), this._locationResolver, context.id, context.name, context.origin, !!context.isPageContext, context.frameId); |
this._executionContextById[executionContext.id] = executionContext; |
this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextCreated, executionContext); |
}, |
@@ -200,15 +213,17 @@ WebInspector.RuntimeDispatcher.prototype = { |
* @constructor |
* @extends {WebInspector.SDKObject} |
* @param {!WebInspector.Target} target |
+ * @param {function(!WebInspector.DebuggerModel.Location): ({source: string, line: number, column: number}|undefined)} locationResolver |
* @param {number|undefined} id |
* @param {string} name |
* @param {string} origin |
* @param {boolean} isPageContext |
* @param {string=} frameId |
*/ |
-WebInspector.ExecutionContext = function(target, id, name, origin, isPageContext, frameId) |
+WebInspector.ExecutionContext = function(target, locationResolver, id, name, origin, isPageContext, frameId) |
{ |
WebInspector.SDKObject.call(this, target); |
+ this._locationResolver = locationResolver; |
this.id = id; |
this.name = name; |
this.origin = origin; |
@@ -322,15 +337,55 @@ WebInspector.ExecutionContext.prototype = { |
} |
this.target().runtimeAgent().evaluate(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, this.id, returnByValue, generatePreview, evalCallback.bind(this)); |
}, |
+ |
+ /** |
+ * @return {({source: string, line: number, column: number}|undefined)} |
+ */ |
+ pauseLocation: function() { |
+ var frame = this.debuggerModel.selectedCallFrame(); |
+ var raw; |
+ if (frame && (raw = frame.location())) { |
+ return this._locationResolver(raw); |
+ } |
+ return; |
+ }, |
/** |
* @param {string} expressionString |
+ * @param {string} text |
+ * @param {number} cursorOffset |
* @param {string} prefix |
* @param {boolean} force |
* @param {function(!Array.<string>, number=)} completionsReadyCallback |
*/ |
- completionsForExpression: function(expressionString, prefix, force, completionsReadyCallback) |
+ completionsForExpression: function(expressionString, text, cursorOffset, prefix, force, completionsReadyCallback) |
{ |
+ 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.
|
+ |
+ function handleDebuggerCompletionsComplete(vals) { |
+ if (!vals) { |
+ completionsReadyCallback([]); |
+ } |
+ completionsReadyCallback(vals.map(function(v) { return v.text; })); |
+ } |
+ |
+ //If possible, ceede to the language service |
+ if (location) { //paused - get active mime from pause location |
+ var mime = WebInspector.ResourceType.mimeFromUrl(location.source); |
+ |
+ if (WebInspector.languageService.handles.debuggerCompletions(mime)) { |
+ WebInspector.languageService.debuggerCompletions(mime, text, cursorOffset, prefix, location).then(handleDebuggerCompletionsComplete); |
+ return; |
+ } |
+ } else { //not paused - get active mime from source pane |
+ var activeDocMime = WebInspector.ResourceType.fromActivePanel(); |
+ |
+ if (WebInspector.languageService.handles.debuggerCompletions(activeDocMime)) { |
+ WebInspector.languageService.debuggerCompletions(activeDocMime, text, cursorOffset, prefix, undefined).then(handleDebuggerCompletionsComplete); |
+ return; |
+ } |
+ } |
+ |
var lastIndex = expressionString.length - 1; |
var dotNotation = (expressionString[lastIndex] === "."); |
@@ -350,8 +405,9 @@ WebInspector.ExecutionContext.prototype = { |
return; |
} |
- if (!expressionString && this.debuggerModel.selectedCallFrame()) |
- this.debuggerModel.selectedCallFrame().variableNames(receivedPropertyNames.bind(this)); |
+ var frame = this.debuggerModel.selectedCallFrame(); |
+ if (!expressionString && frame) |
+ frame.variableNames(receivedPropertyNames.bind(this)); |
else |
this.evaluate(expressionString, "completion", true, true, false, false, evaluated.bind(this)); |