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

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

Issue 2306673003: Material Page Info (Views, 3/3): Update site settings section. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix up unused includes. Created 4 years, 2 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 (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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698