15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_page_zoom.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/location_bar/zoom_view.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_source.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/separator.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The number of milliseconds the bubble should stay on the screen if it will
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// close automatically.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kBubbleCloseDelay = 1500;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The bubble's padding from the screen edge, used in fullscreen.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kFullscreenPaddingEnd = 20;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ZoomBubbleView* ZoomBubbleView::zoom_bubble_ = NULL;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ZoomBubbleView::ShowBubble(content::WebContents* web_contents,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool auto_close) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(browser && browser->window() && browser->fullscreen_controller());
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_fullscreen = browser_view->IsFullscreen();
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool anchor_to_view = !is_fullscreen ||
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser_view->immersive_mode_controller()->IsRevealed();
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  views::View* anchor_view = anchor_to_view ?
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser_view->GetLocationBarView()->zoom_view() : NULL;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the bubble is already showing in this window and its |auto_close_| value
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is equal to |auto_close|, the bubble can be reused and only the label text
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needs to be updated.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (zoom_bubble_ &&
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      zoom_bubble_->GetAnchorView() == anchor_view &&
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zoom_bubble_->auto_close_ == auto_close) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zoom_bubble_->Refresh();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the bubble is already showing but its |auto_close_| value is not equal
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to |auto_close|, the bubble's focus properties must change, so the
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // current bubble must be closed and a new one created.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseBubble();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    zoom_bubble_ = new ZoomBubbleView(anchor_view,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      web_contents,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      auto_close,
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                      browser_view->immersive_mode_controller(),
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      browser->fullscreen_controller());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // If we do not have an anchor view, parent the bubble to the content area.
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!anchor_to_view) {
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      zoom_bubble_->set_parent_window(web_contents->GetTopLevelNativeWindow());
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::BubbleDelegateView::CreateBubble(zoom_bubble_);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Adjust for fullscreen after creation as it relies on the content size.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (is_fullscreen)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      zoom_bubble_->AdjustForFullscreen(browser_view->GetBoundsInScreen());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (zoom_bubble_->use_focusless())
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      zoom_bubble_->GetWidget()->ShowInactive();
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    else
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      zoom_bubble_->GetWidget()->Show();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::CloseBubble() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (zoom_bubble_)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zoom_bubble_->Close();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ZoomBubbleView::IsShowing() {
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The bubble may be in the process of closing.
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return zoom_bubble_ != NULL && zoom_bubble_->GetWidget()->IsVisible();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst ZoomBubbleView* ZoomBubbleView::GetZoomBubbleForTest() {
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return zoom_bubble_;
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochZoomBubbleView::ZoomBubbleView(
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    views::View* anchor_view,
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* web_contents,
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool auto_close,
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ImmersiveModeController* immersive_mode_controller,
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FullscreenController* fullscreen_controller)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : BubbleDelegateView(anchor_view, anchor_view ?
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          views::BubbleBorder::TOP_RIGHT : views::BubbleBorder::NONE),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      label_(NULL),
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_(web_contents),
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      auto_close_(auto_close),
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      immersive_mode_controller_(immersive_mode_controller) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compensate for built-in vertical padding in the anchor view's image.
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_anchor_view_insets(gfx::Insets(5, 0, 5, 0));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_use_focusless(auto_close);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_notify_enter_exit_on_child(true);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Add observers to close the bubble if the fullscreen state or immersive
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // fullscreen revealed state changes.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_FULLSCREEN_CHANGED,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::Source<FullscreenController>(fullscreen_controller));
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  immersive_mode_controller_->AddObserver(this);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ZoomBubbleView::~ZoomBubbleView() {
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (immersive_mode_controller_)
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    immersive_mode_controller_->RemoveObserver(this);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ZoomBubbleView::AdjustForFullscreen(const gfx::Rect& screen_bounds) {
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (GetAnchorView())
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(dbeam): should RTL logic be done in views::BubbleDelegateView?
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t bubble_half_width = width() / 2;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int x_pos = base::i18n::IsRTL() ?
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_bounds.x() + bubble_half_width + kFullscreenPaddingEnd :
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen_bounds.right() - bubble_half_width - kFullscreenPaddingEnd;
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetAnchorRect(gfx::Rect(x_pos, screen_bounds.y(), 0, 0));
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::Refresh() {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ZoomController* zoom_controller =
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ZoomController::FromWebContents(web_contents_);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int zoom_percent = zoom_controller->zoom_percent();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label_->SetText(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringFUTF16Int(IDS_TOOLTIP_ZOOM, zoom_percent));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartTimerIfNecessary();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::Close() {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->Close();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::StartTimerIfNecessary() {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auto_close_) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (timer_.IsRunning()) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timer_.Reset();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timer_.Start(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeDelta::FromMilliseconds(kBubbleCloseDelay),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          this,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &ZoomBubbleView::Close);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::StopTimer() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timer_.Stop();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::OnMouseEntered(const ui::MouseEvent& event) {
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set_use_focusless(false);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopTimer();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::OnMouseExited(const ui::MouseEvent& event) {
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set_use_focusless(auto_close_);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartTimerIfNecessary();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ZoomBubbleView::OnGestureEvent(ui::GestureEvent* event) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!zoom_bubble_ || !zoom_bubble_->auto_close_ ||
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->type() != ui::ET_GESTURE_TAP) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If an auto-closing bubble was tapped, show a non-auto-closing bubble in
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // its place.
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowBubble(zoom_bubble_->web_contents_, false);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::ButtonPressed(views::Button* sender,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const ui::Event& event) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome_page_zoom::Zoom(web_contents_, content::PAGE_ZOOM_RESET);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::Init() {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, 0, views::kRelatedControlVerticalSpacing));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ZoomController* zoom_controller =
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ZoomController::FromWebContents(web_contents_);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int zoom_percent = zoom_controller->zoom_percent();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label_ = new views::Label(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringFUTF16Int(IDS_TOOLTIP_ZOOM, zoom_percent));
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  label_->SetFontList(
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::ResourceBundle::GetSharedInstance().GetFontList(
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ui::ResourceBundle::MediumFont));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(label_);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  views::LabelButton* set_default_button = new views::LabelButton(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, l10n_util::GetStringUTF16(IDS_ZOOM_SET_DEFAULT));
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  set_default_button->SetStyle(views::Button::STYLE_BUTTON);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_default_button->SetHorizontalAlignment(gfx::ALIGN_CENTER);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(set_default_button);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartTimerIfNecessary();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ZoomBubbleView::Observe(int type,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const content::NotificationSource& source,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const content::NotificationDetails& details) {
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(type, chrome::NOTIFICATION_FULLSCREEN_CHANGED);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloseBubble();
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ZoomBubbleView::OnImmersiveRevealStarted() {
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CloseBubble();
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ZoomBubbleView::OnImmersiveModeControllerDestroyed() {
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  immersive_mode_controller_ = NULL;
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ZoomBubbleView::WindowClosing() {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |zoom_bubble_| can be a new bubble by this point (as Close(); doesn't
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call this right away). Only set to NULL when it's this bubble.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (zoom_bubble_ == this)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zoom_bubble_ = NULL;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
252