mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Add new CefV8StackTrace and CefV8StackFrame interfaces to support retrieval of the JavaScript stack trace for the currently active V8 context (issue #682).
git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@727 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
@@ -57,6 +57,7 @@ enum V8TestMode {
|
||||
V8TEST_CONTEXT_EVAL_EXCEPTION,
|
||||
V8TEST_CONTEXT_ENTERED,
|
||||
V8TEST_BINDING,
|
||||
V8TEST_STACK_TRACE,
|
||||
};
|
||||
|
||||
// Renderer side.
|
||||
@@ -160,6 +161,9 @@ class V8RendererTest : public ClientApp::RenderDelegate {
|
||||
case V8TEST_BINDING:
|
||||
RunBindingTest();
|
||||
break;
|
||||
case V8TEST_STACK_TRACE:
|
||||
RunStackTraceTest();
|
||||
break;
|
||||
default:
|
||||
ADD_FAILURE();
|
||||
DestroyTest();
|
||||
@@ -1384,6 +1388,90 @@ class V8RendererTest : public ClientApp::RenderDelegate {
|
||||
DestroyTest();
|
||||
}
|
||||
|
||||
void RunStackTraceTest() {
|
||||
CefRefPtr<CefV8Context> context = GetContext();
|
||||
|
||||
static const char* kFuncName = "myfunc";
|
||||
|
||||
class Handler : public CefV8Handler {
|
||||
public:
|
||||
Handler() {}
|
||||
virtual bool Execute(const CefString& name,
|
||||
CefRefPtr<CefV8Value> object,
|
||||
const CefV8ValueList& arguments,
|
||||
CefRefPtr<CefV8Value>& retval,
|
||||
CefString& exception) OVERRIDE {
|
||||
EXPECT_STREQ(kFuncName, name.ToString().c_str());
|
||||
|
||||
stack_trace_ = CefV8StackTrace::GetCurrent(10);
|
||||
|
||||
retval = CefV8Value::CreateInt(3);
|
||||
got_execute_.yes();
|
||||
return true;
|
||||
}
|
||||
|
||||
TrackCallback got_execute_;
|
||||
CefRefPtr<CefV8StackTrace> stack_trace_;
|
||||
|
||||
IMPLEMENT_REFCOUNTING(Handler);
|
||||
};
|
||||
|
||||
// Enter the V8 context.
|
||||
EXPECT_TRUE(context->Enter());
|
||||
|
||||
Handler* handler = new Handler;
|
||||
CefRefPtr<CefV8Handler> handlerPtr(handler);
|
||||
|
||||
CefRefPtr<CefV8Value> func =
|
||||
CefV8Value::CreateFunction(kFuncName, handler);
|
||||
EXPECT_TRUE(func.get());
|
||||
CefRefPtr<CefV8Value> obj = context->GetGlobal();
|
||||
EXPECT_TRUE(obj.get());
|
||||
obj->SetValue(kFuncName, func, V8_PROPERTY_ATTRIBUTE_NONE);
|
||||
|
||||
CefRefPtr<CefV8Value> retval;
|
||||
CefRefPtr<CefV8Exception> exception;
|
||||
|
||||
EXPECT_TRUE(context->Eval(
|
||||
"function jsfunc() { return window.myfunc(); }\n"
|
||||
"jsfunc();",
|
||||
retval, exception));
|
||||
EXPECT_TRUE(retval.get());
|
||||
EXPECT_TRUE(retval->IsInt());
|
||||
EXPECT_EQ(3, retval->GetIntValue());
|
||||
EXPECT_FALSE(exception.get());
|
||||
|
||||
EXPECT_TRUE(handler->stack_trace_.get());
|
||||
EXPECT_EQ(2, handler->stack_trace_->GetFrameCount());
|
||||
|
||||
CefRefPtr<CefV8StackFrame> frame;
|
||||
|
||||
frame = handler->stack_trace_->GetFrame(0);
|
||||
EXPECT_TRUE(frame->GetScriptName().empty());
|
||||
EXPECT_TRUE(frame->GetScriptNameOrSourceURL().empty());
|
||||
EXPECT_STREQ("jsfunc", frame->GetFunctionName().ToString().c_str());
|
||||
EXPECT_EQ(1, frame->GetLineNumber());
|
||||
EXPECT_EQ(35, frame->GetColumn());
|
||||
EXPECT_TRUE(frame.get());
|
||||
EXPECT_TRUE(frame->IsEval());
|
||||
EXPECT_FALSE(frame->IsConstructor());
|
||||
|
||||
frame = handler->stack_trace_->GetFrame(1);
|
||||
EXPECT_TRUE(frame->GetScriptName().empty());
|
||||
EXPECT_TRUE(frame->GetScriptNameOrSourceURL().empty());
|
||||
EXPECT_TRUE(frame->GetFunctionName().empty());
|
||||
EXPECT_EQ(2, frame->GetLineNumber());
|
||||
EXPECT_EQ(1, frame->GetColumn());
|
||||
EXPECT_TRUE(frame.get());
|
||||
EXPECT_TRUE(frame->IsEval());
|
||||
EXPECT_FALSE(frame->IsConstructor());
|
||||
|
||||
// Exit the V8 context.
|
||||
EXPECT_TRUE(context->Exit());
|
||||
|
||||
DestroyTest();
|
||||
}
|
||||
|
||||
virtual void OnContextCreated(CefRefPtr<ClientApp> app,
|
||||
CefRefPtr<CefBrowser> browser,
|
||||
CefRefPtr<CefFrame> frame,
|
||||
@@ -1613,3 +1701,4 @@ V8_TEST(ContextEval, V8TEST_CONTEXT_EVAL);
|
||||
V8_TEST(ContextEvalException, V8TEST_CONTEXT_EVAL_EXCEPTION);
|
||||
V8_TEST_EX(ContextEntered, V8TEST_CONTEXT_ENTERED, NULL);
|
||||
V8_TEST_EX(Binding, V8TEST_BINDING, kV8BindingTestUrl);
|
||||
V8_TEST(StackTrace, V8TEST_STACK_TRACE);
|
||||
|
Reference in New Issue
Block a user