• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "ui/app_list/views/app_list_view.h"
6 
7 #include "base/command_line.h"
8 #include "base/run_loop.h"
9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/app_list/app_list_switches.h"
13 #include "ui/app_list/pagination_model.h"
14 #include "ui/app_list/search_box_model.h"
15 #include "ui/app_list/test/app_list_test_model.h"
16 #include "ui/app_list/test/app_list_test_view_delegate.h"
17 #include "ui/app_list/views/app_list_folder_view.h"
18 #include "ui/app_list/views/app_list_main_view.h"
19 #include "ui/app_list/views/apps_container_view.h"
20 #include "ui/app_list/views/apps_grid_view.h"
21 #include "ui/app_list/views/contents_switcher_view.h"
22 #include "ui/app_list/views/contents_view.h"
23 #include "ui/app_list/views/search_box_view.h"
24 #include "ui/app_list/views/search_result_list_view.h"
25 #include "ui/app_list/views/start_page_view.h"
26 #include "ui/app_list/views/test/apps_grid_view_test_api.h"
27 #include "ui/app_list/views/tile_item_view.h"
28 #include "ui/aura/test/aura_test_base.h"
29 #include "ui/aura/window.h"
30 #include "ui/views/controls/textfield/textfield.h"
31 #include "ui/views/test/views_test_base.h"
32 #include "ui/views/views_delegate.h"
33 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
34 
35 namespace app_list {
36 namespace test {
37 
38 namespace {
39 
40 enum TestType {
41   TEST_TYPE_START = 0,
42   NORMAL = TEST_TYPE_START,
43   LANDSCAPE,
44   EXPERIMENTAL,
45   TEST_TYPE_END,
46 };
47 
IsViewAtOrigin(views::View * view)48 bool IsViewAtOrigin(views::View* view) {
49   return view->bounds().origin().IsOrigin();
50 }
51 
GetVisibleTileItemViews(const std::vector<TileItemView * > & tiles)52 size_t GetVisibleTileItemViews(const std::vector<TileItemView*>& tiles) {
53   size_t count = 0;
54   for (std::vector<TileItemView*>::const_iterator it = tiles.begin();
55        it != tiles.end();
56        ++it) {
57     if ((*it)->visible())
58       count++;
59   }
60   return count;
61 }
62 
63 // Choose a set that is 3 regular app list pages and 2 landscape app list pages.
64 const int kInitialItems = 34;
65 
66 // Allows the same tests to run with different contexts: either an Ash-style
67 // root window or a desktop window tree host.
68 class AppListViewTestContext {
69  public:
70   AppListViewTestContext(int test_type, aura::Window* parent);
71   ~AppListViewTestContext();
72 
73   // Test displaying the app list and performs a standard set of checks on its
74   // top level views. Then closes the window.
75   void RunDisplayTest();
76 
77   // Hides and reshows the app list with a folder open, expecting the main grid
78   // view to be shown.
79   void RunReshowWithOpenFolderTest();
80 
81   // Tests displaying of the experimental app list and shows the start page.
82   void RunStartPageTest();
83 
84   // Tests switching rapidly between multiple pages of the launcher.
85   void RunPageSwitchingAnimationTest();
86 
87   // Tests changing the App List profile.
88   void RunProfileChangeTest();
89 
90   // Tests displaying of the search results.
91   void RunSearchResultsTest();
92 
93   // A standard set of checks on a view, e.g., ensuring it is drawn and visible.
94   static void CheckView(views::View* subview);
95 
96   // Invoked when the Widget is closing, and the view it contains is about to
97   // be torn down. This only occurs in a run loop and will be used as a signal
98   // to quit.
NativeWidgetClosing()99   void NativeWidgetClosing() {
100     view_ = NULL;
101     run_loop_->Quit();
102   }
103 
104   // Whether the experimental "landscape" app launcher UI is being tested.
is_landscape() const105   bool is_landscape() const {
106     return test_type_ == LANDSCAPE || test_type_ == EXPERIMENTAL;
107   }
108 
109  private:
110   // Switches the active launcher page in the contents view and lays out to
111   // ensure all launcher pages are in the correct position.
112   void ShowContentsViewPageAndVerify(int index);
113 
114   // Shows the app list and waits until a paint occurs.
115   void Show();
116 
117   // Closes the app list. This sets |view_| to NULL.
118   void Close();
119 
120   // Gets the PaginationModel owned by |view_|.
121   PaginationModel* GetPaginationModel();
122 
123   const TestType test_type_;
124   scoped_ptr<base::RunLoop> run_loop_;
125   app_list::AppListView* view_;  // Owned by native widget.
126   app_list::test::AppListTestViewDelegate* delegate_;  // Owned by |view_|;
127 
128   DISALLOW_COPY_AND_ASSIGN(AppListViewTestContext);
129 };
130 
131 // Extend the regular AppListTestViewDelegate to communicate back to the test
132 // context. Note the test context doesn't simply inherit this, because the
133 // delegate is owned by the view.
134 class UnitTestViewDelegate : public app_list::test::AppListTestViewDelegate {
135  public:
UnitTestViewDelegate(AppListViewTestContext * parent)136   UnitTestViewDelegate(AppListViewTestContext* parent) : parent_(parent) {}
137 
138   // Overridden from app_list::AppListViewDelegate:
ShouldCenterWindow() const139   virtual bool ShouldCenterWindow() const OVERRIDE {
140     return app_list::switches::IsCenteredAppListEnabled();
141   }
142 
143   // Overridden from app_list::test::AppListTestViewDelegate:
ViewClosing()144   virtual void ViewClosing() OVERRIDE { parent_->NativeWidgetClosing(); }
145 
146  private:
147   AppListViewTestContext* parent_;
148 
149   DISALLOW_COPY_AND_ASSIGN(UnitTestViewDelegate);
150 };
151 
AppListViewTestContext(int test_type,aura::Window * parent)152 AppListViewTestContext::AppListViewTestContext(int test_type,
153                                                aura::Window* parent)
154     : test_type_(static_cast<TestType>(test_type)) {
155   switch (test_type_) {
156     case NORMAL:
157       break;
158     case LANDSCAPE:
159       base::CommandLine::ForCurrentProcess()->AppendSwitch(
160           switches::kEnableCenteredAppList);
161       break;
162     case EXPERIMENTAL:
163       base::CommandLine::ForCurrentProcess()->AppendSwitch(
164           switches::kEnableExperimentalAppList);
165       break;
166     default:
167       NOTREACHED();
168       break;
169   }
170 
171   delegate_ = new UnitTestViewDelegate(this);
172   view_ = new app_list::AppListView(delegate_);
173 
174   // Initialize centered around a point that ensures the window is wholly shown.
175   view_->InitAsBubbleAtFixedLocation(parent,
176                                      0,
177                                      gfx::Point(300, 300),
178                                      views::BubbleBorder::FLOAT,
179                                      false /* border_accepts_events */);
180 }
181 
~AppListViewTestContext()182 AppListViewTestContext::~AppListViewTestContext() {
183   // The view observes the PaginationModel which is about to get destroyed, so
184   // if the view is not already deleted by the time this destructor is called,
185   // there will be problems.
186   EXPECT_FALSE(view_);
187 }
188 
189 // static
CheckView(views::View * subview)190 void AppListViewTestContext::CheckView(views::View* subview) {
191   ASSERT_TRUE(subview);
192   EXPECT_TRUE(subview->parent());
193   EXPECT_TRUE(subview->visible());
194   EXPECT_TRUE(subview->IsDrawn());
195 }
196 
ShowContentsViewPageAndVerify(int index)197 void AppListViewTestContext::ShowContentsViewPageAndVerify(int index) {
198   ContentsView* contents_view = view_->app_list_main_view()->contents_view();
199   contents_view->SetActivePage(index);
200   contents_view->Layout();
201   for (int i = 0; i < contents_view->NumLauncherPages(); ++i) {
202     EXPECT_EQ(i == index, IsViewAtOrigin(contents_view->GetPageView(i)));
203   }
204 }
205 
Show()206 void AppListViewTestContext::Show() {
207   view_->GetWidget()->Show();
208   run_loop_.reset(new base::RunLoop);
209   view_->SetNextPaintCallback(run_loop_->QuitClosure());
210   run_loop_->Run();
211 
212   EXPECT_TRUE(view_->GetWidget()->IsVisible());
213 }
214 
Close()215 void AppListViewTestContext::Close() {
216   view_->GetWidget()->Close();
217   run_loop_.reset(new base::RunLoop);
218   run_loop_->Run();
219 
220   // |view_| should have been deleted and set to NULL via ViewClosing().
221   EXPECT_FALSE(view_);
222 }
223 
GetPaginationModel()224 PaginationModel* AppListViewTestContext::GetPaginationModel() {
225   return view_->GetAppsPaginationModel();
226 }
227 
RunDisplayTest()228 void AppListViewTestContext::RunDisplayTest() {
229   EXPECT_FALSE(view_->GetWidget()->IsVisible());
230   EXPECT_EQ(-1, GetPaginationModel()->total_pages());
231   delegate_->GetTestModel()->PopulateApps(kInitialItems);
232 
233   Show();
234   if (is_landscape())
235     EXPECT_EQ(2, GetPaginationModel()->total_pages());
236   else
237     EXPECT_EQ(3, GetPaginationModel()->total_pages());
238   EXPECT_EQ(0, GetPaginationModel()->selected_page());
239 
240   // Checks on the main view.
241   AppListMainView* main_view = view_->app_list_main_view();
242   EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
243   EXPECT_NO_FATAL_FAILURE(CheckView(main_view->search_box_view()));
244   EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view()));
245 
246   Close();
247 }
248 
RunReshowWithOpenFolderTest()249 void AppListViewTestContext::RunReshowWithOpenFolderTest() {
250   EXPECT_FALSE(view_->GetWidget()->IsVisible());
251   EXPECT_EQ(-1, GetPaginationModel()->total_pages());
252 
253   AppListTestModel* model = delegate_->GetTestModel();
254   model->PopulateApps(kInitialItems);
255   const std::string folder_id =
256       model->MergeItems(model->top_level_item_list()->item_at(0)->id(),
257                         model->top_level_item_list()->item_at(1)->id());
258 
259   AppListFolderItem* folder_item = model->FindFolderItem(folder_id);
260   EXPECT_TRUE(folder_item);
261 
262   Show();
263 
264   // The main grid view should be showing initially.
265   AppListMainView* main_view = view_->app_list_main_view();
266   AppsContainerView* container_view =
267       main_view->contents_view()->apps_container_view();
268   EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
269   EXPECT_NO_FATAL_FAILURE(CheckView(container_view->apps_grid_view()));
270   EXPECT_FALSE(container_view->app_list_folder_view()->visible());
271 
272   AppsGridViewTestApi test_api(container_view->apps_grid_view());
273   test_api.PressItemAt(0);
274 
275   // After pressing the folder item, the folder view should be showing.
276   EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
277   EXPECT_NO_FATAL_FAILURE(CheckView(container_view->app_list_folder_view()));
278   EXPECT_FALSE(container_view->apps_grid_view()->visible());
279 
280   view_->GetWidget()->Hide();
281   EXPECT_FALSE(view_->GetWidget()->IsVisible());
282 
283   Show();
284 
285   // The main grid view should be showing after a reshow.
286   EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
287   EXPECT_NO_FATAL_FAILURE(CheckView(container_view->apps_grid_view()));
288   EXPECT_FALSE(container_view->app_list_folder_view()->visible());
289 
290   Close();
291 }
292 
RunStartPageTest()293 void AppListViewTestContext::RunStartPageTest() {
294   EXPECT_FALSE(view_->GetWidget()->IsVisible());
295   EXPECT_EQ(-1, GetPaginationModel()->total_pages());
296   AppListTestModel* model = delegate_->GetTestModel();
297   model->PopulateApps(3);
298 
299   Show();
300 
301   AppListMainView* main_view = view_->app_list_main_view();
302   StartPageView* start_page_view =
303       main_view->contents_view()->start_page_view();
304   // Checks on the main view.
305   EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
306   EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view()));
307   if (test_type_ == EXPERIMENTAL) {
308     EXPECT_NO_FATAL_FAILURE(CheckView(start_page_view));
309 
310     ContentsView* contents_view = main_view->contents_view();
311     ShowContentsViewPageAndVerify(contents_view->GetPageIndexForNamedPage(
312         ContentsView::NAMED_PAGE_START));
313     EXPECT_FALSE(main_view->search_box_view()->visible());
314     EXPECT_EQ(3u, GetVisibleTileItemViews(start_page_view->tile_views()));
315 
316     ShowContentsViewPageAndVerify(
317         contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
318     EXPECT_TRUE(main_view->search_box_view()->visible());
319 
320     // Check tiles hide and show on deletion and addition.
321     model->CreateAndAddItem("Test app");
322     EXPECT_EQ(4u, GetVisibleTileItemViews(start_page_view->tile_views()));
323     model->DeleteItem(model->GetItemName(0));
324     EXPECT_EQ(3u, GetVisibleTileItemViews(start_page_view->tile_views()));
325   } else {
326     EXPECT_EQ(NULL, start_page_view);
327   }
328 
329   Close();
330 }
331 
RunPageSwitchingAnimationTest()332 void AppListViewTestContext::RunPageSwitchingAnimationTest() {
333   if (test_type_ == EXPERIMENTAL) {
334     Show();
335 
336     AppListMainView* main_view = view_->app_list_main_view();
337     // Checks on the main view.
338     EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
339     EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view()));
340 
341     ContentsView* contents_view = main_view->contents_view();
342     // Pad the ContentsView with blank pages so we have at least 3 views.
343     while (contents_view->NumLauncherPages() < 3)
344       contents_view->AddBlankPageForTesting();
345 
346     contents_view->SetActivePage(0);
347     contents_view->Layout();
348     EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(0)));
349     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
350     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(2)));
351 
352     // Change pages. View should not have moved without Layout().
353     contents_view->SetActivePage(1);
354     EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(0)));
355     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
356     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(2)));
357 
358     // Change to a third page. This queues up the second animation behind the
359     // first.
360     contents_view->SetActivePage(2);
361     EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(0)));
362     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
363     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(2)));
364 
365     // Call Layout(). Should jump to the third page.
366     contents_view->Layout();
367     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(0)));
368     EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
369     EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(2)));
370   }
371 
372   Close();
373 }
374 
RunProfileChangeTest()375 void AppListViewTestContext::RunProfileChangeTest() {
376   EXPECT_FALSE(view_->GetWidget()->IsVisible());
377   EXPECT_EQ(-1, GetPaginationModel()->total_pages());
378   delegate_->GetTestModel()->PopulateApps(kInitialItems);
379 
380   Show();
381 
382   if (is_landscape())
383     EXPECT_EQ(2, GetPaginationModel()->total_pages());
384   else
385     EXPECT_EQ(3, GetPaginationModel()->total_pages());
386 
387   // Change the profile. The original model needs to be kept alive for
388   // observers to unregister themselves.
389   scoped_ptr<AppListTestModel> original_test_model(
390       delegate_->ReleaseTestModel());
391   delegate_->set_next_profile_app_count(1);
392 
393   // The original ContentsView is destroyed here.
394   view_->SetProfileByPath(base::FilePath());
395   EXPECT_EQ(1, GetPaginationModel()->total_pages());
396 
397   StartPageView* start_page_view =
398       view_->app_list_main_view()->contents_view()->start_page_view();
399   ContentsSwitcherView* contents_switcher_view =
400       view_->app_list_main_view()->contents_switcher_view();
401   if (test_type_ == EXPERIMENTAL) {
402     EXPECT_NO_FATAL_FAILURE(CheckView(contents_switcher_view));
403     EXPECT_EQ(view_->app_list_main_view()->contents_view(),
404               contents_switcher_view->contents_view());
405     EXPECT_NO_FATAL_FAILURE(CheckView(start_page_view));
406     EXPECT_EQ(1u, GetVisibleTileItemViews(start_page_view->tile_views()));
407   } else {
408     EXPECT_EQ(NULL, contents_switcher_view);
409     EXPECT_EQ(NULL, start_page_view);
410   }
411 
412   // New model updates should be processed by the start page view.
413   delegate_->GetTestModel()->CreateAndAddItem("Test App");
414   if (test_type_ == EXPERIMENTAL)
415     EXPECT_EQ(2u, GetVisibleTileItemViews(start_page_view->tile_views()));
416 
417   // Old model updates should be ignored.
418   original_test_model->CreateAndAddItem("Test App 2");
419   if (test_type_ == EXPERIMENTAL)
420     EXPECT_EQ(2u, GetVisibleTileItemViews(start_page_view->tile_views()));
421 
422   Close();
423 }
424 
RunSearchResultsTest()425 void AppListViewTestContext::RunSearchResultsTest() {
426   EXPECT_FALSE(view_->GetWidget()->IsVisible());
427   EXPECT_EQ(-1, GetPaginationModel()->total_pages());
428   AppListTestModel* model = delegate_->GetTestModel();
429   model->PopulateApps(3);
430 
431   Show();
432 
433   AppListMainView* main_view = view_->app_list_main_view();
434   ContentsView* contents_view = main_view->contents_view();
435   ShowContentsViewPageAndVerify(
436       contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
437   EXPECT_TRUE(IsViewAtOrigin(contents_view->apps_container_view()));
438   EXPECT_TRUE(main_view->search_box_view()->visible());
439 
440   // Show the search results.
441   contents_view->ShowSearchResults(true);
442   contents_view->Layout();
443   EXPECT_TRUE(contents_view->IsShowingSearchResults());
444   EXPECT_TRUE(main_view->search_box_view()->visible());
445 
446   if (test_type_ == EXPERIMENTAL) {
447     EXPECT_TRUE(
448         contents_view->IsNamedPageActive(ContentsView::NAMED_PAGE_START));
449     EXPECT_TRUE(IsViewAtOrigin(contents_view->start_page_view()));
450   } else {
451     EXPECT_TRUE(contents_view->IsNamedPageActive(
452         ContentsView::NAMED_PAGE_SEARCH_RESULTS));
453     EXPECT_TRUE(IsViewAtOrigin(contents_view->search_results_view()));
454   }
455 
456   // Hide the search results.
457   contents_view->ShowSearchResults(false);
458   contents_view->Layout();
459   EXPECT_FALSE(contents_view->IsShowingSearchResults());
460   if (test_type_ == EXPERIMENTAL) {
461     EXPECT_TRUE(
462         contents_view->IsNamedPageActive(ContentsView::NAMED_PAGE_START));
463     EXPECT_TRUE(IsViewAtOrigin(contents_view->start_page_view()));
464     EXPECT_FALSE(main_view->search_box_view()->visible());
465   } else {
466     EXPECT_TRUE(
467         contents_view->IsNamedPageActive(ContentsView::NAMED_PAGE_APPS));
468     EXPECT_TRUE(IsViewAtOrigin(contents_view->apps_container_view()));
469     EXPECT_TRUE(main_view->search_box_view()->visible());
470   }
471 
472   if (test_type_ == EXPERIMENTAL) {
473     // Check that typing into the dummy search box triggers the search page.
474     base::string16 search_text = base::UTF8ToUTF16("test");
475     SearchBoxView* dummy_search_box =
476         contents_view->start_page_view()->dummy_search_box_view();
477     EXPECT_TRUE(dummy_search_box->IsDrawn());
478     dummy_search_box->search_box()->InsertText(search_text);
479     contents_view->Layout();
480     // Check that the current search is using |search_text|.
481     EXPECT_EQ(search_text, delegate_->GetTestModel()->search_box()->text());
482     EXPECT_TRUE(contents_view->IsShowingSearchResults());
483     EXPECT_FALSE(dummy_search_box->IsDrawn());
484     EXPECT_TRUE(main_view->search_box_view()->visible());
485     EXPECT_EQ(search_text, main_view->search_box_view()->search_box()->text());
486     EXPECT_TRUE(
487         contents_view->IsNamedPageActive(ContentsView::NAMED_PAGE_START));
488     EXPECT_TRUE(IsViewAtOrigin(contents_view->start_page_view()));
489 
490     // Check that typing into the real search box triggers the search page.
491     ShowContentsViewPageAndVerify(
492         contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
493     EXPECT_TRUE(IsViewAtOrigin(contents_view->apps_container_view()));
494 
495     base::string16 new_search_text = base::UTF8ToUTF16("apple");
496     main_view->search_box_view()->search_box()->SetText(base::string16());
497     main_view->search_box_view()->search_box()->InsertText(new_search_text);
498     // Check that the current search is using |search_text|.
499     EXPECT_EQ(new_search_text, delegate_->GetTestModel()->search_box()->text());
500     EXPECT_EQ(new_search_text,
501               main_view->search_box_view()->search_box()->text());
502     EXPECT_TRUE(contents_view->IsShowingSearchResults());
503     EXPECT_FALSE(dummy_search_box->IsDrawn());
504     EXPECT_TRUE(main_view->search_box_view()->visible());
505     EXPECT_TRUE(dummy_search_box->search_box()->text().empty());
506 
507     // Check that the dummy search box is clear when reshowing the start page.
508     ShowContentsViewPageAndVerify(
509         contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
510     ShowContentsViewPageAndVerify(contents_view->GetPageIndexForNamedPage(
511         ContentsView::NAMED_PAGE_START));
512     EXPECT_TRUE(dummy_search_box->IsDrawn());
513     EXPECT_TRUE(dummy_search_box->search_box()->text().empty());
514   }
515 
516   Close();
517 }
518 
519 class AppListViewTestAura : public views::ViewsTestBase,
520                             public ::testing::WithParamInterface<int> {
521  public:
AppListViewTestAura()522   AppListViewTestAura() {}
~AppListViewTestAura()523   virtual ~AppListViewTestAura() {}
524 
525   // testing::Test overrides:
SetUp()526   virtual void SetUp() OVERRIDE {
527     views::ViewsTestBase::SetUp();
528     test_context_.reset(new AppListViewTestContext(GetParam(), GetContext()));
529   }
530 
TearDown()531   virtual void TearDown() OVERRIDE {
532     test_context_.reset();
533     views::ViewsTestBase::TearDown();
534   }
535 
536  protected:
537   scoped_ptr<AppListViewTestContext> test_context_;
538 
539  private:
540   DISALLOW_COPY_AND_ASSIGN(AppListViewTestAura);
541 };
542 
543 class AppListViewTestDesktop : public views::ViewsTestBase,
544                                public ::testing::WithParamInterface<int> {
545  public:
AppListViewTestDesktop()546   AppListViewTestDesktop() {}
~AppListViewTestDesktop()547   virtual ~AppListViewTestDesktop() {}
548 
549   // testing::Test overrides:
SetUp()550   virtual void SetUp() OVERRIDE {
551     set_views_delegate(new AppListViewTestViewsDelegate(this));
552     views::ViewsTestBase::SetUp();
553     test_context_.reset(new AppListViewTestContext(GetParam(), NULL));
554   }
555 
TearDown()556   virtual void TearDown() OVERRIDE {
557     test_context_.reset();
558     views::ViewsTestBase::TearDown();
559   }
560 
561  protected:
562   scoped_ptr<AppListViewTestContext> test_context_;
563 
564  private:
565   class AppListViewTestViewsDelegate : public views::TestViewsDelegate {
566    public:
AppListViewTestViewsDelegate(AppListViewTestDesktop * parent)567     AppListViewTestViewsDelegate(AppListViewTestDesktop* parent)
568         : parent_(parent) {}
569 
570     // Overridden from views::ViewsDelegate:
571     virtual void OnBeforeWidgetInit(
572         views::Widget::InitParams* params,
573         views::internal::NativeWidgetDelegate* delegate) OVERRIDE;
574 
575    private:
576     AppListViewTestDesktop* parent_;
577 
578     DISALLOW_COPY_AND_ASSIGN(AppListViewTestViewsDelegate);
579   };
580 
581   DISALLOW_COPY_AND_ASSIGN(AppListViewTestDesktop);
582 };
583 
OnBeforeWidgetInit(views::Widget::InitParams * params,views::internal::NativeWidgetDelegate * delegate)584 void AppListViewTestDesktop::AppListViewTestViewsDelegate::OnBeforeWidgetInit(
585     views::Widget::InitParams* params,
586     views::internal::NativeWidgetDelegate* delegate) {
587 // Mimic the logic in ChromeViewsDelegate::OnBeforeWidgetInit(). Except, for
588 // ChromeOS, use the root window from the AuraTestHelper rather than depending
589 // on ash::Shell:GetPrimaryRootWindow(). Also assume non-ChromeOS is never the
590 // Ash desktop, as that is covered by AppListViewTestAura.
591 #if defined(OS_CHROMEOS)
592   if (!params->parent && !params->context)
593     params->context = parent_->GetContext();
594 #elif defined(USE_AURA)
595   if (params->parent == NULL && params->context == NULL && !params->child)
596     params->native_widget = new views::DesktopNativeWidgetAura(delegate);
597 #endif
598 }
599 
600 }  // namespace
601 
602 // Tests showing the app list with basic test model in an ash-style root window.
TEST_P(AppListViewTestAura,Display)603 TEST_P(AppListViewTestAura, Display) {
604   EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest());
605 }
606 
607 // Tests showing the app list on the desktop. Note on ChromeOS, this will still
608 // use the regular root window.
TEST_P(AppListViewTestDesktop,Display)609 TEST_P(AppListViewTestDesktop, Display) {
610   EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest());
611 }
612 
613 // Tests that the main grid view is shown after hiding and reshowing the app
614 // list with a folder view open. This is a regression test for crbug.com/357058.
TEST_P(AppListViewTestAura,ReshowWithOpenFolder)615 TEST_P(AppListViewTestAura, ReshowWithOpenFolder) {
616   EXPECT_NO_FATAL_FAILURE(test_context_->RunReshowWithOpenFolderTest());
617 }
618 
TEST_P(AppListViewTestDesktop,ReshowWithOpenFolder)619 TEST_P(AppListViewTestDesktop, ReshowWithOpenFolder) {
620   EXPECT_NO_FATAL_FAILURE(test_context_->RunReshowWithOpenFolderTest());
621 }
622 
623 // Tests that the start page view operates correctly.
TEST_P(AppListViewTestAura,StartPageTest)624 TEST_P(AppListViewTestAura, StartPageTest) {
625   EXPECT_NO_FATAL_FAILURE(test_context_->RunStartPageTest());
626 }
627 
TEST_P(AppListViewTestDesktop,StartPageTest)628 TEST_P(AppListViewTestDesktop, StartPageTest) {
629   EXPECT_NO_FATAL_FAILURE(test_context_->RunStartPageTest());
630 }
631 
632 // Tests that the start page view operates correctly.
TEST_P(AppListViewTestAura,PageSwitchingAnimationTest)633 TEST_P(AppListViewTestAura, PageSwitchingAnimationTest) {
634   EXPECT_NO_FATAL_FAILURE(test_context_->RunPageSwitchingAnimationTest());
635 }
636 
TEST_P(AppListViewTestDesktop,PageSwitchingAnimationTest)637 TEST_P(AppListViewTestDesktop, PageSwitchingAnimationTest) {
638   EXPECT_NO_FATAL_FAILURE(test_context_->RunPageSwitchingAnimationTest());
639 }
640 
641 // Tests that the profile changes operate correctly.
TEST_P(AppListViewTestAura,ProfileChangeTest)642 TEST_P(AppListViewTestAura, ProfileChangeTest) {
643   EXPECT_NO_FATAL_FAILURE(test_context_->RunProfileChangeTest());
644 }
645 
TEST_P(AppListViewTestDesktop,ProfileChangeTest)646 TEST_P(AppListViewTestDesktop, ProfileChangeTest) {
647   EXPECT_NO_FATAL_FAILURE(test_context_->RunProfileChangeTest());
648 }
649 
650 // Tests that the correct views are displayed for showing search results.
TEST_P(AppListViewTestAura,SearchResultsTest)651 TEST_P(AppListViewTestAura, SearchResultsTest) {
652   EXPECT_NO_FATAL_FAILURE(test_context_->RunSearchResultsTest());
653 }
654 
TEST_P(AppListViewTestDesktop,SearchResultsTest)655 TEST_P(AppListViewTestDesktop, SearchResultsTest) {
656   EXPECT_NO_FATAL_FAILURE(test_context_->RunSearchResultsTest());
657 }
658 
659 INSTANTIATE_TEST_CASE_P(AppListViewTestAuraInstance,
660                         AppListViewTestAura,
661                         ::testing::Range<int>(TEST_TYPE_START, TEST_TYPE_END));
662 
663 INSTANTIATE_TEST_CASE_P(AppListViewTestDesktopInstance,
664                         AppListViewTestDesktop,
665                         ::testing::Range<int>(TEST_TYPE_START, TEST_TYPE_END));
666 
667 }  // namespace test
668 }  // namespace app_list
669