Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(680)

Unified Diff: chrome/browser/ui/views/location_bar/zoom_bubble_view.cc

Issue 16998006: Add handling for immersive fullscreen to the zoom bubble (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix ZoomBubbleBrowserTest.NonImmersiveFullscreen Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
index 7301f6de7cf80eb251c62062e818baa265970edb..76f1c7a4e384ee6d140d5c76c87bc91320a6452f 100644
--- a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
@@ -46,9 +46,11 @@ void ZoomBubbleView::ShowBubble(content::WebContents* web_contents,
DCHECK(browser && browser->window() && browser->fullscreen_controller());
BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
- bool is_fullscreen = browser->window()->IsFullscreen();
- views::View* anchor_view = is_fullscreen ?
- NULL : browser_view->GetLocationBarView()->zoom_view();
+ bool is_fullscreen = browser_view->IsFullscreen();
+ bool anchor_to_view = !is_fullscreen ||
+ browser_view->immersive_mode_controller()->IsRevealed();
+ views::View* anchor_view = anchor_to_view ?
+ browser_view->GetLocationBarView()->zoom_view() : NULL;
// If the bubble is already showing in this window and its |auto_close_| value
// is equal to |auto_close|, the bubble can be reused and only the label text
@@ -66,11 +68,11 @@ void ZoomBubbleView::ShowBubble(content::WebContents* web_contents,
zoom_bubble_ = new ZoomBubbleView(anchor_view,
web_contents,
auto_close,
+ browser_view->immersive_mode_controller(),
browser->fullscreen_controller());
- // If we're fullscreen, there is no anchor view, so parent the bubble to
- // the content area.
- if (is_fullscreen) {
+ // If we do not have an anchor view, parent the bubble to the content area.
+ if (!anchor_to_view) {
zoom_bubble_->set_parent_window(
web_contents->GetView()->GetTopLevelNativeWindow());
}
@@ -93,33 +95,58 @@ void ZoomBubbleView::CloseBubble() {
// static
bool ZoomBubbleView::IsShowing() {
- return zoom_bubble_ != NULL;
+ // The bubble may be in the process of closing.
+ return zoom_bubble_ != NULL && zoom_bubble_->GetWidget()->IsVisible();
}
-ZoomBubbleView::ZoomBubbleView(views::View* anchor_view,
- content::WebContents* web_contents,
- bool auto_close,
- FullscreenController* fullscreen_controller)
+// static
+const ZoomBubbleView* ZoomBubbleView::GetZoomBubbleForTest() {
+ return zoom_bubble_;
+}
+
+ZoomBubbleView::ZoomBubbleView(
+ views::View* anchor_view,
+ content::WebContents* web_contents,
+ bool auto_close,
+ ImmersiveModeController* immersive_mode_controller,
+ FullscreenController* fullscreen_controller)
: BubbleDelegateView(anchor_view, anchor_view ?
views::BubbleBorder::TOP_RIGHT : views::BubbleBorder::NONE),
label_(NULL),
web_contents_(web_contents),
- auto_close_(auto_close) {
+ auto_close_(auto_close),
+ immersive_mode_controller_(immersive_mode_controller) {
// Compensate for built-in vertical padding in the anchor view's image.
set_anchor_view_insets(gfx::Insets(5, 0, 5, 0));
set_use_focusless(auto_close);
set_notify_enter_exit_on_child(true);
+ if (anchor_view) {
+ // If we are in immersive fullscreen and the top-of-window views are
+ // already revealed, lock the top-of-window views in the revealed state
+ // as long as the zoom bubble is visible. ImmersiveModeController does
+ // not do this for us automatically because the zoom bubble is not
+ // activatable.
+ immersive_reveal_lock_.reset(immersive_mode_controller_->GetRevealedLock(
+ ImmersiveModeController::ANIMATE_REVEAL_NO));
+ }
+
+ // Add observers to close the bubble if the fullscreen state or immersive
+ // fullscreen revealed state changes.
registrar_.Add(this,
chrome::NOTIFICATION_FULLSCREEN_CHANGED,
content::Source<FullscreenController>(fullscreen_controller));
+ immersive_mode_controller_->AddObserver(this);
}
ZoomBubbleView::~ZoomBubbleView() {
+ if (immersive_mode_controller_)
+ immersive_mode_controller_->RemoveObserver(this);
}
void ZoomBubbleView::AdjustForFullscreen(const gfx::Rect& screen_bounds) {
- DCHECK(!anchor_view());
+ if (anchor_view())
+ return;
// TODO(dbeam): should RTL logic be done in views::BubbleDelegateView?
const size_t bubble_half_width = width() / 2;
@@ -218,6 +245,14 @@ void ZoomBubbleView::Observe(int type,
CloseBubble();
}
+void ZoomBubbleView::OnImmersiveRevealStarted() {
+ CloseBubble();
+}
+
+void ZoomBubbleView::OnImmersiveModeControllerDestroyed() {
+ immersive_mode_controller_ = NULL;
+}
+
void ZoomBubbleView::WindowClosing() {
// |zoom_bubble_| can be a new bubble by this point (as Close(); doesn't
// call this right away). Only set to NULL when it's this bubble.

Powered by Google App Engine
This is Rietveld 408576698