Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ash/shelf/shelf_window_watcher.h" | 5 #include "ash/shelf/shelf_window_watcher.h" |
| 6 | 6 |
| 7 #include "ash/public/cpp/config.h" | 7 #include "ash/public/cpp/config.h" |
| 8 #include "ash/public/cpp/shelf_item.h" | 8 #include "ash/public/cpp/shelf_item.h" |
| 9 #include "ash/public/cpp/shelf_model.h" | 9 #include "ash/public/cpp/shelf_model.h" |
| 10 #include "ash/public/cpp/shell_window_ids.h" | 10 #include "ash/public/cpp/shell_window_ids.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 82 CreateShelfItem(widget2->GetNativeWindow()); | 82 CreateShelfItem(widget2->GetNativeWindow()); |
| 83 EXPECT_EQ(3, model_->item_count()); | 83 EXPECT_EQ(3, model_->item_count()); |
| 84 | 84 |
| 85 // Each ShelfItem is removed when the associated window is destroyed. | 85 // Each ShelfItem is removed when the associated window is destroyed. |
| 86 widget1.reset(); | 86 widget1.reset(); |
| 87 EXPECT_EQ(2, model_->item_count()); | 87 EXPECT_EQ(2, model_->item_count()); |
| 88 widget2.reset(); | 88 widget2.reset(); |
| 89 EXPECT_EQ(1, model_->item_count()); | 89 EXPECT_EQ(1, model_->item_count()); |
| 90 } | 90 } |
| 91 | 91 |
| 92 // Ensure shelf items are added and removed for unknown windows in mash. | 92 // Ensure shelf items are added and removed for some unknown windows in mash. |
| 93 TEST_F(ShelfWindowWatcherTest, OpenAndCloseMash) { | 93 TEST_F(ShelfWindowWatcherTest, OpenAndCloseMash) { |
| 94 if (Shell::GetAshConfig() != Config::MASH) | 94 if (Shell::GetAshConfig() != Config::MASH) |
| 95 return; | 95 return; |
| 96 | 96 |
| 97 // ShelfModel only has an APP_LIST item. | 97 // ShelfModel only has an APP_LIST item. |
| 98 EXPECT_EQ(1, model_->item_count()); | 98 EXPECT_EQ(1, model_->item_count()); |
| 99 | 99 |
| 100 // Windows with no valid ShelfItemType and ShelfID properties get shelf items. | 100 // Windows with no valid ShelfItemType and ShelfID properties get shelf items. |
| 101 std::unique_ptr<views::Widget> widget1 = | 101 std::unique_ptr<views::Widget> widget1 = |
| 102 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 102 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 103 EXPECT_EQ(2, model_->item_count()); | 103 EXPECT_EQ(2, model_->item_count()); |
| 104 std::unique_ptr<views::Widget> widget2 = | 104 std::unique_ptr<views::Widget> widget2 = |
| 105 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 105 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 106 EXPECT_EQ(3, model_->item_count()); | 106 EXPECT_EQ(3, model_->item_count()); |
| 107 | 107 |
| 108 // Each ShelfItem is removed when the associated window is destroyed. | 108 // Each ShelfItem is removed when the associated window is destroyed. |
| 109 widget1.reset(); | 109 widget1.reset(); |
| 110 EXPECT_EQ(2, model_->item_count()); | 110 EXPECT_EQ(2, model_->item_count()); |
| 111 widget2.reset(); | 111 widget2.reset(); |
| 112 EXPECT_EQ(1, model_->item_count()); | 112 EXPECT_EQ(1, model_->item_count()); |
| 113 | 113 |
| 114 // Windows with type WINDOW_TYPE_NORMAL get shelf items, others do not. | |
| 115 aura::client::WindowType no_item_types[] = { | |
| 116 aura::client::WINDOW_TYPE_UNKNOWN, aura::client::WINDOW_TYPE_NORMAL, | |
| 117 aura::client::WINDOW_TYPE_POPUP, aura::client::WINDOW_TYPE_CONTROL, | |
| 118 aura::client::WINDOW_TYPE_PANEL, aura::client::WINDOW_TYPE_MENU, | |
| 119 aura::client::WINDOW_TYPE_TOOLTIP}; | |
| 120 for (aura::client::WindowType type : no_item_types) { | |
| 121 std::unique_ptr<aura::Window> window = | |
| 122 base::MakeUnique<aura::Window>(nullptr, type); | |
| 123 window->Init(ui::LAYER_NOT_DRAWN); | |
| 124 Shell::GetPrimaryRootWindow() | |
| 125 ->GetChildById(kShellWindowId_DefaultContainer) | |
| 126 ->AddChild(window.get()); | |
| 127 window->Show(); | |
| 128 EXPECT_EQ(type == aura::client::WINDOW_TYPE_NORMAL ? 2 : 1, | |
|
James Cook
2017/06/08 17:14:00
nit: Take WINDOW_TYPE_NORMAL out of the array abov
| |
| 129 model_->item_count()); | |
| 130 } | |
| 131 | |
| 114 // Windows with WindowState::ignored_by_shelf set do not get shelf items. | 132 // Windows with WindowState::ignored_by_shelf set do not get shelf items. |
| 115 widget1 = | 133 widget1 = |
| 116 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 134 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 117 wm::GetWindowState(widget1->GetNativeWindow())->set_ignored_by_shelf(true); | 135 wm::GetWindowState(widget1->GetNativeWindow())->set_ignored_by_shelf(true); |
| 118 // TODO(msw): Make the flag a window property and remove this workaround. | 136 // TODO(msw): Make the flag a window property and remove this workaround. |
| 119 widget1->GetNativeWindow()->SetProperty(aura::client::kDrawAttentionKey, | 137 widget1->GetNativeWindow()->SetProperty(aura::client::kDrawAttentionKey, |
| 120 true); | 138 true); |
| 121 EXPECT_EQ(1, model_->item_count()); | 139 EXPECT_EQ(1, model_->item_count()); |
| 122 } | 140 } |
| 123 | 141 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 193 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index_w1].status); | 211 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index_w1].status); |
| 194 EXPECT_EQ(STATUS_RUNNING, model_->items()[index_w2].status); | 212 EXPECT_EQ(STATUS_RUNNING, model_->items()[index_w2].status); |
| 195 | 213 |
| 196 // The ShelfItem for the second window is active when the window is activated. | 214 // The ShelfItem for the second window is active when the window is activated. |
| 197 widget2->Activate(); | 215 widget2->Activate(); |
| 198 EXPECT_EQ(STATUS_RUNNING, model_->items()[index_w1].status); | 216 EXPECT_EQ(STATUS_RUNNING, model_->items()[index_w1].status); |
| 199 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index_w2].status); | 217 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index_w2].status); |
| 200 } | 218 } |
| 201 | 219 |
| 202 TEST_F(ShelfWindowWatcherTest, UpdateWindowProperty) { | 220 TEST_F(ShelfWindowWatcherTest, UpdateWindowProperty) { |
| 203 // TODO: investigate failure in mash. http://crbug.com/695562. | |
|
James Cook
2017/06/08 17:14:00
Woo hoo, things work in mash!
| |
| 204 if (Shell::GetAshConfig() == Config::MASH) | |
| 205 return; | |
| 206 | |
| 207 // ShelfModel only has an APP_LIST item. | 221 // ShelfModel only has an APP_LIST item. |
| 208 EXPECT_EQ(1, model_->item_count()); | 222 EXPECT_EQ(1, model_->item_count()); |
| 209 | 223 |
| 210 std::unique_ptr<views::Widget> widget = | 224 std::unique_ptr<views::Widget> widget = |
| 211 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 225 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 212 | 226 |
| 213 // Create a ShelfItem for |window|. | 227 // Create a ShelfItem for |window|. |
| 214 ShelfID id = CreateShelfItem(widget->GetNativeWindow()); | 228 ShelfID id = CreateShelfItem(widget->GetNativeWindow()); |
| 215 EXPECT_EQ(2, model_->item_count()); | 229 EXPECT_EQ(2, model_->item_count()); |
| 216 | 230 |
| 217 int index = model_->ItemIndexByID(id); | 231 int index = model_->ItemIndexByID(id); |
| 218 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index].status); | 232 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index].status); |
| 219 | 233 |
| 220 // Update the window's ShelfItemType. | 234 // Update the window's ShelfItemType. |
| 221 widget->GetNativeWindow()->SetProperty(kShelfItemTypeKey, | 235 widget->GetNativeWindow()->SetProperty(kShelfItemTypeKey, |
| 222 static_cast<int32_t>(TYPE_APP)); | 236 static_cast<int32_t>(TYPE_APP_PANEL)); |
| 223 // No new item is created after updating a launcher item. | 237 // No new item is created after updating a launcher item. |
| 224 EXPECT_EQ(2, model_->item_count()); | 238 EXPECT_EQ(2, model_->item_count()); |
| 225 // index and id are not changed after updating a launcher item. | 239 // index and id are not changed after updating a launcher item. |
| 226 EXPECT_EQ(index, model_->ItemIndexByID(id)); | 240 EXPECT_EQ(index, model_->ItemIndexByID(id)); |
| 227 EXPECT_EQ(id, model_->items()[index].id); | 241 EXPECT_EQ(id, model_->items()[index].id); |
| 228 } | 242 } |
| 229 | 243 |
| 230 TEST_F(ShelfWindowWatcherTest, MaximizeAndRestoreWindow) { | 244 TEST_F(ShelfWindowWatcherTest, MaximizeAndRestoreWindow) { |
| 231 // TODO: investigate failure in mash. http://crbug.com/695562. | |
| 232 if (Shell::GetAshConfig() == Config::MASH) | |
| 233 return; | |
| 234 | |
| 235 // ShelfModel only has an APP_LIST item. | 245 // ShelfModel only has an APP_LIST item. |
| 236 EXPECT_EQ(1, model_->item_count()); | 246 EXPECT_EQ(1, model_->item_count()); |
| 237 | 247 |
| 238 std::unique_ptr<views::Widget> widget = | 248 std::unique_ptr<views::Widget> widget = |
| 239 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 249 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 240 wm::WindowState* window_state = wm::GetWindowState(widget->GetNativeWindow()); | 250 wm::WindowState* window_state = wm::GetWindowState(widget->GetNativeWindow()); |
| 241 | 251 |
| 242 // Create a ShelfItem for the window. | 252 // Create a ShelfItem for the window. |
| 243 ShelfID id = CreateShelfItem(widget->GetNativeWindow()); | 253 ShelfID id = CreateShelfItem(widget->GetNativeWindow()); |
| 244 EXPECT_EQ(2, model_->item_count()); | 254 EXPECT_EQ(2, model_->item_count()); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 262 // No new item is created after restoring the window. | 272 // No new item is created after restoring the window. |
| 263 EXPECT_EQ(2, model_->item_count()); | 273 EXPECT_EQ(2, model_->item_count()); |
| 264 // Index and id are not changed after maximizing the window. | 274 // Index and id are not changed after maximizing the window. |
| 265 EXPECT_EQ(index, model_->ItemIndexByID(id)); | 275 EXPECT_EQ(index, model_->ItemIndexByID(id)); |
| 266 EXPECT_EQ(id, model_->items()[index].id); | 276 EXPECT_EQ(id, model_->items()[index].id); |
| 267 } | 277 } |
| 268 | 278 |
| 269 // Check |window|'s item is not changed during the dragging. | 279 // Check |window|'s item is not changed during the dragging. |
| 270 // TODO(simonhong): Add a test for removing a Window during the dragging. | 280 // TODO(simonhong): Add a test for removing a Window during the dragging. |
| 271 TEST_F(ShelfWindowWatcherTest, DragWindow) { | 281 TEST_F(ShelfWindowWatcherTest, DragWindow) { |
| 272 // TODO: investigate failure in mash. http://crbug.com/695562. | |
| 273 if (Shell::GetAshConfig() == Config::MASH) | |
| 274 return; | |
| 275 | |
| 276 // ShelfModel only has an APP_LIST item. | 282 // ShelfModel only has an APP_LIST item. |
| 277 EXPECT_EQ(1, model_->item_count()); | 283 EXPECT_EQ(1, model_->item_count()); |
| 278 | 284 |
| 279 std::unique_ptr<views::Widget> widget = | 285 std::unique_ptr<views::Widget> widget = |
| 280 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 286 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 281 | 287 |
| 282 // Create a ShelfItem for the window. | 288 // Create a ShelfItem for the window. |
| 283 ShelfID id = CreateShelfItem(widget->GetNativeWindow()); | 289 ShelfID id = CreateShelfItem(widget->GetNativeWindow()); |
| 284 EXPECT_EQ(2, model_->item_count()); | 290 EXPECT_EQ(2, model_->item_count()); |
| 285 | 291 |
| 286 int index = model_->ItemIndexByID(id); | 292 int index = model_->ItemIndexByID(id); |
| 287 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index].status); | 293 EXPECT_EQ(STATUS_ACTIVE, model_->items()[index].status); |
| 288 | 294 |
| 289 // Simulate dragging of the window and check its item is not changed. | 295 // Simulate dragging of the window and check its item is not changed. |
| 290 std::unique_ptr<WindowResizer> resizer( | 296 std::unique_ptr<WindowResizer> resizer( |
| 291 CreateWindowResizer(widget->GetNativeWindow(), gfx::Point(), HTCAPTION, | 297 CreateWindowResizer(widget->GetNativeWindow(), gfx::Point(), HTCAPTION, |
| 292 ::wm::WINDOW_MOVE_SOURCE_MOUSE)); | 298 ::wm::WINDOW_MOVE_SOURCE_MOUSE)); |
| 293 ASSERT_TRUE(resizer.get()); | 299 ASSERT_TRUE(resizer.get()); |
| 294 resizer->Drag(gfx::Point(50, 50), 0); | 300 resizer->Drag(gfx::Point(50, 50), 0); |
| 295 resizer->CompleteDrag(); | 301 resizer->CompleteDrag(); |
| 296 | 302 |
| 297 // Index and id are not changed after dragging the window. | 303 // Index and id are not changed after dragging the window. |
| 298 EXPECT_EQ(index, model_->ItemIndexByID(id)); | 304 EXPECT_EQ(index, model_->ItemIndexByID(id)); |
| 299 EXPECT_EQ(id, model_->items()[index].id); | 305 EXPECT_EQ(id, model_->items()[index].id); |
| 300 } | 306 } |
| 301 | 307 |
| 302 // Ensure shelf items are added and removed as panels are opened and closed. | 308 // Ensure panels and dialogs get shelf items. |
| 303 TEST_F(ShelfWindowWatcherTest, PanelWindow) { | 309 TEST_F(ShelfWindowWatcherTest, PanelAndDialogWindows) { |
| 304 // TODO: investigate failure in mash. http://crbug.com/695562. | |
| 305 if (Shell::GetAshConfig() == Config::MASH) | |
| 306 return; | |
| 307 | |
| 308 // ShelfModel only has an APP_LIST item. | 310 // ShelfModel only has an APP_LIST item. |
| 309 EXPECT_EQ(1, model_->item_count()); | 311 EXPECT_EQ(1, model_->item_count()); |
| 310 | 312 |
| 311 // Adding windows with valid ShelfItemType properties adds shelf items. | 313 // An item is created for a dialog window. |
| 312 std::unique_ptr<views::Widget> widget1 = | 314 std::unique_ptr<views::Widget> dialog_widget = |
| 313 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 315 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 314 aura::Window* window1 = widget1->GetNativeWindow(); | 316 aura::Window* dialog = dialog_widget->GetNativeWindow(); |
| 315 window1->SetProperty(kShelfIDKey, new std::string(ShelfID("a").Serialize())); | 317 dialog->SetProperty(kShelfIDKey, new std::string(ShelfID("a").Serialize())); |
| 316 window1->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_APP)); | 318 dialog->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_DIALOG)); |
| 317 EXPECT_EQ(2, model_->item_count()); | 319 EXPECT_EQ(2, model_->item_count()); |
| 318 std::unique_ptr<views::Widget> widget2 = | |
| 319 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | |
| 320 aura::Window* window2 = widget2->GetNativeWindow(); | |
| 321 window2->SetProperty(kShelfIDKey, new std::string(ShelfID("b").Serialize())); | |
| 322 window2->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_DIALOG)); | |
| 323 EXPECT_EQ(3, model_->item_count()); | |
| 324 | 320 |
| 325 // Create a panel-type widget to mimic Chrome's app panel windows. | 321 // An item is created for a panel window. |
|
James Cook
2017/06/08 17:14:00
I think this test would be clearer if split into m
| |
| 326 views::Widget panel_widget; | 322 views::Widget panel_widget; |
| 327 views::Widget::InitParams panel_params(views::Widget::InitParams::TYPE_PANEL); | 323 views::Widget::InitParams panel_params(views::Widget::InitParams::TYPE_PANEL); |
| 328 panel_params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 324 panel_params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 329 Shell::GetPrimaryRootWindowController() | 325 Shell::GetPrimaryRootWindowController() |
| 330 ->ConfigureWidgetInitParamsForContainer( | 326 ->ConfigureWidgetInitParamsForContainer( |
| 331 &panel_widget, kShellWindowId_PanelContainer, &panel_params); | 327 &panel_widget, kShellWindowId_PanelContainer, &panel_params); |
| 332 panel_widget.Init(panel_params); | 328 panel_widget.Init(panel_params); |
| 333 panel_widget.Show(); | 329 panel_widget.Show(); |
| 334 aura::Window* panel_window = panel_widget.GetNativeWindow(); | 330 aura::Window* panel = panel_widget.GetNativeWindow(); |
| 335 panel_window->SetProperty(kShelfIDKey, | 331 panel->SetProperty(kShelfIDKey, new std::string(ShelfID("b").Serialize())); |
| 336 new std::string(ShelfID("c").Serialize())); | 332 panel->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_APP_PANEL)); |
| 337 panel_window->SetProperty(kShelfItemTypeKey, | 333 EXPECT_EQ(3, model_->item_count()); |
| 338 static_cast<int32_t>(TYPE_APP_PANEL)); | 334 |
| 339 EXPECT_EQ(4, model_->item_count()); | 335 // An item is not created for an app window. |
| 336 std::unique_ptr<views::Widget> app_widget = | |
| 337 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | |
| 338 aura::Window* app = app_widget->GetNativeWindow(); | |
| 339 app->SetProperty(kShelfIDKey, new std::string(ShelfID("c").Serialize())); | |
| 340 app->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_APP)); | |
| 341 EXPECT_EQ(3, model_->item_count()); | |
| 342 app_widget.reset(); | |
| 340 | 343 |
| 341 // Each ShelfItem is removed when the associated window is destroyed. | 344 // Each ShelfItem is removed when the associated window is destroyed. |
| 342 panel_widget.CloseNow(); | 345 panel_widget.CloseNow(); |
| 343 EXPECT_EQ(3, model_->item_count()); | |
| 344 widget2.reset(); | |
| 345 EXPECT_EQ(2, model_->item_count()); | 346 EXPECT_EQ(2, model_->item_count()); |
| 346 widget1.reset(); | 347 dialog_widget.reset(); |
| 347 EXPECT_EQ(1, model_->item_count()); | 348 EXPECT_EQ(1, model_->item_count()); |
| 348 } | 349 } |
| 349 | 350 |
| 350 // Ensure items use the app icon and window icon aura::Window properties. | 351 // Ensure items use the app icon and window icon aura::Window properties. |
| 351 TEST_F(ShelfWindowWatcherTest, ItemIcon) { | 352 TEST_F(ShelfWindowWatcherTest, ItemIcon) { |
| 352 // ShelfModel only has an APP_LIST item. | 353 // ShelfModel only has an APP_LIST item. |
| 353 EXPECT_EQ(1, model_->item_count()); | 354 EXPECT_EQ(1, model_->item_count()); |
| 354 | 355 |
| 355 // Create a ShelfItem for a window; it should have a default icon. | 356 // Create a ShelfItem for a window; it should have a default icon. |
| 356 std::unique_ptr<views::Widget> widget = | 357 std::unique_ptr<views::Widget> widget = |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 372 const gfx::ImageSkia blue = CreateImageSkiaIcon(SK_ColorBLUE); | 373 const gfx::ImageSkia blue = CreateImageSkiaIcon(SK_ColorBLUE); |
| 373 window->SetProperty(aura::client::kAppIconKey, new gfx::ImageSkia(blue)); | 374 window->SetProperty(aura::client::kAppIconKey, new gfx::ImageSkia(blue)); |
| 374 EXPECT_EQ(SK_ColorBLUE, model_->items()[1].image.bitmap()->getColor(0, 0)); | 375 EXPECT_EQ(SK_ColorBLUE, model_->items()[1].image.bitmap()->getColor(0, 0)); |
| 375 | 376 |
| 376 // Clearing the app icon should restore the window icon to the shelf item. | 377 // Clearing the app icon should restore the window icon to the shelf item. |
| 377 window->ClearProperty(aura::client::kAppIconKey); | 378 window->ClearProperty(aura::client::kAppIconKey); |
| 378 EXPECT_EQ(SK_ColorRED, model_->items()[1].image.bitmap()->getColor(0, 0)); | 379 EXPECT_EQ(SK_ColorRED, model_->items()[1].image.bitmap()->getColor(0, 0)); |
| 379 } | 380 } |
| 380 | 381 |
| 381 TEST_F(ShelfWindowWatcherTest, DontCreateShelfEntriesForChildWindows) { | 382 TEST_F(ShelfWindowWatcherTest, DontCreateShelfEntriesForChildWindows) { |
| 382 const int initial_item_count = model_->item_count(); | 383 EXPECT_EQ(1, model_->item_count()); |
| 383 | 384 std::unique_ptr<aura::Window> window = |
| 384 std::unique_ptr<aura::Window> window(base::MakeUnique<aura::Window>( | 385 base::MakeUnique<aura::Window>(nullptr, aura::client::WINDOW_TYPE_NORMAL); |
| 385 nullptr, aura::client::WINDOW_TYPE_NORMAL)); | |
| 386 window->Init(ui::LAYER_NOT_DRAWN); | 386 window->Init(ui::LAYER_NOT_DRAWN); |
| 387 window->SetProperty(kShelfIDKey, new std::string(ShelfID("foo").Serialize())); | 387 window->SetProperty(kShelfIDKey, new std::string(ShelfID("a").Serialize())); |
| 388 window->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_APP)); | 388 window->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_DIALOG)); |
| 389 Shell::GetPrimaryRootWindow() | 389 Shell::GetPrimaryRootWindow() |
| 390 ->GetChildById(kShellWindowId_DefaultContainer) | 390 ->GetChildById(kShellWindowId_DefaultContainer) |
| 391 ->AddChild(window.get()); | 391 ->AddChild(window.get()); |
| 392 window->Show(); | 392 window->Show(); |
| 393 EXPECT_EQ(initial_item_count + 1, model_->item_count()); | 393 EXPECT_EQ(2, model_->item_count()); |
|
James Cook
2017/06/08 17:14:00
Hooray for explicit expectations instead of math i
| |
| 394 | 394 |
| 395 std::unique_ptr<aura::Window> child_window(base::MakeUnique<aura::Window>( | 395 std::unique_ptr<aura::Window> child = |
| 396 nullptr, aura::client::WINDOW_TYPE_NORMAL)); | 396 base::MakeUnique<aura::Window>(nullptr, aura::client::WINDOW_TYPE_NORMAL); |
| 397 child_window->Init(ui::LAYER_NOT_DRAWN); | 397 child->Init(ui::LAYER_NOT_DRAWN); |
| 398 child_window->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_APP)); | 398 child->SetProperty(kShelfIDKey, new std::string(ShelfID("b").Serialize())); |
| 399 window->AddChild(child_window.get()); | 399 child->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_DIALOG)); |
| 400 child_window->Show(); | 400 window->AddChild(child.get()); |
| 401 // |child_window| should not result in adding a new entry. | 401 child->Show(); |
| 402 EXPECT_EQ(initial_item_count + 1, model_->item_count()); | 402 // There should not be a new shelf item for |child|. |
| 403 EXPECT_EQ(2, model_->item_count()); | |
| 403 | 404 |
| 404 child_window.reset(); | 405 child.reset(); |
| 406 EXPECT_EQ(2, model_->item_count()); | |
| 405 window.reset(); | 407 window.reset(); |
| 406 EXPECT_EQ(initial_item_count, model_->item_count()); | 408 EXPECT_EQ(1, model_->item_count()); |
| 407 } | 409 } |
| 408 | 410 |
| 409 TEST_F(ShelfWindowWatcherTest, DontCreateShelfEntriesForTransientWindows) { | 411 TEST_F(ShelfWindowWatcherTest, CreateShelfEntriesForTransientWindows) { |
| 410 const int initial_item_count = model_->item_count(); | 412 EXPECT_EQ(1, model_->item_count()); |
| 411 | 413 std::unique_ptr<aura::Window> window = |
| 412 std::unique_ptr<aura::Window> window(base::MakeUnique<aura::Window>( | 414 base::MakeUnique<aura::Window>(nullptr, aura::client::WINDOW_TYPE_NORMAL); |
| 413 nullptr, aura::client::WINDOW_TYPE_NORMAL)); | |
| 414 window->Init(ui::LAYER_NOT_DRAWN); | 415 window->Init(ui::LAYER_NOT_DRAWN); |
| 415 window->SetProperty(kShelfIDKey, new std::string(ShelfID("foo").Serialize())); | 416 window->SetProperty(kShelfIDKey, new std::string(ShelfID("a").Serialize())); |
| 416 window->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_APP)); | 417 window->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_DIALOG)); |
| 417 Shell::GetPrimaryRootWindow() | 418 Shell::GetPrimaryRootWindow() |
| 418 ->GetChildById(kShellWindowId_DefaultContainer) | 419 ->GetChildById(kShellWindowId_DefaultContainer) |
| 419 ->AddChild(window.get()); | 420 ->AddChild(window.get()); |
| 420 window->Show(); | 421 window->Show(); |
| 421 EXPECT_EQ(initial_item_count + 1, model_->item_count()); | 422 EXPECT_EQ(2, model_->item_count()); |
| 422 | 423 |
| 423 std::unique_ptr<aura::Window> transient_window(base::MakeUnique<aura::Window>( | 424 std::unique_ptr<aura::Window> transient = |
| 424 nullptr, aura::client::WINDOW_TYPE_NORMAL)); | 425 base::MakeUnique<aura::Window>(nullptr, aura::client::WINDOW_TYPE_NORMAL); |
| 425 transient_window->Init(ui::LAYER_NOT_DRAWN); | 426 transient->Init(ui::LAYER_NOT_DRAWN); |
| 426 transient_window->SetProperty(kShelfItemTypeKey, | 427 transient->SetProperty(kShelfIDKey, |
| 427 static_cast<int32_t>(TYPE_APP)); | 428 new std::string(ShelfID("b").Serialize())); |
| 428 ::wm::TransientWindowController::Get()->AddTransientChild( | 429 transient->SetProperty(kShelfItemTypeKey, static_cast<int32_t>(TYPE_DIALOG)); |
| 429 window.get(), transient_window.get()); | 430 Shell::GetPrimaryRootWindow() |
| 430 transient_window->Show(); | 431 ->GetChildById(kShellWindowId_DefaultContainer) |
| 431 // |transient_window| should not result in adding a new entry. | 432 ->AddChild(transient.get()); |
| 432 EXPECT_EQ(initial_item_count + 1, model_->item_count()); | 433 ::wm::TransientWindowController::Get()->AddTransientChild(window.get(), |
| 434 transient.get()); | |
| 435 transient->Show(); | |
| 436 // There should be a new shelf item for |transient|. | |
| 437 EXPECT_EQ(3, model_->item_count()); | |
| 433 | 438 |
| 434 transient_window.reset(); | 439 transient.reset(); |
| 440 EXPECT_EQ(2, model_->item_count()); | |
| 435 window.reset(); | 441 window.reset(); |
| 436 EXPECT_EQ(initial_item_count, model_->item_count()); | 442 EXPECT_EQ(1, model_->item_count()); |
| 437 } | 443 } |
| 438 | 444 |
| 439 // Ensures ShelfWindowWatcher supports windows opened prior to session start. | 445 // Ensures ShelfWindowWatcher supports windows opened prior to session start. |
| 440 using ShelfWindowWatcherSessionStartTest = test::NoSessionAshTestBase; | 446 using ShelfWindowWatcherSessionStartTest = test::NoSessionAshTestBase; |
| 441 TEST_F(ShelfWindowWatcherSessionStartTest, PreExistingWindow) { | 447 TEST_F(ShelfWindowWatcherSessionStartTest, PreExistingWindow) { |
| 442 ShelfModel* model = Shell::Get()->shelf_model(); | 448 ShelfModel* model = Shell::Get()->shelf_model(); |
| 443 ASSERT_FALSE( | 449 ASSERT_FALSE( |
| 444 Shell::Get()->session_controller()->IsActiveUserSessionStarted()); | 450 Shell::Get()->session_controller()->IsActiveUserSessionStarted()); |
| 445 | 451 |
| 446 // ShelfModel only has an APP_LIST item. | 452 // ShelfModel only has an APP_LIST item. |
| 447 EXPECT_EQ(1, model->item_count()); | 453 EXPECT_EQ(1, model->item_count()); |
| 448 | 454 |
| 449 // Construct a window that should get a shelf item once the session starts. | 455 // Construct a window that should get a shelf item once the session starts. |
| 450 std::unique_ptr<views::Widget> widget = | 456 std::unique_ptr<views::Widget> widget = |
| 451 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); | 457 CreateTestWidget(nullptr, kShellWindowId_DefaultContainer, gfx::Rect()); |
| 452 ShelfWindowWatcherTest::CreateShelfItem(widget->GetNativeWindow()); | 458 ShelfWindowWatcherTest::CreateShelfItem(widget->GetNativeWindow()); |
| 453 EXPECT_EQ(1, model->item_count()); | 459 EXPECT_EQ(1, model->item_count()); |
| 454 | 460 |
| 455 // Start the test user session; ShelfWindowWatcher will find the open window. | 461 // Start the test user session; ShelfWindowWatcher will find the open window. |
| 456 SetSessionStarted(true); | 462 SetSessionStarted(true); |
| 457 EXPECT_EQ(2, model->item_count()); | 463 EXPECT_EQ(2, model->item_count()); |
| 458 } | 464 } |
| 459 | 465 |
| 460 } // namespace | 466 } // namespace |
| 461 } // namespace ash | 467 } // namespace ash |
| OLD | NEW |