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

Side by Side Diff: chrome/browser/apps/custom_launcher_page_browsertest_views.cc

Issue 913133007: Allow scroll events to open custom launcher pages. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: host coordinates Created 5 years, 10 months 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
« no previous file with comments | « no previous file | ui/app_list/views/app_list_main_view.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <string> 5 #include <string>
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/apps/app_browsertest_util.h" 10 #include "chrome/browser/apps/app_browsertest_util.h"
11 #include "chrome/browser/ui/app_list/app_list_service.h" 11 #include "chrome/browser/ui/app_list/app_list_service.h"
12 #include "chrome/browser/ui/app_list/app_list_service_views.h" 12 #include "chrome/browser/ui/app_list/app_list_service_views.h"
13 #include "chrome/browser/ui/app_list/app_list_shower_views.h" 13 #include "chrome/browser/ui/app_list/app_list_shower_views.h"
14 #include "content/public/browser/render_frame_host.h" 14 #include "content/public/browser/render_frame_host.h"
15 #include "content/public/browser/web_contents.h" 15 #include "content/public/browser/web_contents.h"
16 #include "extensions/common/extension.h" 16 #include "extensions/common/extension.h"
17 #include "extensions/common/switches.h" 17 #include "extensions/common/switches.h"
18 #include "extensions/test/extension_test_message_listener.h" 18 #include "extensions/test/extension_test_message_listener.h"
19 #include "ui/app_list/app_list_switches.h" 19 #include "ui/app_list/app_list_switches.h"
20 #include "ui/app_list/views/app_list_main_view.h" 20 #include "ui/app_list/views/app_list_main_view.h"
21 #include "ui/app_list/views/app_list_view.h" 21 #include "ui/app_list/views/app_list_view.h"
22 #include "ui/app_list/views/contents_view.h" 22 #include "ui/app_list/views/contents_view.h"
23 #include "ui/events/test/event_generator.h"
23 #include "ui/views/controls/webview/webview.h" 24 #include "ui/views/controls/webview/webview.h"
24 25
25 namespace { 26 namespace {
26 27
27 // The path of the test application within the "platform_apps" directory. 28 // The path of the test application within the "platform_apps" directory.
28 const char kCustomLauncherPagePath[] = "custom_launcher_page"; 29 const char kCustomLauncherPagePath[] = "custom_launcher_page";
29 30
30 // The app ID of the test application. 31 // The app ID of the test application.
31 const char kCustomLauncherPageID[] = "lmadimbbgapmngbiclpjjngmdickadpl"; 32 const char kCustomLauncherPageID[] = "lmadimbbgapmngbiclpjjngmdickadpl";
32 33
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 AppListServiceViews* service = static_cast<AppListServiceViews*>( 76 AppListServiceViews* service = static_cast<AppListServiceViews*>(
76 AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE)); 77 AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE));
77 // The app list should have loaded instantly since the profile is already 78 // The app list should have loaded instantly since the profile is already
78 // loaded. 79 // loaded.
79 EXPECT_TRUE(service->IsAppListVisible()); 80 EXPECT_TRUE(service->IsAppListVisible());
80 app_list_view = service->shower().app_list(); 81 app_list_view = service->shower().app_list();
81 #endif 82 #endif
82 return app_list_view; 83 return app_list_view;
83 } 84 }
84 85
86 // Set the active page on the app list, according to |state|. Does not wait
87 // for any animation or custom page to complete.
88 void SetActivePageAndVerify(app_list::AppListModel::State state) {
89 app_list::ContentsView* contents_view =
90 GetAppListView()->app_list_main_view()->contents_view();
91 contents_view->SetActivePage(contents_view->GetPageIndexForState(state));
92 EXPECT_TRUE(contents_view->IsStateActive(state));
93 }
94
95 void SetCustomLauncherPageEnabled(bool enabled) {
96 const base::string16 kLauncherPageDisableScript =
97 base::ASCIIToUTF16("disableCustomLauncherPage();");
98 const base::string16 kLauncherPageEnableScript =
99 base::ASCIIToUTF16("enableCustomLauncherPage();");
100
101 app_list::ContentsView* contents_view =
102 GetAppListView()->app_list_main_view()->contents_view();
103 views::WebView* custom_page_view =
104 static_cast<views::WebView*>(contents_view->custom_page_view());
105 content::RenderFrameHost* custom_page_frame =
106 custom_page_view->GetWebContents()->GetMainFrame();
107
108 const char* test_message =
109 enabled ? "launcherPageEnabled" : "launcherPageDisabled";
110
111 ExtensionTestMessageListener listener(test_message, false);
112 custom_page_frame->ExecuteJavaScript(enabled ? kLauncherPageEnableScript
113 : kLauncherPageDisableScript);
114 listener.WaitUntilSatisfied();
115 }
116
85 private: 117 private:
86 DISALLOW_COPY_AND_ASSIGN(CustomLauncherPageBrowserTest); 118 DISALLOW_COPY_AND_ASSIGN(CustomLauncherPageBrowserTest);
87 }; 119 };
88 120
89 IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, 121 IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest,
90 OpenLauncherAndSwitchToCustomPage) { 122 OpenLauncherAndSwitchToCustomPage) {
91 LoadAndLaunchPlatformApp(kCustomLauncherPagePath, "Launched"); 123 LoadAndLaunchPlatformApp(kCustomLauncherPagePath, "Launched");
92 app_list::AppListView* app_list_view = GetAppListView(); 124 app_list::AppListView* app_list_view = GetAppListView();
93 app_list::ContentsView* contents_view = 125 app_list::ContentsView* contents_view =
94 app_list_view->app_list_main_view()->contents_view(); 126 app_list_view->app_list_main_view()->contents_view();
(...skipping 10 matching lines...) Expand all
105 } 137 }
106 { 138 {
107 ExtensionTestMessageListener listener("onPageProgressAt0", false); 139 ExtensionTestMessageListener listener("onPageProgressAt0", false);
108 contents_view->SetActivePage(contents_view->GetPageIndexForState( 140 contents_view->SetActivePage(contents_view->GetPageIndexForState(
109 app_list::AppListModel::STATE_START)); 141 app_list::AppListModel::STATE_START));
110 142
111 listener.WaitUntilSatisfied(); 143 listener.WaitUntilSatisfied();
112 } 144 }
113 } 145 }
114 146
147 // Test that the app list will switch to the custom launcher page by sending a
148 // click inside the clickzone, or a mouse scroll event.
149 IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest,
150 EventsActivateSwitchToCustomPage) {
151 LoadAndLaunchPlatformApp(kCustomLauncherPagePath, "Launched");
152 // Use an event generator to ensure targeting is correct.
153 app_list::AppListView* app_list_view = GetAppListView();
154 app_list::ContentsView* contents_view =
155 app_list_view->app_list_main_view()->contents_view();
156 gfx::NativeWindow window = app_list_view->GetWidget()->GetNativeWindow();
157 ui::test::EventGenerator event_generator(window->GetRootWindow(), window);
158 EXPECT_TRUE(
159 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
160
161 // Find the clickzone.
162 gfx::Rect bounds = contents_view->GetCustomPageCollapsedBounds();
163 bounds.Intersect(contents_view->bounds());
164 gfx::Point point_in_clickzone = bounds.CenterPoint();
165 views::View::ConvertPointToWidget(contents_view, &point_in_clickzone);
166
167 // First try clicking 10px above the clickzone.
168 gfx::Point point_above_clickzone = point_in_clickzone;
169 point_above_clickzone.set_y(bounds.y() - 10);
170 views::View::ConvertPointToWidget(contents_view, &point_above_clickzone);
171
172 event_generator.MoveMouseRelativeTo(window, point_above_clickzone);
173 event_generator.ClickLeftButton();
174
175 // Should stay on the start page.
176 EXPECT_TRUE(
177 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
178
179 // Now click in the clickzone.
180 event_generator.MoveMouseRelativeTo(window, point_in_clickzone);
181 // First, try disabling the custom page view. Click should do nothing.
182 SetCustomLauncherPageEnabled(false);
183 event_generator.ClickLeftButton();
184 EXPECT_TRUE(
185 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
186 // Click again with it enabled. The active state should update immediately.
187 SetCustomLauncherPageEnabled(true);
188 event_generator.ClickLeftButton();
189 EXPECT_TRUE(contents_view->IsStateActive(
190 app_list::AppListModel::STATE_CUSTOM_LAUNCHER_PAGE));
191
192 // Back to the start page. And send a mouse wheel event.
193 SetActivePageAndVerify(app_list::AppListModel::STATE_START);
194 // Generate wheel events above the clickzone.
195 event_generator.MoveMouseRelativeTo(window, point_above_clickzone);
196 // Scrolling left, right or up should do nothing.
197 event_generator.MoveMouseWheel(-5, 0);
198 event_generator.MoveMouseWheel(5, 0);
199 event_generator.MoveMouseWheel(0, -5);
200 EXPECT_TRUE(
201 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
202 // Scroll down to open launcher page.
203 event_generator.MoveMouseWheel(0, 5);
204 EXPECT_TRUE(contents_view->IsStateActive(
205 app_list::AppListModel::STATE_CUSTOM_LAUNCHER_PAGE));
206
207 // Constants for gesture/trackpad events.
208 const base::TimeDelta step_delay = base::TimeDelta::FromMilliseconds(300);
209 const int num_steps = 5;
210 const int num_fingers = 2;
211
212 #if defined(OS_CHROMEOS)
tapted 2015/02/17 06:25:45 OK.. I'm pretty sure I've cracked these event gene
calamity 2015/02/17 07:13:56 Acknowledged.
213 // Gesture events need to be in host coordinates. On Desktop platforms, the
214 // Widget is the host, so nothing needs to be done. On ChromeOS, the points
215 // need to be put into screen coordinates. This works because the root window
216 // assumes it fills the screen.
217 point_in_clickzone = bounds.CenterPoint();
218 point_above_clickzone.SetPoint(point_in_clickzone.x(), bounds.y() - 10);
219 views::View::ConvertPointToScreen(contents_view, &point_above_clickzone);
220 views::View::ConvertPointToScreen(contents_view, &point_in_clickzone);
221 #endif
222
223 // Back to the start page. And send a scroll gesture.
224 SetActivePageAndVerify(app_list::AppListModel::STATE_START);
225 // Going down should do nothing.
226 event_generator.GestureScrollSequence(
227 point_above_clickzone, point_in_clickzone, step_delay, num_steps);
228 EXPECT_TRUE(
229 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
230 // Now go up - should change state.
231 event_generator.GestureScrollSequence(
232 point_in_clickzone, point_above_clickzone, step_delay, num_steps);
233 EXPECT_TRUE(contents_view->IsStateActive(
234 app_list::AppListModel::STATE_CUSTOM_LAUNCHER_PAGE));
235
236 // Back to the start page. And send a trackpad scroll event.
237 SetActivePageAndVerify(app_list::AppListModel::STATE_START);
238 // Going down left, right or up should do nothing.
239 event_generator.ScrollSequence(point_in_clickzone, step_delay, -5, 0,
240 num_steps, num_fingers);
241 event_generator.ScrollSequence(point_in_clickzone, step_delay, 5, 0,
242 num_steps, num_fingers);
243 event_generator.ScrollSequence(point_in_clickzone, step_delay, 0, -5,
244 num_steps, num_fingers);
245 EXPECT_TRUE(
246 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
247 // Scroll up to open launcher page.
248 event_generator.ScrollSequence(point_in_clickzone, step_delay, 0, 5,
249 num_steps, num_fingers);
250 EXPECT_TRUE(contents_view->IsStateActive(
251 app_list::AppListModel::STATE_CUSTOM_LAUNCHER_PAGE));
252
253 // Back to the start page. And send a tap gesture.
254 SetActivePageAndVerify(app_list::AppListModel::STATE_START);
255 // Tapping outside the clickzone should do nothing.
256 event_generator.GestureTapAt(point_above_clickzone);
257 EXPECT_TRUE(
258 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
259 // Now tap in the clickzone.
260 event_generator.GestureTapAt(point_in_clickzone);
261 EXPECT_TRUE(contents_view->IsStateActive(
262 app_list::AppListModel::STATE_CUSTOM_LAUNCHER_PAGE));
263 }
264
115 IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageSubpages) { 265 IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageSubpages) {
116 LoadAndLaunchPlatformApp(kCustomLauncherPagePath, "Launched"); 266 LoadAndLaunchPlatformApp(kCustomLauncherPagePath, "Launched");
117 267
118 app_list::AppListView* app_list_view = GetAppListView(); 268 app_list::AppListView* app_list_view = GetAppListView();
119 app_list::AppListModel* model = app_list_view->app_list_main_view()->model(); 269 app_list::AppListModel* model = app_list_view->app_list_main_view()->model();
120 app_list::ContentsView* contents_view = 270 app_list::ContentsView* contents_view =
121 app_list_view->app_list_main_view()->contents_view(); 271 app_list_view->app_list_main_view()->contents_view();
122 272
123 ASSERT_TRUE( 273 ASSERT_TRUE(
124 contents_view->IsStateActive(app_list::AppListModel::STATE_START)); 274 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 354
205 // The app list view will have changed on ChromeOS. 355 // The app list view will have changed on ChromeOS.
206 app_list_view = GetAppListView(); 356 app_list_view = GetAppListView();
207 contents_view = app_list_view->app_list_main_view()->contents_view(); 357 contents_view = app_list_view->app_list_main_view()->contents_view();
208 EXPECT_TRUE(contents_view->IsStateActive( 358 EXPECT_TRUE(contents_view->IsStateActive(
209 app_list::AppListModel::STATE_CUSTOM_LAUNCHER_PAGE)); 359 app_list::AppListModel::STATE_CUSTOM_LAUNCHER_PAGE));
210 } 360 }
211 } 361 }
212 362
213 IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageSetEnabled) { 363 IN_PROC_BROWSER_TEST_F(CustomLauncherPageBrowserTest, LauncherPageSetEnabled) {
214 const base::string16 kLauncherPageDisableScript =
215 base::ASCIIToUTF16("disableCustomLauncherPage();");
216 const base::string16 kLauncherPageEnableScript =
217 base::ASCIIToUTF16("enableCustomLauncherPage();");
218
219 LoadAndLaunchPlatformApp(kCustomLauncherPagePath, "Launched"); 364 LoadAndLaunchPlatformApp(kCustomLauncherPagePath, "Launched");
220 app_list::AppListView* app_list_view = GetAppListView(); 365 app_list::AppListView* app_list_view = GetAppListView();
221 app_list::AppListModel* model = app_list_view->app_list_main_view()->model(); 366 app_list::AppListModel* model = app_list_view->app_list_main_view()->model();
222 app_list::ContentsView* contents_view = 367 app_list::ContentsView* contents_view =
223 app_list_view->app_list_main_view()->contents_view(); 368 app_list_view->app_list_main_view()->contents_view();
224 369
225 views::WebView* custom_page_view = 370 views::WebView* custom_page_view =
226 static_cast<views::WebView*>(contents_view->custom_page_view()); 371 static_cast<views::WebView*>(contents_view->custom_page_view());
227
228 content::RenderFrameHost* custom_page_frame =
229 custom_page_view->GetWebContents()->GetMainFrame();
230 views::Widget* custom_page_click_zone =
231 app_list_view->app_list_main_view()->GetCustomPageClickzone();
232
233 ASSERT_TRUE( 372 ASSERT_TRUE(
234 contents_view->IsStateActive(app_list::AppListModel::STATE_START)); 373 contents_view->IsStateActive(app_list::AppListModel::STATE_START));
235 374
236 EXPECT_TRUE(custom_page_click_zone->GetLayer()->visible());
237 EXPECT_TRUE(model->custom_launcher_page_enabled()); 375 EXPECT_TRUE(model->custom_launcher_page_enabled());
238 EXPECT_TRUE(custom_page_view->visible()); 376 EXPECT_TRUE(custom_page_view->visible());
239 {
240 ExtensionTestMessageListener listener("launcherPageDisabled", false);
241 custom_page_frame->ExecuteJavaScript(kLauncherPageDisableScript);
242 377
243 listener.WaitUntilSatisfied(); 378 SetCustomLauncherPageEnabled(false);
244 EXPECT_FALSE(custom_page_click_zone->GetLayer()->visible()); 379 EXPECT_FALSE(model->custom_launcher_page_enabled());
245 EXPECT_FALSE(model->custom_launcher_page_enabled()); 380 EXPECT_FALSE(custom_page_view->visible());
246 EXPECT_FALSE(custom_page_view->visible());
247 }
248 381
249 { 382 SetCustomLauncherPageEnabled(true);
250 ExtensionTestMessageListener listener("launcherPageEnabled", false); 383 EXPECT_TRUE(model->custom_launcher_page_enabled());
251 custom_page_frame->ExecuteJavaScript(kLauncherPageEnableScript); 384 EXPECT_TRUE(custom_page_view->visible());
252
253 listener.WaitUntilSatisfied();
254 EXPECT_TRUE(custom_page_click_zone->GetLayer()->visible());
255 EXPECT_TRUE(model->custom_launcher_page_enabled());
256 EXPECT_TRUE(custom_page_view->visible());
257 }
258 } 385 }
OLDNEW
« no previous file with comments | « no previous file | ui/app_list/views/app_list_main_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698