| Index: chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
|
| diff --git a/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm b/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
|
| index 326665c38ee1264a5481727460eb221c025f1eb2..609f172c787f9dbd0d44d539e98a337f099168fe 100644
|
| --- a/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
|
| +++ b/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
|
| @@ -7,14 +7,28 @@
|
| #import "base/mac/mac_util.h"
|
| #include "base/run_loop.h"
|
| #include "base/utf_string_conversions.h"
|
| +#include "chrome/browser/api/infobars/confirm_infobar_delegate.h"
|
| +#include "chrome/browser/api/infobars/infobar_service.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/ui/browser_tabstrip.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_window.h"
|
| #include "chrome/browser/ui/cocoa/browser_window_cocoa.h"
|
| +#import "chrome/browser/ui/cocoa/browser_window_controller_private.h"
|
| #import "chrome/browser/ui/cocoa/browser/avatar_button_controller.h"
|
| +#import "chrome/browser/ui/cocoa/fast_resize_view.h"
|
| +#import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h"
|
| +#import "chrome/browser/ui/cocoa/nsview_additions.h"
|
| +#import "chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h"
|
| +#include "chrome/browser/ui/search/search.h"
|
| +#include "chrome/browser/ui/search/search_model.h"
|
| #include "chrome/test/base/in_process_browser_test.h"
|
| +#include "content/public/browser/web_contents.h"
|
| +#import "testing/gtest_mac.h"
|
| +
|
| +namespace {
|
|
|
| #if !defined(MAC_OS_X_VERSION_10_7) || \
|
| MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
|
| @@ -24,8 +38,6 @@ enum {
|
| };
|
| #endif // MAC_OS_X_VERSION_10_7
|
|
|
| -typedef InProcessBrowserTest BrowserWindowControllerTest;
|
| -
|
| void CreateProfileCallback(const base::Closure& quit_closure,
|
| Profile* profile,
|
| Profile::CreateStatus status) {
|
| @@ -37,6 +49,149 @@ void CreateProfileCallback(const base::Closure& quit_closure,
|
| quit_closure.Run();
|
| }
|
|
|
| +enum ViewID {
|
| + VIEW_ID_TOOLBAR,
|
| + VIEW_ID_BOOKMARK_BAR,
|
| + VIEW_ID_INFO_BAR,
|
| + VIEW_ID_FIND_BAR,
|
| + VIEW_ID_DOWNLOAD_SHELF,
|
| + VIEW_ID_TAB_CONTENT_AREA,
|
| + VIEW_ID_FULLSCREEN_FLOATING_BAR,
|
| + VIEW_ID_COUNT,
|
| +};
|
| +
|
| +// A very simple info bar implementation used to show an infobar on the browser
|
| +// window.
|
| +class DummyInfoBar : public ConfirmInfoBarDelegate {
|
| + public:
|
| + explicit DummyInfoBar(InfoBarService* service)
|
| + : ConfirmInfoBarDelegate(service) {
|
| + }
|
| +
|
| + virtual ~DummyInfoBar() {
|
| + }
|
| +
|
| + virtual string16 GetMessageText() const OVERRIDE {
|
| + return string16();
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(DummyInfoBar);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +class BrowserWindowControllerTest : public InProcessBrowserTest {
|
| + public:
|
| + BrowserWindowControllerTest() : InProcessBrowserTest() {
|
| + }
|
| +
|
| + virtual void SetUpOnMainThread() OVERRIDE {
|
| + [[controller() bookmarkBarController] setStateAnimationsEnabled:NO];
|
| + [[controller() bookmarkBarController] setInnerContentAnimationsEnabled:NO];
|
| + }
|
| +
|
| + virtual void CleanUpOnMainThread() OVERRIDE {
|
| + if (web_contents_)
|
| + browser()->search_model()->set_web_contents(NULL);
|
| + web_contents_.reset();
|
| + }
|
| +
|
| + BrowserWindowController* controller() const {
|
| + return [BrowserWindowController browserWindowControllerForWindow:
|
| + browser()->window()->GetNativeWindow()];
|
| + }
|
| +
|
| + void ShowInstantResults() {
|
| + chrome::search::EnableInstantExtendedAPIForTesting();
|
| + web_contents_.reset(content::WebContents::Create(
|
| + content::WebContents::CreateParams(browser()->profile())));
|
| + browser()->search_model()->set_web_contents(web_contents_.get());
|
| + chrome::search::Mode mode(chrome::search::Mode::MODE_SEARCH_SUGGESTIONS,
|
| + chrome::search::Mode::ORIGIN_SEARCH);
|
| + browser()->search_model()->SetMode(mode);
|
| + EXPECT_TRUE(browser()->search_model()->mode().is_search_suggestions());
|
| + EXPECT_TRUE([controller() isShowingInstantResults]);
|
| + }
|
| +
|
| + void ShowInstantNTP() {
|
| + chrome::search::EnableInstantExtendedAPIForTesting();
|
| + web_contents_.reset(content::WebContents::Create(
|
| + content::WebContents::CreateParams(browser()->profile())));
|
| + browser()->search_model()->set_web_contents(web_contents_.get());
|
| + chrome::search::Mode mode(chrome::search::Mode::MODE_NTP,
|
| + chrome::search::Mode::ORIGIN_NTP);
|
| + browser()->search_model()->SetMode(mode);
|
| + EXPECT_TRUE(browser()->search_model()->mode().is_ntp());
|
| + EXPECT_FALSE([controller() isShowingInstantResults]);
|
| + }
|
| +
|
| + void ShowInfoBar() {
|
| + content::WebContents* web_contents =
|
| + chrome::GetActiveWebContents(browser());
|
| + InfoBarService* service =
|
| + InfoBarService::FromWebContents(web_contents);
|
| + info_bar_delegate_.reset(new DummyInfoBar(service));
|
| + [[controller() infoBarContainerController]
|
| + addInfoBar:info_bar_delegate_->CreateInfoBar(service)
|
| + animate:NO];
|
| + }
|
| +
|
| + NSView* GetViewWithID(ViewID view_id) const {
|
| + switch (view_id) {
|
| + case VIEW_ID_FULLSCREEN_FLOATING_BAR:
|
| + return [controller() floatingBarBackingView];
|
| + case VIEW_ID_TOOLBAR:
|
| + return [[controller() toolbarController] view];
|
| + case VIEW_ID_BOOKMARK_BAR:
|
| + return [[controller() bookmarkBarController] view];
|
| + case VIEW_ID_INFO_BAR:
|
| + return [[controller() infoBarContainerController] view];
|
| + case VIEW_ID_FIND_BAR:
|
| + return [[controller() findBarCocoaController] view];
|
| + case VIEW_ID_DOWNLOAD_SHELF:
|
| + return [[controller() downloadShelf] view];
|
| + case VIEW_ID_TAB_CONTENT_AREA:
|
| + return [controller() tabContentArea];
|
| + default:
|
| + NOTREACHED();
|
| + return nil;
|
| + }
|
| + }
|
| +
|
| + void VerifyZOrder(const std::vector<ViewID>& view_list) const {
|
| + for (size_t i = 0; i < view_list.size() - 1; ++i) {
|
| + NSView* bottom_view = GetViewWithID(view_list[i]);
|
| + NSView* top_view = GetViewWithID(view_list[i + 1]);
|
| + EXPECT_NSEQ([bottom_view superview], [top_view superview]);
|
| + EXPECT_TRUE([bottom_view cr_isBelowView:top_view]);
|
| + }
|
| +
|
| + // Views not in |view_list| must either be nil or not parented.
|
| + for (size_t i = 0; i < VIEW_ID_COUNT; ++i) {
|
| + if (std::find(view_list.begin(), view_list.end(), i) == view_list.end()) {
|
| + NSView* view = GetViewWithID(static_cast<ViewID>(i));
|
| + EXPECT_TRUE(!view || ![view superview]);
|
| + }
|
| + }
|
| + }
|
| +
|
| + CGFloat GetViewHeight(ViewID viewID) const {
|
| + CGFloat height = NSHeight([GetViewWithID(viewID) frame]);
|
| + if (viewID == VIEW_ID_INFO_BAR) {
|
| + height -= [[controller() infoBarContainerController]
|
| + overlappingTipHeight];
|
| + }
|
| + return height;
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<content::WebContents> web_contents_;
|
| + scoped_ptr<InfoBarDelegate> info_bar_delegate_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BrowserWindowControllerTest);
|
| +};
|
| +
|
| // Tests that adding the first profile moves the Lion fullscreen button over
|
| // correctly.
|
| // DISABLED_ because it regularly times out: http://crbug.com/159002.
|
| @@ -52,9 +207,6 @@ IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest,
|
| NSWindow* window = browser()->window()->GetNativeWindow();
|
| ASSERT_TRUE(window);
|
|
|
| - BrowserWindowController* controller =
|
| - static_cast<BrowserWindowCocoa*>(browser()->window())->cocoa_controller();
|
| -
|
| // With only one profile, the fullscreen button should be visible, but the
|
| // avatar button should not.
|
| EXPECT_EQ(1u, profile_manager->GetNumberOfProfiles());
|
| @@ -65,7 +217,7 @@ IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest,
|
| EXPECT_FALSE([fullscreen_button isHidden]);
|
|
|
| AvatarButtonController* avatar_controller =
|
| - [controller avatarButtonController];
|
| + [controller() avatarButtonController];
|
| NSView* avatar = [avatar_controller view];
|
| EXPECT_TRUE(avatar);
|
| EXPECT_TRUE([avatar isHidden]);
|
| @@ -100,3 +252,187 @@ IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest,
|
| EXPECT_LT(NSMinX(fullscreen_frame), NSMinX(avatar_frame));
|
| EXPECT_LT(NSMaxX(fullscreen_frame), NSMinX(avatar_frame));
|
| }
|
| +
|
| +// Verify that in non-instant normal mode that the find bar and download shelf
|
| +// are above the content area. Everything else should be below it.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, ZOrderNormal) {
|
| + browser()->GetFindBarController(); // add find bar
|
| +
|
| + std::vector<ViewID> view_list;
|
| + view_list.push_back(VIEW_ID_BOOKMARK_BAR);
|
| + view_list.push_back(VIEW_ID_TOOLBAR);
|
| + view_list.push_back(VIEW_ID_INFO_BAR);
|
| + view_list.push_back(VIEW_ID_TAB_CONTENT_AREA);
|
| + view_list.push_back(VIEW_ID_FIND_BAR);
|
| + view_list.push_back(VIEW_ID_DOWNLOAD_SHELF);
|
| + VerifyZOrder(view_list);
|
| +}
|
| +
|
| +// Verify that in non-instant presentation mode that the info bar is below the
|
| +// content are and everything else is above it.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, ZOrderPresentationMode) {
|
| + browser()->TogglePresentationMode();
|
| + browser()->GetFindBarController(); // add find bar
|
| +
|
| + std::vector<ViewID> view_list;
|
| + view_list.push_back(VIEW_ID_INFO_BAR);
|
| + view_list.push_back(VIEW_ID_TAB_CONTENT_AREA);
|
| + view_list.push_back(VIEW_ID_FULLSCREEN_FLOATING_BAR);
|
| + view_list.push_back(VIEW_ID_BOOKMARK_BAR);
|
| + view_list.push_back(VIEW_ID_TOOLBAR);
|
| + view_list.push_back(VIEW_ID_FIND_BAR);
|
| + view_list.push_back(VIEW_ID_DOWNLOAD_SHELF);
|
| + VerifyZOrder(view_list);
|
| +}
|
| +
|
| +// Normal mode with instant results showing. Should be same z-order as normal
|
| +// mode except find bar is below content area.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, ZOrderNormalInstant) {
|
| + ShowInstantResults();
|
| + browser()->GetFindBarController(); // add find bar
|
| +
|
| + std::vector<ViewID> view_list;
|
| + view_list.push_back(VIEW_ID_BOOKMARK_BAR);
|
| + view_list.push_back(VIEW_ID_TOOLBAR);
|
| + view_list.push_back(VIEW_ID_INFO_BAR);
|
| + view_list.push_back(VIEW_ID_FIND_BAR);
|
| + view_list.push_back(VIEW_ID_TAB_CONTENT_AREA);
|
| + view_list.push_back(VIEW_ID_DOWNLOAD_SHELF);
|
| + VerifyZOrder(view_list);
|
| +}
|
| +
|
| +// Presentation mode with instant results showing. Should be exact same as
|
| +// non-instant presentation mode.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest,
|
| + ZOrderInstantPresentationMode) {
|
| + browser()->TogglePresentationMode();
|
| + ShowInstantResults();
|
| + browser()->GetFindBarController(); // add find bar
|
| +
|
| + std::vector<ViewID> view_list;
|
| + view_list.push_back(VIEW_ID_INFO_BAR);
|
| + view_list.push_back(VIEW_ID_TAB_CONTENT_AREA);
|
| + view_list.push_back(VIEW_ID_FULLSCREEN_FLOATING_BAR);
|
| + view_list.push_back(VIEW_ID_BOOKMARK_BAR);
|
| + view_list.push_back(VIEW_ID_TOOLBAR);
|
| + view_list.push_back(VIEW_ID_FIND_BAR);
|
| + view_list.push_back(VIEW_ID_DOWNLOAD_SHELF);
|
| + VerifyZOrder(view_list);
|
| +}
|
| +
|
| +// Verify that in non-instant presentation mode the content area is beneath
|
| +// the bookmark bar and info bar.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, ContentOffset) {
|
| + PreviewableContentsController* preview =
|
| + [controller() previewableContentsController];
|
| +
|
| + // Just toolbar.
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Plus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_BOOKMARK_BAR),
|
| + [preview activeContainerOffset]);
|
| +
|
| + // Plus info bar.
|
| + ShowInfoBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_BOOKMARK_BAR) +
|
| + GetViewHeight(VIEW_ID_INFO_BAR),
|
| + [preview activeContainerOffset]);
|
| +
|
| + // Minus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_INFO_BAR), [preview activeContainerOffset]);
|
| +}
|
| +
|
| +// Verify that in non-instant presentation mode the content area is beneath
|
| +// the info bar.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest,
|
| + ContentOffsetPresentationMode) {
|
| + browser()->TogglePresentationMode();
|
| + PreviewableContentsController* preview =
|
| + [controller() previewableContentsController];
|
| +
|
| + // Just toolbar.
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Plus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Plus info bar.
|
| + ShowInfoBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Minus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +}
|
| +
|
| +// Verify that when showing instant results the content area overlaps the
|
| +// bookmark bar and info bar.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, ContentOffsetInstant) {
|
| + ShowInstantResults();
|
| + PreviewableContentsController* preview =
|
| + [controller() previewableContentsController];
|
| +
|
| + // Just toolbar.
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Plus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Plus info bar.
|
| + ShowInfoBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Minus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +}
|
| +
|
| +// The instant NTP case is same as normal case except that the preview is
|
| +// also shifted down.
|
| +IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, ContentOffsetInstantNPT) {
|
| + ShowInstantNTP();
|
| + PreviewableContentsController* preview =
|
| + [controller() previewableContentsController];
|
| +
|
| + // Just toolbar.
|
| + EXPECT_EQ(0, [preview previewOffset]);
|
| + EXPECT_EQ(0, [preview activeContainerOffset]);
|
| +
|
| + // Plus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_BOOKMARK_BAR),
|
| + [preview previewOffset]);
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_BOOKMARK_BAR),
|
| + [preview activeContainerOffset]);
|
| +
|
| + // Plus info bar.
|
| + ShowInfoBar();
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_BOOKMARK_BAR) +
|
| + GetViewHeight(VIEW_ID_INFO_BAR),
|
| + [preview previewOffset]);
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_BOOKMARK_BAR) +
|
| + GetViewHeight(VIEW_ID_INFO_BAR),
|
| + [preview activeContainerOffset]);
|
| +
|
| + // Minus bookmark bar.
|
| + browser()->window()->ToggleBookmarkBar();
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_INFO_BAR), [preview previewOffset]);
|
| + EXPECT_EQ(GetViewHeight(VIEW_ID_INFO_BAR), [preview activeContainerOffset]);
|
| +}
|
|
|