| OLD | NEW |
| 1 /// Copyright 2014 The Chromium Authors. All rights reserved. | 1 /// Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "athena/activity/public/activity.h" | 5 #include "athena/activity/public/activity.h" |
| 6 #include "athena/activity/public/activity_manager.h" | 6 #include "athena/activity/public/activity_manager.h" |
| 7 #include "athena/activity/public/activity_view_model.h" | 7 #include "athena/activity/public/activity_view_model.h" |
| 8 #include "athena/resource_manager/memory_pressure_notifier.h" | 8 #include "athena/resource_manager/memory_pressure_notifier.h" |
| 9 #include "athena/resource_manager/public/resource_manager.h" | 9 #include "athena/resource_manager/public/resource_manager.h" |
| 10 #include "athena/test/athena_test_base.h" | 10 #include "athena/test/athena_test_base.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 } | 48 } |
| 49 | 49 |
| 50 // ActivityViewModel overrides: | 50 // ActivityViewModel overrides: |
| 51 virtual void Init() OVERRIDE {} | 51 virtual void Init() OVERRIDE {} |
| 52 virtual SkColor GetRepresentativeColor() const OVERRIDE { return 0; } | 52 virtual SkColor GetRepresentativeColor() const OVERRIDE { return 0; } |
| 53 virtual base::string16 GetTitle() const OVERRIDE { return title_; } | 53 virtual base::string16 GetTitle() const OVERRIDE { return title_; } |
| 54 virtual gfx::ImageSkia GetIcon() const OVERRIDE { return gfx::ImageSkia(); } | 54 virtual gfx::ImageSkia GetIcon() const OVERRIDE { return gfx::ImageSkia(); } |
| 55 virtual bool UsesFrame() const OVERRIDE { return true; } | 55 virtual bool UsesFrame() const OVERRIDE { return true; } |
| 56 virtual views::View* GetContentsView() OVERRIDE { return view_; } | 56 virtual views::View* GetContentsView() OVERRIDE { return view_; } |
| 57 virtual views::Widget* CreateWidget() OVERRIDE { return NULL; } | 57 virtual views::Widget* CreateWidget() OVERRIDE { return NULL; } |
| 58 virtual void CreateOverviewModeImage() OVERRIDE {} | 58 virtual gfx::ImageSkia GetOverviewModeImage() OVERRIDE { |
| 59 virtual gfx::ImageSkia GetOverviewModeImage() OVERRIDE { return image_; } | 59 return gfx::ImageSkia(); |
| 60 } |
| 60 virtual void PrepareContentsForOverview() OVERRIDE {} | 61 virtual void PrepareContentsForOverview() OVERRIDE {} |
| 61 virtual void ResetContentsView() OVERRIDE {} | 62 virtual void ResetContentsView() OVERRIDE {} |
| 62 | 63 |
| 63 private: | 64 private: |
| 64 // The presentation values. | 65 // The presentation values. |
| 65 const base::string16 title_; | 66 const base::string16 title_; |
| 66 gfx::ImageSkia image_; | 67 gfx::ImageSkia image_; |
| 67 | 68 |
| 68 // The associated view. | 69 // The associated view. |
| 69 views::View* view_; | 70 views::View* view_; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 // Test that we release an activity when the memory pressure goes critical. | 126 // Test that we release an activity when the memory pressure goes critical. |
| 126 TEST_F(ResourceManagerTest, OnCriticalWillUnloadOneActivity) { | 127 TEST_F(ResourceManagerTest, OnCriticalWillUnloadOneActivity) { |
| 127 // Create a few dummy activities in the reverse order as we need them. | 128 // Create a few dummy activities in the reverse order as we need them. |
| 128 TestActivity* app_unloadable2 = CreateActivity("unloadable2"); | 129 TestActivity* app_unloadable2 = CreateActivity("unloadable2"); |
| 129 TestActivity* app_unloadable1 = CreateActivity("unloadable1"); | 130 TestActivity* app_unloadable1 = CreateActivity("unloadable1"); |
| 130 TestActivity* app_visible = CreateActivity("visible"); | 131 TestActivity* app_visible = CreateActivity("visible"); |
| 131 app_visible->set_visible(true); | 132 app_visible->set_visible(true); |
| 132 app_unloadable1->set_visible(false); | 133 app_unloadable1->set_visible(false); |
| 133 app_unloadable2->set_visible(false); | 134 app_unloadable2->set_visible(false); |
| 134 | 135 |
| 135 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 136 // Set the initial visibility states. |
| 136 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable1->GetCurrentState()); | 137 app_visible->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 137 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable2->GetCurrentState()); | 138 app_unloadable1->SetCurrentState(Activity::ACTIVITY_INVISIBLE); |
| 139 app_unloadable2->SetCurrentState(Activity::ACTIVITY_INVISIBLE); |
| 138 | 140 |
| 139 // Call the resource manager and say we are in a critical memory condition. | 141 // Call the resource manager and say we are in a critical memory condition. |
| 140 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( | 142 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 141 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); | 143 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); |
| 142 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 144 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); |
| 143 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable1->GetCurrentState()); | 145 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable1->GetCurrentState()); |
| 144 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable2->GetCurrentState()); | 146 DCHECK_EQ(Activity::ACTIVITY_UNLOADED, app_unloadable2->GetCurrentState()); |
| 145 | 147 |
| 146 // Calling it a second time will release the second app. | 148 // Calling it a second time will release the second app. |
| 147 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( | 149 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 168 TestActivity* app_visible = CreateActivity("visible"); | 170 TestActivity* app_visible = CreateActivity("visible"); |
| 169 app_visible->set_visible(true); | 171 app_visible->set_visible(true); |
| 170 app_unloadable->set_visible(false); | 172 app_unloadable->set_visible(false); |
| 171 app_media_locked1->set_visible(false); | 173 app_media_locked1->set_visible(false); |
| 172 app_media_locked2->set_visible(false); | 174 app_media_locked2->set_visible(false); |
| 173 | 175 |
| 174 app_media_locked1->set_media_state( | 176 app_media_locked1->set_media_state( |
| 175 Activity::ACTIVITY_MEDIA_STATE_AUDIO_PLAYING); | 177 Activity::ACTIVITY_MEDIA_STATE_AUDIO_PLAYING); |
| 176 app_media_locked2->set_media_state(Activity::ACTIVITY_MEDIA_STATE_RECORDING); | 178 app_media_locked2->set_media_state(Activity::ACTIVITY_MEDIA_STATE_RECORDING); |
| 177 | 179 |
| 180 // Set the initial visibility states. |
| 181 app_visible->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 182 app_media_locked1->SetCurrentState(Activity::ACTIVITY_INVISIBLE); |
| 183 app_unloadable->SetCurrentState(Activity::ACTIVITY_INVISIBLE); |
| 184 app_media_locked2->SetCurrentState(Activity::ACTIVITY_INVISIBLE); |
| 185 |
| 178 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 186 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); |
| 179 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_media_locked1->GetCurrentState()); | 187 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_media_locked1->GetCurrentState()); |
| 180 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable->GetCurrentState()); | 188 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_unloadable->GetCurrentState()); |
| 181 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_media_locked2->GetCurrentState()); | 189 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_media_locked2->GetCurrentState()); |
| 182 | 190 |
| 183 // Calling it with a critical situation first, it will release the non media | 191 // Calling it with a critical situation first, it will release the non media |
| 184 // locked app. | 192 // locked app. |
| 185 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( | 193 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 186 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); | 194 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); |
| 187 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); | 195 DCHECK_NE(Activity::ACTIVITY_UNLOADED, app_visible->GetCurrentState()); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 | 265 |
| 258 // Going back to a relaxed memory pressure should reload the old activities. | 266 // Going back to a relaxed memory pressure should reload the old activities. |
| 259 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( | 267 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 260 MemoryPressureObserver::MEMORY_PRESSURE_LOW); | 268 MemoryPressureObserver::MEMORY_PRESSURE_LOW); |
| 261 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); | 269 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 262 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app2->GetCurrentState()); | 270 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app2->GetCurrentState()); |
| 263 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app3->GetCurrentState()); | 271 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app3->GetCurrentState()); |
| 264 EXPECT_NE(Activity::ACTIVITY_INVISIBLE, app4->GetCurrentState()); | 272 EXPECT_NE(Activity::ACTIVITY_INVISIBLE, app4->GetCurrentState()); |
| 265 } | 273 } |
| 266 | 274 |
| 275 // Make sure that an activity which got just demoted from visible to invisible, |
| 276 // does not get thrown out of memory in the same step. |
| 277 TEST_F(ResourceManagerTest, NoUnloadFromVisible) { |
| 278 // Create a few dummy activities in the reverse order as we need them. |
| 279 TestActivity* app2 = CreateActivity("app2"); |
| 280 TestActivity* app1 = CreateActivity("app1"); |
| 281 app1->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 282 app2->SetCurrentState(Activity::ACTIVITY_VISIBLE); |
| 283 |
| 284 // Applying low resource pressure should turn one item ivisible. |
| 285 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 286 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); |
| 287 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 288 EXPECT_EQ(Activity::ACTIVITY_INVISIBLE, app2->GetCurrentState()); |
| 289 |
| 290 // Applying low resource pressure again will unload it. |
| 291 ResourceManager::Get()->SetMemoryPressureAndStopMonitoring( |
| 292 MemoryPressureObserver::MEMORY_PRESSURE_CRITICAL); |
| 293 EXPECT_EQ(Activity::ACTIVITY_VISIBLE, app1->GetCurrentState()); |
| 294 EXPECT_EQ(Activity::ACTIVITY_UNLOADED, app2->GetCurrentState()); |
| 295 } |
| 296 |
| 267 } // namespace test | 297 } // namespace test |
| 268 } // namespace athena | 298 } // namespace athena |
| OLD | NEW |