| 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..69fd874c5d331f19933f9e9b92c341c707079c31 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_aura.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
|
| @@ -13,6 +13,7 @@
|
| #include "base/logging.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/strings/string_number_conversions.h"
|
| +#include "cc/base/switches.h"
|
| #include "cc/layers/layer.h"
|
| #include "cc/output/copy_output_request.h"
|
| #include "cc/output/copy_output_result.h"
|
| @@ -61,7 +62,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 +452,7 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
|
| #endif
|
| has_snapped_to_boundary_(false),
|
| touch_editing_client_(NULL),
|
| + needs_begin_frame_(false),
|
| weak_ptr_factory_(this) {
|
| host_->SetView(this);
|
| window_observer_.reset(new WindowObserver(this));
|
| @@ -470,6 +471,15 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // 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 +870,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.
|
| +
|
| + // Remove observation from BeginFrameManager in here because we can't access
|
| + // to compositor in destructor.
|
| + if (needs_begin_frame_ && GetCompositor()) {
|
| + GetCompositor()->begin_frame_manager()->RemoveObserver(this);
|
| + needs_begin_frame_ = false;
|
| + }
|
| +
|
| in_shutdown_ = true;
|
| delete window_;
|
| }
|
| @@ -2119,9 +2137,39 @@ void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host,
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| +// ui::BeginFrameManager::Observer implementation:
|
| +void RenderWidgetHostViewAura::OnSendBeginFrame(
|
| + const cc::BeginFrameArgs& args) {
|
| + TRACE_EVENT0("cc", "RenderWidgetHostViewAura::OnSendBeginFrame");
|
| + if (!host_)
|
| + return;
|
| +
|
| + cc::BeginFrameArgs adjusted_args(args);
|
| +
|
| + delegated_frame_host_->UpdateVSyncParameters(adjusted_args);
|
| +
|
| + // TODO(brianderson): Use adaptive draw-time estimation.
|
| + base::TimeDelta estimated_browser_composite_time =
|
| + base::TimeDelta::FromMicroseconds(
|
| + (1.0f * base::Time::kMicrosecondsPerSecond) / (3.0f * 60));
|
| +
|
| + adjusted_args.deadline -= estimated_browser_composite_time;
|
| +
|
| + host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), adjusted_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 BeginFrameManager via 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 +2427,15 @@ void RenderWidgetHostViewAura::AddedToRootWindow() {
|
| #endif
|
|
|
| delegated_frame_host_->AddedToWindow();
|
| +
|
| + // When this RWHV is added to new root window after tab dragging, this RWHV
|
| + // should be added to the BeginFrameManager of new compositor.
|
| + if (needs_begin_frame_) {
|
| + DCHECK(CommandLine::ForCurrentProcess()->HasSwitch(
|
| + cc::switches::kEnableBeginFrameScheduling));
|
| + GetCompositor()->begin_frame_manager()->AddObserver(this,
|
| + last_begin_frame_args_);
|
| + }
|
| }
|
|
|
| void RenderWidgetHostViewAura::RemovingFromRootWindow() {
|
| @@ -2398,6 +2455,14 @@ void RenderWidgetHostViewAura::RemovingFromRootWindow() {
|
| if (legacy_render_widget_host_HWND_)
|
| legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow());
|
| #endif
|
| +
|
| + // When this RWHV is activated during the tab dragging, this RWHV should be
|
| + // removed from BeginFrameManager of current compositor which will be removed.
|
| + if (needs_begin_frame_) {
|
| + DCHECK(CommandLine::ForCurrentProcess()->HasSwitch(
|
| + cc::switches::kEnableBeginFrameScheduling));
|
| + GetCompositor()->begin_frame_manager()->RemoveObserver(this);
|
| + }
|
| }
|
|
|
| void RenderWidgetHostViewAura::DetachFromInputMethod() {
|
| @@ -2439,6 +2504,22 @@ SkColorType RenderWidgetHostViewAura::PreferredReadbackFormat() {
|
| return kN32_SkColorType;
|
| }
|
|
|
| +void RenderWidgetHostViewAura::OnSetNeedsBeginFrame(bool enabled) {
|
| + if (needs_begin_frame_ == enabled)
|
| + return;
|
| +
|
| + TRACE_EVENT1("cc", "RenderWidgetHostViewAura::OnSetNeedsBeginFrame",
|
| + "enabled", enabled);
|
| + if(enabled) {
|
| + GetCompositor()->begin_frame_manager()->AddObserver(this,
|
| + last_begin_frame_args_);
|
| + } else {
|
| + GetCompositor()->begin_frame_manager()->RemoveObserver(this);
|
| + }
|
| +
|
| + needs_begin_frame_ = enabled;
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // DelegatedFrameHost, public:
|
|
|
|
|