OLD | NEW |
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/website_settings/website_settings_popup_view.h
" | 5 #include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h
" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/i18n/rtl.h" | 12 #include "base/i18n/rtl.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/strings/string16.h" |
15 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
16 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
17 #include "chrome/browser/certificate_viewer.h" | 18 #include "chrome/browser/certificate_viewer.h" |
18 #include "chrome/browser/devtools/devtools_toggle_action.h" | 19 #include "chrome/browser/devtools/devtools_toggle_action.h" |
19 #include "chrome/browser/devtools/devtools_window.h" | 20 #include "chrome/browser/devtools/devtools_window.h" |
20 #include "chrome/browser/infobars/infobar_service.h" | 21 #include "chrome/browser/infobars/infobar_service.h" |
21 #include "chrome/browser/profiles/profile.h" | 22 #include "chrome/browser/profiles/profile.h" |
22 #include "chrome/browser/ui/browser.h" | 23 #include "chrome/browser/ui/browser.h" |
23 #include "chrome/browser/ui/browser_dialogs.h" | 24 #include "chrome/browser/ui/browser_dialogs.h" |
24 #include "chrome/browser/ui/layout_constants.h" | 25 #include "chrome/browser/ui/layout_constants.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 namespace { | 66 namespace { |
66 | 67 |
67 // NOTE(jdonnelly): This use of this process-wide variable assumes that there's | 68 // NOTE(jdonnelly): This use of this process-wide variable assumes that there's |
68 // never more than one website settings popup shown and that it's associated | 69 // never more than one website settings popup shown and that it's associated |
69 // with the current window. If this assumption fails in the future, we'll need | 70 // with the current window. If this assumption fails in the future, we'll need |
70 // to return a weak pointer from ShowPopup so callers can associate it with the | 71 // to return a weak pointer from ShowPopup so callers can associate it with the |
71 // current window (or other context) and check if the popup they care about is | 72 // current window (or other context) and check if the popup they care about is |
72 // showing. | 73 // showing. |
73 bool is_popup_showing = false; | 74 bool is_popup_showing = false; |
74 | 75 |
75 // Left icon margin. | 76 // General constants ----------------------------------------------------------- |
76 const int kIconMarginLeft = 6; | 77 |
| 78 // Popup width constraints. |
| 79 const int kMinPopupWidth = 320; |
| 80 const int kMaxPopupWidth = 1000; |
| 81 |
| 82 // Margin and padding values shared by all sections. |
| 83 const int kSectionPaddingHorizontal = 16; |
| 84 |
| 85 // Padding for the bottom of the bubble. |
| 86 const int kPopupMarginBottom = 16; |
| 87 |
| 88 // Security Section (PopupHeaderView) ------------------------------------------ |
77 | 89 |
78 // Margin and padding values for the |PopupHeaderView|. | 90 // Margin and padding values for the |PopupHeaderView|. |
79 const int kHeaderMarginBottom = 10; | 91 const int kHeaderMarginBottom = 10; |
80 const int kHeaderPaddingBottom = 16; | 92 const int kHeaderPaddingBottom = 16; |
81 const int kHeaderPaddingLeft = 18; | |
82 const int kHeaderPaddingRightForText = kHeaderPaddingLeft; | |
83 const int kHeaderPaddingTop = 16; | 93 const int kHeaderPaddingTop = 16; |
84 const int kHeaderPaddingForCloseButton = 8; | 94 const int kHeaderPaddingForCloseButton = 8; |
85 | 95 |
86 // Spacing between labels in the header. | 96 // Spacing between labels in the header. |
87 const int kHeaderLabelSpacing = 4; | 97 const int kHeaderLabelSpacing = 4; |
88 | 98 |
89 // The max possible width of the popup. | 99 // Site Settings Section ------------------------------------------------------- |
90 const int kMaxPopupWidth = 1000; | |
91 | 100 |
92 // The margins between the popup border and the popup content. | 101 // Spacing above and below the cookies view. |
93 const int kPopupMarginBottom = 14; | 102 const int kCookiesViewVerticalPadding = 6; |
94 | 103 |
95 // Padding values for sections on the site settings view. | 104 // Spacing between a permission image and the text. |
96 const int kSiteSettingsViewContentMinWidth = 300; | 105 const int kPermissionImageSpacing = 6; |
97 const int kSiteSettingsViewPaddingBottom = 6; | |
98 const int kSiteSettingsViewPaddingLeft = 18; | |
99 const int kSiteSettingsViewPaddingRight = 18; | |
100 const int kSiteSettingsViewPaddingTop = 4; | |
101 | 106 |
102 // Space between the headline and the content of a section. | 107 // Spacing between rows in the site settings section |
103 const int kSiteSettingsViewHeadlineMarginBottom = 10; | 108 const int kPermissionsVerticalSpacing = 12; |
104 // Spacing between rows in the "Permissions" and "Cookies and Site Data" | |
105 // sections. | |
106 const int kContentRowSpacing = 2; | |
107 | 109 |
108 const int kSiteDataIconColumnWidth = 20; | 110 // Button IDs ------------------------------------------------------------------ |
109 | 111 |
110 const int BUTTON_RESET_CERTIFICATE_DECISIONS = 1337; | 112 const int BUTTON_RESET_CERTIFICATE_DECISIONS = 1337; |
| 113 const int BUTTON_SITE_SETTINGS = 1338; |
111 | 114 |
112 } // namespace | 115 } // namespace |
113 | 116 |
114 // |PopupHeaderView| is the UI element (view) that represents the header of the | 117 // |PopupHeaderView| is the UI element (view) that represents the header of the |
115 // |WebsiteSettingsPopupView|. The header shows the status of the site's | 118 // |WebsiteSettingsPopupView|. The header shows the status of the site's |
116 // identity check and the name of the site's identity. | 119 // identity check and the name of the site's identity. |
117 class PopupHeaderView : public views::View { | 120 class PopupHeaderView : public views::View { |
118 public: | 121 public: |
119 explicit PopupHeaderView(views::ButtonListener* button_listener, | 122 explicit PopupHeaderView(views::ButtonListener* button_listener, |
120 views::StyledLabelListener* styled_label_listener); | 123 views::StyledLabelListener* styled_label_listener); |
121 ~PopupHeaderView() override; | 124 ~PopupHeaderView() override; |
122 | 125 |
123 // Sets the security summary for the current page. | 126 // Sets the security summary for the current page. |
124 void SetSummary(const base::string16& summary_text); | 127 void SetSummary(const base::string16& summary_text); |
125 | 128 |
126 // Sets the security details for the current page. | 129 // Sets the security details for the current page. |
127 void SetDetails(const base::string16& details_text, | 130 void SetDetails(const base::string16& details_text, |
128 bool include_details_link); | 131 bool include_details_link); |
129 | 132 |
130 int GetPreferredNameWidth() const; | |
131 | |
132 void AddResetDecisionsLabel(); | 133 void AddResetDecisionsLabel(); |
133 | 134 |
134 private: | 135 private: |
135 // The listener for the styled labels in this view. | 136 // The listener for the styled labels in this view. |
136 views::StyledLabelListener* styled_label_listener_; | 137 views::StyledLabelListener* styled_label_listener_; |
137 | 138 |
138 // The label that displays security summary for the current page. | 139 // The label that displays security summary for the current page. |
139 views::Label* summary_label_; | 140 views::Label* summary_label_; |
140 | 141 |
141 // The label that displays the status of the identity check for this site. | 142 // The label that displays the status of the identity check for this site. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 : styled_label_listener_(styled_label_listener), | 186 : styled_label_listener_(styled_label_listener), |
186 summary_label_(nullptr), | 187 summary_label_(nullptr), |
187 details_label_(nullptr), | 188 details_label_(nullptr), |
188 reset_decisions_label_container_(nullptr), | 189 reset_decisions_label_container_(nullptr), |
189 reset_decisions_label_(nullptr) { | 190 reset_decisions_label_(nullptr) { |
190 views::GridLayout* layout = new views::GridLayout(this); | 191 views::GridLayout* layout = new views::GridLayout(this); |
191 SetLayoutManager(layout); | 192 SetLayoutManager(layout); |
192 | 193 |
193 const int label_column = 0; | 194 const int label_column = 0; |
194 views::ColumnSet* column_set = layout->AddColumnSet(label_column); | 195 views::ColumnSet* column_set = layout->AddColumnSet(label_column); |
195 column_set->AddPaddingColumn(0, kHeaderPaddingLeft); | 196 column_set->AddPaddingColumn(0, kSectionPaddingHorizontal); |
196 column_set->AddColumn(views::GridLayout::FILL, | 197 column_set->AddColumn(views::GridLayout::FILL, |
197 views::GridLayout::FILL, | 198 views::GridLayout::FILL, |
198 1, | 199 1, |
199 views::GridLayout::USE_PREF, | 200 views::GridLayout::USE_PREF, |
200 0, | 201 0, |
201 0); | 202 0); |
202 column_set->AddPaddingColumn(1, 0); | 203 column_set->AddPaddingColumn(1, 0); |
203 column_set->AddColumn(views::GridLayout::FILL, | 204 column_set->AddColumn(views::GridLayout::FILL, |
204 views::GridLayout::FILL, | 205 views::GridLayout::FILL, |
205 1, | 206 1, |
206 views::GridLayout::USE_PREF, | 207 views::GridLayout::USE_PREF, |
207 0, | 208 0, |
208 0); | 209 0); |
209 column_set->AddPaddingColumn(0, kHeaderPaddingForCloseButton); | 210 column_set->AddPaddingColumn(0, kHeaderPaddingForCloseButton); |
210 | 211 |
211 // First we add the padding needed for the close button. | 212 // First we add the padding needed for the close button. |
212 // In order to move down the summary, we simulate additional padding by giving | 213 // In order to move down the summary, we simulate additional padding by giving |
213 // it an empty border on top later on. | 214 // it an empty border on top later on. |
214 layout->AddPaddingRow(0, kHeaderPaddingForCloseButton); | 215 layout->AddPaddingRow(0, kHeaderPaddingForCloseButton); |
215 | 216 |
216 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 217 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
217 | 218 |
218 layout->StartRow(0, label_column); | 219 layout->StartRow(0, label_column); |
219 const gfx::FontList& font_list = rb.GetFontListWithDelta(1); | 220 const gfx::FontList& font_list = rb.GetFontListWithDelta(1); |
220 summary_label_ = new views::Label(base::string16(), font_list); | 221 summary_label_ = new views::Label(base::string16(), font_list); |
| 222 summary_label_->SetMultiLine(true); |
221 summary_label_->SetBorder(views::Border::CreateEmptyBorder( | 223 summary_label_->SetBorder(views::Border::CreateEmptyBorder( |
222 kHeaderPaddingTop - kHeaderPaddingForCloseButton, 0, 0, 0)); | 224 kHeaderPaddingTop - kHeaderPaddingForCloseButton, 0, 0, 0)); |
223 layout->AddView(summary_label_, 1, 1, views::GridLayout::LEADING, | 225 layout->AddView(summary_label_, 1, 1, views::GridLayout::LEADING, |
224 views::GridLayout::TRAILING); | 226 views::GridLayout::TRAILING); |
225 views::ImageButton* close_button = new views::ImageButton(button_listener); | 227 views::ImageButton* close_button = new views::ImageButton(button_listener); |
226 close_button->SetImage(views::CustomButton::STATE_NORMAL, | 228 close_button->SetImage(views::CustomButton::STATE_NORMAL, |
227 rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia()); | 229 rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia()); |
228 close_button->SetImage(views::CustomButton::STATE_HOVERED, | 230 close_button->SetImage(views::CustomButton::STATE_HOVERED, |
229 rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia()); | 231 rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia()); |
230 close_button->SetImage(views::CustomButton::STATE_PRESSED, | 232 close_button->SetImage(views::CustomButton::STATE_PRESSED, |
231 rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia()); | 233 rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia()); |
232 layout->AddView(close_button, 1, 1, views::GridLayout::TRAILING, | 234 layout->AddView(close_button, 1, 1, views::GridLayout::TRAILING, |
233 views::GridLayout::LEADING); | 235 views::GridLayout::LEADING); |
234 | 236 |
235 layout->AddPaddingRow(0, kHeaderLabelSpacing); | 237 layout->AddPaddingRow(0, kHeaderLabelSpacing); |
236 | 238 |
237 const int label_column_status = 1; | 239 const int label_column_status = 1; |
238 views::ColumnSet* column_set_status = | 240 views::ColumnSet* column_set_status = |
239 layout->AddColumnSet(label_column_status); | 241 layout->AddColumnSet(label_column_status); |
240 column_set_status->AddPaddingColumn(0, kHeaderPaddingLeft); | 242 column_set_status->AddPaddingColumn(0, kSectionPaddingHorizontal); |
241 column_set_status->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, | 243 column_set_status->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, |
242 1, views::GridLayout::USE_PREF, 0, 0); | 244 1, views::GridLayout::USE_PREF, 0, 0); |
243 column_set_status->AddPaddingColumn(0, kHeaderPaddingRightForText); | 245 column_set_status->AddPaddingColumn(0, kSectionPaddingHorizontal); |
244 | 246 |
245 layout->AddPaddingRow(0, kHeaderLabelSpacing); | 247 layout->AddPaddingRow(0, kHeaderLabelSpacing); |
246 | 248 |
247 layout->StartRow(0, label_column_status); | 249 layout->StartRow(0, label_column_status); |
248 details_label_ = | 250 details_label_ = |
249 new views::StyledLabel(base::string16(), styled_label_listener); | 251 new views::StyledLabel(base::string16(), styled_label_listener); |
250 layout->AddView(details_label_, 1, 1, views::GridLayout::FILL, | 252 layout->AddView(details_label_, 1, 1, views::GridLayout::FILL, |
251 views::GridLayout::LEADING); | 253 views::GridLayout::LEADING); |
252 | 254 |
253 layout->StartRow(0, label_column_status); | 255 layout->StartRow(0, label_column_status); |
254 reset_decisions_label_container_ = new views::View(); | 256 reset_decisions_label_container_ = new views::View(); |
255 reset_decisions_label_container_->SetLayoutManager( | 257 reset_decisions_label_container_->SetLayoutManager( |
256 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); | 258 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); |
257 layout->AddView(reset_decisions_label_container_, 1, 1, | 259 layout->AddView(reset_decisions_label_container_, 1, 1, |
258 views::GridLayout::FILL, views::GridLayout::LEADING); | 260 views::GridLayout::FILL, views::GridLayout::LEADING); |
259 | 261 |
260 layout->AddPaddingRow(1, kHeaderPaddingBottom); | 262 layout->AddPaddingRow(1, kHeaderPaddingBottom); |
261 } | 263 } |
262 | 264 |
263 PopupHeaderView::~PopupHeaderView() {} | 265 PopupHeaderView::~PopupHeaderView() {} |
264 | 266 |
265 int PopupHeaderView::GetPreferredNameWidth() const { | |
266 return summary_label_->GetPreferredSize().width(); | |
267 } | |
268 | |
269 void PopupHeaderView::SetSummary(const base::string16& summary_text) { | 267 void PopupHeaderView::SetSummary(const base::string16& summary_text) { |
270 summary_label_->SetText(summary_text); | 268 summary_label_->SetText(summary_text); |
271 } | 269 } |
272 | 270 |
273 void PopupHeaderView::SetDetails(const base::string16& details_text, | 271 void PopupHeaderView::SetDetails(const base::string16& details_text, |
274 bool include_details_label_link) { | 272 bool include_details_label_link) { |
275 if (include_details_label_link) { | 273 if (include_details_label_link) { |
276 base::string16 details_link_text = | 274 base::string16 details_link_text = |
277 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_DETAILS_LINK); | 275 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_DETAILS_LINK); |
278 | 276 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 gfx::NativeView parent_window, | 438 gfx::NativeView parent_window, |
441 Profile* profile, | 439 Profile* profile, |
442 content::WebContents* web_contents, | 440 content::WebContents* web_contents, |
443 const GURL& url, | 441 const GURL& url, |
444 const security_state::SecurityStateModel::SecurityInfo& security_info) | 442 const security_state::SecurityStateModel::SecurityInfo& security_info) |
445 : content::WebContentsObserver(web_contents), | 443 : content::WebContentsObserver(web_contents), |
446 BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT), | 444 BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT), |
447 header_(nullptr), | 445 header_(nullptr), |
448 separator_(nullptr), | 446 separator_(nullptr), |
449 site_settings_view_(nullptr), | 447 site_settings_view_(nullptr), |
450 site_data_content_(nullptr), | 448 cookies_view_(nullptr), |
451 cookie_dialog_link_(nullptr), | 449 cookie_dialog_link_(nullptr), |
452 permissions_content_(nullptr), | 450 permissions_view_(nullptr), |
453 site_settings_link_(nullptr), | |
454 weak_factory_(this) { | 451 weak_factory_(this) { |
455 set_parent_window(parent_window); | 452 set_parent_window(parent_window); |
456 | 453 |
457 is_devtools_disabled_ = | 454 is_devtools_disabled_ = |
458 profile->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled); | 455 profile->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled); |
459 | 456 |
460 // Compensate for built-in vertical padding in the anchor view's image. | 457 // Compensate for built-in vertical padding in the anchor view's image. |
461 set_anchor_view_insets(gfx::Insets( | 458 set_anchor_view_insets(gfx::Insets( |
462 GetLayoutConstant(LOCATION_BAR_BUBBLE_ANCHOR_VERTICAL_INSET), 0)); | 459 GetLayoutConstant(LOCATION_BAR_BUBBLE_ANCHOR_VERTICAL_INSET), 0)); |
463 | 460 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 GetWidget()->Close(); | 499 GetWidget()->Close(); |
503 } | 500 } |
504 | 501 |
505 void WebsiteSettingsPopupView::WebContentsDestroyed() { | 502 void WebsiteSettingsPopupView::WebContentsDestroyed() { |
506 weak_factory_.InvalidateWeakPtrs(); | 503 weak_factory_.InvalidateWeakPtrs(); |
507 } | 504 } |
508 | 505 |
509 void WebsiteSettingsPopupView::OnPermissionChanged( | 506 void WebsiteSettingsPopupView::OnPermissionChanged( |
510 const WebsiteSettingsUI::PermissionInfo& permission) { | 507 const WebsiteSettingsUI::PermissionInfo& permission) { |
511 presenter_->OnSitePermissionChanged(permission.type, permission.setting); | 508 presenter_->OnSitePermissionChanged(permission.type, permission.setting); |
| 509 // The menu buttons for the permissions might have longer strings now, so we |
| 510 // need to size the whole bubble. |
| 511 SizeToContents(); |
512 } | 512 } |
513 | 513 |
514 void WebsiteSettingsPopupView::OnChosenObjectDeleted( | 514 void WebsiteSettingsPopupView::OnChosenObjectDeleted( |
515 const WebsiteSettingsUI::ChosenObjectInfo& info) { | 515 const WebsiteSettingsUI::ChosenObjectInfo& info) { |
516 presenter_->OnSiteChosenObjectDeleted(info.ui_info, *info.object); | 516 presenter_->OnSiteChosenObjectDeleted(info.ui_info, *info.object); |
517 } | 517 } |
518 | 518 |
519 void WebsiteSettingsPopupView::OnWidgetDestroying(views::Widget* widget) { | 519 void WebsiteSettingsPopupView::OnWidgetDestroying(views::Widget* widget) { |
520 is_popup_showing = false; | 520 is_popup_showing = false; |
521 presenter_->OnUIClosing(); | 521 presenter_->OnUIClosing(); |
522 } | 522 } |
523 | 523 |
524 int WebsiteSettingsPopupView::GetDialogButtons() const { | 524 int WebsiteSettingsPopupView::GetDialogButtons() const { |
525 return ui::DIALOG_BUTTON_NONE; | 525 return ui::DIALOG_BUTTON_NONE; |
526 } | 526 } |
527 | 527 |
528 void WebsiteSettingsPopupView::ButtonPressed(views::Button* button, | 528 void WebsiteSettingsPopupView::ButtonPressed(views::Button* button, |
529 const ui::Event& event) { | 529 const ui::Event& event) { |
530 if (button->id() == BUTTON_RESET_CERTIFICATE_DECISIONS) | 530 switch (button->id()) { |
531 presenter_->OnRevokeSSLErrorBypassButtonPressed(); | 531 case BUTTON_RESET_CERTIFICATE_DECISIONS: |
532 GetWidget()->Close(); | 532 presenter_->OnRevokeSSLErrorBypassButtonPressed(); |
| 533 GetWidget()->Close(); |
| 534 break; |
| 535 case BUTTON_SITE_SETTINGS: |
| 536 // TODO(palmer): This opens the general Content Settings pane, which is OK |
| 537 // for now. But on Android, it opens a page specific to a given origin |
| 538 // that shows all of the settings for that origin. If/when that's |
| 539 // available on desktop we should link to that here, too. |
| 540 web_contents()->OpenURL(content::OpenURLParams( |
| 541 GURL(chrome::kChromeUIContentSettingsURL), content::Referrer(), |
| 542 WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, |
| 543 false)); |
| 544 presenter_->RecordWebsiteSettingsAction( |
| 545 WebsiteSettings::WEBSITE_SETTINGS_SITE_SETTINGS_OPENED); |
| 546 break; |
| 547 default: |
| 548 NOTREACHED(); |
| 549 } |
533 } | 550 } |
534 | 551 |
535 void WebsiteSettingsPopupView::LinkClicked(views::Link* source, | 552 void WebsiteSettingsPopupView::LinkClicked(views::Link* source, |
536 int event_flags) { | 553 int event_flags) { |
537 // The popup closes automatically when the collected cookies dialog or the | 554 // The popup closes automatically when the collected cookies dialog or the |
538 // certificate viewer opens. So delay handling of the link clicked to avoid | 555 // certificate viewer opens. So delay handling of the link clicked to avoid |
539 // a crash in the base class which needs to complete the mouse event handling. | 556 // a crash in the base class which needs to complete the mouse event handling. |
540 content::BrowserThread::PostTask( | 557 content::BrowserThread::PostTask( |
541 content::BrowserThread::UI, FROM_HERE, | 558 content::BrowserThread::UI, FROM_HERE, |
542 base::Bind(&WebsiteSettingsPopupView::HandleLinkClickedAsync, | 559 base::Bind(&WebsiteSettingsPopupView::HandleLinkClickedAsync, |
543 weak_factory_.GetWeakPtr(), source)); | 560 weak_factory_.GetWeakPtr(), source)); |
544 } | 561 } |
545 | 562 |
546 gfx::Size WebsiteSettingsPopupView::GetPreferredSize() const { | 563 gfx::Size WebsiteSettingsPopupView::GetPreferredSize() const { |
547 if (header_ == nullptr && site_settings_view_ == nullptr) | 564 if (header_ == nullptr && site_settings_view_ == nullptr) |
548 return views::View::GetPreferredSize(); | 565 return views::View::GetPreferredSize(); |
549 | 566 |
550 int height = 0; | 567 int height = 0; |
551 if (header_) | 568 if (header_) |
552 height += header_->GetPreferredSize().height() + kHeaderMarginBottom; | 569 height += header_->GetPreferredSize().height() + kHeaderMarginBottom; |
553 if (separator_) | 570 if (separator_) |
554 height += separator_->GetPreferredSize().height(); | 571 height += separator_->GetPreferredSize().height(); |
555 | 572 |
556 if (site_settings_view_) | 573 if (site_settings_view_) |
557 height += site_settings_view_->GetPreferredSize().height(); | 574 height += site_settings_view_->GetPreferredSize().height(); |
558 | 575 |
559 int width = kSiteSettingsViewContentMinWidth; | 576 int width = kMinPopupWidth; |
560 if (site_data_content_) | 577 if (site_settings_view_) |
561 width = std::max(width, site_data_content_->GetPreferredSize().width()); | 578 width = std::max(width, site_settings_view_->GetPreferredSize().width()); |
562 if (permissions_content_) | |
563 width = std::max(width, permissions_content_->GetPreferredSize().width()); | |
564 if (header_) | |
565 width = std::max(width, header_->GetPreferredNameWidth()); | |
566 width += kSiteSettingsViewPaddingLeft + kSiteSettingsViewPaddingRight; | |
567 width = std::min(width, kMaxPopupWidth); | 579 width = std::min(width, kMaxPopupWidth); |
568 return gfx::Size(width, height); | 580 return gfx::Size(width, height); |
569 } | 581 } |
570 | 582 |
571 void WebsiteSettingsPopupView::SetCookieInfo( | 583 void WebsiteSettingsPopupView::SetCookieInfo( |
572 const CookieInfoList& cookie_info_list) { | 584 const CookieInfoList& cookie_info_list) { |
573 // |cookie_info_list| should only ever have 2 items: first- and third-party | 585 // |cookie_info_list| should only ever have 2 items: first- and third-party |
574 // cookies. | 586 // cookies. |
575 DCHECK_EQ(cookie_info_list.size(), 2u); | 587 DCHECK_EQ(cookie_info_list.size(), 2u); |
576 base::string16 first_party_label_text; | 588 int total_allowed = 0; |
577 base::string16 third_party_label_text; | 589 for (const auto& i : cookie_info_list) |
578 for (const auto& i : cookie_info_list) { | 590 total_allowed += i.allowed; |
579 if (i.is_first_party) { | 591 base::string16 label_text = l10n_util::GetPluralStringFUTF16( |
580 first_party_label_text = l10n_util::GetPluralStringFUTF16( | 592 IDS_WEBSITE_SETTINGS_NUM_COOKIES, total_allowed); |
581 IDS_WEBSITE_SETTINGS_FIRST_PARTY_SITE_DATA, i.allowed); | |
582 } else { | |
583 third_party_label_text = l10n_util::GetPluralStringFUTF16( | |
584 IDS_WEBSITE_SETTINGS_THIRD_PARTY_SITE_DATA, i.allowed); | |
585 } | |
586 } | |
587 | 593 |
588 if (!cookie_dialog_link_) { | 594 if (!cookie_dialog_link_) { |
589 cookie_dialog_link_ = new views::Link(first_party_label_text); | 595 cookie_dialog_link_ = new views::Link(label_text); |
590 cookie_dialog_link_->set_listener(this); | 596 cookie_dialog_link_->set_listener(this); |
591 } else { | 597 } else { |
592 cookie_dialog_link_->SetText(first_party_label_text); | 598 cookie_dialog_link_->SetText(label_text); |
593 } | 599 } |
594 | 600 |
595 views::GridLayout* layout = | 601 views::GridLayout* layout = |
596 static_cast<views::GridLayout*>(site_data_content_->GetLayoutManager()); | 602 static_cast<views::GridLayout*>(cookies_view_->GetLayoutManager()); |
597 if (!layout) { | 603 if (!layout) { |
598 layout = new views::GridLayout(site_data_content_); | 604 layout = new views::GridLayout(cookies_view_); |
599 site_data_content_->SetLayoutManager(layout); | 605 cookies_view_->SetLayoutManager(layout); |
600 | 606 |
601 const int site_data_content_column = 0; | 607 const int cookies_view_column = 0; |
602 views::ColumnSet* column_set = | 608 views::ColumnSet* column_set = layout->AddColumnSet(cookies_view_column); |
603 layout->AddColumnSet(site_data_content_column); | 609 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, |
604 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, | 610 views::GridLayout::FIXED, kPermissionIconColumnWidth, |
605 views::GridLayout::FIXED, kSiteDataIconColumnWidth, | |
606 0); | 611 0); |
607 column_set->AddPaddingColumn(0, kIconMarginLeft); | 612 column_set->AddPaddingColumn(0, kPermissionImageSpacing); |
608 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, | 613 column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, |
609 views::GridLayout::USE_PREF, 0, 0); | 614 0, views::GridLayout::USE_PREF, 0, 0); |
610 // No padding. This third column is for |third_party_label_text| (see | |
611 // below), | |
612 // and the text needs to flow naturally from the |first_party_label_text| | |
613 // link. | |
614 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, | |
615 views::GridLayout::USE_PREF, 0, 0); | |
616 | 615 |
617 layout->AddPaddingRow(1, 5); | 616 layout->AddPaddingRow(0, kCookiesViewVerticalPadding); |
618 | 617 |
619 layout->StartRow(1, site_data_content_column); | 618 layout->StartRow(1, cookies_view_column); |
620 WebsiteSettingsUI::PermissionInfo info; | 619 WebsiteSettingsUI::PermissionInfo info; |
621 info.type = CONTENT_SETTINGS_TYPE_COOKIES; | 620 info.type = CONTENT_SETTINGS_TYPE_COOKIES; |
622 info.setting = CONTENT_SETTING_ALLOW; | 621 info.setting = CONTENT_SETTING_ALLOW; |
623 info.is_incognito = | 622 info.is_incognito = |
624 Profile::FromBrowserContext(web_contents()->GetBrowserContext()) | 623 Profile::FromBrowserContext(web_contents()->GetBrowserContext()) |
625 ->IsOffTheRecord(); | 624 ->IsOffTheRecord(); |
626 views::ImageView* icon = new views::ImageView(); | 625 views::ImageView* icon = new views::ImageView(); |
627 const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(info); | 626 const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(info); |
628 icon->SetImage(image.ToImageSkia()); | 627 icon->SetImage(image.ToImageSkia()); |
629 layout->AddView(icon, 1, 1, views::GridLayout::CENTER, | 628 layout->AddView( |
630 views::GridLayout::CENTER); | 629 icon, 1, 2, views::GridLayout::FILL, |
631 layout->AddView(cookie_dialog_link_, 1, 1, views::GridLayout::CENTER, | 630 // TODO: The vertical alignment may change to CENTER once Harmony is |
632 views::GridLayout::CENTER); | 631 // implemented. See https://crbug.com/512442#c48 |
633 base::string16 comma = base::ASCIIToUTF16(", "); | 632 views::GridLayout::LEADING); |
634 | 633 |
635 layout->AddView(new views::Label(comma + third_party_label_text), 1, 1, | 634 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
636 views::GridLayout::LEADING, views::GridLayout::CENTER); | 635 const gfx::FontList& font_list = rb.GetFontListWithDelta(1); |
| 636 views::Label* cookies_label = new views::Label( |
| 637 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA), |
| 638 font_list); |
| 639 layout->AddView(cookies_label); |
| 640 layout->StartRow(1, cookies_view_column); |
| 641 layout->SkipColumns(1); |
637 | 642 |
638 layout->AddPaddingRow(1, 6); | 643 layout->AddView(cookie_dialog_link_); |
| 644 |
| 645 layout->AddPaddingRow(0, kCookiesViewVerticalPadding); |
639 } | 646 } |
640 | 647 |
641 layout->Layout(site_data_content_); | 648 layout->Layout(cookies_view_); |
642 SizeToContents(); | 649 SizeToContents(); |
643 } | 650 } |
644 | 651 |
645 void WebsiteSettingsPopupView::SetPermissionInfo( | 652 void WebsiteSettingsPopupView::SetPermissionInfo( |
646 const PermissionInfoList& permission_info_list, | 653 const PermissionInfoList& permission_info_list, |
647 const ChosenObjectInfoList& chosen_object_info_list) { | 654 const ChosenObjectInfoList& chosen_object_info_list) { |
648 // When a permission is changed, WebsiteSettings::OnSitePermissionChanged() | 655 // When a permission is changed, WebsiteSettings::OnSitePermissionChanged() |
649 // calls this method with updated permissions. However, PermissionSelectorRow | 656 // calls this method with updated permissions. However, PermissionSelectorRow |
650 // will have already updated its state, so it's already reflected in the UI. | 657 // will have already updated its state, so it's already reflected in the UI. |
651 // In addition, if a permission is set to the default setting, WebsiteSettings | 658 // In addition, if a permission is set to the default setting, WebsiteSettings |
652 // removes it from |permission_info_list|, but the button should remain. | 659 // removes it from |permission_info_list|, but the button should remain. |
653 if (permissions_content_) { | 660 if (permissions_view_) { |
654 base::STLDeleteContainerPointers(chosen_object_info_list.begin(), | 661 base::STLDeleteContainerPointers(chosen_object_info_list.begin(), |
655 chosen_object_info_list.end()); | 662 chosen_object_info_list.end()); |
656 return; | 663 return; |
657 } | 664 } |
658 | 665 |
659 permissions_content_ = new views::View(); | 666 permissions_view_ = new views::View(); |
660 views::GridLayout* layout = new views::GridLayout(permissions_content_); | 667 views::GridLayout* layout = new views::GridLayout(permissions_view_); |
661 permissions_content_->SetLayoutManager(layout); | 668 permissions_view_->SetLayoutManager(layout); |
662 | 669 |
663 base::string16 headline = | 670 site_settings_view_->AddChildView(permissions_view_); |
664 permission_info_list.empty() | |
665 ? base::string16() | |
666 : l10n_util::GetStringUTF16( | |
667 IDS_WEBSITE_SETTINGS_TITLE_SITE_PERMISSIONS); | |
668 views::View* permissions_section = | |
669 CreateSection(headline, permissions_content_, nullptr); | |
670 site_settings_view_->AddChildView(permissions_section); | |
671 | 671 |
672 const int content_column = 0; | 672 const int content_column = 0; |
673 views::ColumnSet* column_set = layout->AddColumnSet(content_column); | 673 views::ColumnSet* column_set = layout->AddColumnSet(content_column); |
674 column_set->AddColumn(views::GridLayout::FILL, | 674 column_set->AddColumn(views::GridLayout::FILL, |
675 views::GridLayout::FILL, | 675 views::GridLayout::FILL, |
676 1, | 676 1, |
677 views::GridLayout::USE_PREF, | 677 views::GridLayout::USE_PREF, |
678 0, | 678 0, |
679 0); | 679 0); |
680 for (const auto& permission : permission_info_list) { | 680 for (const auto& permission : permission_info_list) { |
681 layout->StartRow(1, content_column); | 681 layout->StartRow(1, content_column); |
682 PermissionSelectorRow* selector = new PermissionSelectorRow( | 682 PermissionSelectorRow* selector = new PermissionSelectorRow( |
683 web_contents() ? web_contents()->GetVisibleURL() : GURL::EmptyGURL(), | 683 web_contents() ? web_contents()->GetVisibleURL() : GURL::EmptyGURL(), |
684 permission); | 684 permission); |
685 selector->AddObserver(this); | 685 selector->AddObserver(this); |
686 layout->AddView(selector, | 686 layout->AddView(selector, 1, 1, views::GridLayout::FILL, |
687 1, | |
688 1, | |
689 views::GridLayout::LEADING, | |
690 views::GridLayout::CENTER); | 687 views::GridLayout::CENTER); |
691 layout->AddPaddingRow(1, kContentRowSpacing); | 688 layout->AddPaddingRow(1, kPermissionsVerticalSpacing); |
692 } | 689 } |
693 | 690 |
694 for (auto* object : chosen_object_info_list) { | 691 for (auto* object : chosen_object_info_list) { |
695 layout->StartRow(1, content_column); | 692 layout->StartRow(1, content_column); |
696 // The view takes ownership of the object info. | 693 // The view takes ownership of the object info. |
697 auto* object_view = new ChosenObjectRow(base::WrapUnique(object)); | 694 auto* object_view = new ChosenObjectRow(base::WrapUnique(object)); |
698 object_view->AddObserver(this); | 695 object_view->AddObserver(this); |
699 layout->AddView(object_view, 1, 1, views::GridLayout::LEADING, | 696 layout->AddView(object_view, 1, 1, views::GridLayout::LEADING, |
700 views::GridLayout::CENTER); | 697 views::GridLayout::CENTER); |
701 layout->AddPaddingRow(1, kContentRowSpacing); | 698 layout->AddPaddingRow(1, kPermissionsVerticalSpacing); |
702 } | 699 } |
703 | 700 |
704 layout->Layout(permissions_content_); | 701 layout->Layout(permissions_view_); |
705 | 702 |
706 // Add site settings link. | 703 // Add site settings link. |
707 site_settings_link_ = new views::Link( | 704 views::Link* site_settings_link = new views::Link( |
708 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_SETTINGS_LINK)); | 705 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_SETTINGS_LINK)); |
709 site_settings_link_->set_listener(this); | 706 site_settings_link->set_listener(this); |
710 views::View* link_section = new views::View(); | 707 views::View* link_section = new views::View(); |
711 const int kLinkMarginTop = 4; | 708 const int kLinkMarginTop = 4; |
712 link_section->SetLayoutManager( | 709 link_section->SetLayoutManager(new views::BoxLayout( |
713 new views::BoxLayout(views::BoxLayout::kHorizontal, | 710 views::BoxLayout::kHorizontal, 0, kLinkMarginTop, 0)); |
714 kSiteSettingsViewPaddingLeft, kLinkMarginTop, 0)); | 711 link_section->AddChildView(site_settings_link); |
715 link_section->AddChildView(site_settings_link_); | |
716 site_settings_view_->AddChildView(link_section); | 712 site_settings_view_->AddChildView(link_section); |
717 | 713 |
718 SizeToContents(); | 714 SizeToContents(); |
719 } | 715 } |
720 | 716 |
721 void WebsiteSettingsPopupView::SetIdentityInfo( | 717 void WebsiteSettingsPopupView::SetIdentityInfo( |
722 const IdentityInfo& identity_info) { | 718 const IdentityInfo& identity_info) { |
723 std::unique_ptr<WebsiteSettingsUI::SecurityDescription> security_description = | 719 std::unique_ptr<WebsiteSettingsUI::SecurityDescription> security_description = |
724 identity_info.GetSecurityDescription(); | 720 identity_info.GetSecurityDescription(); |
725 | 721 |
(...skipping 12 matching lines...) Expand all Loading... |
738 | 734 |
739 Layout(); | 735 Layout(); |
740 SizeToContents(); | 736 SizeToContents(); |
741 } | 737 } |
742 | 738 |
743 void WebsiteSettingsPopupView::SetSelectedTab(TabId tab_id) { | 739 void WebsiteSettingsPopupView::SetSelectedTab(TabId tab_id) { |
744 // TODO(lgarron): Remove this method. (https://crbug.com/571533) | 740 // TODO(lgarron): Remove this method. (https://crbug.com/571533) |
745 } | 741 } |
746 | 742 |
747 views::View* WebsiteSettingsPopupView::CreateSiteSettingsView() { | 743 views::View* WebsiteSettingsPopupView::CreateSiteSettingsView() { |
748 views::View* pane = new views::View(); | 744 views::View* site_settings_view = new views::View(); |
749 pane->SetLayoutManager( | 745 views::BoxLayout* box_layout = |
750 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1)); | 746 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0); |
| 747 site_settings_view->SetLayoutManager(box_layout); |
| 748 box_layout->set_cross_axis_alignment( |
| 749 views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH); |
| 750 box_layout->set_inside_border_insets( |
| 751 gfx::Insets(0, kSectionPaddingHorizontal)); |
751 | 752 |
752 // Add cookies and site data section. | 753 // Add cookies view. |
753 site_data_content_ = new views::View(); | 754 cookies_view_ = new views::View(); |
754 views::View* site_data_section = CreateSection( | 755 site_settings_view->AddChildView(cookies_view_); |
755 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA), | |
756 site_data_content_, nullptr); | |
757 pane->AddChildView(site_data_section); | |
758 | 756 |
759 return pane; | 757 return site_settings_view; |
760 } | 758 } |
761 views::View* WebsiteSettingsPopupView::CreateSection( | |
762 const base::string16& headline_text, | |
763 views::View* content, | |
764 views::Link* link) { | |
765 views::View* container = new views::View(); | |
766 views::GridLayout* layout = new views::GridLayout(container); | |
767 container->SetLayoutManager(layout); | |
768 const int content_column = 0; | |
769 views::ColumnSet* column_set = layout->AddColumnSet(content_column); | |
770 column_set->AddPaddingColumn(0, kSiteSettingsViewPaddingLeft); | |
771 column_set->AddColumn(views::GridLayout::FILL, | |
772 views::GridLayout::FILL, | |
773 1, | |
774 views::GridLayout::USE_PREF, | |
775 0, | |
776 0); | |
777 | |
778 if (headline_text.length() > 0) { | |
779 layout->AddPaddingRow(1, kSiteSettingsViewPaddingTop); | |
780 layout->StartRow(1, content_column); | |
781 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
782 views::Label* headline = new views::Label( | |
783 headline_text, rb.GetFontList(ui::ResourceBundle::BoldFont)); | |
784 layout->AddView(headline, 1, 1, views::GridLayout::LEADING, | |
785 views::GridLayout::CENTER); | |
786 } | |
787 | |
788 layout->AddPaddingRow(1, kSiteSettingsViewHeadlineMarginBottom); | |
789 layout->StartRow(1, content_column); | |
790 layout->AddView(content, 1, 1, views::GridLayout::LEADING, | |
791 views::GridLayout::CENTER); | |
792 | |
793 if (link) { | |
794 layout->AddPaddingRow(1, 4); | |
795 layout->StartRow(1, content_column); | |
796 layout->AddView(link, 1, 1, views::GridLayout::LEADING, | |
797 views::GridLayout::CENTER); | |
798 } | |
799 | |
800 layout->AddPaddingRow(1, kSiteSettingsViewPaddingBottom); | |
801 return container; | |
802 } | |
803 | |
804 | 759 |
805 void WebsiteSettingsPopupView::HandleLinkClickedAsync(views::Link* source) { | 760 void WebsiteSettingsPopupView::HandleLinkClickedAsync(views::Link* source) { |
806 if (web_contents() == nullptr || web_contents()->IsBeingDestroyed()) | 761 if (web_contents() == nullptr || web_contents()->IsBeingDestroyed()) |
807 return; | 762 return; |
808 | 763 DCHECK_EQ(source, cookie_dialog_link_); |
809 if (source == cookie_dialog_link_) { | 764 // Count how often the Collected Cookies dialog is opened. |
810 // Count how often the Collected Cookies dialog is opened. | 765 presenter_->RecordWebsiteSettingsAction( |
811 presenter_->RecordWebsiteSettingsAction( | 766 WebsiteSettings::WEBSITE_SETTINGS_COOKIES_DIALOG_OPENED); |
812 WebsiteSettings::WEBSITE_SETTINGS_COOKIES_DIALOG_OPENED); | 767 new CollectedCookiesViews(web_contents()); |
813 | |
814 new CollectedCookiesViews(web_contents()); | |
815 } else if (source == site_settings_link_) { | |
816 // TODO(palmer): This opens the general Content Settings pane, which is OK | |
817 // for now. But on Android, it opens a page specific to a given origin that | |
818 // shows all of the settings for that origin. If/when that's available on | |
819 // desktop we should link to that here, too. | |
820 web_contents()->OpenURL(content::OpenURLParams( | |
821 GURL(chrome::kChromeUIContentSettingsURL), content::Referrer(), | |
822 WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, | |
823 false)); | |
824 presenter_->RecordWebsiteSettingsAction( | |
825 WebsiteSettings::WEBSITE_SETTINGS_SITE_SETTINGS_OPENED); | |
826 } else { | |
827 NOTREACHED(); | |
828 } | |
829 } | 768 } |
830 | 769 |
831 void WebsiteSettingsPopupView::StyledLabelLinkClicked(views::StyledLabel* label, | 770 void WebsiteSettingsPopupView::StyledLabelLinkClicked(views::StyledLabel* label, |
832 const gfx::Range& range, | 771 const gfx::Range& range, |
833 int event_flags) { | 772 int event_flags) { |
834 presenter_->RecordWebsiteSettingsAction( | 773 presenter_->RecordWebsiteSettingsAction( |
835 WebsiteSettings::WEBSITE_SETTINGS_SECURITY_DETAILS_OPENED); | 774 WebsiteSettings::WEBSITE_SETTINGS_SECURITY_DETAILS_OPENED); |
836 | 775 |
837 if (is_devtools_disabled_) { | 776 if (is_devtools_disabled_) { |
838 DCHECK(certificate_); | 777 DCHECK(certificate_); |
839 gfx::NativeWindow parent = | 778 gfx::NativeWindow parent = |
840 anchor_widget() ? anchor_widget()->GetNativeWindow() : nullptr; | 779 anchor_widget() ? anchor_widget()->GetNativeWindow() : nullptr; |
841 presenter_->RecordWebsiteSettingsAction( | 780 presenter_->RecordWebsiteSettingsAction( |
842 WebsiteSettings::WEBSITE_SETTINGS_CERTIFICATE_DIALOG_OPENED); | 781 WebsiteSettings::WEBSITE_SETTINGS_CERTIFICATE_DIALOG_OPENED); |
843 ShowCertificateViewer(web_contents(), parent, certificate_.get()); | 782 ShowCertificateViewer(web_contents(), parent, certificate_.get()); |
844 } else { | 783 } else { |
845 DevToolsWindow::OpenDevToolsWindow( | 784 DevToolsWindow::OpenDevToolsWindow( |
846 web_contents(), DevToolsToggleAction::ShowSecurityPanel()); | 785 web_contents(), DevToolsToggleAction::ShowSecurityPanel()); |
847 } | 786 } |
848 } | 787 } |
OLD | NEW |