| 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;
|
| + }
|
| +}
|
|
|