Skip to content

Commit 39a3ae3

Browse files
Simone ManganelliSimone Manganelli
authored andcommitted
finished external .plist prefs file support; includes code to migrate existing parasitic prefs from com.apple.Safari.plist to the new external file
1 parent 4a239f7 commit 39a3ae3

13 files changed

Lines changed: 371 additions & 201 deletions

CTFUserDefaultsController.h

Lines changed: 0 additions & 20 deletions
This file was deleted.

CTFUserDefaultsController.m

Lines changed: 0 additions & 50 deletions
This file was deleted.

ClickToFlash.xcodeproj/project.pbxproj

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@
5151
844695F70F470D1F00DC783A /* CTFsIFRSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 844695910F46FC6600DC783A /* CTFsIFRSupport.m */; };
5252
845704550F4792320017F3F4 /* CTFWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 845704540F4792320017F3F4 /* CTFWhitelist.m */; };
5353
8457045A0F47BC170017F3F4 /* CTFUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 845704590F47BC170017F3F4 /* CTFUtilities.m */; };
54-
A41626600FCB535300181427 /* CTFPreferencesDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = A416265F0FCB535300181427 /* CTFPreferencesDictionary.m */; };
55-
A461B6590FC8ECB20028C966 /* CTFUserDefaultsController.m in Sources */ = {isa = PBXBuildFile; fileRef = A461B6580FC8ECB20028C966 /* CTFUserDefaultsController.m */; };
5654
A494CC2C0F9F2446007D5EEB /* ctf.icns in Resources */ = {isa = PBXBuildFile; fileRef = A494CC2B0F9F2446007D5EEB /* ctf.icns */; };
55+
A4DEFC460FF33D2D00CCB6A8 /* CTFPreferencesDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = A4DEFC430FF33D2D00CCB6A8 /* CTFPreferencesDictionary.m */; };
56+
A4DEFC470FF33D2D00CCB6A8 /* CTFUserDefaultsController.m in Sources */ = {isa = PBXBuildFile; fileRef = A4DEFC450FF33D2D00CCB6A8 /* CTFUserDefaultsController.m */; };
5757
B5028E930F413553004886D7 /* HarnessAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B5028E910F413553004886D7 /* HarnessAppDelegate.m */; };
5858
B5CFF17A0F40EEF1005DB9CC /* WhitelistPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 072189BC0F30D9C3008C8944 /* WhitelistPanel.xib */; };
5959
B5CFF1870F40F000005DB9CC /* HarnessMain.xib in Resources */ = {isa = PBXBuildFile; fileRef = B5CFF1860F40F000005DB9CC /* HarnessMain.xib */; };
@@ -157,11 +157,11 @@
157157
845704540F4792320017F3F4 /* CTFWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CTFWhitelist.m; path = Plugin/CTFWhitelist.m; sourceTree = "<group>"; };
158158
845704580F47BC170017F3F4 /* CTFUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CTFUtilities.h; path = Plugin/CTFUtilities.h; sourceTree = "<group>"; };
159159
845704590F47BC170017F3F4 /* CTFUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CTFUtilities.m; path = Plugin/CTFUtilities.m; sourceTree = "<group>"; };
160-
A416265E0FCB535300181427 /* CTFPreferencesDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTFPreferencesDictionary.h; sourceTree = "<group>"; };
161-
A416265F0FCB535300181427 /* CTFPreferencesDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTFPreferencesDictionary.m; sourceTree = "<group>"; };
162-
A461B6570FC8ECB20028C966 /* CTFUserDefaultsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTFUserDefaultsController.h; sourceTree = "<group>"; };
163-
A461B6580FC8ECB20028C966 /* CTFUserDefaultsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTFUserDefaultsController.m; sourceTree = "<group>"; };
164160
A494CC2B0F9F2446007D5EEB /* ctf.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = ctf.icns; sourceTree = "<group>"; };
161+
A4DEFC420FF33D2D00CCB6A8 /* CTFPreferencesDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CTFPreferencesDictionary.h; path = Plugin/CTFPreferencesDictionary.h; sourceTree = "<group>"; };
162+
A4DEFC430FF33D2D00CCB6A8 /* CTFPreferencesDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CTFPreferencesDictionary.m; path = Plugin/CTFPreferencesDictionary.m; sourceTree = "<group>"; };
163+
A4DEFC440FF33D2D00CCB6A8 /* CTFUserDefaultsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CTFUserDefaultsController.h; path = Plugin/CTFUserDefaultsController.h; sourceTree = "<group>"; };
164+
A4DEFC450FF33D2D00CCB6A8 /* CTFUserDefaultsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CTFUserDefaultsController.m; path = Plugin/CTFUserDefaultsController.m; sourceTree = "<group>"; };
165165
B5028E910F413553004886D7 /* HarnessAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HarnessAppDelegate.m; path = "TestFiles/Debugging Harness/HarnessAppDelegate.m"; sourceTree = "<group>"; };
166166
B5028E920F413553004886D7 /* HarnessAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HarnessAppDelegate.h; path = "TestFiles/Debugging Harness/HarnessAppDelegate.h"; sourceTree = "<group>"; };
167167
B5CFF1740F40EEDB005DB9CC /* Whitelist Panel Harness.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Whitelist Panel Harness.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -229,10 +229,10 @@
229229
children = (
230230
55EB703D0E04A84F0016593D /* Plugin.m */,
231231
55EB703C0E04A84F0016593D /* Plugin.h */,
232-
A416265E0FCB535300181427 /* CTFPreferencesDictionary.h */,
233-
A416265F0FCB535300181427 /* CTFPreferencesDictionary.m */,
234-
A461B6570FC8ECB20028C966 /* CTFUserDefaultsController.h */,
235-
A461B6580FC8ECB20028C966 /* CTFUserDefaultsController.m */,
232+
A4DEFC420FF33D2D00CCB6A8 /* CTFPreferencesDictionary.h */,
233+
A4DEFC430FF33D2D00CCB6A8 /* CTFPreferencesDictionary.m */,
234+
A4DEFC440FF33D2D00CCB6A8 /* CTFUserDefaultsController.h */,
235+
A4DEFC450FF33D2D00CCB6A8 /* CTFUserDefaultsController.m */,
236236
845704580F47BC170017F3F4 /* CTFUtilities.h */,
237237
845704590F47BC170017F3F4 /* CTFUtilities.m */,
238238
6953E4340F3EDE9D0014ECF7 /* CTFMenubarMenuController.m */,
@@ -468,8 +468,8 @@
468468
8457045A0F47BC170017F3F4 /* CTFUtilities.m in Sources */,
469469
79E2EB930F86AAD3005CF170 /* SparkleManager.m in Sources */,
470470
0038DE240FC0CCF0007B54E9 /* MATrackingArea.m in Sources */,
471-
A461B6590FC8ECB20028C966 /* CTFUserDefaultsController.m in Sources */,
472-
A41626600FCB535300181427 /* CTFPreferencesDictionary.m in Sources */,
471+
A4DEFC460FF33D2D00CCB6A8 /* CTFPreferencesDictionary.m in Sources */,
472+
A4DEFC470FF33D2D00CCB6A8 /* CTFUserDefaultsController.m in Sources */,
473473
);
474474
runOnlyForDeploymentPostprocessing = 0;
475475
};
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
// Created by Simone Manganelli on 2009-05-25.
66
// Copyright 2009 __MyCompanyName__. All rights reserved.
77
//
8+
// the rationale for this class is so that we can monitor when
9+
// defaults change, and update the *external* preference file accordingly.
10+
// to do so, we need to monitor the mutable dictionary that represents the
11+
// defaults. this class follows @bbum's suggestion at this URL:
12+
// http://www.omnigroup.com/mailman/archive/macosx-dev/1999-April/007726.html
813

914
#import "CTFPreferencesDictionary.h"
1015

@@ -43,7 +48,6 @@ - (void)dealloc;
4348
- (void)setObject:(id)object forKey:(id)key;
4449
{
4550
[realMutableDictionary setObject:object forKey:key];
46-
NSLog(@"posting a notification of defaults change");
4751
[[NSNotificationCenter defaultCenter] postNotificationName:@"ClickToFlashPluginDefaultsDidChange" object:self];
4852
}
4953

Plugin/CTFUserDefaultsController.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//
2+
// CTFUserDefaultsController.h
3+
// ClickToFlash
4+
//
5+
// Created by Simone Manganelli on 2009-05-23.
6+
// Copyright 2009 __MyCompanyName__. All rights reserved.
7+
//
8+
9+
#import <Cocoa/Cocoa.h>
10+
#import "CTFPreferencesDictionary.h"
11+
12+
13+
@interface CTFUserDefaultsController : NSUserDefaultsController {
14+
CTFPreferencesDictionary *userDefaultsDict;
15+
BOOL hasInited;
16+
}
17+
18+
+ (CTFUserDefaultsController *)standardUserDefaults;
19+
- (void)setUpExternalPrefsDictionary;
20+
21+
- (void)pluginDefaultsDidChange:(NSNotification *)notification;
22+
- (CTFPreferencesDictionary *)values;
23+
- (CTFPreferencesDictionary *)dictionaryRepresentation;
24+
- (void)setValues:(CTFPreferencesDictionary *)newUserDefaultsDict;
25+
26+
- (id)objectForKey:(NSString *)defaultName;
27+
- (void)setObject:(id)value forKey:(NSString *)defaultName;
28+
- (int)integerForKey:(NSString *)defaultName;
29+
- (void)setIntegerForKey:(int)value forKey:(NSString *)defaultName;
30+
- (BOOL)boolForKey:(NSString *)defaultName;
31+
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
32+
- (NSArray *)arrayForKey:(NSString *)defaultName;
33+
- (void)removeObjectForKey:(NSString *)defaultName;
34+
35+
36+
@end

Plugin/CTFUserDefaultsController.m

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
//
2+
// CTFUserDefaultsController.m
3+
// ClickToFlash
4+
//
5+
// Created by Simone Manganelli on 2009-05-23.
6+
// Copyright 2009 __MyCompanyName__. All rights reserved.
7+
//
8+
9+
#import "CTFUserDefaultsController.h"
10+
11+
static CTFUserDefaultsController *sharedInstance = nil;
12+
13+
@implementation CTFUserDefaultsController
14+
15+
+ (CTFUserDefaultsController *)standardUserDefaults;
16+
{
17+
if (! sharedInstance) sharedInstance = [[self alloc] init];
18+
return sharedInstance;
19+
}
20+
21+
- (id)init;
22+
{
23+
if (! sharedInstance) {
24+
if ((self = [super init])) {
25+
hasInited = YES;
26+
}
27+
}
28+
29+
return self;
30+
}
31+
32+
- (void)dealloc;
33+
{
34+
[userDefaultsDict release];
35+
[super dealloc];
36+
}
37+
38+
- (void)setUpExternalPrefsDictionary;
39+
{
40+
[[NSNotificationCenter defaultCenter] addObserver:self
41+
selector:@selector(pluginDefaultsDidChange:)
42+
name:@"ClickToFlashPluginDefaultsDidChange"
43+
object:nil];
44+
[self setValues:[CTFPreferencesDictionary dictionaryWithDictionary:
45+
[[NSUserDefaults standardUserDefaults] persistentDomainForName:@"com.github.rentzsch.clicktoflash"]]
46+
];
47+
}
48+
49+
- (CTFPreferencesDictionary *)values;
50+
{
51+
// I have no idea why, but -init, -initWithDefaults:initialValues:,
52+
// and +sharedUserDefaultsController all never seem to get called. Only
53+
// -awakeFromNib gets called, and that's too late for bindings;
54+
55+
// so instead, we just wait for the initial call to access values,
56+
// and if that call detects that the user defaults dictionary hasn't
57+
// been set up yet, it sets it up and *then* returns the values
58+
59+
if (! userDefaultsDict) [self setUpExternalPrefsDictionary];
60+
return userDefaultsDict;
61+
}
62+
63+
- (CTFPreferencesDictionary *)dictionaryRepresentation;
64+
{
65+
return [self values];
66+
}
67+
68+
- (void)setValues:(CTFPreferencesDictionary *)newUserDefaultsDict;
69+
{
70+
if (! userDefaultsDict) userDefaultsDict = [[CTFPreferencesDictionary alloc] init];
71+
[userDefaultsDict removeAllObjects];
72+
[userDefaultsDict addEntriesFromDictionary:newUserDefaultsDict];
73+
}
74+
75+
- (void)pluginDefaultsDidChange:(NSNotification *)notification;
76+
{
77+
[[NSUserDefaults standardUserDefaults] setPersistentDomain:userDefaultsDict
78+
forName:@"com.github.rentzsch.clicktoflash"];
79+
}
80+
81+
- (id)objectForKey:(NSString *)defaultName;
82+
{
83+
return [[self values] objectForKey:defaultName];
84+
}
85+
86+
- (void)setObject:(id)value forKey:(NSString *)defaultName;
87+
{
88+
[[self values] setObject:value forKey:defaultName];
89+
}
90+
91+
- (int)integerForKey:(NSString *)defaultName;
92+
{
93+
return [[[self values] objectForKey:defaultName] intValue];
94+
}
95+
96+
- (void)setIntegerForKey:(int)value forKey:(NSString *)defaultName;
97+
{
98+
[[self values] setObject:[NSNumber numberWithInt:value] forKey:defaultName];
99+
}
100+
101+
- (BOOL)boolForKey:(NSString *)defaultName;
102+
{
103+
return [[[self values] objectForKey:defaultName] boolValue];
104+
}
105+
106+
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
107+
{
108+
[[self values] setObject:[NSNumber numberWithBool:value] forKey:defaultName];
109+
}
110+
111+
- (NSArray *)arrayForKey:(NSString *)defaultName;
112+
{
113+
id value = [[self values] objectForKey:defaultName];
114+
id valueToReturn = nil;
115+
if ([[value className] isEqualToString:@"NSCFArray"]) valueToReturn = value;
116+
return valueToReturn;
117+
}
118+
119+
- (void)removeObjectForKey:(NSString *)defaultName;
120+
{
121+
[[self values] removeObjectForKey:defaultName];
122+
}
123+
124+
@end

Plugin/CTFWhitelist.m

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@ of this software and associated documentation files (the "Software"), to deal
2929
#import "CTFUtilities.h"
3030
#import "CTFMenubarMenuController.h"
3131

32+
#import "CTFUserDefaultsController.h"
33+
#import "CTFPreferencesDictionary.h"
34+
3235

3336
// NSNotification names
3437
static NSString *sCTFWhitelistAdditionMade = @"CTFWhitelistAdditionMade";
3538

36-
// NSUserDefaults keys
39+
// CTFUserDefaultsController keys
3740
static NSString *sHostSiteInfoDefaultsKey = @"ClickToFlash_siteInfo";
3841

3942
typedef enum {
@@ -160,13 +163,13 @@ - (BOOL) _isHostWhitelisted
160163

161164
- (BOOL) _isWhiteListedForHostString:(NSString *)hostString
162165
{
163-
NSArray *hostWhitelist = [[NSUserDefaults standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey];
166+
NSArray *hostWhitelist = [[CTFUserDefaultsController standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey];
164167
return hostWhitelist && itemForSite(hostWhitelist, hostString) != nil;
165168
}
166169

167170
- (NSMutableArray *) _mutableSiteInfo
168171
{
169-
NSMutableArray *hostWhitelist = [[[[NSUserDefaults standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey] mutableCopy] autorelease];
172+
NSMutableArray *hostWhitelist = [[[[CTFUserDefaultsController standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey] mutableCopy] autorelease];
170173
if (hostWhitelist == nil) {
171174
hostWhitelist = [NSMutableArray array];
172175
}
@@ -177,7 +180,7 @@ - (void) _addHostToWhitelist
177180
{
178181
NSMutableArray *siteInfo = [self _mutableSiteInfo];
179182
[siteInfo addObject: whitelistItemForSite([self host])];
180-
[[NSUserDefaults standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
183+
[[CTFUserDefaultsController standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
181184
[[NSNotificationCenter defaultCenter] postNotificationName: sCTFWhitelistAdditionMade object: self];
182185
}
183186

@@ -188,7 +191,7 @@ - (void) _removeHostFromWhitelist
188191

189192
if(foundIndex != NSNotFound) {
190193
[siteInfo removeObjectAtIndex: foundIndex];
191-
[[NSUserDefaults standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
194+
[[CTFUserDefaultsController standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
192195
}
193196
}
194197

Plugin/CTFsIFRSupport.m

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ of this software and associated documentation files (the "Software"), to deal
2626

2727
#import "CTFsIFRSupport.h"
2828

29+
#import "CTFUserDefaultsController.h"
30+
#import "CTFPreferencesDictionary.h"
31+
2932
typedef enum {
3033
CTFSifrModeDoNothing = 0,
3134
CTFSifrModeAutoLoadSifr = 1,
@@ -61,7 +64,7 @@ - (NSUInteger) _sifrVersionInstalled
6164

6265
- (BOOL) _shouldDeSIFR
6366
{
64-
if ([[NSUserDefaults standardUserDefaults] integerForKey: sSifrModeDefaultsKey] == CTFSifrModeDeSifr) {
67+
if ([[CTFUserDefaultsController standardUserDefaults] integerForKey: sSifrModeDefaultsKey] == CTFSifrModeDeSifr) {
6568
_sifrVersion = [self _sifrVersionInstalled];
6669

6770
if( _sifrVersion != 0 )
@@ -73,7 +76,7 @@ - (BOOL) _shouldDeSIFR
7376

7477
- (BOOL) _shouldAutoLoadSIFR
7578
{
76-
return [[NSUserDefaults standardUserDefaults] integerForKey: sSifrModeDefaultsKey] == CTFSifrModeAutoLoadSifr;
79+
return [[CTFUserDefaultsController standardUserDefaults] integerForKey: sSifrModeDefaultsKey] == CTFSifrModeAutoLoadSifr;
7780
}
7881

7982
- (void) _disableSIFR

0 commit comments

Comments
 (0)