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 { ...@@ -120,10 +120,6 @@ class LifecycleUnit {
// successful. // successful.
virtual bool Load() = 0; 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 // Returns the estimated number of kilobytes that would be freed if this
// LifecycleUnit was discarded. // LifecycleUnit was discarded.
// //
...@@ -154,6 +150,13 @@ class LifecycleUnit { ...@@ -154,6 +150,13 @@ class LifecycleUnit {
virtual bool CanDiscard(DiscardReason reason, virtual bool CanDiscard(DiscardReason reason,
DecisionDetails* decision_details) const = 0; 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. // Discards this LifecycleUnit.
// //
// TODO(fdoray): Consider handling urgent discard with groups of // TODO(fdoray): Consider handling urgent discard with groups of
......
...@@ -67,6 +67,9 @@ bool IsValidStateChange(LifecycleUnitState from, ...@@ -67,6 +67,9 @@ bool IsValidStateChange(LifecycleUnitState from,
} }
case LifecycleUnitState::PENDING_FREEZE: { case LifecycleUnitState::PENDING_FREEZE: {
switch (to) { switch (to) {
// Unfreeze() is called.
case LifecycleUnitState::ACTIVE:
return reason == StateChangeReason::BROWSER_INITIATED;
// Discard(kProactive) is called. // Discard(kProactive) is called.
case LifecycleUnitState::PENDING_DISCARD: case LifecycleUnitState::PENDING_DISCARD:
return reason == StateChangeReason::BROWSER_INITIATED; return reason == StateChangeReason::BROWSER_INITIATED;
...@@ -83,9 +86,12 @@ bool IsValidStateChange(LifecycleUnitState from, ...@@ -83,9 +86,12 @@ bool IsValidStateChange(LifecycleUnitState from,
} }
case LifecycleUnitState::FROZEN: { case LifecycleUnitState::FROZEN: {
switch (to) { switch (to) {
// The renderer re-activates the page because it became visible. // Unfreeze() is called or the renderer re-activates the page because it
case LifecycleUnitState::ACTIVE: // became visible.
return reason == StateChangeReason::RENDERER_INITIATED; case LifecycleUnitState::ACTIVE: {
return reason == StateChangeReason::BROWSER_INITIATED ||
reason == StateChangeReason::RENDERER_INITIATED;
}
// Discard(kProactive|kUrgent|kExternal) is called. // Discard(kProactive|kUrgent|kExternal) is called.
case LifecycleUnitState::DISCARDED: { case LifecycleUnitState::DISCARDED: {
return reason == StateChangeReason::BROWSER_INITIATED || return reason == StateChangeReason::BROWSER_INITIATED ||
...@@ -328,19 +334,6 @@ bool TabLifecycleUnitSource::TabLifecycleUnit::Load() { ...@@ -328,19 +334,6 @@ bool TabLifecycleUnitSource::TabLifecycleUnit::Load() {
return true; 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:: int TabLifecycleUnitSource::TabLifecycleUnit::
GetEstimatedMemoryFreedOnDiscardKB() const { GetEstimatedMemoryFreedOnDiscardKB() const {
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -502,6 +495,37 @@ bool TabLifecycleUnitSource::TabLifecycleUnit::CanDiscard( ...@@ -502,6 +495,37 @@ bool TabLifecycleUnitSource::TabLifecycleUnit::CanDiscard(
return decision_details->IsPositive(); 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) { bool TabLifecycleUnitSource::TabLifecycleUnit::Discard(DiscardReason reason) {
// Can't discard a tab when it isn't in a tabstrip. // Can't discard a tab when it isn't in a tabstrip.
if (!tab_strip_model_) if (!tab_strip_model_)
......
...@@ -91,12 +91,13 @@ class TabLifecycleUnitSource::TabLifecycleUnit ...@@ -91,12 +91,13 @@ class TabLifecycleUnitSource::TabLifecycleUnit
content::Visibility GetVisibility() const override; content::Visibility GetVisibility() const override;
LifecycleUnitLoadingState GetLoadingState() const override; LifecycleUnitLoadingState GetLoadingState() const override;
bool Load() override; bool Load() override;
bool Freeze() override;
int GetEstimatedMemoryFreedOnDiscardKB() const override; int GetEstimatedMemoryFreedOnDiscardKB() const override;
bool CanPurge() const override; bool CanPurge() const override;
bool CanFreeze(DecisionDetails* decision_details) const override; bool CanFreeze(DecisionDetails* decision_details) const override;
bool CanDiscard(DiscardReason reason, bool CanDiscard(DiscardReason reason,
DecisionDetails* decision_details) const override; DecisionDetails* decision_details) const override;
bool Freeze() override;
bool Unfreeze() override;
bool Discard(DiscardReason discard_reason) override; bool Discard(DiscardReason discard_reason) override;
ukm::SourceId GetUkmSourceId() const override; ukm::SourceId GetUkmSourceId() const override;
......
...@@ -52,10 +52,6 @@ bool TestLifecycleUnit::Load() { ...@@ -52,10 +52,6 @@ bool TestLifecycleUnit::Load() {
return false; return false;
} }
bool TestLifecycleUnit::Freeze() {
return false;
}
int TestLifecycleUnit::GetEstimatedMemoryFreedOnDiscardKB() const { int TestLifecycleUnit::GetEstimatedMemoryFreedOnDiscardKB() const {
return 0; return 0;
} }
...@@ -73,6 +69,14 @@ bool TestLifecycleUnit::CanDiscard(DiscardReason reason, ...@@ -73,6 +69,14 @@ bool TestLifecycleUnit::CanDiscard(DiscardReason reason,
return can_discard_; return can_discard_;
} }
bool TestLifecycleUnit::Freeze() {
return false;
}
bool TestLifecycleUnit::Unfreeze() {
return false;
}
bool TestLifecycleUnit::Discard(DiscardReason discard_reason) { bool TestLifecycleUnit::Discard(DiscardReason discard_reason) {
return false; return false;
} }
......
...@@ -33,12 +33,13 @@ class TestLifecycleUnit : public LifecycleUnitBase { ...@@ -33,12 +33,13 @@ class TestLifecycleUnit : public LifecycleUnitBase {
content::Visibility GetVisibility() const override; content::Visibility GetVisibility() const override;
LifecycleUnitLoadingState GetLoadingState() const override; LifecycleUnitLoadingState GetLoadingState() const override;
bool Load() override; bool Load() override;
bool Freeze() override;
int GetEstimatedMemoryFreedOnDiscardKB() const override; int GetEstimatedMemoryFreedOnDiscardKB() const override;
bool CanPurge() const override; bool CanPurge() const override;
bool CanFreeze(DecisionDetails* decision_details) const override; bool CanFreeze(DecisionDetails* decision_details) const override;
bool CanDiscard(DiscardReason reason, bool CanDiscard(DiscardReason reason,
DecisionDetails* decision_details) const override; DecisionDetails* decision_details) const override;
bool Freeze() override;
bool Unfreeze() override;
bool Discard(DiscardReason discard_reason) override; bool Discard(DiscardReason discard_reason) override;
private: 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