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

Side by Side Diff: chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_unittest.cc

Issue 2462753002: Use Ash's ShelfWindowWatcher for app panel windows. (Closed)
Patch Set: Address comments. Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
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 "chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h" 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
11 #include <memory> 11 #include <memory>
12 #include <set> 12 #include <set>
13 #include <string> 13 #include <string>
14 #include <utility> 14 #include <utility>
15 #include <vector> 15 #include <vector>
16 16
17 #include "ash/common/ash_switches.h" 17 #include "ash/common/ash_switches.h"
18 #include "ash/common/shelf/shelf_controller.h"
18 #include "ash/common/shelf/shelf_model.h" 19 #include "ash/common/shelf/shelf_model.h"
19 #include "ash/common/shelf/shelf_model_observer.h" 20 #include "ash/common/shelf/shelf_model_observer.h"
20 #include "ash/common/test/test_session_state_delegate.h" 21 #include "ash/common/test/test_session_state_delegate.h"
21 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" 22 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
22 #include "ash/common/wm_shell.h" 23 #include "ash/common/wm_shell.h"
23 #include "ash/display/screen_orientation_controller_chromeos.h" 24 #include "ash/display/screen_orientation_controller_chromeos.h"
24 #include "ash/shell.h" 25 #include "ash/shell.h"
25 #include "ash/test/ash_test_helper.h" 26 #include "ash/test/ash_test_helper.h"
26 #include "ash/test/test_shell_delegate.h" 27 #include "ash/test/test_shell_delegate.h"
27 #include "ash/wm/window_util.h" 28 #include "ash/wm/window_util.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 // An extension prefix. 119 // An extension prefix.
119 const char kCrxAppPrefix[] = "_crx_"; 120 const char kCrxAppPrefix[] = "_crx_";
120 121
121 // Dummy app id is used to put at least one pin record to prevent initializing 122 // Dummy app id is used to put at least one pin record to prevent initializing
122 // pin model with default apps that can affect some tests. 123 // pin model with default apps that can affect some tests.
123 const char kDummyAppId[] = "dummyappid_dummyappid_dummyappid"; 124 const char kDummyAppId[] = "dummyappid_dummyappid_dummyappid";
124 125
125 // ShelfModelObserver implementation that tracks what messages are invoked. 126 // ShelfModelObserver implementation that tracks what messages are invoked.
126 class TestShelfModelObserver : public ash::ShelfModelObserver { 127 class TestShelfModelObserver : public ash::ShelfModelObserver {
127 public: 128 public:
128 TestShelfModelObserver() 129 TestShelfModelObserver() {}
129 : added_(0),
130 removed_(0),
131 changed_(0) {
132 }
133
134 ~TestShelfModelObserver() override {} 130 ~TestShelfModelObserver() override {}
135 131
136 // Overridden from ash::ShelfModelObserver: 132 // Overridden from ash::ShelfModelObserver:
137 void ShelfItemAdded(int index) override { 133 void ShelfItemAdded(int index) override {
138 ++added_; 134 ++added_;
139 last_index_ = index; 135 last_index_ = index;
140 } 136 }
141 137
142 void ShelfItemRemoved(int index, ash::ShelfID id) override { 138 void ShelfItemRemoved(int index, ash::ShelfID id) override {
143 ++removed_; 139 ++removed_;
(...skipping 18 matching lines...) Expand all
162 changed_ = 0; 158 changed_ = 0;
163 last_index_ = 0; 159 last_index_ = 0;
164 } 160 }
165 161
166 int added() const { return added_; } 162 int added() const { return added_; }
167 int removed() const { return removed_; } 163 int removed() const { return removed_; }
168 int changed() const { return changed_; } 164 int changed() const { return changed_; }
169 int last_index() const { return last_index_; } 165 int last_index() const { return last_index_; }
170 166
171 private: 167 private:
172 int added_; 168 int added_ = 0;
173 int removed_; 169 int removed_ = 0;
174 int changed_; 170 int changed_ = 0;
175 int last_index_; 171 int last_index_ = 0;
176 172
177 DISALLOW_COPY_AND_ASSIGN(TestShelfModelObserver); 173 DISALLOW_COPY_AND_ASSIGN(TestShelfModelObserver);
178 }; 174 };
179 175
180 // Test implementation of AppIconLoader. 176 // Test implementation of AppIconLoader.
181 class TestAppIconLoaderImpl : public AppIconLoader { 177 class TestAppIconLoaderImpl : public AppIconLoader {
182 public: 178 public:
183 TestAppIconLoaderImpl() = default; 179 TestAppIconLoaderImpl() = default;
184 ~TestAppIconLoaderImpl() override = default; 180 ~TestAppIconLoaderImpl() override = default;
185 181
186 void AddSupportedApp(const std::string& id) { supported_apps_.insert(id); } 182 void AddSupportedApp(const std::string& id) { supported_apps_.insert(id); }
187 183
188 // AppIconLoader implementation: 184 // AppIconLoader implementation:
189 bool CanLoadImageForApp(const std::string& id) override { 185 bool CanLoadImageForApp(const std::string& id) override {
190 return supported_apps_.find(id) != supported_apps_.end(); 186 return supported_apps_.find(id) != supported_apps_.end();
191 } 187 }
192
193 void FetchImage(const std::string& id) override { ++fetch_count_; } 188 void FetchImage(const std::string& id) override { ++fetch_count_; }
194
195 void ClearImage(const std::string& id) override { ++clear_count_; } 189 void ClearImage(const std::string& id) override { ++clear_count_; }
196
197 void UpdateImage(const std::string& id) override {} 190 void UpdateImage(const std::string& id) override {}
198 191
199 int fetch_count() const { return fetch_count_; } 192 int fetch_count() const { return fetch_count_; }
200 int clear_count() const { return clear_count_; } 193 int clear_count() const { return clear_count_; }
201 194
202 private: 195 private:
203 int fetch_count_ = 0; 196 int fetch_count_ = 0;
204 int clear_count_ = 0; 197 int clear_count_ = 0;
205 std::set<std::string> supported_apps_; 198 std::set<std::string> supported_apps_;
206 199
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 288
296 private: 289 private:
297 DISALLOW_COPY_AND_ASSIGN(TestV2AppLauncherItemController); 290 DISALLOW_COPY_AND_ASSIGN(TestV2AppLauncherItemController);
298 }; 291 };
299 292
300 } // namespace 293 } // namespace
301 294
302 class ChromeLauncherControllerImplTest : public BrowserWithTestWindowTest { 295 class ChromeLauncherControllerImplTest : public BrowserWithTestWindowTest {
303 protected: 296 protected:
304 ChromeLauncherControllerImplTest() 297 ChromeLauncherControllerImplTest()
305 : BrowserWithTestWindowTest(Browser::TYPE_TABBED, false), 298 : BrowserWithTestWindowTest(Browser::TYPE_TABBED, false) {}
306 test_controller_(NULL),
307 extension_service_(NULL) {}
308 299
309 ~ChromeLauncherControllerImplTest() override {} 300 ~ChromeLauncherControllerImplTest() override {}
310 301
311 void SetUp() override { 302 void SetUp() override {
312 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 303 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
313 command_line->AppendSwitch(switches::kUseFirstDisplayAsInternal); 304 command_line->AppendSwitch(switches::kUseFirstDisplayAsInternal);
314 command_line->AppendSwitch(ash::switches::kAshEnableTouchViewTesting); 305 command_line->AppendSwitch(ash::switches::kAshEnableTouchViewTesting);
315 306
316 app_list::AppListSyncableServiceFactory::SetUseInTesting(); 307 app_list::AppListSyncableServiceFactory::SetUseInTesting();
317 308
318 BrowserWithTestWindowTest::SetUp(); 309 BrowserWithTestWindowTest::SetUp();
319 310
320 if (!profile_manager_) { 311 if (!profile_manager_) {
321 profile_manager_.reset( 312 profile_manager_.reset(
322 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); 313 new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
323 ASSERT_TRUE(profile_manager_->SetUp()); 314 ASSERT_TRUE(profile_manager_->SetUp());
324 } 315 }
325 316
326 model_.reset(new ash::ShelfModel); 317 model_ = ash::WmShell::Get()->shelf_controller()->model();
327 model_observer_.reset(new TestShelfModelObserver); 318 model_observer_.reset(new TestShelfModelObserver);
328 model_->AddObserver(model_observer_.get()); 319 model_->AddObserver(model_observer_.get());
329 320
330 base::DictionaryValue manifest; 321 base::DictionaryValue manifest;
331 manifest.SetString(extensions::manifest_keys::kName, 322 manifest.SetString(extensions::manifest_keys::kName,
332 "launcher controller test extension"); 323 "launcher controller test extension");
333 manifest.SetString(extensions::manifest_keys::kVersion, "1"); 324 manifest.SetString(extensions::manifest_keys::kVersion, "1");
334 manifest.SetString(extensions::manifest_keys::kDescription, 325 manifest.SetString(extensions::manifest_keys::kDescription,
335 "for testing pinned apps"); 326 "for testing pinned apps");
336 327
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 InsertAddPinChange(user_b, 0, extension7_->id()); 456 InsertAddPinChange(user_b, 0, extension7_->id());
466 InsertAddPinChange(user_b, 1, extension8_->id()); 457 InsertAddPinChange(user_b, 1, extension8_->id());
467 InsertAddPinChange(user_b, 2, extension_misc::kChromeAppId); 458 InsertAddPinChange(user_b, 2, extension_misc::kChromeAppId);
468 } 459 }
469 460
470 void TearDown() override { 461 void TearDown() override {
471 arc_test_.TearDown(); 462 arc_test_.TearDown();
472 model_->RemoveObserver(model_observer_.get()); 463 model_->RemoveObserver(model_observer_.get());
473 model_observer_.reset(); 464 model_observer_.reset();
474 launcher_controller_.reset(); 465 launcher_controller_.reset();
475
476 // |model_| must be deleted after |launch_controller_|, because
477 // |launch_controller_| has a map of pointers to the data held by |model_|.
478 model_.reset();
479
480 BrowserWithTestWindowTest::TearDown(); 466 BrowserWithTestWindowTest::TearDown();
481 } 467 }
482 468
483 BrowserWindow* CreateBrowserWindow() override { 469 BrowserWindow* CreateBrowserWindow() override {
484 return CreateTestBrowserWindowAura(); 470 return CreateTestBrowserWindowAura();
485 } 471 }
486 472
487 std::unique_ptr<Browser> CreateBrowserWithTestWindowForProfile( 473 std::unique_ptr<Browser> CreateBrowserWithTestWindowForProfile(
488 Profile* profile) { 474 Profile* profile) {
489 TestBrowserWindow* browser_window = CreateTestBrowserWindowAura(); 475 TestBrowserWindow* browser_window = CreateTestBrowserWindowAura();
490 new TestBrowserWindowOwner(browser_window); 476 new TestBrowserWindowOwner(browser_window);
491 return base::WrapUnique( 477 return base::WrapUnique(
492 CreateBrowser(profile, Browser::TYPE_TABBED, false, browser_window)); 478 CreateBrowser(profile, Browser::TYPE_TABBED, false, browser_window));
493 } 479 }
494 480
495 void AddAppListLauncherItem() { 481 void AddAppListLauncherItem() {
496 ash::ShelfItem app_list; 482 ash::ShelfItem app_list;
497 app_list.type = ash::TYPE_APP_LIST; 483 app_list.type = ash::TYPE_APP_LIST;
498 model_->Add(app_list); 484 model_->Add(app_list);
499 } 485 }
500 486
501 void InitLauncherController() { 487 void InitLauncherController() {
502 AddAppListLauncherItem();
503 launcher_controller_.reset( 488 launcher_controller_.reset(
504 new ChromeLauncherControllerImpl(profile(), model_.get())); 489 new ChromeLauncherControllerImpl(profile(), model_));
505 // TODO(crbug.com/654622): Some tests break with a non-null static instance. 490 // TODO(crbug.com/654622): Some tests break with a non-null static instance.
506 ChromeLauncherControllerImpl::set_instance_for_test(nullptr); 491 ChromeLauncherControllerImpl::set_instance_for_test(nullptr);
507 launcher_controller_->Init(); 492 launcher_controller_->Init();
508 } 493 }
509 494
510 void InitLauncherControllerWithBrowser() { 495 void InitLauncherControllerWithBrowser() {
511 InitLauncherController(); 496 InitLauncherController();
512 chrome::NewTab(browser()); 497 chrome::NewTab(browser());
513 browser()->window()->Show(); 498 browser()->window()->Show();
514 } 499 }
515 500
516 void RecreateChromeLauncher() { 501 void RecreateChromeLauncher() {
517 // Destroy controller first if it exists. 502 // Destroy controller first if it exists.
518 launcher_controller_.reset(); 503 launcher_controller_.reset();
519 model_.reset(new ash::ShelfModel); 504 while (model_->item_count() > 0)
505 model_->RemoveItemAt(0);
520 AddAppListLauncherItem(); 506 AddAppListLauncherItem();
521 launcher_controller_ = 507 launcher_controller_ =
522 base::MakeUnique<ChromeLauncherControllerImpl>(profile(), model_.get()); 508 base::MakeUnique<ChromeLauncherControllerImpl>(profile(), model_);
523 launcher_controller_->Init(); 509 launcher_controller_->Init();
524 } 510 }
525 511
526 void StartAppSyncService(const syncer::SyncDataList& init_sync_list) { 512 void StartAppSyncService(const syncer::SyncDataList& init_sync_list) {
527 app_service_->MergeDataAndStartSyncing( 513 app_service_->MergeDataAndStartSyncing(
528 syncer::APP_LIST, init_sync_list, 514 syncer::APP_LIST, init_sync_list,
529 base::MakeUnique<syncer::FakeSyncChangeProcessor>(), 515 base::MakeUnique<syncer::FakeSyncChangeProcessor>(),
530 base::MakeUnique<syncer::SyncErrorFactoryMock>()); 516 base::MakeUnique<syncer::SyncErrorFactoryMock>());
531 EXPECT_EQ(init_sync_list.size(), app_service_->sync_items().size()); 517 EXPECT_EQ(init_sync_list.size(), app_service_->sync_items().size());
532 } 518 }
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 scoped_refptr<Extension> extension5_; 896 scoped_refptr<Extension> extension5_;
911 scoped_refptr<Extension> extension6_; 897 scoped_refptr<Extension> extension6_;
912 scoped_refptr<Extension> extension7_; 898 scoped_refptr<Extension> extension7_;
913 scoped_refptr<Extension> extension8_; 899 scoped_refptr<Extension> extension8_;
914 scoped_refptr<Extension> arc_support_host_; 900 scoped_refptr<Extension> arc_support_host_;
915 901
916 ArcAppTest arc_test_; 902 ArcAppTest arc_test_;
917 bool auto_start_arc_test_ = false; 903 bool auto_start_arc_test_ = false;
918 std::unique_ptr<ChromeLauncherControllerImpl> launcher_controller_; 904 std::unique_ptr<ChromeLauncherControllerImpl> launcher_controller_;
919 std::unique_ptr<TestShelfModelObserver> model_observer_; 905 std::unique_ptr<TestShelfModelObserver> model_observer_;
920 std::unique_ptr<ash::ShelfModel> model_; 906 ash::ShelfModel* model_ = nullptr;
921 std::unique_ptr<TestingProfileManager> profile_manager_; 907 std::unique_ptr<TestingProfileManager> profile_manager_;
922 908
923 // |item_delegate_manager_| owns |test_controller_|. 909 // |item_delegate_manager_| owns |test_controller_|.
924 LauncherItemController* test_controller_; 910 LauncherItemController* test_controller_ = nullptr;
925 911
926 ExtensionService* extension_service_; 912 ExtensionService* extension_service_ = nullptr;
927 913
928 app_list::AppListSyncableService* app_service_; 914 app_list::AppListSyncableService* app_service_ = nullptr;
929 915
930 private: 916 private:
931 TestBrowserWindow* CreateTestBrowserWindowAura() { 917 TestBrowserWindow* CreateTestBrowserWindowAura() {
932 std::unique_ptr<aura::Window> window(new aura::Window(nullptr)); 918 std::unique_ptr<aura::Window> window(new aura::Window(nullptr));
933 window->set_id(0); 919 window->set_id(0);
934 window->SetType(ui::wm::WINDOW_TYPE_NORMAL); 920 window->SetType(ui::wm::WINDOW_TYPE_NORMAL);
935 window->Init(ui::LAYER_TEXTURED); 921 window->Init(ui::LAYER_TEXTURED);
936 aura::client::ParentWindowWithContext(window.get(), GetContext(), 922 aura::client::ParentWindowWithContext(window.get(), GetContext(),
937 gfx::Rect(200, 200)); 923 gfx::Rect(200, 200));
938 924
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 private: 999 private:
1014 // The associated browser with this app. 1000 // The associated browser with this app.
1015 std::unique_ptr<Browser> browser_; 1001 std::unique_ptr<Browser> browser_;
1016 1002
1017 // The native window we use. 1003 // The native window we use.
1018 std::unique_ptr<aura::Window> native_window_; 1004 std::unique_ptr<aura::Window> native_window_;
1019 1005
1020 DISALLOW_COPY_AND_ASSIGN(V1App); 1006 DISALLOW_COPY_AND_ASSIGN(V1App);
1021 }; 1007 };
1022 1008
1023 // A V2 application which gets created with an |extension| and for a |profile|. 1009 // A V2 application window created with an |extension| and for a |profile|.
1024 // Upon destruction it will properly close the application. 1010 // Upon destruction it will properly close the application; supports panels too.
1025 class V2App { 1011 class V2App {
1026 public: 1012 public:
1027 V2App(Profile* profile, const extensions::Extension* extension) 1013 V2App(Profile* profile,
1014 const extensions::Extension* extension,
1015 extensions::AppWindow::WindowType window_type =
1016 extensions::AppWindow::WINDOW_TYPE_DEFAULT)
1028 : creator_web_contents_( 1017 : creator_web_contents_(
1029 content::WebContentsTester::CreateTestWebContents(profile, 1018 content::WebContentsTester::CreateTestWebContents(profile,
1030 nullptr)) { 1019 nullptr)) {
1031 window_ = new extensions::AppWindow(profile, new ChromeAppDelegate(true), 1020 window_ = new extensions::AppWindow(profile, new ChromeAppDelegate(true),
1032 extension); 1021 extension);
1033 extensions::AppWindow::CreateParams params = 1022 extensions::AppWindow::CreateParams params;
1034 extensions::AppWindow::CreateParams(); 1023 params.window_type = window_type;
1035 // Note: normally, the creator RFH is the background page of the 1024 // Note: normally, the creator RFH is the background page of the
1036 // app/extension 1025 // app/extension
1037 // calling chrome.app.window.create. For unit testing purposes, just passing 1026 // calling chrome.app.window.create. For unit testing purposes, just passing
1038 // in a random RenderFrameHost is Good Enoughâ„¢. 1027 // in a random RenderFrameHost is Good Enoughâ„¢.
1039 window_->Init(GURL(std::string()), 1028 window_->Init(GURL(std::string()),
1040 new extensions::AppWindowContentsImpl(window_), 1029 new extensions::AppWindowContentsImpl(window_),
1041 creator_web_contents_->GetMainFrame(), params); 1030 creator_web_contents_->GetMainFrame(), params);
1042 } 1031 }
1043 1032
1044 virtual ~V2App() { 1033 virtual ~V2App() {
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 V1App* v1_app = new V1App(profile, app_name); 1170 V1App* v1_app = new V1App(profile, app_name);
1182 // Create a new launcher controller helper and assign it to the launcher so 1171 // Create a new launcher controller helper and assign it to the launcher so
1183 // that this app gets properly detected. 1172 // that this app gets properly detected.
1184 // TODO(skuhne): Create a more intelligent launcher controller helper that 1173 // TODO(skuhne): Create a more intelligent launcher controller helper that
1185 // is able to detect all running apps properly. 1174 // is able to detect all running apps properly.
1186 TestLauncherControllerHelper* helper = new TestLauncherControllerHelper; 1175 TestLauncherControllerHelper* helper = new TestLauncherControllerHelper;
1187 helper->SetAppID(v1_app->browser()->tab_strip_model()->GetWebContentsAt(0), 1176 helper->SetAppID(v1_app->browser()->tab_strip_model()->GetWebContentsAt(0),
1188 app_name); 1177 app_name);
1189 SetLauncherControllerHelper(helper); 1178 SetLauncherControllerHelper(helper);
1190 1179
1191 NavigateAndCommitActiveTabWithTitle( 1180 NavigateAndCommitActiveTabWithTitle(v1_app->browser(), GURL(url),
1192 v1_app->browser(), GURL(url), ASCIIToUTF16("")); 1181 base::string16());
1193 return v1_app; 1182 return v1_app;
1194 } 1183 }
1195 1184
1196 ash::test::TestShellDelegate* shell_delegate() { return shell_delegate_; } 1185 ash::test::TestShellDelegate* shell_delegate() { return shell_delegate_; }
1197 1186
1198 // Override BrowserWithTestWindowTest: 1187 // Override BrowserWithTestWindowTest:
1199 TestingProfile* CreateProfile() override { 1188 TestingProfile* CreateProfile() override {
1200 return CreateMultiUserProfile("user1"); 1189 return CreateMultiUserProfile("user1");
1201 } 1190 }
1202 void DestroyProfile(TestingProfile* profile) override { 1191 void DestroyProfile(TestingProfile* profile) override {
(...skipping 2063 matching lines...) Expand 10 before | Expand all | Expand 10 after
3266 { 3255 {
3267 ChromeLauncherAppMenuItems items = 3256 ChromeLauncherAppMenuItems items =
3268 launcher_controller_->GetApplicationList(item_gmail, 0); 3257 launcher_controller_->GetApplicationList(item_gmail, 0);
3269 items[1]->Execute(ui::EF_SHIFT_DOWN); 3258 items[1]->Execute(ui::EF_SHIFT_DOWN);
3270 EXPECT_EQ(--tabs, browser()->tab_strip_model()->count()); 3259 EXPECT_EQ(--tabs, browser()->tab_strip_model()->count());
3271 } 3260 }
3272 } 3261 }
3273 3262
3274 // Tests that panels create launcher items correctly 3263 // Tests that panels create launcher items correctly
3275 TEST_F(ChromeLauncherControllerImplTest, AppPanels) { 3264 TEST_F(ChromeLauncherControllerImplTest, AppPanels) {
3276 InitLauncherControllerWithBrowser(); 3265 InitLauncherController();
3277 // App list and Browser shortcut ShelfItems are added. 3266 model_observer_->clear_counts();
3278 EXPECT_EQ(2, model_observer_->added()); 3267 const std::string app_id = extension1_->id();
3279 EXPECT_EQ(1, model_observer_->changed());
3280 3268
3281 const std::string app_id = extension1_->id();
3282 // app_icon_loader is owned by ChromeLauncherControllerImpl. 3269 // app_icon_loader is owned by ChromeLauncherControllerImpl.
3283 TestAppIconLoaderImpl* app_icon_loader = new TestAppIconLoaderImpl(); 3270 TestAppIconLoaderImpl* app_icon_loader = new TestAppIconLoaderImpl();
3284 app_icon_loader->AddSupportedApp(app_id); 3271 app_icon_loader->AddSupportedApp(app_id);
3285 SetAppIconLoader(std::unique_ptr<AppIconLoader>(app_icon_loader)); 3272 SetAppIconLoader(std::unique_ptr<AppIconLoader>(app_icon_loader));
3286 3273
3287 // Test adding an app panel 3274 // Make an app panel; the ShelfItem is added by ash::ShelfWindowWatcher.
3288 AppWindowLauncherItemController* app_panel_controller = 3275 std::unique_ptr<V2App> app_panel1 = base::MakeUnique<V2App>(
3289 new ExtensionAppWindowLauncherItemController( 3276 profile(), extension1_.get(), extensions::AppWindow::WINDOW_TYPE_PANEL);
3290 LauncherItemController::TYPE_APP_PANEL, app_id, "id", 3277 EXPECT_TRUE(app_panel1->window()->GetNativeWindow()->IsVisible());
3291 launcher_controller_.get());
3292 ash::ShelfID shelf_id1 = launcher_controller_->CreateAppLauncherItem(
3293 app_panel_controller, app_id, ash::STATUS_RUNNING);
3294 int panel_index = model_observer_->last_index(); 3278 int panel_index = model_observer_->last_index();
3295 EXPECT_EQ(3, model_observer_->added()); 3279 EXPECT_EQ(1, model_observer_->added());
3296 EXPECT_EQ(1, model_observer_->changed());
3297 EXPECT_EQ(1, app_icon_loader->fetch_count()); 3280 EXPECT_EQ(1, app_icon_loader->fetch_count());
3298 model_observer_->clear_counts(); 3281 model_observer_->clear_counts();
3299 3282
3300 // App panels should have a separate identifier than the app id 3283 // App panels should have a separate identifier than the app id
3301 EXPECT_EQ(0, launcher_controller_->GetShelfIDForAppID(app_id)); 3284 EXPECT_EQ(0, launcher_controller_->GetShelfIDForAppID(app_id));
3302 3285
3303 // Setting the app image image should not change the panel if it set its icon 3286 // Setting the app image should not change the panel, which has a window icon.
3304 app_panel_controller->set_image_set_by_controller(true);
3305 gfx::ImageSkia image; 3287 gfx::ImageSkia image;
3306 launcher_controller_->OnAppImageUpdated(app_id, image); 3288 launcher_controller_->OnAppImageUpdated(app_id, image);
3307 EXPECT_EQ(0, model_observer_->changed()); 3289 EXPECT_EQ(0, model_observer_->changed());
3308 model_observer_->clear_counts(); 3290 model_observer_->clear_counts();
3309 3291
3310 // Add a second app panel and verify that it get the same index as the first 3292 // Make a second app panel and verify that it gets the same index as the first
3311 // one had, being added to the left of the existing panel. 3293 // panel, being added to the left of the existing panel.
3312 AppWindowLauncherItemController* app_panel_controller2 = 3294 std::unique_ptr<V2App> app_panel2 = base::MakeUnique<V2App>(
3313 new ExtensionAppWindowLauncherItemController( 3295 profile(), extension2_.get(), extensions::AppWindow::WINDOW_TYPE_PANEL);
3314 LauncherItemController::TYPE_APP_PANEL, app_id, "id",
3315 launcher_controller_.get());
3316
3317 ash::ShelfID shelf_id2 = launcher_controller_->CreateAppLauncherItem(
3318 app_panel_controller2, app_id, ash::STATUS_RUNNING);
3319 EXPECT_EQ(panel_index, model_observer_->last_index()); 3296 EXPECT_EQ(panel_index, model_observer_->last_index());
3320 EXPECT_EQ(1, model_observer_->added()); 3297 EXPECT_EQ(1, model_observer_->added());
3321 model_observer_->clear_counts(); 3298 model_observer_->clear_counts();
3322 3299
3323 launcher_controller_->CloseLauncherItem(shelf_id2); 3300 app_panel1.reset();
3324 launcher_controller_->CloseLauncherItem(shelf_id1); 3301 app_panel2.reset();
3325 EXPECT_EQ(2, model_observer_->removed()); 3302 EXPECT_EQ(2, model_observer_->removed());
3326 } 3303 }
3327 3304
3328 // Tests that the Gmail extension matches more than the app itself claims with 3305 // Tests that the Gmail extension matches more than the app itself claims with
3329 // the manifest file. 3306 // the manifest file.
3330 TEST_F(ChromeLauncherControllerImplTest, GmailMatching) { 3307 TEST_F(ChromeLauncherControllerImplTest, GmailMatching) {
3331 InitLauncherControllerWithBrowser(); 3308 InitLauncherControllerWithBrowser();
3332 3309
3333 // Create a Gmail browser tab. 3310 // Create a Gmail browser tab.
3334 chrome::NewTab(browser()); 3311 chrome::NewTab(browser());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3412 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[3].type); 3389 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[3].type);
3413 3390
3414 // Move browser shortcut item from index 1 to index 3. 3391 // Move browser shortcut item from index 1 to index 3.
3415 model_->Move(1, 3); 3392 model_->Move(1, 3);
3416 EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[0].type); 3393 EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[0].type);
3417 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[1].type); 3394 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[1].type);
3418 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[2].type); 3395 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[2].type);
3419 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[3].type); 3396 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[3].type);
3420 3397
3421 launcher_controller_.reset(); 3398 launcher_controller_.reset();
3422 model_.reset(new ash::ShelfModel); 3399 while (!model_->items().empty())
3400 model_->RemoveItemAt(0);
3423 3401
3424 AddAppListLauncherItem(); 3402 AddAppListLauncherItem();
3425 launcher_controller_ = 3403 launcher_controller_ =
3426 base::MakeUnique<ChromeLauncherControllerImpl>(profile(), model_.get()); 3404 base::MakeUnique<ChromeLauncherControllerImpl>(profile(), model_);
3427 helper = new TestLauncherControllerHelper(profile()); 3405 helper = new TestLauncherControllerHelper(profile());
3428 helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1"); 3406 helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
3429 helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2"); 3407 helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2");
3430 SetLauncherControllerHelper(helper); 3408 SetLauncherControllerHelper(helper);
3431 launcher_controller_->Init(); 3409 launcher_controller_->Init();
3432 3410
3433 // Check ShelfItems are restored after resetting ChromeLauncherControllerImpl. 3411 // Check ShelfItems are restored after resetting ChromeLauncherControllerImpl.
3434 EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[0].type); 3412 EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[0].type);
3435 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[1].type); 3413 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[1].type);
3436 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[2].type); 3414 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[2].type);
(...skipping 21 matching lines...) Expand all
3458 launcher_controller_->PinAppWithID("1"); 3436 launcher_controller_->PinAppWithID("1");
3459 ash::ShelfID id = launcher_controller_->GetShelfIDForAppID("1"); 3437 ash::ShelfID id = launcher_controller_->GetShelfIDForAppID("1");
3460 int app_index = model_->ItemIndexByID(id); 3438 int app_index = model_->ItemIndexByID(id);
3461 EXPECT_EQ(1, app_icon_loader->fetch_count()); 3439 EXPECT_EQ(1, app_icon_loader->fetch_count());
3462 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[app_index].type); 3440 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[app_index].type);
3463 EXPECT_TRUE(launcher_controller_->IsAppPinned("1")); 3441 EXPECT_TRUE(launcher_controller_->IsAppPinned("1"));
3464 EXPECT_FALSE(launcher_controller_->IsAppPinned("0")); 3442 EXPECT_FALSE(launcher_controller_->IsAppPinned("0"));
3465 EXPECT_EQ(initial_size + 1, model_->items().size()); 3443 EXPECT_EQ(initial_size + 1, model_->items().size());
3466 3444
3467 launcher_controller_.reset(); 3445 launcher_controller_.reset();
3468 model_.reset(new ash::ShelfModel); 3446 while (!model_->items().empty())
3447 model_->RemoveItemAt(0);
3469 3448
3470 AddAppListLauncherItem(); 3449 AddAppListLauncherItem();
3471 launcher_controller_ = 3450 launcher_controller_ =
3472 base::MakeUnique<ChromeLauncherControllerImpl>(profile(), model_.get()); 3451 base::MakeUnique<ChromeLauncherControllerImpl>(profile(), model_);
3473 helper = new TestLauncherControllerHelper(profile()); 3452 helper = new TestLauncherControllerHelper(profile());
3474 helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1"); 3453 helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
3475 SetLauncherControllerHelper(helper); 3454 SetLauncherControllerHelper(helper);
3476 // app_icon_loader is owned by ChromeLauncherControllerImpl. 3455 // app_icon_loader is owned by ChromeLauncherControllerImpl.
3477 app_icon_loader = new TestAppIconLoaderImpl; 3456 app_icon_loader = new TestAppIconLoaderImpl;
3478 app_icon_loader->AddSupportedApp("1"); 3457 app_icon_loader->AddSupportedApp("1");
3479 SetAppIconLoader(std::unique_ptr<AppIconLoader>(app_icon_loader)); 3458 SetAppIconLoader(std::unique_ptr<AppIconLoader>(app_icon_loader));
3480 launcher_controller_->Init(); 3459 launcher_controller_->Init();
3481 3460
3482 EXPECT_EQ(1, app_icon_loader->fetch_count()); 3461 EXPECT_EQ(1, app_icon_loader->fetch_count());
(...skipping 14 matching lines...) Expand all
3497 const std::string app_id3 = extension3_->id(); 3476 const std::string app_id3 = extension3_->id();
3498 // app_icon_loader1 and app_icon_loader2 are owned by 3477 // app_icon_loader1 and app_icon_loader2 are owned by
3499 // ChromeLauncherControllerImpl. 3478 // ChromeLauncherControllerImpl.
3500 TestAppIconLoaderImpl* app_icon_loader1 = new TestAppIconLoaderImpl(); 3479 TestAppIconLoaderImpl* app_icon_loader1 = new TestAppIconLoaderImpl();
3501 TestAppIconLoaderImpl* app_icon_loader2 = new TestAppIconLoaderImpl(); 3480 TestAppIconLoaderImpl* app_icon_loader2 = new TestAppIconLoaderImpl();
3502 app_icon_loader1->AddSupportedApp(app_id1); 3481 app_icon_loader1->AddSupportedApp(app_id1);
3503 app_icon_loader2->AddSupportedApp(app_id2); 3482 app_icon_loader2->AddSupportedApp(app_id2);
3504 SetAppIconLoaders(std::unique_ptr<AppIconLoader>(app_icon_loader1), 3483 SetAppIconLoaders(std::unique_ptr<AppIconLoader>(app_icon_loader1),
3505 std::unique_ptr<AppIconLoader>(app_icon_loader2)); 3484 std::unique_ptr<AppIconLoader>(app_icon_loader2));
3506 3485
3507 AppWindowLauncherItemController* app_panel_controller3 = 3486 AppWindowLauncherItemController* app_controller3 =
3508 new ExtensionAppWindowLauncherItemController( 3487 new ExtensionAppWindowLauncherItemController(
3509 LauncherItemController::TYPE_APP_PANEL, app_id3, "id", 3488 LauncherItemController::TYPE_APP, app_id3, "id",
3510 launcher_controller_.get()); 3489 launcher_controller_.get());
3511 const ash::ShelfID shelfId3 = launcher_controller_->CreateAppLauncherItem( 3490 const ash::ShelfID shelfId3 = launcher_controller_->CreateAppLauncherItem(
3512 app_panel_controller3, app_id3, ash::STATUS_RUNNING); 3491 app_controller3, app_id3, ash::STATUS_RUNNING);
3513 EXPECT_EQ(0, app_icon_loader1->fetch_count()); 3492 EXPECT_EQ(0, app_icon_loader1->fetch_count());
3514 EXPECT_EQ(0, app_icon_loader1->clear_count()); 3493 EXPECT_EQ(0, app_icon_loader1->clear_count());
3515 EXPECT_EQ(0, app_icon_loader2->fetch_count()); 3494 EXPECT_EQ(0, app_icon_loader2->fetch_count());
3516 EXPECT_EQ(0, app_icon_loader2->clear_count()); 3495 EXPECT_EQ(0, app_icon_loader2->clear_count());
3517 3496
3518 AppWindowLauncherItemController* app_panel_controller2 = 3497 AppWindowLauncherItemController* app_controller2 =
3519 new ExtensionAppWindowLauncherItemController( 3498 new ExtensionAppWindowLauncherItemController(
3520 LauncherItemController::TYPE_APP_PANEL, app_id2, "id", 3499 LauncherItemController::TYPE_APP, app_id2, "id",
3521 launcher_controller_.get()); 3500 launcher_controller_.get());
3522 const ash::ShelfID shelfId2 = launcher_controller_->CreateAppLauncherItem( 3501 const ash::ShelfID shelfId2 = launcher_controller_->CreateAppLauncherItem(
3523 app_panel_controller2, app_id2, ash::STATUS_RUNNING); 3502 app_controller2, app_id2, ash::STATUS_RUNNING);
3524 EXPECT_EQ(0, app_icon_loader1->fetch_count()); 3503 EXPECT_EQ(0, app_icon_loader1->fetch_count());
3525 EXPECT_EQ(0, app_icon_loader1->clear_count()); 3504 EXPECT_EQ(0, app_icon_loader1->clear_count());
3526 EXPECT_EQ(1, app_icon_loader2->fetch_count()); 3505 EXPECT_EQ(1, app_icon_loader2->fetch_count());
3527 EXPECT_EQ(0, app_icon_loader2->clear_count()); 3506 EXPECT_EQ(0, app_icon_loader2->clear_count());
3528 3507
3529 // Test adding an app panel 3508 AppWindowLauncherItemController* app_controller1 =
3530 AppWindowLauncherItemController* app_panel_controller1 =
3531 new ExtensionAppWindowLauncherItemController( 3509 new ExtensionAppWindowLauncherItemController(
3532 LauncherItemController::TYPE_APP_PANEL, app_id1, "id", 3510 LauncherItemController::TYPE_APP, app_id1, "id",
3533 launcher_controller_.get()); 3511 launcher_controller_.get());
3534 3512
3535 const ash::ShelfID shelfId1 = launcher_controller_->CreateAppLauncherItem( 3513 const ash::ShelfID shelfId1 = launcher_controller_->CreateAppLauncherItem(
3536 app_panel_controller1, app_id1, ash::STATUS_RUNNING); 3514 app_controller1, app_id1, ash::STATUS_RUNNING);
3537 EXPECT_EQ(1, app_icon_loader1->fetch_count()); 3515 EXPECT_EQ(1, app_icon_loader1->fetch_count());
3538 EXPECT_EQ(0, app_icon_loader1->clear_count()); 3516 EXPECT_EQ(0, app_icon_loader1->clear_count());
3539 EXPECT_EQ(1, app_icon_loader2->fetch_count()); 3517 EXPECT_EQ(1, app_icon_loader2->fetch_count());
3540 EXPECT_EQ(0, app_icon_loader2->clear_count()); 3518 EXPECT_EQ(0, app_icon_loader2->clear_count());
3541 3519
3542 launcher_controller_->CloseLauncherItem(shelfId1); 3520 launcher_controller_->CloseLauncherItem(shelfId1);
3543 EXPECT_EQ(1, app_icon_loader1->fetch_count()); 3521 EXPECT_EQ(1, app_icon_loader1->fetch_count());
3544 EXPECT_EQ(1, app_icon_loader1->clear_count()); 3522 EXPECT_EQ(1, app_icon_loader1->clear_count());
3545 EXPECT_EQ(1, app_icon_loader2->fetch_count()); 3523 EXPECT_EQ(1, app_icon_loader2->fetch_count());
3546 EXPECT_EQ(0, app_icon_loader2->clear_count()); 3524 EXPECT_EQ(0, app_icon_loader2->clear_count());
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
4043 4021
4044 // Pinned state should not change. 4022 // Pinned state should not change.
4045 EXPECT_EQ("AppList, Chrome, App1, App2", GetPinnedAppStatus()); 4023 EXPECT_EQ("AppList, Chrome, App1, App2", GetPinnedAppStatus());
4046 launcher_controller_->UnpinAppWithID(extension2_->id()); 4024 launcher_controller_->UnpinAppWithID(extension2_->id());
4047 EXPECT_EQ("AppList, Chrome, App1", GetPinnedAppStatus()); 4025 EXPECT_EQ("AppList, Chrome, App1", GetPinnedAppStatus());
4048 4026
4049 // Resume syncing and sync information overrides local copy. 4027 // Resume syncing and sync information overrides local copy.
4050 StartAppSyncService(copy_sync_list); 4028 StartAppSyncService(copy_sync_list);
4051 EXPECT_EQ("AppList, Chrome, App1, App2", GetPinnedAppStatus()); 4029 EXPECT_EQ("AppList, Chrome, App1, App2", GetPinnedAppStatus());
4052 } 4030 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698