blob: 2a31d53e60309df3a3093f48ceeb8d797916d9fa [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/browser/test/rendering_test.h"
#include <utility>
#include "android_webview/browser/browser_view_renderer.h"
#include "android_webview/browser/child_frame.h"
#include "android_webview/browser/render_thread_manager.h"
#include "base/location.h"
#include "base/thread_task_runner_handle.h"
#include "cc/output/compositor_frame.h"
#include "content/public/test/test_synchronous_compositor_android.h"
namespace android_webview {
namespace {
// BrowserViewRenderer subclass used for enabling tests to observe
// OnParentDrawConstraintsUpdated.
class TestBrowserViewRenderer : public BrowserViewRenderer {
public:
TestBrowserViewRenderer(
RenderingTest* rendering_test,
const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner)
: BrowserViewRenderer(rendering_test, ui_task_runner),
rendering_test_(rendering_test) {}
void OnParentDrawConstraintsUpdated() override {
BrowserViewRenderer::OnParentDrawConstraintsUpdated();
rendering_test_->OnParentDrawConstraintsUpdated();
}
private:
RenderingTest* const rendering_test_;
};
}
RenderingTest::RenderingTest() : message_loop_(new base::MessageLoop) {
ui_task_runner_ = base::ThreadTaskRunnerHandle::Get();
}
RenderingTest::~RenderingTest() {
if (window_.get())
window_->Detach();
}
void RenderingTest::SetUpTestHarness() {
DCHECK(!browser_view_renderer_.get());
DCHECK(!render_thread_manager_.get());
render_thread_manager_.reset(
new RenderThreadManager(this, base::ThreadTaskRunnerHandle::Get()));
browser_view_renderer_.reset(new TestBrowserViewRenderer(
this, base::ThreadTaskRunnerHandle::Get()));
browser_view_renderer_->SetCompositorFrameConsumer(
render_thread_manager_.get());
InitializeCompositor();
Attach();
}
CompositorFrameConsumer* RenderingTest::GetCompositorFrameConsumer() {
return render_thread_manager_.get();
}
CompositorFrameProducer* RenderingTest::GetCompositorFrameProducer() {
return browser_view_renderer_.get();
}
void RenderingTest::InitializeCompositor() {
DCHECK(!compositor_.get());
DCHECK(browser_view_renderer_.get());
compositor_.reset(new content::TestSynchronousCompositor);
compositor_->SetClient(browser_view_renderer_.get());
}
void RenderingTest::Attach() {
window_.reset(new FakeWindow(browser_view_renderer_.get(),
render_thread_manager_.get(), this,
gfx::Rect(100, 100)));
}
void RenderingTest::RunTest() {
SetUpTestHarness();
ui_task_runner_->PostTask(
FROM_HERE, base::Bind(&RenderingTest::StartTest, base::Unretained(this)));
message_loop_->Run();
}
void RenderingTest::StartTest() {
EndTest();
}
void RenderingTest::EndTest() {
ui_task_runner_->PostTask(
FROM_HERE,
base::Bind(&RenderingTest::QuitMessageLoop, base::Unretained(this)));
}
void RenderingTest::QuitMessageLoop() {
DCHECK_EQ(base::MessageLoop::current(), message_loop_.get());
message_loop_->QuitWhenIdle();
}
std::unique_ptr<cc::CompositorFrame> RenderingTest::ConstructEmptyFrame() {
std::unique_ptr<cc::CompositorFrame> compositor_frame(
new cc::CompositorFrame);
std::unique_ptr<cc::DelegatedFrameData> frame(new cc::DelegatedFrameData);
std::unique_ptr<cc::RenderPass> root_pass(cc::RenderPass::Create());
gfx::Rect viewport(browser_view_renderer_->size());
root_pass->SetNew(cc::RenderPassId(1, 1), viewport, viewport,
gfx::Transform());
frame->render_pass_list.push_back(std::move(root_pass));
compositor_frame->delegated_frame_data = std::move(frame);
return compositor_frame;
}
void RenderingTest::WillOnDraw() {
DCHECK(compositor_);
compositor_->SetHardwareFrame(0u, ConstructEmptyFrame());
}
bool RenderingTest::RequestInvokeGL(bool wait_for_completion) {
window_->RequestInvokeGL(wait_for_completion);
return true;
}
bool RenderingTest::WillDrawOnRT(RenderThreadManager* functor,
AwDrawGLInfo* draw_info) {
draw_info->width = window_->surface_size().width();
draw_info->height = window_->surface_size().height();
draw_info->is_layer = false;
gfx::Transform transform;
transform.matrix().asColMajorf(draw_info->transform);
return true;
}
void RenderingTest::OnNewPicture() {
}
void RenderingTest::PostInvalidate() {
if (window_)
window_->PostInvalidate();
}
void RenderingTest::DetachFunctorFromView() {
}
gfx::Point RenderingTest::GetLocationOnScreen() {
return gfx::Point();
}
} // namespace android_webview