OLD | NEW |
| (Empty) |
1 <import src="debug.sky" as="debug" /> | |
2 <script> | |
3 class Runtime { | |
4 constructor(delegate) { | |
5 this.delegate_ = delegate; | |
6 Object.preventExtensions(this); | |
7 } | |
8 | |
9 enable() { | |
10 this.delegate_.sendMessage("Runtime.executionContextCreated", { | |
11 "context": { | |
12 "frameId": 1, | |
13 "id": 1, | |
14 } | |
15 }); | |
16 return { | |
17 result: true, | |
18 }; | |
19 } | |
20 | |
21 callFunctionOn(params) { | |
22 var object = g_objectRegistry.lookup(params.objectId); | |
23 // This is a horrible hack: | |
24 var functionName = params.functionDeclaration.match(/^function (\w+)\(/)[1]; | |
25 var expression = params.functionDeclaration + "; return " + functionName + "
;"; | |
26 var wasThrown = false; | |
27 var value; | |
28 try { | |
29 var func = new Function('', expression)(); | |
30 value = func(object); | |
31 } catch (e) { | |
32 value = e; | |
33 wasThrown = true; | |
34 } | |
35 | |
36 return makeResult(params, value, wasThrown); | |
37 } | |
38 | |
39 // FIXME: See Blink"s inspected-script-source.js InjectedScript.RemoteObject. | |
40 evaluate(params) { | |
41 var wasThrown = false; | |
42 var value; | |
43 try { | |
44 value = eval(params.expression); | |
45 } catch (e) { | |
46 value = e; | |
47 wasThrown = true; | |
48 } | |
49 | |
50 return makeResult(params, value, wasThrown); | |
51 } | |
52 | |
53 getProperties(params) { | |
54 var properties = injectedScript.getProperties(params.objectId, !!params.ownP
roperties, !!params.accessorPropertiesOnly); | |
55 var result = { | |
56 result: properties | |
57 }; | |
58 if (!params.accessorPropertiesOnly) { | |
59 result.internalProperties = injectedScript.getInternalProperties(params.ob
jectId); | |
60 } | |
61 return result; | |
62 } | |
63 } | |
64 | |
65 // FIXME: This should release all objects associated with an object | |
66 // group, see InjectedScriptSource.js for an example. Just have to | |
67 // track which object ids are associated with which object groups first. | |
68 Runtime.prototype.releaseObjectGroup = debug.loggingStub("releaseObjectGroup"); | |
69 | |
70 // See InjectedScript._bind for a fancier version of this: | |
71 | |
72 class RemoteObjectRegistery { | |
73 constructor() { | |
74 this.lastObjectId = 0; | |
75 this.objectsById = []; | |
76 Object.preventExtensions(this); | |
77 } | |
78 | |
79 register(object) { | |
80 var objectId = ++this.lastObjectId; | |
81 this.objectsById[objectId] = object; | |
82 return String(objectId); | |
83 } | |
84 | |
85 lookup(objectId) { | |
86 return this.objectsById[Number(objectId)]; | |
87 } | |
88 } | |
89 | |
90 var g_objectRegistry = new RemoteObjectRegistery(); | |
91 | |
92 function makeResult(params, value, wasThrown) { | |
93 var type = typeof(value) | |
94 var result = { | |
95 "result": { | |
96 "type": type, | |
97 }, | |
98 "wasThrown": wasThrown, | |
99 }; | |
100 | |
101 // Unclear why this often fails with: | |
102 // "TypeError: Cannot convert object to primitive value" | |
103 try { | |
104 result['result']['description'] = String(value); | |
105 } catch (e) {} | |
106 | |
107 if (type == "object") { | |
108 result["result"]["objectId"] = g_objectRegistry.register(value); | |
109 } | |
110 | |
111 if (params.returnByValue) { | |
112 result["result"]["value"] = value; | |
113 } | |
114 | |
115 if (wasThrown) { | |
116 // If we don"t have exceptionDetails, inspector hits an exception. | |
117 result["exceptionDetails"] = { | |
118 "text": value.message, | |
119 "url": "", | |
120 "line": 0, | |
121 "column": 0, | |
122 "stackTrace": [{ | |
123 "functionName": "", | |
124 "scriptId": "1", | |
125 "url": "", | |
126 "lineNumber": 0, | |
127 "columnNumber": 0 | |
128 }] | |
129 } | |
130 } | |
131 return result; | |
132 } | |
133 | |
134 module.exports = Runtime; | |
135 </script> | |
OLD | NEW |