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

Side by Side Diff: chrome/browser/ui/views/website_settings/permissions_bubble_view.cc

Issue 1935993004: MacViews: support Views permission bubble (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix typo in chrome_browser_ui.gypi Created 4 years, 7 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/website_settings/permissions_bubble_view.h" 5 #include "chrome/browser/ui/views/website_settings/permissions_bubble_view.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/strings/string16.h" 11 #include "base/strings/string16.h"
12 #include "chrome/browser/platform_util.h"
12 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/browser_window.h"
14 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h" 16 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h"
15 #include "chrome/browser/ui/views/frame/browser_view.h"
16 #include "chrome/browser/ui/views/frame/top_container_view.h"
17 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
18 #include "chrome/browser/ui/views/location_bar/location_icon_view.h"
19 #include "chrome/browser/ui/views/website_settings/permission_selector_view.h" 17 #include "chrome/browser/ui/views/website_settings/permission_selector_view.h"
20 #include "chrome/browser/ui/views/website_settings/permission_selector_view_obse rver.h" 18 #include "chrome/browser/ui/views/website_settings/permission_selector_view_obse rver.h"
21 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" 19 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
22 #include "chrome/grit/generated_resources.h" 20 #include "chrome/grit/generated_resources.h"
23 #include "components/url_formatter/elide_url.h" 21 #include "components/url_formatter/elide_url.h"
24 #include "grit/components_strings.h" 22 #include "grit/components_strings.h"
25 #include "ui/accessibility/ax_view_state.h" 23 #include "ui/accessibility/ax_view_state.h"
26 #include "ui/base/l10n/l10n_util.h" 24 #include "ui/base/l10n/l10n_util.h"
27 #include "ui/base/models/combobox_model.h" 25 #include "ui/base/models/combobox_model.h"
28 #include "ui/base/resource/resource_bundle.h" 26 #include "ui/base/resource/resource_bundle.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 index_, permission.setting == CONTENT_SETTING_ALLOW); 139 index_, permission.setting == CONTENT_SETTING_ALLOW);
142 } 140 }
143 141
144 /////////////////////////////////////////////////////////////////////////////// 142 ///////////////////////////////////////////////////////////////////////////////
145 // View implementation for the permissions bubble. 143 // View implementation for the permissions bubble.
146 class PermissionsBubbleDialogDelegateView 144 class PermissionsBubbleDialogDelegateView
147 : public views::BubbleDialogDelegateView, 145 : public views::BubbleDialogDelegateView,
148 public PermissionCombobox::Listener { 146 public PermissionCombobox::Listener {
149 public: 147 public:
150 PermissionsBubbleDialogDelegateView( 148 PermissionsBubbleDialogDelegateView(
151 views::View* anchor_view,
152 views::BubbleBorder::Arrow anchor_arrow,
153 PermissionBubbleViewViews* owner, 149 PermissionBubbleViewViews* owner,
154 const std::vector<PermissionBubbleRequest*>& requests, 150 const std::vector<PermissionBubbleRequest*>& requests,
155 const std::vector<bool>& accept_state); 151 const std::vector<bool>& accept_state);
156 ~PermissionsBubbleDialogDelegateView() override; 152 ~PermissionsBubbleDialogDelegateView() override;
157 153
158 void CloseBubble(); 154 void CloseBubble();
159 void SizeToContents(); 155 void SizeToContents();
160 156
161 // BubbleDialogDelegateView: 157 // BubbleDialogDelegateView:
162 bool ShouldShowCloseButton() const override; 158 bool ShouldShowCloseButton() const override;
163 const gfx::FontList& GetTitleFontList() const override; 159 const gfx::FontList& GetTitleFontList() const override;
164 base::string16 GetWindowTitle() const override; 160 base::string16 GetWindowTitle() const override;
165 void OnWidgetDestroying(views::Widget* widget) override; 161 void OnWidgetDestroying(views::Widget* widget) override;
166 gfx::Size GetPreferredSize() const override; 162 gfx::Size GetPreferredSize() const override;
167 void GetAccessibleState(ui::AXViewState* state) override; 163 void GetAccessibleState(ui::AXViewState* state) override;
168 bool Cancel() override; 164 bool Cancel() override;
169 bool Accept() override; 165 bool Accept() override;
170 bool Close() override; 166 bool Close() override;
171 int GetDialogButtons() const override; 167 int GetDialogButtons() const override;
172 base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; 168 base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
173 169
174 // PermissionCombobox::Listener: 170 // PermissionCombobox::Listener:
175 void PermissionSelectionChanged(int index, bool allowed) override; 171 void PermissionSelectionChanged(int index, bool allowed) override;
176 172
177 // Updates the anchor's arrow and view. Also repositions the bubble so it's 173 // Updates the anchor's arrow and view. Also repositions the bubble so it's
178 // displayed in the correct location. 174 // displayed in the correct location.
179 void UpdateAnchor(views::View* anchor_view, 175 void UpdateAnchor(views::View* anchor_view,
176 const gfx::Point& anchor_point,
180 views::BubbleBorder::Arrow anchor_arrow); 177 views::BubbleBorder::Arrow anchor_arrow);
181 178
182 private: 179 private:
183 PermissionBubbleViewViews* owner_; 180 PermissionBubbleViewViews* owner_;
184 bool multiple_requests_; 181 bool multiple_requests_;
185 base::string16 display_origin_; 182 base::string16 display_origin_;
186 std::unique_ptr<PermissionMenuModel> menu_button_model_; 183 std::unique_ptr<PermissionMenuModel> menu_button_model_;
187 std::vector<PermissionCombobox*> customize_comboboxes_; 184 std::vector<PermissionCombobox*> customize_comboboxes_;
188 185
189 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDialogDelegateView); 186 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDialogDelegateView);
190 }; 187 };
191 188
192 PermissionsBubbleDialogDelegateView::PermissionsBubbleDialogDelegateView( 189 PermissionsBubbleDialogDelegateView::PermissionsBubbleDialogDelegateView(
193 views::View* anchor_view,
194 views::BubbleBorder::Arrow anchor_arrow,
195 PermissionBubbleViewViews* owner, 190 PermissionBubbleViewViews* owner,
196 const std::vector<PermissionBubbleRequest*>& requests, 191 const std::vector<PermissionBubbleRequest*>& requests,
197 const std::vector<bool>& accept_state) 192 const std::vector<bool>& accept_state)
198 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow), 193 : owner_(owner),
199 owner_(owner),
200 multiple_requests_(requests.size() > 1) { 194 multiple_requests_(requests.size() > 1) {
201 DCHECK(!requests.empty()); 195 DCHECK(!requests.empty());
202 196
203 set_close_on_deactivate(false); 197 set_close_on_deactivate(false);
204 198
205 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 199 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0,
206 kItemMajorSpacing)); 200 kItemMajorSpacing));
207 201
208 display_origin_ = url_formatter::FormatUrlForSecurityDisplay( 202 display_origin_ = url_formatter::FormatUrlForSecurityDisplay(
209 requests[0]->GetOrigin(), 203 requests[0]->GetOrigin(),
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 } 340 }
347 341
348 void PermissionsBubbleDialogDelegateView::PermissionSelectionChanged( 342 void PermissionsBubbleDialogDelegateView::PermissionSelectionChanged(
349 int index, 343 int index,
350 bool allowed) { 344 bool allowed) {
351 owner_->Toggle(index, allowed); 345 owner_->Toggle(index, allowed);
352 } 346 }
353 347
354 void PermissionsBubbleDialogDelegateView::UpdateAnchor( 348 void PermissionsBubbleDialogDelegateView::UpdateAnchor(
355 views::View* anchor_view, 349 views::View* anchor_view,
350 const gfx::Point& anchor_point,
356 views::BubbleBorder::Arrow anchor_arrow) { 351 views::BubbleBorder::Arrow anchor_arrow) {
357 if (GetAnchorView() == anchor_view && arrow() == anchor_arrow)
358 return;
359
360 set_arrow(anchor_arrow); 352 set_arrow(anchor_arrow);
361 353
362 // Update the border in the bubble: will either add or remove the arrow. 354 // Update the border in the bubble: will either add or remove the arrow.
363 views::BubbleFrameView* frame = 355 views::BubbleFrameView* frame =
364 views::BubbleDialogDelegateView::GetBubbleFrameView(); 356 views::BubbleDialogDelegateView::GetBubbleFrameView();
365 views::BubbleBorder::Arrow adjusted_arrow = anchor_arrow; 357 views::BubbleBorder::Arrow adjusted_arrow = anchor_arrow;
366 if (base::i18n::IsRTL()) 358 if (base::i18n::IsRTL())
367 adjusted_arrow = views::BubbleBorder::horizontal_mirror(adjusted_arrow); 359 adjusted_arrow = views::BubbleBorder::horizontal_mirror(adjusted_arrow);
368 frame->SetBubbleBorder(std::unique_ptr<views::BubbleBorder>( 360 frame->SetBubbleBorder(std::unique_ptr<views::BubbleBorder>(
369 new views::BubbleBorder(adjusted_arrow, shadow(), color()))); 361 new views::BubbleBorder(adjusted_arrow, shadow(), color())));
370 362
371 // Reposition the bubble based on the updated arrow and view. 363 // Reposition the bubble based on the updated arrow and view.
372 SetAnchorView(anchor_view); 364 if (anchor_view)
365 SetAnchorView(anchor_view);
366 else
367 SetAnchorRect(gfx::Rect(anchor_point, gfx::Size()));
373 } 368 }
374 369
375 ////////////////////////////////////////////////////////////////////////////// 370 //////////////////////////////////////////////////////////////////////////////
376 // PermissionBubbleViewViews 371 // PermissionBubbleViewViews
377 372
378 PermissionBubbleViewViews::PermissionBubbleViewViews(Browser* browser) 373 PermissionBubbleViewViews::PermissionBubbleViewViews(Browser* browser)
379 : browser_(browser), 374 : browser_(browser),
380 delegate_(nullptr), 375 delegate_(nullptr),
381 bubble_delegate_(nullptr) { 376 bubble_delegate_(nullptr) {
382 DCHECK(browser); 377 DCHECK(browser);
378 DCHECK(browser->window());
383 } 379 }
384 380
385 PermissionBubbleViewViews::~PermissionBubbleViewViews() { 381 PermissionBubbleViewViews::~PermissionBubbleViewViews() {
386 } 382 }
387 383
388 // static
389 std::unique_ptr<PermissionBubbleView> PermissionBubbleView::Create(
390 Browser* browser) {
391 return base::WrapUnique(new PermissionBubbleViewViews(browser));
392 }
393
394 views::View* PermissionBubbleViewViews::GetAnchorView() {
395 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_);
396
397 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
398 return browser_view->GetLocationBarView()->location_icon_view();
399
400 if (browser_view->IsFullscreenBubbleVisible())
401 return browser_view->exclusive_access_bubble()->GetView();
402
403 return browser_view->top_container();
404 }
405
406 views::BubbleBorder::Arrow PermissionBubbleViewViews::GetAnchorArrow() {
407 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
408 return views::BubbleBorder::TOP_LEFT;
409 return views::BubbleBorder::NONE;
410 }
411
412 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { 384 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) {
413 delegate_ = delegate; 385 delegate_ = delegate;
414 } 386 }
415 387
416 void PermissionBubbleViewViews::Show( 388 void PermissionBubbleViewViews::Show(
417 const std::vector<PermissionBubbleRequest*>& requests, 389 const std::vector<PermissionBubbleRequest*>& requests,
418 const std::vector<bool>& values) { 390 const std::vector<bool>& values) {
419 if (bubble_delegate_) 391 if (bubble_delegate_)
420 bubble_delegate_->CloseBubble(); 392 bubble_delegate_->CloseBubble();
421 393
422 bubble_delegate_ = new PermissionsBubbleDialogDelegateView( 394 bubble_delegate_ = new PermissionsBubbleDialogDelegateView(
423 GetAnchorView(), GetAnchorArrow(), this, requests, values); 395 this, requests, values);
424 396
425 // Set |parent_window| because some valid anchors can become hidden. 397 // Set |parent_window| because some valid anchors can become hidden.
426 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( 398 bubble_delegate_->set_parent_window(
427 browser_->window()->GetNativeWindow()); 399 platform_util::GetViewForWindow(browser_->window()->GetNativeWindow()));
428 bubble_delegate_->set_parent_window(widget->GetNativeView());
429 400
430 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_)->Show(); 401 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_)->Show();
431 bubble_delegate_->SizeToContents(); 402 bubble_delegate_->SizeToContents();
403
404 bubble_delegate_->UpdateAnchor(GetAnchorView(),
405 GetAnchorPoint(),
406 GetAnchorArrow());
432 } 407 }
433 408
434 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() { 409 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() {
435 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); 410 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered());
436 } 411 }
437 412
438 void PermissionBubbleViewViews::Hide() { 413 void PermissionBubbleViewViews::Hide() {
439 if (bubble_delegate_) { 414 if (bubble_delegate_) {
440 bubble_delegate_->CloseBubble(); 415 bubble_delegate_->CloseBubble();
441 bubble_delegate_ = nullptr; 416 bubble_delegate_ = nullptr;
442 } 417 }
443 } 418 }
444 419
445 bool PermissionBubbleViewViews::IsVisible() { 420 bool PermissionBubbleViewViews::IsVisible() {
446 return bubble_delegate_ != nullptr; 421 return bubble_delegate_ != nullptr;
447 } 422 }
448 423
449 void PermissionBubbleViewViews::UpdateAnchorPosition() { 424 void PermissionBubbleViewViews::UpdateAnchorPosition() {
450 if (IsVisible()) 425 if (IsVisible()) {
451 bubble_delegate_->UpdateAnchor(GetAnchorView(), GetAnchorArrow()); 426 bubble_delegate_->set_parent_window(
427 platform_util::GetViewForWindow(browser_->window()->GetNativeWindow()));
428 bubble_delegate_->UpdateAnchor(GetAnchorView(),
429 GetAnchorPoint(),
430 GetAnchorArrow());
431 }
452 } 432 }
453 433
454 gfx::NativeWindow PermissionBubbleViewViews::GetNativeWindow() { 434 gfx::NativeWindow PermissionBubbleViewViews::GetNativeWindow() {
455 if (bubble_delegate_ && bubble_delegate_->GetWidget()) 435 if (bubble_delegate_ && bubble_delegate_->GetWidget())
456 return bubble_delegate_->GetWidget()->GetNativeWindow(); 436 return bubble_delegate_->GetWidget()->GetNativeWindow();
457 return nullptr; 437 return nullptr;
458 } 438 }
459 439
460 void PermissionBubbleViewViews::Closing() { 440 void PermissionBubbleViewViews::Closing() {
461 if (bubble_delegate_) 441 if (bubble_delegate_)
462 bubble_delegate_ = nullptr; 442 bubble_delegate_ = nullptr;
463 if (delegate_) 443 if (delegate_)
464 delegate_->Closing(); 444 delegate_->Closing();
465 } 445 }
466 446
467 void PermissionBubbleViewViews::Toggle(int index, bool value) { 447 void PermissionBubbleViewViews::Toggle(int index, bool value) {
468 if (delegate_) 448 if (delegate_)
469 delegate_->ToggleAccept(index, value); 449 delegate_->ToggleAccept(index, value);
470 } 450 }
471 451
472 void PermissionBubbleViewViews::Accept() { 452 void PermissionBubbleViewViews::Accept() {
473 if (delegate_) 453 if (delegate_)
474 delegate_->Accept(); 454 delegate_->Accept();
475 } 455 }
476 456
477 void PermissionBubbleViewViews::Deny() { 457 void PermissionBubbleViewViews::Deny() {
478 if (delegate_) 458 if (delegate_)
479 delegate_->Deny(); 459 delegate_->Deny();
480 } 460 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698