blob: 5cdc9b7074ed105cbc6201a97ed87470e7dc7523 [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.
#ifndef CHROME_BROWSER_RESOURCE_COORDINATOR_LIFECYCLE_UNIT_BASE_H_
#define CHROME_BROWSER_RESOURCE_COORDINATOR_LIFECYCLE_UNIT_BASE_H_
#include "base/macros.h"
#include "base/observer_list.h"
#include "chrome/browser/resource_coordinator/lifecycle_unit.h"
#include "chrome/browser/resource_coordinator/lifecycle_unit_state.mojom-shared.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 {
public:
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;
size_t GetDiscardCount() const override;
void AddObserver(LifecycleUnitObserver* observer) override;
void RemoveObserver(LifecycleUnitObserver* observer) override;
ukm::SourceId GetUkmSourceId() const override;
void SetDiscardCountForTesting(size_t discard_count);
protected:
// 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);
// 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();
private:
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;
base::ObserverList<LifecycleUnitObserver>::Unchecked observers_;
DISALLOW_COPY_AND_ASSIGN(LifecycleUnitBase);
};
} // namespace resource_coordinator
#endif // CHROME_BROWSER_RESOURCE_COORDINATOR_LIFECYCLE_UNIT_BASE_H_