Index: chrome/browser/gtk/options/content_filter_page_gtk.cc |
diff --git a/chrome/browser/gtk/options/content_filter_page_gtk.cc b/chrome/browser/gtk/options/content_filter_page_gtk.cc |
index d352f52ea712cbc86cdb7a776753bdd14b0a3c02..063caf2c789071f633c3e93965e754dbf0bcea51 100644 |
--- a/chrome/browser/gtk/options/content_filter_page_gtk.cc |
+++ b/chrome/browser/gtk/options/content_filter_page_gtk.cc |
@@ -9,9 +9,9 @@ |
#include "chrome/browser/browser.h" |
#include "chrome/browser/geolocation/geolocation_content_settings_map.h" |
#include "chrome/browser/geolocation/geolocation_exceptions_table_model.h" |
-#include "chrome/browser/host_content_settings_map.h" |
#include "chrome/browser/plugin_exceptions_table_model.h" |
#include "chrome/browser/profile.h" |
+#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/gtk/browser_window_gtk.h" |
#include "chrome/browser/gtk/gtk_chrome_link_button.h" |
#include "chrome/browser/gtk/gtk_util.h" |
@@ -21,7 +21,6 @@ |
#include "chrome/browser/notifications/notification_exceptions_table_model.h" |
#include "chrome/browser/show_options_url.h" |
#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
#include "chrome/common/url_constants.h" |
#include "grit/generated_resources.h" |
#include "grit/locale_settings.h" |
@@ -30,7 +29,8 @@ ContentFilterPageGtk::ContentFilterPageGtk(Profile* profile, |
ContentSettingsType content_type) |
: OptionsPageBase(profile), |
content_type_(content_type), |
- ask_radio_(NULL) { |
+ ask_radio_(NULL), |
+ ignore_toggle_(false) { |
static const int kTitleIDs[] = { |
0, // This dialog isn't used for cookies. |
IDS_IMAGES_SETTING_LABEL, |
@@ -113,31 +113,12 @@ GtkWidget* ContentFilterPageGtk::InitGroup() { |
l10n_util::GetStringUTF8(kBlockIDs[content_type_]).c_str()); |
gtk_box_pack_start(GTK_BOX(vbox), block_radio_, FALSE, FALSE, 0); |
- ContentSetting default_setting; |
- if (content_type_ == CONTENT_SETTINGS_TYPE_GEOLOCATION) { |
- default_setting = profile()->GetGeolocationContentSettingsMap()-> |
- GetDefaultContentSetting(); |
- } else if (content_type_ == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { |
- default_setting = profile()->GetDesktopNotificationService()-> |
- GetDefaultContentSetting(); |
- } else { |
- default_setting = profile()->GetHostContentSettingsMap()-> |
- GetDefaultContentSetting(content_type_); |
- } |
- // Now that these have been added to the view hierarchy, it's safe to call |
- // SetChecked() on them. |
- if (default_setting == CONTENT_SETTING_ALLOW) { |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(allow_radio_), TRUE); |
- } else if (default_setting == CONTENT_SETTING_ASK) { |
- DCHECK(ask_radio_); |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ask_radio_), TRUE); |
- } else { |
- DCHECK(default_setting == CONTENT_SETTING_BLOCK); |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(block_radio_), TRUE); |
- } |
+ exceptions_button_ = gtk_button_new_with_label( |
+ l10n_util::GetStringUTF8(IDS_COOKIES_EXCEPTIONS_BUTTON).c_str()); |
+ GtkWidget* hbox = gtk_hbox_new(FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(hbox), exceptions_button_, FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
- // Now that we've set the default value, we can connect to the radio button's |
- // toggled signal. |
g_signal_connect(G_OBJECT(allow_radio_), "toggled", |
G_CALLBACK(OnAllowToggledThunk), this); |
if (ask_radio_) { |
@@ -147,15 +128,9 @@ GtkWidget* ContentFilterPageGtk::InitGroup() { |
g_signal_connect(G_OBJECT(block_radio_), "toggled", |
G_CALLBACK(OnAllowToggledThunk), this); |
- GtkWidget* exceptions_button = gtk_button_new_with_label( |
- l10n_util::GetStringUTF8(IDS_COOKIES_EXCEPTIONS_BUTTON).c_str()); |
- g_signal_connect(G_OBJECT(exceptions_button), "clicked", |
+ g_signal_connect(G_OBJECT(exceptions_button_), "clicked", |
G_CALLBACK(OnExceptionsClickedThunk), this); |
- GtkWidget* hbox = gtk_hbox_new(FALSE, 0); |
- gtk_box_pack_start(GTK_BOX(hbox), exceptions_button, FALSE, FALSE, 0); |
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
- |
// Add the "Disable individual plug-ins..." link on the plug-ins page. |
if (content_type_ == CONTENT_SETTINGS_TYPE_PLUGINS) { |
GtkWidget* plugins_page_link = gtk_chrome_link_button_new( |
@@ -168,18 +143,75 @@ GtkWidget* ContentFilterPageGtk::InitGroup() { |
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
} |
+ // Now that the buttons have been added to the view hierarchy, it's safe to |
+ // call SetChecked() on them. So Update the Buttons. |
+ ignore_toggle_ = true; |
+ UpdateButtonsState(); |
+ ignore_toggle_ = false; |
+ |
+ // Register for CONTENT_SETTINGS_CHANGED notifications to update the UI |
+ // aften content settings change. |
+ registrar_.Add(this, NotificationType::CONTENT_SETTINGS_CHANGED, |
+ NotificationService::AllSources()); |
+ |
return vbox; |
} |
+void ContentFilterPageGtk::UpdateButtonsState() { |
+ // Get default_setting. |
+ ContentSetting default_setting; |
+ if (content_type_ == CONTENT_SETTINGS_TYPE_GEOLOCATION) { |
+ default_setting = profile()->GetGeolocationContentSettingsMap()-> |
+ GetDefaultContentSetting(); |
+ } else if (content_type_ == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { |
+ default_setting = profile()->GetDesktopNotificationService()-> |
+ GetDefaultContentSetting(); |
+ } else { |
+ default_setting = profile()->GetHostContentSettingsMap()-> |
+ GetDefaultContentSetting(content_type_); |
+ } |
+ // Set UI state. |
+ if (default_setting == CONTENT_SETTING_ALLOW) { |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(allow_radio_), TRUE); |
+ } else if (default_setting == CONTENT_SETTING_ASK) { |
+ DCHECK(ask_radio_); |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ask_radio_), TRUE); |
+ } else { |
+ DCHECK(default_setting == CONTENT_SETTING_BLOCK); |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(block_radio_), TRUE); |
+ } |
+ |
+ // Disable the UI if the default content setting is managed. |
+ bool sensitive = !profile()->GetHostContentSettingsMap()-> |
+ IsDefaultContentSettingManaged(content_type_); |
+ gtk_widget_set_sensitive(allow_radio_, sensitive); |
+ gtk_widget_set_sensitive(block_radio_, sensitive); |
+ if (ask_radio_) |
+ gtk_widget_set_sensitive(ask_radio_, sensitive); |
+ gtk_widget_set_sensitive(exceptions_button_, sensitive); |
+} |
+ |
void ContentFilterPageGtk::OnAllowToggled(GtkWidget* toggle_button) { |
+ if (ignore_toggle_) |
+ return; |
+ |
+ if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle_button))) { |
+ // When selecting a radio button, we get two signals (one for the old radio |
+ // being toggled off, one for the new one being toggled on.) Ignore the |
+ // signal for toggling off the old button. |
+ return; |
+ } |
+ |
DCHECK((toggle_button == allow_radio_) || |
(toggle_button == ask_radio_) || |
(toggle_button == block_radio_)); |
+ |
ContentSetting default_setting = |
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(allow_radio_)) ? |
CONTENT_SETTING_ALLOW : |
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(block_radio_)) ? |
CONTENT_SETTING_BLOCK : CONTENT_SETTING_ASK; |
+ |
DCHECK(ask_radio_ || default_setting != CONTENT_SETTING_ASK); |
if (content_type_ == CONTENT_SETTINGS_TYPE_GEOLOCATION) { |
profile()->GetGeolocationContentSettingsMap()->SetDefaultContentSetting( |
@@ -236,3 +268,25 @@ void ContentFilterPageGtk::OnExceptionsClicked(GtkWidget* button) { |
void ContentFilterPageGtk::OnPluginsPageLinkClicked(GtkWidget* button) { |
browser::ShowOptionsURL(profile(), GURL(chrome::kChromeUIPluginsURL)); |
} |
+ |
+void ContentFilterPageGtk::Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
+ |
+ if (type == NotificationType::CONTENT_SETTINGS_CHANGED) { |
+ NotifyContentSettingsChanged( |
+ Details<HostContentSettingsMap::ContentSettingsDetails>(details).ptr()); |
+ } else { |
+ OptionsPageBase::Observe(type, source, details); |
+ } |
+} |
+ |
+void ContentFilterPageGtk::NotifyContentSettingsChanged( |
+ const HostContentSettingsMap::ContentSettingsDetails *details) { |
+ if (details->type() == CONTENT_SETTINGS_TYPE_DEFAULT || |
+ details->type() == content_type_) { |
+ ignore_toggle_ = true; |
+ UpdateButtonsState(); |
+ ignore_toggle_ = false; |
+ } |
+} |