diff options
Diffstat (limited to 'android_webview')
-rw-r--r-- | android_webview/browser/browser_view_renderer.cc | 28 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer.h | 1 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer_unittest.cc | 36 | ||||
-rw-r--r-- | android_webview/browser/test/fake_window.cc | 4 | ||||
-rw-r--r-- | android_webview/browser/test/fake_window.h | 2 | ||||
-rw-r--r-- | android_webview/browser/test/rendering_test.h | 2 |
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 {} |