Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5215)

Unified Diff: chrome/browser/memory/oom_priority_manager.cc

Issue 1332003002: Add option to disallow the discarding of a tab that was previously discarded. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sky@ and rkaplow@ comments. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/memory/oom_priority_manager.cc
diff --git a/chrome/browser/memory/oom_priority_manager.cc b/chrome/browser/memory/oom_priority_manager.cc
index 2a1621b049be23aee8ecc6c1c90b192a65ff48db..fb80660ef8c8c13054d1844366ec30e55c26da54 100644
--- a/chrome/browser/memory/oom_priority_manager.cc
+++ b/chrome/browser/memory/oom_priority_manager.cc
@@ -32,6 +32,7 @@
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/host_desktop.h"
#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
+#include "chrome/browser/ui/tabs/tab_discard_state.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/tabs/tab_utils.h"
#include "chrome/common/chrome_constants.h"
@@ -95,7 +96,7 @@ int FindTabStripModelById(int64 target_web_contents_id, TabStripModel** model) {
// OomPriorityManager
OomPriorityManager::OomPriorityManager()
- : discard_count_(0), recent_tab_discard_(false) {
+ : discard_count_(0), recent_tab_discard_(false), discard_once_(false) {
#if defined(OS_CHROMEOS)
delegate_.reset(new OomPriorityManagerDelegate);
#endif
@@ -105,7 +106,8 @@ OomPriorityManager::~OomPriorityManager() {
Stop();
}
-void OomPriorityManager::Start() {
+void OomPriorityManager::Start(bool discard_once) {
+ discard_once_ = discard_once;
if (!update_timer_.IsRunning()) {
update_timer_.Start(FROM_HERE,
TimeDelta::FromSeconds(kAdjustmentIntervalSeconds),
@@ -178,7 +180,8 @@ bool OomPriorityManager::DiscardTab() {
for (TabStatsList::const_reverse_iterator stats_rit = stats.rbegin();
stats_rit != stats.rend(); ++stats_rit) {
int64 least_important_tab_id = stats_rit->tab_contents_id;
- if (DiscardTabById(least_important_tab_id))
+ if (CanDiscardTab(least_important_tab_id) &&
+ DiscardTabById(least_important_tab_id))
return true;
}
return false;
@@ -191,13 +194,13 @@ bool OomPriorityManager::DiscardTabById(int64 target_web_contents_id) {
if (idx == -1)
return false;
- // Can't discard tabs that are already discarded or active.
- if (model->IsTabDiscarded(idx) || (model->active_index() == idx))
+ // Can't discard active tabs
+ if (model->active_index() == idx)
return false;
- // We also ignore tabs that are playing audio as it's too distruptive to
- // the user experience.
- if (model->GetWebContentsAt(idx)->WasRecentlyAudible())
+ WebContents* web_contents = model->GetWebContentsAt(idx);
+ // Can't discard tabs that are already discarded.
+ if (TabDiscardState::IsDiscarded(web_contents))
return false;
VLOG(1) << "Discarding tab " << idx << " id " << target_web_contents_id;
@@ -425,7 +428,8 @@ void OomPriorityManager::AddTabStats(BrowserList* browser_list,
stats.is_playing_audio = contents->WasRecentlyAudible();
stats.is_pinned = model->IsTabPinned(i);
stats.is_selected = browser_active && model->IsTabSelected(i);
- stats.is_discarded = model->IsTabDiscarded(i);
+ stats.is_discarded = TabDiscardState::IsDiscarded(contents);
+ stats.discard_count = TabDiscardState::DiscardCount(contents);
stats.last_active = contents->GetLastActiveTime();
stats.renderer_handle = contents->GetRenderProcessHost()->GetHandle();
stats.child_process_host_id = contents->GetRenderProcessHost()->GetID();
@@ -457,4 +461,25 @@ void OomPriorityManager::OnMemoryPressure(
// consider to call PurgeBrowserMemory() before CRITICAL is reached.
}
+bool OomPriorityManager::CanDiscardTab(int64 target_web_contents_id) const {
+ TabStripModel* model;
+ int idx = FindTabStripModelById(target_web_contents_id, &model);
+
+ if (idx == -1)
+ return false;
+
+ WebContents* web_contents = model->GetWebContentsAt(idx);
+ // We do not discard tabs that are playing audio as it's too distruptive to
+ // the user experience.
+ if (web_contents->WasRecentlyAudible())
+ return false;
+
+ // We also make sure not to discard a previously discarded tab if that's the
+ // desired behavior.
+ if (discard_once_ && TabDiscardState::DiscardCount(web_contents) > 0)
+ return false;
+
+ return true;
+}
+
} // namespace memory
« no previous file with comments | « chrome/browser/memory/oom_priority_manager.h ('k') | chrome/browser/memory/oom_priority_manager_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698