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

Unified Diff: chrome/browser/cocoa/content_settings_dialog_controller.mm

Issue 2063020: Add observers to ContentSettingsDialogController so that the dialog will show... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 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
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

Powered by Google App Engine
This is Rietveld 408576698