Index: chrome/browser/cocoa/content_settings_dialog_controller.mm |
=================================================================== |
--- chrome/browser/cocoa/content_settings_dialog_controller.mm (revision 49029) |
+++ chrome/browser/cocoa/content_settings_dialog_controller.mm (working copy) |
@@ -25,24 +25,9 @@ |
namespace { |
-// Index of the "enabled" and "disabled" radio group settings in all tabs except |
-// for the cookies tab. |
-const NSInteger kEnabledIndex = 0; |
-const NSInteger kDisabledIndex = 1; |
- |
-// Indices of the various cookie settings in the cookie radio group. |
-const NSInteger kCookieEnabledIndex = 0; |
-const NSInteger kCookieAskIndex = 1; |
-const NSInteger kCookieDisabledIndex = 2; |
- |
// Stores the currently visible content settings dialog, if any. |
ContentSettingsDialogController* g_instance = nil; |
-// Indices of the various geolocation settings in the geolocation radio group. |
-const NSInteger kGeolocationEnabledIndex = 0; |
-const NSInteger kGeolocationAskIndex = 1; |
-const NSInteger kGeolocationDisabledIndex = 2; |
- |
// Walks views in top-down order, wraps each to their current width, and moves |
// the latter ones down to prevent overlaps. |
CGFloat VerticallyReflowGroup(NSArray* views) { |
@@ -77,15 +62,9 @@ |
- (void)selectTab:(ContentSettingsType)settingsType; |
- (void)showExceptionsForType:(ContentSettingsType)settingsType; |
-// Properties that the radio groups and checkboxes are bound to. |
-@property(assign, nonatomic) NSInteger cookieSettingIndex; |
-@property(assign, nonatomic) BOOL blockThirdPartyCookies; |
-@property(assign, nonatomic) BOOL clearSiteDataOnExit; |
-@property(assign, nonatomic) NSInteger imagesEnabledIndex; |
-@property(assign, nonatomic) NSInteger javaScriptEnabledIndex; |
-@property(assign, nonatomic) NSInteger popupsEnabledIndex; |
-@property(assign, nonatomic) NSInteger pluginsEnabledIndex; |
-@property(assign, nonatomic) NSInteger geolocationSettingIndex; |
+// Callback when preferences are changed. |prefName| is the name of the |
+// pref that has changed. |
+- (void)prefChanged:(std::wstring*)prefName; |
@end |
@@ -102,25 +81,42 @@ |
virtual void Observe(NotificationType type, |
const NotificationSource& source, |
const NotificationDetails& details) { |
- if (type == NotificationType::PREF_CHANGED) { |
- std::wstring* pref_name = Details<std::wstring>(details).ptr(); |
- if (*pref_name == prefs::kClearSiteDataOnExit) { |
- // Update UI. |
- [controller_ setClearSiteDataOnExit:[controller_ clearSiteDataOnExit]]; |
- } |
+ if (!disabled_ && type == NotificationType::PREF_CHANGED) { |
+ [controller_ prefChanged:Details<std::wstring>(details).ptr()]; |
} |
} |
+ void SetDisabled(bool disabled) { |
+ disabled_ = disabled; |
+ } |
+ |
private: |
ContentSettingsDialogController* controller_; // weak, owns us |
+ bool disabled_; // true if notifications should be ignored. |
}; |
+// A C++ utility class to disable notifications for PrefsObserverBridge. |
+// The intended usage is to create on the stack. |
+class PrefObserverDisabler { |
+ public: |
+ PrefObserverDisabler(PrefObserverBridge *bridge) : bridge_(bridge) { |
+ bridge_->SetDisabled(true); |
+ } |
+ |
+ ~PrefObserverDisabler() { |
+ bridge_->SetDisabled(false); |
+ } |
+ |
+ private: |
+ PrefObserverBridge *bridge_; |
+}; |
+ |
} // ContentSettingsDialogControllerInternal |
@implementation ContentSettingsDialogController |
-+(id)showContentSettingsForType:(ContentSettingsType)settingsType |
- profile:(Profile*)profile { |
++ (id)showContentSettingsForType:(ContentSettingsType)settingsType |
+ profile:(Profile*)profile { |
profile = profile->GetOriginalProfile(); |
if (!g_instance) |
g_instance = [[self alloc] initWithProfile:profile]; |
@@ -157,15 +153,35 @@ |
observer_.reset( |
new ContentSettingsDialogControllerInternal::PrefObserverBridge(self)); |
clearSiteDataOnExit_.Init(prefs::kClearSiteDataOnExit, |
- profile->GetPrefs(), observer_.get()); |
+ profile_->GetPrefs(), observer_.get()); |
+ // Manually observe notifications for preferences that are grouped in |
+ // the HostContentSettingsMap or GeolocationContentSettingsMap. |
+ PrefService* prefs = profile_->GetPrefs(); |
+ prefs->AddPrefObserver(prefs::kBlockThirdPartyCookies, observer_.get()); |
+ prefs->AddPrefObserver(prefs::kDefaultContentSettings, observer_.get()); |
+ prefs->AddPrefObserver(prefs::kGeolocationDefaultContentSetting, |
+ observer_.get()); |
+ |
// We don't need to observe changes in this value. |
lastSelectedTab_.Init(prefs::kContentSettingsWindowLastTabIndex, |
- profile->GetPrefs(), NULL); |
+ profile_->GetPrefs(), NULL); |
} |
return self; |
} |
+- (void)dealloc { |
+ if (profile_) { |
+ PrefService* prefs = profile_->GetPrefs(); |
+ prefs->RemovePrefObserver(prefs::kBlockThirdPartyCookies, observer_.get()); |
+ prefs->RemovePrefObserver(prefs::kDefaultContentSettings, observer_.get()); |
+ prefs->RemovePrefObserver(prefs::kGeolocationDefaultContentSetting, |
+ observer_.get()); |
+ } |
+ |
+ [super dealloc]; |
+} |
+ |
- (void)closeExceptionsSheet { |
NSWindow* attachedSheet = [[self window] attachedSheet]; |
if (attachedSheet) { |
@@ -228,6 +244,8 @@ |
default: |
NOTREACHED(); |
} |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |
CONTENT_SETTINGS_TYPE_COOKIES, |
setting); |
@@ -252,6 +270,8 @@ |
- (void)setBlockThirdPartyCookies:(BOOL)value { |
HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
settingsMap->SetBlockThirdPartyCookies(value); |
} |
@@ -260,7 +280,9 @@ |
} |
- (void)setClearSiteDataOnExit:(BOOL)value { |
- return clearSiteDataOnExit_.SetValue(value); |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
+ clearSiteDataOnExit_.SetValue(value); |
} |
// Shows the cookies controller. |
@@ -331,8 +353,10 @@ |
} |
- (void)setImagesEnabledIndex:(NSInteger)value { |
- ContentSetting setting = value == kEnabledIndex ? |
+ ContentSetting setting = value == kContentSettingsEnabledIndex ? |
CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |
CONTENT_SETTINGS_TYPE_IMAGES, setting); |
} |
@@ -342,12 +366,14 @@ |
bool enabled = |
settingsMap->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_IMAGES) == |
CONTENT_SETTING_ALLOW; |
- return enabled ? kEnabledIndex : kDisabledIndex; |
+ return enabled ? kContentSettingsEnabledIndex : kContentSettingsDisabledIndex; |
} |
- (void)setJavaScriptEnabledIndex:(NSInteger)value { |
- ContentSetting setting = value == kEnabledIndex ? |
+ ContentSetting setting = value == kContentSettingsEnabledIndex ? |
CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |
CONTENT_SETTINGS_TYPE_JAVASCRIPT, setting); |
} |
@@ -357,12 +383,14 @@ |
bool enabled = |
settingsMap->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_JAVASCRIPT) == |
CONTENT_SETTING_ALLOW; |
- return enabled ? kEnabledIndex : kDisabledIndex; |
+ return enabled ? kContentSettingsEnabledIndex : kContentSettingsDisabledIndex; |
} |
- (void)setPluginsEnabledIndex:(NSInteger)value { |
- ContentSetting setting = value == kEnabledIndex ? |
+ ContentSetting setting = value == kContentSettingsEnabledIndex ? |
CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |
CONTENT_SETTINGS_TYPE_PLUGINS, setting); |
} |
@@ -372,12 +400,14 @@ |
bool enabled = |
settingsMap->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS) == |
CONTENT_SETTING_ALLOW; |
- return enabled ? kEnabledIndex : kDisabledIndex; |
+ return enabled ? kContentSettingsEnabledIndex : kContentSettingsDisabledIndex; |
} |
- (void)setPopupsEnabledIndex:(NSInteger)value { |
- ContentSetting setting = value == kEnabledIndex ? |
+ ContentSetting setting = value == kContentSettingsEnabledIndex ? |
CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |
CONTENT_SETTINGS_TYPE_POPUPS, setting); |
} |
@@ -387,7 +417,7 @@ |
bool enabled = |
settingsMap->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_POPUPS) == |
CONTENT_SETTING_ALLOW; |
- return enabled ? kEnabledIndex : kDisabledIndex; |
+ return enabled ? kContentSettingsEnabledIndex : kContentSettingsDisabledIndex; |
} |
- (void)setGeolocationSettingIndex:(NSInteger)value { |
@@ -399,6 +429,8 @@ |
default: |
NOTREACHED(); |
} |
+ ContentSettingsDialogControllerInternal::PrefObserverDisabler |
+ disabler(observer_.get()); |
profile_->GetGeolocationContentSettingsMap()->SetDefaultContentSetting( |
setting); |
} |
@@ -416,4 +448,38 @@ |
} |
} |
+// Callback when preferences are changed. |prefName| is the name of the |
+// pref that has changed and should not be NULL. |
+- (void)prefChanged:(std::wstring*)prefName { |
+ DCHECK(prefName); |
+ if (!prefName) return; |
+ if (*prefName == prefs::kClearSiteDataOnExit) { |
+ [self willChangeValueForKey:@"clearSiteDataOnExit"]; |
+ [self didChangeValueForKey:@"clearSiteDataOnExit"]; |
+ } |
+ if (*prefName == prefs::kBlockThirdPartyCookies) { |
+ [self willChangeValueForKey:@"blockThirdPartyCookies"]; |
+ [self didChangeValueForKey:@"blockThirdPartyCookies"]; |
+ } |
+ if (*prefName == prefs::kDefaultContentSettings) { |
+ // We don't know exactly which setting has changed, so we'll tickle all |
+ // of the properties that apply to kDefaultContentSettings. This will |
+ // keep the UI up-to-date. |
+ [self willChangeValueForKey:@"cookieSettingIndex"]; |
+ [self didChangeValueForKey:@"cookieSettingIndex"]; |
+ [self willChangeValueForKey:@"imagesEnabledIndex"]; |
+ [self didChangeValueForKey:@"imagesEnabledIndex"]; |
+ [self willChangeValueForKey:@"javaScriptEnabledIndex"]; |
+ [self didChangeValueForKey:@"javaScriptEnabledIndex"]; |
+ [self willChangeValueForKey:@"pluginsEnabledIndex"]; |
+ [self didChangeValueForKey:@"pluginsEnabledIndex"]; |
+ [self willChangeValueForKey:@"popupsEnabledIndex"]; |
+ [self didChangeValueForKey:@"popupsEnabledIndex"]; |
+ } |
+ if (*prefName == prefs::kGeolocationDefaultContentSetting) { |
+ [self willChangeValueForKey:@"geolocationSettingIndex"]; |
+ [self didChangeValueForKey:@"geolocationSettingIndex"]; |
+ } |
+} |
+ |
@end |