Commit 04c60edb authored by Francois Doray's avatar Francois Doray Committed by Commit Bot

RC: Add LifecycleUnit::GetStateChangeTime().

This method the last time at which the state of a LifecycleUnit
changed. It will be used to determine if a LifeycleUnit has been
unfrozen long enough and should be frozen again.

Bug: 775644
Change-Id: I2ba04b9ed4085767e67108cd46901d876efc2217
Reviewed-on: https://chromium-review.googlesource.com/1134029
Commit-Queue: François Doray <fdoray@chromium.org>
Reviewed-by: default avatarSébastien Marchand <sebmarchand@chromium.org>
Cr-Commit-Position: refs/heads/master@{#575067}
parent 3ebc1519
......@@ -120,6 +120,9 @@ class LifecycleUnit {
// Returns the current state of this LifecycleUnit.
virtual LifecycleUnitState GetState() const = 0;
// Returns the last time at which the state of this LifecycleUnit changed.
virtual base::TimeTicks GetStateChangeTime() const = 0;
// Request that the LifecycleUnit be loaded, return true if the request is
// successful.
virtual bool Load() = 0;
......
......@@ -30,6 +30,10 @@ LifecycleUnitState LifecycleUnitBase::GetState() const {
return state_;
}
base::TimeTicks LifecycleUnitBase::GetStateChangeTime() const {
return state_change_time_;
}
base::TimeTicks LifecycleUnitBase::GetWallTimeWhenHidden() const {
return wall_time_when_hidden_;
}
......@@ -56,6 +60,7 @@ void LifecycleUnitBase::SetState(LifecycleUnitState state,
return;
LifecycleUnitState last_state = state_;
state_ = state;
state_change_time_ = NowTicks();
OnLifecycleUnitStateChanged(last_state, reason);
for (auto& observer : observers_)
observer.OnLifecycleUnitStateChanged(this, last_state);
......
......@@ -8,6 +8,7 @@
#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 {
......@@ -29,6 +30,7 @@ class LifecycleUnitBase : public LifecycleUnit {
base::TimeTicks GetWallTimeWhenHidden() const override;
base::TimeDelta GetChromeUsageTimeWhenHidden() const override;
LifecycleUnitState GetState() const override;
base::TimeTicks GetStateChangeTime() const override;
void AddObserver(LifecycleUnitObserver* observer) override;
void RemoveObserver(LifecycleUnitObserver* observer) override;
ukm::SourceId GetUkmSourceId() const override;
......@@ -64,6 +66,9 @@ class LifecycleUnitBase : public LifecycleUnit {
// 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_;
......
......@@ -72,6 +72,28 @@ TEST_F(LifecycleUnitBaseTest, GetID) {
EXPECT_EQ(c.GetID(), c.GetID());
}
// Verify that the state change time is updated when the state changes.
TEST_F(LifecycleUnitBaseTest, SetStateUpdatesTime) {
TestLifecycleUnit lifecycle_unit;
EXPECT_EQ(NowTicks(), lifecycle_unit.GetStateChangeTime());
test_clock_.Advance(base::TimeDelta::FromSeconds(1));
base::TimeTicks first_state_change_time = NowTicks();
lifecycle_unit.SetState(LifecycleUnitState::DISCARDED,
LifecycleUnitStateChangeReason::BROWSER_INITIATED);
EXPECT_EQ(first_state_change_time, lifecycle_unit.GetStateChangeTime());
test_clock_.Advance(base::TimeDelta::FromSeconds(1));
EXPECT_EQ(first_state_change_time, lifecycle_unit.GetStateChangeTime());
test_clock_.Advance(base::TimeDelta::FromSeconds(1));
base::TimeTicks second_state_change_time = NowTicks();
lifecycle_unit.SetState(LifecycleUnitState::FROZEN,
LifecycleUnitStateChangeReason::BROWSER_INITIATED);
EXPECT_EQ(second_state_change_time, lifecycle_unit.GetStateChangeTime());
test_clock_.Advance(base::TimeDelta::FromSeconds(1));
EXPECT_EQ(second_state_change_time, lifecycle_unit.GetStateChangeTime());
}
// Verify that observers are notified when the state changes and when the
// LifecycleUnit is destroyed.
TEST_F(LifecycleUnitBaseTest, SetStateNotifiesObservers) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment