Chromium Code Reviews| 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 eee2df69b76756f82a597511cb8b934f22227e9e..b503b90476ed30c5193c6d2f48fe258e90289f60 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
| @@ -17,7 +17,6 @@ |
| #include "cc/output/copy_output_request.h" |
| #include "cc/output/copy_output_result.h" |
| #include "cc/resources/texture_mailbox.h" |
| -#include "cc/trees/layer_tree_settings.h" |
| #include "content/browser/accessibility/browser_accessibility_manager.h" |
| #include "content/browser/accessibility/browser_accessibility_state_impl.h" |
| #include "content/browser/frame_host/frame_tree.h" |
| @@ -61,7 +60,6 @@ |
| #include "ui/base/hit_test.h" |
| #include "ui/base/ime/input_method.h" |
| #include "ui/base/ui_base_types.h" |
| -#include "ui/compositor/compositor_vsync_manager.h" |
| #include "ui/compositor/dip_util.h" |
| #include "ui/events/event.h" |
| #include "ui/events/event_utils.h" |
| @@ -452,6 +450,8 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host) |
| #endif |
| has_snapped_to_boundary_(false), |
| touch_editing_client_(NULL), |
| + needs_begin_frame_(false), |
| + begin_frame_scheduling_is_enabled_(false), |
| weak_ptr_factory_(this) { |
| host_->SetView(this); |
| window_observer_.reset(new WindowObserver(this)); |
| @@ -465,11 +465,24 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host) |
| bool overscroll_enabled = CommandLine::ForCurrentProcess()-> |
| GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0"; |
| SetOverscrollControllerEnabled(overscroll_enabled); |
| + |
| +#if !defined(OS_CHROMEOS) |
| + begin_frame_scheduling_is_enabled_ = true; |
|
brianderson
2014/09/04 18:45:46
Can we assume this is true for all Aura platforms?
|
| +#endif |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| // RenderWidgetHostViewAura, RenderWidgetHostView implementation: |
| +bool RenderWidgetHostViewAura::OnMessageReceived(const IPC::Message& msg) { |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAura, msg) |
| + IPC_MESSAGE_HANDLER(ViewHostMsg_SetNeedsBeginFrame, OnSetNeedsBeginFrame) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| +} |
| + |
| void RenderWidgetHostViewAura::InitAsChild( |
| gfx::NativeView parent_view) { |
| window_->SetType(ui::wm::WINDOW_TYPE_CONTROL); |
| @@ -860,6 +873,14 @@ void RenderWidgetHostViewAura::Destroy() { |
| // Beware, this function is not called on all destruction paths. It will |
| // implicitly end up calling ~RenderWidgetHostViewAura though, so all |
| // destruction/cleanup code should happen there, not here. |
|
piman
2014/09/04 20:56:38
Beware of this comment!
|
| + |
| + // Remove observation from Compositor in here because we can't access |
| + // to compositor in destructor. |
| + if (needs_begin_frame_ && GetCompositor()) { |
| + GetCompositor()->RemoveBeginFrameObserver(this); |
| + needs_begin_frame_ = false; |
| + } |
| + |
| in_shutdown_ = true; |
| delete window_; |
| } |
| @@ -2119,9 +2140,30 @@ void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host, |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| +// ui::CompositorBeginFrameObserver implementation: |
| +void RenderWidgetHostViewAura::OnSendBeginFrame( |
| + const cc::BeginFrameArgs& args) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + DCHECK(host_); |
| + TRACE_EVENT0("cc", "RenderWidgetHostViewAura::OnSendBeginFrame"); |
| + |
| + delegated_frame_host_->UpdateVSyncParameters(args); |
| + |
| + host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args)); |
| + |
| + last_begin_frame_args_ = args; |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| // RenderWidgetHostViewAura, private: |
| RenderWidgetHostViewAura::~RenderWidgetHostViewAura() { |
| + // When we are using unified BeginFrame(--enable-begin-frame-scheduling), |
| + // |needs_begin_frame_| always be false in here. We can't remove |
| + // observation from Compositor in this function because |window_| is already |
| + // removed from window tree host. |
| + DCHECK(!needs_begin_frame_); |
| + |
| if (touch_editing_client_) |
| touch_editing_client_->OnViewDestroyed(); |
| @@ -2379,6 +2421,13 @@ void RenderWidgetHostViewAura::AddedToRootWindow() { |
| #endif |
| delegated_frame_host_->AddedToWindow(); |
| + |
| + // When this RWHV is added to new root window, this RWHV should be added to |
| + // the new compositor. |
| + if (needs_begin_frame_) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + GetCompositor()->AddBeginFrameObserver(this, last_begin_frame_args_); |
| + } |
|
piman
2014/09/04 20:56:38
A lot of this logic is common between mac and aura
|
| } |
| void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
| @@ -2398,6 +2447,13 @@ void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
| if (legacy_render_widget_host_HWND_) |
| legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow()); |
| #endif |
| + |
| + // When this RWHV is removed from current root window, this RWHV should be |
| + // removed from the current compositor which will be removed. |
| + if (needs_begin_frame_) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + GetCompositor()->RemoveBeginFrameObserver(this); |
| + } |
| } |
| void RenderWidgetHostViewAura::DetachFromInputMethod() { |
| @@ -2439,6 +2495,23 @@ SkColorType RenderWidgetHostViewAura::PreferredReadbackFormat() { |
| return kN32_SkColorType; |
| } |
| +void RenderWidgetHostViewAura::OnSetNeedsBeginFrame(bool enabled) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + DCHECK(GetCompositor()); |
| + |
| + if (needs_begin_frame_ == enabled) |
| + return; |
| + |
| + TRACE_EVENT1("cc", "RenderWidgetHostViewAura::OnSetNeedsBeginFrame", |
| + "enabled", enabled); |
| + if (enabled) |
| + GetCompositor()->AddBeginFrameObserver(this, last_begin_frame_args_); |
| + else |
| + GetCompositor()->RemoveBeginFrameObserver(this); |
| + |
| + needs_begin_frame_ = enabled; |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // DelegatedFrameHost, public: |