| Index: content/shell/renderer/test_runner/test_runner.cc
|
| diff --git a/content/shell/renderer/test_runner/test_runner.cc b/content/shell/renderer/test_runner/test_runner.cc
|
| index 20fbd0cf4137834397a2478e2ee599a6472a394e..667a3f2e2eef62e086d18899ed09e9c6ae8d9dc6 100644
|
| --- a/content/shell/renderer/test_runner/test_runner.cc
|
| +++ b/content/shell/renderer/test_runner/test_runner.cc
|
| @@ -20,6 +20,7 @@
|
| #include "gin/handle.h"
|
| #include "gin/object_template_builder.h"
|
| #include "gin/wrappable.h"
|
| +#include "third_party/WebKit/public/platform/WebArrayBuffer.h"
|
| #include "third_party/WebKit/public/platform/WebBatteryStatus.h"
|
| #include "third_party/WebKit/public/platform/WebCanvas.h"
|
| #include "third_party/WebKit/public/platform/WebData.h"
|
| @@ -27,6 +28,7 @@
|
| #include "third_party/WebKit/public/platform/WebDeviceOrientationData.h"
|
| #include "third_party/WebKit/public/platform/WebPoint.h"
|
| #include "third_party/WebKit/public/platform/WebURLResponse.h"
|
| +#include "third_party/WebKit/public/web/WebArrayBufferConverter.h"
|
| #include "third_party/WebKit/public/web/WebBindings.h"
|
| #include "third_party/WebKit/public/web/WebDataSource.h"
|
| #include "third_party/WebKit/public/web/WebDocument.h"
|
| @@ -42,6 +44,7 @@
|
| #include "third_party/WebKit/public/web/WebSettings.h"
|
| #include "third_party/WebKit/public/web/WebSurroundingText.h"
|
| #include "third_party/WebKit/public/web/WebView.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
| #include "third_party/skia/include/core/SkCanvas.h"
|
|
|
| #if defined(__linux__) || defined(ANDROID)
|
| @@ -81,7 +84,8 @@ class InvokeCallbackTask : public WebMethodTask<TestRunner> {
|
| public:
|
| InvokeCallbackTask(TestRunner* object, v8::Handle<v8::Function> callback)
|
| : WebMethodTask<TestRunner>(object),
|
| - callback_(blink::mainThreadIsolate(), callback) {}
|
| + callback_(blink::mainThreadIsolate(), callback),
|
| + argc_(0) {}
|
|
|
| virtual void runIfValid() OVERRIDE {
|
| v8::Isolate* isolate = blink::mainThreadIsolate();
|
| @@ -94,15 +98,32 @@ class InvokeCallbackTask : public WebMethodTask<TestRunner> {
|
|
|
| v8::Context::Scope context_scope(context);
|
|
|
| + scoped_ptr<v8::Handle<v8::Value>[]> local_argv;
|
| + if (argc_) {
|
| + local_argv.reset(new v8::Handle<v8::Value>[argc_]);
|
| + for (int i = 0; i < argc_; ++i)
|
| + local_argv[i] = v8::Local<v8::Value>::New(isolate, argv_[i]);
|
| + }
|
| +
|
| frame->callFunctionEvenIfScriptDisabled(
|
| v8::Local<v8::Function>::New(isolate, callback_),
|
| context->Global(),
|
| - 0,
|
| - NULL);
|
| + argc_,
|
| + local_argv.get());
|
| + }
|
| +
|
| + void SetArguments(int argc, v8::Handle<v8::Value> argv[]) {
|
| + v8::Isolate* isolate = blink::mainThreadIsolate();
|
| + argc_ = argc;
|
| + argv_.reset(new v8::UniquePersistent<v8::Value>[argc]);
|
| + for (int i = 0; i < argc; ++i)
|
| + argv_[i] = v8::UniquePersistent<v8::Value>(isolate, argv[i]);
|
| }
|
|
|
| private:
|
| v8::UniquePersistent<v8::Function> callback_;
|
| + int argc_;
|
| + scoped_ptr<v8::UniquePersistent<v8::Value>[]> argv_;
|
| };
|
|
|
| class TestRunnerBindings : public gin::Wrappable<TestRunnerBindings> {
|
| @@ -256,6 +277,7 @@ class TestRunnerBindings : public gin::Wrappable<TestRunnerBindings> {
|
| void RemoveWebPageOverlay();
|
| void DisplayAsync();
|
| void DisplayAsyncThen(v8::Handle<v8::Function> callback);
|
| + void CapturePixelsAsyncThen(v8::Handle<v8::Function> callback);
|
| void SetCustomTextOutput(std::string output);
|
| void SetViewSourceForFrame(const std::string& name, bool enabled);
|
| void setMockPushClientSuccess(const std::string& end_point,
|
| @@ -500,6 +522,7 @@ gin::ObjectTemplateBuilder TestRunnerBindings::GetObjectTemplateBuilder(
|
| &TestRunnerBindings::RemoveWebPageOverlay)
|
| .SetMethod("displayAsync", &TestRunnerBindings::DisplayAsync)
|
| .SetMethod("displayAsyncThen", &TestRunnerBindings::DisplayAsyncThen)
|
| + .SetMethod("capturePixelsAsyncThen", &TestRunnerBindings::CapturePixelsAsyncThen)
|
| .SetMethod("setCustomTextOutput",
|
| &TestRunnerBindings::SetCustomTextOutput)
|
| .SetMethod("setViewSourceForFrame",
|
| @@ -1300,6 +1323,12 @@ void TestRunnerBindings::DisplayAsyncThen(v8::Handle<v8::Function> callback) {
|
| runner_->DisplayAsyncThen(callback);
|
| }
|
|
|
| +void TestRunnerBindings::CapturePixelsAsyncThen(
|
| + v8::Handle<v8::Function> callback) {
|
| + if (runner_)
|
| + runner_->CapturePixelsAsyncThen(callback);
|
| +}
|
| +
|
| void TestRunnerBindings::SetCustomTextOutput(std::string output) {
|
| runner_->setCustomTextOutput(output);
|
| }
|
| @@ -2717,6 +2746,46 @@ void TestRunner::DisplayAsyncThen(v8::Handle<v8::Function> callback) {
|
| base::Passed(&task)));
|
| }
|
|
|
| +void TestRunner::CapturePixelsAsyncThen(v8::Handle<v8::Function> callback) {
|
| + scoped_ptr<InvokeCallbackTask> task(
|
| + new InvokeCallbackTask(this, callback));
|
| + proxy_->CapturePixelsAsync(base::Bind(&TestRunner::CapturePixelsCallback,
|
| + base::Unretained(this),
|
| + base::Passed(&task)));
|
| +}
|
| +
|
| +void TestRunner::CapturePixelsCallback(scoped_ptr<InvokeCallbackTask> task,
|
| + const SkBitmap& snapshot) {
|
| + v8::Isolate* isolate = blink::mainThreadIsolate();
|
| + v8::HandleScope handle_scope(isolate);
|
| +
|
| + v8::Handle<v8::Context> context =
|
| + web_view_->mainFrame()->mainWorldScriptContext();
|
| + if (context.IsEmpty())
|
| + return;
|
| +
|
| + v8::Context::Scope context_scope(context);
|
| + v8::Handle<v8::Value> argv[3];
|
| + SkAutoLockPixels snapshot_lock(snapshot);
|
| +
|
| + int width = snapshot.info().fWidth;
|
| + DCHECK_NE(0, width);
|
| + argv[0] = v8::Number::New(isolate, width);
|
| +
|
| + int height = snapshot.info().fHeight;
|
| + DCHECK_NE(0, height);
|
| + argv[1] = v8::Number::New(isolate, height);
|
| +
|
| + blink::WebArrayBuffer buffer =
|
| + blink::WebArrayBuffer::create(snapshot.getSize(), 1);
|
| + memcpy(buffer.data(), snapshot.getPixels(), buffer.byteLength());
|
| + argv[2] = blink::WebArrayBufferConverter::toV8Value(
|
| + &buffer, context->Global(), isolate);
|
| +
|
| + task->SetArguments(3, argv);
|
| + InvokeCallback(task.Pass());
|
| +}
|
| +
|
| void TestRunner::SetMockPushClientSuccess(
|
| const std::string& end_point, const std::string& registration_id) {
|
| proxy_->GetPushClientMock()->SetMockSuccessValues(end_point, registration_id);
|
|
|