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..65b1df2b23019a923a9d7cfe2284cb064b0e7f88 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,23 @@ 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 = |
+ static_cast<const InfoBarCocoa*>( |
+ infoBarController.infobar)->animation(); |
Robert Sesek
2014/08/27 14:59:45
nit: indent +4 more spaces
Malcolm
2014/08/28 01:42:39
Done. thanks!
|
+ return infobarAnimation.is_animating(); |
+ } |
+ return NO; |
+} |
+@end |
+ |
class BrowserWindowControllerTest : public InProcessBrowserTest { |
public: |
BrowserWindowControllerTest() : InProcessBrowserTest() { |
@@ -134,6 +156,64 @@ class BrowserWindowControllerTest : public InProcessBrowserTest { |
return height; |
} |
+ static void CheckTopInfoBarAnimation( |
+ InfoBarContainerController* info_bar_container_controller, |
+ const base::Closure& quit_task) { |
+ if (![info_bar_container_controller isTopInfoBarAnimationRunning]) |
+ quit_task.Run(); |
+ } |
+ |
+ static void CheckBookmarkBarAnimation( |
+ BookmarkBarController* bookmark_bar_controller, |
+ const base::Closure& quit_task) { |
+ if (![bookmark_bar_controller 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* info_bar_container_controller = |
+ [controller() infoBarContainerController]; |
+ CGFloat overlapping_tip_height = |
+ [info_bar_container_controller overlappingTipHeight]; |
+ LocationBarViewMac* location_bar_view = [controller() locationBarBridge]; |
+ NSPoint icon_bottom = location_bar_view->GetPageInfoBubblePoint(); |
+ |
+ NSPoint info_bar_top = NSMakePoint(0, |
+ NSHeight([info_bar_container_controller view].frame) - |
+ overlapping_tip_height); |
+ info_bar_top = [[info_bar_container_controller view] |
+ convertPoint:info_bar_top toView:nil]; |
+ return icon_bottom.y - info_bar_top.y; |
+ } |
+ |
private: |
DISALLOW_COPY_AND_ASSIGN(BrowserWindowControllerTest); |
}; |
@@ -354,3 +434,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 max_tip_height = infobars::InfoBar::kMaximumArrowTargetHeight + |
+ infobars::InfoBar::kSeparatorLineHeight; |
+ |
+ chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR); |
+ WaitForBookmarkBarAnimationToFinish(); |
+ EXPECT_TRUE([controller() isBookmarkBarVisible]); |
+ EXPECT_EQ(std::min(GetExpectedTopInfoBarTipHeight(), max_tip_height), |
+ [[controller() infoBarContainerController] overlappingTipHeight]); |
+ |
+ chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR); |
+ WaitForBookmarkBarAnimationToFinish(); |
+ EXPECT_FALSE([controller() isBookmarkBarVisible]); |
+ EXPECT_EQ(std::min(GetExpectedTopInfoBarTipHeight(), max_tip_height), |
+ [[controller() infoBarContainerController] overlappingTipHeight]); |
+} |