OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/i18n/time_formatting.h" | 6 #include "base/i18n/time_formatting.h" |
7 #include "chrome/browser/extensions/extension_service.h" | 7 #include "chrome/browser/extensions/extension_service.h" |
8 #include "chrome/browser/profiles/profile.h" | 8 #include "chrome/browser/profiles/profile.h" |
9 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" |
10 #include "chrome/browser/ui/browser_window.h" | 10 #include "chrome/browser/ui/browser_window.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 } | 88 } |
89 | 89 |
90 void WaitTillBoundsAnimationFinished(PanelBrowserView* browser_view) { | 90 void WaitTillBoundsAnimationFinished(PanelBrowserView* browser_view) { |
91 // The timer for the animation will only kick in as async task. | 91 // The timer for the animation will only kick in as async task. |
92 while (browser_view->bounds_animator_->is_animating()) { | 92 while (browser_view->bounds_animator_->is_animating()) { |
93 MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); | 93 MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
94 MessageLoop::current()->RunAllPending(); | 94 MessageLoop::current()->RunAllPending(); |
95 } | 95 } |
96 } | 96 } |
97 | 97 |
98 void ValidateDragging(PanelBrowserView** browser_views, | |
99 size_t num_browser_views, | |
100 size_t index_to_drag, | |
101 int delta_x, | |
102 int delta_y, | |
103 int* expected_delta_x_after_drag, | |
104 int* expected_delta_x_after_release, | |
105 bool cancel_dragging) { | |
106 // Keep track of the initial bounds for comparison. | |
107 scoped_array<gfx::Rect> initial_bounds(new gfx::Rect[num_browser_views]); | |
108 for (size_t i = 0; i < num_browser_views; ++i) | |
109 initial_bounds[i] = browser_views[i]->panel()->GetRestoredBounds(); | |
110 | |
111 // Trigger the mouse-pressed event. | |
112 // All panels should remain in their original positions. | |
113 views::MouseEvent pressed(ui::ET_MOUSE_PRESSED, | |
114 initial_bounds[index_to_drag].x(), | |
115 initial_bounds[index_to_drag].y(), | |
116 ui::EF_LEFT_BUTTON_DOWN); | |
117 browser_views[index_to_drag]->OnTitleBarMousePressed(pressed); | |
118 gfx::Rect bounds_after_press = | |
119 browser_views[index_to_drag]->panel()->GetRestoredBounds(); | |
120 for (size_t i = 0; i < num_browser_views; ++i) { | |
121 EXPECT_EQ(initial_bounds[i], | |
122 browser_views[i]->panel()->GetRestoredBounds()); | |
123 } | |
124 | |
125 // Trigger the mouse_dragged event if delta_x or delta_y is not 0. | |
126 views::MouseEvent dragged(ui::ET_MOUSE_DRAGGED, | |
127 initial_bounds[index_to_drag].x() + delta_x, | |
128 initial_bounds[index_to_drag].y() + delta_y, | |
129 ui::EF_LEFT_BUTTON_DOWN); | |
130 if (delta_x || delta_y) { | |
131 browser_views[index_to_drag]->OnTitleBarMouseDragged(dragged); | |
132 | |
133 for (size_t i = 0; i < num_browser_views; ++i) { | |
134 gfx::Rect expected_bounds = initial_bounds[i]; | |
135 expected_bounds.Offset(expected_delta_x_after_drag[i], 0); | |
136 EXPECT_EQ(expected_bounds, | |
137 browser_views[i]->panel()->GetRestoredBounds()); | |
138 } | |
139 } | |
140 | |
141 // Cancel the dragging if asked. | |
142 // All panels should stay in their original positions. | |
143 if (cancel_dragging) { | |
144 browser_views[index_to_drag]->OnTitleBarMouseCaptureLost(); | |
145 for (size_t i = 0; i < num_browser_views; ++i) { | |
146 EXPECT_EQ(initial_bounds[i], | |
147 browser_views[i]->panel()->GetRestoredBounds()); | |
148 } | |
149 return; | |
150 } | |
151 | |
152 // Otherwise, trigger the mouse-released event. | |
153 views::MouseEvent released(ui::ET_MOUSE_RELEASED, 0, 0, 0); | |
154 browser_views[index_to_drag]->OnTitleBarMouseReleased(released); | |
155 for (size_t i = 0; i < num_browser_views; ++i) { | |
156 gfx::Rect expected_bounds = initial_bounds[i]; | |
157 expected_bounds.Offset(expected_delta_x_after_release[i], 0); | |
158 EXPECT_EQ(expected_bounds, | |
159 browser_views[i]->panel()->GetRestoredBounds()); | |
160 } | |
161 | |
162 // If releasing the drag causes the panels to swap, move these panels back | |
163 // so that the next test will not be affected. | |
164 if (initial_bounds[index_to_drag] != | |
165 browser_views[index_to_drag]->panel()->GetRestoredBounds()) { | |
166 // Find the index of the panel to swap with the dragging panel. | |
167 size_t swapped_index = 0; | |
168 for (; swapped_index < num_browser_views; ++swapped_index) { | |
169 if (initial_bounds[index_to_drag] == | |
170 browser_views[swapped_index]->panel()->GetRestoredBounds()) | |
171 break; | |
172 } | |
173 ASSERT_NE(swapped_index, index_to_drag); | |
174 | |
175 // Repeat the mouse events to this panel. | |
176 browser_views[swapped_index]->OnTitleBarMousePressed(pressed); | |
177 browser_views[swapped_index]->OnTitleBarMouseDragged(dragged); | |
178 browser_views[swapped_index]->OnTitleBarMouseReleased(released); | |
179 for (size_t i = 0; i < num_browser_views; ++i) { | |
180 EXPECT_EQ(initial_bounds[i], | |
181 browser_views[i]->panel()->GetRestoredBounds()); | |
182 } | |
183 } | |
184 } | |
185 | |
186 void ValidateSettingsMenuItems(ui::SimpleMenuModel* settings_menu_contents, | 98 void ValidateSettingsMenuItems(ui::SimpleMenuModel* settings_menu_contents, |
187 size_t num_expected_menu_items, | 99 size_t num_expected_menu_items, |
188 const MenuItem* expected_menu_items) { | 100 const MenuItem* expected_menu_items) { |
189 ASSERT_TRUE(settings_menu_contents); | 101 ASSERT_TRUE(settings_menu_contents); |
190 EXPECT_EQ(static_cast<int>(num_expected_menu_items), | 102 EXPECT_EQ(static_cast<int>(num_expected_menu_items), |
191 settings_menu_contents->GetItemCount()); | 103 settings_menu_contents->GetItemCount()); |
192 for (size_t i = 0; i < num_expected_menu_items; ++i) { | 104 for (size_t i = 0; i < num_expected_menu_items; ++i) { |
193 if (expected_menu_items[i].id == -1) { | 105 if (expected_menu_items[i].id == -1) { |
194 EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR, | 106 EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR, |
195 settings_menu_contents->GetTypeAt(i)); | 107 settings_menu_contents->GetTypeAt(i)); |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 // the panel or not. | 443 // the panel or not. |
532 browser_view->panel()->Deactivate(); | 444 browser_view->panel()->Deactivate(); |
533 EXPECT_FALSE(browser_view->panel()->IsActive()); | 445 EXPECT_FALSE(browser_view->panel()->IsActive()); |
534 | 446 |
535 mouse_watcher->MoveMouse(true); | 447 mouse_watcher->MoveMouse(true); |
536 EXPECT_TRUE(frame_view->settings_button_->IsVisible()); | 448 EXPECT_TRUE(frame_view->settings_button_->IsVisible()); |
537 mouse_watcher->MoveMouse(false); | 449 mouse_watcher->MoveMouse(false); |
538 EXPECT_FALSE(frame_view->settings_button_->IsVisible()); | 450 EXPECT_FALSE(frame_view->settings_button_->IsVisible()); |
539 } | 451 } |
540 | 452 |
541 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, TitleBarMouseEvent) { | |
542 // TODO(jianli): Move the test to platform-independent PanelManager unittest. | |
543 | |
544 // Creates the 1st panel. | |
545 PanelBrowserView* browser_view1 = CreatePanelBrowserView("PanelTest1", | |
546 SHOW_AS_ACTIVE); | |
547 | |
548 // The delta is from the pressed location which is the left-top corner of the | |
549 // panel to drag. | |
550 int small_negative_delta = -5; | |
551 int small_positive_delta = 5; | |
552 int big_negative_delta = | |
553 -(browser_view1->panel()->GetRestoredBounds().width() * 0.5 + 5); | |
554 int big_positive_delta = | |
555 browser_view1->panel()->GetRestoredBounds().width() * 1.5 + 5; | |
556 | |
557 // Tests dragging a panel in single-panel environment. | |
558 // We should get back to the original position after the dragging is ended. | |
559 int expected_single_delta_x_after_drag[] = { big_negative_delta }; | |
560 int expected_single_delta_x_after_release[] = { 0 }; | |
561 ValidateDragging(&browser_view1, | |
562 1, | |
563 0, | |
564 big_negative_delta, | |
565 big_negative_delta, | |
566 expected_single_delta_x_after_drag, | |
567 expected_single_delta_x_after_release, | |
568 false); | |
569 | |
570 expected_single_delta_x_after_drag[0] = big_positive_delta; | |
571 ValidateDragging(&browser_view1, | |
572 1, | |
573 0, | |
574 big_positive_delta, | |
575 big_positive_delta, | |
576 expected_single_delta_x_after_drag, | |
577 expected_single_delta_x_after_release, | |
578 false); | |
579 | |
580 // Creates 2 more panels to test dragging a panel in multi-panel environment. | |
581 PanelBrowserView* browser_view2 = CreatePanelBrowserView("PanelTest2", | |
582 SHOW_AS_ACTIVE); | |
583 PanelBrowserView* browser_view3 = CreatePanelBrowserView("PanelTest3", | |
584 SHOW_AS_ACTIVE); | |
585 PanelBrowserView* browser_views[] = | |
586 { browser_view1, browser_view2, browser_view3 }; | |
587 size_t browser_view_count = arraysize(browser_views); | |
588 int expected_delta_x_without_change[] = { 0, 0, 0 }; | |
589 | |
590 // Tests dragging a panel with small delta. | |
591 // We should get back to the original position after the dragging is ended. | |
592 for (size_t i = 0; i < browser_view_count; ++i) { | |
593 int expected_delta_x_after_drag[] = { 0, 0, 0 }; | |
594 | |
595 expected_delta_x_after_drag[i] = small_negative_delta; | |
596 ValidateDragging(browser_views, | |
597 browser_view_count, | |
598 i, | |
599 small_negative_delta, | |
600 small_negative_delta, | |
601 expected_delta_x_after_drag, | |
602 expected_delta_x_without_change, | |
603 false); | |
604 | |
605 expected_delta_x_after_drag[i] = small_positive_delta; | |
606 ValidateDragging(browser_views, | |
607 browser_view_count, | |
608 i, | |
609 small_positive_delta, | |
610 small_positive_delta, | |
611 expected_delta_x_after_drag, | |
612 expected_delta_x_without_change, | |
613 false); | |
614 } | |
615 | |
616 // Tests dragging a panel with big delta and then cancelling it. | |
617 // We should get back to the original position. | |
618 for (size_t i = 0; i < browser_view_count; ++i) { | |
619 int expected_delta_x_after_drag[] = { 0, 0, 0 }; | |
620 expected_delta_x_after_drag[i] = big_negative_delta; | |
621 if (i + 1 < browser_view_count) { | |
622 expected_delta_x_after_drag[i + 1] = | |
623 browser_views[i]->panel()->GetRestoredBounds().x() - | |
624 browser_views[i + 1]->panel()->GetRestoredBounds().x(); | |
625 } | |
626 ValidateDragging(browser_views, | |
627 browser_view_count, | |
628 i, | |
629 big_negative_delta, | |
630 big_negative_delta, | |
631 expected_delta_x_after_drag, | |
632 expected_delta_x_without_change, | |
633 true); | |
634 | |
635 int expected_delta_x_after_drag2[] = { 0, 0, 0 }; | |
636 expected_delta_x_after_drag2[i] = big_positive_delta; | |
637 if (static_cast<int>(i) - 1 >= 0) { | |
638 expected_delta_x_after_drag2[i - 1] = | |
639 browser_views[i]->panel()->GetRestoredBounds().x() - | |
640 browser_views[i - 1]->panel()->GetRestoredBounds().x(); | |
641 } | |
642 ValidateDragging(browser_views, | |
643 browser_view_count, | |
644 i, | |
645 big_positive_delta, | |
646 big_positive_delta, | |
647 expected_delta_x_after_drag2, | |
648 expected_delta_x_without_change, | |
649 true); | |
650 } | |
651 | |
652 // Tests dragging a panel with big delta. | |
653 // We should move to the new position after the dragging is ended. | |
654 for (size_t i = 0; i < browser_view_count; ++i) { | |
655 int expected_delta_x_after_drag[] = { 0, 0, 0 }; | |
656 int expected_delta_x_after_release[] = { 0, 0, 0 }; | |
657 expected_delta_x_after_drag[i] = big_negative_delta; | |
658 if (i + 1 < browser_view_count) { | |
659 expected_delta_x_after_drag[i + 1] = | |
660 browser_views[i]->panel()->GetRestoredBounds().x() - | |
661 browser_views[i + 1]->panel()->GetRestoredBounds().x(); | |
662 expected_delta_x_after_release[i + 1] = | |
663 expected_delta_x_after_drag[i + 1]; | |
664 expected_delta_x_after_release[i] = | |
665 browser_views[i + 1]->panel()->GetRestoredBounds().x() - | |
666 browser_views[i]->panel()->GetRestoredBounds().x(); | |
667 } | |
668 ValidateDragging(browser_views, | |
669 browser_view_count, | |
670 i, | |
671 big_negative_delta, | |
672 big_negative_delta, | |
673 expected_delta_x_after_drag, | |
674 expected_delta_x_after_release, | |
675 false); | |
676 | |
677 int expected_delta_x_after_drag2[] = { 0, 0, 0 }; | |
678 int expected_delta_x_after_release2[] = { 0, 0, 0 }; | |
679 expected_delta_x_after_drag2[i] = big_positive_delta; | |
680 if (static_cast<int>(i) - 1 >= 0) { | |
681 expected_delta_x_after_drag2[i - 1] = | |
682 browser_views[i]->panel()->GetRestoredBounds().x() - | |
683 browser_views[i - 1]->panel()->GetRestoredBounds().x(); | |
684 expected_delta_x_after_release2[i - 1] = | |
685 expected_delta_x_after_drag2[i - 1]; | |
686 expected_delta_x_after_release2[i] = | |
687 browser_views[i - 1]->panel()->GetRestoredBounds().x() - | |
688 browser_views[i]->panel()->GetRestoredBounds().x(); | |
689 } | |
690 ValidateDragging(browser_views, | |
691 browser_view_count, | |
692 i, | |
693 big_positive_delta, | |
694 big_positive_delta, | |
695 expected_delta_x_after_drag2, | |
696 expected_delta_x_after_release2, | |
697 false); | |
698 } | |
699 | |
700 // Closes all panels. | |
701 for (size_t i = 0; i < browser_view_count; ++i) { | |
702 browser_views[i]->panel()->Close(); | |
703 // We're only verifying that PanelBrowserView::Close has been called when | |
704 // a panel is closed. This is to make sure the dragging is ended and does | |
705 // not interfere the closing process. | |
706 EXPECT_TRUE(browser_views[i]->closed()); | |
707 } | |
708 } | |
709 | |
710 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, SetBoundsAnimation) { | 453 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, SetBoundsAnimation) { |
711 PanelBrowserView* browser_view = CreatePanelBrowserView("PanelTest", | 454 PanelBrowserView* browser_view = CreatePanelBrowserView("PanelTest", |
712 SHOW_AS_ACTIVE); | 455 SHOW_AS_ACTIVE); |
713 | 456 |
714 // Validate that animation should be triggered when SetBounds is called. | 457 // Validate that animation should be triggered when SetBounds is called. |
715 gfx::Rect target_bounds(browser_view->GetBounds()); | 458 gfx::Rect target_bounds(browser_view->GetBounds()); |
716 target_bounds.Offset(20, -30); | 459 target_bounds.Offset(20, -30); |
717 target_bounds.set_width(target_bounds.width() + 100); | 460 target_bounds.set_width(target_bounds.width() + 100); |
718 target_bounds.set_height(target_bounds.height() + 50); | 461 target_bounds.set_height(target_bounds.height() + 50); |
719 browser_view->SetBounds(target_bounds); | 462 browser_view->SetBounds(target_bounds); |
720 ASSERT_TRUE(browser_view->bounds_animator_.get()); | 463 ASSERT_TRUE(browser_view->bounds_animator_.get()); |
721 EXPECT_TRUE(browser_view->bounds_animator_->is_animating()); | 464 EXPECT_TRUE(browser_view->bounds_animator_->is_animating()); |
722 EXPECT_NE(browser_view->GetBounds(), target_bounds); | 465 EXPECT_NE(browser_view->GetBounds(), target_bounds); |
723 WaitTillBoundsAnimationFinished(browser_view); | 466 WaitTillBoundsAnimationFinished(browser_view); |
724 EXPECT_EQ(browser_view->GetBounds(), target_bounds); | 467 EXPECT_EQ(browser_view->GetBounds(), target_bounds); |
725 | 468 |
726 // Validates that no animation should be triggered for the panel currently | 469 // Validates that no animation should be triggered for the panel currently |
727 // being dragged. | 470 // being dragged. |
728 views::MouseEvent pressed(ui::ET_MOUSE_PRESSED, | 471 browser_view->OnTitleBarMousePressed(gfx::Point( |
729 target_bounds.x(), | 472 target_bounds.x(), target_bounds.y())); |
730 target_bounds.y(), | 473 browser_view->OnTitleBarMouseDragged(gfx::Point( |
731 ui::EF_LEFT_BUTTON_DOWN); | 474 target_bounds.x() + 5, target_bounds.y() + 5)); |
732 browser_view->OnTitleBarMousePressed(pressed); | |
733 | |
734 views::MouseEvent dragged(ui::ET_MOUSE_DRAGGED, | |
735 target_bounds.x() + 5, | |
736 target_bounds.y() + 5, | |
737 ui::EF_LEFT_BUTTON_DOWN); | |
738 browser_view->OnTitleBarMouseDragged(dragged); | |
739 EXPECT_FALSE(browser_view->bounds_animator_->is_animating()); | 475 EXPECT_FALSE(browser_view->bounds_animator_->is_animating()); |
740 browser_view->OnTitleBarMouseCaptureLost(); | 476 browser_view->OnTitleBarMouseCaptureLost(); |
741 | 477 |
742 browser_view->panel()->Close(); | 478 browser_view->panel()->Close(); |
743 } | 479 } |
744 | 480 |
745 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, CreateSettingsMenu) { | 481 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, CreateSettingsMenu) { |
746 TestCreateSettingsMenuForExtension( | 482 TestCreateSettingsMenuForExtension( |
747 FILE_PATH_LITERAL("extension1"), Extension::EXTERNAL_POLICY_DOWNLOAD, | 483 FILE_PATH_LITERAL("extension1"), Extension::EXTERNAL_POLICY_DOWNLOAD, |
748 "", ""); | 484 "", ""); |
749 TestCreateSettingsMenuForExtension( | 485 TestCreateSettingsMenuForExtension( |
750 FILE_PATH_LITERAL("extension2"), Extension::INVALID, | 486 FILE_PATH_LITERAL("extension2"), Extension::INVALID, |
751 "http://home", "options.html"); | 487 "http://home", "options.html"); |
752 } | 488 } |
753 | 489 |
754 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, MinimizeAndRestore) { | 490 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, MinimizeAndRestore) { |
755 TestMinimizeAndRestore(); | 491 TestMinimizeAndRestore(); |
756 } | 492 } |
757 | 493 |
758 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, DrawAttention) { | 494 IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, DrawAttention) { |
759 TestDrawAttention(); | 495 TestDrawAttention(); |
760 } | 496 } |
761 #endif | 497 #endif |
OLD | NEW |