Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1122)

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 457913002: Android WebView: flush input events during onVSync (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_host_view_android.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index dd65887f78db5d47ad01b2adc5b5da168d243a18..f587c252d7dbd6fd14e97a719040c0ccb97658b9 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -201,9 +201,9 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
using_synchronous_compositor_(SynchronousCompositorImpl::FromID(
widget_host->GetProcess()->GetID(),
widget_host->GetRoutingID()) != NULL),
+ vsync_subscribers_bitmask_(0),
frame_evictor_(new DelegatedFrameEvictor(this)),
- locks_on_frame_count_(0),
- observing_root_window_(false) {
+ locks_on_frame_count_(0) {
host_->SetView(this);
SetContentViewCore(content_view_core);
ImageTransportFactoryAndroid::AddObserver(this);
@@ -260,9 +260,8 @@ void RenderWidgetHostViewAndroid::WasShown() {
host_->WasShown(ui::LatencyInfo());
if (content_view_core_ && !using_synchronous_compositor_) {
- content_view_core_->GetWindowAndroid()->AddObserver(this);
+ SubscribeToVSync(INPUT | BEGIN_FRAME);
content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
- observing_root_window_ = true;
}
}
@@ -276,10 +275,8 @@ void RenderWidgetHostViewAndroid::WasHidden() {
// utilization.
host_->WasHidden();
- if (content_view_core_ && !using_synchronous_compositor_) {
- content_view_core_->GetWindowAndroid()->RemoveObserver(this);
- observing_root_window_ = false;
- }
+ if (content_view_core_ && !using_synchronous_compositor_)
+ UnsubscribeToVSync(INPUT | BEGIN_FRAME);
jdduke (slow) 2014/08/20 04:11:53 Hmm, this isn't quite what I had in mind. I was th
hush (inactive) 2014/08/20 18:06:50 I see. I will remove |flush_input_requested_| and
}
void RenderWidgetHostViewAndroid::WasResized() {
@@ -811,6 +808,10 @@ void RenderWidgetHostViewAndroid::ShowDisambiguationPopup(
scoped_ptr<SyntheticGestureTarget>
RenderWidgetHostViewAndroid::CreateSyntheticGestureTarget() {
+ DCHECK(content_view_core_);
+ if (using_synchronous_compositor_)
+ SubscribeToVSync(INPUT);
+
return scoped_ptr<SyntheticGestureTarget>(new SyntheticGestureTargetAndroid(
host_, content_view_core_->CreateTouchEventSynthesizer()));
}
@@ -1440,10 +1441,8 @@ void RenderWidgetHostViewAndroid::DidStopFlinging() {
void RenderWidgetHostViewAndroid::SetContentViewCore(
ContentViewCoreImpl* content_view_core) {
RemoveLayers();
- if (observing_root_window_ && content_view_core_) {
- content_view_core_->GetWindowAndroid()->RemoveObserver(this);
- observing_root_window_ = false;
- }
+ if (vsync_subscribers_bitmask_ && content_view_core_)
+ UnsubscribeToVSync(INPUT | BEGIN_FRAME);
bool resize = false;
if (content_view_core != content_view_core_) {
@@ -1470,8 +1469,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
return;
if (!using_synchronous_compositor_) {
- content_view_core_->GetWindowAndroid()->AddObserver(this);
- observing_root_window_ = true;
+ SubscribeToVSync(INPUT | BEGIN_FRAME);
if (needs_begin_frame_)
content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
}
@@ -1518,17 +1516,36 @@ void RenderWidgetHostViewAndroid::OnDetachCompositor() {
RunAckCallbacks();
}
+void RenderWidgetHostViewAndroid::SubscribeToVSync(uint32 type) {
+ if (!vsync_subscribers_bitmask_)
+ content_view_core_->GetWindowAndroid()->AddObserver(this);
+
+ vsync_subscribers_bitmask_ |= type;
+ // Synchronous compositor does not request begin frames OnVSync.
+ DCHECK(!using_synchronous_compositor_ ||
+ !(vsync_subscribers_bitmask_ & BEGIN_FRAME));
+}
+
+void RenderWidgetHostViewAndroid::UnsubscribeToVSync(uint32 type) {
+ vsync_subscribers_bitmask_ &= ~type;
+ if (!vsync_subscribers_bitmask_)
+ content_view_core_->GetWindowAndroid()->RemoveObserver(this);
+}
+
void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time,
base::TimeDelta vsync_period) {
TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::OnVSync");
if (!host_)
return;
- if (flush_input_requested_) {
+ if (vsync_subscribers_bitmask_ & INPUT & flush_input_requested_) {
flush_input_requested_ = false;
host_->FlushInput();
}
+ if (!(vsync_subscribers_bitmask_ & BEGIN_FRAME))
+ return;
+
TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame");
base::TimeTicks display_time = frame_time + vsync_period;
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | ui/android/java/src/org/chromium/ui/VSyncMonitor.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698