| Index: chrome/browser/memory/tab_manager.cc
|
| diff --git a/chrome/browser/memory/tab_manager.cc b/chrome/browser/memory/tab_manager.cc
|
| index dfb7c447b902fc64ff377b034aa19b5e0239f44c..31a095e0dc359e6b12782ca4349bb3a5da7da9dd 100644
|
| --- a/chrome/browser/memory/tab_manager.cc
|
| +++ b/chrome/browser/memory/tab_manager.cc
|
| @@ -180,6 +180,10 @@ TabStatsList TabManager::GetTabStats() {
|
| return stats_list;
|
| }
|
|
|
| +bool TabManager::IsTabDiscarded(content::WebContents* contents) const {
|
| + return GetWebContentsData(contents)->IsDiscarded();
|
| +}
|
| +
|
| // TODO(jamescook): This should consider tabs with references to other tabs,
|
| // such as tabs created with JavaScript window.open(). Potentially consider
|
| // discarding the entire set together, or use that in the priority computation.
|
| @@ -227,15 +231,22 @@ void TabManager::TabChangedAt(content::WebContents* contents,
|
| TabChangeType change_type) {
|
| if (change_type != TabChangeType::ALL)
|
| return;
|
| -
|
| - bool old_state = WebContentsData::IsRecentlyAudible(contents);
|
| + auto data = GetWebContentsData(contents);
|
| + bool old_state = data->IsRecentlyAudible();
|
| bool current_state = contents->WasRecentlyAudible();
|
| if (old_state != current_state) {
|
| - WebContentsData::SetRecentlyAudible(contents, current_state);
|
| - WebContentsData::SetLastAudioChangeTime(contents, TimeTicks::Now());
|
| + data->SetRecentlyAudible(current_state);
|
| + data->SetLastAudioChangeTime(TimeTicks::Now());
|
| }
|
| }
|
|
|
| +void TabManager::ActiveTabChanged(content::WebContents* old_contents,
|
| + content::WebContents* new_contents,
|
| + int index,
|
| + int reason) {
|
| + GetWebContentsData(new_contents)->SetDiscardState(false);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // TabManager, private:
|
|
|
| @@ -368,10 +379,10 @@ void TabManager::AddTabStats(BrowserList* browser_list,
|
| stats.is_playing_audio = IsAudioTab(contents);
|
| stats.is_pinned = model->IsTabPinned(i);
|
| stats.is_selected = browser_active && model->IsTabSelected(i);
|
| - stats.is_discarded = WebContentsData::IsDiscarded(contents);
|
| + stats.is_discarded = GetWebContentsData(contents)->IsDiscarded();
|
| stats.has_form_entry =
|
| contents->GetPageImportanceSignals().had_form_interaction;
|
| - stats.discard_count = WebContentsData::DiscardCount(contents);
|
| + stats.discard_count = GetWebContentsData(contents)->DiscardCount();
|
| stats.last_active = contents->GetLastActiveTime();
|
| stats.renderer_handle = contents->GetRenderProcessHost()->GetHandle();
|
| stats.child_process_host_id = contents->GetRenderProcessHost()->GetID();
|
| @@ -441,7 +452,7 @@ bool TabManager::CanDiscardTab(int64 target_web_contents_id) const {
|
| return false;
|
|
|
| // Do not discard a previously discarded tab if that's the desired behavior.
|
| - if (discard_once_ && WebContentsData::DiscardCount(web_contents) > 0)
|
| + if (discard_once_ && GetWebContentsData(web_contents)->DiscardCount() > 0)
|
| return false;
|
|
|
| return true;
|
| @@ -455,7 +466,7 @@ WebContents* TabManager::DiscardWebContentsAt(int index, TabStripModel* model) {
|
| WebContents* old_contents = model->GetWebContentsAt(index);
|
|
|
| // Can't discard tabs that are already discarded.
|
| - if (WebContentsData::IsDiscarded(old_contents))
|
| + if (GetWebContentsData(old_contents)->IsDiscarded())
|
| return nullptr;
|
|
|
| // Record statistics before discarding to capture the memory state that leads
|
| @@ -476,8 +487,8 @@ WebContents* TabManager::DiscardWebContentsAt(int index, TabStripModel* model) {
|
| // Replace the discarded tab with the null version.
|
| model->ReplaceWebContentsAt(index, null_contents);
|
| // Mark the tab so it will reload when clicked on.
|
| - WebContentsData::SetDiscardState(null_contents, true);
|
| - WebContentsData::IncrementDiscardCount(null_contents);
|
| + GetWebContentsData(null_contents)->SetDiscardState(true);
|
| + GetWebContentsData(null_contents)->IncrementDiscardCount();
|
|
|
| // Discard the old tab's renderer.
|
| // TODO(jamescook): This breaks script connections with other tabs.
|
| @@ -508,10 +519,16 @@ bool TabManager::IsAudioTab(WebContents* contents) const {
|
| if (contents->WasRecentlyAudible())
|
| return true;
|
| auto delta =
|
| - TimeTicks::Now() - WebContentsData::LastAudioChangeTime(contents);
|
| + TimeTicks::Now() - GetWebContentsData(contents)->LastAudioChangeTime();
|
| return delta < TimeDelta::FromSeconds(kAudioProtectionTimeSeconds);
|
| }
|
|
|
| +TabManager::WebContentsData* TabManager::GetWebContentsData(
|
| + content::WebContents* contents) const {
|
| + WebContentsData::CreateForWebContents(contents);
|
| + return WebContentsData::FromWebContents(contents);
|
| +}
|
| +
|
| // static
|
| bool TabManager::CompareTabStats(TabStats first, TabStats second) {
|
| // Being currently selected is most important to protect.
|
|
|