summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/browser/browser_view_renderer.cc28
-rw-r--r--android_webview/browser/browser_view_renderer.h1
-rw-r--r--android_webview/browser/browser_view_renderer_unittest.cc36
-rw-r--r--android_webview/browser/test/fake_window.cc4
-rw-r--r--android_webview/browser/test/fake_window.h2
-rw-r--r--android_webview/browser/test/rendering_test.h2
6 files changed, 61 insertions, 12 deletions
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc
index ded772d..a2432ef 100644
--- a/android_webview/browser/browser_view_renderer.cc
+++ b/android_webview/browser/browser_view_renderer.cc
@@ -143,14 +143,28 @@ void BrowserViewRenderer::PrepareToDraw(const gfx::Vector2d& scroll,
last_on_draw_global_visible_rect_ = global_visible_rect;
}
-bool BrowserViewRenderer::OnDrawHardware() {
- TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware");
- shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI();
+bool BrowserViewRenderer::CanOnDraw() {
if (!compositor_) {
TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_NoCompositor",
TRACE_EVENT_SCOPE_THREAD);
return false;
}
+ if (clear_view_) {
+ TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView",
+ TRACE_EVENT_SCOPE_THREAD);
+ return false;
+ }
+
+ return true;
+}
+
+bool BrowserViewRenderer::OnDrawHardware() {
+ TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware");
+ shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI();
+
+ if (!CanOnDraw()) {
+ return false;
+ }
shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_);
@@ -270,13 +284,7 @@ void BrowserViewRenderer::InvalidateOnFunctorDestroy() {
}
bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) {
- if (!compositor_) {
- TRACE_EVENT_INSTANT0(
- "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD);
- return false;
- }
-
- return CompositeSW(canvas);
+ return CanOnDraw() && CompositeSW(canvas);
}
skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width,
diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h
index e1388a5..64e848b 100644
--- a/android_webview/browser/browser_view_renderer.h
+++ b/android_webview/browser/browser_view_renderer.h
@@ -105,6 +105,7 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient {
private:
void SetTotalRootLayerScrollOffset(gfx::Vector2dF new_value_dip);
+ bool CanOnDraw();
// Checks the continuous invalidate and block invalidate state, and schedule
// invalidates appropriately. If |force_invalidate| is true, then send a view
// invalidate regardless of compositor expectation. If |skip_reschedule_tick|
diff --git a/android_webview/browser/browser_view_renderer_unittest.cc b/android_webview/browser/browser_view_renderer_unittest.cc
index 0c2786b..b4a9d42 100644
--- a/android_webview/browser/browser_view_renderer_unittest.cc
+++ b/android_webview/browser/browser_view_renderer_unittest.cc
@@ -23,4 +23,40 @@ class SmokeTest : public RenderingTest {
RENDERING_TEST_F(SmokeTest);
+class ClearViewTest : public RenderingTest {
+ public:
+ ClearViewTest() : on_draw_count_(0u) {}
+
+ void StartTest() override {
+ browser_view_renderer_->SetContinuousInvalidate(true);
+ browser_view_renderer_->ClearView();
+ }
+
+ void WillOnDraw() override {
+ on_draw_count_++;
+ if (on_draw_count_ == 2u) {
+ browser_view_renderer_->SetContinuousInvalidate(false);
+ }
+ }
+
+ void DidOnDraw(bool success) override {
+ if (on_draw_count_ == 1u) {
+ // First OnDraw should be skipped due to ClearView.
+ EXPECT_FALSE(success);
+ browser_view_renderer_->DidUpdateContent(); // Unset ClearView.
+ } else {
+ // Following OnDraws should succeed.
+ EXPECT_TRUE(success);
+ }
+ }
+
+ void DidDrawOnRT(SharedRendererState* functor) override {
+ EndTest();
+ }
+ private:
+ size_t on_draw_count_;
+};
+
+RENDERING_TEST_F(ClearViewTest);
+
} // namespace android_webview
diff --git a/android_webview/browser/test/fake_window.cc b/android_webview/browser/test/fake_window.cc
index c709f62e..8b13213 100644
--- a/android_webview/browser/test/fake_window.cc
+++ b/android_webview/browser/test/fake_window.cc
@@ -52,6 +52,8 @@ FakeWindow::FakeWindow(BrowserViewRenderer* view,
CheckCurrentlyOnUIThread();
DCHECK(view_);
view_->OnAttachedToWindow(location_.width(), location_.height());
+ view_->SetWindowVisibility(true);
+ view_->SetViewVisibility(true);
}
FakeWindow::~FakeWindow() {
@@ -117,7 +119,9 @@ void FakeWindow::OnDrawHardware() {
DCHECK(on_draw_hardware_pending_);
on_draw_hardware_pending_ = false;
+ hooks_->WillOnDraw();
bool success = view_->OnDrawHardware();
+ hooks_->DidOnDraw(success);
if (success) {
CreateRenderThreadIfNeeded();
diff --git a/android_webview/browser/test/fake_window.h b/android_webview/browser/test/fake_window.h
index abe9ec0..18b0cf4 100644
--- a/android_webview/browser/test/fake_window.h
+++ b/android_webview/browser/test/fake_window.h
@@ -29,7 +29,7 @@ class WindowHooks {
virtual ~WindowHooks() {}
virtual void WillOnDraw() = 0;
- virtual void DidOnDraw() = 0;
+ virtual void DidOnDraw(bool success) = 0;
virtual void WillSyncOnRT(SharedRendererState* functor) = 0;
virtual void DidSyncOnRT(SharedRendererState* functor) = 0;
diff --git a/android_webview/browser/test/rendering_test.h b/android_webview/browser/test/rendering_test.h
index e5c64ed..561d13c 100644
--- a/android_webview/browser/test/rendering_test.h
+++ b/android_webview/browser/test/rendering_test.h
@@ -45,7 +45,7 @@ class RenderingTest : public testing::Test,
// WindowHooks overrides.
void WillOnDraw() override {}
- void DidOnDraw() override {}
+ void DidOnDraw(bool success) override {}
void WillSyncOnRT(SharedRendererState* functor) override {}
void DidSyncOnRT(SharedRendererState* functor) override {}
void WillProcessOnRT(SharedRendererState* functor) override {}