blob: daed664337236802ba05e589f63ac9ac2aebb519 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/macros.h"
#include "base/observer_list.h"
#include "chrome/browser/resource_coordinator/lifecycle_unit.h"
#include "chrome/browser/resource_coordinator/time.h"
#include "content/public/browser/visibility.h"
namespace resource_coordinator {
class LifecycleUnitSourceBase;
class UsageClock;
using ::mojom::LifecycleUnitState;
using ::mojom::LifecycleUnitStateChangeReason;
// Base class for a LifecycleUnit.
class LifecycleUnitBase : public LifecycleUnit {
explicit LifecycleUnitBase(LifecycleUnitSourceBase* source,
content::Visibility visibility,
UsageClock* usage_clock);
~LifecycleUnitBase() override;
// LifecycleUnit:
LifecycleUnitSource* GetSource() const override;
int32_t GetID() const override;
base::TimeTicks GetWallTimeWhenHidden() const override;
base::TimeDelta GetChromeUsageTimeWhenHidden() const override;
LifecycleUnitState GetState() const override;
base::TimeTicks GetStateChangeTime() const override;
bool Discard(LifecycleUnitDiscardReason discard_reason) override;
size_t GetDiscardCount() const override;
LifecycleUnitDiscardReason GetDiscardReason() const override;
void AddObserver(LifecycleUnitObserver* observer) override;
void RemoveObserver(LifecycleUnitObserver* observer) override;
ukm::SourceId GetUkmSourceId() const override;
void SetDiscardCountForTesting(size_t discard_count);
// TODO(chrisha|fdoray): Clean up the virtual methods below and make them
// pure virtual.
// Sets the state of this LifecycleUnit to |state| and notifies observers.
// |reason| indicates what caused the state change.
void SetState(LifecycleUnitState state,
LifecycleUnitStateChangeReason reason);
// Invoked when the state of the LifecycleUnit changes, before external
// observers are notified. Derived classes can override to add their own
// logic. The default implementation is empty. |last_state| is the state
// before the change and |reason| indicates what caused the change.
virtual void OnLifecycleUnitStateChanged(
LifecycleUnitState last_state,
LifecycleUnitStateChangeReason reason);
// Invoked to dispatch a call to Discard. The base class takes care of
// maintaining |discard_count_| and |discard_reason_|, and delegates the
// actually discarding to this.
virtual bool DiscardImpl(LifecycleUnitDiscardReason discard_reason);
// Notifies observers that the visibility of the LifecycleUnit has changed.
void OnLifecycleUnitVisibilityChanged(content::Visibility visibility);
// Notifies observers that the LifecycleUnit is being destroyed. This is
// invoked by derived classes rather than by the base class to avoid notifying
// observers when the LifecycleUnit has been partially destroyed. This also
// forwards the notification to the lifecycle unit source via
// LifecycleUnitSourceBase.
void OnLifecycleUnitDestroyed();
static int32_t next_id_;
// A unique id representing this LifecycleUnit.
const int32_t id_ = ++next_id_;
// The source that owns this lifecycle unit. This can be nullptr.
LifecycleUnitSourceBase* source_;
// Current state of this LifecycleUnit.
LifecycleUnitState state_ = LifecycleUnitState::ACTIVE;
// Time at which the state changed.
base::TimeTicks state_change_time_ = NowTicks();
// The wall time when this LifecycleUnit was last hidden, or TimeDelta::Max()
// if this LifecycleUnit is currently visible.
base::TimeTicks wall_time_when_hidden_;
// A clock that measures Chrome usage time.
UsageClock* const usage_clock_;
// The Chrome usage time measured by |usage_clock_| when this LifecycleUnit
// was last hidden, or TimeDelta::Max() if this LifecycleUnit is currently
// visible.
base::TimeDelta chrome_usage_time_when_hidden_;
// The number of times that this lifecycle unit has been discarded.
int discard_count_ = 0;
// Maintains the most recent LifecycleUnitDiscardReason that was passed into
// Discard().
LifecycleUnitDiscardReason discard_reason_ =
base::ObserverList<LifecycleUnitObserver>::Unchecked observers_;
} // namespace resource_coordinator