Index: chrome/browser/ui/gtk/website_settings_popup_gtk.cc |
diff --git a/chrome/browser/ui/gtk/website_settings_popup_gtk.cc b/chrome/browser/ui/gtk/website_settings_popup_gtk.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..115c122e2544ef66c425014006420b15b811e0b3 |
--- /dev/null |
+++ b/chrome/browser/ui/gtk/website_settings_popup_gtk.cc |
@@ -0,0 +1,337 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/gtk/website_settings_popup_gtk.h" |
+ |
+#include "base/basictypes.h" |
+#include "base/compiler_specific.h" |
+#include "base/i18n/rtl.h" |
+#include "base/string_number_conversions.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/certificate_viewer.h" |
+#include "chrome/browser/page_info_model.h" |
+#include "chrome/browser/ui/browser_list.h" |
+#include "chrome/browser/ui/gtk/browser_toolbar_gtk.h" |
+#include "chrome/browser/ui/gtk/browser_window_gtk.h" |
+#include "chrome/browser/ui/gtk/collected_cookies_gtk.h" |
+#include "chrome/browser/ui/gtk/gtk_chrome_link_button.h" |
+#include "chrome/browser/ui/gtk/gtk_util.h" |
+#include "chrome/browser/ui/gtk/theme_service_gtk.h" |
+#include "chrome/browser/ui/gtk/location_bar_view_gtk.h" |
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/public/browser/cert_store.h" |
+#include "grit/generated_resources.h" |
+#include "grit/locale_settings.h" |
+#include "grit/theme_resources.h" |
+#include "ui/base/gtk/gtk_hig_constants.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/resource/resource_bundle.h" |
+ |
+using content::OpenURLParams; |
+ |
+WebsiteSettingsPopupGtk::WebsiteSettingsPopupGtk( |
+ gfx::NativeWindow parent, |
+ Profile* profile, |
+ TabContentsWrapper* tab_contents_wrapper, |
+ const GURL& url, |
+ const SSLStatus& ssl, |
+ bool show_history) |
+ : website_settings_(NULL), |
+ parent_(parent), |
+ contents_(NULL), |
+ theme_service_(ThemeServiceGtk::GetFrom(profile)), |
+ profile_(profile), |
+ tab_contents_wrapper_(tab_contents_wrapper) { |
+ BrowserWindowGtk* browser_window = |
+ BrowserWindowGtk::GetBrowserWindowForNativeWindow(parent); |
+ anchor_ = browser_window-> |
+ GetToolbar()->GetLocationBarView()->location_icon_widget(); |
+ |
+ InitContents(); |
+ |
+ website_settings_.reset( |
+ new WebsiteSettingsModel(this, |
+ profile, |
+ url, |
+ ssl, |
+ content::CertStore::GetInstance(), |
+ tab_contents_wrapper->content_settings())); |
+ |
+ BubbleGtk::ArrowLocationGtk arrow_location = base::i18n::IsRTL() ? |
+ BubbleGtk::ARROW_LOCATION_TOP_RIGHT : |
+ BubbleGtk::ARROW_LOCATION_TOP_LEFT; |
+ bubble_ = BubbleGtk::Show(anchor_, |
+ NULL, // |rect| |
+ contents_, |
+ arrow_location, |
+ true, // |match_system_theme| |
+ true, // |grab_input| |
+ theme_service_, |
+ this); // |delegate| |
+ if (!bubble_) { |
+ NOTREACHED(); |
+ return; |
+ } |
+} |
+ |
+WebsiteSettingsPopupGtk::~WebsiteSettingsPopupGtk() { |
+} |
+ |
+void WebsiteSettingsPopupGtk::BubbleClosing(BubbleGtk* bubble, |
+ bool closed_by_escape) { |
+ delete this; |
+} |
+ |
+void WebsiteSettingsPopupGtk::InitContents() { |
+ if (!contents_) { |
+ contents_ = gtk_vbox_new(FALSE, ui::kContentAreaSpacing); |
+ gtk_container_set_border_width(GTK_CONTAINER(contents_), |
+ ui::kContentAreaBorder); |
+ } else { |
+ gtk_util::RemoveAllChildren(contents_); |
+ } |
+ |
+ site_info_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing); |
+ gtk_box_pack_start(GTK_BOX(contents_), |
+ CreateSection("Site Information", site_info_contents_), |
+ FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(contents_), |
+ gtk_hseparator_new(), |
+ FALSE, FALSE, 0); |
+ cookies_section_content_ = gtk_vbox_new(FALSE, ui::kControlSpacing); |
+ gtk_box_pack_start(GTK_BOX(contents_), |
+ CreateSection("Cookies and Site Data", |
+ cookies_section_content_), |
+ FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(contents_), |
+ gtk_hseparator_new(), |
+ FALSE, FALSE, 0); |
+ permissions_section_content_ = gtk_vbox_new(FALSE, ui::kControlSpacing); |
+ gtk_box_pack_start(GTK_BOX(contents_), |
+ CreateSection("Permissions", permissions_section_content_), |
+ FALSE, FALSE, 0); |
+ |
+ /* |
+ GtkWidget* help_link = theme_service_->BuildChromeLinkButton( |
+ l10n_util::GetStringUTF8(IDS_PAGE_INFO_HELP_CENTER_LINK)); |
+ GtkWidget* help_link_hbox = gtk_hbox_new(FALSE, 0); |
+ // Stick it in an hbox so it doesn't expand to the whole width. |
+ gtk_box_pack_start(GTK_BOX(help_link_hbox), help_link, FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(contents_), help_link_hbox, FALSE, FALSE, 0); |
+ g_signal_connect(help_link, "clicked", |
+ G_CALLBACK(OnHelpLinkClickedThunk), this); |
+ */ |
Elliot Glaysher
2012/03/19 19:56:06
Commented out?
markusheintz_
2012/03/20 20:44:12
removed
|
+ |
+ gtk_widget_show_all(contents_); |
+} |
+ |
+void WebsiteSettingsPopupGtk::ClearContainer(GtkWidget* container) { |
+ GList* child = gtk_container_get_children(GTK_CONTAINER(container)); |
+ while (child) { |
+ gtk_container_remove(GTK_CONTAINER(container), GTK_WIDGET(child->data)); |
+ child = child->next; |
+ } |
+} |
+ |
+void WebsiteSettingsPopupGtk::SetSiteInfo(const std::string site_info) { |
+ ClearContainer(site_info_contents_); |
+ GtkWidget* label = theme_service_->BuildLabel(site_info, |
+ ui::kGdkBlack); |
+ GtkWidget* site_info_entry_box = gtk_hbox_new(FALSE, ui::kControlSpacing); |
+ gtk_box_pack_start(GTK_BOX(site_info_entry_box), label, FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(site_info_contents_), site_info_entry_box, FALSE, FALSE, 0); |
Elliot Glaysher
2012/03/19 19:56:06
nit: lots of 80 col errors in this patch. won't po
markusheintz_
2012/03/20 20:44:12
Done.
|
+ gtk_widget_show_all(site_info_contents_); |
+} |
+ |
+GtkWidget* WebsiteSettingsPopupGtk::CreateSection(std::string section_title, |
+ GtkWidget* section_content) { |
+ GtkWidget* section_box = gtk_vbox_new(FALSE, ui::kControlSpacing); |
+ |
+ // Add Section title |
+ GtkWidget* title_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing); |
+ gtk_box_pack_start(GTK_BOX(section_box), title_hbox, FALSE, FALSE, 0); |
+ |
+ GtkWidget* label = theme_service_->BuildLabel(section_title, |
+ ui::kGdkBlack); |
+ gtk_label_set_selectable(GTK_LABEL(label), TRUE); |
+ PangoAttrList* attributes = pango_attr_list_new(); |
+ pango_attr_list_insert(attributes, |
+ pango_attr_weight_new(PANGO_WEIGHT_BOLD)); |
+ gtk_label_set_attributes(GTK_LABEL(label), attributes); |
+ pango_attr_list_unref(attributes); |
+ gtk_util::SetLabelWidth(label, 400); |
+ // Allow linebreaking in the middle of words if necessary, so that extremely |
+ // long hostnames (longer than one line) will still be completely shown. |
+ gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); |
+ gtk_box_pack_start(GTK_BOX(title_hbox), label, FALSE, FALSE, 0); |
+ |
+ // Add section content |
+ gtk_box_pack_start(GTK_BOX(section_box), section_content, FALSE, FALSE, 0); |
+ return section_box; |
+ |
+} |
+ |
+void WebsiteSettingsPopupGtk::SetCookieInfo(const CookieInfoList& cookie_info_list) { |
+ ClearContainer(cookies_section_content_); |
+ |
+ // Create cookies info rows. |
+ for (CookieInfoList::const_iterator it = cookie_info_list.begin(); |
+ it != cookie_info_list.end(); |
+ ++it) { |
+ GtkWidget* cookies_info = gtk_hbox_new(FALSE, 0); |
+ |
+ GtkWidget* label = theme_service_->BuildLabel(it->text, ui::kGdkBlack); |
+ gtk_label_set_selectable(GTK_LABEL(label), TRUE); |
+ // PangoAttrList* attributes = pango_attr_list_new(); |
+ // pango_attr_list_insert(attributes, |
+ // pango_attr_weight_new(PANGO_WEIGHT_BOLD)); |
+ // gtk_label_set_attributes(GTK_LABEL(first_party_cookie_label), attributes); |
+ // pango_attr_list_unref(attributes); |
+ gtk_util::SetLabelWidth(label, 200); |
+ // Allow linebreaking in the middle of words if necessary, so that extremely |
+ // long hostnames (longer than one line) will still be completely shown. |
+ gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); |
+ gtk_box_pack_start(GTK_BOX(cookies_info), label, FALSE, FALSE, 0); |
+ |
+ std::string allowed_count = base::IntToString(it->allowed); |
+ std::string blocked_count = base::IntToString(it->blocked); |
+ std::string info_str = " (" + allowed_count + " allowed / " + blocked_count + " blocked)"; |
+ GtkWidget* info = theme_service_->BuildLabel(info_str, ui::kGdkBlack); |
+ gtk_label_set_selectable(GTK_LABEL(info), TRUE); |
+ gtk_util::SetLabelWidth(info, 200); |
+ gtk_box_pack_start(GTK_BOX(cookies_info), info, FALSE, FALSE, 0); |
+ |
+ gtk_box_pack_start(GTK_BOX(cookies_section_content_), |
+ cookies_info, |
+ FALSE, FALSE, 0); |
+ } |
+ |
+ // Create links row. |
+ GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); |
+ |
+ GtkWidget* show_cookie_settings_link = theme_service_->BuildChromeLinkButton( |
+ "Manage cookie settings"); |
+ g_signal_connect(show_cookie_settings_link, "clicked", |
+ G_CALLBACK(OnCookieSettingsLinkClickedThunk), this); |
+ gtk_box_pack_start(GTK_BOX(link_hbox), show_cookie_settings_link, |
+ FALSE, FALSE, 0); |
+ |
+ GtkWidget* view_cookies_link = theme_service_->BuildChromeLinkButton( |
+ "Show cookies"); |
+ g_signal_connect(view_cookies_link, "clicked", |
+ G_CALLBACK(OnCookiesLinkClickedThunk), this); |
+ gtk_box_pack_start(GTK_BOX(link_hbox), view_cookies_link, |
+ FALSE, FALSE, 0); |
+ |
+ gtk_box_pack_start(GTK_BOX(cookies_section_content_), link_hbox, FALSE, FALSE, 0); |
+ |
+ gtk_widget_show_all(cookies_section_content_); |
+} |
+ |
+void WebsiteSettingsPopupGtk::SetPermissionInfo( |
+ const PermissionInfoList& permission_info_list) { |
+ ClearContainer(permissions_section_content_); |
+ |
+ for (PermissionInfoList::const_iterator permission = |
+ permission_info_list.begin(); |
+ permission != permission_info_list.end(); |
+ ++permission) { |
+ std::string permission_text; |
+ switch (permission->type) { |
+ case CONTENT_SETTINGS_TYPE_POPUPS: |
+ permission_text = "Popups"; |
Elliot Glaysher
2012/03/19 19:56:06
shouldn't this be localized?
markusheintz_
2012/03/20 20:44:12
Done.
|
+ break; |
+ case CONTENT_SETTINGS_TYPE_PLUGINS: |
+ permission_text = "Plugins"; |
+ break; |
+ case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
+ permission_text = "Location"; |
+ break; |
+ case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
+ permission_text = "Notifications"; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ GtkWidget* label = theme_service_->BuildLabel(permission_text, |
+ ui::kGdkBlack); |
+ gtk_util::SetLabelWidth(label, 280); |
+ GtkWidget* hbox = gtk_hbox_new(FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
+ |
+ GtkWidget* combo_box = gtk_combo_box_new_text(); |
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), "ALLOW"); |
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), "BLOCK"); |
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), |
+ permission->setting == CONTENT_SETTING_ALLOW ? 0 : 1); |
+ g_signal_connect(combo_box, "changed", |
+ G_CALLBACK(OnPermissionChangedThunk), this); |
+ |
+ gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0); |
+ |
+ gtk_box_pack_start(GTK_BOX(permissions_section_content_), hbox, FALSE, |
+ FALSE, 0); |
+ } |
+ |
+ GtkWidget* show_content_settings_link = theme_service_->BuildChromeLinkButton( |
+ "Manage permission settings"); |
+ g_signal_connect(show_content_settings_link, "clicked", |
+ G_CALLBACK(OnPermissionsSettingsLinkClickedThunk), this); |
+ GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(link_hbox), show_content_settings_link, |
+ FALSE, FALSE, 0); |
+ |
+ gtk_box_pack_start(GTK_BOX(permissions_section_content_), link_hbox, |
+ FALSE, FALSE, 0); |
+ |
+ gtk_widget_show_all(permissions_section_content_); |
+} |
+ |
+void WebsiteSettingsPopupGtk::OnCookiesLinkClicked(GtkWidget* widget) { |
+ new CollectedCookiesGtk(GTK_WINDOW(parent_), |
+ tab_contents_wrapper_); |
+ bubble_->Close(); |
+} |
+ |
+void WebsiteSettingsPopupGtk::OnCookieSettingsLinkClicked(GtkWidget* widget) { |
+ Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); |
+ browser->OpenURL(OpenURLParams( |
+ GURL(std::string( |
+ chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), |
+ content::Referrer(), |
+ NEW_FOREGROUND_TAB, |
+ content::PAGE_TRANSITION_LINK, |
+ false)); |
+ bubble_->Close(); |
+} |
+ |
+void WebsiteSettingsPopupGtk::OnPermissionsSettingsLinkClicked( |
+ GtkWidget* widget) { |
+ Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); |
+ browser->OpenURL(OpenURLParams( |
+ GURL(std::string( |
+ chrome::kChromeUISettingsURL) + chrome::kContentSettingsSubPage), |
+ content::Referrer(), |
+ NEW_FOREGROUND_TAB, |
+ content::PAGE_TRANSITION_LINK, |
+ false)); |
+ bubble_->Close(); |
+} |
+ |
+void WebsiteSettingsPopupGtk::OnPermissionChanged(GtkWidget* widget) { |
+ LOG(ERROR) << " *** OnPermissionChanged"; |
+} |
+ |
+// static |
+void WebsiteSettingsUI::Show(gfx::NativeWindow parent, |
+ Profile* profile, |
+ TabContentsWrapper* tab_contents_wrapper, |
+ const GURL& url, |
+ const content::SSLStatus& ssl, |
+ bool show_history) { |
+ new WebsiteSettingsPopupGtk(parent, profile, tab_contents_wrapper, url, ssl, |
+ show_history); |
+} |