Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / app_list / views / app_list_main_view_unittest.cc
index 5ccd17e..5e9acb5 100644 (file)
@@ -16,6 +16,7 @@
 #include "ui/app_list/views/apps_container_view.h"
 #include "ui/app_list/views/apps_grid_view.h"
 #include "ui/app_list/views/contents_view.h"
+#include "ui/app_list/views/search_box_view.h"
 #include "ui/app_list/views/test/apps_grid_view_test_api.h"
 #include "ui/views/test/views_test_base.h"
 #include "ui/views/view_model.h"
@@ -66,16 +67,21 @@ class AppListMainViewTest : public views::ViewsTestBase {
       : widget_(NULL),
         main_view_(NULL) {}
 
-  virtual ~AppListMainViewTest() {}
+  ~AppListMainViewTest() override {}
 
   // testing::Test overrides:
-  virtual void SetUp() OVERRIDE {
+  void SetUp() override {
     views::ViewsTestBase::SetUp();
     delegate_.reset(new AppListTestViewDelegate);
 
-    main_view_ = new AppListMainView(delegate_.get(), 0, GetContext());
+    // In Ash, the third argument is a container aura::Window, but it is always
+    // NULL on Windows, and not needed for tests. It is only used to determine
+    // the scale factor for preloading icons.
+    main_view_ = new AppListMainView(delegate_.get());
     main_view_->SetPaintToLayer(true);
     main_view_->model()->SetFoldersEnabled(true);
+    search_box_view_.reset(new SearchBoxView(main_view_, delegate_.get()));
+    main_view_->Init(NULL, 0, search_box_view_.get());
 
     widget_ = new views::Widget;
     views::Widget::InitParams params =
@@ -86,16 +92,18 @@ class AppListMainViewTest : public views::ViewsTestBase {
     widget_->SetContentsView(main_view_);
   }
 
-  virtual void TearDown() OVERRIDE {
+  void TearDown() override {
     widget_->Close();
     views::ViewsTestBase::TearDown();
+    search_box_view_.reset();
     delegate_.reset();
   }
 
   // |point| is in |grid_view|'s coordinates.
   AppListItemView* GetItemViewAtPointInGrid(AppsGridView* grid_view,
                                             const gfx::Point& point) {
-    const views::ViewModel* view_model = grid_view->view_model_for_test();
+    const views::ViewModelT<AppListItemView>* view_model =
+        grid_view->view_model_for_test();
     for (int i = 0; i < view_model->view_size(); ++i) {
       views::View* view = view_model->view_at(i);
       if (view->bounds().Contains(point)) {
@@ -158,18 +166,73 @@ class AppListMainViewTest : public views::ViewsTestBase {
 
   AppsGridView* FolderGridView() { return FolderView()->items_grid_view(); }
 
-  const views::ViewModel* RootViewModel() {
+  const views::ViewModelT<AppListItemView>* RootViewModel() {
     return RootGridView()->view_model_for_test();
   }
 
-  const views::ViewModel* FolderViewModel() {
+  const views::ViewModelT<AppListItemView>* FolderViewModel() {
     return FolderGridView()->view_model_for_test();
   }
 
+  AppListItemView* CreateAndOpenSingleItemFolder() {
+    // Prepare single folder with a single item in it.
+    AppListFolderItem* folder_item =
+        delegate_->GetTestModel()->CreateSingleItemFolder("single_item_folder",
+                                                          "single");
+    EXPECT_EQ(folder_item,
+              delegate_->GetTestModel()->FindFolderItem("single_item_folder"));
+    EXPECT_EQ(AppListFolderItem::kItemType, folder_item->GetItemType());
+
+    EXPECT_EQ(1, RootViewModel()->view_size());
+    AppListItemView* folder_item_view =
+        static_cast<AppListItemView*>(RootViewModel()->view_at(0));
+    EXPECT_EQ(folder_item_view->item(), folder_item);
+
+    // Click on the folder to open it.
+    EXPECT_FALSE(FolderView()->visible());
+    SimulateClick(folder_item_view);
+    base::RunLoop().RunUntilIdle();
+    EXPECT_TRUE(FolderView()->visible());
+
+#if defined(OS_WIN)
+    AppsGridViewTestApi folder_grid_view_test_api(FolderGridView());
+    folder_grid_view_test_api.DisableSynchronousDrag();
+#endif
+    return folder_item_view;
+  }
+
+  AppListItemView* StartDragForReparent(int index_in_folder) {
+    // Start to drag the item in folder.
+    views::View* item_view = FolderViewModel()->view_at(index_in_folder);
+    gfx::Point point = item_view->bounds().CenterPoint();
+    AppListItemView* dragged =
+        SimulateInitiateDrag(FolderGridView(), AppsGridView::MOUSE, point);
+    EXPECT_EQ(item_view, dragged);
+    EXPECT_FALSE(RootGridView()->visible());
+    EXPECT_TRUE(FolderView()->visible());
+
+    // Drag it to top left corner.
+    point = gfx::Point(0, 0);
+    // Two update drags needed to actually drag the view. The first changes
+    // state and the 2nd one actually moves the view. The 2nd call can be
+    // removed when UpdateDrag is fixed.
+    SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
+    SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
+    base::RunLoop().RunUntilIdle();
+
+    // Wait until the folder view is invisible and root grid view shows up.
+    GridViewVisibleWaiter(RootGridView()).Wait();
+    EXPECT_TRUE(RootGridView()->visible());
+    EXPECT_EQ(0, FolderView()->layer()->opacity());
+
+    return dragged;
+  }
+
  protected:
   views::Widget* widget_;  // Owned by native window.
   AppListMainView* main_view_;  // Owned by |widget_|.
   scoped_ptr<AppListTestViewDelegate> delegate_;
+  scoped_ptr<SearchBoxView> search_box_view_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(AppListMainViewTest);
@@ -195,71 +258,27 @@ TEST_F(AppListMainViewTest, ModelChanged) {
 // Tests dragging an item out of a single item folder and drop it at the last
 // slot.
 TEST_F(AppListMainViewTest, DragLastItemFromFolderAndDropAtLastSlot) {
-  // Prepare single folder with a single item in it.
-  AppListFolderItem* folder_item =
-      delegate_->GetTestModel()->CreateSingleItemFolder("single_item_folder",
-                                                        "single");
-  EXPECT_EQ(folder_item,
-            delegate_->GetTestModel()->FindFolderItem("single_item_folder"));
-  EXPECT_EQ(AppListFolderItem::kItemType, folder_item->GetItemType());
-
-  EXPECT_EQ(1, RootViewModel()->view_size());
-  AppListItemView* folder_item_view =
-      static_cast<AppListItemView*>(RootViewModel()->view_at(0));
-  EXPECT_EQ(folder_item_view->item(), folder_item);
+  AppListItemView* folder_item_view = CreateAndOpenSingleItemFolder();
   const gfx::Rect first_slot_tile = folder_item_view->bounds();
 
-  // Click on the folder to open it.
-  EXPECT_FALSE(FolderView()->visible());
-  SimulateClick(folder_item_view);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(FolderView()->visible());
-
-#if defined(OS_WIN)
-  AppsGridViewTestApi folder_grid_view_test_api(FolderGridView());
-  folder_grid_view_test_api.DisableSynchronousDrag();
-#endif
-
-  // Start to drag the item in folder.
   EXPECT_EQ(1, FolderViewModel()->view_size());
-  views::View* item_view = FolderViewModel()->view_at(0);
-  gfx::Point point = item_view->bounds().CenterPoint();
-  AppListItemView* dragged =
-      SimulateInitiateDrag(FolderGridView(), AppsGridView::MOUSE, point);
-  EXPECT_EQ(item_view, dragged);
-  EXPECT_FALSE(RootGridView()->visible());
-  EXPECT_TRUE(FolderView()->visible());
-
-  // Drag it to top left corner.
-  point = gfx::Point(0, 0);
-  // Two update drags needed to actually drag the view. The first changes state
-  // and the 2nd one actually moves the view. The 2nd call can be removed when
-  // UpdateDrag is fixed.
-  SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
-  SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
-  base::RunLoop().RunUntilIdle();
 
-  // Wait until the folder view is invisible and root grid view shows up.
-  GridViewVisibleWaiter(RootGridView()).Wait();
-  EXPECT_TRUE(RootGridView()->visible());
-  EXPECT_EQ(0, FolderView()->layer()->opacity());
+  AppListItemView* dragged = StartDragForReparent(0);
 
   // Drop it to the slot on the right of first slot.
   gfx::Rect drop_target_tile(first_slot_tile);
-  drop_target_tile.Offset(first_slot_tile.width(), 0);
-  point = drop_target_tile.CenterPoint();
-  SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
+  drop_target_tile.Offset(first_slot_tile.width() * 2, 0);
+  gfx::Point point = drop_target_tile.CenterPoint();
   SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
-  base::RunLoop().RunUntilIdle();
 
   // Drop it.
   FolderGridView()->EndDrag(false);
-  base::RunLoop().RunUntilIdle();
 
   // Folder icon view should be gone and there is only one item view.
   EXPECT_EQ(1, RootViewModel()->view_size());
-  EXPECT_EQ(AppListItemView::kViewClassName,
-            RootViewModel()->view_at(0)->GetClassName());
+  EXPECT_EQ(
+      AppListItemView::kViewClassName,
+      static_cast<views::View*>(RootViewModel()->view_at(0))->GetClassName());
 
   // The item view should be in slot 1 instead of slot 2 where it is dropped.
   AppsGridViewTestApi root_grid_view_test_api(RootGridView());
@@ -271,5 +290,57 @@ TEST_F(AppListMainViewTest, DragLastItemFromFolderAndDropAtLastSlot) {
             delegate_->GetTestModel()->FindFolderItem("single_item_folder"));
 }
 
+// Tests dragging an item out of a single item folder and dropping it onto the
+// page switcher. Regression test for http://crbug.com/415530/.
+TEST_F(AppListMainViewTest, DragReparentItemOntoPageSwitcher) {
+  AppListItemView* folder_item_view = CreateAndOpenSingleItemFolder();
+  const gfx::Rect first_slot_tile = folder_item_view->bounds();
+
+  delegate_->GetTestModel()->PopulateApps(20);
+
+  EXPECT_EQ(1, FolderViewModel()->view_size());
+  EXPECT_EQ(21, RootViewModel()->view_size());
+
+  AppListItemView* dragged = StartDragForReparent(0);
+
+  gfx::Rect main_view_bounds = main_view_->bounds();
+  // Drag the reparent item to the page switcher.
+  gfx::Point point =
+      gfx::Point(main_view_bounds.width() / 2,
+                 main_view_bounds.bottom() - first_slot_tile.height());
+  SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
+
+  // Drop it.
+  FolderGridView()->EndDrag(false);
+
+  // The folder should be destroyed.
+  EXPECT_EQ(21, RootViewModel()->view_size());
+  EXPECT_EQ(NULL,
+            delegate_->GetTestModel()->FindFolderItem("single_item_folder"));
+}
+
+// Test that an interrupted drag while reparenting an item from a folder, when
+// canceled via the root grid, correctly forwards the cancelation to the drag
+// ocurring from the folder.
+TEST_F(AppListMainViewTest, MouseDragItemOutOfFolderWithCancel) {
+  CreateAndOpenSingleItemFolder();
+  AppListItemView* dragged = StartDragForReparent(0);
+
+  // Now add an item to the model, not in any folder, e.g., as if by Sync.
+  EXPECT_TRUE(RootGridView()->has_dragged_view());
+  EXPECT_TRUE(FolderGridView()->has_dragged_view());
+  delegate_->GetTestModel()->CreateAndAddItem("Extra");
+
+  // The drag operation should get canceled.
+  EXPECT_FALSE(RootGridView()->has_dragged_view());
+  EXPECT_FALSE(FolderGridView()->has_dragged_view());
+
+  // Additional mouse move operations should be ignored.
+  gfx::Point point(1, 1);
+  SimulateUpdateDrag(FolderGridView(), AppsGridView::MOUSE, dragged, point);
+  EXPECT_FALSE(RootGridView()->has_dragged_view());
+  EXPECT_FALSE(FolderGridView()->has_dragged_view());
+}
+
 }  // namespace test
 }  // namespace app_list