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

Side by Side Diff: third_party/WebKit/Source/platform/v8_inspector/InjectedScript.cpp

Issue 2249743006: [DevTools] Fill ExceptionDetails with more details, unify usage across protocol. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: browser test Created 4 years, 4 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 V8FunctionCall function(m_context->inspector(), m_context->context(), v8Valu e(), "getProperties"); 110 V8FunctionCall function(m_context->inspector(), m_context->context(), v8Valu e(), "getProperties");
111 function.appendArgument(object); 111 function.appendArgument(object);
112 function.appendArgument(groupName); 112 function.appendArgument(groupName);
113 function.appendArgument(ownProperties); 113 function.appendArgument(ownProperties);
114 function.appendArgument(accessorPropertiesOnly); 114 function.appendArgument(accessorPropertiesOnly);
115 function.appendArgument(generatePreview); 115 function.appendArgument(generatePreview);
116 116
117 v8::TryCatch tryCatch(m_context->isolate()); 117 v8::TryCatch tryCatch(m_context->isolate());
118 v8::Local<v8::Value> resultValue = function.callWithoutExceptionHandling(); 118 v8::Local<v8::Value> resultValue = function.callWithoutExceptionHandling();
119 if (tryCatch.HasCaught()) { 119 if (tryCatch.HasCaught()) {
120 *exceptionDetails = createExceptionDetails(tryCatch.Message()); 120 *exceptionDetails = createExceptionDetails(errorString, tryCatch, groupN ame, generatePreview);
121 // FIXME: make properties optional 121 // FIXME: make properties optional
122 *properties = Array<PropertyDescriptor>::create(); 122 *properties = Array<PropertyDescriptor>::create();
123 return; 123 return;
124 } 124 }
125 125
126 std::unique_ptr<protocol::Value> protocolValue = toProtocolValue(m_context-> context(), resultValue); 126 std::unique_ptr<protocol::Value> protocolValue = toProtocolValue(m_context-> context(), resultValue);
127 if (hasInternalError(errorString, !protocolValue)) 127 if (hasInternalError(errorString, !protocolValue))
128 return; 128 return;
129 protocol::ErrorSupport errors(errorString); 129 protocol::ErrorSupport errors(errorString);
130 std::unique_ptr<Array<PropertyDescriptor>> result = Array<PropertyDescriptor >::parse(protocolValue.get(), &errors); 130 std::unique_ptr<Array<PropertyDescriptor>> result = Array<PropertyDescriptor >::parse(protocolValue.get(), &errors);
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 v8::Local<v8::Value> object; 293 v8::Local<v8::Value> object;
294 if (!m_context->inspector()->compileAndRunInternalScript(m_context->cont ext(), toV8String(m_context->isolate(), value)).ToLocal(&object)) { 294 if (!m_context->inspector()->compileAndRunInternalScript(m_context->cont ext(), toV8String(m_context->isolate(), value)).ToLocal(&object)) {
295 *errorString = "Couldn't parse value object in call argument"; 295 *errorString = "Couldn't parse value object in call argument";
296 return v8::MaybeLocal<v8::Value>(); 296 return v8::MaybeLocal<v8::Value>();
297 } 297 }
298 return object; 298 return object;
299 } 299 }
300 return v8::Undefined(m_context->isolate()); 300 return v8::Undefined(m_context->isolate());
301 } 301 }
302 302
303 std::unique_ptr<protocol::Runtime::ExceptionDetails> InjectedScript::createExcep tionDetails(v8::Local<v8::Message> message) 303 std::unique_ptr<protocol::Runtime::ExceptionDetails> InjectedScript::createExcep tionDetails(ErrorString* errorString, const v8::TryCatch& tryCatch, const String 16& objectGroup, bool generatePreview)
304 { 304 {
305 std::unique_ptr<protocol::Runtime::ExceptionDetails> exceptionDetailsObject = protocol::Runtime::ExceptionDetails::create() 305 if (!tryCatch.HasCaught())
306 .setText(toProtocolString(message->Get())) 306 return nullptr;
307 .setScriptId(String16::fromInteger(message->GetScriptOrigin().ScriptID() ->Value())) 307 v8::Local<v8::Message> message = tryCatch.Message();
308 .setLineNumber(message->GetLineNumber(m_context->context()).FromMaybe(1) - 1) 308 v8::Local<v8::Value> exception = tryCatch.Exception();
309 .setColumnNumber(message->GetStartColumn(m_context->context()).FromMaybe (0)) 309 String16 messageText = message.IsEmpty() ? String16() : toProtocolString(mes sage->Get());
310 std::unique_ptr<protocol::Runtime::ExceptionDetails> exceptionDetails = prot ocol::Runtime::ExceptionDetails::create()
311 .setExceptionId(m_context->inspector()->nextExceptionId())
312 .setText(exception.IsEmpty() ? messageText : String16("Uncaught"))
313 .setLineNumber(message.IsEmpty() ? 0 : message->GetLineNumber(m_context- >context()).FromMaybe(1) - 1)
314 .setColumnNumber(message.IsEmpty() ? 0 : message->GetStartColumn(m_conte xt->context()).FromMaybe(0))
310 .build(); 315 .build();
311 316 if (!message.IsEmpty()) {
312 v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace(); 317 exceptionDetails->setScriptId(String16::fromInteger(message->GetScriptOr igin().ScriptID()->Value()));
313 if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) 318 v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace();
314 exceptionDetailsObject->setStackTrace(m_context->inspector()->debugger() ->createStackTrace(stackTrace)->buildInspectorObjectImpl()); 319 if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0)
315 return exceptionDetailsObject; 320 exceptionDetails->setStackTrace(m_context->inspector()->debugger()-> createStackTrace(stackTrace)->buildInspectorObjectImpl());
321 }
322 if (!exception.IsEmpty()) {
323 std::unique_ptr<protocol::Runtime::RemoteObject> wrapped = wrapObject(er rorString, exception, objectGroup, false /* forceValueType */, generatePreview & & !exception->IsNativeError());
324 if (!wrapped)
325 return nullptr;
326 exceptionDetails->setException(std::move(wrapped));
327 }
328 return exceptionDetails;
316 } 329 }
317 330
318 void InjectedScript::wrapEvaluateResult(ErrorString* errorString, v8::MaybeLocal <v8::Value> maybeResultValue, const v8::TryCatch& tryCatch, const String16& obje ctGroup, bool returnByValue, bool generatePreview, std::unique_ptr<protocol::Run time::RemoteObject>* result, Maybe<protocol::Runtime::ExceptionDetails>* excepti onDetails) 331 void InjectedScript::wrapEvaluateResult(ErrorString* errorString, v8::MaybeLocal <v8::Value> maybeResultValue, const v8::TryCatch& tryCatch, const String16& obje ctGroup, bool returnByValue, bool generatePreview, std::unique_ptr<protocol::Run time::RemoteObject>* result, Maybe<protocol::Runtime::ExceptionDetails>* excepti onDetails)
319 { 332 {
320 v8::Local<v8::Value> resultValue; 333 v8::Local<v8::Value> resultValue;
321 if (!tryCatch.HasCaught()) { 334 if (!tryCatch.HasCaught()) {
322 if (hasInternalError(errorString, !maybeResultValue.ToLocal(&resultValue ))) 335 if (hasInternalError(errorString, !maybeResultValue.ToLocal(&resultValue )))
323 return; 336 return;
324 std::unique_ptr<RemoteObject> remoteObject = wrapObject(errorString, res ultValue, objectGroup, returnByValue, generatePreview); 337 std::unique_ptr<RemoteObject> remoteObject = wrapObject(errorString, res ultValue, objectGroup, returnByValue, generatePreview);
325 if (!remoteObject) 338 if (!remoteObject)
326 return; 339 return;
327 if (objectGroup == "console") 340 if (objectGroup == "console")
328 m_lastEvaluationResult.Reset(m_context->isolate(), resultValue); 341 m_lastEvaluationResult.Reset(m_context->isolate(), resultValue);
329 *result = std::move(remoteObject); 342 *result = std::move(remoteObject);
330 } else { 343 } else {
331 v8::Local<v8::Value> exception = tryCatch.Exception(); 344 v8::Local<v8::Value> exception = tryCatch.Exception();
332 std::unique_ptr<RemoteObject> remoteObject = wrapObject(errorString, exc eption, objectGroup, false, generatePreview && !exception->IsNativeError()); 345 std::unique_ptr<RemoteObject> remoteObject = wrapObject(errorString, exc eption, objectGroup, false, generatePreview && !exception->IsNativeError());
333 if (!remoteObject) 346 if (!remoteObject)
334 return; 347 return;
348 // We send exception in result for compatibility reasons, even though it 's accessible through exceptionDetails.exception.
335 *result = std::move(remoteObject); 349 *result = std::move(remoteObject);
336 *exceptionDetails = createExceptionDetails(tryCatch.Message()); 350 *exceptionDetails = createExceptionDetails(errorString, tryCatch, object Group, generatePreview);
337 } 351 }
338 } 352 }
339 353
340 v8::Local<v8::Object> InjectedScript::commandLineAPI() 354 v8::Local<v8::Object> InjectedScript::commandLineAPI()
341 { 355 {
342 if (m_commandLineAPI.IsEmpty()) 356 if (m_commandLineAPI.IsEmpty())
343 m_commandLineAPI.Reset(m_context->isolate(), V8Console::createCommandLin eAPI(m_context)); 357 m_commandLineAPI.Reset(m_context->isolate(), V8Console::createCommandLin eAPI(m_context));
344 return m_commandLineAPI.Get(m_context->isolate()); 358 return m_commandLineAPI.Get(m_context->isolate());
345 } 359 }
346 360
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 void InjectedScript::CallFrameScope::findInjectedScript(V8InspectorSessionImpl* session) 494 void InjectedScript::CallFrameScope::findInjectedScript(V8InspectorSessionImpl* session)
481 { 495 {
482 std::unique_ptr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(m_err orString, m_remoteCallFrameId); 496 std::unique_ptr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(m_err orString, m_remoteCallFrameId);
483 if (!remoteId) 497 if (!remoteId)
484 return; 498 return;
485 m_frameOrdinal = static_cast<size_t>(remoteId->frameOrdinal()); 499 m_frameOrdinal = static_cast<size_t>(remoteId->frameOrdinal());
486 m_injectedScript = session->findInjectedScript(m_errorString, remoteId.get() ); 500 m_injectedScript = session->findInjectedScript(m_errorString, remoteId.get() );
487 } 501 }
488 502
489 } // namespace v8_inspector 503 } // namespace v8_inspector
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698