Commit 463ec8a7 authored by Francois Doray's avatar Francois Doray Committed by Commit Bot

RC: Add LifecycleUnit::Unfreeze().

This will be used to periodically unfreeze LifecycleUnits, to allow
them to update their state.

Bug: 775644
Change-Id: I498930c8a555ddf3581099e61972aaeac6a36d91
Reviewed-on: https://chromium-review.googlesource.com/1099973
Commit-Queue: François Doray <fdoray@chromium.org>
Reviewed-by: default avatarFadi Meawad <fmeawad@chromium.org>
Reviewed-by: default avatarSébastien Marchand <sebmarchand@chromium.org>
Cr-Commit-Position: refs/heads/master@{#568451}
parent 9781ec38
......@@ -120,10 +120,6 @@ class LifecycleUnit {
// successful.
virtual bool Load() = 0;
// Request that the LifecycleUnit be frozen, return true if the request is
// successfully sent.
virtual bool Freeze() = 0;
// Returns the estimated number of kilobytes that would be freed if this
// LifecycleUnit was discarded.
//
......@@ -154,6 +150,13 @@ class LifecycleUnit {
virtual bool CanDiscard(DiscardReason reason,
DecisionDetails* decision_details) const = 0;
// Request that the LifecycleUnit be frozen, return true if the request is
// successfully sent.
virtual bool Freeze() = 0;
// Unfreezes this LifecycleUnit. Returns true on success.
virtual bool Unfreeze() = 0;
// Discards this LifecycleUnit.
//
// TODO(fdoray): Consider handling urgent discard with groups of
......
......@@ -67,6 +67,9 @@ bool IsValidStateChange(LifecycleUnitState from,
}
case LifecycleUnitState::PENDING_FREEZE: {
switch (to) {
// Unfreeze() is called.
case LifecycleUnitState::ACTIVE:
return reason == StateChangeReason::BROWSER_INITIATED;
// Discard(kProactive) is called.
case LifecycleUnitState::PENDING_DISCARD:
return reason == StateChangeReason::BROWSER_INITIATED;
......@@ -83,9 +86,12 @@ bool IsValidStateChange(LifecycleUnitState from,
}
case LifecycleUnitState::FROZEN: {
switch (to) {
// The renderer re-activates the page because it became visible.
case LifecycleUnitState::ACTIVE:
return reason == StateChangeReason::RENDERER_INITIATED;
// Unfreeze() is called or the renderer re-activates the page because it
// became visible.
case LifecycleUnitState::ACTIVE: {
return reason == StateChangeReason::BROWSER_INITIATED ||
reason == StateChangeReason::RENDERER_INITIATED;
}
// Discard(kProactive|kUrgent|kExternal) is called.
case LifecycleUnitState::DISCARDED: {
return reason == StateChangeReason::BROWSER_INITIATED ||
......@@ -328,19 +334,6 @@ bool TabLifecycleUnitSource::TabLifecycleUnit::Load() {
return true;
}
bool TabLifecycleUnitSource::TabLifecycleUnit::Freeze() {
if (!IsValidStateChange(GetState(), LifecycleUnitState::PENDING_FREEZE,
StateChangeReason::BROWSER_INITIATED)) {
return false;
}
SetState(LifecycleUnitState::PENDING_FREEZE,
StateChangeReason::BROWSER_INITIATED);
GetWebContents()->SetPageFrozen(true);
return true;
}
int TabLifecycleUnitSource::TabLifecycleUnit::
GetEstimatedMemoryFreedOnDiscardKB() const {
#if defined(OS_CHROMEOS)
......@@ -502,6 +495,37 @@ bool TabLifecycleUnitSource::TabLifecycleUnit::CanDiscard(
return decision_details->IsPositive();
}
bool TabLifecycleUnitSource::TabLifecycleUnit::Freeze() {
if (!IsValidStateChange(GetState(), LifecycleUnitState::PENDING_FREEZE,
StateChangeReason::BROWSER_INITIATED)) {
return false;
}
// WebContents::SetPageFrozen() DCHECKs if the page is visible.
if (GetWebContents()->GetVisibility() == content::Visibility::VISIBLE)
return false;
SetState(LifecycleUnitState::PENDING_FREEZE,
StateChangeReason::BROWSER_INITIATED);
GetWebContents()->SetPageFrozen(true);
return true;
}
bool TabLifecycleUnitSource::TabLifecycleUnit::Unfreeze() {
if (!IsValidStateChange(GetState(), LifecycleUnitState::ACTIVE,
StateChangeReason::BROWSER_INITIATED)) {
return false;
}
// WebContents::SetPageFrozen() DCHECKs if the page is visible.
if (GetWebContents()->GetVisibility() == content::Visibility::VISIBLE)
return false;
SetState(LifecycleUnitState::ACTIVE, StateChangeReason::BROWSER_INITIATED);
GetWebContents()->SetPageFrozen(false);
return true;
}
bool TabLifecycleUnitSource::TabLifecycleUnit::Discard(DiscardReason reason) {
// Can't discard a tab when it isn't in a tabstrip.
if (!tab_strip_model_)
......
......@@ -91,12 +91,13 @@ class TabLifecycleUnitSource::TabLifecycleUnit
content::Visibility GetVisibility() const override;
LifecycleUnitLoadingState GetLoadingState() const override;
bool Load() override;
bool Freeze() override;
int GetEstimatedMemoryFreedOnDiscardKB() const override;
bool CanPurge() const override;
bool CanFreeze(DecisionDetails* decision_details) const override;
bool CanDiscard(DiscardReason reason,
DecisionDetails* decision_details) const override;
bool Freeze() override;
bool Unfreeze() override;
bool Discard(DiscardReason discard_reason) override;
ukm::SourceId GetUkmSourceId() const override;
......
......@@ -52,10 +52,6 @@ bool TestLifecycleUnit::Load() {
return false;
}
bool TestLifecycleUnit::Freeze() {
return false;
}
int TestLifecycleUnit::GetEstimatedMemoryFreedOnDiscardKB() const {
return 0;
}
......@@ -73,6 +69,14 @@ bool TestLifecycleUnit::CanDiscard(DiscardReason reason,
return can_discard_;
}
bool TestLifecycleUnit::Freeze() {
return false;
}
bool TestLifecycleUnit::Unfreeze() {
return false;
}
bool TestLifecycleUnit::Discard(DiscardReason discard_reason) {
return false;
}
......
......@@ -33,12 +33,13 @@ class TestLifecycleUnit : public LifecycleUnitBase {
content::Visibility GetVisibility() const override;
LifecycleUnitLoadingState GetLoadingState() const override;
bool Load() override;
bool Freeze() override;
int GetEstimatedMemoryFreedOnDiscardKB() const override;
bool CanPurge() const override;
bool CanFreeze(DecisionDetails* decision_details) const override;
bool CanDiscard(DiscardReason reason,
DecisionDetails* decision_details) const override;
bool Freeze() override;
bool Unfreeze() override;
bool Discard(DiscardReason discard_reason) override;
private:
......
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