| Index: cc/scheduler/scheduler.cc
|
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
|
| index 7dcf7389c7624c3f51c4b2e15a840aa51b524a65..3fb8b3b13de76c935daf8d28d9b8cdd529ac2cb9 100644
|
| --- a/cc/scheduler/scheduler.cc
|
| +++ b/cc/scheduler/scheduler.cc
|
| @@ -73,8 +73,7 @@ Scheduler::Scheduler(
|
| }
|
|
|
| Scheduler::~Scheduler() {
|
| - if (observing_begin_frame_source_)
|
| - begin_frame_source_->RemoveObserver(this);
|
| + SetBeginFrameSource(nullptr);
|
| }
|
|
|
| base::TimeTicks Scheduler::Now() const {
|
| @@ -115,12 +114,13 @@ void Scheduler::NotifyReadyToDraw() {
|
| }
|
|
|
| void Scheduler::SetBeginFrameSource(BeginFrameSource* source) {
|
| - DCHECK(source);
|
| if (source == begin_frame_source_)
|
| return;
|
| if (begin_frame_source_ && observing_begin_frame_source_)
|
| begin_frame_source_->RemoveObserver(this);
|
| begin_frame_source_ = source;
|
| + if (!begin_frame_source_)
|
| + return;
|
| if (observing_begin_frame_source_)
|
| begin_frame_source_->AddObserver(this);
|
| }
|
| @@ -245,14 +245,16 @@ void Scheduler::SetupNextBeginFrameIfNeeded() {
|
| if (state_machine_.BeginFrameNeeded()) {
|
| // Call AddObserver as soon as possible.
|
| observing_begin_frame_source_ = true;
|
| - begin_frame_source_->AddObserver(this);
|
| + if (begin_frame_source_)
|
| + begin_frame_source_->AddObserver(this);
|
| devtools_instrumentation::NeedsBeginFrameChanged(layer_tree_host_id_,
|
| true);
|
| } else if (state_machine_.begin_impl_frame_state() ==
|
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) {
|
| // Call RemoveObserver in between frames only.
|
| observing_begin_frame_source_ = false;
|
| - begin_frame_source_->RemoveObserver(this);
|
| + if (begin_frame_source_)
|
| + begin_frame_source_->RemoveObserver(this);
|
| BeginImplFrameNotExpectedSoon();
|
| devtools_instrumentation::NeedsBeginFrameChanged(layer_tree_host_id_,
|
| false);
|
| @@ -381,7 +383,8 @@ void Scheduler::BeginRetroFrame() {
|
| "expiration_time - now", (expiration_time - now).InMillisecondsF(),
|
| "BeginFrameArgs", begin_retro_frame_args_.front().AsValue());
|
| begin_retro_frame_args_.pop_front();
|
| - begin_frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
|
| + if (begin_frame_source_)
|
| + begin_frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
|
| }
|
|
|
| if (begin_retro_frame_args_.empty()) {
|
| @@ -474,7 +477,8 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) {
|
| can_activate_before_deadline)) {
|
| TRACE_EVENT_INSTANT0("cc", "SkipBeginImplFrameToReduceLatency",
|
| TRACE_EVENT_SCOPE_THREAD);
|
| - begin_frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
|
| + if (begin_frame_source_)
|
| + begin_frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
|
| return;
|
| }
|
|
|
| @@ -506,7 +510,8 @@ void Scheduler::FinishImplFrame() {
|
| ProcessScheduledActions();
|
|
|
| client_->DidFinishImplFrame();
|
| - begin_frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
|
| + if (begin_frame_source_)
|
| + begin_frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
|
| begin_impl_frame_tracker_.Finish();
|
| }
|
|
|
|
|