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