Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
index 5fb48340e8e0d9797cbd848df330f0bc9e38b379..fe65bc1d0651a379c827f89cdeadb5937170cf36 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
@@ -440,6 +440,9 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host, |
has_composition_text_(false), |
accept_return_character_(false), |
begin_frame_source_(nullptr), |
+ needs_begin_frames_(false), |
+ needs_flush_input_(false), |
+ added_frame_observer_(false), |
synthetic_move_sent_(false), |
cursor_visibility_state_in_renderer_(UNKNOWN), |
#if defined(OS_WIN) |
@@ -712,10 +715,25 @@ ui::TextInputClient* RenderWidgetHostViewAura::GetTextInputClient() { |
} |
void RenderWidgetHostViewAura::SetNeedsBeginFrames(bool needs_begin_frames) { |
+ needs_begin_frames_ = needs_begin_frames; |
+ UpdateNeedsBeginFramesInternal(); |
+} |
+ |
+void RenderWidgetHostViewAura::OnSetNeedsFlushInput() { |
+ needs_flush_input_ = true; |
+ UpdateNeedsBeginFramesInternal(); |
+} |
+ |
+void RenderWidgetHostViewAura::UpdateNeedsBeginFramesInternal() { |
if (!begin_frame_source_) |
return; |
- if (needs_begin_frames) |
+ bool needs_frame = needs_begin_frames_ || needs_flush_input_; |
+ if (needs_frame == added_frame_observer_) |
+ return; |
+ |
+ added_frame_observer_ = needs_frame; |
+ if (needs_frame) |
begin_frame_source_->AddObserver(this); |
else |
begin_frame_source_->RemoveObserver(this); |
@@ -723,6 +741,9 @@ void RenderWidgetHostViewAura::SetNeedsBeginFrames(bool needs_begin_frames) { |
void RenderWidgetHostViewAura::OnBeginFrame( |
const cc::BeginFrameArgs& args) { |
+ needs_flush_input_ = false; |
+ host_->FlushInput(); |
+ UpdateNeedsBeginFramesInternal(); |
host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args)); |
last_begin_frame_args_ = args; |
} |
@@ -2924,12 +2945,12 @@ void RenderWidgetHostViewAura::DelegatedFrameHostOnLostCompositorResources() { |
void RenderWidgetHostViewAura::SetBeginFrameSource( |
cc::BeginFrameSource* source) { |
- bool needs_begin_frames = host_->needs_begin_frames(); |
- if (begin_frame_source_ && needs_begin_frames) |
+ if (begin_frame_source_ && added_frame_observer_) { |
begin_frame_source_->RemoveObserver(this); |
+ added_frame_observer_ = false; |
+ } |
begin_frame_source_ = source; |
- if (begin_frame_source_ && needs_begin_frames) |
- begin_frame_source_->AddObserver(this); |
+ UpdateNeedsBeginFramesInternal(); |
} |
bool RenderWidgetHostViewAura::IsAutoResizeEnabled() const { |