TabManager: Kill background tabs before android (background) apps.

BUG=chromium:728865
TEST=unit tests

Review-Url: https://codereview.chromium.org/2922653003
Cr-Commit-Position: refs/heads/master@{#476663}
diff --git a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc
index 1fbefed6..a91fcb4 100644
--- a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.cc
@@ -675,12 +675,11 @@
   int range_middle =
       (chrome::kLowestRendererOomScore + chrome::kHighestRendererOomScore) / 2;
 
-  // Find some pivot point. For now processes with priority >= CHROME_INTERNAL
-  // are prone to be affected by LRU change. Taking them as "high priority"
-  // processes.
+  // Find some pivot point. For now (roughly) apps are in the first half and
+  // tabs are in the second half.
   auto lower_priority_part = candidates.end();
   for (auto it = candidates.begin(); it != candidates.end(); ++it) {
-    if (it->process_type() >= ProcessType::BACKGROUND_APP) {
+    if (it->process_type() >= ProcessType::BACKGROUND_TAB) {
       lower_priority_part = it;
       break;
     }
diff --git a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h
index ddd8d5f..025fcea 100644
--- a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h
+++ b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h
@@ -46,8 +46,8 @@
   // scores are better than BACKGROUND_TABs and BACKGROUND_APPs.
   IMPORTANT_APP = 3,
 
-  BACKGROUND_TAB = 4,
-  BACKGROUND_APP = 5,
+  BACKGROUND_APP = 4,
+  BACKGROUND_TAB = 5,
   UNKNOWN_TYPE = 6,
 };
 
diff --git a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc
index 6eff1424..06f6de01 100644
--- a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos_unittest.cc
@@ -72,24 +72,24 @@
   // visible app 2, last_activity_time less than visible app 1.
   ASSERT_TRUE(candidates[2].app());
   EXPECT_EQ("visible2", candidates[2].app()->process_name());
-  // pinned and media.
-  ASSERT_TRUE(candidates[3].tab());
-  EXPECT_EQ(300, candidates[3].tab()->tab_contents_id);
-  // media.
-  ASSERT_TRUE(candidates[4].tab());
-  EXPECT_EQ(400, candidates[4].tab()->tab_contents_id);
-  // pinned.
-  ASSERT_TRUE(candidates[5].tab());
-  EXPECT_EQ(100, candidates[5].tab()->tab_contents_id);
-  // chrome app.
-  ASSERT_TRUE(candidates[6].tab());
-  EXPECT_EQ(500, candidates[6].tab()->tab_contents_id);
-  // internal page.
-  ASSERT_TRUE(candidates[7].tab());
-  EXPECT_EQ(200, candidates[7].tab()->tab_contents_id);
   // background service.
-  ASSERT_TRUE(candidates[8].app());
-  EXPECT_EQ("service", candidates[8].app()->process_name());
+  ASSERT_TRUE(candidates[3].app());
+  EXPECT_EQ("service", candidates[3].app()->process_name());
+  // pinned and media.
+  ASSERT_TRUE(candidates[4].tab());
+  EXPECT_EQ(300, candidates[4].tab()->tab_contents_id);
+  // media.
+  ASSERT_TRUE(candidates[5].tab());
+  EXPECT_EQ(400, candidates[5].tab()->tab_contents_id);
+  // pinned.
+  ASSERT_TRUE(candidates[6].tab());
+  EXPECT_EQ(100, candidates[6].tab()->tab_contents_id);
+  // chrome app.
+  ASSERT_TRUE(candidates[7].tab());
+  EXPECT_EQ(500, candidates[7].tab()->tab_contents_id);
+  // internal page.
+  ASSERT_TRUE(candidates[8].tab());
+  EXPECT_EQ(200, candidates[8].tab()->tab_contents_id);
 }
 
 // Occasionally, Chrome sees both FOCUSED_TAB and FOCUSED_APP at the same time.
@@ -241,12 +241,12 @@
   // app "persistent_ui" pid: 60
   // app "visible1"      pid: 20
   // app "visible2"      pid: 40
+  // app "service"       pid: 30
   // tab3                pid: 12
   // tab4                pid: 12
   // tab1                pid: 11
   // tab5                pid: 12
   // tab2                pid: 11
-  // app "service"       pid: 30
   tab_manager_delegate.AdjustOomPrioritiesImpl(tab_list, arc_processes);
   auto& oom_score_map = tab_manager_delegate.oom_score_map_;
 
@@ -261,13 +261,13 @@
 
   // Higher priority part.
   EXPECT_EQ(300, oom_score_map[10]);
-  EXPECT_EQ(344, oom_score_map[20]);
-  EXPECT_EQ(388, oom_score_map[40]);
-  EXPECT_EQ(431, oom_score_map[12]);
-  EXPECT_EQ(475, oom_score_map[11]);
+  EXPECT_EQ(388, oom_score_map[20]);
+  EXPECT_EQ(475, oom_score_map[40]);
+  EXPECT_EQ(563, oom_score_map[30]);
 
   // Lower priority part.
-  EXPECT_EQ(650, oom_score_map[30]);
+  EXPECT_EQ(650, oom_score_map[12]);
+  EXPECT_EQ(720, oom_score_map[11]);
 }
 
 TEST_F(TabManagerDelegateTest, IsRecentlyKilledArcProcess) {
@@ -392,19 +392,19 @@
   // app "persistent"  pid: 60  nspid 6
   // app "visible1"    pid: 20  nspid 2
   // app "visible2"    pid: 40  nspid 4
+  // app "not-visible" pid: 50  nspid 5
+  // app "service"     pid: 30  nspid 3
   // tab3              pid: 12  tab_contents_id 3
   // tab4              pid: 12  tab_contents_id 4
   // tab1              pid: 11  tab_contents_id 1
   // tab5              pid: 12  tab_contents_id 5
   // tab2              pid: 11  tab_contents_id 2
-  // app "not-visible" pid: 50  nspid 5
-  // app "service"     pid: 30  nspid 3
   memory_stat->SetTargetMemoryToFreeKB(250000);
   // Entities to be killed.
-  memory_stat->SetProcessPss(30, 10000);
-  memory_stat->SetProcessPss(50, 5000);
-  memory_stat->SetProcessPss(11, 200000);
+  memory_stat->SetProcessPss(11, 50000);
   memory_stat->SetProcessPss(12, 30000);
+  memory_stat->SetProcessPss(30, 10000);
+  memory_stat->SetProcessPss(50, 60000);
   // Should not be used.
   memory_stat->SetProcessPss(60, 500000);
   memory_stat->SetProcessPss(40, 50000);
@@ -421,12 +421,15 @@
   EXPECT_EQ(3, killed_arc_processes[0]);
   EXPECT_EQ(5, killed_arc_processes[1]);
   // Killed tabs and their content id.
-  // Note that process with pid 11 is counted twice. But so far I don't have a
-  // good way to estimate the memory freed if multiple tabs share one process.
-  ASSERT_EQ(3U, killed_tabs.size());
+  // Note that process with pid 11 is counted twice and pid 12 is counted 3
+  // times. But so far I don't have a good way to estimate the memory freed
+  // if multiple tabs share one process.
+  ASSERT_EQ(5U, killed_tabs.size());
   EXPECT_EQ(2, killed_tabs[0]);
   EXPECT_EQ(5, killed_tabs[1]);
   EXPECT_EQ(1, killed_tabs[2]);
+  EXPECT_EQ(4, killed_tabs[3]);
+  EXPECT_EQ(3, killed_tabs[4]);
 
   // Check that killed apps are in the map.
   const TabManagerDelegate::KilledArcProcessesMap& processes_map =