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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.Execu
tionContextDestroyed, contexts[i]); | 90 this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.Execu
tionContextDestroyed, contexts[i]); |
91 }, | 91 }, |
92 | 92 |
93 /** | 93 /** |
94 * @param {!RuntimeAgent.RemoteObject} payload | 94 * @param {!RuntimeAgent.RemoteObject} payload |
95 * @return {!WebInspector.RemoteObject} | 95 * @return {!WebInspector.RemoteObject} |
96 */ | 96 */ |
97 createRemoteObject: function(payload) | 97 createRemoteObject: function(payload) |
98 { | 98 { |
99 console.assert(typeof payload === "object", "Remote object payload shoul
d only be an object"); | 99 console.assert(typeof payload === "object", "Remote object payload shoul
d only be an object"); |
100 return new WebInspector.RemoteObjectImpl(this.target(), payload.objectId
, payload.type, payload.subtype, payload.value, payload.description, payload.pre
view); | 100 return new WebInspector.RemoteObjectImpl(this.target(), payload.objectId
, payload.type, payload.subtype, payload.value, payload.description, payload.pre
view, payload.language); |
101 }, | 101 }, |
102 | 102 |
103 /** | 103 /** |
104 * @param {!RuntimeAgent.RemoteObject} payload | 104 * @param {!RuntimeAgent.RemoteObject} payload |
105 * @param {!WebInspector.ScopeRef} scopeRef | 105 * @param {!WebInspector.ScopeRef} scopeRef |
106 * @return {!WebInspector.RemoteObject} | 106 * @return {!WebInspector.RemoteObject} |
107 */ | 107 */ |
108 createScopeRemoteObject: function(payload, scopeRef) | 108 createScopeRemoteObject: function(payload, scopeRef) |
109 { | 109 { |
110 return new WebInspector.ScopeRemoteObject(this.target(), payload.objectI
d, scopeRef, payload.type, payload.subtype, payload.value, payload.description,
payload.preview); | 110 return new WebInspector.ScopeRemoteObject(this.target(), payload.objectI
d, scopeRef, payload.type, payload.subtype, payload.value, payload.description,
payload.preview, payload.language); |
111 }, | 111 }, |
112 | 112 |
113 /** | 113 /** |
114 * @param {number|string|boolean} value | 114 * @param {number|string|boolean} value |
115 * @return {!WebInspector.RemoteObject} | 115 * @return {!WebInspector.RemoteObject} |
116 */ | 116 */ |
117 createRemoteObjectFromPrimitiveValue: function(value) | 117 createRemoteObjectFromPrimitiveValue: function(value) |
118 { | 118 { |
119 return new WebInspector.RemoteObjectImpl(this.target(), undefined, typeo
f value, undefined, value); | 119 return new WebInspector.RemoteObjectImpl(this.target(), undefined, typeo
f value, undefined, value); |
120 }, | 120 }, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 | 233 |
234 if (returnByValue) | 234 if (returnByValue) |
235 callback(null, !!wasThrown, wasThrown ? null : result); | 235 callback(null, !!wasThrown, wasThrown ? null : result); |
236 else | 236 else |
237 callback(this.target().runtimeModel.createRemoteObject(result),
!!wasThrown); | 237 callback(this.target().runtimeModel.createRemoteObject(result),
!!wasThrown); |
238 } | 238 } |
239 this.target().runtimeAgent().evaluate(expression, objectGroup, includeCo
mmandLineAPI, doNotPauseOnExceptionsAndMuteConsole, this.id, returnByValue, gene
ratePreview, evalCallback.bind(this)); | 239 this.target().runtimeAgent().evaluate(expression, objectGroup, includeCo
mmandLineAPI, doNotPauseOnExceptionsAndMuteConsole, this.id, returnByValue, gene
ratePreview, evalCallback.bind(this)); |
240 }, | 240 }, |
241 | 241 |
242 /** | 242 /** |
| 243 * @param {string} expression |
| 244 * @param {function(?Protocol.Error, !Array.<!string>)} callback |
| 245 */ |
| 246 getCompletions: function(expression, callback) |
| 247 { |
| 248 var selectedCallFrame = WebInspector.debuggerModel.selectedCallFrame(); |
| 249 |
| 250 // Dart/Modules specific tweak: don't use the call frame if we are |
| 251 // we have explicitly selected an execution context for the console |
| 252 // that is part of a different library than the current call frame. |
| 253 |
| 254 if (selectedCallFrame && |
| 255 (!selectedCallFrame.script || this.libraryId == selectedCallFrame.sc
ript.libraryId)) { |
| 256 selectedCallFrame.getCompletions(expression, callback); |
| 257 return; |
| 258 } |
| 259 |
| 260 this.target().runtimeAgent().getCompletions(expression, this.id, callbac
k); |
| 261 }, |
| 262 |
| 263 /** |
243 * @param {string} expressionString | 264 * @param {string} expressionString |
244 * @param {string} prefix | 265 * @param {string} prefix |
245 * @param {boolean} force | 266 * @param {boolean} force |
246 * @param {function(!Array.<string>, number=)} completionsReadyCallback | 267 * @param {function(!Array.<string>, number=)} completionsReadyCallback |
247 */ | 268 */ |
248 completionsForExpression: function(expressionString, prefix, force, completi
onsReadyCallback) | 269 completionsForExpression: function(expressionString, prefix, force, completi
onsReadyCallback) |
249 { | 270 { |
250 var lastIndex = expressionString.length - 1; | 271 var lastIndex = expressionString.length - 1; |
251 | 272 |
252 var dotNotation = (expressionString[lastIndex] === "."); | 273 var dotNotation = (expressionString[lastIndex] === "."); |
253 var bracketNotation = (expressionString[lastIndex] === "["); | 274 var bracketNotation = (expressionString[lastIndex] === "["); |
254 | 275 |
255 if (dotNotation || bracketNotation) | 276 if (dotNotation || bracketNotation) |
256 expressionString = expressionString.substr(0, lastIndex); | 277 expressionString = expressionString.substr(0, lastIndex); |
257 | 278 |
258 if (expressionString && parseInt(expressionString, 10) == expressionStri
ng) { | 279 if (expressionString && parseInt(expressionString, 10) == expressionStri
ng) { |
259 // User is entering float value, do not suggest anything. | 280 // User is entering float value, do not suggest anything. |
260 completionsReadyCallback([]); | 281 completionsReadyCallback([]); |
261 return; | 282 return; |
262 } | 283 } |
263 | 284 |
264 if (!prefix && !expressionString && !force) { | 285 if (!prefix && !expressionString && !force) { |
265 completionsReadyCallback([]); | 286 completionsReadyCallback([]); |
266 return; | 287 return; |
267 } | 288 } |
268 | 289 |
269 if (!expressionString && this._debuggerModel.selectedCallFrame()) | 290 this.getCompletions(expressionString, receivedPropertyNames.bind(this)); |
270 this._debuggerModel.getSelectedCallFrameVariables(receivedPropertyNa
mes.bind(this)); | |
271 else | |
272 this.evaluate(expressionString, "completion", true, true, false, fal
se, evaluated.bind(this)); | |
273 | 291 |
274 /** | 292 /** |
| 293 * @param {?Protocol.Error} error |
| 294 * @param {!Array.<string>} propertyNamesArray |
275 * @this {WebInspector.ExecutionContext} | 295 * @this {WebInspector.ExecutionContext} |
276 */ | 296 */ |
277 function evaluated(result, wasThrown) | 297 function receivedPropertyNames(error, propertyNamesArray) |
278 { | 298 { |
279 if (!result || wasThrown) { | 299 this.target().runtimeAgent().releaseObjectGroup("completion"); |
| 300 if (error) { |
280 completionsReadyCallback([]); | 301 completionsReadyCallback([]); |
281 return; | 302 return; |
282 } | 303 } |
| 304 var propertyNames = {}; |
| 305 for (var i = 0; i < propertyNamesArray.length; ++i) |
| 306 propertyNames[propertyNamesArray[i]] = true; |
283 | 307 |
284 /** | |
285 * @param {string} primitiveType | |
286 * @suppressReceiverCheck | |
287 * @this {WebInspector.ExecutionContext} | |
288 */ | |
289 function getCompletions(primitiveType) | |
290 { | |
291 var object; | |
292 if (primitiveType === "string") | |
293 object = new String(""); | |
294 else if (primitiveType === "number") | |
295 object = new Number(0); | |
296 else if (primitiveType === "boolean") | |
297 object = new Boolean(false); | |
298 else | |
299 object = this; | |
300 | |
301 var resultSet = {}; | |
302 for (var o = object; o; o = o.__proto__) { | |
303 try { | |
304 var names = Object.getOwnPropertyNames(o); | |
305 for (var i = 0; i < names.length; ++i) | |
306 resultSet[names[i]] = true; | |
307 } catch (e) { | |
308 } | |
309 } | |
310 return resultSet; | |
311 } | |
312 | |
313 if (result.type === "object" || result.type === "function") | |
314 result.callFunctionJSON(getCompletions, undefined, receivedPrope
rtyNames.bind(this)); | |
315 else if (result.type === "string" || result.type === "number" || res
ult.type === "boolean") | |
316 this.evaluate("(" + getCompletions + ")(\"" + result.type + "\")
", "completion", false, true, true, false, receivedPropertyNamesFromEval.bind(th
is)); | |
317 } | |
318 | |
319 /** | |
320 * @param {?WebInspector.RemoteObject} notRelevant | |
321 * @param {boolean} wasThrown | |
322 * @param {?RuntimeAgent.RemoteObject=} result | |
323 * @this {WebInspector.ExecutionContext} | |
324 */ | |
325 function receivedPropertyNamesFromEval(notRelevant, wasThrown, result) | |
326 { | |
327 if (result && !wasThrown) | |
328 receivedPropertyNames.call(this, result.value); | |
329 else | |
330 completionsReadyCallback([]); | |
331 } | |
332 | |
333 /** | |
334 * @this {WebInspector.ExecutionContext} | |
335 */ | |
336 function receivedPropertyNames(propertyNames) | |
337 { | |
338 this.target().runtimeAgent().releaseObjectGroup("completion"); | |
339 if (!propertyNames) { | |
340 completionsReadyCallback([]); | |
341 return; | |
342 } | |
343 var includeCommandLineAPI = (!dotNotation && !bracketNotation); | 308 var includeCommandLineAPI = (!dotNotation && !bracketNotation); |
344 if (includeCommandLineAPI) { | 309 if (includeCommandLineAPI) { |
345 const commandLineAPI = ["dir", "dirxml", "keys", "values", "prof
ile", "profileEnd", "monitorEvents", "unmonitorEvents", "inspect", "copy", "clea
r", | 310 const commandLineAPI = ["dir", "dirxml", "keys", "values", "prof
ile", "profileEnd", "monitorEvents", "unmonitorEvents", "inspect", "copy", "clea
r", |
346 "getEventListeners", "debug", "undebug", "monitor", "unmonit
or", "table", "$", "$$", "$x"]; | 311 "getEventListeners", "debug", "undebug", "monitor", "unmonit
or", "table", "$", "$$", "$x"]; |
347 for (var i = 0; i < commandLineAPI.length; ++i) | 312 for (var i = 0; i < commandLineAPI.length; ++i) |
348 propertyNames[commandLineAPI[i]] = true; | 313 propertyNames[commandLineAPI[i]] = true; |
349 } | 314 } |
350 this._reportCompletions(completionsReadyCallback, dotNotation, brack
etNotation, expressionString, prefix, Object.keys(propertyNames)); | 315 this._reportCompletions(completionsReadyCallback, dotNotation, brack
etNotation, expressionString, prefix, Object.keys(propertyNames)); |
351 } | 316 } |
352 }, | 317 }, |
(...skipping 15 matching lines...) Expand all Loading... |
368 } | 333 } |
369 | 334 |
370 var results = []; | 335 var results = []; |
371 | 336 |
372 if (!expressionString) { | 337 if (!expressionString) { |
373 var selectedCallFrame = WebInspector.debuggerModel.selectedCallFrame
(); | 338 var selectedCallFrame = WebInspector.debuggerModel.selectedCallFrame
(); |
374 var dartContext = false; | 339 var dartContext = false; |
375 if (selectedCallFrame) { | 340 if (selectedCallFrame) { |
376 dartContext = selectedCallFrame.script && selectedCallFrame.scri
pt.language == "Dart"; | 341 dartContext = selectedCallFrame.script && selectedCallFrame.scri
pt.language == "Dart"; |
377 } else { | 342 } else { |
378 dartContext = WebInspector.runtimeModel.currentExecutionContext(
).language == "Dart"; | 343 dartContext = this.language == "Dart"; |
379 } | 344 } |
380 | 345 |
381 if (dartContext) { | 346 if (dartContext) { |
382 // Note we omit get, set, final, class, import, and library as t
hose | 347 // Note we omit get, set, final, class, import, and library as t
hose |
383 // keywords cannot yet be used from the REPL. | 348 // keywords cannot yet be used from the REPL. |
384 const dartKeywords = ["as", "case", "catch", "const", "continue"
, "default", "dynamic", "else", "finally", "for", "if", "in", | 349 const dartKeywords = ["as", "case", "catch", "const", "continue"
, "default", "dynamic", "else", "finally", "for", "if", "in", |
385 "is", "new", "return", "switch", "this", "
throw", "try", "var", "void", "while"]; | 350 "is", "new", "return", "switch", "this", "
throw", "try", "var", "void", "while"]; |
386 properties = properties.concat(dartKeywords); | 351 properties = properties.concat(dartKeywords); |
387 } else { | 352 } else { |
388 const keywords = ["break", "case", "catch", "continue", "default
", "delete", "do", "else", "finally", "for", "function", "if", "in", | 353 const keywords = ["break", "case", "catch", "continue", "default
", "delete", "do", "else", "finally", "for", "function", "if", "in", |
(...skipping 27 matching lines...) Expand all Loading... |
416 completionsReadyCallback(results); | 381 completionsReadyCallback(results); |
417 }, | 382 }, |
418 | 383 |
419 __proto__: WebInspector.TargetAware.prototype | 384 __proto__: WebInspector.TargetAware.prototype |
420 } | 385 } |
421 | 386 |
422 /** | 387 /** |
423 * @type {!WebInspector.RuntimeModel} | 388 * @type {!WebInspector.RuntimeModel} |
424 */ | 389 */ |
425 WebInspector.runtimeModel; | 390 WebInspector.runtimeModel; |
OLD | NEW |