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

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: 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/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/browser.h" 13 #include "chrome/browser/ui/browser.h"
14 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h" 14 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h"
15 #include "chrome/browser/ui/views/frame/browser_view.h" 15 #include "chrome/browser/ui/views/frame/browser_view.h"
tapted 2016/05/03 12:02:38 none of browser_view.h top_container_view.h locati
Elly Fong-Jones 2016/05/10 21:21:02 Done.
16 #include "chrome/browser/ui/views/frame/top_container_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" 17 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
18 #include "chrome/browser/ui/views/location_bar/location_icon_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" 19 #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" 20 #include "chrome/browser/ui/views/website_settings/permission_selector_view_obse rver.h"
21 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" 21 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
22 #include "chrome/grit/generated_resources.h" 22 #include "chrome/grit/generated_resources.h"
23 #include "components/url_formatter/elide_url.h" 23 #include "components/url_formatter/elide_url.h"
24 #include "grit/components_strings.h" 24 #include "grit/components_strings.h"
25 #include "ui/accessibility/ax_view_state.h" 25 #include "ui/accessibility/ax_view_state.h"
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 } 142 }
143 143
144 /////////////////////////////////////////////////////////////////////////////// 144 ///////////////////////////////////////////////////////////////////////////////
145 // View implementation for the permissions bubble. 145 // View implementation for the permissions bubble.
146 class PermissionsBubbleDialogDelegateView 146 class PermissionsBubbleDialogDelegateView
147 : public views::BubbleDialogDelegateView, 147 : public views::BubbleDialogDelegateView,
148 public PermissionCombobox::Listener { 148 public PermissionCombobox::Listener {
149 public: 149 public:
150 PermissionsBubbleDialogDelegateView( 150 PermissionsBubbleDialogDelegateView(
151 views::View* anchor_view, 151 views::View* anchor_view,
152 gfx::Point anchor_point,
tapted 2016/05/03 12:02:38 nit: const reference
Elly Fong-Jones 2016/05/10 21:21:02 Done.
152 views::BubbleBorder::Arrow anchor_arrow, 153 views::BubbleBorder::Arrow anchor_arrow,
153 PermissionBubbleViewViews* owner, 154 PermissionBubbleViewViews* owner,
154 const std::vector<PermissionBubbleRequest*>& requests, 155 const std::vector<PermissionBubbleRequest*>& requests,
155 const std::vector<bool>& accept_state); 156 const std::vector<bool>& accept_state);
156 ~PermissionsBubbleDialogDelegateView() override; 157 ~PermissionsBubbleDialogDelegateView() override;
157 158
158 void CloseBubble(); 159 void CloseBubble();
159 void SizeToContents(); 160 void SizeToContents();
160 161
161 // BubbleDialogDelegateView: 162 // BubbleDialogDelegateView:
(...skipping 22 matching lines...) Expand all
184 bool multiple_requests_; 185 bool multiple_requests_;
185 base::string16 display_origin_; 186 base::string16 display_origin_;
186 std::unique_ptr<PermissionMenuModel> menu_button_model_; 187 std::unique_ptr<PermissionMenuModel> menu_button_model_;
187 std::vector<PermissionCombobox*> customize_comboboxes_; 188 std::vector<PermissionCombobox*> customize_comboboxes_;
188 189
189 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDialogDelegateView); 190 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDialogDelegateView);
190 }; 191 };
191 192
192 PermissionsBubbleDialogDelegateView::PermissionsBubbleDialogDelegateView( 193 PermissionsBubbleDialogDelegateView::PermissionsBubbleDialogDelegateView(
193 views::View* anchor_view, 194 views::View* anchor_view,
195 gfx::Point anchor_point,
194 views::BubbleBorder::Arrow anchor_arrow, 196 views::BubbleBorder::Arrow anchor_arrow,
195 PermissionBubbleViewViews* owner, 197 PermissionBubbleViewViews* owner,
196 const std::vector<PermissionBubbleRequest*>& requests, 198 const std::vector<PermissionBubbleRequest*>& requests,
197 const std::vector<bool>& accept_state) 199 const std::vector<bool>& accept_state)
198 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow), 200 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow),
199 owner_(owner), 201 owner_(owner),
200 multiple_requests_(requests.size() > 1) { 202 multiple_requests_(requests.size() > 1) {
201 DCHECK(!requests.empty()); 203 DCHECK(!requests.empty());
202 204
205 if (!anchor_view)
206 SetAnchorRect(gfx::Rect(anchor_point, gfx::Size()));
tapted 2016/05/03 12:02:38 (see later comment about UpdateAnchor() -- it migh
Elly Fong-Jones 2016/05/10 21:21:02 It's not safe to call UpdateAnchor() yet at this p
tapted 2016/05/11 07:06:18 Sorry, I meant, instead of bubble_delegate_ = ne
207
203 set_close_on_deactivate(false); 208 set_close_on_deactivate(false);
204 209
205 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 210 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0,
206 kItemMajorSpacing)); 211 kItemMajorSpacing));
207 212
208 display_origin_ = url_formatter::FormatUrlForSecurityDisplay( 213 display_origin_ = url_formatter::FormatUrlForSecurityDisplay(
209 requests[0]->GetOrigin(), 214 requests[0]->GetOrigin(),
210 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); 215 url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC);
211 216
212 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 217 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 frame->SetBubbleBorder(std::unique_ptr<views::BubbleBorder>( 373 frame->SetBubbleBorder(std::unique_ptr<views::BubbleBorder>(
369 new views::BubbleBorder(adjusted_arrow, shadow(), color()))); 374 new views::BubbleBorder(adjusted_arrow, shadow(), color())));
370 375
371 // Reposition the bubble based on the updated arrow and view. 376 // Reposition the bubble based on the updated arrow and view.
372 SetAnchorView(anchor_view); 377 SetAnchorView(anchor_view);
373 } 378 }
374 379
375 ////////////////////////////////////////////////////////////////////////////// 380 //////////////////////////////////////////////////////////////////////////////
376 // PermissionBubbleViewViews 381 // PermissionBubbleViewViews
377 382
378 PermissionBubbleViewViews::PermissionBubbleViewViews(Browser* browser) 383 PermissionBubbleViewViews::PermissionBubbleViewViews(
384 Browser* browser,
385 std::unique_ptr<AnchorDelegate> anchor_delegate)
379 : browser_(browser), 386 : browser_(browser),
380 delegate_(nullptr), 387 delegate_(nullptr),
381 bubble_delegate_(nullptr) { 388 bubble_delegate_(nullptr),
389 anchor_delegate_(std::move(anchor_delegate)) {
382 DCHECK(browser); 390 DCHECK(browser);
391 DCHECK(browser->window());
383 } 392 }
384 393
385 PermissionBubbleViewViews::~PermissionBubbleViewViews() { 394 PermissionBubbleViewViews::~PermissionBubbleViewViews() {
386 } 395 }
387 396
388 // static 397 // On Mac, there is a separate Cocoa-specific definition of this function.
389 std::unique_ptr<PermissionBubbleView> PermissionBubbleView::Create( 398 #if !defined(OS_MACOSX)
tapted 2016/05/03 12:02:39 This approach won't work with the mac_views_browse
Elly Fong-Jones 2016/05/10 21:21:02 Done. I moved this class, and the CreateAnchorDel
390 Browser* browser) { 399 class ViewAnchorDelegate : public PermissionBubbleViewViews::AnchorDelegate {
tapted 2016/05/03 12:02:38 Perhaps ViewsBrowserAnchorDelegate? It should hav
Elly Fong-Jones 2016/05/10 21:21:02 Done.
391 return base::WrapUnique(new PermissionBubbleViewViews(browser)); 400 public:
392 } 401 explicit ViewAnchorDelegate(Browser* browser);
402 ~ViewAnchorDelegate() override;
403 views::View* GetAnchorView() override;
tapted 2016/05/03 12:02:38 nit: // AnchorDelegate:
Elly Fong-Jones 2016/05/10 21:21:02 Done.
404 gfx::Point GetAnchorPoint() override;
405 gfx::NativeView GetParentView() override;
393 406
394 views::View* PermissionBubbleViewViews::GetAnchorView() { 407 private:
408 Browser* browser_;
409 };
tapted 2016/05/03 12:02:38 nit: DISALLOW_COPY_AND_ASSIGN(..)
Elly Fong-Jones 2016/05/10 21:21:02 Done.
410
411 ViewAnchorDelegate::ViewAnchorDelegate(Browser* browser) : browser_(browser) {}
412
413 ViewAnchorDelegate::~ViewAnchorDelegate() {}
414
415 views::View* ViewAnchorDelegate::GetAnchorView() {
395 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); 416 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_);
396 417
397 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) 418 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
398 return browser_view->GetLocationBarView()->location_icon_view(); 419 return browser_view->GetLocationBarView()->location_icon_view();
399 420
400 if (browser_view->IsFullscreenBubbleVisible()) 421 if (browser_view->IsFullscreenBubbleVisible())
401 return browser_view->exclusive_access_bubble()->GetView(); 422 return browser_view->exclusive_access_bubble()->GetView();
402 423
403 return browser_view->top_container(); 424 return browser_view->top_container();
404 } 425 }
405 426
427 gfx::Point ViewAnchorDelegate::GetAnchorPoint() {
428 return gfx::Point();
429 }
430
431 gfx::NativeView ViewAnchorDelegate::GetParentView() {
432 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
433 browser_->window()->GetNativeWindow());
434 return widget->GetNativeView();
435 }
436
437 // static
438 std::unique_ptr<PermissionBubbleView> PermissionBubbleView::Create(
439 Browser* browser) {
440 unique_ptr<ViewAnchorDelegate> anchor_delegate(browser);
441 return base::WrapUnique(
442 new PermissionBubbleViewViews(browser, std::move(anchor_delegate)));
443 }
444
445 #endif
446
447 views::View* PermissionBubbleViewViews::GetAnchorView() {
448 return anchor_delegate_->GetAnchorView();
449 }
450
451 gfx::Point PermissionBubbleViewViews::GetAnchorPoint() {
452 return anchor_delegate_->GetAnchorPoint();
453 }
454
406 views::BubbleBorder::Arrow PermissionBubbleViewViews::GetAnchorArrow() { 455 views::BubbleBorder::Arrow PermissionBubbleViewViews::GetAnchorArrow() {
407 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) 456 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
408 return views::BubbleBorder::TOP_LEFT; 457 return views::BubbleBorder::TOP_LEFT;
409 return views::BubbleBorder::NONE; 458 return views::BubbleBorder::NONE;
410 } 459 }
411 460
412 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { 461 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) {
413 delegate_ = delegate; 462 delegate_ = delegate;
414 } 463 }
415 464
416 void PermissionBubbleViewViews::Show( 465 void PermissionBubbleViewViews::Show(
417 const std::vector<PermissionBubbleRequest*>& requests, 466 const std::vector<PermissionBubbleRequest*>& requests,
418 const std::vector<bool>& values) { 467 const std::vector<bool>& values) {
419 if (bubble_delegate_) 468 if (bubble_delegate_)
420 bubble_delegate_->CloseBubble(); 469 bubble_delegate_->CloseBubble();
421 470
422 bubble_delegate_ = new PermissionsBubbleDialogDelegateView( 471 bubble_delegate_ = new PermissionsBubbleDialogDelegateView(
423 GetAnchorView(), GetAnchorArrow(), this, requests, values); 472 GetAnchorView(), GetAnchorPoint(), GetAnchorArrow(), this, requests,
473 values);
424 474
425 // Set |parent_window| because some valid anchors can become hidden. 475 // Set |parent_window| because some valid anchors can become hidden.
426 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( 476 bubble_delegate_->set_parent_window(anchor_delegate_->GetParentView());
tapted 2016/05/03 12:02:38 I don't think we need AnchorDelegate::GetParentVie
Elly Fong-Jones 2016/05/10 21:21:02 Done.
427 browser_->window()->GetNativeWindow());
428 bubble_delegate_->set_parent_window(widget->GetNativeView());
429 477
430 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_)->Show(); 478 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_)->Show();
431 bubble_delegate_->SizeToContents(); 479 bubble_delegate_->SizeToContents();
432 } 480 }
433 481
434 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() { 482 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() {
435 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); 483 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered());
436 } 484 }
437 485
438 void PermissionBubbleViewViews::Hide() { 486 void PermissionBubbleViewViews::Hide() {
439 if (bubble_delegate_) { 487 if (bubble_delegate_) {
440 bubble_delegate_->CloseBubble(); 488 bubble_delegate_->CloseBubble();
441 bubble_delegate_ = nullptr; 489 bubble_delegate_ = nullptr;
442 } 490 }
443 } 491 }
444 492
445 bool PermissionBubbleViewViews::IsVisible() { 493 bool PermissionBubbleViewViews::IsVisible() {
446 return bubble_delegate_ != nullptr; 494 return bubble_delegate_ != nullptr;
447 } 495 }
448 496
449 void PermissionBubbleViewViews::UpdateAnchorPosition() { 497 void PermissionBubbleViewViews::UpdateAnchorPosition() {
450 if (IsVisible()) 498 if (IsVisible())
451 bubble_delegate_->UpdateAnchor(GetAnchorView(), GetAnchorArrow()); 499 bubble_delegate_->UpdateAnchor(GetAnchorView(), GetAnchorArrow());
tapted 2016/05/03 12:02:39 This needs to support a null AnchorView - probably
Elly Fong-Jones 2016/05/10 21:21:02 Done.
452 } 500 }
453 501
454 gfx::NativeWindow PermissionBubbleViewViews::GetNativeWindow() { 502 gfx::NativeWindow PermissionBubbleViewViews::GetNativeWindow() {
455 if (bubble_delegate_ && bubble_delegate_->GetWidget()) 503 if (bubble_delegate_ && bubble_delegate_->GetWidget())
456 return bubble_delegate_->GetWidget()->GetNativeWindow(); 504 return bubble_delegate_->GetWidget()->GetNativeWindow();
457 return nullptr; 505 return nullptr;
458 } 506 }
459 507
460 void PermissionBubbleViewViews::Closing() { 508 void PermissionBubbleViewViews::Closing() {
461 if (bubble_delegate_) 509 if (bubble_delegate_)
462 bubble_delegate_ = nullptr; 510 bubble_delegate_ = nullptr;
463 if (delegate_) 511 if (delegate_)
464 delegate_->Closing(); 512 delegate_->Closing();
465 } 513 }
466 514
467 void PermissionBubbleViewViews::Toggle(int index, bool value) { 515 void PermissionBubbleViewViews::Toggle(int index, bool value) {
468 if (delegate_) 516 if (delegate_)
469 delegate_->ToggleAccept(index, value); 517 delegate_->ToggleAccept(index, value);
470 } 518 }
471 519
472 void PermissionBubbleViewViews::Accept() { 520 void PermissionBubbleViewViews::Accept() {
473 if (delegate_) 521 if (delegate_)
474 delegate_->Accept(); 522 delegate_->Accept();
475 } 523 }
476 524
477 void PermissionBubbleViewViews::Deny() { 525 void PermissionBubbleViewViews::Deny() {
478 if (delegate_) 526 if (delegate_)
479 delegate_->Deny(); 527 delegate_->Deny();
480 } 528 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698