1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser_commands.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/fullscreen/fullscreen_controller_test.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/views/frame/browser_view.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/test/base/in_process_browser_test.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/test/base/ui_test_utils.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)typedef InProcessBrowserTest ZoomBubbleBrowserTest;
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// TODO(linux_aura) http://crbug.com/163931
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_NonImmersiveFullscreen DISABLED_NonImmersiveFullscreen
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_NonImmersiveFullscreen NonImmersiveFullscreen
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test whether the zoom bubble is anchored and whether it is visible when in
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// non-immersive fullscreen.
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(ZoomBubbleBrowserTest, MAYBE_NonImmersiveFullscreen) {
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::WebContents* web_contents = browser_view->GetActiveWebContents();
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The zoom bubble should be anchored when not in fullscreen.
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ZoomBubbleView::ShowBubble(web_contents, true);
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(ZoomBubbleView::IsShowing());
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const ZoomBubbleView* zoom_bubble = ZoomBubbleView::GetZoomBubbleForTest();
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(zoom_bubble->GetAnchorView());
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Entering fullscreen should close the bubble. (We enter into tab fullscreen
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // here because tab fullscreen is non-immersive even on Chrome OS.)
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously. Wait for the
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // notification before testing the zoom bubble visibility.
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FullscreenNotificationObserver> waiter(
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new FullscreenNotificationObserver());
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        web_contents, true);
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    waiter->Wait();
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_FALSE(browser_view->immersive_mode_controller()->IsEnabled());
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(ZoomBubbleView::IsShowing());
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The bubble should not be anchored when it is shown in non-immersive
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // fullscreen.
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ZoomBubbleView::ShowBubble(web_contents, true);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(ZoomBubbleView::IsShowing());
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  zoom_bubble = ZoomBubbleView::GetZoomBubbleForTest();
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(zoom_bubble->GetAnchorView());
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Exit fullscreen before ending the test for the sake of sanity.
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FullscreenNotificationObserver> waiter(
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new FullscreenNotificationObserver());
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::ToggleFullscreenMode(browser());
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    waiter->Wait();
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// TODO(zturner): Change this to USE_ASH after fixing the test on Windows.
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS)
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test whether the zoom bubble is anchored and whether it is visible when in
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// immersive fullscreen.
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(ZoomBubbleBrowserTest, ImmersiveFullscreen) {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::WebContents* web_contents = browser_view->GetActiveWebContents();
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ImmersiveModeController* immersive_controller =
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      browser_view->immersive_mode_controller();
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  immersive_controller->SetupForTest();
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Enter immersive fullscreen.
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FullscreenNotificationObserver> waiter(
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new FullscreenNotificationObserver());
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::ToggleFullscreenMode(browser());
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    waiter->Wait();
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(immersive_controller->IsEnabled());
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_FALSE(immersive_controller->IsRevealed());
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The zoom bubble should not be anchored when it is shown in immersive
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // fullscreen and the top-of-window views are not revealed.
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ZoomBubbleView::ShowBubble(web_contents, true);
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(ZoomBubbleView::IsShowing());
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const ZoomBubbleView* zoom_bubble = ZoomBubbleView::GetZoomBubbleForTest();
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(zoom_bubble->GetAnchorView());
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // An immersive reveal should hide the zoom bubble.
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<ImmersiveRevealedLock> immersive_reveal_lock(
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      immersive_controller->GetRevealedLock(
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          ImmersiveModeController::ANIMATE_REVEAL_NO));
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(immersive_controller->IsRevealed());
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(ZoomBubbleView::IsShowing());
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The zoom bubble should be anchored when it is shown in immersive fullscreen
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // and the top-of-window views are revealed.
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ZoomBubbleView::ShowBubble(web_contents, true);
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(ZoomBubbleView::IsShowing());
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  zoom_bubble = ZoomBubbleView::GetZoomBubbleForTest();
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(zoom_bubble->GetAnchorView());
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The top-of-window views should not hide till the zoom bubble hides. (It
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // would be weird if the view to which the zoom bubble is anchored hid while
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the zoom bubble was still visible.)
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  immersive_reveal_lock.reset();
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(immersive_controller->IsRevealed());
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ZoomBubbleView::CloseBubble();
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The zoom bubble is deleted on a task.
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::RunAllPendingInMessageLoop();
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(immersive_controller->IsRevealed());
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Exit fullscreen before ending the test for the sake of sanity.
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<FullscreenNotificationObserver> waiter(
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new FullscreenNotificationObserver());
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::ToggleFullscreenMode(browser());
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    waiter->Wait();
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // OS_CHROMEOS
127