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

Unified Diff: chrome/browser/ui/gtk/website_settings_popup_gtk.cc

Issue 9379016: (WIP) Website Settings GTK UI (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tmp Created 8 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/gtk/browser_window_gtk.cc ('k') | chrome/browser/ui/website_settings_popup.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..b359c77974e48b32846157c66cc187b717445c1b
--- /dev/null
+++ b/chrome/browser/ui/gtk/website_settings_popup_gtk.cc
@@ -0,0 +1,800 @@
+// 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/website_settings_popup.h"
+
+#include <vector>
+
+#include <gtk/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/website_settings_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/bubble/bubble_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 "content/public/common/ssl_status.h"
+#include "googleurl/src/gurl.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"
+#include "ui/gfx/image/image.h"
+
+using content::OpenURLParams;
+
+using content::SSLStatus;
+
+namespace {
+
+// NOTE: ICON_STATE_OK ... ICON_STATE_ERROR must be listed in increasing
+// order of severity. Code may depend on this order.
+enum SectionStateIcon {
+ // No icon.
+ ICON_NONE = -1,
+ // State is OK.
+ ICON_STATE_OK,
+ // For example, if state is OK but contains mixed content.
+ ICON_STATE_WARNING_MINOR,
+ // For example, if content was served over HTTP.
+ ICON_STATE_WARNING_MAJOR,
+ // For example, unverified identity over HTTPS.
+ ICON_STATE_ERROR,
+ // An information icon.
+ ICON_STATE_INFO,
+ // Icon for internal pages.
+ ICON_STATE_INTERNAL_PAGE,
+};
+
+/*
+// Mapping for |WebsiteSettings::SiteIdentityStatus| to icon ids.
+SectionStateIcon kIdentityIconIds[] = {
+ ICON_NONE, // SITE_IDENTITY_STATUS_UNKNOWN
+ ICON_STATE_OK, // SITE_IDENTITY_STATUS_CERT
+ ICON_STATE_OK, // SITE_IDENTITY_STATUS_EV_CERT
+ ICON_STATE_OK, // SITE_IDENTITY_STATUS_DNSSEC_CERT
+ ICON_STATE_WARNING_MINOR, // SITE_IDENTITY_STATUS_CERT_REVOKATION_UNKOWN
+ ICON_STATE_WARNING_MAJOR, // SITE_IDENTITY_STATUS_NO_CERT
+ ICON_STATE_ERROR, // SITE_IDENTITY_STATUS_ERROR
+ ICON_STATE_INTERNAL_PAGE // SITE_IDENTITY_STATUS_INTERNAL_PAGE
+};
+
+// Mapping for |WebsiteSettings::SiteConnectionStatus| to icon ids.
+SectionStateIcon kConnectionIconIds[] = {
+ ICON_NONE, // SITE_CONNECTION_STATUS_UNKNOWN
+ ICON_STATE_OK, // SITE_CONNECTION_STATUS_ENCRYPTED
+ ICON_STATE_WARNING_MINOR, // SITE_CONNECTION_STATUS_MIXED_CONTENT
+ ICON_STATE_WARNING_MAJOR, // SITE_CONNECTION_STATUS_UNENCRYPTED
+ ICON_STATE_ERROR, // SITE_CONNECTION_STATUS_ENCRYPTED_ERROR
+ ICON_STATE_INTERNAL_PAGE, // SITE_CONNECTION_STATUS_INTERNAL_PAGE
+};
+*/
+
+class WebsiteSettingsPopupGtk : public WebsiteSettingsPopup,
+ public WebsiteSettingsUI,
+ public BubbleDelegateGtk {
+ public:
+ WebsiteSettingsPopupGtk(gfx::NativeWindow parent,
+ Profile* profile,
+ TabContentsWrapper* wrapper,
+ const GURL& url,
+ const SSLStatus& ssl,
+ bool show_history);
+ virtual ~WebsiteSettingsPopupGtk();
+
+ // WebsiteSettingsUI methods.
+ virtual void Update() OVERRIDE;
+
+ // BubbleDelegateGtk implementation.
+ virtual void BubbleClosing(BubbleGtk* bubble, bool closed_by_escape) OVERRIDE;
+
+ private:
+ // Layouts the different sections retrieved from the model.
+ void InitContents();
+
+ //void ShowConnectionDetails(bool show_details, GtkWidget* vbox);
+
+ //void ShowIdentityDetails(bool show_details, GtkWidget* vbox);
+ GtkWidget* CreateSection(std::string section_title,
+ GtkWidget* section_content);
+ GtkWidget* CreateCookiesDetails();
+ GtkWidget* CreateCookiesInfo(const std::string& text,
+ int allowed,
+ int bocked);
+
+ void InitIcons();
+
+ gfx::Image* GetIconImage(SectionStateIcon icon_id);
+
+ //GtkWidget* CreateIdentitySection();
+ //GtkWidget* CreateConnectionSection();
+ //GtkWidget* CreateHistorySection();
+ GtkWidget* CreateInfoSection();
+ GtkWidget* CreateCookiesSection();
+ GtkWidget* CreatePermissionSection();
+
+ // Link button callbacks.
+ CHROMEGTK_CALLBACK_0(WebsiteSettingsPopupGtk, void, OnCookiesLinkClicked);
+ CHROMEGTK_CALLBACK_0(WebsiteSettingsPopupGtk, void, OnHelpLinkClicked);
+ CHROMEGTK_CALLBACK_0(WebsiteSettingsPopupGtk, void, OnPermissionChanged);
+ CHROMEGTK_CALLBACK_0(WebsiteSettingsPopupGtk, void,
+ OnPermissionsSettingsLinkClicked);
+ CHROMEGTK_CALLBACK_0(WebsiteSettingsPopupGtk, void, OnViewCertLinkClicked);
+
+ /*
+ // TODO: one argument to open or close;
+ CHROMEGTK_CALLBACK_0(WebsiteSettingsPopupGtk, void,
+ OnShowConnectionDetailsLinkClicked);
+ CHROMEGTK_CALLBACK_0(WebsiteSettingsPopupGtk, void,
+ OnShowIdentityDetailsLinkClicked);
+ */
+
+ WebsiteSettingsModel website_settings_;
+
+ // The url for this dialog. Should be unique among active dialogs.
+ GURL url_;
+
+ // The id of the certificate for this page.
+ int cert_id_;
+
+ // Parent window.
+ GtkWindow* parent_;
+
+ // The virtual box containing the sections.
+ GtkWidget* contents_;
+
+ // The widget relative to which we are positioned.
+ GtkWidget* anchor_;
+
+ // Provides colors and stuff.
+ ThemeServiceGtk* theme_service_;
+
+ BubbleGtk* bubble_;
+
+ Profile* profile_;
+
+ TabContentsWrapper* tab_contents_wrapper_;
+
+ // All possible icons that go next to the text descriptions to indicate state.
+ std::vector<gfx::Image*> icons_;
+
+ std::map<std::string, GtkWidget*> ui_elements_;
+
+ GtkWidget* identity_details_;
+ bool identity_details_displayed_;
+
+ GtkWidget* connection_details_;
+ bool connection_details_displayed_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebsiteSettingsPopupGtk);
+};
+
+WebsiteSettingsPopupGtk::WebsiteSettingsPopupGtk(
+ gfx::NativeWindow parent,
+ Profile* profile,
+ TabContentsWrapper* tab_contents_wrapper,
+ const GURL& url,
+ const SSLStatus& ssl,
+ bool show_history)
+ : ALLOW_THIS_IN_INITIALIZER_LIST(
+ website_settings_(this,
+ profile,
+ url,
+ ssl,
+ content::CertStore::GetInstance(),
+ tab_contents_wrapper->content_settings())),
+ url_(url),
+ cert_id_(ssl.cert_id),
+ parent_(parent),
+ contents_(NULL),
+ theme_service_(ThemeServiceGtk::GetFrom(profile)),
+ profile_(profile),
+ tab_contents_wrapper_(tab_contents_wrapper),
+ identity_details_(NULL),
+ identity_details_displayed_(false),
+ connection_details_(NULL),
+ connection_details_displayed_(false) {
+ BrowserWindowGtk* browser_window =
+ BrowserWindowGtk::GetBrowserWindowForNativeWindow(parent);
+
+ anchor_ = browser_window->
+ GetToolbar()->GetLocationBarView()->location_icon_widget();
+
+ InitIcons();
+ InitContents();
+
+ 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::Update() {
+ InitContents();
+}
+
+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_);
+ }
+
+ /*
+ gtk_box_pack_start(GTK_BOX(contents_),
+ CreateIdentitySection(),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(contents_),
+ CreateConnectionSection(),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(contents_),
+ gtk_hseparator_new(),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(contents_),
+ CreateHistorySection(),
+ FALSE, FALSE, 0);
+ */
+
+ gtk_box_pack_start(GTK_BOX(contents_),
+ CreateInfoSection(),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(contents_),
+ gtk_hseparator_new(),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(contents_),
+ CreateCookiesSection(),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(contents_),
+ gtk_hseparator_new(),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(contents_),
+ CreatePermissionSection(),
+ 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);
+ */
+
+ gtk_widget_show_all(contents_);
+}
+
+void WebsiteSettingsPopupGtk::InitIcons() {
+ // Loads the icons into the vector. The order must match the SectionStateIcon
+ // enum.
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_GOOD));
+ icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_WARNING_MINOR));
+ icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_WARNING_MAJOR));
+ icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_BAD));
+ icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_INFO));
+ icons_.push_back(&rb.GetNativeImageNamed(IDR_PRODUCT_LOGO_26));
+}
+
+gfx::Image* WebsiteSettingsPopupGtk::GetIconImage(SectionStateIcon icon_id) {
+ if (icon_id == ICON_NONE)
+ return NULL;
+ // The bubble uses new, various icons.
+ return icons_[icon_id];
+}
+
+GtkWidget* WebsiteSettingsPopupGtk::CreateInfoSection() {
+ std::string site_identity_text;
+
+ WebsiteSettingsModel::SiteIdentityStatus status =
+ website_settings_.site_identity_status();
+ switch (status) {
+ case WebsiteSettingsModel::SITE_IDENTITY_STATUS_CERT:
+ case WebsiteSettingsModel::SITE_IDENTITY_STATUS_DNSSEC_CERT:
+ site_identity_text = "Identity verified";
+ break;
+ case WebsiteSettingsModel::SITE_IDENTITY_STATUS_EV_CERT:
+ site_identity_text = UTF16ToUTF8(website_settings_.organization_name());
+ site_identity_text += " - Identity verified";
+ break;
+ default:
+ site_identity_text = "Identity not verified";
+ break;
+ }
+
+ GtkWidget* label = theme_service_->BuildLabel(site_identity_text,
+ 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);
+
+ GtkWidget* section_content = gtk_vbox_new(FALSE, ui::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(section_content), site_info_entry_box, FALSE, FALSE, 0);
+
+ std::string section_title = "Site Information";
+
+ return CreateSection(section_title, section_content);
+}
+
+/*
+GtkWidget* WebsiteSettingsPopupGtk::CreateIdentitySection() {
+ WebsiteSettingsModel::SiteIdentityStatus status =
+ website_settings_.site_identity_status();
+
+ GtkWidget* section_box = gtk_vbox_new(FALSE, ui::kControlSpacing);
+
+ GtkWidget* vbox = gtk_hbox_new(FALSE, ui::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(section_box), vbox, FALSE, FALSE, 0);
+
+ // Add icon.
+ SectionStateIcon icon_id = kIdentityIconIds[status];
+ GdkPixbuf* pixbuf = GetIconImage(icon_id)->ToGdkPixbuf();
+ if (pixbuf) {
+ GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
+ gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 0);
+ gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
+ }
+
+ // Add headline.
+ std::string headline;
+ switch (status) {
+ case WebsiteSettingsModel::SITE_IDENTITY_STATUS_CERT:
+ case WebsiteSettingsModel::SITE_IDENTITY_STATUS_DNSSEC_CERT:
+ headline = "Identity verified";
+ break;
+ case WebsiteSettingsModel::SITE_IDENTITY_STATUS_EV_CERT:
+ headline = UTF16ToUTF8(website_settings_.organization_name());
+ headline += " - Identity verified";
+ break;
+ default:
+ headline = "Identity not verified";
+ break;
+ }
+
+ GtkWidget* label = theme_service_->BuildLabel(headline,
+ 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, 320);
+ // 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(vbox), label, FALSE, FALSE, 0);
+
+ // Add button
+ GtkWidget* show_details_button = gtk_button_new_with_label("Show details");
+ GtkWidget* details_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(details_link_hbox), show_details_button,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), details_link_hbox, FALSE, FALSE, 0);
+ g_signal_connect(show_details_button, "clicked",
+ G_CALLBACK(OnShowIdentityDetailsLinkClickedThunk), this);
+
+ //
+ identity_details_ = gtk_vbox_new(FALSE, ui::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(section_box), identity_details_, TRUE, TRUE, 0);
+
+ return section_box;
+}
+
+void WebsiteSettingsPopupGtk::ShowIdentityDetails(bool show_details,
+ GtkWidget* vbox ) {
+ // Remove all
+ GList* child = gtk_container_get_children(GTK_CONTAINER(vbox));
+ while (child) {
+ //Glist* next = child->next() ? child->next() : NULL;
+ gtk_container_remove(GTK_CONTAINER(vbox), GTK_WIDGET(child->data));
+ child = child->next;
+ }
+
+ if (!show_details) return;
+ // Add details
+ GtkWidget* label = theme_service_->BuildLabel(
+ UTF16ToUTF8(website_settings_.site_identity_details()), ui::kGdkBlack);
+ gtk_label_set_selectable(GTK_LABEL(label), TRUE);
+ 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(vbox), label, FALSE, FALSE, 0);
+
+ // Add certificat button
+ if (website_settings_.site_connection_status() ==
+ WebsiteSettingsModel::SITE_CONNECTION_STATUS_ENCRYPTED) {
+ GtkWidget* view_cert_link = theme_service_->BuildChromeLinkButton(
+ l10n_util::GetStringUTF8(IDS_PAGEINFO_CERT_INFO_BUTTON));
+ GtkWidget* cert_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(cert_link_hbox), view_cert_link,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), cert_link_hbox, FALSE, FALSE, 0);
+ g_signal_connect(view_cert_link, "clicked",
+ G_CALLBACK(OnViewCertLinkClickedThunk), this);
+ }
+}
+
+GtkWidget* WebsiteSettingsPopupGtk::CreateConnectionSection() {
+ WebsiteSettingsModel::SiteConnectionStatus status =
+ website_settings_.site_connection_status();
+
+ GtkWidget* section_box = gtk_vbox_new(FALSE, ui::kControlSpacing);
+
+ GtkWidget* hbox = gtk_hbox_new(FALSE, ui::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(section_box), hbox, FALSE, FALSE, 0);
+
+ // Add icon
+ SectionStateIcon icon_id = kConnectionIconIds[status];
+ GdkPixbuf* pixbuf = GetIconImage(icon_id)->ToGdkPixbuf();
+ if (pixbuf) {
+ GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
+ gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
+ gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
+ }
+
+ // Add text
+ std::string headline;
+ switch (status) {
+ case WebsiteSettingsModel::SITE_CONNECTION_STATUS_ENCRYPTED:
+ headline = "Encrypted Connection";
+ break;
+ case WebsiteSettingsModel::SITE_CONNECTION_STATUS_UNENCRYPTED:
+ headline = "Unencrypted Connection";
+ break;
+ case WebsiteSettingsModel::SITE_CONNECTION_STATUS_MIXED_CONTENT:
+ headline = "Website contains mixed content";
+ break;
+ default:
+ headline = "Error";
+ break;
+ }
+ GtkWidget* label = theme_service_->BuildLabel(headline,
+ 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, 320);
+ // 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(hbox), label, FALSE, FALSE, 0);
+
+ // Add button
+ GtkWidget* show_details_button = gtk_button_new_with_label("Show details");
+
+ GtkWidget* details_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(details_link_hbox), show_details_button,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), details_link_hbox, FALSE, FALSE, 0);
+ g_signal_connect(show_details_button, "clicked",
+ G_CALLBACK(OnShowConnectionDetailsLinkClickedThunk), this);
+
+ // Add details box
+ connection_details_ = gtk_vbox_new(FALSE, ui::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(section_box), connection_details_, TRUE, TRUE, 0);
+
+ return section_box;
+}
+
+void WebsiteSettingsPopupGtk::ShowConnectionDetails(bool show, GtkWidget* vbox) {
+ // Remove all
+ GList* child = gtk_container_get_children(GTK_CONTAINER(vbox));
+ while (child) {
+ //Glist* next = child->next() ? child->next() : NULL;
+ gtk_container_remove(GTK_CONTAINER(vbox), GTK_WIDGET(child->data));
+ child = child->next;
+ }
+
+ if (!show) return;
+
+ // Add details
+ GtkWidget* label = theme_service_->BuildLabel(
+ UTF16ToUTF8(website_settings_.site_connection_details()), ui::kGdkBlack);
+ gtk_label_set_selectable(GTK_LABEL(label), TRUE);
+ 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(vbox), label, FALSE, FALSE, 0);
+}
+
+GtkWidget* WebsiteSettingsPopupGtk::CreateHistorySection() {
+ GtkWidget* section_box = gtk_hbox_new(FALSE, ui::kControlSpacing);
+
+ SectionStateIcon icon_id = ICON_STATE_INFO;
+ GdkPixbuf* pixbuf = GetIconImage(icon_id)->ToGdkPixbuf();
+ if (pixbuf) {
+ GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
+ gtk_box_pack_start(GTK_BOX(section_box), image, FALSE, FALSE, 0);
+ gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
+ }
+
+ GtkWidget* vbox = gtk_vbox_new(FALSE, ui::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(section_box), vbox, TRUE, TRUE, 0);
+
+ GtkWidget* label = theme_service_->BuildLabel("Last Visit",
+ 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(vbox), label, FALSE, FALSE, 0);
+
+ return section_box;
+}
+
+void WebsiteSettingsPopupGtk::OnShowConnectionDetailsLinkClicked(GtkWidget* widget) {
+ connection_details_displayed_ = !connection_details_displayed_;
+ ShowConnectionDetails(connection_details_displayed_, connection_details_);
+ gtk_widget_show_all(contents_);
+}
+
+void WebsiteSettingsPopupGtk::OnShowIdentityDetailsLinkClicked(GtkWidget* widget) {
+ identity_details_displayed_ = !identity_details_displayed_;
+ ShowIdentityDetails(identity_details_displayed_, identity_details_);
+ gtk_widget_show_all(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;
+
+}
+
+GtkWidget* WebsiteSettingsPopupGtk::CreateCookiesSection() {
+ return CreateSection("Cookies and Site Data", CreateCookiesDetails());
+}
+
+GtkWidget* WebsiteSettingsPopupGtk::CreatePermissionSection() {
+ GtkWidget* content_vbox = gtk_vbox_new(FALSE, ui::kControlSpacing);
+
+ PermissionInfoList permission_info_list;
+ website_settings_.GetPermissionInfos(&permission_info_list);
+ for (PermissionInfoList::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";
+ 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(content_vbox), 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(content_vbox), link_hbox,
+ FALSE, FALSE, 0);
+
+ return CreateSection("Permissions", content_vbox);
+}
+
+GtkWidget* WebsiteSettingsPopupGtk::CreateCookiesInfo(
+ const std::string& text, int allowed, int blocked) { // TODO add icon id
+ // Create first party cookies line
+ // TODO
+ GtkWidget* label = theme_service_->BuildLabel(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);
+
+ std::string allowed_count = base::IntToString(allowed);
+ std::string blocked_count = base::IntToString(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);
+
+
+ GtkWidget* hbox = gtk_hbox_new(FALSE, 0);
+ // TODO add icon
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), info, FALSE, FALSE, 0);
+
+ return hbox;
+}
+
+GtkWidget* WebsiteSettingsPopupGtk::CreateCookiesDetails() {
+ GtkWidget* content_vbox = gtk_vbox_new(FALSE, ui::kControlSpacing);
+
+ CookieInfoList cookie_info_list;
+ website_settings_.GetCookieInfos(&cookie_info_list);
+ for (CookieInfoList::const_iterator it = cookie_info_list.begin();
+ it != cookie_info_list.end();
+ ++it) {
+ gtk_box_pack_start(GTK_BOX(content_vbox),
+ CreateCookiesInfo(it->text, it->allowed, it->blocked),
+ FALSE, FALSE, 0);
+ }
+
+ // Create Link line
+ GtkWidget* view_cookies_link = theme_service_->BuildChromeLinkButton(
+ "Show cookies");
+ g_signal_connect(view_cookies_link, "clicked",
+ G_CALLBACK(OnCookiesLinkClickedThunk), this);
+ GtkWidget* link_hbox = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(link_hbox), view_cookies_link,
+ FALSE, 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(hbox), show_cookie_settings_link,
+ // FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(content_vbox), link_hbox, FALSE, FALSE, 0);
+
+ return content_vbox;
+}
+
+void WebsiteSettingsPopupGtk::OnViewCertLinkClicked(GtkWidget* widget) {
+ ShowCertificateViewerByID(GTK_WINDOW(parent_), cert_id_);
+ bubble_->Close();
+}
+
+void WebsiteSettingsPopupGtk::OnHelpLinkClicked(GtkWidget* widget) {
+ Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
+ browser->OpenURL(OpenURLParams(
+ GURL(chrome::kPageInfoHelpCenterURL), content::Referrer(),
+ NEW_FOREGROUND_TAB, content::PAGE_TRANSITION_LINK, false));
+ bubble_->Close();
+}
+
+
+void WebsiteSettingsPopupGtk::OnCookiesLinkClicked(GtkWidget* widget) {
+ new CollectedCookiesGtk(GTK_WINDOW(parent_),
+ tab_contents_wrapper_);
+ 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";
+}
+
+} // namespace
+
+// static
+void WebsiteSettingsPopup::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);
+}
+
+WebsiteSettingsPopup::WebsiteSettingsPopup() {}
+WebsiteSettingsPopup::~WebsiteSettingsPopup() {}
« no previous file with comments | « chrome/browser/ui/gtk/browser_window_gtk.cc ('k') | chrome/browser/ui/website_settings_popup.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698