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

Side by Side Diff: chrome/browser/ui/views/location_bar/zoom_bubble_view.cc

Issue 2834493007: MacViews: Allows the toolkit-views Zoom Dialog to be used (Closed)
Patch Set: MacViews: Allows the toolkit-views Zoom Dialog to be used (tests) Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h" 5 #include "chrome/browser/ui/views/location_bar/zoom_bubble_view.h"
6 6
7 #include "base/i18n/number_formatting.h" 7 #include "base/i18n/number_formatting.h"
8 #include "base/i18n/rtl.h" 8 #include "base/i18n/rtl.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "chrome/browser/chrome_notification_types.h" 10 #include "chrome/browser/chrome_notification_types.h"
11 #include "chrome/browser/platform_util.h"
11 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/browser_finder.h" 13 #include "chrome/browser/ui/browser_finder.h"
13 #include "chrome/browser/ui/browser_tabstrip.h" 14 #include "chrome/browser/ui/browser_tabstrip.h"
14 #include "chrome/browser/ui/browser_window.h" 15 #include "chrome/browser/ui/browser_window.h"
15 #include "chrome/browser/ui/views/frame/browser_view.h"
16 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" 16 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
17 #include "chrome/browser/ui/views/location_bar/zoom_view.h" 17 #include "chrome/browser/ui/views/location_bar/zoom_view.h"
18 #include "chrome/common/extensions/api/extension_action/action_info.h" 18 #include "chrome/common/extensions/api/extension_action/action_info.h"
19 #include "chrome/grit/generated_resources.h" 19 #include "chrome/grit/generated_resources.h"
20 #include "chrome/grit/theme_resources.h" 20 #include "chrome/grit/theme_resources.h"
21 #include "components/zoom/page_zoom.h" 21 #include "components/zoom/page_zoom.h"
22 #include "components/zoom/zoom_controller.h" 22 #include "components/zoom/zoom_controller.h"
23 #include "content/public/browser/notification_source.h" 23 #include "content/public/browser/notification_source.h"
24 #include "extensions/browser/extension_zoom_request_client.h" 24 #include "extensions/browser/extension_zoom_request_client.h"
25 #include "extensions/common/manifest_handlers/icons_handler.h" 25 #include "extensions/common/manifest_handlers/icons_handler.h"
26 #include "ui/base/l10n/l10n_util.h" 26 #include "ui/base/l10n/l10n_util.h"
27 #include "ui/base/material_design/material_design_controller.h" 27 #include "ui/base/material_design/material_design_controller.h"
28 #include "ui/base/resource/resource_bundle.h" 28 #include "ui/base/resource/resource_bundle.h"
29 #include "ui/base/ui_features.h"
29 #include "ui/gfx/favicon_size.h" 30 #include "ui/gfx/favicon_size.h"
30 #include "ui/views/controls/button/image_button.h" 31 #include "ui/views/controls/button/image_button.h"
31 #include "ui/views/controls/button/md_text_button.h" 32 #include "ui/views/controls/button/md_text_button.h"
32 #include "ui/views/controls/separator.h" 33 #include "ui/views/controls/separator.h"
33 #include "ui/views/layout/grid_layout.h" 34 #include "ui/views/layout/grid_layout.h"
34 #include "ui/views/layout/layout_constants.h" 35 #include "ui/views/layout/layout_constants.h"
35 #include "ui/views/widget/widget.h" 36 #include "ui/views/widget/widget.h"
36 37
38 #if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
39 #include "chrome/browser/ui/views/frame/browser_view.h"
40 #endif
41
37 // static 42 // static
38 ZoomBubbleView* ZoomBubbleView::zoom_bubble_ = nullptr; 43 ZoomBubbleView* ZoomBubbleView::zoom_bubble_ = nullptr;
39 44
40 // static 45 // static
41 void ZoomBubbleView::ShowBubble(content::WebContents* web_contents, 46 void ZoomBubbleView::ShowBubble(content::WebContents* web_contents,
47 const gfx::Point& anchor_point,
42 DisplayReason reason) { 48 DisplayReason reason) {
43 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 49 Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
44 DCHECK(browser && browser->window() && 50 DCHECK(browser && browser->window() &&
45 browser->exclusive_access_manager()->fullscreen_controller()); 51 browser->exclusive_access_manager()->fullscreen_controller());
46 52
53 views::View* anchor_view = nullptr;
54 ImmersiveModeController* immersive_mode_controller = nullptr;
55 bool is_fullscreen = browser->window()->IsFullscreen();
56 #if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
47 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); 57 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
48 bool is_fullscreen = browser_view->IsFullscreen();
49 views::View* anchor_view = nullptr;
50 if (!is_fullscreen || 58 if (!is_fullscreen ||
51 browser_view->immersive_mode_controller()->IsRevealed()) { 59 browser_view->immersive_mode_controller()->IsRevealed()) {
52 if (ui::MaterialDesignController::IsSecondaryUiMaterial()) 60 if (ui::MaterialDesignController::IsSecondaryUiMaterial())
53 anchor_view = browser_view->GetLocationBarView(); 61 anchor_view = browser_view->GetLocationBarView();
54 else 62 else
55 anchor_view = browser_view->GetLocationBarView()->zoom_view(); 63 anchor_view = browser_view->GetLocationBarView()->zoom_view();
56 } 64 }
65 immersive_mode_controller = browser_view->immersive_mode_controller();
66 #endif
57 67
58 // Find the extension that initiated the zoom change, if any. 68 // Find the extension that initiated the zoom change, if any.
59 zoom::ZoomController* zoom_controller = 69 zoom::ZoomController* zoom_controller =
60 zoom::ZoomController::FromWebContents(web_contents); 70 zoom::ZoomController::FromWebContents(web_contents);
61 const zoom::ZoomRequestClient* client = zoom_controller->last_client(); 71 const zoom::ZoomRequestClient* client = zoom_controller->last_client();
62 72
63 // If the bubble is already showing in this window and the zoom change was not 73 // If the bubble is already showing in this window and the zoom change was not
64 // initiated by an extension, then the bubble can be reused and only the label 74 // initiated by an extension, then the bubble can be reused and only the label
65 // text needs to be updated. 75 // text needs to be updated.
66 if (zoom_bubble_ && zoom_bubble_->GetAnchorView() == anchor_view && !client) { 76 if (zoom_bubble_ && zoom_bubble_->GetAnchorView() == anchor_view && !client) {
67 DCHECK_EQ(web_contents, zoom_bubble_->web_contents_); 77 DCHECK_EQ(web_contents, zoom_bubble_->web_contents_);
68 zoom_bubble_->Refresh(); 78 zoom_bubble_->Refresh();
69 return; 79 return;
70 } 80 }
71 81
72 // If the bubble is already showing but in a different tab, the current 82 // If the bubble is already showing but in a different tab, the current
73 // bubble must be closed and a new one created. 83 // bubble must be closed and a new one created.
74 CloseCurrentBubble(); 84 CloseCurrentBubble();
75 85
76 zoom_bubble_ = new ZoomBubbleView(anchor_view, web_contents, reason, 86 zoom_bubble_ = new ZoomBubbleView(anchor_view, anchor_point, web_contents,
77 browser_view->immersive_mode_controller()); 87 reason, immersive_mode_controller);
78 88
79 // If the zoom change was initiated by an extension, capture the relevent 89 // If the zoom change was initiated by an extension, capture the relevent
80 // information from it. 90 // information from it.
81 if (client) { 91 if (client) {
82 zoom_bubble_->SetExtensionInfo( 92 zoom_bubble_->SetExtensionInfo(
83 static_cast<const extensions::ExtensionZoomRequestClient*>(client) 93 static_cast<const extensions::ExtensionZoomRequestClient*>(client)
84 ->extension()); 94 ->extension());
85 } 95 }
86 96
97 #if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
87 // If we do not have an anchor view, parent the bubble to the content area. 98 // If we do not have an anchor view, parent the bubble to the content area.
88 if (!anchor_view) 99 if (!anchor_view)
89 zoom_bubble_->set_parent_window(web_contents->GetNativeView()); 100 zoom_bubble_->set_parent_window(web_contents->GetNativeView());
90 101
91 views::Widget* zoom_bubble_widget = 102 views::Widget* zoom_bubble_widget =
92 views::BubbleDialogDelegateView::CreateBubble(zoom_bubble_); 103 views::BubbleDialogDelegateView::CreateBubble(zoom_bubble_);
93 if (anchor_view) { 104 if (anchor_view) {
94 zoom_bubble_widget->AddObserver( 105 zoom_bubble_widget->AddObserver(
95 browser_view->GetLocationBarView()->zoom_view()); 106 browser_view->GetLocationBarView()->zoom_view());
96 } 107 }
108 #else
109 gfx::NativeView parent =
110 platform_util::GetViewForWindow(browser->window()->GetNativeWindow());
111 DCHECK(parent);
112 zoom_bubble_->set_arrow(views::BubbleBorder::TOP_RIGHT);
113 zoom_bubble_->set_parent_window(parent);
114 views::BubbleDialogDelegateView::CreateBubble(zoom_bubble_);
115 #endif
97 116
98 // Adjust for fullscreen after creation as it relies on the content size. 117 // Adjust for fullscreen after creation as it relies on the content size.
99 if (is_fullscreen) 118 if (is_fullscreen)
100 zoom_bubble_->AdjustForFullscreen(browser_view->GetBoundsInScreen()); 119 zoom_bubble_->AdjustForFullscreen(browser->window()->GetBounds());
101 120
102 zoom_bubble_->ShowForReason(reason); 121 zoom_bubble_->ShowForReason(reason);
103 } 122 }
104 123
105 // static 124 // static
106 void ZoomBubbleView::CloseCurrentBubble() { 125 void ZoomBubbleView::CloseCurrentBubble() {
107 if (zoom_bubble_) 126 if (zoom_bubble_)
108 zoom_bubble_->CloseBubble(); 127 zoom_bubble_->CloseBubble();
109 } 128 }
110 129
111 // static 130 // static
112 ZoomBubbleView* ZoomBubbleView::GetZoomBubble() { 131 ZoomBubbleView* ZoomBubbleView::GetZoomBubble() {
113 return zoom_bubble_; 132 return zoom_bubble_;
114 } 133 }
115 134
135 void ZoomBubbleView::Refresh() {
136 zoom::ZoomController* zoom_controller =
137 zoom::ZoomController::FromWebContents(web_contents_);
138 int zoom_percent = zoom_controller->GetZoomPercent();
139 label_->SetText(l10n_util::GetStringFUTF16(
140 IDS_TOOLTIP_ZOOM, base::FormatPercent(zoom_percent)));
141 StartTimerIfNecessary();
142 }
143
116 ZoomBubbleView::ZoomBubbleView( 144 ZoomBubbleView::ZoomBubbleView(
117 views::View* anchor_view, 145 views::View* anchor_view,
146 const gfx::Point& anchor_point,
118 content::WebContents* web_contents, 147 content::WebContents* web_contents,
119 DisplayReason reason, 148 DisplayReason reason,
120 ImmersiveModeController* immersive_mode_controller) 149 ImmersiveModeController* immersive_mode_controller)
121 : LocationBarBubbleDelegateView(anchor_view, web_contents), 150 : LocationBarBubbleDelegateView(anchor_view, anchor_point, web_contents),
122 image_button_(nullptr), 151 image_button_(nullptr),
123 label_(nullptr), 152 label_(nullptr),
124 web_contents_(web_contents), 153 web_contents_(web_contents),
125 auto_close_(reason == AUTOMATIC), 154 auto_close_(reason == AUTOMATIC),
126 immersive_mode_controller_(immersive_mode_controller) { 155 immersive_mode_controller_(immersive_mode_controller) {
127 set_notify_enter_exit_on_child(true); 156 set_notify_enter_exit_on_child(true);
128 immersive_mode_controller_->AddObserver(this); 157 if (immersive_mode_controller_)
158 immersive_mode_controller_->AddObserver(this);
129 UseCompactMargins(); 159 UseCompactMargins();
130 } 160 }
131 161
132 ZoomBubbleView::~ZoomBubbleView() { 162 ZoomBubbleView::~ZoomBubbleView() {
133 if (immersive_mode_controller_) 163 if (immersive_mode_controller_)
134 immersive_mode_controller_->RemoveObserver(this); 164 immersive_mode_controller_->RemoveObserver(this);
135 } 165 }
136 166
137 void ZoomBubbleView::OnGestureEvent(ui::GestureEvent* event) { 167 void ZoomBubbleView::OnGestureEvent(ui::GestureEvent* event) {
138 if (!zoom_bubble_ || !zoom_bubble_->auto_close_ || 168 if (!zoom_bubble_ || !zoom_bubble_->auto_close_ ||
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 &extension_info_.icon_image->image_skia()); 209 &extension_info_.icon_image->image_skia());
180 grid_layout->AddView(image_button_); 210 grid_layout->AddView(image_button_);
181 } 211 }
182 212
183 // Add zoom label with the new zoom percent. 213 // Add zoom label with the new zoom percent.
184 zoom::ZoomController* zoom_controller = 214 zoom::ZoomController* zoom_controller =
185 zoom::ZoomController::FromWebContents(web_contents_); 215 zoom::ZoomController::FromWebContents(web_contents_);
186 int zoom_percent = zoom_controller->GetZoomPercent(); 216 int zoom_percent = zoom_controller->GetZoomPercent();
187 label_ = new views::Label(l10n_util::GetStringFUTF16( 217 label_ = new views::Label(l10n_util::GetStringFUTF16(
188 IDS_TOOLTIP_ZOOM, base::FormatPercent(zoom_percent))); 218 IDS_TOOLTIP_ZOOM, base::FormatPercent(zoom_percent)));
189 label_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 219 label_->SetFontList(GetTitleFontList());
msw 2017/04/24 18:53:39 aside: when updating the bubble appearance in a fo
varkha 2017/04/26 04:52:59 Not sure. The new mocks still show this not above
190 ui::ResourceBundle::MediumFont));
191 grid_layout->AddView(label_); 220 grid_layout->AddView(label_);
192 221
193 // Second row. 222 // Second row.
194 grid_layout->AddPaddingRow(0, 8); 223 grid_layout->AddPaddingRow(0, 8);
195 columns = grid_layout->AddColumnSet(1); 224 columns = grid_layout->AddColumnSet(1);
196 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 225 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
197 views::GridLayout::USE_PREF, 0, 0); 226 views::GridLayout::USE_PREF, 0, 0);
198 grid_layout->StartRow(0, 1); 227 grid_layout->StartRow(0, 1);
199 228
200 // Add "Reset to Default" button. 229 // Add "Reset to Default" button.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 immersive_mode_controller_ = nullptr; 271 immersive_mode_controller_ = nullptr;
243 } 272 }
244 273
245 void ZoomBubbleView::OnExtensionIconImageChanged( 274 void ZoomBubbleView::OnExtensionIconImageChanged(
246 extensions::IconImage* /* image */) { 275 extensions::IconImage* /* image */) {
247 image_button_->SetImage(views::Button::STATE_NORMAL, 276 image_button_->SetImage(views::Button::STATE_NORMAL,
248 &extension_info_.icon_image->image_skia()); 277 &extension_info_.icon_image->image_skia());
249 image_button_->SchedulePaint(); 278 image_button_->SchedulePaint();
250 } 279 }
251 280
252 void ZoomBubbleView::Refresh() {
253 zoom::ZoomController* zoom_controller =
254 zoom::ZoomController::FromWebContents(web_contents_);
255 int zoom_percent = zoom_controller->GetZoomPercent();
256 label_->SetText(l10n_util::GetStringFUTF16(
257 IDS_TOOLTIP_ZOOM, base::FormatPercent(zoom_percent)));
258 StartTimerIfNecessary();
259 }
260
261 void ZoomBubbleView::SetExtensionInfo(const extensions::Extension* extension) { 281 void ZoomBubbleView::SetExtensionInfo(const extensions::Extension* extension) {
262 DCHECK(extension); 282 DCHECK(extension);
263 extension_info_.id = extension->id(); 283 extension_info_.id = extension->id();
264 extension_info_.name = extension->name(); 284 extension_info_.name = extension->name();
265 285
266 ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 286 ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
267 const gfx::ImageSkia& default_extension_icon_image = 287 const gfx::ImageSkia& default_extension_icon_image =
268 *rb.GetImageSkiaNamed(IDR_EXTENSIONS_FAVICON); 288 *rb.GetImageSkiaNamed(IDR_EXTENSIONS_FAVICON);
269 int icon_size = gfx::kFaviconSize; 289 int icon_size = gfx::kFaviconSize;
270 290
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 } 338 }
319 } 339 }
320 340
321 void ZoomBubbleView::StopTimer() { 341 void ZoomBubbleView::StopTimer() {
322 timer_.Stop(); 342 timer_.Stop();
323 } 343 }
324 344
325 ZoomBubbleView::ZoomBubbleExtensionInfo::ZoomBubbleExtensionInfo() {} 345 ZoomBubbleView::ZoomBubbleExtensionInfo::ZoomBubbleExtensionInfo() {}
326 346
327 ZoomBubbleView::ZoomBubbleExtensionInfo::~ZoomBubbleExtensionInfo() {} 347 ZoomBubbleView::ZoomBubbleExtensionInfo::~ZoomBubbleExtensionInfo() {}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698