| 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 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 #include "platform/v8_inspector/V8RuntimeAgentImpl.h" | 31 #include "platform/v8_inspector/V8RuntimeAgentImpl.h" |
| 32 | 32 |
| 33 #include "platform/inspector_protocol/Values.h" | 33 #include "platform/inspector_protocol/Values.h" |
| 34 #include "platform/v8_inspector/IgnoreExceptionsScope.h" | 34 #include "platform/v8_inspector/IgnoreExceptionsScope.h" |
| 35 #include "platform/v8_inspector/InjectedScript.h" | 35 #include "platform/v8_inspector/InjectedScript.h" |
| 36 #include "platform/v8_inspector/InjectedScriptHost.h" | 36 #include "platform/v8_inspector/InjectedScriptHost.h" |
| 37 #include "platform/v8_inspector/InjectedScriptManager.h" | 37 #include "platform/v8_inspector/InjectedScriptManager.h" |
| 38 #include "platform/v8_inspector/RemoteObjectId.h" | 38 #include "platform/v8_inspector/RemoteObjectId.h" |
| 39 #include "platform/v8_inspector/V8DebuggerImpl.h" | 39 #include "platform/v8_inspector/V8DebuggerImpl.h" |
| 40 #include "platform/v8_inspector/V8StackTraceImpl.h" | |
| 41 #include "platform/v8_inspector/V8StringUtil.h" | 40 #include "platform/v8_inspector/V8StringUtil.h" |
| 42 #include "platform/v8_inspector/public/V8DebuggerClient.h" | 41 #include "platform/v8_inspector/public/V8DebuggerClient.h" |
| 43 | 42 |
| 44 namespace blink { | 43 namespace blink { |
| 45 | 44 |
| 46 namespace V8RuntimeAgentImplState { | 45 namespace V8RuntimeAgentImplState { |
| 47 static const char customObjectFormatterEnabled[] = "customObjectFormatterEnabled
"; | 46 static const char customObjectFormatterEnabled[] = "customObjectFormatterEnabled
"; |
| 48 }; | 47 }; |
| 49 | 48 |
| 50 using protocol::Runtime::ExceptionDetails; | 49 using protocol::Runtime::ExceptionDetails; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 } | 203 } |
| 205 | 204 |
| 206 v8::Isolate* isolate = injectedScript->isolate(); | 205 v8::Isolate* isolate = injectedScript->isolate(); |
| 207 v8::HandleScope handles(isolate); | 206 v8::HandleScope handles(isolate); |
| 208 v8::Context::Scope scope(injectedScript->context()); | 207 v8::Context::Scope scope(injectedScript->context()); |
| 209 v8::TryCatch tryCatch(isolate); | 208 v8::TryCatch tryCatch(isolate); |
| 210 v8::Local<v8::Script> script = m_debugger->compileInternalScript(injectedScr
ipt->context(), toV8String(isolate, expression), sourceURL); | 209 v8::Local<v8::Script> script = m_debugger->compileInternalScript(injectedScr
ipt->context(), toV8String(isolate, expression), sourceURL); |
| 211 if (script.IsEmpty()) { | 210 if (script.IsEmpty()) { |
| 212 v8::Local<v8::Message> message = tryCatch.Message(); | 211 v8::Local<v8::Message> message = tryCatch.Message(); |
| 213 if (!message.IsEmpty()) | 212 if (!message.IsEmpty()) |
| 214 *exceptionDetails = createExceptionDetails(isolate, message); | 213 *exceptionDetails = injectedScript->createExceptionDetails(message); |
| 215 else | 214 else |
| 216 *errorString = "Script compilation failed"; | 215 *errorString = "Script compilation failed"; |
| 217 return; | 216 return; |
| 218 } | 217 } |
| 219 | 218 |
| 220 if (!persistScript) | 219 if (!persistScript) |
| 221 return; | 220 return; |
| 222 | 221 |
| 223 String16 scriptValueId = String16::number(script->GetUnboundScript()->GetId(
)); | 222 String16 scriptValueId = String16::number(script->GetUnboundScript()->GetId(
)); |
| 224 OwnPtr<v8::Global<v8::Script>> global = adoptPtr(new v8::Global<v8::Script>(
isolate, script)); | 223 OwnPtr<v8::Global<v8::Script>> global = adoptPtr(new v8::Global<v8::Script>(
isolate, script)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 v8::Context::Scope scope(context); | 257 v8::Context::Scope scope(context); |
| 259 OwnPtr<v8::Global<v8::Script>> scriptWrapper = m_compiledScripts.take(script
Id); | 258 OwnPtr<v8::Global<v8::Script>> scriptWrapper = m_compiledScripts.take(script
Id); |
| 260 v8::Local<v8::Script> script = scriptWrapper->Get(isolate); | 259 v8::Local<v8::Script> script = scriptWrapper->Get(isolate); |
| 261 | 260 |
| 262 if (script.IsEmpty()) { | 261 if (script.IsEmpty()) { |
| 263 *errorString = "Script execution failed"; | 262 *errorString = "Script execution failed"; |
| 264 return; | 263 return; |
| 265 } | 264 } |
| 266 v8::TryCatch tryCatch(isolate); | 265 v8::TryCatch tryCatch(isolate); |
| 267 | 266 |
| 267 v8::MaybeLocal<v8::Object> commandLineAPI = includeCommandLineAPI.fromMaybe(
false) ? injectedScript->commandLineAPI(errorString) : v8::MaybeLocal<v8::Object
>(); |
| 268 if (includeCommandLineAPI.fromMaybe(false) && commandLineAPI.IsEmpty()) |
| 269 return; |
| 270 |
| 271 InjectedScriptManager::ScopedGlobalObjectExtension scopeExtension(injectedSc
ript, nullptr, commandLineAPI); |
| 272 |
| 268 v8::Local<v8::Value> value; | 273 v8::Local<v8::Value> value; |
| 269 v8::MaybeLocal<v8::Value> maybeValue = injectedScript->runCompiledScript(scr
ipt, includeCommandLineAPI.fromMaybe(false)); | 274 v8::MaybeLocal<v8::Value> maybeValue = m_debugger->runCompiledScript(context
, script); |
| 270 if (maybeValue.IsEmpty()) { | 275 if (maybeValue.IsEmpty()) { |
| 271 value = tryCatch.Exception(); | 276 value = tryCatch.Exception(); |
| 272 v8::Local<v8::Message> message = tryCatch.Message(); | 277 v8::Local<v8::Message> message = tryCatch.Message(); |
| 273 if (!message.IsEmpty()) | 278 if (!message.IsEmpty()) |
| 274 *exceptionDetails = createExceptionDetails(isolate, message); | 279 *exceptionDetails = injectedScript->createExceptionDetails(message); |
| 275 } else { | 280 } else { |
| 276 value = maybeValue.ToLocalChecked(); | 281 value = maybeValue.ToLocalChecked(); |
| 277 } | 282 } |
| 278 | 283 |
| 279 if (value.IsEmpty()) { | 284 if (value.IsEmpty()) { |
| 280 *errorString = "Script execution failed"; | 285 *errorString = "Script execution failed"; |
| 281 return; | 286 return; |
| 282 } | 287 } |
| 283 | 288 |
| 284 *result = injectedScript->wrapObject(value, objectGroup.fromMaybe("")); | 289 // InjectedScript may be gone after any evaluate call - find it again. |
| 290 injectedScript = m_injectedScriptManager->findInjectedScript(executionContex
tId); |
| 291 if (!injectedScript) { |
| 292 *errorString = "Inspected frame has gone during script running"; |
| 293 return; |
| 294 } |
| 295 |
| 296 *result = injectedScript->wrapObject(errorString, value, objectGroup.fromMay
be("")); |
| 285 } | 297 } |
| 286 | 298 |
| 287 void V8RuntimeAgentImpl::setInspectorState(protocol::DictionaryValue* state) | 299 void V8RuntimeAgentImpl::setInspectorState(protocol::DictionaryValue* state) |
| 288 { | 300 { |
| 289 m_state = state; | 301 m_state = state; |
| 290 } | 302 } |
| 291 | 303 |
| 292 void V8RuntimeAgentImpl::setFrontend(protocol::Frontend::Runtime* frontend) | 304 void V8RuntimeAgentImpl::setFrontend(protocol::Frontend::Runtime* frontend) |
| 293 { | 305 { |
| 294 m_frontend = frontend; | 306 m_frontend = frontend; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 void V8RuntimeAgentImpl::setInspectObjectCallback(PassOwnPtr<V8RuntimeAgent::Ins
pectCallback> callback) | 357 void V8RuntimeAgentImpl::setInspectObjectCallback(PassOwnPtr<V8RuntimeAgent::Ins
pectCallback> callback) |
| 346 { | 358 { |
| 347 m_injectedScriptManager->injectedScriptHost()->setInspectObjectCallback(call
back); | 359 m_injectedScriptManager->injectedScriptHost()->setInspectObjectCallback(call
back); |
| 348 } | 360 } |
| 349 | 361 |
| 350 PassOwnPtr<RemoteObject> V8RuntimeAgentImpl::wrapObject(v8::Local<v8::Context> c
ontext, v8::Local<v8::Value> value, const String16& groupName, bool generatePrev
iew) | 362 PassOwnPtr<RemoteObject> V8RuntimeAgentImpl::wrapObject(v8::Local<v8::Context> c
ontext, v8::Local<v8::Value> value, const String16& groupName, bool generatePrev
iew) |
| 351 { | 363 { |
| 352 InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(
context); | 364 InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(
context); |
| 353 if (!injectedScript) | 365 if (!injectedScript) |
| 354 return nullptr; | 366 return nullptr; |
| 355 return injectedScript->wrapObject(value, groupName, generatePreview); | 367 ErrorString errorString; |
| 368 return injectedScript->wrapObject(&errorString, value, groupName, false, gen
eratePreview); |
| 356 } | 369 } |
| 357 | 370 |
| 358 PassOwnPtr<RemoteObject> V8RuntimeAgentImpl::wrapTable(v8::Local<v8::Context> co
ntext, v8::Local<v8::Value> table, v8::Local<v8::Value> columns) | 371 PassOwnPtr<RemoteObject> V8RuntimeAgentImpl::wrapTable(v8::Local<v8::Context> co
ntext, v8::Local<v8::Value> table, v8::Local<v8::Value> columns) |
| 359 { | 372 { |
| 360 InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(
context); | 373 InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor(
context); |
| 361 if (!injectedScript) | 374 if (!injectedScript) |
| 362 return nullptr; | 375 return nullptr; |
| 363 return injectedScript->wrapTable(table, columns); | 376 return injectedScript->wrapTable(table, columns); |
| 364 } | 377 } |
| 365 | 378 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 } | 425 } |
| 413 | 426 |
| 414 void V8RuntimeAgentImpl::reportExecutionContextDestroyed(v8::Local<v8::Context>
context) | 427 void V8RuntimeAgentImpl::reportExecutionContextDestroyed(v8::Local<v8::Context>
context) |
| 415 { | 428 { |
| 416 int contextId = m_injectedScriptManager->discardInjectedScriptFor(context); | 429 int contextId = m_injectedScriptManager->discardInjectedScriptFor(context); |
| 417 if (!m_enabled) | 430 if (!m_enabled) |
| 418 return; | 431 return; |
| 419 m_frontend->executionContextDestroyed(contextId); | 432 m_frontend->executionContextDestroyed(contextId); |
| 420 } | 433 } |
| 421 | 434 |
| 422 PassOwnPtr<ExceptionDetails> V8RuntimeAgentImpl::createExceptionDetails(v8::Isol
ate* isolate, v8::Local<v8::Message> message) | |
| 423 { | |
| 424 OwnPtr<ExceptionDetails> exceptionDetails = ExceptionDetails::create().setTe
xt(toProtocolStringWithTypeCheck(message->Get())).build(); | |
| 425 exceptionDetails->setLine(message->GetLineNumber()); | |
| 426 exceptionDetails->setColumn(message->GetStartColumn()); | |
| 427 v8::Local<v8::StackTrace> messageStackTrace = message->GetStackTrace(); | |
| 428 if (!messageStackTrace.IsEmpty() && messageStackTrace->GetFrameCount() > 0) | |
| 429 exceptionDetails->setStack(m_debugger->createStackTrace(messageStackTrac
e, messageStackTrace->GetFrameCount())->buildInspectorObject()); | |
| 430 return exceptionDetails.release(); | |
| 431 } | |
| 432 | |
| 433 } // namespace blink | 435 } // namespace blink |
| OLD | NEW |