Chromium Code Reviews| Index: Source/core/inspector/InjectedScriptBase.cpp |
| diff --git a/Source/core/inspector/InjectedScriptBase.cpp b/Source/core/inspector/InjectedScriptBase.cpp |
| index 243b0e111caa855d6bfc5a90091eaf26a102aeec..67a6bf88820f8340a13eafc126ee4868590361b1 100644 |
| --- a/Source/core/inspector/InjectedScriptBase.cpp |
| +++ b/Source/core/inspector/InjectedScriptBase.cpp |
| @@ -39,10 +39,57 @@ |
| #include "platform/JSONValues.h" |
| #include "wtf/text/WTFString.h" |
| +using WebCore::TypeBuilder::Array; |
| using WebCore::TypeBuilder::Runtime::RemoteObject; |
| namespace WebCore { |
| +static PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> toExceptionDetails(PassRefPtr<JSONObject> object) |
| +{ |
| + String text; |
| + if (!object->getString("text", &text)) |
| + return nullptr; |
| + |
| + RefPtr<TypeBuilder::Debugger::ExceptionDetails> exceptionDetails = TypeBuilder::Debugger::ExceptionDetails::create().setText(text); |
| + String url; |
| + if (object->getString("url", &url)) |
| + exceptionDetails->setUrl(url); |
| + int line = 0; |
| + if (object->getNumber("line", &line)) |
| + exceptionDetails->setLine(line); |
| + int column = 0; |
| + if (object->getNumber("column", &column)) |
| + exceptionDetails->setColumn(column); |
| + RefPtr<JSONArray> stackTrace = object->getArray("stackTrace"); |
| + if (stackTrace && stackTrace->length() > 0) { |
| + RefPtr<TypeBuilder::Array<TypeBuilder::Console::CallFrame> > frames = TypeBuilder::Array<TypeBuilder::Console::CallFrame>::create(); |
| + for (unsigned i = 0; i < stackTrace->length(); ++i) { |
| + RefPtr<JSONObject> stackFrame = stackTrace->get(i)->asObject(); |
| + int lineNumber = 0; |
| + stackFrame->getNumber("lineNumber", &lineNumber); |
| + int column = 0; |
| + stackFrame->getNumber("column", &column); |
| + int scriptId = 0; |
| + stackFrame->getNumber("scriptId", &scriptId); |
| + String sourceURL; |
| + stackFrame->getString("scriptNameOrSourceURL", &sourceURL); |
| + String functionName; |
| + stackFrame->getString("functionName", &functionName); |
| + |
| + RefPtr<TypeBuilder::Console::CallFrame> callFrame = TypeBuilder::Console::CallFrame::create() |
| + .setFunctionName(functionName) |
| + .setScriptId(String::number(scriptId)) |
| + .setUrl(sourceURL) |
| + .setLineNumber(lineNumber) |
| + .setColumnNumber(column); |
| + |
| + frames->addItem(callFrame); |
|
aandrey
2014/07/17 10:10:06
callFrame.release()
kozyatinskiy1
2014/07/17 12:27:23
Done.
|
| + } |
| + exceptionDetails->setStackTrace(frames); |
|
aandrey
2014/07/17 10:10:06
frames.release()
kozyatinskiy1
2014/07/17 12:27:23
Done.
|
| + } |
| + return exceptionDetails; |
|
aandrey
2014/07/17 10:10:06
ditto
kozyatinskiy1
2014/07/17 12:27:23
Done.
|
| +} |
| + |
| InjectedScriptBase::InjectedScriptBase(const String& name) |
| : m_name(name) |
| , m_inspectedStateAccessCheck(0) |
| @@ -121,7 +168,7 @@ void InjectedScriptBase::makeCall(ScriptFunctionCall& function, RefPtr<JSONValue |
| } |
| } |
| -void InjectedScriptBase::makeEvalCall(ErrorString* errorString, ScriptFunctionCall& function, RefPtr<TypeBuilder::Runtime::RemoteObject>* objectResult, TypeBuilder::OptOutput<bool>* wasThrown) |
| +void InjectedScriptBase::makeEvalCall(ErrorString* errorString, ScriptFunctionCall& function, RefPtr<TypeBuilder::Runtime::RemoteObject>* objectResult, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) |
| { |
| RefPtr<JSONValue> result; |
| makeCall(function, &result); |
| @@ -145,6 +192,11 @@ void InjectedScriptBase::makeEvalCall(ErrorString* errorString, ScriptFunctionCa |
| *errorString = "Internal error: result is not a pair of value and wasThrown flag"; |
| return; |
| } |
| + if (wasThrownVal) { |
| + RefPtr<JSONObject> objectExceptionDetails = resultPair->getObject("exceptionDetails"); |
| + if (objectExceptionDetails) |
| + *exceptionDetails = toExceptionDetails(objectExceptionDetails); |
|
aandrey
2014/07/17 10:10:06
objectExceptionDetails.release()
kozyatinskiy1
2014/07/17 12:27:23
Done.
|
| + } |
| *objectResult = TypeBuilder::Runtime::RemoteObject::runtimeCast(resultObj); |
| *wasThrown = wasThrownVal; |
| } |