Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(497)

Side by Side Diff: third_party/WebKit/Source/core/inspector/InjectedScript.cpp

Issue 1648463002: DevTools: migrate injectedscript from ScriptValue to v8::Global. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 15 matching lines...) Expand all
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 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. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "core/inspector/InjectedScript.h" 31 #include "core/inspector/InjectedScript.h"
32 32
33 #include "bindings/core/v8/ScriptFunctionCall.h" 33 #include "bindings/core/v8/ScriptFunctionCall.h"
34 #include "bindings/core/v8/V8Binding.h" 34 #include "bindings/core/v8/V8Binding.h"
35 #include "core/inspector/InjectedScriptHost.h" 35 #include "core/inspector/InjectedScriptHost.h"
36 #include "core/inspector/InjectedScriptManager.h"
36 #include "core/inspector/InspectorTraceEvents.h" 37 #include "core/inspector/InspectorTraceEvents.h"
37 #include "core/inspector/JSONParser.h" 38 #include "core/inspector/JSONParser.h"
38 #include "core/inspector/RemoteObjectId.h" 39 #include "core/inspector/RemoteObjectId.h"
40 #include "core/inspector/v8/V8Debugger.h"
39 #include "core/inspector/v8/V8DebuggerClient.h" 41 #include "core/inspector/v8/V8DebuggerClient.h"
40 #include "platform/JSONValues.h" 42 #include "platform/JSONValues.h"
41 #include "platform/JSONValuesForV8.h" 43 #include "platform/JSONValuesForV8.h"
42 #include "wtf/text/WTFString.h" 44 #include "wtf/text/WTFString.h"
43 45
44 using blink::TypeBuilder::Array; 46 using blink::TypeBuilder::Array;
45 using blink::TypeBuilder::Debugger::CallFrame; 47 using blink::TypeBuilder::Debugger::CallFrame;
46 using blink::TypeBuilder::Debugger::CollectionEntry; 48 using blink::TypeBuilder::Debugger::CollectionEntry;
47 using blink::TypeBuilder::Debugger::FunctionDetails; 49 using blink::TypeBuilder::Debugger::FunctionDetails;
48 using blink::TypeBuilder::Debugger::GeneratorObjectDetails; 50 using blink::TypeBuilder::Debugger::GeneratorObjectDetails;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 101
100 frames->addItem(callFrame.release()); 102 frames->addItem(callFrame.release());
101 } 103 }
102 exceptionDetails->setStackTrace(frames.release()); 104 exceptionDetails->setStackTrace(frames.release());
103 } 105 }
104 if (originScriptId) 106 if (originScriptId)
105 exceptionDetails->setScriptId(String::number(originScriptId)); 107 exceptionDetails->setScriptId(String::number(originScriptId));
106 return exceptionDetails.release(); 108 return exceptionDetails.release();
107 } 109 }
108 110
109 InjectedScript::InjectedScript(v8::Local<v8::Object> injectedScriptObject, V8Deb uggerClient* client, PassRefPtr<InjectedScriptNative> injectedScriptNative, int contextId) 111 static void weakCallback(const v8::WeakCallbackInfo<InjectedScript>& data)
110 : m_isolate(injectedScriptObject->CreationContext()->GetIsolate()) 112 {
111 , m_injectedScriptObject(ScriptValue(ScriptState::from(injectedScriptObject- >CreationContext()), injectedScriptObject)) 113 data.GetParameter()->dispose();
114 }
115
116 InjectedScript::InjectedScript(InjectedScriptManager* manager, v8::Local<v8::Con text> context, v8::Local<v8::Object> object, V8DebuggerClient* client, PassRefPt r<InjectedScriptNative> injectedScriptNative, int contextId)
117 : m_manager(manager)
118 , m_isolate(context->GetIsolate())
119 , m_context(m_isolate, context)
120 , m_value(m_isolate, object)
112 , m_client(client) 121 , m_client(client)
113 , m_native(injectedScriptNative) 122 , m_native(injectedScriptNative)
114 , m_contextId(contextId) 123 , m_contextId(contextId)
115 { 124 {
125 m_context.SetWeak(this, &weakCallback, v8::WeakCallbackType::kParameter);
dgozman 2016/01/27 22:05:47 You can pass context here as v8::Global already, a
pfeldman 2016/01/27 22:15:45 Not a fan of passing a weak global - it is not cle
116 } 126 }
117 127
118 InjectedScript::~InjectedScript() 128 InjectedScript::~InjectedScript()
119 { 129 {
120 } 130 }
121 131
122 void InjectedScript::evaluate(ErrorString* errorString, const String& expression , const String& objectGroup, bool includeCommandLineAPI, bool returnByValue, boo l generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuild er::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) 132 void InjectedScript::evaluate(ErrorString* errorString, const String& expression , const String& objectGroup, bool includeCommandLineAPI, bool returnByValue, boo l generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuild er::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails)
123 { 133 {
124 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 134 v8::HandleScope handles(m_isolate);
125 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "evaluate"); 135 ScriptFunctionCall function(m_client, context(), v8Value(), "evaluate");
126 function.appendArgument(expression); 136 function.appendArgument(expression);
127 function.appendArgument(objectGroup); 137 function.appendArgument(objectGroup);
128 function.appendArgument(includeCommandLineAPI); 138 function.appendArgument(includeCommandLineAPI);
129 function.appendArgument(returnByValue); 139 function.appendArgument(returnByValue);
130 function.appendArgument(generatePreview); 140 function.appendArgument(generatePreview);
131 makeEvalCall(errorString, function, result, wasThrown, exceptionDetails); 141 makeEvalCall(errorString, function, result, wasThrown, exceptionDetails);
132 } 142 }
133 143
134 void InjectedScript::callFunctionOn(ErrorString* errorString, const String& obje ctId, const String& expression, const String& arguments, bool returnByValue, boo l generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuild er::OptOutput<bool>* wasThrown) 144 void InjectedScript::callFunctionOn(ErrorString* errorString, const String& obje ctId, const String& expression, const String& arguments, bool returnByValue, boo l generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuild er::OptOutput<bool>* wasThrown)
135 { 145 {
136 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 146 v8::HandleScope handles(m_isolate);
137 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "callFunctionO n"); 147 ScriptFunctionCall function(m_client, context(), v8Value(), "callFunctionOn" );
138 function.appendArgument(objectId); 148 function.appendArgument(objectId);
139 function.appendArgument(expression); 149 function.appendArgument(expression);
140 function.appendArgument(arguments); 150 function.appendArgument(arguments);
141 function.appendArgument(returnByValue); 151 function.appendArgument(returnByValue);
142 function.appendArgument(generatePreview); 152 function.appendArgument(generatePreview);
143 makeEvalCall(errorString, function, result, wasThrown); 153 makeEvalCall(errorString, function, result, wasThrown);
144 } 154 }
145 155
146 void InjectedScript::evaluateOnCallFrame(ErrorString* errorString, v8::Local<v8: :Object> callFrames, bool isAsyncCallStack, const String& callFrameId, const Str ing& expression, const String& objectGroup, bool includeCommandLineAPI, bool ret urnByValue, bool generatePreview, RefPtr<RemoteObject>* result, TypeBuilder::Opt Output<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* except ionDetails) 156 void InjectedScript::evaluateOnCallFrame(ErrorString* errorString, v8::Local<v8: :Object> callFrames, bool isAsyncCallStack, const String& callFrameId, const Str ing& expression, const String& objectGroup, bool includeCommandLineAPI, bool ret urnByValue, bool generatePreview, RefPtr<RemoteObject>* result, TypeBuilder::Opt Output<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* except ionDetails)
147 { 157 {
148 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 158 v8::HandleScope handles(m_isolate);
149 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "evaluateOnCal lFrame"); 159 ScriptFunctionCall function(m_client, context(), v8Value(), "evaluateOnCallF rame");
150 function.appendArgument(callFrames); 160 function.appendArgument(callFrames);
151 function.appendArgument(isAsyncCallStack); 161 function.appendArgument(isAsyncCallStack);
152 function.appendArgument(callFrameId); 162 function.appendArgument(callFrameId);
153 function.appendArgument(expression); 163 function.appendArgument(expression);
154 function.appendArgument(objectGroup); 164 function.appendArgument(objectGroup);
155 function.appendArgument(includeCommandLineAPI); 165 function.appendArgument(includeCommandLineAPI);
156 function.appendArgument(returnByValue); 166 function.appendArgument(returnByValue);
157 function.appendArgument(generatePreview); 167 function.appendArgument(generatePreview);
158 makeEvalCall(errorString, function, result, wasThrown, exceptionDetails); 168 makeEvalCall(errorString, function, result, wasThrown, exceptionDetails);
159 } 169 }
160 170
161 void InjectedScript::restartFrame(ErrorString* errorString, v8::Local<v8::Object > callFrames, const String& callFrameId) 171 void InjectedScript::restartFrame(ErrorString* errorString, v8::Local<v8::Object > callFrames, const String& callFrameId)
162 { 172 {
163 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 173 v8::HandleScope handles(m_isolate);
164 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "restartFrame" ); 174 ScriptFunctionCall function(m_client, context(), v8Value(), "restartFrame");
165 function.appendArgument(callFrames); 175 function.appendArgument(callFrames);
166 function.appendArgument(callFrameId); 176 function.appendArgument(callFrameId);
167 RefPtr<JSONValue> resultValue; 177 RefPtr<JSONValue> resultValue;
168 makeCall(function, &resultValue); 178 makeCall(function, &resultValue);
169 if (resultValue) { 179 if (resultValue) {
170 if (resultValue->type() == JSONValue::TypeString) { 180 if (resultValue->type() == JSONValue::TypeString) {
171 resultValue->asString(errorString); 181 resultValue->asString(errorString);
172 } else { 182 } else {
173 bool value; 183 bool value;
174 ASSERT_UNUSED(value, resultValue->asBoolean(&value) && value); 184 ASSERT_UNUSED(value, resultValue->asBoolean(&value) && value);
175 } 185 }
176 return; 186 return;
177 } 187 }
178 *errorString = "Internal error"; 188 *errorString = "Internal error";
179 } 189 }
180 190
181 void InjectedScript::getStepInPositions(ErrorString* errorString, v8::Local<v8:: Object> callFrames, const String& callFrameId, RefPtr<Array<TypeBuilder::Debugge r::Location>>& positions) 191 void InjectedScript::getStepInPositions(ErrorString* errorString, v8::Local<v8:: Object> callFrames, const String& callFrameId, RefPtr<Array<TypeBuilder::Debugge r::Location>>& positions)
182 { 192 {
183 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 193 v8::HandleScope handles(m_isolate);
184 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "getStepInPosi tions"); 194 ScriptFunctionCall function(m_client, context(), v8Value(), "getStepInPositi ons");
185 function.appendArgument(callFrames); 195 function.appendArgument(callFrames);
186 function.appendArgument(callFrameId); 196 function.appendArgument(callFrameId);
187 RefPtr<JSONValue> resultValue; 197 RefPtr<JSONValue> resultValue;
188 makeCall(function, &resultValue); 198 makeCall(function, &resultValue);
189 if (resultValue) { 199 if (resultValue) {
190 if (resultValue->type() == JSONValue::TypeString) { 200 if (resultValue->type() == JSONValue::TypeString) {
191 resultValue->asString(errorString); 201 resultValue->asString(errorString);
192 return; 202 return;
193 } 203 }
194 if (resultValue->type() == JSONValue::TypeArray) { 204 if (resultValue->type() == JSONValue::TypeArray) {
195 positions = Array<TypeBuilder::Debugger::Location>::runtimeCast(resu ltValue); 205 positions = Array<TypeBuilder::Debugger::Location>::runtimeCast(resu ltValue);
196 return; 206 return;
197 } 207 }
198 } 208 }
199 *errorString = "Internal error"; 209 *errorString = "Internal error";
200 } 210 }
201 211
202 void InjectedScript::setVariableValue(ErrorString* errorString, v8::Local<v8::Ob ject> callFrames, const String* callFrameIdOpt, const String* functionObjectIdOp t, int scopeNumber, const String& variableName, const String& newValueStr) 212 void InjectedScript::setVariableValue(ErrorString* errorString, v8::Local<v8::Ob ject> callFrames, const String* callFrameIdOpt, const String* functionObjectIdOp t, int scopeNumber, const String& variableName, const String& newValueStr)
203 { 213 {
204 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 214 v8::HandleScope handles(m_isolate);
205 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "setVariableVa lue"); 215 ScriptFunctionCall function(m_client, context(), v8Value(), "setVariableValu e");
206 if (callFrameIdOpt) { 216 if (callFrameIdOpt) {
207 function.appendArgument(callFrames); 217 function.appendArgument(callFrames);
208 function.appendArgument(*callFrameIdOpt); 218 function.appendArgument(*callFrameIdOpt);
209 } else { 219 } else {
210 function.appendArgument(false); 220 function.appendArgument(false);
211 function.appendArgument(false); 221 function.appendArgument(false);
212 } 222 }
213 if (functionObjectIdOpt) 223 if (functionObjectIdOpt)
214 function.appendArgument(*functionObjectIdOpt); 224 function.appendArgument(*functionObjectIdOpt);
215 else 225 else
216 function.appendArgument(false); 226 function.appendArgument(false);
217 function.appendArgument(scopeNumber); 227 function.appendArgument(scopeNumber);
218 function.appendArgument(variableName); 228 function.appendArgument(variableName);
219 function.appendArgument(newValueStr); 229 function.appendArgument(newValueStr);
220 RefPtr<JSONValue> resultValue; 230 RefPtr<JSONValue> resultValue;
221 makeCall(function, &resultValue); 231 makeCall(function, &resultValue);
222 if (!resultValue) { 232 if (!resultValue) {
223 *errorString = "Internal error"; 233 *errorString = "Internal error";
224 return; 234 return;
225 } 235 }
226 if (resultValue->type() == JSONValue::TypeString) { 236 if (resultValue->type() == JSONValue::TypeString) {
227 resultValue->asString(errorString); 237 resultValue->asString(errorString);
228 return; 238 return;
229 } 239 }
230 // Normal return. 240 // Normal return.
231 } 241 }
232 242
233 void InjectedScript::getFunctionDetails(ErrorString* errorString, const String& functionId, RefPtr<FunctionDetails>* result) 243 void InjectedScript::getFunctionDetails(ErrorString* errorString, const String& functionId, RefPtr<FunctionDetails>* result)
234 { 244 {
235 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 245 v8::HandleScope handles(m_isolate);
236 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "getFunctionDe tails"); 246 ScriptFunctionCall function(m_client, context(), v8Value(), "getFunctionDeta ils");
237 function.appendArgument(functionId); 247 function.appendArgument(functionId);
238 RefPtr<JSONValue> resultValue; 248 RefPtr<JSONValue> resultValue;
239 makeCall(function, &resultValue); 249 makeCall(function, &resultValue);
240 if (!resultValue || resultValue->type() != JSONValue::TypeObject) { 250 if (!resultValue || resultValue->type() != JSONValue::TypeObject) {
241 if (!resultValue->asString(errorString)) 251 if (!resultValue->asString(errorString))
242 *errorString = "Internal error"; 252 *errorString = "Internal error";
243 return; 253 return;
244 } 254 }
245 *result = FunctionDetails::runtimeCast(resultValue); 255 *result = FunctionDetails::runtimeCast(resultValue);
246 } 256 }
247 257
248 void InjectedScript::getGeneratorObjectDetails(ErrorString* errorString, const S tring& objectId, RefPtr<GeneratorObjectDetails>* result) 258 void InjectedScript::getGeneratorObjectDetails(ErrorString* errorString, const S tring& objectId, RefPtr<GeneratorObjectDetails>* result)
249 { 259 {
250 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 260 v8::HandleScope handles(m_isolate);
251 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "getGeneratorO bjectDetails"); 261 ScriptFunctionCall function(m_client, context(), v8Value(), "getGeneratorObj ectDetails");
252 function.appendArgument(objectId); 262 function.appendArgument(objectId);
253 RefPtr<JSONValue> resultValue; 263 RefPtr<JSONValue> resultValue;
254 makeCall(function, &resultValue); 264 makeCall(function, &resultValue);
255 if (!resultValue || resultValue->type() != JSONValue::TypeObject) { 265 if (!resultValue || resultValue->type() != JSONValue::TypeObject) {
256 if (!resultValue->asString(errorString)) 266 if (!resultValue->asString(errorString))
257 *errorString = "Internal error"; 267 *errorString = "Internal error";
258 return; 268 return;
259 } 269 }
260 *result = GeneratorObjectDetails::runtimeCast(resultValue); 270 *result = GeneratorObjectDetails::runtimeCast(resultValue);
261 } 271 }
262 272
263 void InjectedScript::getCollectionEntries(ErrorString* errorString, const String & objectId, RefPtr<Array<CollectionEntry> >* result) 273 void InjectedScript::getCollectionEntries(ErrorString* errorString, const String & objectId, RefPtr<Array<CollectionEntry> >* result)
264 { 274 {
265 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 275 v8::HandleScope handles(m_isolate);
266 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "getCollection Entries"); 276 ScriptFunctionCall function(m_client, context(), v8Value(), "getCollectionEn tries");
267 function.appendArgument(objectId); 277 function.appendArgument(objectId);
268 RefPtr<JSONValue> resultValue; 278 RefPtr<JSONValue> resultValue;
269 makeCall(function, &resultValue); 279 makeCall(function, &resultValue);
270 if (!resultValue || resultValue->type() != JSONValue::TypeArray) { 280 if (!resultValue || resultValue->type() != JSONValue::TypeArray) {
271 if (!resultValue->asString(errorString)) 281 if (!resultValue->asString(errorString))
272 *errorString = "Internal error"; 282 *errorString = "Internal error";
273 return; 283 return;
274 } 284 }
275 *result = Array<CollectionEntry>::runtimeCast(resultValue); 285 *result = Array<CollectionEntry>::runtimeCast(resultValue);
276 } 286 }
277 287
278 void InjectedScript::getProperties(ErrorString* errorString, const String& objec tId, bool ownProperties, bool accessorPropertiesOnly, bool generatePreview, RefP tr<Array<PropertyDescriptor>>* properties, RefPtr<TypeBuilder::Debugger::Excepti onDetails>* exceptionDetails) 288 void InjectedScript::getProperties(ErrorString* errorString, const String& objec tId, bool ownProperties, bool accessorPropertiesOnly, bool generatePreview, RefP tr<Array<PropertyDescriptor>>* properties, RefPtr<TypeBuilder::Debugger::Excepti onDetails>* exceptionDetails)
279 { 289 {
280 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 290 v8::HandleScope handles(m_isolate);
281 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "getProperties "); 291 ScriptFunctionCall function(m_client, context(), v8Value(), "getProperties") ;
282 function.appendArgument(objectId); 292 function.appendArgument(objectId);
283 function.appendArgument(ownProperties); 293 function.appendArgument(ownProperties);
284 function.appendArgument(accessorPropertiesOnly); 294 function.appendArgument(accessorPropertiesOnly);
285 function.appendArgument(generatePreview); 295 function.appendArgument(generatePreview);
286 296
287 RefPtr<JSONValue> result; 297 RefPtr<JSONValue> result;
288 makeCallWithExceptionDetails(function, &result, exceptionDetails); 298 makeCallWithExceptionDetails(function, &result, exceptionDetails);
289 if (*exceptionDetails) { 299 if (*exceptionDetails) {
290 // FIXME: make properties optional 300 // FIXME: make properties optional
291 *properties = Array<PropertyDescriptor>::create(); 301 *properties = Array<PropertyDescriptor>::create();
292 return; 302 return;
293 } 303 }
294 if (!result || result->type() != JSONValue::TypeArray) { 304 if (!result || result->type() != JSONValue::TypeArray) {
295 *errorString = "Internal error"; 305 *errorString = "Internal error";
296 return; 306 return;
297 } 307 }
298 *properties = Array<PropertyDescriptor>::runtimeCast(result); 308 *properties = Array<PropertyDescriptor>::runtimeCast(result);
299 } 309 }
300 310
301 void InjectedScript::getInternalProperties(ErrorString* errorString, const Strin g& objectId, RefPtr<Array<InternalPropertyDescriptor>>* properties, RefPtr<TypeB uilder::Debugger::ExceptionDetails>* exceptionDetails) 311 void InjectedScript::getInternalProperties(ErrorString* errorString, const Strin g& objectId, RefPtr<Array<InternalPropertyDescriptor>>* properties, RefPtr<TypeB uilder::Debugger::ExceptionDetails>* exceptionDetails)
302 { 312 {
303 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 313 v8::HandleScope handles(m_isolate);
304 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "getInternalPr operties"); 314 ScriptFunctionCall function(m_client, context(), v8Value(), "getInternalProp erties");
305 function.appendArgument(objectId); 315 function.appendArgument(objectId);
306 316
307 RefPtr<JSONValue> result; 317 RefPtr<JSONValue> result;
308 makeCallWithExceptionDetails(function, &result, exceptionDetails); 318 makeCallWithExceptionDetails(function, &result, exceptionDetails);
309 if (*exceptionDetails) 319 if (*exceptionDetails)
310 return; 320 return;
311 if (!result || result->type() != JSONValue::TypeArray) { 321 if (!result || result->type() != JSONValue::TypeArray) {
312 *errorString = "Internal error"; 322 *errorString = "Internal error";
313 return; 323 return;
314 } 324 }
(...skipping 11 matching lines...) Expand all
326 if (!parsedObjectId->asObject(&object)) 336 if (!parsedObjectId->asObject(&object))
327 return; 337 return;
328 int boundId = 0; 338 int boundId = 0;
329 if (!object->getNumber("id", &boundId)) 339 if (!object->getNumber("id", &boundId))
330 return; 340 return;
331 m_native->unbind(boundId); 341 m_native->unbind(boundId);
332 } 342 }
333 343
334 PassRefPtr<Array<CallFrame>> InjectedScript::wrapCallFrames(v8::Local<v8::Object > callFrames, int asyncOrdinal) 344 PassRefPtr<Array<CallFrame>> InjectedScript::wrapCallFrames(v8::Local<v8::Object > callFrames, int asyncOrdinal)
335 { 345 {
336 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 346 v8::HandleScope handles(m_isolate);
337 v8::Local<v8::Context> context = v8Context(); 347 ScriptFunctionCall function(m_client, context(), v8Value(), "wrapCallFrames" );
338 ScriptFunctionCall function(m_client, context, v8Value(), "wrapCallFrames");
339 function.appendArgument(callFrames); 348 function.appendArgument(callFrames);
340 function.appendArgument(asyncOrdinal); 349 function.appendArgument(asyncOrdinal);
341 bool hadException = false; 350 bool hadException = false;
342 v8::Local<v8::Value> callFramesValue = callFunctionWithEvalEnabled(function, hadException); 351 v8::Local<v8::Value> callFramesValue = callFunctionWithEvalEnabled(function, hadException);
343 ASSERT(!hadException); 352 ASSERT(!hadException);
344 RefPtr<JSONValue> result = toJSONValue(context, callFramesValue); 353 RefPtr<JSONValue> result = toJSONValue(context(), callFramesValue);
345 if (result && result->type() == JSONValue::TypeArray) 354 if (result && result->type() == JSONValue::TypeArray)
346 return Array<CallFrame>::runtimeCast(result); 355 return Array<CallFrame>::runtimeCast(result);
347 return Array<CallFrame>::create(); 356 return Array<CallFrame>::create();
348 } 357 }
349 358
350 PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapObject(v8::Lo cal<v8::Value> value, const String& groupName, bool generatePreview) const 359 PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapObject(v8::Lo cal<v8::Value> value, const String& groupName, bool generatePreview) const
351 { 360 {
352 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 361 v8::HandleScope handles(m_isolate);
353 v8::Local<v8::Context> context = v8Context(); 362 ScriptFunctionCall function(m_client, context(), v8Value(), "wrapObject");
354 ScriptFunctionCall function(m_client, context, v8Value(), "wrapObject");
355 function.appendArgument(value); 363 function.appendArgument(value);
356 function.appendArgument(groupName); 364 function.appendArgument(groupName);
357 function.appendArgument(canAccessInspectedWindow()); 365 function.appendArgument(canAccessInspectedWindow());
358 function.appendArgument(generatePreview); 366 function.appendArgument(generatePreview);
359 bool hadException = false; 367 bool hadException = false;
360 v8::Local<v8::Value> r = callFunctionWithEvalEnabled(function, hadException) ; 368 v8::Local<v8::Value> r = callFunctionWithEvalEnabled(function, hadException) ;
361 if (hadException) 369 if (hadException)
362 return nullptr; 370 return nullptr;
363 RefPtr<JSONObject> rawResult = toJSONValue(context, r)->asObject(); 371 RefPtr<JSONObject> rawResult = toJSONValue(context(), r)->asObject();
364 return TypeBuilder::Runtime::RemoteObject::runtimeCast(rawResult); 372 return TypeBuilder::Runtime::RemoteObject::runtimeCast(rawResult);
365 } 373 }
366 374
367 PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapTable(v8::Loc al<v8::Value> table, v8::Local<v8::Value> columns) const 375 PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapTable(v8::Loc al<v8::Value> table, v8::Local<v8::Value> columns) const
368 { 376 {
369 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 377 v8::HandleScope handles(m_isolate);
370 v8::Local<v8::Context> context = v8Context(); 378 ScriptFunctionCall function(m_client, context(), v8Value(), "wrapTable");
371 ScriptFunctionCall function(m_client, context, v8Value(), "wrapTable");
372 function.appendArgument(canAccessInspectedWindow()); 379 function.appendArgument(canAccessInspectedWindow());
373 function.appendArgument(table); 380 function.appendArgument(table);
374 if (columns.IsEmpty()) 381 if (columns.IsEmpty())
375 function.appendArgument(false); 382 function.appendArgument(false);
376 else 383 else
377 function.appendArgument(columns); 384 function.appendArgument(columns);
378 bool hadException = false; 385 bool hadException = false;
379 v8::Local<v8::Value> r = callFunctionWithEvalEnabled(function, hadException ); 386 v8::Local<v8::Value> r = callFunctionWithEvalEnabled(function, hadException );
380 if (hadException) 387 if (hadException)
381 return nullptr; 388 return nullptr;
382 RefPtr<JSONObject> rawResult = toJSONValue(context, r)->asObject(); 389 RefPtr<JSONObject> rawResult = toJSONValue(context(), r)->asObject();
383 return TypeBuilder::Runtime::RemoteObject::runtimeCast(rawResult); 390 return TypeBuilder::Runtime::RemoteObject::runtimeCast(rawResult);
384 } 391 }
385 392
386 v8::Local<v8::Value> InjectedScript::findObject(const RemoteObjectId& objectId) const 393 v8::Local<v8::Value> InjectedScript::findObject(const RemoteObjectId& objectId) const
387 { 394 {
388 return m_native->objectForId(objectId.id()); 395 return m_native->objectForId(objectId.id());
389 } 396 }
390 397
391 String InjectedScript::objectIdToObjectGroupName(const String& objectId) const 398 String InjectedScript::objectIdToObjectGroupName(const String& objectId) const
392 { 399 {
393 RefPtr<JSONValue> parsedObjectId = parseJSON(objectId); 400 RefPtr<JSONValue> parsedObjectId = parseJSON(objectId);
394 if (!parsedObjectId) 401 if (!parsedObjectId)
395 return String(); 402 return String();
396 RefPtr<JSONObject> object; 403 RefPtr<JSONObject> object;
397 if (!parsedObjectId->asObject(&object)) 404 if (!parsedObjectId->asObject(&object))
398 return String(); 405 return String();
399 int boundId = 0; 406 int boundId = 0;
400 if (!object->getNumber("id", &boundId)) 407 if (!object->getNumber("id", &boundId))
401 return String(); 408 return String();
402 return m_native->groupName(boundId); 409 return m_native->groupName(boundId);
403 } 410 }
404 411
405 void InjectedScript::releaseObjectGroup(const String& objectGroup) 412 void InjectedScript::releaseObjectGroup(const String& objectGroup)
406 { 413 {
407 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 414 v8::HandleScope handles(m_isolate);
408 m_native->releaseObjectGroup(objectGroup); 415 m_native->releaseObjectGroup(objectGroup);
409 if (objectGroup == "console") { 416 if (objectGroup == "console") {
410 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "clearLast EvaluationResult"); 417 ScriptFunctionCall function(m_client, context(), v8Value(), "clearLastEv aluationResult");
411 bool hadException = false; 418 bool hadException = false;
412 callFunctionWithEvalEnabled(function, hadException); 419 callFunctionWithEvalEnabled(function, hadException);
413 ASSERT(!hadException); 420 ASSERT(!hadException);
414 } 421 }
415 } 422 }
416 423
417 void InjectedScript::setCustomObjectFormatterEnabled(bool enabled) 424 void InjectedScript::setCustomObjectFormatterEnabled(bool enabled)
418 { 425 {
419 ScriptState::Scope scope(m_injectedScriptObject.scriptState()); 426 v8::HandleScope handles(m_isolate);
420 ScriptFunctionCall function(m_client, v8Context(), v8Value(), "setCustomObje ctFormatterEnabled"); 427 ScriptFunctionCall function(m_client, context(), v8Value(), "setCustomObject FormatterEnabled");
421 function.appendArgument(enabled); 428 function.appendArgument(enabled);
422 RefPtr<JSONValue> result; 429 RefPtr<JSONValue> result;
423 makeCall(function, &result); 430 makeCall(function, &result);
424 } 431 }
425 432
426 bool InjectedScript::canAccessInspectedWindow() const 433 bool InjectedScript::canAccessInspectedWindow() const
427 { 434 {
428 ScriptState* scriptState = m_injectedScriptObject.scriptState(); 435 v8::Local<v8::Context> callingContext = m_isolate->GetCallingContext();
429 return scriptState && m_client->callingContextCanAccessContext(scriptState-> context()); 436 if (callingContext.IsEmpty())
437 return true;
438 return m_client->callingContextCanAccessContext(callingContext, context());
430 } 439 }
431 440
432 v8::Local<v8::Context> InjectedScript::v8Context() const 441 v8::Local<v8::Context> InjectedScript::context() const
433 { 442 {
434 return m_injectedScriptObject.context(); 443 return m_context.Get(m_isolate);
435 } 444 }
436 445
437 v8::Local<v8::Value> InjectedScript::v8Value() const 446 v8::Local<v8::Value> InjectedScript::v8Value() const
438 { 447 {
439 return m_injectedScriptObject.v8Value(); 448 return m_value.Get(m_isolate);
440 } 449 }
441 450
442 v8::Local<v8::Value> InjectedScript::callFunctionWithEvalEnabled(ScriptFunctionC all& function, bool& hadException) const 451 v8::Local<v8::Value> InjectedScript::callFunctionWithEvalEnabled(ScriptFunctionC all& function, bool& hadException) const
443 { 452 {
444 v8::Local<v8::Context> context = v8Context(); 453 v8::Local<v8::Context> localContext = context();
445 bool evalIsDisabled = !context->IsCodeGenerationFromStringsAllowed(); 454 v8::Context::Scope scope(localContext);
455 bool evalIsDisabled = !localContext->IsCodeGenerationFromStringsAllowed();
446 // Temporarily enable allow evals for inspector. 456 // Temporarily enable allow evals for inspector.
447 if (evalIsDisabled) 457 if (evalIsDisabled)
448 context->AllowCodeGenerationFromStrings(true); 458 localContext->AllowCodeGenerationFromStrings(true);
449 v8::Local<v8::Value> resultValue = function.call(hadException); 459 v8::Local<v8::Value> resultValue = function.call(hadException);
450 if (evalIsDisabled) 460 if (evalIsDisabled)
451 context->AllowCodeGenerationFromStrings(false); 461 localContext->AllowCodeGenerationFromStrings(false);
452 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Update Counters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data( )); 462 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Update Counters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data( ));
453 return resultValue; 463 return resultValue;
454 } 464 }
455 465
456 void InjectedScript::makeCall(ScriptFunctionCall& function, RefPtr<JSONValue>* r esult) 466 void InjectedScript::makeCall(ScriptFunctionCall& function, RefPtr<JSONValue>* r esult)
457 { 467 {
458 if (!canAccessInspectedWindow()) { 468 if (!canAccessInspectedWindow()) {
459 *result = JSONValue::null(); 469 *result = JSONString::create("Can not access given context.");
460 return; 470 return;
461 } 471 }
472 v8::TryCatch tryCatch(m_isolate);
dgozman 2016/01/27 22:05:47 Why this?
pfeldman 2016/01/27 22:15:45 I have no idea. I pasted it or multiple cursors of
462 473
463 bool hadException = false; 474 bool hadException = false;
464 v8::Local<v8::Value> resultValue = callFunctionWithEvalEnabled(function, had Exception); 475 v8::Local<v8::Value> resultValue = callFunctionWithEvalEnabled(function, had Exception);
465 476
466 ASSERT(!hadException); 477 ASSERT(!hadException);
467 if (!hadException) { 478 if (!hadException) {
468 *result = toJSONValue(function.context(), resultValue); 479 *result = toJSONValue(function.context(), resultValue);
469 if (!*result) 480 if (!*result)
470 *result = JSONString::create(String::format("Object has too long ref erence chain(must not be longer than %d)", JSONValue::maxDepth)); 481 *result = JSONString::create(String::format("Object has too long ref erence chain(must not be longer than %d)", JSONValue::maxDepth));
471 } else { 482 } else {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 void InjectedScript::makeCallWithExceptionDetails(ScriptFunctionCall& function, RefPtr<JSONValue>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exce ptionDetails) 520 void InjectedScript::makeCallWithExceptionDetails(ScriptFunctionCall& function, RefPtr<JSONValue>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exce ptionDetails)
510 { 521 {
511 v8::TryCatch tryCatch(m_isolate); 522 v8::TryCatch tryCatch(m_isolate);
512 v8::Local<v8::Value> resultValue = function.callWithoutExceptionHandling(); 523 v8::Local<v8::Value> resultValue = function.callWithoutExceptionHandling();
513 if (tryCatch.HasCaught()) { 524 if (tryCatch.HasCaught()) {
514 v8::Local<v8::Message> message = tryCatch.Message(); 525 v8::Local<v8::Message> message = tryCatch.Message();
515 String text = !message.IsEmpty() ? toCoreStringWithUndefinedOrNullCheck( message->Get()) : "Internal error"; 526 String text = !message.IsEmpty() ? toCoreStringWithUndefinedOrNullCheck( message->Get()) : "Internal error";
516 *exceptionDetails = TypeBuilder::Debugger::ExceptionDetails::create().se tText(text); 527 *exceptionDetails = TypeBuilder::Debugger::ExceptionDetails::create().se tText(text);
517 } else { 528 } else {
518 *result = toJSONValue(function.context(), resultValue); 529 *result = toJSONValue(function.context(), resultValue);
519 if (!*result) 530 if (!*result) {
dgozman 2016/01/27 22:05:47 extra {}
pfeldman 2016/01/27 22:15:45 Done.
520 *result = JSONString::create(String::format("Object has too long ref erence chain(must not be longer than %d)", JSONValue::maxDepth)); 531 *result = JSONString::create(String::format("Object has too long ref erence chain(must not be longer than %d)", JSONValue::maxDepth));
532 }
521 } 533 }
522 } 534 }
523 535
536 void InjectedScript::dispose()
537 {
538 m_manager->discardInjectedScript(m_contextId);
539 }
540
524 } // namespace blink 541 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698