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 99300210a2b397b05fca0597c93d2d8b3cc3b7f1..86901142f02f682ac095bd8214349b96ad04c4e6 100644 |
--- a/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm |
+++ b/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm |
@@ -8,6 +8,7 @@ |
#include "base/mac/sdk_forward_declarations.h" |
#include "base/run_loop.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/devtools/devtools_window_testing.h" |
#include "chrome/browser/infobars/infobar_service.h" |
@@ -25,6 +26,8 @@ |
#import "chrome/browser/ui/cocoa/history_overlay_controller.h" |
#import "chrome/browser/ui/cocoa/infobars/infobar_cocoa.h" |
#import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" |
+#import "chrome/browser/ui/cocoa/infobars/infobar_controller.h" |
+#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
#import "chrome/browser/ui/cocoa/nsview_additions.h" |
#import "chrome/browser/ui/cocoa/profiles/avatar_base_controller.h" |
#import "chrome/browser/ui/cocoa/tab_contents/overlayable_contents_controller.h" |
@@ -35,7 +38,9 @@ |
#include "chrome/test/base/in_process_browser_test.h" |
#include "chrome/test/base/testing_profile.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/test/test_utils.h" |
#import "testing/gtest_mac.h" |
+#include "ui/gfx/animation/slide_animation.h" |
namespace { |
@@ -64,6 +69,22 @@ enum ViewID { |
} // namespace |
+@interface InfoBarContainerController(TestingAPI) |
+- (BOOL)isTopInfoBarAnimationRunning; |
+@end |
+ |
+@implementation InfoBarContainerController(TestingAPI) |
+- (BOOL)isTopInfoBarAnimationRunning { |
+ InfoBarController* infoBarController = [infobarControllers_ objectAtIndex:0]; |
+ if (infoBarController) { |
+ const gfx::SlideAnimation& infobarAnimation = |
+ const_cast<const InfoBarCocoa*>(infoBarController.infobar)->animation(); |
Robert Sesek
2014/08/26 16:26:18
Why do you need this const cast?
Malcolm
2014/08/27 06:29:21
Class InfoBar has two methods named "animation()",
Peter Kasting
2014/08/27 06:59:51
If you're adding const, use static_cast rather tha
Malcolm
2014/08/27 09:06:36
Oh, should be static_cast here, very careful, than
|
+ return infobarAnimation.is_animating(); |
+ } |
+ return NO; |
+} |
+@end |
+ |
class BrowserWindowControllerTest : public InProcessBrowserTest { |
public: |
BrowserWindowControllerTest() : InProcessBrowserTest() { |
@@ -134,6 +155,64 @@ class BrowserWindowControllerTest : public InProcessBrowserTest { |
return height; |
} |
+ static void CheckTopInfoBarAnimation( |
+ InfoBarContainerController* infoBarContainerController, |
+ const base::Closure& quit_task) { |
+ if (![infoBarContainerController isTopInfoBarAnimationRunning]) |
+ quit_task.Run(); |
+ } |
+ |
+ static void CheckBookmarkBarAnimation( |
+ BookmarkBarController* bookmarkBarController, |
+ const base::Closure& quit_task) { |
+ if (![bookmarkBarController isAnimationRunning]) |
+ quit_task.Run(); |
+ } |
+ |
+ void WaitForTopInfoBarAnimationToFinish() { |
+ scoped_refptr<content::MessageLoopRunner> runner = |
+ new content::MessageLoopRunner; |
+ |
+ base::Timer timer(false, true); |
+ timer.Start( |
+ FROM_HERE, |
+ base::TimeDelta::FromMilliseconds(15), |
+ base::Bind(&CheckTopInfoBarAnimation, |
+ [controller() infoBarContainerController], |
+ runner->QuitClosure())); |
+ runner->Run(); |
+ } |
+ |
+ void WaitForBookmarkBarAnimationToFinish() { |
+ scoped_refptr<content::MessageLoopRunner> runner = |
+ new content::MessageLoopRunner; |
+ |
+ base::Timer timer(false, true); |
+ timer.Start( |
+ FROM_HERE, |
+ base::TimeDelta::FromMilliseconds(15), |
+ base::Bind(&CheckBookmarkBarAnimation, |
+ [controller() bookmarkBarController], |
+ runner->QuitClosure())); |
+ runner->Run(); |
+ } |
+ |
+ NSInteger GetExpectedTopInfoBarTipHeight() { |
+ InfoBarContainerController* infoBarContainerController = |
+ [controller() infoBarContainerController]; |
+ CGFloat overlappingTipHeight = |
Robert Sesek
2014/08/26 16:26:18
naming: overlapping_tip_height
|
+ [infoBarContainerController overlappingTipHeight]; |
+ LocationBarViewMac* locationBarView = [controller() locationBarBridge]; |
Robert Sesek
2014/08/26 16:26:18
naming: location_bar_view
|
+ NSPoint iconBottom = locationBarView->GetPageInfoBubblePoint(); |
Robert Sesek
2014/08/26 16:26:18
naming: icon_bottom
|
+ |
+ NSPoint infoBarTop = NSMakePoint(0, |
Robert Sesek
2014/08/26 16:26:18
naming: info_bar_top
|
+ NSHeight([infoBarContainerController view].frame) - |
+ overlappingTipHeight); |
+ infoBarTop = [[infoBarContainerController view] convertPoint:infoBarTop |
+ toView:nil]; |
+ return iconBottom.y - infoBarTop.y; |
+ } |
+ |
private: |
DISALLOW_COPY_AND_ASSIGN(BrowserWindowControllerTest); |
}; |
@@ -354,3 +433,31 @@ IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, |
DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window); |
} |
+ |
+// Tests that top infobar tip is streched when bookmark bar becomes SHOWN/HIDDEN |
+IN_PROC_BROWSER_TEST_F(BrowserWindowControllerTest, |
+ InfoBarTipStrechedWhenBookmarkBarStatusChanged) { |
+ EXPECT_FALSE([controller() isBookmarkBarVisible]); |
+ ShowInfoBar(browser()); |
+ // The infobar tip is animated during the infobar is being added, wait until |
+ // it completes. |
+ WaitForTopInfoBarAnimationToFinish(); |
+ |
+ EXPECT_FALSE([[controller() infoBarContainerController] |
+ shouldSuppressTopInfoBarTip]); |
+ |
+ NSInteger maxTipHeight = infobars::InfoBar::kMaximumArrowTargetHeight + |
Robert Sesek
2014/08/26 16:26:18
naming: In C++ functions (which tests are), use un
|
+ infobars::InfoBar::kSeparatorLineHeight; |
+ |
+ chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR); |
+ WaitForBookmarkBarAnimationToFinish(); |
+ EXPECT_TRUE([controller() isBookmarkBarVisible]); |
+ EXPECT_EQ(std::min(GetExpectedTopInfoBarTipHeight(), maxTipHeight), |
+ [[controller() infoBarContainerController] overlappingTipHeight]); |
+ |
+ chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR); |
+ WaitForBookmarkBarAnimationToFinish(); |
+ EXPECT_FALSE([controller() isBookmarkBarVisible]); |
+ EXPECT_EQ(std::min(GetExpectedTopInfoBarTipHeight(), maxTipHeight), |
+ [[controller() infoBarContainerController] overlappingTipHeight]); |
+} |