Index: content/browser/android/in_process/synchronous_compositor_impl.cc |
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc |
index d3c6b830b7082bf6e2dec32f803b6751d249aa47..5963ac59523e0ce806f1dd4df017b6745a73a212 100644 |
--- a/content/browser/android/in_process/synchronous_compositor_impl.cc |
+++ b/content/browser/android/in_process/synchronous_compositor_impl.cc |
@@ -51,14 +51,14 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(SynchronousCompositorImpl); |
// static |
SynchronousCompositorImpl* SynchronousCompositorImpl::FromID(int process_id, |
int routing_id) { |
- if (g_factory == NULL) |
- return NULL; |
+ if (g_factory == nullptr) |
+ return nullptr; |
RenderViewHost* rvh = RenderViewHost::FromID(process_id, routing_id); |
if (!rvh) |
- return NULL; |
+ return nullptr; |
WebContents* contents = WebContents::FromRenderViewHost(rvh); |
if (!contents) |
- return NULL; |
+ return nullptr; |
return FromWebContents(contents); |
} |
@@ -68,13 +68,14 @@ SynchronousCompositorImpl* SynchronousCompositorImpl::FromRoutingID( |
} |
SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents) |
- : compositor_client_(NULL), |
- output_surface_(NULL), |
+ : compositor_client_(nullptr), |
+ output_surface_(nullptr), |
begin_frame_source_(nullptr), |
contents_(contents), |
routing_id_(contents->GetRoutingID()), |
- input_handler_(NULL), |
- is_active_(false), |
+ input_handler_(nullptr), |
+ registered_with_client_(false), |
+ is_active_(true), |
renderer_needs_begin_frames_(false), |
weak_ptr_factory_(this) { |
DCHECK(contents); |
@@ -108,6 +109,25 @@ void SynchronousCompositorImpl::SetClient( |
} |
} |
+void SynchronousCompositorImpl::RegisterWithClient() { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK(compositor_client_); |
+ DCHECK(output_surface_); |
+ DCHECK(input_handler_); |
+ DCHECK(!registered_with_client_); |
+ registered_with_client_ = true; |
+ |
+ compositor_client_->DidInitializeCompositor(this); |
+ |
+ output_surface_->SetTreeActivationCallback( |
+ base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ |
+ // Setting the delegate causes UpdateRootLayerState immediately so do it |
+ // after setting the client. |
+ input_handler_->SetRootLayerScrollOffsetDelegate(this); |
+} |
+ |
// static |
void SynchronousCompositor::SetGpuService( |
scoped_refptr<gpu::InProcessCommandBuffer::Service> service) { |
@@ -132,19 +152,10 @@ void SynchronousCompositorImpl::DidInitializeRendererObjects( |
output_surface_ = output_surface; |
begin_frame_source_ = begin_frame_source; |
+ input_handler_ = input_handler; |
- begin_frame_source_->SetCompositor(this); |
output_surface_->SetCompositor(this); |
- |
- output_surface_->SetTreeActivationCallback( |
- base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree, |
- weak_ptr_factory_.GetWeakPtr())); |
- |
- OnNeedsBeginFramesChange(begin_frame_source_->NeedsBeginFrames()); |
- |
- compositor_client_->DidInitializeCompositor(this); |
- |
- SetInputHandler(input_handler); |
+ begin_frame_source_->SetCompositor(this); |
} |
void SynchronousCompositorImpl::DidDestroyRendererObjects() { |
@@ -152,12 +163,19 @@ void SynchronousCompositorImpl::DidDestroyRendererObjects() { |
DCHECK(begin_frame_source_); |
DCHECK(compositor_client_); |
+ if (registered_with_client_) { |
+ input_handler_->SetRootLayerScrollOffsetDelegate(nullptr); |
+ output_surface_->SetTreeActivationCallback(base::Closure()); |
+ compositor_client_->DidDestroyCompositor(this); |
+ registered_with_client_ = false; |
+ } |
+ |
begin_frame_source_->SetCompositor(nullptr); |
output_surface_->SetCompositor(nullptr); |
- SetInputHandler(nullptr); |
- compositor_client_->DidDestroyCompositor(this); |
- output_surface_ = nullptr; |
+ |
+ input_handler_ = nullptr; |
begin_frame_source_ = nullptr; |
+ output_surface_ = nullptr; |
} |
scoped_ptr<cc::CompositorFrame> SynchronousCompositorImpl::DemandDrawHw( |
@@ -233,7 +251,8 @@ void SynchronousCompositorImpl::SetMemoryPolicy(size_t bytes_limit) { |
void SynchronousCompositorImpl::PostInvalidate() { |
DCHECK(CalledOnValidThread()); |
DCHECK(compositor_client_); |
- compositor_client_->PostInvalidate(); |
+ if (registered_with_client_) |
+ compositor_client_->PostInvalidate(); |
} |
void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset() { |
@@ -255,6 +274,10 @@ void SynchronousCompositorImpl::OnNeedsBeginFramesChange( |
} |
void SynchronousCompositorImpl::BeginFrame(const cc::BeginFrameArgs& args) { |
+ if (!registered_with_client_) { |
+ RegisterWithClient(); |
+ DCHECK(registered_with_client_); |
+ } |
if (begin_frame_source_) |
begin_frame_source_->BeginFrame(args); |
} |
@@ -266,25 +289,14 @@ void SynchronousCompositorImpl::UpdateNeedsBeginFrames() { |
rwhv->OnSetNeedsBeginFrames(is_active_ && renderer_needs_begin_frames_); |
} |
-void SynchronousCompositorImpl::SetInputHandler( |
- cc::InputHandler* input_handler) { |
- DCHECK(CalledOnValidThread()); |
- |
- if (input_handler_) |
- input_handler_->SetRootLayerScrollOffsetDelegate(NULL); |
- |
- input_handler_ = input_handler; |
- |
- if (input_handler_) |
- input_handler_->SetRootLayerScrollOffsetDelegate(this); |
-} |
- |
void SynchronousCompositorImpl::DidOverscroll( |
const DidOverscrollParams& params) { |
DCHECK(compositor_client_); |
- compositor_client_->DidOverscroll(params.accumulated_overscroll, |
- params.latest_overscroll_delta, |
- params.current_fling_velocity); |
+ if (registered_with_client_) { |
+ compositor_client_->DidOverscroll(params.accumulated_overscroll, |
+ params.latest_overscroll_delta, |
+ params.current_fling_velocity); |
+ } |
} |
void SynchronousCompositorImpl::DidStopFlinging() { |
@@ -315,13 +327,16 @@ void SynchronousCompositorImpl::DeliverMessages() { |
void SynchronousCompositorImpl::DidActivatePendingTree() { |
DCHECK(compositor_client_); |
- compositor_client_->DidUpdateContent(); |
+ if (registered_with_client_) |
+ compositor_client_->DidUpdateContent(); |
DeliverMessages(); |
} |
gfx::ScrollOffset SynchronousCompositorImpl::GetTotalScrollOffset() { |
DCHECK(CalledOnValidThread()); |
DCHECK(compositor_client_); |
+ if (!registered_with_client_) |
+ return gfx::ScrollOffset(); |
// TODO(miletus): Make GetTotalRootLayerScrollOffset return |
// ScrollOffset. crbug.com/414283. |
return gfx::ScrollOffset( |
@@ -331,6 +346,8 @@ gfx::ScrollOffset SynchronousCompositorImpl::GetTotalScrollOffset() { |
bool SynchronousCompositorImpl::IsExternalFlingActive() const { |
DCHECK(CalledOnValidThread()); |
DCHECK(compositor_client_); |
+ if (!registered_with_client_) |
+ return false; |
return compositor_client_->IsExternalFlingActive(); |
} |
@@ -344,14 +361,16 @@ void SynchronousCompositorImpl::UpdateRootLayerState( |
DCHECK(CalledOnValidThread()); |
DCHECK(compositor_client_); |
- // TODO(miletus): Pass in ScrollOffset. crbug.com/414283. |
- compositor_client_->UpdateRootLayerState( |
- gfx::ScrollOffsetToVector2dF(total_scroll_offset), |
- gfx::ScrollOffsetToVector2dF(max_scroll_offset), |
- scrollable_size, |
- page_scale_factor, |
- min_page_scale_factor, |
- max_page_scale_factor); |
+ if (registered_with_client_) { |
+ // TODO(miletus): Pass in ScrollOffset. crbug.com/414283. |
+ compositor_client_->UpdateRootLayerState( |
+ gfx::ScrollOffsetToVector2dF(total_scroll_offset), |
+ gfx::ScrollOffsetToVector2dF(max_scroll_offset), |
+ scrollable_size, |
+ page_scale_factor, |
+ min_page_scale_factor, |
+ max_page_scale_factor); |
+ } |
} |
// Not using base::NonThreadSafe as we want to enforce a more exacting threading |