Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "base/prefs/pref_service.h" | |
| 7 #include "base/strings/string16.h" | 8 #include "base/strings/string16.h" |
| 9 #include "chrome/browser/profiles/profile.h" | |
| 10 #include "chrome/browser/ui/browser.h" | |
| 11 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h" | |
| 12 #include "chrome/browser/ui/views/frame/browser_view.h" | |
| 13 #include "chrome/browser/ui/views/frame/top_container_view.h" | |
| 14 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" | |
| 15 #include "chrome/browser/ui/views/location_bar/location_icon_view.h" | |
| 8 #include "chrome/browser/ui/views/website_settings/permission_selector_view.h" | 16 #include "chrome/browser/ui/views/website_settings/permission_selector_view.h" |
| 9 #include "chrome/browser/ui/views/website_settings/permission_selector_view_obse rver.h" | 17 #include "chrome/browser/ui/views/website_settings/permission_selector_view_obse rver.h" |
| 10 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" | 18 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" |
| 19 #include "chrome/common/pref_names.h" | |
| 11 #include "chrome/grit/generated_resources.h" | 20 #include "chrome/grit/generated_resources.h" |
| 12 #include "net/base/net_util.h" | 21 #include "net/base/net_util.h" |
| 13 #include "ui/accessibility/ax_view_state.h" | 22 #include "ui/accessibility/ax_view_state.h" |
| 14 #include "ui/base/l10n/l10n_util.h" | 23 #include "ui/base/l10n/l10n_util.h" |
| 15 #include "ui/base/models/combobox_model.h" | 24 #include "ui/base/models/combobox_model.h" |
| 16 #include "ui/base/resource/resource_bundle.h" | 25 #include "ui/base/resource/resource_bundle.h" |
| 17 #include "ui/gfx/text_constants.h" | 26 #include "ui/gfx/text_constants.h" |
| 18 #include "ui/views/bubble/bubble_delegate.h" | 27 #include "ui/views/bubble/bubble_delegate.h" |
| 28 #include "ui/views/bubble/bubble_frame_view.h" | |
| 19 #include "ui/views/controls/button/checkbox.h" | 29 #include "ui/views/controls/button/checkbox.h" |
| 20 #include "ui/views/controls/button/label_button.h" | 30 #include "ui/views/controls/button/label_button.h" |
| 21 #include "ui/views/controls/button/label_button_border.h" | 31 #include "ui/views/controls/button/label_button_border.h" |
| 22 #include "ui/views/controls/button/menu_button.h" | 32 #include "ui/views/controls/button/menu_button.h" |
| 23 #include "ui/views/controls/button/menu_button_listener.h" | 33 #include "ui/views/controls/button/menu_button_listener.h" |
| 24 #include "ui/views/controls/combobox/combobox.h" | 34 #include "ui/views/controls/combobox/combobox.h" |
| 25 #include "ui/views/controls/combobox/combobox_listener.h" | 35 #include "ui/views/controls/combobox/combobox_listener.h" |
| 26 #include "ui/views/controls/label.h" | 36 #include "ui/views/controls/label.h" |
| 27 #include "ui/views/controls/menu/menu_runner.h" | 37 #include "ui/views/controls/menu/menu_runner.h" |
| 28 #include "ui/views/layout/box_layout.h" | 38 #include "ui/views/layout/box_layout.h" |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 133 index_, permission.setting == CONTENT_SETTING_ALLOW); | 143 index_, permission.setting == CONTENT_SETTING_ALLOW); |
| 134 } | 144 } |
| 135 | 145 |
| 136 /////////////////////////////////////////////////////////////////////////////// | 146 /////////////////////////////////////////////////////////////////////////////// |
| 137 // View implementation for the permissions bubble. | 147 // View implementation for the permissions bubble. |
| 138 class PermissionsBubbleDelegateView : public views::BubbleDelegateView, | 148 class PermissionsBubbleDelegateView : public views::BubbleDelegateView, |
| 139 public views::ButtonListener, | 149 public views::ButtonListener, |
| 140 public PermissionCombobox::Listener { | 150 public PermissionCombobox::Listener { |
| 141 public: | 151 public: |
| 142 PermissionsBubbleDelegateView( | 152 PermissionsBubbleDelegateView( |
| 143 views::View* anchor, | 153 views::View* anchor_view, |
| 154 views::BubbleBorder::Arrow anchor_arrow, | |
| 144 PermissionBubbleViewViews* owner, | 155 PermissionBubbleViewViews* owner, |
| 145 const std::string& languages, | 156 const std::string& languages, |
| 146 const std::vector<PermissionBubbleRequest*>& requests, | 157 const std::vector<PermissionBubbleRequest*>& requests, |
| 147 const std::vector<bool>& accept_state); | 158 const std::vector<bool>& accept_state); |
| 148 ~PermissionsBubbleDelegateView() override; | 159 ~PermissionsBubbleDelegateView() override; |
| 149 | 160 |
| 150 void Close(); | 161 void Close(); |
| 151 void SizeToContents(); | 162 void SizeToContents(); |
| 152 | 163 |
| 153 // BubbleDelegateView: | 164 // BubbleDelegateView: |
| 154 bool ShouldShowCloseButton() const override; | 165 bool ShouldShowCloseButton() const override; |
| 155 bool ShouldShowWindowTitle() const override; | 166 bool ShouldShowWindowTitle() const override; |
| 156 const gfx::FontList& GetTitleFontList() const override; | 167 const gfx::FontList& GetTitleFontList() const override; |
| 157 base::string16 GetWindowTitle() const override; | 168 base::string16 GetWindowTitle() const override; |
| 169 void OnWidgetBoundsChanged(views::Widget* widget, | |
| 170 const gfx::Rect& new_bounds) override; | |
| 158 void OnWidgetDestroying(views::Widget* widget) override; | 171 void OnWidgetDestroying(views::Widget* widget) override; |
| 159 | 172 |
| 160 // ButtonListener: | 173 // ButtonListener: |
| 161 void ButtonPressed(views::Button* button, const ui::Event& event) override; | 174 void ButtonPressed(views::Button* button, const ui::Event& event) override; |
| 162 | 175 |
| 163 // PermissionCombobox::Listener: | 176 // PermissionCombobox::Listener: |
| 164 void PermissionSelectionChanged(int index, bool allowed) override; | 177 void PermissionSelectionChanged(int index, bool allowed) override; |
| 165 | 178 |
| 179 // Updates the anchor's arrow and view. Also repositions the bubble so it's | |
| 180 // displayed in the correct location. | |
| 181 void UpdateAnchor(views::View* anchor_view, | |
| 182 views::BubbleBorder::Arrow anchor_arrow); | |
| 183 | |
| 166 private: | 184 private: |
| 167 PermissionBubbleViewViews* owner_; | 185 PermissionBubbleViewViews* owner_; |
| 168 views::Button* allow_; | 186 views::Button* allow_; |
| 169 views::Button* deny_; | 187 views::Button* deny_; |
| 170 views::Combobox* allow_combobox_; | 188 views::Combobox* allow_combobox_; |
| 171 base::string16 hostname_; | 189 base::string16 hostname_; |
| 172 scoped_ptr<PermissionMenuModel> menu_button_model_; | 190 scoped_ptr<PermissionMenuModel> menu_button_model_; |
| 173 std::vector<PermissionCombobox*> customize_comboboxes_; | 191 std::vector<PermissionCombobox*> customize_comboboxes_; |
| 174 | 192 |
| 175 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDelegateView); | 193 DISALLOW_COPY_AND_ASSIGN(PermissionsBubbleDelegateView); |
| 176 }; | 194 }; |
| 177 | 195 |
| 178 PermissionsBubbleDelegateView::PermissionsBubbleDelegateView( | 196 PermissionsBubbleDelegateView::PermissionsBubbleDelegateView( |
| 179 views::View* anchor, | 197 views::View* anchor_view, |
| 198 views::BubbleBorder::Arrow anchor_arrow, | |
| 180 PermissionBubbleViewViews* owner, | 199 PermissionBubbleViewViews* owner, |
| 181 const std::string& languages, | 200 const std::string& languages, |
| 182 const std::vector<PermissionBubbleRequest*>& requests, | 201 const std::vector<PermissionBubbleRequest*>& requests, |
| 183 const std::vector<bool>& accept_state) | 202 const std::vector<bool>& accept_state) |
| 184 : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_LEFT), | 203 : views::BubbleDelegateView(anchor_view, anchor_arrow), |
| 185 owner_(owner), | 204 owner_(owner), |
| 186 allow_(NULL), | 205 allow_(NULL), |
| 187 deny_(NULL), | 206 deny_(NULL), |
| 188 allow_combobox_(NULL) { | 207 allow_combobox_(NULL) { |
| 189 DCHECK(!requests.empty()); | 208 DCHECK(!requests.empty()); |
| 190 | 209 |
| 191 RemoveAllChildViews(true); | 210 RemoveAllChildViews(true); |
| 192 customize_comboboxes_.clear(); | 211 customize_comboboxes_.clear(); |
| 193 set_close_on_esc(true); | 212 set_close_on_esc(true); |
| 194 set_close_on_deactivate(false); | 213 set_close_on_deactivate(false); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 318 | 337 |
| 319 base::string16 PermissionsBubbleDelegateView::GetWindowTitle() const { | 338 base::string16 PermissionsBubbleDelegateView::GetWindowTitle() const { |
| 320 return l10n_util::GetStringFUTF16(IDS_PERMISSIONS_BUBBLE_PROMPT, | 339 return l10n_util::GetStringFUTF16(IDS_PERMISSIONS_BUBBLE_PROMPT, |
| 321 hostname_); | 340 hostname_); |
| 322 } | 341 } |
| 323 | 342 |
| 324 void PermissionsBubbleDelegateView::SizeToContents() { | 343 void PermissionsBubbleDelegateView::SizeToContents() { |
| 325 BubbleDelegateView::SizeToContents(); | 344 BubbleDelegateView::SizeToContents(); |
| 326 } | 345 } |
| 327 | 346 |
| 347 void PermissionsBubbleDelegateView::OnWidgetBoundsChanged( | |
| 348 views::Widget* widget, const gfx::Rect& new_bounds) { | |
|
msw
2015/03/18 18:30:09
nit: one parameter per line, if the whole signatur
hcarmona
2015/03/18 23:50:39
Done.
| |
| 349 if (owner_) | |
| 350 owner_->UpdateAnchorPosition(); | |
|
msw
2015/03/18 18:30:09
Is this really necessary on every OnWidgetBoundsCh
hcarmona
2015/03/18 23:50:39
OnWidgetDestroying is only called when the bubble
| |
| 351 BubbleDelegateView::OnWidgetBoundsChanged(widget, new_bounds); | |
| 352 } | |
| 353 | |
| 328 void PermissionsBubbleDelegateView::OnWidgetDestroying(views::Widget* widget) { | 354 void PermissionsBubbleDelegateView::OnWidgetDestroying(views::Widget* widget) { |
| 355 // It's necessary to check the value of |anchor_widget| first because calling | |
| 356 // |OnWidgetDestroying| updates |anchor_widget|. | |
| 357 bool anchor_is_destroyed = anchor_widget() == widget; | |
| 329 views::BubbleDelegateView::OnWidgetDestroying(widget); | 358 views::BubbleDelegateView::OnWidgetDestroying(widget); |
| 330 if (owner_) { | 359 |
| 360 if (owner_ && anchor_is_destroyed) { | |
| 361 // Find a new anchor if the old one is destroyed. | |
| 362 owner_->UpdateAnchorPosition(); | |
| 363 } else if (owner_) { | |
| 331 owner_->Closing(); | 364 owner_->Closing(); |
| 332 owner_ = NULL; | 365 owner_ = NULL; |
| 333 } | 366 } |
| 334 } | 367 } |
| 335 | 368 |
| 336 void PermissionsBubbleDelegateView::ButtonPressed(views::Button* button, | 369 void PermissionsBubbleDelegateView::ButtonPressed(views::Button* button, |
| 337 const ui::Event& event) { | 370 const ui::Event& event) { |
| 338 if (!owner_) | 371 if (!owner_) |
| 339 return; | 372 return; |
| 340 | 373 |
| 341 if (button == allow_) | 374 if (button == allow_) |
| 342 owner_->Accept(); | 375 owner_->Accept(); |
| 343 else if (button == deny_) | 376 else if (button == deny_) |
| 344 owner_->Deny(); | 377 owner_->Deny(); |
| 345 } | 378 } |
| 346 | 379 |
| 347 void PermissionsBubbleDelegateView::PermissionSelectionChanged( | 380 void PermissionsBubbleDelegateView::PermissionSelectionChanged( |
| 348 int index, bool allowed) { | 381 int index, bool allowed) { |
| 349 owner_->Toggle(index, allowed); | 382 owner_->Toggle(index, allowed); |
| 350 } | 383 } |
| 351 | 384 |
| 385 void PermissionsBubbleDelegateView::UpdateAnchor( | |
| 386 views::View* anchor_view, | |
| 387 views::BubbleBorder::Arrow anchor_arrow) { | |
| 388 if (GetAnchorView() == anchor_view && arrow() == anchor_arrow) | |
| 389 return; | |
| 390 | |
| 391 set_arrow(anchor_arrow); | |
| 392 | |
| 393 // Update the border in the bubble: will either add or remove the arrow. | |
| 394 views::BubbleFrameView* frame = | |
| 395 views::BubbleDelegateView::GetBubbleFrameView(); | |
| 396 views::BubbleBorder::Arrow adjusted_arrow = anchor_arrow; | |
| 397 if (base::i18n::IsRTL()) | |
| 398 adjusted_arrow = views::BubbleBorder::horizontal_mirror(adjusted_arrow); | |
| 399 frame->SetBubbleBorder(scoped_ptr<views::BubbleBorder>( | |
| 400 new views::BubbleBorder(adjusted_arrow, shadow(), color()))); | |
| 401 | |
| 402 // Reposition the bubble based on the updated arrow and view. | |
| 403 SetAnchorView(anchor_view); | |
| 404 } | |
| 405 | |
| 352 ////////////////////////////////////////////////////////////////////////////// | 406 ////////////////////////////////////////////////////////////////////////////// |
| 353 // PermissionBubbleViewViews | 407 // PermissionBubbleViewViews |
| 354 | 408 |
| 355 PermissionBubbleViewViews::PermissionBubbleViewViews( | 409 PermissionBubbleViewViews::PermissionBubbleViewViews(Browser* browser) |
| 356 views::View* anchor_view, | 410 : browser_(browser), |
| 357 const std::string& languages) | |
| 358 : anchor_view_(anchor_view), | |
| 359 delegate_(NULL), | 411 delegate_(NULL), |
| 360 bubble_delegate_(NULL), | 412 bubble_delegate_(NULL) {} |
|
msw
2015/03/18 18:30:09
nit: nullptr here and elsewhere.
hcarmona
2015/03/18 23:50:39
Done: changed NULL to nullptr in this file and exc
| |
| 361 languages_(languages) {} | |
| 362 | 413 |
| 363 PermissionBubbleViewViews::~PermissionBubbleViewViews() { | 414 PermissionBubbleViewViews::~PermissionBubbleViewViews() { |
| 364 if (delegate_) | 415 if (delegate_) |
| 365 delegate_->SetView(NULL); | 416 delegate_->SetView(NULL); |
| 366 } | 417 } |
| 367 | 418 |
| 419 views::View* PermissionBubbleViewViews::GetAnchorView_() { | |
| 420 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); | |
| 421 | |
| 422 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) | |
| 423 return browser_view->GetLocationBarView()->location_icon_view(); | |
| 424 | |
| 425 if (browser_view->IsFullscreenBubbleVisible()) | |
| 426 return browser_view->exclusive_access_bubble()->GetView(); | |
| 427 | |
| 428 return browser_view->top_container(); | |
| 429 } | |
| 430 | |
| 431 views::BubbleBorder::Arrow PermissionBubbleViewViews::GetAnchorArrow_() { | |
| 432 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) | |
| 433 return views::BubbleBorder::TOP_LEFT; | |
| 434 return views::BubbleBorder::NONE; | |
| 435 } | |
| 436 | |
| 437 void PermissionBubbleViewViews::UpdateAnchorPosition() { | |
| 438 if (IsVisible()) | |
| 439 bubble_delegate_->UpdateAnchor(GetAnchorView_(), GetAnchorArrow_()); | |
| 440 } | |
| 441 | |
| 368 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { | 442 void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { |
| 369 delegate_ = delegate; | 443 delegate_ = delegate; |
| 370 } | 444 } |
| 371 | 445 |
| 372 void PermissionBubbleViewViews::Show( | 446 void PermissionBubbleViewViews::Show( |
| 373 const std::vector<PermissionBubbleRequest*>& requests, | 447 const std::vector<PermissionBubbleRequest*>& requests, |
| 374 const std::vector<bool>& values) { | 448 const std::vector<bool>& values) { |
| 375 if (bubble_delegate_ != NULL) | 449 if (bubble_delegate_ != NULL) |
| 376 bubble_delegate_->Close(); | 450 bubble_delegate_->Close(); |
| 377 | 451 |
| 378 bubble_delegate_ = | 452 bubble_delegate_ = |
| 379 new PermissionsBubbleDelegateView(anchor_view_, this, languages_, | 453 new PermissionsBubbleDelegateView( |
| 380 requests, values); | 454 GetAnchorView_(), GetAnchorArrow_(), this, |
| 455 browser_->profile()->GetPrefs()->GetString(prefs::kAcceptLanguages), | |
| 456 requests, values); | |
| 457 | |
| 458 // Set |parent_window| because some valid anchors can become hidden. | |
| 459 bubble_delegate_->set_parent_window(browser_->window()->GetNativeWindow()); | |
| 460 | |
| 381 views::BubbleDelegateView::CreateBubble(bubble_delegate_)->Show(); | 461 views::BubbleDelegateView::CreateBubble(bubble_delegate_)->Show(); |
| 382 bubble_delegate_->SizeToContents(); | 462 bubble_delegate_->SizeToContents(); |
| 383 } | 463 } |
| 384 | 464 |
| 385 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() { | 465 bool PermissionBubbleViewViews::CanAcceptRequestUpdate() { |
| 386 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); | 466 return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); |
| 387 } | 467 } |
| 388 | 468 |
| 389 void PermissionBubbleViewViews::Hide() { | 469 void PermissionBubbleViewViews::Hide() { |
| 390 if (bubble_delegate_) { | 470 if (bubble_delegate_) { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 411 | 491 |
| 412 void PermissionBubbleViewViews::Accept() { | 492 void PermissionBubbleViewViews::Accept() { |
| 413 if (delegate_) | 493 if (delegate_) |
| 414 delegate_->Accept(); | 494 delegate_->Accept(); |
| 415 } | 495 } |
| 416 | 496 |
| 417 void PermissionBubbleViewViews::Deny() { | 497 void PermissionBubbleViewViews::Deny() { |
| 418 if (delegate_) | 498 if (delegate_) |
| 419 delegate_->Deny(); | 499 delegate_->Deny(); |
| 420 } | 500 } |
| OLD | NEW |