Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 48 namespace v8_inspector { | 48 namespace v8_inspector { |
| 49 | 49 |
| 50 namespace V8RuntimeAgentImplState { | 50 namespace V8RuntimeAgentImplState { |
| 51 static const char customObjectFormatterEnabled[] = | 51 static const char customObjectFormatterEnabled[] = |
| 52 "customObjectFormatterEnabled"; | 52 "customObjectFormatterEnabled"; |
| 53 static const char runtimeEnabled[] = "runtimeEnabled"; | 53 static const char runtimeEnabled[] = "runtimeEnabled"; |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 using protocol::Runtime::RemoteObject; | 56 using protocol::Runtime::RemoteObject; |
| 57 | 57 |
| 58 static bool hasInternalError(ErrorString* errorString, bool hasError) { | |
| 59 if (hasError) *errorString = "Internal error"; | |
| 60 return hasError; | |
| 61 } | |
| 62 | |
| 63 namespace { | 58 namespace { |
| 64 | 59 |
| 65 template <typename Callback> | 60 template <typename Callback> |
| 66 class ProtocolPromiseHandler { | 61 class ProtocolPromiseHandler { |
| 67 public: | 62 public: |
| 68 static void add(V8InspectorImpl* inspector, v8::Local<v8::Context> context, | 63 static void add(V8InspectorImpl* inspector, v8::Local<v8::Context> context, |
| 69 v8::MaybeLocal<v8::Value> value, | 64 v8::MaybeLocal<v8::Value> value, |
| 70 const String16& notPromiseError, int contextGroupId, | 65 const String16& notPromiseError, int contextGroupId, |
| 71 int executionContextId, const String16& objectGroup, | 66 int executionContextId, const String16& objectGroup, |
| 72 bool returnByValue, bool generatePreview, | 67 bool returnByValue, bool generatePreview, |
| 73 std::unique_ptr<Callback> callback) { | 68 std::unique_ptr<Callback> callback) { |
| 74 if (value.IsEmpty()) { | 69 if (value.IsEmpty()) { |
| 75 callback->sendFailure("Internal error"); | 70 callback->sendFailure(Response::InternalError()); |
| 76 return; | 71 return; |
| 77 } | 72 } |
| 78 if (!value.ToLocalChecked()->IsPromise()) { | 73 if (!value.ToLocalChecked()->IsPromise()) { |
| 79 callback->sendFailure(notPromiseError); | 74 callback->sendFailure(Response::Error(notPromiseError)); |
| 80 return; | 75 return; |
| 81 } | 76 } |
| 82 v8::MicrotasksScope microtasks_scope(inspector->isolate(), | 77 v8::MicrotasksScope microtasks_scope(inspector->isolate(), |
| 83 v8::MicrotasksScope::kRunMicrotasks); | 78 v8::MicrotasksScope::kRunMicrotasks); |
| 84 v8::Local<v8::Promise> promise = | 79 v8::Local<v8::Promise> promise = |
| 85 v8::Local<v8::Promise>::Cast(value.ToLocalChecked()); | 80 v8::Local<v8::Promise>::Cast(value.ToLocalChecked()); |
| 86 Callback* rawCallback = callback.get(); | 81 Callback* rawCallback = callback.get(); |
| 87 ProtocolPromiseHandler<Callback>* handler = new ProtocolPromiseHandler( | 82 ProtocolPromiseHandler<Callback>* handler = new ProtocolPromiseHandler( |
| 88 inspector, contextGroupId, executionContextId, objectGroup, | 83 inspector, contextGroupId, executionContextId, objectGroup, |
| 89 returnByValue, generatePreview, std::move(callback)); | 84 returnByValue, generatePreview, std::move(callback)); |
| 90 v8::Local<v8::Value> wrapper = handler->m_wrapper.Get(inspector->isolate()); | 85 v8::Local<v8::Value> wrapper = handler->m_wrapper.Get(inspector->isolate()); |
| 91 | 86 |
| 92 v8::Local<v8::Function> thenCallbackFunction = | 87 v8::Local<v8::Function> thenCallbackFunction = |
| 93 v8::Function::New(context, thenCallback, wrapper, 0, | 88 v8::Function::New(context, thenCallback, wrapper, 0, |
| 94 v8::ConstructorBehavior::kThrow) | 89 v8::ConstructorBehavior::kThrow) |
| 95 .ToLocalChecked(); | 90 .ToLocalChecked(); |
| 96 if (promise->Then(context, thenCallbackFunction).IsEmpty()) { | 91 if (promise->Then(context, thenCallbackFunction).IsEmpty()) { |
| 97 rawCallback->sendFailure("Internal error"); | 92 rawCallback->sendFailure(Response::InternalError()); |
| 98 return; | 93 return; |
| 99 } | 94 } |
| 100 v8::Local<v8::Function> catchCallbackFunction = | 95 v8::Local<v8::Function> catchCallbackFunction = |
| 101 v8::Function::New(context, catchCallback, wrapper, 0, | 96 v8::Function::New(context, catchCallback, wrapper, 0, |
| 102 v8::ConstructorBehavior::kThrow) | 97 v8::ConstructorBehavior::kThrow) |
| 103 .ToLocalChecked(); | 98 .ToLocalChecked(); |
| 104 if (promise->Catch(context, catchCallbackFunction).IsEmpty()) { | 99 if (promise->Catch(context, catchCallbackFunction).IsEmpty()) { |
| 105 rawCallback->sendFailure("Internal error"); | 100 rawCallback->sendFailure(Response::InternalError()); |
| 106 return; | 101 return; |
| 107 } | 102 } |
| 108 } | 103 } |
| 109 | 104 |
| 110 private: | 105 private: |
| 111 static void thenCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { | 106 static void thenCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 112 ProtocolPromiseHandler<Callback>* handler = | 107 ProtocolPromiseHandler<Callback>* handler = |
| 113 static_cast<ProtocolPromiseHandler<Callback>*>( | 108 static_cast<ProtocolPromiseHandler<Callback>*>( |
| 114 info.Data().As<v8::External>()->Value()); | 109 info.Data().As<v8::External>()->Value()); |
| 115 DCHECK(handler); | 110 DCHECK(handler); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 v8::External::New(inspector->isolate(), this)) { | 168 v8::External::New(inspector->isolate(), this)) { |
| 174 m_wrapper.SetWeak(this, cleanup, v8::WeakCallbackType::kParameter); | 169 m_wrapper.SetWeak(this, cleanup, v8::WeakCallbackType::kParameter); |
| 175 } | 170 } |
| 176 | 171 |
| 177 static void cleanup( | 172 static void cleanup( |
| 178 const v8::WeakCallbackInfo<ProtocolPromiseHandler<Callback>>& data) { | 173 const v8::WeakCallbackInfo<ProtocolPromiseHandler<Callback>>& data) { |
| 179 if (!data.GetParameter()->m_wrapper.IsEmpty()) { | 174 if (!data.GetParameter()->m_wrapper.IsEmpty()) { |
| 180 data.GetParameter()->m_wrapper.Reset(); | 175 data.GetParameter()->m_wrapper.Reset(); |
| 181 data.SetSecondPassCallback(cleanup); | 176 data.SetSecondPassCallback(cleanup); |
| 182 } else { | 177 } else { |
| 183 data.GetParameter()->m_callback->sendFailure("Promise was collected"); | 178 data.GetParameter()->m_callback->sendFailure( |
| 179 Response::Error("Promise was collected")); | |
| 184 delete data.GetParameter(); | 180 delete data.GetParameter(); |
| 185 } | 181 } |
| 186 } | 182 } |
| 187 | 183 |
| 188 std::unique_ptr<protocol::Runtime::RemoteObject> wrapObject( | 184 std::unique_ptr<protocol::Runtime::RemoteObject> wrapObject( |
| 189 v8::Local<v8::Value> value) { | 185 v8::Local<v8::Value> value) { |
| 190 ErrorString errorString; | 186 InjectedScript::ContextScope scope(m_inspector, m_contextGroupId, |
| 191 InjectedScript::ContextScope scope(&errorString, m_inspector, | 187 m_executionContextId); |
| 192 m_contextGroupId, m_executionContextId); | 188 Response response = scope.initialize(); |
| 193 if (!scope.initialize()) { | 189 if (!response.isSuccess()) { |
| 194 m_callback->sendFailure(errorString); | 190 m_callback->sendFailure(response); |
| 195 return nullptr; | 191 return nullptr; |
| 196 } | 192 } |
| 197 std::unique_ptr<protocol::Runtime::RemoteObject> wrappedValue = | 193 std::unique_ptr<protocol::Runtime::RemoteObject> wrappedValue; |
| 198 scope.injectedScript()->wrapObject(&errorString, value, m_objectGroup, | 194 response = scope.injectedScript()->wrapObject( |
| 199 m_returnByValue, m_generatePreview); | 195 value, m_objectGroup, m_returnByValue, m_generatePreview, wrappedValue); |
| 200 if (!wrappedValue) { | 196 if (!response.isSuccess()) { |
| 201 m_callback->sendFailure(errorString); | 197 m_callback->sendFailure(response); |
| 202 return nullptr; | 198 return nullptr; |
| 203 } | 199 } |
| 204 return wrappedValue; | 200 return wrappedValue; |
| 205 } | 201 } |
| 206 | 202 |
| 207 V8InspectorImpl* m_inspector; | 203 V8InspectorImpl* m_inspector; |
| 208 int m_contextGroupId; | 204 int m_contextGroupId; |
| 209 int m_executionContextId; | 205 int m_executionContextId; |
| 210 String16 m_objectGroup; | 206 String16 m_objectGroup; |
| 211 bool m_returnByValue; | 207 bool m_returnByValue; |
| 212 bool m_generatePreview; | 208 bool m_generatePreview; |
| 213 std::unique_ptr<Callback> m_callback; | 209 std::unique_ptr<Callback> m_callback; |
| 214 v8::Global<v8::External> m_wrapper; | 210 v8::Global<v8::External> m_wrapper; |
| 215 }; | 211 }; |
| 216 | 212 |
| 217 template <typename Callback> | 213 template <typename Callback> |
| 218 bool wrapEvaluateResultAsync(InjectedScript* injectedScript, | 214 bool wrapEvaluateResultAsync(InjectedScript* injectedScript, |
| 219 v8::MaybeLocal<v8::Value> maybeResultValue, | 215 v8::MaybeLocal<v8::Value> maybeResultValue, |
| 220 const v8::TryCatch& tryCatch, | 216 const v8::TryCatch& tryCatch, |
| 221 const String16& objectGroup, bool returnByValue, | 217 const String16& objectGroup, bool returnByValue, |
| 222 bool generatePreview, Callback* callback) { | 218 bool generatePreview, Callback* callback) { |
| 223 std::unique_ptr<RemoteObject> result; | 219 std::unique_ptr<RemoteObject> result; |
| 224 Maybe<protocol::Runtime::ExceptionDetails> exceptionDetails; | 220 Maybe<protocol::Runtime::ExceptionDetails> exceptionDetails; |
| 225 | 221 |
| 226 ErrorString errorString; | 222 Response response = injectedScript->wrapEvaluateResult( |
| 227 injectedScript->wrapEvaluateResult( | 223 maybeResultValue, tryCatch, objectGroup, returnByValue, generatePreview, |
| 228 &errorString, maybeResultValue, tryCatch, objectGroup, returnByValue, | 224 &result, &exceptionDetails); |
| 229 generatePreview, &result, &exceptionDetails); | 225 if (response.isSuccess()) { |
| 230 if (errorString.isEmpty()) { | 226 callback->sendSuccess(std::move(result), std::move(exceptionDetails)); |
| 231 callback->sendSuccess(std::move(result), exceptionDetails); | |
| 232 return true; | 227 return true; |
| 233 } | 228 } |
| 234 callback->sendFailure(errorString); | 229 callback->sendFailure(response); |
| 235 return false; | 230 return false; |
| 236 } | 231 } |
| 237 | 232 |
| 238 int ensureContext(ErrorString* errorString, V8InspectorImpl* inspector, | 233 Response ensureContext(V8InspectorImpl* inspector, int contextGroupId, |
| 239 int contextGroupId, const Maybe<int>& executionContextId) { | 234 Maybe<int> executionContextId, int& contextId) { |
|
dgozman
2016/11/02 19:54:00
int* contextId
kozy
2016/11/02 22:45:13
Done.
| |
| 240 int contextId; | |
| 241 if (executionContextId.isJust()) { | 235 if (executionContextId.isJust()) { |
| 242 contextId = executionContextId.fromJust(); | 236 contextId = executionContextId.fromJust(); |
| 243 } else { | 237 } else { |
| 244 v8::HandleScope handles(inspector->isolate()); | 238 v8::HandleScope handles(inspector->isolate()); |
| 245 v8::Local<v8::Context> defaultContext = | 239 v8::Local<v8::Context> defaultContext = |
| 246 inspector->client()->ensureDefaultContextInGroup(contextGroupId); | 240 inspector->client()->ensureDefaultContextInGroup(contextGroupId); |
| 247 if (defaultContext.IsEmpty()) { | 241 if (defaultContext.IsEmpty()) |
| 248 *errorString = "Cannot find default execution context"; | 242 return Response::Error("Cannot find default execution context"); |
| 249 return 0; | |
| 250 } | |
| 251 contextId = V8Debugger::contextId(defaultContext); | 243 contextId = V8Debugger::contextId(defaultContext); |
| 252 } | 244 } |
| 253 return contextId; | 245 return Response::OK(); |
| 254 } | 246 } |
| 255 | 247 |
| 256 } // namespace | 248 } // namespace |
| 257 | 249 |
| 258 V8RuntimeAgentImpl::V8RuntimeAgentImpl( | 250 V8RuntimeAgentImpl::V8RuntimeAgentImpl( |
| 259 V8InspectorSessionImpl* session, protocol::FrontendChannel* FrontendChannel, | 251 V8InspectorSessionImpl* session, protocol::FrontendChannel* FrontendChannel, |
| 260 protocol::DictionaryValue* state) | 252 protocol::DictionaryValue* state) |
| 261 : m_session(session), | 253 : m_session(session), |
| 262 m_state(state), | 254 m_state(state), |
| 263 m_frontend(FrontendChannel), | 255 m_frontend(FrontendChannel), |
| 264 m_inspector(session->inspector()), | 256 m_inspector(session->inspector()), |
| 265 m_enabled(false) {} | 257 m_enabled(false) {} |
| 266 | 258 |
| 267 V8RuntimeAgentImpl::~V8RuntimeAgentImpl() {} | 259 V8RuntimeAgentImpl::~V8RuntimeAgentImpl() {} |
| 268 | 260 |
| 269 void V8RuntimeAgentImpl::evaluate( | 261 void V8RuntimeAgentImpl::evaluate( |
| 270 const String16& expression, const Maybe<String16>& objectGroup, | 262 const String16& expression, Maybe<String16> objectGroup, |
| 271 const Maybe<bool>& includeCommandLineAPI, const Maybe<bool>& silent, | 263 Maybe<bool> includeCommandLineAPI, Maybe<bool> silent, |
| 272 const Maybe<int>& executionContextId, const Maybe<bool>& returnByValue, | 264 Maybe<int> executionContextId, Maybe<bool> returnByValue, |
| 273 const Maybe<bool>& generatePreview, const Maybe<bool>& userGesture, | 265 Maybe<bool> generatePreview, Maybe<bool> userGesture, |
| 274 const Maybe<bool>& awaitPromise, | 266 Maybe<bool> awaitPromise, std::unique_ptr<EvaluateCallback> callback) { |
| 275 std::unique_ptr<EvaluateCallback> callback) { | |
| 276 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), | 267 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), |
| 277 "EvaluateScript"); | 268 "EvaluateScript"); |
| 278 ErrorString errorString; | 269 int contextId = 0; |
| 279 int contextId = | 270 Response response = ensureContext(m_inspector, m_session->contextGroupId(), |
| 280 ensureContext(&errorString, m_inspector, m_session->contextGroupId(), | 271 std::move(executionContextId), contextId); |
| 281 executionContextId); | 272 if (!response.isSuccess()) { |
| 282 if (!errorString.isEmpty()) { | 273 callback->sendFailure(response); |
| 283 callback->sendFailure(errorString); | |
| 284 return; | 274 return; |
| 285 } | 275 } |
| 286 | 276 |
| 287 InjectedScript::ContextScope scope(&errorString, m_inspector, | 277 InjectedScript::ContextScope scope(m_inspector, m_session->contextGroupId(), |
| 288 m_session->contextGroupId(), contextId); | 278 contextId); |
| 289 if (!scope.initialize()) { | 279 response = scope.initialize(); |
| 290 callback->sendFailure(errorString); | 280 if (!response.isSuccess()) { |
| 281 callback->sendFailure(response); | |
| 291 return; | 282 return; |
| 292 } | 283 } |
| 293 | 284 |
| 294 if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); | 285 if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); |
| 295 if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); | 286 if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); |
| 296 | 287 |
| 297 if (includeCommandLineAPI.fromMaybe(false) && | 288 if (includeCommandLineAPI.fromMaybe(false)) scope.installCommandLineAPI(); |
| 298 !scope.installCommandLineAPI()) { | |
| 299 callback->sendFailure(errorString); | |
| 300 return; | |
| 301 } | |
| 302 | 289 |
| 303 bool evalIsDisabled = !scope.context()->IsCodeGenerationFromStringsAllowed(); | 290 bool evalIsDisabled = !scope.context()->IsCodeGenerationFromStringsAllowed(); |
| 304 // Temporarily enable allow evals for inspector. | 291 // Temporarily enable allow evals for inspector. |
| 305 if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(true); | 292 if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(true); |
| 306 | 293 |
| 307 v8::MaybeLocal<v8::Value> maybeResultValue; | 294 v8::MaybeLocal<v8::Value> maybeResultValue; |
| 308 v8::Local<v8::Script> script = m_inspector->compileScript( | 295 v8::Local<v8::Script> script = m_inspector->compileScript( |
| 309 scope.context(), toV8String(m_inspector->isolate(), expression), | 296 scope.context(), toV8String(m_inspector->isolate(), expression), |
| 310 String16(), false); | 297 String16(), false); |
| 311 if (!script.IsEmpty()) | 298 if (!script.IsEmpty()) |
| 312 maybeResultValue = m_inspector->runCompiledScript(scope.context(), script); | 299 maybeResultValue = m_inspector->runCompiledScript(scope.context(), script); |
| 313 | 300 |
| 314 if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(false); | 301 if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(false); |
| 315 | 302 |
| 316 // Re-initialize after running client's code, as it could have destroyed | 303 // Re-initialize after running client's code, as it could have destroyed |
| 317 // context or session. | 304 // context or session. |
| 318 if (!scope.initialize()) { | 305 response = scope.initialize(); |
| 319 callback->sendFailure(errorString); | 306 if (!response.isSuccess()) { |
| 307 callback->sendFailure(response); | |
| 320 return; | 308 return; |
| 321 } | 309 } |
| 322 | 310 |
| 323 if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { | 311 if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { |
| 324 wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, | 312 wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, |
| 325 scope.tryCatch(), objectGroup.fromMaybe(""), | 313 scope.tryCatch(), objectGroup.fromMaybe(""), |
| 326 returnByValue.fromMaybe(false), | 314 returnByValue.fromMaybe(false), |
| 327 generatePreview.fromMaybe(false), callback.get()); | 315 generatePreview.fromMaybe(false), callback.get()); |
| 328 return; | 316 return; |
| 329 } | 317 } |
| 330 ProtocolPromiseHandler<EvaluateCallback>::add( | 318 ProtocolPromiseHandler<EvaluateCallback>::add( |
| 331 m_inspector, scope.context(), maybeResultValue, | 319 m_inspector, scope.context(), maybeResultValue, |
| 332 "Result of the evaluation is not a promise", m_session->contextGroupId(), | 320 "Result of the evaluation is not a promise", m_session->contextGroupId(), |
| 333 scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), | 321 scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), |
| 334 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), | 322 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), |
| 335 std::move(callback)); | 323 std::move(callback)); |
| 336 } | 324 } |
| 337 | 325 |
| 338 void V8RuntimeAgentImpl::awaitPromise( | 326 void V8RuntimeAgentImpl::awaitPromise( |
| 339 const String16& promiseObjectId, const Maybe<bool>& returnByValue, | 327 const String16& promiseObjectId, Maybe<bool> returnByValue, |
| 340 const Maybe<bool>& generatePreview, | 328 Maybe<bool> generatePreview, |
| 341 std::unique_ptr<AwaitPromiseCallback> callback) { | 329 std::unique_ptr<AwaitPromiseCallback> callback) { |
| 342 ErrorString errorString; | 330 InjectedScript::ObjectScope scope(m_inspector, m_session->contextGroupId(), |
| 343 InjectedScript::ObjectScope scope( | 331 promiseObjectId); |
| 344 &errorString, m_inspector, m_session->contextGroupId(), promiseObjectId); | 332 Response response = scope.initialize(); |
| 345 if (!scope.initialize()) { | 333 if (!response.isSuccess()) { |
| 346 callback->sendFailure(errorString); | 334 callback->sendFailure(response); |
| 347 return; | 335 return; |
| 348 } | 336 } |
| 349 ProtocolPromiseHandler<AwaitPromiseCallback>::add( | 337 ProtocolPromiseHandler<AwaitPromiseCallback>::add( |
| 350 m_inspector, scope.context(), scope.object(), | 338 m_inspector, scope.context(), scope.object(), |
| 351 "Could not find promise with given id", m_session->contextGroupId(), | 339 "Could not find promise with given id", m_session->contextGroupId(), |
| 352 scope.injectedScript()->context()->contextId(), scope.objectGroupName(), | 340 scope.injectedScript()->context()->contextId(), scope.objectGroupName(), |
| 353 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), | 341 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), |
| 354 std::move(callback)); | 342 std::move(callback)); |
| 355 } | 343 } |
| 356 | 344 |
| 357 void V8RuntimeAgentImpl::callFunctionOn( | 345 void V8RuntimeAgentImpl::callFunctionOn( |
| 358 const String16& objectId, const String16& expression, | 346 const String16& objectId, const String16& expression, |
| 359 const Maybe<protocol::Array<protocol::Runtime::CallArgument>>& | 347 Maybe<protocol::Array<protocol::Runtime::CallArgument>> optionalArguments, |
| 360 optionalArguments, | 348 Maybe<bool> silent, Maybe<bool> returnByValue, Maybe<bool> generatePreview, |
| 361 const Maybe<bool>& silent, const Maybe<bool>& returnByValue, | 349 Maybe<bool> userGesture, Maybe<bool> awaitPromise, |
| 362 const Maybe<bool>& generatePreview, const Maybe<bool>& userGesture, | |
| 363 const Maybe<bool>& awaitPromise, | |
| 364 std::unique_ptr<CallFunctionOnCallback> callback) { | 350 std::unique_ptr<CallFunctionOnCallback> callback) { |
| 365 ErrorString errorString; | 351 InjectedScript::ObjectScope scope(m_inspector, m_session->contextGroupId(), |
| 366 InjectedScript::ObjectScope scope(&errorString, m_inspector, | 352 objectId); |
| 367 m_session->contextGroupId(), objectId); | 353 Response response = scope.initialize(); |
| 368 if (!scope.initialize()) { | 354 if (!response.isSuccess()) { |
| 369 callback->sendFailure(errorString); | 355 callback->sendFailure(response); |
| 370 return; | 356 return; |
| 371 } | 357 } |
| 372 | 358 |
| 373 std::unique_ptr<v8::Local<v8::Value>[]> argv = nullptr; | 359 std::unique_ptr<v8::Local<v8::Value>[]> argv = nullptr; |
| 374 int argc = 0; | 360 int argc = 0; |
| 375 if (optionalArguments.isJust()) { | 361 if (optionalArguments.isJust()) { |
| 376 protocol::Array<protocol::Runtime::CallArgument>* arguments = | 362 protocol::Array<protocol::Runtime::CallArgument>* arguments = |
| 377 optionalArguments.fromJust(); | 363 optionalArguments.fromJust(); |
| 378 argc = static_cast<int>(arguments->length()); | 364 argc = static_cast<int>(arguments->length()); |
| 379 argv.reset(new v8::Local<v8::Value>[argc]); | 365 argv.reset(new v8::Local<v8::Value>[argc]); |
| 380 for (int i = 0; i < argc; ++i) { | 366 for (int i = 0; i < argc; ++i) { |
| 381 v8::Local<v8::Value> argumentValue; | 367 v8::Local<v8::Value> argumentValue; |
| 382 if (!scope.injectedScript() | 368 response = scope.injectedScript()->resolveCallArgument(arguments->get(i), |
| 383 ->resolveCallArgument(&errorString, arguments->get(i)) | 369 argumentValue); |
| 384 .ToLocal(&argumentValue)) { | 370 if (!response.isSuccess()) { |
| 385 callback->sendFailure(errorString); | 371 callback->sendFailure(response); |
| 386 return; | 372 return; |
| 387 } | 373 } |
| 388 argv[i] = argumentValue; | 374 argv[i] = argumentValue; |
| 389 } | 375 } |
| 390 } | 376 } |
| 391 | 377 |
| 392 if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); | 378 if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); |
| 393 if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); | 379 if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); |
| 394 | 380 |
| 395 v8::MaybeLocal<v8::Value> maybeFunctionValue = | 381 v8::MaybeLocal<v8::Value> maybeFunctionValue = |
| 396 m_inspector->compileAndRunInternalScript( | 382 m_inspector->compileAndRunInternalScript( |
| 397 scope.context(), | 383 scope.context(), |
| 398 toV8String(m_inspector->isolate(), "(" + expression + ")")); | 384 toV8String(m_inspector->isolate(), "(" + expression + ")")); |
| 399 // Re-initialize after running client's code, as it could have destroyed | 385 // Re-initialize after running client's code, as it could have destroyed |
| 400 // context or session. | 386 // context or session. |
| 401 if (!scope.initialize()) { | 387 response = scope.initialize(); |
| 402 callback->sendFailure(errorString); | 388 if (!response.isSuccess()) { |
| 389 callback->sendFailure(response); | |
| 403 return; | 390 return; |
| 404 } | 391 } |
| 405 | 392 |
| 406 if (scope.tryCatch().HasCaught()) { | 393 if (scope.tryCatch().HasCaught()) { |
| 407 wrapEvaluateResultAsync(scope.injectedScript(), maybeFunctionValue, | 394 wrapEvaluateResultAsync(scope.injectedScript(), maybeFunctionValue, |
| 408 scope.tryCatch(), scope.objectGroupName(), false, | 395 scope.tryCatch(), scope.objectGroupName(), false, |
| 409 false, callback.get()); | 396 false, callback.get()); |
| 410 return; | 397 return; |
| 411 } | 398 } |
| 412 | 399 |
| 413 v8::Local<v8::Value> functionValue; | 400 v8::Local<v8::Value> functionValue; |
| 414 if (!maybeFunctionValue.ToLocal(&functionValue) || | 401 if (!maybeFunctionValue.ToLocal(&functionValue) || |
| 415 !functionValue->IsFunction()) { | 402 !functionValue->IsFunction()) { |
| 416 callback->sendFailure("Given expression does not evaluate to a function"); | 403 callback->sendFailure( |
| 404 Response::Error("Given expression does not evaluate to a function")); | |
| 417 return; | 405 return; |
| 418 } | 406 } |
| 419 | 407 |
| 420 v8::MaybeLocal<v8::Value> maybeResultValue = m_inspector->callFunction( | 408 v8::MaybeLocal<v8::Value> maybeResultValue = m_inspector->callFunction( |
| 421 functionValue.As<v8::Function>(), scope.context(), scope.object(), argc, | 409 functionValue.As<v8::Function>(), scope.context(), scope.object(), argc, |
| 422 argv.get()); | 410 argv.get()); |
| 423 // Re-initialize after running client's code, as it could have destroyed | 411 // Re-initialize after running client's code, as it could have destroyed |
| 424 // context or session. | 412 // context or session. |
| 425 if (!scope.initialize()) { | 413 response = scope.initialize(); |
| 426 callback->sendFailure(errorString); | 414 if (!response.isSuccess()) { |
| 415 callback->sendFailure(response); | |
| 427 return; | 416 return; |
| 428 } | 417 } |
| 429 | 418 |
| 430 if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { | 419 if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { |
| 431 wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, | 420 wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, |
| 432 scope.tryCatch(), scope.objectGroupName(), | 421 scope.tryCatch(), scope.objectGroupName(), |
| 433 returnByValue.fromMaybe(false), | 422 returnByValue.fromMaybe(false), |
| 434 generatePreview.fromMaybe(false), callback.get()); | 423 generatePreview.fromMaybe(false), callback.get()); |
| 435 return; | 424 return; |
| 436 } | 425 } |
| 437 | 426 |
| 438 ProtocolPromiseHandler<CallFunctionOnCallback>::add( | 427 ProtocolPromiseHandler<CallFunctionOnCallback>::add( |
| 439 m_inspector, scope.context(), maybeResultValue, | 428 m_inspector, scope.context(), maybeResultValue, |
| 440 "Result of the function call is not a promise", | 429 "Result of the function call is not a promise", |
| 441 m_session->contextGroupId(), | 430 m_session->contextGroupId(), |
| 442 scope.injectedScript()->context()->contextId(), scope.objectGroupName(), | 431 scope.injectedScript()->context()->contextId(), scope.objectGroupName(), |
| 443 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), | 432 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), |
| 444 std::move(callback)); | 433 std::move(callback)); |
| 445 } | 434 } |
| 446 | 435 |
| 447 void V8RuntimeAgentImpl::getProperties( | 436 Response V8RuntimeAgentImpl::getProperties( |
| 448 ErrorString* errorString, const String16& objectId, | 437 const String16& objectId, Maybe<bool> ownProperties, |
| 449 const Maybe<bool>& ownProperties, const Maybe<bool>& accessorPropertiesOnly, | 438 Maybe<bool> accessorPropertiesOnly, Maybe<bool> generatePreview, |
| 450 const Maybe<bool>& generatePreview, | |
| 451 std::unique_ptr<protocol::Array<protocol::Runtime::PropertyDescriptor>>* | 439 std::unique_ptr<protocol::Array<protocol::Runtime::PropertyDescriptor>>* |
| 452 result, | 440 result, |
| 453 Maybe<protocol::Array<protocol::Runtime::InternalPropertyDescriptor>>* | 441 Maybe<protocol::Array<protocol::Runtime::InternalPropertyDescriptor>>* |
| 454 internalProperties, | 442 internalProperties, |
| 455 Maybe<protocol::Runtime::ExceptionDetails>* exceptionDetails) { | 443 Maybe<protocol::Runtime::ExceptionDetails>* exceptionDetails) { |
| 456 using protocol::Runtime::InternalPropertyDescriptor; | 444 using protocol::Runtime::InternalPropertyDescriptor; |
| 457 | 445 |
| 458 InjectedScript::ObjectScope scope(errorString, m_inspector, | 446 InjectedScript::ObjectScope scope(m_inspector, m_session->contextGroupId(), |
| 459 m_session->contextGroupId(), objectId); | 447 objectId); |
| 460 if (!scope.initialize()) return; | 448 Response response = scope.initialize(); |
| 449 if (!response.isSuccess()) return response; | |
| 461 | 450 |
| 462 scope.ignoreExceptionsAndMuteConsole(); | 451 scope.ignoreExceptionsAndMuteConsole(); |
| 463 if (!scope.object()->IsObject()) { | 452 if (!scope.object()->IsObject()) |
| 464 *errorString = "Value with given id is not an object"; | 453 return Response::Error("Value with given id is not an object"); |
| 465 return; | |
| 466 } | |
| 467 | 454 |
| 468 v8::Local<v8::Object> object = scope.object().As<v8::Object>(); | 455 v8::Local<v8::Object> object = scope.object().As<v8::Object>(); |
| 469 scope.injectedScript()->getProperties( | 456 response = scope.injectedScript()->getProperties( |
| 470 errorString, object, scope.objectGroupName(), | 457 object, scope.objectGroupName(), ownProperties.fromMaybe(false), |
| 471 ownProperties.fromMaybe(false), accessorPropertiesOnly.fromMaybe(false), | 458 accessorPropertiesOnly.fromMaybe(false), generatePreview.fromMaybe(false), |
| 472 generatePreview.fromMaybe(false), result, exceptionDetails); | 459 result, exceptionDetails); |
| 473 if (!errorString->isEmpty() || exceptionDetails->isJust() || | 460 if (!response.isSuccess()) return response; |
| 474 accessorPropertiesOnly.fromMaybe(false)) | 461 if (exceptionDetails->isJust() || accessorPropertiesOnly.fromMaybe(false)) |
| 475 return; | 462 return Response::OK(); |
| 476 v8::Local<v8::Array> propertiesArray; | 463 v8::Local<v8::Array> propertiesArray; |
| 477 if (hasInternalError(errorString, !m_inspector->debugger() | 464 if (!m_inspector->debugger() |
| 478 ->internalProperties(scope.context(), | 465 ->internalProperties(scope.context(), scope.object()) |
| 479 scope.object()) | 466 .ToLocal(&propertiesArray)) { |
| 480 .ToLocal(&propertiesArray))) | 467 return Response::InternalError(); |
| 481 return; | 468 } |
| 482 std::unique_ptr<protocol::Array<InternalPropertyDescriptor>> | 469 std::unique_ptr<protocol::Array<InternalPropertyDescriptor>> |
| 483 propertiesProtocolArray = | 470 propertiesProtocolArray = |
| 484 protocol::Array<InternalPropertyDescriptor>::create(); | 471 protocol::Array<InternalPropertyDescriptor>::create(); |
| 485 for (uint32_t i = 0; i < propertiesArray->Length(); i += 2) { | 472 for (uint32_t i = 0; i < propertiesArray->Length(); i += 2) { |
| 486 v8::Local<v8::Value> name; | 473 v8::Local<v8::Value> name; |
| 487 if (hasInternalError( | 474 if (!propertiesArray->Get(scope.context(), i).ToLocal(&name) || |
| 488 errorString, | 475 !name->IsString()) { |
| 489 !propertiesArray->Get(scope.context(), i).ToLocal(&name)) || | 476 return Response::InternalError(); |
| 490 !name->IsString()) | 477 } |
| 491 return; | |
| 492 v8::Local<v8::Value> value; | 478 v8::Local<v8::Value> value; |
| 493 if (hasInternalError( | 479 if (!propertiesArray->Get(scope.context(), i + 1).ToLocal(&value)) |
| 494 errorString, | 480 return Response::InternalError(); |
| 495 !propertiesArray->Get(scope.context(), i + 1).ToLocal(&value))) | 481 std::unique_ptr<RemoteObject> wrappedValue; |
| 496 return; | 482 protocol::Response response = scope.injectedScript()->wrapObject( |
| 497 std::unique_ptr<RemoteObject> wrappedValue = | 483 value, scope.objectGroupName(), false, false, wrappedValue); |
| 498 scope.injectedScript()->wrapObject(errorString, value, | 484 if (!response.isSuccess()) return response; |
| 499 scope.objectGroupName()); | |
| 500 if (!wrappedValue) return; | |
| 501 propertiesProtocolArray->addItem( | 485 propertiesProtocolArray->addItem( |
| 502 InternalPropertyDescriptor::create() | 486 InternalPropertyDescriptor::create() |
| 503 .setName(toProtocolString(name.As<v8::String>())) | 487 .setName(toProtocolString(name.As<v8::String>())) |
| 504 .setValue(std::move(wrappedValue)) | 488 .setValue(std::move(wrappedValue)) |
| 505 .build()); | 489 .build()); |
| 506 } | 490 } |
| 507 if (!propertiesProtocolArray->length()) return; | 491 if (propertiesProtocolArray->length()) |
| 508 *internalProperties = std::move(propertiesProtocolArray); | 492 *internalProperties = std::move(propertiesProtocolArray); |
| 493 return Response::OK(); | |
| 509 } | 494 } |
| 510 | 495 |
| 511 void V8RuntimeAgentImpl::releaseObject(ErrorString* errorString, | 496 Response V8RuntimeAgentImpl::releaseObject(const String16& objectId) { |
| 512 const String16& objectId) { | 497 InjectedScript::ObjectScope scope(m_inspector, m_session->contextGroupId(), |
| 513 InjectedScript::ObjectScope scope(errorString, m_inspector, | 498 objectId); |
| 514 m_session->contextGroupId(), objectId); | 499 Response response = scope.initialize(); |
| 515 if (!scope.initialize()) return; | 500 if (!response.isSuccess()) return response; |
| 516 scope.injectedScript()->releaseObject(objectId); | 501 scope.injectedScript()->releaseObject(objectId); |
| 502 return Response::OK(); | |
| 517 } | 503 } |
| 518 | 504 |
| 519 void V8RuntimeAgentImpl::releaseObjectGroup(ErrorString*, | 505 Response V8RuntimeAgentImpl::releaseObjectGroup(const String16& objectGroup) { |
| 520 const String16& objectGroup) { | |
| 521 m_session->releaseObjectGroup(objectGroup); | 506 m_session->releaseObjectGroup(objectGroup); |
| 507 return Response::OK(); | |
| 522 } | 508 } |
| 523 | 509 |
| 524 void V8RuntimeAgentImpl::runIfWaitingForDebugger(ErrorString* errorString) { | 510 Response V8RuntimeAgentImpl::runIfWaitingForDebugger() { |
| 525 m_inspector->client()->runIfWaitingForDebugger(m_session->contextGroupId()); | 511 m_inspector->client()->runIfWaitingForDebugger(m_session->contextGroupId()); |
| 512 return Response::OK(); | |
| 526 } | 513 } |
| 527 | 514 |
| 528 void V8RuntimeAgentImpl::setCustomObjectFormatterEnabled(ErrorString*, | 515 Response V8RuntimeAgentImpl::setCustomObjectFormatterEnabled(bool enabled) { |
| 529 bool enabled) { | |
| 530 m_state->setBoolean(V8RuntimeAgentImplState::customObjectFormatterEnabled, | 516 m_state->setBoolean(V8RuntimeAgentImplState::customObjectFormatterEnabled, |
| 531 enabled); | 517 enabled); |
| 532 m_session->setCustomObjectFormatterEnabled(enabled); | 518 m_session->setCustomObjectFormatterEnabled(enabled); |
| 519 return Response::OK(); | |
| 533 } | 520 } |
| 534 | 521 |
| 535 void V8RuntimeAgentImpl::discardConsoleEntries(ErrorString*) { | 522 Response V8RuntimeAgentImpl::discardConsoleEntries() { |
| 536 V8ConsoleMessageStorage* storage = | 523 V8ConsoleMessageStorage* storage = |
| 537 m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); | 524 m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); |
| 538 storage->clear(); | 525 storage->clear(); |
| 526 return Response::OK(); | |
| 539 } | 527 } |
| 540 | 528 |
| 541 void V8RuntimeAgentImpl::compileScript( | 529 Response V8RuntimeAgentImpl::compileScript( |
| 542 ErrorString* errorString, const String16& expression, | 530 const String16& expression, const String16& sourceURL, bool persistScript, |
| 543 const String16& sourceURL, bool persistScript, | 531 Maybe<int> executionContextId, Maybe<String16>* scriptId, |
| 544 const Maybe<int>& executionContextId, Maybe<String16>* scriptId, | |
| 545 Maybe<protocol::Runtime::ExceptionDetails>* exceptionDetails) { | 532 Maybe<protocol::Runtime::ExceptionDetails>* exceptionDetails) { |
| 546 if (!m_enabled) { | 533 if (!m_enabled) return Response::Error("Runtime agent is not enabled"); |
| 547 *errorString = "Runtime agent is not enabled"; | 534 |
| 548 return; | 535 int contextId = 0; |
| 549 } | 536 Response response = ensureContext(m_inspector, m_session->contextGroupId(), |
| 550 int contextId = | 537 std::move(executionContextId), contextId); |
| 551 ensureContext(errorString, m_inspector, m_session->contextGroupId(), | 538 if (!response.isSuccess()) return response; |
| 552 executionContextId); | 539 InjectedScript::ContextScope scope(m_inspector, m_session->contextGroupId(), |
| 553 if (!errorString->isEmpty()) return; | 540 contextId); |
| 554 InjectedScript::ContextScope scope(errorString, m_inspector, | 541 response = scope.initialize(); |
| 555 m_session->contextGroupId(), contextId); | 542 if (!response.isSuccess()) return response; |
| 556 if (!scope.initialize()) return; | |
| 557 | 543 |
| 558 if (!persistScript) m_inspector->debugger()->muteScriptParsedEvents(); | 544 if (!persistScript) m_inspector->debugger()->muteScriptParsedEvents(); |
| 559 v8::Local<v8::Script> script = m_inspector->compileScript( | 545 v8::Local<v8::Script> script = m_inspector->compileScript( |
| 560 scope.context(), toV8String(m_inspector->isolate(), expression), | 546 scope.context(), toV8String(m_inspector->isolate(), expression), |
| 561 sourceURL, false); | 547 sourceURL, false); |
| 562 if (!persistScript) m_inspector->debugger()->unmuteScriptParsedEvents(); | 548 if (!persistScript) m_inspector->debugger()->unmuteScriptParsedEvents(); |
| 563 if (script.IsEmpty()) { | 549 if (script.IsEmpty()) { |
| 564 if (scope.tryCatch().HasCaught()) | 550 if (scope.tryCatch().HasCaught()) { |
| 565 *exceptionDetails = scope.injectedScript()->createExceptionDetails( | 551 response = scope.injectedScript()->createExceptionDetails( |
| 566 errorString, scope.tryCatch(), String16(), false); | 552 scope.tryCatch(), String16(), false, *exceptionDetails); |
| 567 else | 553 if (!response.isSuccess()) return response; |
| 568 *errorString = "Script compilation failed"; | 554 return Response::OK(); |
| 569 return; | 555 } else { |
| 556 return Response::Error("Script compilation failed"); | |
| 557 } | |
| 570 } | 558 } |
| 571 | 559 |
| 572 if (!persistScript) return; | 560 if (!persistScript) return Response::OK(); |
| 573 | 561 |
| 574 String16 scriptValueId = | 562 String16 scriptValueId = |
| 575 String16::fromInteger(script->GetUnboundScript()->GetId()); | 563 String16::fromInteger(script->GetUnboundScript()->GetId()); |
| 576 std::unique_ptr<v8::Global<v8::Script>> global( | 564 std::unique_ptr<v8::Global<v8::Script>> global( |
| 577 new v8::Global<v8::Script>(m_inspector->isolate(), script)); | 565 new v8::Global<v8::Script>(m_inspector->isolate(), script)); |
| 578 m_compiledScripts[scriptValueId] = std::move(global); | 566 m_compiledScripts[scriptValueId] = std::move(global); |
| 579 *scriptId = scriptValueId; | 567 *scriptId = scriptValueId; |
| 568 return Response::OK(); | |
| 580 } | 569 } |
| 581 | 570 |
| 582 void V8RuntimeAgentImpl::runScript( | 571 void V8RuntimeAgentImpl::runScript( |
| 583 const String16& scriptId, const Maybe<int>& executionContextId, | 572 const String16& scriptId, Maybe<int> executionContextId, |
| 584 const Maybe<String16>& objectGroup, const Maybe<bool>& silent, | 573 Maybe<String16> objectGroup, Maybe<bool> silent, |
| 585 const Maybe<bool>& includeCommandLineAPI, const Maybe<bool>& returnByValue, | 574 Maybe<bool> includeCommandLineAPI, Maybe<bool> returnByValue, |
| 586 const Maybe<bool>& generatePreview, const Maybe<bool>& awaitPromise, | 575 Maybe<bool> generatePreview, Maybe<bool> awaitPromise, |
| 587 std::unique_ptr<RunScriptCallback> callback) { | 576 std::unique_ptr<RunScriptCallback> callback) { |
| 588 if (!m_enabled) { | 577 if (!m_enabled) { |
| 589 callback->sendFailure("Runtime agent is not enabled"); | 578 callback->sendFailure(Response::Error("Runtime agent is not enabled")); |
| 590 return; | 579 return; |
| 591 } | 580 } |
| 592 | 581 |
| 593 auto it = m_compiledScripts.find(scriptId); | 582 auto it = m_compiledScripts.find(scriptId); |
| 594 if (it == m_compiledScripts.end()) { | 583 if (it == m_compiledScripts.end()) { |
| 595 callback->sendFailure("No script with given id"); | 584 callback->sendFailure(Response::Error("No script with given id")); |
| 596 return; | 585 return; |
| 597 } | 586 } |
| 598 | 587 |
| 599 ErrorString errorString; | 588 int contextId = 0; |
| 600 int contextId = | 589 Response response = ensureContext(m_inspector, m_session->contextGroupId(), |
| 601 ensureContext(&errorString, m_inspector, m_session->contextGroupId(), | 590 std::move(executionContextId), contextId); |
| 602 executionContextId); | 591 if (!response.isSuccess()) { |
| 603 if (!errorString.isEmpty()) { | 592 callback->sendFailure(response); |
| 604 callback->sendFailure(errorString); | |
| 605 return; | 593 return; |
| 606 } | 594 } |
| 607 | 595 |
| 608 InjectedScript::ContextScope scope(&errorString, m_inspector, | 596 InjectedScript::ContextScope scope(m_inspector, m_session->contextGroupId(), |
| 609 m_session->contextGroupId(), contextId); | 597 contextId); |
| 610 if (!scope.initialize()) { | 598 response = scope.initialize(); |
| 611 callback->sendFailure(errorString); | 599 if (!response.isSuccess()) { |
| 600 callback->sendFailure(response); | |
| 612 return; | 601 return; |
| 613 } | 602 } |
| 614 | 603 |
| 615 if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); | 604 if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); |
| 616 | 605 |
| 617 std::unique_ptr<v8::Global<v8::Script>> scriptWrapper = std::move(it->second); | 606 std::unique_ptr<v8::Global<v8::Script>> scriptWrapper = std::move(it->second); |
| 618 m_compiledScripts.erase(it); | 607 m_compiledScripts.erase(it); |
| 619 v8::Local<v8::Script> script = scriptWrapper->Get(m_inspector->isolate()); | 608 v8::Local<v8::Script> script = scriptWrapper->Get(m_inspector->isolate()); |
| 620 if (script.IsEmpty()) { | 609 if (script.IsEmpty()) { |
| 621 callback->sendFailure("Script execution failed"); | 610 callback->sendFailure(Response::Error("Script execution failed")); |
| 622 return; | 611 return; |
| 623 } | 612 } |
| 624 | 613 |
| 625 if (includeCommandLineAPI.fromMaybe(false) && !scope.installCommandLineAPI()) | 614 if (includeCommandLineAPI.fromMaybe(false)) scope.installCommandLineAPI(); |
| 626 return; | |
| 627 | 615 |
| 628 v8::MaybeLocal<v8::Value> maybeResultValue = | 616 v8::MaybeLocal<v8::Value> maybeResultValue = |
| 629 m_inspector->runCompiledScript(scope.context(), script); | 617 m_inspector->runCompiledScript(scope.context(), script); |
| 630 | 618 |
| 631 // Re-initialize after running client's code, as it could have destroyed | 619 // Re-initialize after running client's code, as it could have destroyed |
| 632 // context or session. | 620 // context or session. |
| 633 if (!scope.initialize()) return; | 621 response = scope.initialize(); |
| 622 if (!response.isSuccess()) { | |
| 623 callback->sendFailure(response); | |
| 624 return; | |
| 625 } | |
| 634 | 626 |
| 635 if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { | 627 if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { |
| 636 wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, | 628 wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, |
| 637 scope.tryCatch(), objectGroup.fromMaybe(""), | 629 scope.tryCatch(), objectGroup.fromMaybe(""), |
| 638 returnByValue.fromMaybe(false), | 630 returnByValue.fromMaybe(false), |
| 639 generatePreview.fromMaybe(false), callback.get()); | 631 generatePreview.fromMaybe(false), callback.get()); |
| 640 return; | 632 return; |
| 641 } | 633 } |
| 642 ProtocolPromiseHandler<RunScriptCallback>::add( | 634 ProtocolPromiseHandler<RunScriptCallback>::add( |
| 643 m_inspector, scope.context(), maybeResultValue.ToLocalChecked(), | 635 m_inspector, scope.context(), maybeResultValue.ToLocalChecked(), |
| 644 "Result of the script execution is not a promise", | 636 "Result of the script execution is not a promise", |
| 645 m_session->contextGroupId(), | 637 m_session->contextGroupId(), |
| 646 scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), | 638 scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), |
| 647 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), | 639 returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), |
| 648 std::move(callback)); | 640 std::move(callback)); |
| 649 } | 641 } |
| 650 | 642 |
| 651 void V8RuntimeAgentImpl::restore() { | 643 void V8RuntimeAgentImpl::restore() { |
| 652 if (!m_state->booleanProperty(V8RuntimeAgentImplState::runtimeEnabled, false)) | 644 if (!m_state->booleanProperty(V8RuntimeAgentImplState::runtimeEnabled, false)) |
| 653 return; | 645 return; |
| 654 m_frontend.executionContextsCleared(); | 646 m_frontend.executionContextsCleared(); |
| 655 ErrorString error; | 647 enable(); |
| 656 enable(&error); | |
| 657 if (m_state->booleanProperty( | 648 if (m_state->booleanProperty( |
| 658 V8RuntimeAgentImplState::customObjectFormatterEnabled, false)) | 649 V8RuntimeAgentImplState::customObjectFormatterEnabled, false)) |
| 659 m_session->setCustomObjectFormatterEnabled(true); | 650 m_session->setCustomObjectFormatterEnabled(true); |
| 660 } | 651 } |
| 661 | 652 |
| 662 void V8RuntimeAgentImpl::enable(ErrorString* errorString) { | 653 Response V8RuntimeAgentImpl::enable() { |
| 663 if (m_enabled) return; | 654 if (m_enabled) return Response::OK(); |
| 664 m_inspector->client()->beginEnsureAllContextsInGroup( | 655 m_inspector->client()->beginEnsureAllContextsInGroup( |
| 665 m_session->contextGroupId()); | 656 m_session->contextGroupId()); |
| 666 m_enabled = true; | 657 m_enabled = true; |
| 667 m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, true); | 658 m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, true); |
| 668 m_inspector->enableStackCapturingIfNeeded(); | 659 m_inspector->enableStackCapturingIfNeeded(); |
| 669 m_session->reportAllContexts(this); | 660 m_session->reportAllContexts(this); |
| 670 V8ConsoleMessageStorage* storage = | 661 V8ConsoleMessageStorage* storage = |
| 671 m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); | 662 m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); |
| 672 for (const auto& message : storage->messages()) { | 663 for (const auto& message : storage->messages()) { |
| 673 if (!reportMessage(message.get(), false)) return; | 664 if (!reportMessage(message.get(), false)) break; |
| 674 } | 665 } |
| 666 return Response::OK(); | |
| 675 } | 667 } |
| 676 | 668 |
| 677 void V8RuntimeAgentImpl::disable(ErrorString* errorString) { | 669 Response V8RuntimeAgentImpl::disable() { |
| 678 if (!m_enabled) return; | 670 if (!m_enabled) return Response::OK(); |
| 679 m_enabled = false; | 671 m_enabled = false; |
| 680 m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, false); | 672 m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, false); |
| 681 m_inspector->disableStackCapturingIfNeeded(); | 673 m_inspector->disableStackCapturingIfNeeded(); |
| 682 m_session->discardInjectedScripts(); | 674 m_session->discardInjectedScripts(); |
| 683 reset(); | 675 reset(); |
| 684 m_inspector->client()->endEnsureAllContextsInGroup( | 676 m_inspector->client()->endEnsureAllContextsInGroup( |
| 685 m_session->contextGroupId()); | 677 m_session->contextGroupId()); |
| 678 return Response::OK(); | |
| 686 } | 679 } |
| 687 | 680 |
| 688 void V8RuntimeAgentImpl::reset() { | 681 void V8RuntimeAgentImpl::reset() { |
| 689 m_compiledScripts.clear(); | 682 m_compiledScripts.clear(); |
| 690 if (m_enabled) { | 683 if (m_enabled) { |
| 691 if (const V8InspectorImpl::ContextByIdMap* contexts = | 684 if (const V8InspectorImpl::ContextByIdMap* contexts = |
| 692 m_inspector->contextGroup(m_session->contextGroupId())) { | 685 m_inspector->contextGroup(m_session->contextGroupId())) { |
| 693 for (auto& idContext : *contexts) idContext.second->setReported(false); | 686 for (auto& idContext : *contexts) idContext.second->setReported(false); |
| 694 } | 687 } |
| 695 m_frontend.executionContextsCleared(); | 688 m_frontend.executionContextsCleared(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 732 } | 725 } |
| 733 | 726 |
| 734 bool V8RuntimeAgentImpl::reportMessage(V8ConsoleMessage* message, | 727 bool V8RuntimeAgentImpl::reportMessage(V8ConsoleMessage* message, |
| 735 bool generatePreview) { | 728 bool generatePreview) { |
| 736 message->reportToFrontend(&m_frontend, m_session, generatePreview); | 729 message->reportToFrontend(&m_frontend, m_session, generatePreview); |
| 737 m_frontend.flush(); | 730 m_frontend.flush(); |
| 738 return m_inspector->hasConsoleMessageStorage(m_session->contextGroupId()); | 731 return m_inspector->hasConsoleMessageStorage(m_session->contextGroupId()); |
| 739 } | 732 } |
| 740 | 733 |
| 741 } // namespace v8_inspector | 734 } // namespace v8_inspector |
| OLD | NEW |