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
3 // found in the LICENSE file.
5 #include "base/command_line.h"
6 #include "base/path_service.h"
7 #include "base/run_loop.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/extensions/extension_browsertest.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
12 #include "chrome/browser/ui/app_list/app_list_service.h"
13 #include "chrome/browser/ui/app_list/test/chrome_app_list_test_support.h"
14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/browser_finder.h"
16 #include "chrome/browser/ui/host_desktop.h"
17 #include "chrome/common/chrome_paths.h"
18 #include "chrome/common/chrome_switches.h"
19 #include "chrome/test/base/in_process_browser_test.h"
20 #include "chrome/test/base/testing_profile.h"
21 #include "ui/app_list/app_list_model.h"
22 #include "ui/app_list/app_list_switches.h"
23 #include "ui/app_list/search_box_model.h"
24 #include "ui/app_list/search_result.h"
25 #include "ui/app_list/search_result_observer.h"
26 #include "ui/base/models/list_model_observer.h"
28 #if defined(OS_CHROMEOS)
29 #include "chromeos/chromeos_switches.h"
30 #include "chromeos/login/user_names.h"
31 #endif // defined(OS_CHROMEOS)
33 // Browser Test for AppListController that runs on all platforms supporting
35 typedef InProcessBrowserTest AppListControllerBrowserTest
;
37 // Test the CreateNewWindow function of the controller delegate.
38 IN_PROC_BROWSER_TEST_F(AppListControllerBrowserTest
, CreateNewWindow
) {
39 const chrome::HostDesktopType desktop
= chrome::GetActiveDesktop();
40 AppListService
* service
= test::GetAppListService();
41 AppListControllerDelegate
* controller(service
->GetControllerDelegate());
42 ASSERT_TRUE(controller
);
44 EXPECT_EQ(1U, chrome::GetBrowserCount(browser()->profile(), desktop
));
45 EXPECT_EQ(0U, chrome::GetBrowserCount(
46 browser()->profile()->GetOffTheRecordProfile(), desktop
));
48 controller
->CreateNewWindow(browser()->profile(), false);
49 EXPECT_EQ(2U, chrome::GetBrowserCount(browser()->profile(), desktop
));
51 controller
->CreateNewWindow(browser()->profile(), true);
52 EXPECT_EQ(1U, chrome::GetBrowserCount(
53 browser()->profile()->GetOffTheRecordProfile(), desktop
));
56 // Browser Test for AppListController that observes search result changes.
57 class AppListControllerSearchResultsBrowserTest
58 : public ExtensionBrowserTest
,
59 public app_list::SearchResultObserver
,
60 public ui::ListModelObserver
{
62 AppListControllerSearchResultsBrowserTest()
63 : observed_result_(NULL
),
64 observed_results_list_(NULL
) {}
66 void WatchResultsLookingForItem(
67 app_list::AppListModel::SearchResults
* search_results
,
68 const std::string
& extension_name
) {
69 EXPECT_FALSE(observed_results_list_
);
70 observed_results_list_
= search_results
;
71 observed_results_list_
->AddObserver(this);
72 item_to_observe_
= base::ASCIIToUTF16(extension_name
);
75 void StopWatchingResults() {
76 EXPECT_TRUE(observed_results_list_
);
77 observed_results_list_
->RemoveObserver(this);
81 void AttemptToLocateItem() {
82 if (observed_result_
) {
83 observed_result_
->RemoveObserver(this);
84 observed_result_
= NULL
;
87 for (size_t i
= 0; i
< observed_results_list_
->item_count(); ++i
) {
88 if (observed_results_list_
->GetItemAt(i
)->title() != item_to_observe_
)
91 // Ensure there is at most one.
92 EXPECT_FALSE(observed_result_
);
93 observed_result_
= observed_results_list_
->GetItemAt(i
);
97 observed_result_
->AddObserver(this);
100 // Overridden from SearchResultObserver:
101 void OnIconChanged() override
{}
102 void OnActionsChanged() override
{}
103 void OnIsInstallingChanged() override
{}
104 void OnPercentDownloadedChanged() override
{}
105 void OnItemInstalled() override
{}
107 // Overridden from ui::ListModelObserver:
108 void ListItemsAdded(size_t start
, size_t count
) override
{
109 AttemptToLocateItem();
111 void ListItemsRemoved(size_t start
, size_t count
) override
{
112 AttemptToLocateItem();
114 void ListItemMoved(size_t index
, size_t target_index
) override
{}
115 void ListItemsChanged(size_t start
, size_t count
) override
{}
117 app_list::SearchResult
* observed_result_
;
120 base::string16 item_to_observe_
;
121 app_list::AppListModel::SearchResults
* observed_results_list_
;
123 DISALLOW_COPY_AND_ASSIGN(AppListControllerSearchResultsBrowserTest
);
127 // Flaky on Mac. https://crbug.com/415264
128 #if defined(OS_MACOSX)
129 #define MAYBE_UninstallSearchResult DISABLED_UninstallSearchResult
131 #define MAYBE_UninstallSearchResult UninstallSearchResult
133 // Test showing search results, and uninstalling one of them while displayed.
134 IN_PROC_BROWSER_TEST_F(AppListControllerSearchResultsBrowserTest
,
135 MAYBE_UninstallSearchResult
) {
136 base::FilePath test_extension_path
;
137 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA
, &test_extension_path
));
138 test_extension_path
= test_extension_path
.AppendASCII("extensions")
139 .AppendASCII("platform_apps")
140 .AppendASCII("minimal");
141 const extensions::Extension
* extension
=
142 InstallExtension(test_extension_path
,
143 1 /* expected_change: new install */);
144 ASSERT_TRUE(extension
);
146 AppListService
* service
= test::GetAppListService();
147 ASSERT_TRUE(service
);
148 service
->ShowForProfile(browser()->profile());
150 app_list::AppListModel
* model
= test::GetAppListModel(service
);
152 WatchResultsLookingForItem(model
->results(), extension
->name());
154 // Ensure a search finds the extension.
155 EXPECT_FALSE(observed_result_
);
156 model
->search_box()->SetText(base::ASCIIToUTF16("minimal"));
157 EXPECT_TRUE(observed_result_
);
159 // Ensure the UI is updated. This is via PostTask in views.
160 base::RunLoop().RunUntilIdle();
162 // Now uninstall and ensure this browser test observes it.
163 UninstallExtension(extension
->id());
165 // Allow async AppSearchProvider::UpdateResults to run.
166 base::RunLoop().RunUntilIdle();
168 EXPECT_FALSE(observed_result_
);
169 StopWatchingResults();
170 service
->DismissAppList();
173 #if defined(OS_CHROMEOS)
175 class AppListControllerGuestModeBrowserTest
: public InProcessBrowserTest
{
177 AppListControllerGuestModeBrowserTest() {}
180 void SetUpCommandLine(base::CommandLine
* command_line
) override
;
183 DISALLOW_COPY_AND_ASSIGN(AppListControllerGuestModeBrowserTest
);
186 void AppListControllerGuestModeBrowserTest::SetUpCommandLine(
187 base::CommandLine
* command_line
) {
188 command_line
->AppendSwitch(chromeos::switches::kGuestSession
);
189 command_line
->AppendSwitchASCII(chromeos::switches::kLoginUser
,
190 chromeos::login::kGuestUserName
);
191 command_line
->AppendSwitchASCII(chromeos::switches::kLoginProfile
,
192 TestingProfile::kTestUserProfileDir
);
193 command_line
->AppendSwitch(switches::kIncognito
);
196 // Test creating the initial app list in guest mode.
197 IN_PROC_BROWSER_TEST_F(AppListControllerGuestModeBrowserTest
, Incognito
) {
198 AppListService
* service
= test::GetAppListService();
199 EXPECT_TRUE(service
->GetCurrentAppListProfile());
201 service
->ShowForProfile(browser()->profile());
202 EXPECT_EQ(browser()->profile(), service
->GetCurrentAppListProfile());
205 #endif // defined(OS_CHROMEOS)