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