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

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

Issue 1973893002: [diff] Fixing permssions bubbles while in fullscreen (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/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),
377 anchor_delegate_(CreateAnchorDelegate(browser)) {
382 DCHECK(browser); 378 DCHECK(browser);
379 DCHECK(browser->window());
383 } 380 }
384 381
385 PermissionBubbleViewViews::~PermissionBubbleViewViews() { 382 PermissionBubbleViewViews::~PermissionBubbleViewViews() {
386 } 383 }
387 384
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() { 385 views::BubbleBorder::Arrow PermissionBubbleViewViews::GetAnchorArrow() {
407 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) 386 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
408 return views::BubbleBorder::TOP_LEFT; 387 return views::BubbleBorder::TOP_LEFT;
409 return views::BubbleBorder::NONE; 388 return views::BubbleBorder::NONE;
410 } 389 }
411 390
412 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { 391 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) {
413 delegate_ = delegate; 392 delegate_ = delegate;
414 } 393 }
415 394
416 void PermissionBubbleViewViews::Show( 395 void PermissionBubbleViewViews::Show(
417 const std::vector<PermissionBubbleRequest*>& requests, 396 const std::vector<PermissionBubbleRequest*>& requests,
418 const std::vector<bool>& values) { 397 const std::vector<bool>& values) {
419 if (bubble_delegate_) 398 if (bubble_delegate_)
420 bubble_delegate_->CloseBubble(); 399 bubble_delegate_->CloseBubble();
421 400
422 bubble_delegate_ = new PermissionsBubbleDialogDelegateView( 401 bubble_delegate_ = new PermissionsBubbleDialogDelegateView(
423 GetAnchorView(), GetAnchorArrow(), this, requests, values); 402 this, requests, values);
424 403
425 // Set |parent_window| because some valid anchors can become hidden. 404 // Set |parent_window| because some valid anchors can become hidden.
426 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( 405 bubble_delegate_->set_parent_window(
427 browser_->window()->GetNativeWindow()); 406 platform_util::GetViewForWindow(browser_->window()->GetNativeWindow()));
428 bubble_delegate_->set_parent_window(widget->GetNativeView());
429 407
430 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_)->Show(); 408 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_)->Show();
431 bubble_delegate_->SizeToContents(); 409 bubble_delegate_->SizeToContents();
410
411 bubble_delegate_->UpdateAnchor(
412 anchor_delegate_->GetAnchorView(),
413 anchor_delegate_->GetAnchorPoint(),
414 GetAnchorArrow());
432 } 415 }
433 416
434 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() { 417 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() {
435 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); 418 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered());
436 } 419 }
437 420
438 void PermissionBubbleViewViews::Hide() { 421 void PermissionBubbleViewViews::Hide() {
439 if (bubble_delegate_) { 422 if (bubble_delegate_) {
440 bubble_delegate_->CloseBubble(); 423 bubble_delegate_->CloseBubble();
441 bubble_delegate_ = nullptr; 424 bubble_delegate_ = nullptr;
442 } 425 }
443 } 426 }
444 427
445 bool PermissionBubbleViewViews::IsVisible() { 428 bool PermissionBubbleViewViews::IsVisible() {
446 return bubble_delegate_ != nullptr; 429 return bubble_delegate_ != nullptr;
447 } 430 }
448 431
449 void PermissionBubbleViewViews::UpdateAnchorPosition() { 432 void PermissionBubbleViewViews::UpdateAnchorPosition() {
450 if (IsVisible()) 433 if (IsVisible()) {
451 bubble_delegate_->UpdateAnchor(GetAnchorView(), GetAnchorArrow()); 434 bubble_delegate_->set_parent_window(
435 platform_util::GetViewForWindow(browser_->window()->GetNativeWindow()));
436 bubble_delegate_->UpdateAnchor(anchor_delegate_->GetAnchorView(),
437 anchor_delegate_->GetAnchorPoint(),
438 GetAnchorArrow());
439 }
452 } 440 }
453 441
454 gfx::NativeWindow PermissionBubbleViewViews::GetNativeWindow() { 442 gfx::NativeWindow PermissionBubbleViewViews::GetNativeWindow() {
455 if (bubble_delegate_ && bubble_delegate_->GetWidget()) 443 if (bubble_delegate_ && bubble_delegate_->GetWidget())
456 return bubble_delegate_->GetWidget()->GetNativeWindow(); 444 return bubble_delegate_->GetWidget()->GetNativeWindow();
457 return nullptr; 445 return nullptr;
458 } 446 }
459 447
460 void PermissionBubbleViewViews::Closing() { 448 void PermissionBubbleViewViews::Closing() {
461 if (bubble_delegate_) 449 if (bubble_delegate_)
462 bubble_delegate_ = nullptr; 450 bubble_delegate_ = nullptr;
463 if (delegate_) 451 if (delegate_)
464 delegate_->Closing(); 452 delegate_->Closing();
465 } 453 }
466 454
467 void PermissionBubbleViewViews::Toggle(int index, bool value) { 455 void PermissionBubbleViewViews::Toggle(int index, bool value) {
468 if (delegate_) 456 if (delegate_)
469 delegate_->ToggleAccept(index, value); 457 delegate_->ToggleAccept(index, value);
470 } 458 }
471 459
472 void PermissionBubbleViewViews::Accept() { 460 void PermissionBubbleViewViews::Accept() {
473 if (delegate_) 461 if (delegate_)
474 delegate_->Accept(); 462 delegate_->Accept();
475 } 463 }
476 464
477 void PermissionBubbleViewViews::Deny() { 465 void PermissionBubbleViewViews::Deny() {
478 if (delegate_) 466 if (delegate_)
479 delegate_->Deny(); 467 delegate_->Deny();
480 } 468 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/website_settings/permissions_bubble_view.h ('k') | chrome/chrome_browser_ui.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698