| Index: content/renderer/gpu/gpu_benchmarking_extension.cc
|
| diff --git a/content/renderer/gpu/gpu_benchmarking_extension.cc b/content/renderer/gpu/gpu_benchmarking_extension.cc
|
| index 6f4fccc4bf99f77475c63c588a7392a0493e6801..2e0f1aed7064486d94fcb5ecfd0d5dd24375abc1 100644
|
| --- a/content/renderer/gpu/gpu_benchmarking_extension.cc
|
| +++ b/content/renderer/gpu/gpu_benchmarking_extension.cc
|
| @@ -135,15 +135,18 @@ class GpuBenchmarkingWrapper : public v8::Extension {
|
| " return PrintToSkPicture(dirname);"
|
| "};"
|
| "chrome.gpuBenchmarking.beginSmoothScrollDown = "
|
| - " function(scroll_far) {"
|
| + " function(scroll_far, opt_callback) {"
|
| " scroll_far = scroll_far || false;"
|
| + " callback = opt_callback || function() { };"
|
| " native function BeginSmoothScroll();"
|
| - " return BeginSmoothScroll(true, scroll_far);"
|
| + " return BeginSmoothScroll(true, scroll_far, callback);"
|
| "};"
|
| - "chrome.gpuBenchmarking.beginSmoothScrollUp = function(scroll_far) {"
|
| + "chrome.gpuBenchmarking.beginSmoothScrollUp = "
|
| + " function(scroll_far, opt_callback) {"
|
| " scroll_far = scroll_far || false;"
|
| + " callback = opt_callback || function() { };"
|
| " native function BeginSmoothScroll();"
|
| - " return BeginSmoothScroll(false, scroll_far);"
|
| + " return BeginSmoothScroll(false, scroll_far, callback);"
|
| "};"
|
| "chrome.gpuBenchmarking.runRenderingBenchmarks = function(filter) {"
|
| " native function RunRenderingBenchmarks();"
|
| @@ -230,6 +233,21 @@ class GpuBenchmarkingWrapper : public v8::Extension {
|
| return v8::Undefined();
|
| }
|
|
|
| + static void OnSmoothScrollCompleted(v8::Persistent<v8::Function> callback,
|
| + v8::Persistent<v8::Context> context) {
|
| + v8::HandleScope scope;
|
| + v8::Context::Scope context_scope(context);
|
| + WebFrame* frame = WebFrame::frameForContext(context);
|
| + if (frame) {
|
| + frame->callFunctionEvenIfScriptDisabled(callback,
|
| + v8::Object::New(),
|
| + 0,
|
| + NULL);
|
| + }
|
| + callback.Dispose();
|
| + context.Dispose();
|
| + }
|
| +
|
| static v8::Handle<v8::Value> BeginSmoothScroll(const v8::Arguments& args) {
|
| WebFrame* web_frame = WebFrame::frameForEnteredContext();
|
| if (!web_frame)
|
| @@ -243,13 +261,31 @@ class GpuBenchmarkingWrapper : public v8::Extension {
|
| if (!render_view_impl)
|
| return v8::Undefined();
|
|
|
| - if (args.Length() != 2 || !args[0]->IsBoolean() || !args[1]->IsBoolean())
|
| + if (args.Length() != 3 ||
|
| + !args[0]->IsBoolean() ||
|
| + !args[1]->IsBoolean() ||
|
| + !args[2]->IsFunction())
|
| return v8::False();
|
|
|
| bool scroll_down = args[0]->BooleanValue();
|
| bool scroll_far = args[1]->BooleanValue();
|
| + v8::Local<v8::Function> callback_local =
|
| + v8::Local<v8::Function>(v8::Function::Cast(*args[2]));
|
| + v8::Persistent<v8::Function> callback =
|
| + v8::Persistent<v8::Function>::New(callback_local);
|
| + v8::Persistent<v8::Context> context =
|
| + v8::Persistent<v8::Context>::New(web_frame->mainWorldScriptContext());
|
| +
|
| + // TODO(nduca): If the render_view_impl is destroyed while the gesture is in
|
| + // progress, we will leak the callback and context. This needs to be fixed,
|
| + // somehow.
|
| + render_view_impl->BeginSmoothScroll(
|
| + scroll_down,
|
| + scroll_far,
|
| + base::Bind(&OnSmoothScrollCompleted,
|
| + callback,
|
| + context));
|
|
|
| - render_view_impl->BeginSmoothScroll(scroll_down, scroll_far);
|
| return v8::True();
|
| }
|
|
|
|
|