diff options
author | benm@chromium.org <benm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-25 22:51:05 +0000 |
---|---|---|
committer | benm@chromium.org <benm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-25 22:51:05 +0000 |
commit | 8a637cce51738ebb95930f1acdfb55494dde9417 (patch) | |
tree | 911126a689def428b966f047fd9ca93d4686ac5a /android_webview | |
parent | c65f01e7743fee89d09e8e763ec02353621ff044 (diff) | |
download | chromium_src-8a637cce51738ebb95930f1acdfb55494dde9417.zip chromium_src-8a637cce51738ebb95930f1acdfb55494dde9417.tar.gz chromium_src-8a637cce51738ebb95930f1acdfb55494dde9417.tar.bz2 |
[Android WebView] Don't trigger a client invalidation from DrawGL
DrawGL needs to invalidate the compositor, but must not invalidate
the client. This is because the client will trigger an asynchronous
call to DrawGL again, and we end up in a loop.
BUG=b/8707883
Review URL: https://chromiumcodereview.appspot.com/14060019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@196519 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r-- | android_webview/browser/browser_view_renderer_impl.cc | 15 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer_impl.h | 2 |
2 files changed, 15 insertions, 2 deletions
diff --git a/android_webview/browser/browser_view_renderer_impl.cc b/android_webview/browser/browser_view_renderer_impl.cc index ce5821f..3c3a1fd 100644 --- a/android_webview/browser/browser_view_renderer_impl.cc +++ b/android_webview/browser/browser_view_renderer_impl.cc @@ -147,7 +147,8 @@ BrowserViewRendererImpl::BrowserViewRendererImpl( web_contents_(NULL), update_frame_info_callback_( base::Bind(&BrowserViewRendererImpl::OnFrameInfoUpdated, - base::Unretained(ALLOW_THIS_IN_INITIALIZER_LIST(this)))) { + base::Unretained(ALLOW_THIS_IN_INITIALIZER_LIST(this)))), + prevent_client_invalidate_(false) { DCHECK(java_helper); @@ -233,7 +234,15 @@ void BrowserViewRendererImpl::DrawGL(AwDrawGLInfo* draw_info) { } compositor_->SetWindowBounds(gfx::Size(draw_info->width, draw_info->height)); + + // We need to trigger a compositor invalidate because otherwise, if nothing + // has changed since last draw the compositor will early out (Android may + // trigger a draw at anytime). However, we don't want to trigger a client + // (i.e. Android View system) invalidate as a result of this (otherwise we'll + // end up in a loop of DrawGL calls). + prevent_client_invalidate_ = true; compositor_->SetNeedsRedraw(); + prevent_client_invalidate_ = false; if (draw_info->is_layer) { // When rendering into a separate layer no view clipping, transform, @@ -441,7 +450,9 @@ void BrowserViewRendererImpl::ScheduleComposite() { return; is_composite_pending_ = true; - Invalidate(); + + if (!prevent_client_invalidate_) + Invalidate(); } skia::RefPtr<SkPicture> BrowserViewRendererImpl::GetLastCapturedPicture() { diff --git a/android_webview/browser/browser_view_renderer_impl.h b/android_webview/browser/browser_view_renderer_impl.h index 1de1794..d9b0b06 100644 --- a/android_webview/browser/browser_view_renderer_impl.h +++ b/android_webview/browser/browser_view_renderer_impl.h @@ -136,6 +136,8 @@ class BrowserViewRendererImpl // Used to observe frame metadata updates. content::ContentViewCore::UpdateFrameInfoCallback update_frame_info_callback_; + bool prevent_client_invalidate_; + DISALLOW_COPY_AND_ASSIGN(BrowserViewRendererImpl); }; |