Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/ui/gtk/website_settings_popup_gtk.h" | |
| 6 | |
| 7 #include "base/basictypes.h" | |
| 8 #include "base/compiler_specific.h" | |
| 9 #include "base/i18n/rtl.h" | |
| 10 #include "base/string_number_conversions.h" | |
| 11 #include "base/utf_string_conversions.h" | |
| 12 #include "chrome/browser/certificate_viewer.h" | |
| 13 #include "chrome/browser/ui/browser_list.h" | |
| 14 #include "chrome/browser/ui/gtk/browser_toolbar_gtk.h" | |
| 15 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | |
| 16 #include "chrome/browser/ui/gtk/collected_cookies_gtk.h" | |
| 17 #include "chrome/browser/ui/gtk/gtk_chrome_link_button.h" | |
| 18 #include "chrome/browser/ui/gtk/gtk_util.h" | |
| 19 #include "chrome/browser/ui/gtk/theme_service_gtk.h" | |
| 20 #include "chrome/browser/ui/gtk/location_bar_view_gtk.h" | |
| 21 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | |
| 22 #include "chrome/common/url_constants.h" | |
| 23 #include "grit/generated_resources.h" | |
| 24 #include "grit/locale_settings.h" | |
| 25 #include "grit/theme_resources.h" | |
| 26 #include "ui/base/gtk/gtk_hig_constants.h" | |
| 27 #include "ui/base/l10n/l10n_util.h" | |
| 28 #include "ui/base/resource/resource_bundle.h" | |
| 29 | |
| 30 using content::OpenURLParams; | |
| 31 | |
| 32 WebsiteSettingsPopupGtk::WebsiteSettingsPopupGtk( | |
| 33 gfx::NativeWindow parent, | |
| 34 Profile* profile, | |
| 35 TabContentsWrapper* tab_contents_wrapper) | |
| 36 : parent_(parent), | |
| 37 contents_(NULL), | |
| 38 theme_service_(ThemeServiceGtk::GetFrom(profile)), | |
| 39 profile_(profile), | |
| 40 tab_contents_wrapper_(tab_contents_wrapper) { | |
| 41 BrowserWindowGtk* browser_window = | |
| 42 BrowserWindowGtk::GetBrowserWindowForNativeWindow(parent); | |
| 43 anchor_ = browser_window-> | |
| 44 GetToolbar()->GetLocationBarView()->location_icon_widget(); | |
| 45 | |
| 46 InitContents(); | |
| 47 | |
| 48 BubbleGtk::ArrowLocationGtk arrow_location = base::i18n::IsRTL() ? | |
| 49 BubbleGtk::ARROW_LOCATION_TOP_RIGHT : | |
| 50 BubbleGtk::ARROW_LOCATION_TOP_LEFT; | |
| 51 bubble_ = BubbleGtk::Show(anchor_, | |
| 52 NULL, // |rect| | |
| 53 contents_, | |
| 54 arrow_location, | |
| 55 true, // |match_system_theme| | |
| 56 true, // |grab_input| | |
| 57 theme_service_, | |
| 58 this); // |delegate| | |
| 59 if (!bubble_) { | |
| 60 NOTREACHED(); | |
| 61 return; | |
| 62 } | |
| 63 } | |
| 64 | |
| 65 WebsiteSettingsPopupGtk::~WebsiteSettingsPopupGtk() { | |
| 66 DCHECK(!delegate_); | |
| 67 } | |
| 68 | |
| 69 void WebsiteSettingsPopupGtk::SetDelegate(WebsiteSettingsUIDelegate* delegate) { | |
| 70 delegate_ = delegate; | |
| 71 } | |
| 72 | |
| 73 void WebsiteSettingsPopupGtk::BubbleClosing(BubbleGtk* bubble, | |
| 74 bool closed_by_escape) { | |
| 75 if (delegate_) | |
| 76 delegate_->OnUIClosing(); | |
| 77 } | |
| 78 | |
| 79 void WebsiteSettingsPopupGtk::InitContents() { | |
| 80 if (!contents_) { | |
| 81 contents_ = gtk_vbox_new(FALSE, ui::kContentAreaSpacing); | |
| 82 gtk_container_set_border_width(GTK_CONTAINER(contents_), | |
| 83 ui::kContentAreaBorder); | |
| 84 } else { | |
| 85 gtk_util::RemoveAllChildren(contents_); | |
| 86 } | |
| 87 | |
| 88 site_info_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
| 89 std::string title = UTF16ToUTF8( | |
| 90 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE)); | |
| 91 gtk_box_pack_start(GTK_BOX(contents_), | |
| 92 CreateSection(title, site_info_contents_), | |
| 93 FALSE, FALSE, 0); | |
| 94 gtk_box_pack_start(GTK_BOX(contents_), | |
| 95 gtk_hseparator_new(), | |
| 96 FALSE, FALSE, 0); | |
| 97 cookies_section_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
| 98 title = UTF16ToUTF8( | |
| 99 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA)); | |
| 100 gtk_box_pack_start(GTK_BOX(contents_), | |
| 101 CreateSection(title, | |
| 102 cookies_section_contents_), | |
| 103 FALSE, FALSE, 0); | |
| 104 gtk_box_pack_start(GTK_BOX(contents_), | |
| 105 gtk_hseparator_new(), | |
| 106 FALSE, FALSE, 0); | |
| 107 permissions_section_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
| 108 title = UTF16ToUTF8( | |
| 109 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_PERMISSIONS)); | |
| 110 gtk_box_pack_start(GTK_BOX(contents_), | |
| 111 CreateSection(title, | |
| 112 permissions_section_contents_), | |
| 113 FALSE, FALSE, 0); | |
| 114 | |
| 115 gtk_widget_show_all(contents_); | |
| 116 } | |
| 117 | |
| 118 void WebsiteSettingsPopupGtk::ClearContainer(GtkWidget* container) { | |
| 119 GList* child = gtk_container_get_children(GTK_CONTAINER(container)); | |
| 120 while (child) { | |
| 121 gtk_container_remove(GTK_CONTAINER(container), GTK_WIDGET(child->data)); | |
| 122 child = child->next; | |
| 123 } | |
| 124 } | |
| 125 | |
| 126 void WebsiteSettingsPopupGtk::SetSiteInfo(const std::string site_info) { | |
| 127 DCHECK(site_info_contents_); | |
| 128 ClearContainer(site_info_contents_); | |
| 129 GtkWidget* label = theme_service_->BuildLabel(site_info, | |
| 130 ui::kGdkBlack); | |
| 131 GtkWidget* site_info_entry_box = gtk_hbox_new(FALSE, ui::kControlSpacing); | |
| 132 gtk_box_pack_start(GTK_BOX(site_info_entry_box), label, FALSE, FALSE, 0); | |
| 133 gtk_box_pack_start(GTK_BOX(site_info_contents_), site_info_entry_box, FALSE, | |
| 134 FALSE, 0); | |
| 135 gtk_widget_show_all(site_info_contents_); | |
| 136 } | |
| 137 | |
| 138 GtkWidget* WebsiteSettingsPopupGtk::CreateSection(std::string section_title, | |
| 139 GtkWidget* section_content) { | |
| 140 GtkWidget* section_box = gtk_vbox_new(FALSE, ui::kControlSpacing); | |
| 141 | |
| 142 // Add Section title | |
| 143 GtkWidget* title_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing); | |
| 144 gtk_box_pack_start(GTK_BOX(section_box), title_hbox, FALSE, FALSE, 0); | |
| 145 | |
| 146 GtkWidget* label = theme_service_->BuildLabel(section_title, | |
| 147 ui::kGdkBlack); | |
| 148 gtk_label_set_selectable(GTK_LABEL(label), TRUE); | |
| 149 PangoAttrList* attributes = pango_attr_list_new(); | |
| 150 pango_attr_list_insert(attributes, | |
| 151 pango_attr_weight_new(PANGO_WEIGHT_BOLD)); | |
| 152 gtk_label_set_attributes(GTK_LABEL(label), attributes); | |
| 153 pango_attr_list_unref(attributes); | |
| 154 gtk_util::SetLabelWidth(label, 400); | |
| 155 | |
| 156 // Add section content | |
| 157 if (delegate_) | |
| 158 delegate_->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_DEFAULT, | |
| 159 CONTENT_SETTING_DEFAULT); | |
| 160 gtk_box_pack_start(GTK_BOX(section_box), section_content, FALSE, FALSE, 0); | |
| 161 return section_box; | |
| 162 | |
| 163 } | |
| 164 | |
| 165 void WebsiteSettingsPopupGtk::SetCookieInfo( | |
| 166 const CookieInfoList& cookie_info_list) { | |
| 167 DCHECK(cookies_section_contents_); | |
| 168 ClearContainer(cookies_section_contents_); | |
| 169 | |
| 170 // Create cookies info rows. | |
| 171 for (CookieInfoList::const_iterator it = cookie_info_list.begin(); | |
| 172 it != cookie_info_list.end(); | |
| 173 ++it) { | |
| 174 GtkWidget* cookies_info = gtk_hbox_new(FALSE, 0); | |
| 175 | |
| 176 GtkWidget* label = theme_service_->BuildLabel(it->text, ui::kGdkBlack); | |
| 177 gtk_label_set_selectable(GTK_LABEL(label), TRUE); | |
| 178 gtk_util::SetLabelWidth(label, 200); | |
| 179 // Allow linebreaking in the middle of words if necessary, so that extremely | |
| 180 // long hostnames (longer than one line) will still be completely shown. | |
| 181 gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); | |
| 182 gtk_box_pack_start(GTK_BOX(cookies_info), label, FALSE, FALSE, 0); | |
| 183 | |
| 184 std::string allowed_count = base::IntToString(it->allowed); | |
| 185 std::string blocked_count = base::IntToString(it->blocked); | |
| 186 // TODO(markusheintz): Add a localized label here once we decided how this | |
| 187 // information should be displayed. | |
| 188 std::string info_str = " (" + allowed_count + " allowed / " | |
| 189 + blocked_count + " blocked)"; | |
| 190 | |
| 191 GtkWidget* info = theme_service_->BuildLabel(info_str, ui::kGdkBlack); | |
| 192 gtk_label_set_selectable(GTK_LABEL(info), TRUE); | |
| 193 gtk_util::SetLabelWidth(info, 200); | |
|
Elliot Glaysher
2012/03/20 23:46:19
Can you get away without manually setting the widt
markusheintz_
2012/03/21 10:54:24
Yes. removed.
| |
| 194 gtk_box_pack_start(GTK_BOX(cookies_info), info, FALSE, FALSE, 0); | |
| 195 | |
| 196 gtk_box_pack_start(GTK_BOX(cookies_section_contents_), | |
| 197 cookies_info, | |
| 198 FALSE, FALSE, 0); | |
| 199 } | |
| 200 | |
| 201 // Create row with links for cookie settings and for the cookies dialog. | |
| 202 GtkWidget* link_hbox = gtk_hbox_new(TRUE, 0); | |
| 203 | |
| 204 GtkWidget* show_cookie_settings_link = theme_service_->BuildChromeLinkButton( | |
| 205 UTF16ToUTF8(l10n_util::GetStringUTF16( | |
| 206 IDS_WEBSITE_SETTINGS_SHOW_SITE_DATA_SETTINGS))); | |
| 207 g_signal_connect(show_cookie_settings_link, "clicked", | |
| 208 G_CALLBACK(OnCookieSettingsLinkClickedThunk), this); | |
| 209 gtk_box_pack_start(GTK_BOX(link_hbox), show_cookie_settings_link, | |
| 210 if (delegate_) | |
| 211 delegate_->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_DEFAULT, | |
| 212 CONTENT_SETTING_DEFAULT); | |
| 213 TRUE, FALSE, 0); | |
| 214 | |
| 215 GtkWidget* view_cookies_link = theme_service_->BuildChromeLinkButton( | |
| 216 UTF16ToUTF8(l10n_util::GetStringUTF16( | |
| 217 IDS_WEBSITE_SETTINGS_SHOW_SITE_DATA))); | |
| 218 g_signal_connect(view_cookies_link, "clicked", | |
| 219 G_CALLBACK(OnCookiesLinkClickedThunk), this); | |
| 220 gtk_box_pack_start(GTK_BOX(link_hbox), view_cookies_link, | |
| 221 TRUE, FALSE, 0); | |
| 222 | |
| 223 gtk_box_pack_start(GTK_BOX(cookies_section_contents_), link_hbox, | |
| 224 TRUE, FALSE, 0); | |
| 225 | |
| 226 gtk_widget_show_all(cookies_section_contents_); | |
| 227 } | |
| 228 | |
| 229 void WebsiteSettingsPopupGtk::SetPermissionInfo( | |
| 230 const PermissionInfoList& permission_info_list) { | |
| 231 DCHECK(permissions_section_contents_); | |
| 232 ClearContainer(permissions_section_contents_); | |
| 233 | |
| 234 for (PermissionInfoList::const_iterator permission = | |
| 235 permission_info_list.begin(); | |
| 236 permission != permission_info_list.end(); | |
| 237 ++permission) { | |
| 238 std::string permission_text; | |
| 239 switch (permission->type) { | |
| 240 case CONTENT_SETTINGS_TYPE_POPUPS: | |
| 241 permission_text = UTF16ToUTF8( | |
| 242 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_POPUPS)); | |
| 243 break; | |
| 244 case CONTENT_SETTINGS_TYPE_PLUGINS: | |
| 245 permission_text = UTF16ToUTF8( | |
| 246 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_PLUGINS)); | |
| 247 break; | |
| 248 case CONTENT_SETTINGS_TYPE_GEOLOCATION: | |
| 249 permission_text = UTF16ToUTF8( | |
| 250 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_LOCATION)); | |
| 251 break; | |
| 252 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: | |
| 253 permission_text = UTF16ToUTF8( | |
| 254 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_NOTIFICATIONS)); | |
|
Elliot Glaysher
2012/03/20 23:46:19
GetStringUTF8. Also in the rest of the file.
markusheintz_
2012/03/21 10:54:24
Done.
| |
| 255 break; | |
| 256 default: | |
| 257 NOTREACHED(); | |
| 258 break; | |
| 259 } | |
| 260 GtkWidget* label = theme_service_->BuildLabel(permission_text, | |
| 261 ui::kGdkBlack); | |
| 262 gtk_util::SetLabelWidth(label, 280); | |
| 263 GtkWidget* hbox = gtk_hbox_new(FALSE, 0); | |
| 264 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
| 265 | |
| 266 GtkWidget* combo_box = gtk_combo_box_new_text(); | |
| 267 std::string permission_str = UTF16ToUTF8( | |
| 268 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_ALLOW)); | |
| 269 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), permission_str.c_str()); | |
| 270 permission_str = UTF16ToUTF8( | |
| 271 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_BLOCK)); | |
| 272 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), permission_str.c_str()); | |
| 273 gtk_combo_box_set_active( | |
| 274 GTK_COMBO_BOX(combo_box), | |
| 275 permission->setting == CONTENT_SETTING_ALLOW ? 0 : 1); | |
| 276 g_signal_connect(combo_box, "changed", | |
| 277 G_CALLBACK(OnPermissionChangedThunk), this); | |
| 278 g_signal_connect(combo_box, "notify::popup-shown", | |
| 279 G_CALLBACK(OnComboBoxShownThunk), this); | |
| 280 gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0); | |
| 281 | |
| 282 gtk_box_pack_start(GTK_BOX(permissions_section_contents_), hbox, FALSE, | |
| 283 FALSE, 0); | |
| 284 } | |
| 285 | |
| 286 GtkWidget* show_content_settings_link = theme_service_->BuildChromeLinkButton( | |
| 287 UTF16ToUTF8(l10n_util::GetStringUTF16( | |
| 288 IDS_WEBSITE_SETTINGS_SHOW_PERMISSION_SETTINGS))); | |
| 289 g_signal_connect(show_content_settings_link, "clicked", | |
| 290 G_CALLBACK(OnPermissionsSettingsLinkClickedThunk), this); | |
| 291 GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); | |
| 292 gtk_box_pack_start(GTK_BOX(link_hbox), show_content_settings_link, | |
| 293 FALSE, FALSE, 0); | |
| 294 | |
| 295 gtk_box_pack_start(GTK_BOX(permissions_section_contents_), link_hbox, | |
| 296 FALSE, FALSE, 0); | |
| 297 | |
| 298 gtk_widget_show_all(permissions_section_contents_); | |
| 299 } | |
| 300 | |
| 301 void WebsiteSettingsPopupGtk::OnComboBoxShown(GtkWidget* widget, | |
| 302 GParamSpec* property) { | |
| 303 // GtkComboBox grabs the keyboard and pointer when it displays its popup, | |
| 304 // which steals the grabs that BubbleGtk had installed. When the popup is | |
| 305 // hidden, we notify BubbleGtk so it can try to reacquire the grabs | |
| 306 // (otherwise, GTK won't activate our widgets when the user clicks in them). | |
| 307 gboolean popup_shown = FALSE; | |
| 308 g_object_get(G_OBJECT(GTK_COMBO_BOX(widget)), "popup-shown", &popup_shown, | |
| 309 NULL); | |
| 310 if (!popup_shown) | |
| 311 bubble_->HandlePointerAndKeyboardUngrabbedByContent(); | |
| 312 } | |
| 313 | |
| 314 void WebsiteSettingsPopupGtk::OnCookiesLinkClicked(GtkWidget* widget) { | |
| 315 new CollectedCookiesGtk(GTK_WINDOW(parent_), | |
| 316 tab_contents_wrapper_); | |
| 317 bubble_->Close(); | |
| 318 } | |
| 319 | |
| 320 void WebsiteSettingsPopupGtk::OnCookieSettingsLinkClicked(GtkWidget* widget) { | |
| 321 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); | |
| 322 browser->OpenURL(OpenURLParams( | |
| 323 GURL(std::string( | |
| 324 chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), | |
| 325 content::Referrer(), | |
| 326 NEW_FOREGROUND_TAB, | |
| 327 content::PAGE_TRANSITION_LINK, | |
| 328 false)); | |
| 329 bubble_->Close(); | |
| 330 } | |
| 331 | |
| 332 void WebsiteSettingsPopupGtk::OnPermissionsSettingsLinkClicked( | |
| 333 GtkWidget* widget) { | |
| 334 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); | |
|
Elliot Glaysher
2012/03/20 23:46:19
May want to get this from BrowserWindow that you h
markusheintz_
2012/03/21 10:54:24
Done.
| |
| 335 browser->OpenURL(OpenURLParams( | |
| 336 GURL(std::string( | |
| 337 chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), | |
| 338 content::Referrer(), | |
| 339 NEW_FOREGROUND_TAB, | |
| 340 content::PAGE_TRANSITION_LINK, | |
| 341 false)); | |
| 342 bubble_->Close(); | |
| 343 } | |
| 344 | |
| 345 void WebsiteSettingsPopupGtk::OnPermissionChanged(GtkWidget* widget) { | |
| 346 // TODO(markusheintz): Implement once the backend (|WebsiteSettingsUIDelegate| | |
| 347 // implmentation which is the |WebsiteSettings| class) provides support for | |
| 348 // this. | |
| 349 } | |
| OLD | NEW |