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: |