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..a44ccfe2b03925a14a1b45c5e10218fd7c9b17e0 100644 |
--- a/content/browser/android/in_process/synchronous_compositor_impl.cc |
+++ b/content/browser/android/in_process/synchronous_compositor_impl.cc |
@@ -74,6 +74,7 @@ SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents) |
contents_(contents), |
routing_id_(contents->GetRoutingID()), |
input_handler_(NULL), |
+ registered_with_client_(false), |
is_active_(false), |
renderer_needs_begin_frames_(false), |
weak_ptr_factory_(this) { |
@@ -108,6 +109,17 @@ void SynchronousCompositorImpl::SetClient( |
} |
} |
+void SynchronousCompositorImpl::RegisterWithClient() { |
+ DCHECK(CalledOnValidThread()); |
+ |
+ if (registered_with_client_) |
+ return; |
+ |
+ SetIsActive(false); |
+ compositor_client_->DidInitializeCompositor(this); |
+ registered_with_client_ = true; |
+} |
+ |
// static |
void SynchronousCompositor::SetGpuService( |
scoped_refptr<gpu::InProcessCommandBuffer::Service> service) { |
@@ -140,11 +152,10 @@ void SynchronousCompositorImpl::DidInitializeRendererObjects( |
base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree, |
weak_ptr_factory_.GetWeakPtr())); |
- OnNeedsBeginFramesChange(begin_frame_source_->NeedsBeginFrames()); |
- |
- compositor_client_->DidInitializeCompositor(this); |
- |
SetInputHandler(input_handler); |
+ |
+ OnNeedsBeginFramesChange(begin_frame_source_->NeedsBeginFrames()); |
+ SetIsActive(true); |
} |
void SynchronousCompositorImpl::DidDestroyRendererObjects() { |
@@ -152,10 +163,17 @@ void SynchronousCompositorImpl::DidDestroyRendererObjects() { |
DCHECK(begin_frame_source_); |
DCHECK(compositor_client_); |
+ if (registered_with_client_) { |
+ compositor_client_->DidDestroyCompositor(this); |
+ registered_with_client_ = false; |
+ } |
+ |
+ SetIsActive(false); |
+ OnNeedsBeginFramesChange(false); |
+ |
+ SetInputHandler(nullptr); |
begin_frame_source_->SetCompositor(nullptr); |
output_surface_->SetCompositor(nullptr); |
- SetInputHandler(nullptr); |
- compositor_client_->DidDestroyCompositor(this); |
output_surface_ = nullptr; |
begin_frame_source_ = nullptr; |
} |
@@ -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() { |
@@ -282,9 +301,10 @@ void SynchronousCompositorImpl::SetInputHandler( |
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,6 +335,9 @@ void SynchronousCompositorImpl::DeliverMessages() { |
void SynchronousCompositorImpl::DidActivatePendingTree() { |
DCHECK(compositor_client_); |
+ if (!registered_with_client_) |
+ RegisterWithClient(); |
+ DCHECK(registered_with_client_); |
compositor_client_->DidUpdateContent(); |
DeliverMessages(); |
} |
@@ -322,6 +345,8 @@ void SynchronousCompositorImpl::DidActivatePendingTree() { |
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 +356,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 +371,15 @@ 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_) |
boliu
2015/05/30 01:06:29
style: Need braces for if statements with multi-li
|
+ // 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 |