Skip to content

Commit

Permalink
Instead of spending hours winding through a half-dozen separate @simX
Browse files Browse the repository at this point in the history
…commits, I'm goin' ghetto, batch-merging them all and letting God sort them out:

[NEW] User preferences now are stored in a separate file, allowing them to be shared across application. Parasitic prefs are migrated to the external file and then deleted. bug 73
[NEW] Application-wide whitelisting for apps like Hulu Desktop, PandoraJam and Wii Transfer that utilize Flash. bugs 26, 118 and 230
[NEW] "Play Fullscreen in QuickTime Player" contextual menu command for viewing YouTube videos in QuickTime Player (which has niceties like supporting the Apple remote). bug 216
[NEW] Uninstall button (with a confirmation sheet) in the settings window. bug 226
  • Loading branch information
rentzsch committed Jun 27, 2009
1 parent 635d3c2 commit 896243b
Show file tree
Hide file tree
Showing 14 changed files with 1,605 additions and 173 deletions.
12 changes: 12 additions & 0 deletions ClickToFlash.xcodeproj/project.pbxproj
Expand Up @@ -52,6 +52,8 @@
845704550F4792320017F3F4 /* CTFWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 845704540F4792320017F3F4 /* CTFWhitelist.m */; };
8457045A0F47BC170017F3F4 /* CTFUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 845704590F47BC170017F3F4 /* CTFUtilities.m */; };
A494CC2C0F9F2446007D5EEB /* ctf.icns in Resources */ = {isa = PBXBuildFile; fileRef = A494CC2B0F9F2446007D5EEB /* ctf.icns */; };
A4DEFC7A0FF33F7400CCB6A8 /* CTFPreferencesDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = A4DEFC770FF33F7400CCB6A8 /* CTFPreferencesDictionary.m */; };
A4DEFC7B0FF33F7400CCB6A8 /* CTFUserDefaultsController.m in Sources */ = {isa = PBXBuildFile; fileRef = A4DEFC790FF33F7400CCB6A8 /* CTFUserDefaultsController.m */; };
D9566D8C0F380C9F00358646 /* sifr2-addons.js in Resources */ = {isa = PBXBuildFile; fileRef = D9566C2C0F37EA0800358646 /* sifr2-addons.js */; };
D9566D8D0F380C9F00358646 /* sifr3-addons.js in Resources */ = {isa = PBXBuildFile; fileRef = D9566C2D0F37EA0800358646 /* sifr3-addons.js */; };
/* End PBXBuildFile section */
Expand Down Expand Up @@ -151,6 +153,10 @@
845704580F47BC170017F3F4 /* CTFUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CTFUtilities.h; path = Plugin/CTFUtilities.h; sourceTree = "<group>"; };
845704590F47BC170017F3F4 /* CTFUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CTFUtilities.m; path = Plugin/CTFUtilities.m; sourceTree = "<group>"; };
A494CC2B0F9F2446007D5EEB /* ctf.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = ctf.icns; path = Plugin/ctf.icns; sourceTree = "<group>"; };
A4DEFC760FF33F7400CCB6A8 /* CTFPreferencesDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CTFPreferencesDictionary.h; path = Plugin/CTFPreferencesDictionary.h; sourceTree = "<group>"; };
A4DEFC770FF33F7400CCB6A8 /* CTFPreferencesDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CTFPreferencesDictionary.m; path = Plugin/CTFPreferencesDictionary.m; sourceTree = "<group>"; };
A4DEFC780FF33F7400CCB6A8 /* CTFUserDefaultsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CTFUserDefaultsController.h; path = Plugin/CTFUserDefaultsController.h; sourceTree = "<group>"; };
A4DEFC790FF33F7400CCB6A8 /* CTFUserDefaultsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CTFUserDefaultsController.m; path = Plugin/CTFUserDefaultsController.m; sourceTree = "<group>"; };
D9566C2C0F37EA0800358646 /* sifr2-addons.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "sifr2-addons.js"; sourceTree = "<group>"; };
D9566C2D0F37EA0800358646 /* sifr3-addons.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "sifr3-addons.js"; sourceTree = "<group>"; };
D9FFA7650F3941C1008A8708 /* ClickToFlash_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ClickToFlash_Prefix.pch; path = Plugin/ClickToFlash_Prefix.pch; sourceTree = "<group>"; };
Expand Down Expand Up @@ -193,6 +199,10 @@
children = (
55EB703D0E04A84F0016593D /* Plugin.m */,
55EB703C0E04A84F0016593D /* Plugin.h */,
A4DEFC760FF33F7400CCB6A8 /* CTFPreferencesDictionary.h */,
A4DEFC770FF33F7400CCB6A8 /* CTFPreferencesDictionary.m */,
A4DEFC780FF33F7400CCB6A8 /* CTFUserDefaultsController.h */,
A4DEFC790FF33F7400CCB6A8 /* CTFUserDefaultsController.m */,
845704580F47BC170017F3F4 /* CTFUtilities.h */,
845704590F47BC170017F3F4 /* CTFUtilities.m */,
6953E4340F3EDE9D0014ECF7 /* CTFMenubarMenuController.m */,
Expand Down Expand Up @@ -391,6 +401,8 @@
8457045A0F47BC170017F3F4 /* CTFUtilities.m in Sources */,
79E2EB930F86AAD3005CF170 /* SparkleManager.m in Sources */,
0038DE240FC0CCF0007B54E9 /* MATrackingArea.m in Sources */,
A4DEFC7A0FF33F7400CCB6A8 /* CTFPreferencesDictionary.m in Sources */,
A4DEFC7B0FF33F7400CCB6A8 /* CTFUserDefaultsController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
17 changes: 17 additions & 0 deletions Plugin/CTFPreferencesDictionary.h
@@ -0,0 +1,17 @@
//
// CTFPreferencesDictionary.h
// ClickToFlash
//
// Created by Simone Manganelli on 2009-05-25.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import <Cocoa/Cocoa.h>


@interface CTFPreferencesDictionary : NSMutableDictionary {
NSMutableDictionary *realMutableDictionary;
BOOL hasInited;
}

@end
92 changes: 92 additions & 0 deletions Plugin/CTFPreferencesDictionary.m
@@ -0,0 +1,92 @@
//
// CTFPreferencesDictionary.m
// ClickToFlash
//
// Created by Simone Manganelli on 2009-05-25.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//
// the rationale for this class is so that we can monitor when
// defaults change, and update the *external* preference file accordingly.
// to do so, we need to monitor the mutable dictionary that represents the
// defaults. this class follows @bbum's suggestion at this URL:
// http://www.omnigroup.com/mailman/archive/macosx-dev/1999-April/007726.html

#import "CTFPreferencesDictionary.h"

static CTFPreferencesDictionary *sharedInstance = nil;

@implementation CTFPreferencesDictionary

+ (id)dictionaryWithDictionary:(NSDictionary *)otherDictionary;
{
return [[CTFPreferencesDictionary alloc] initWithDictionary:otherDictionary];
}

+ (id)allocWithZone:(NSZone *)zone;
{
if (sharedInstance) {
return [sharedInstance retain];
} else {
return [super allocWithZone:zone];
}
}

- (id)init;
{
if (! sharedInstance) {
if ((self = [super init])) {
realMutableDictionary = [[NSMutableDictionary alloc] init];
hasInited = YES;
}
}

return self;
}

- (id)initWithDictionary:(NSDictionary *)otherDictionary;
{
if (! sharedInstance) {
if ((self = [super init])) {
realMutableDictionary = [[NSMutableDictionary dictionaryWithDictionary:otherDictionary] retain];
hasInited = YES;
}
} else {
[sharedInstance setDictionary:otherDictionary];
}

return self;
}

- (void)dealloc;
{
[realMutableDictionary release];
[super dealloc];
}

- (void)setObject:(id)object forKey:(id)key;
{
[realMutableDictionary setObject:object forKey:key];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ClickToFlashPluginDefaultsDidChange" object:self];
}

- (void)removeObjectForKey:(id)key;
{
[realMutableDictionary removeObjectForKey:key];
}

- (id)objectForKey:(id)key;
{
return [realMutableDictionary objectForKey:key];
}

- (NSUInteger)count;
{
return [realMutableDictionary count];
}

- (NSEnumerator *)keyEnumerator;
{
return [realMutableDictionary keyEnumerator];
}

@end
36 changes: 36 additions & 0 deletions Plugin/CTFUserDefaultsController.h
@@ -0,0 +1,36 @@
//
// CTFUserDefaultsController.h
// ClickToFlash
//
// Created by Simone Manganelli on 2009-05-23.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import <Cocoa/Cocoa.h>
#import "CTFPreferencesDictionary.h"


@interface CTFUserDefaultsController : NSUserDefaultsController {
CTFPreferencesDictionary *userDefaultsDict;
BOOL hasInited;
}

+ (CTFUserDefaultsController *)standardUserDefaults;
- (void)setUpExternalPrefsDictionary;

- (void)pluginDefaultsDidChange:(NSNotification *)notification;
- (CTFPreferencesDictionary *)values;
- (CTFPreferencesDictionary *)dictionaryRepresentation;
- (void)setValues:(CTFPreferencesDictionary *)newUserDefaultsDict;

- (id)objectForKey:(NSString *)defaultName;
- (void)setObject:(id)value forKey:(NSString *)defaultName;
- (int)integerForKey:(NSString *)defaultName;
- (void)setIntegerForKey:(int)value forKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (NSArray *)arrayForKey:(NSString *)defaultName;
- (void)removeObjectForKey:(NSString *)defaultName;


@end
135 changes: 135 additions & 0 deletions Plugin/CTFUserDefaultsController.m
@@ -0,0 +1,135 @@
//
// CTFUserDefaultsController.m
// ClickToFlash
//
// Created by Simone Manganelli on 2009-05-23.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import "CTFUserDefaultsController.h"

static CTFUserDefaultsController *sharedInstance = nil;

@implementation CTFUserDefaultsController

+ (CTFUserDefaultsController *)standardUserDefaults;
{
if (! sharedInstance) sharedInstance = [[self alloc] init];
return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone;
{
if (sharedInstance) {
return [sharedInstance retain];
} else {
return [super allocWithZone:zone];
}
}

- (id)init;
{
if (! sharedInstance) {
if ((self = [super init])) {
hasInited = YES;
}
}

return self;
}

- (void)dealloc;
{
[userDefaultsDict release];
[super dealloc];
}

- (void)setUpExternalPrefsDictionary;
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(pluginDefaultsDidChange:)
name:@"ClickToFlashPluginDefaultsDidChange"
object:nil];
[self setValues:[CTFPreferencesDictionary dictionaryWithDictionary:
[[NSUserDefaults standardUserDefaults] persistentDomainForName:@"com.github.rentzsch.clicktoflash"]]
];
}

- (CTFPreferencesDictionary *)values;
{
// I have no idea why, but -init, -initWithDefaults:initialValues:,
// and +sharedUserDefaultsController all never seem to get called. Only
// -awakeFromNib gets called, and that's too late for bindings;

// so instead, we just wait for the initial call to access values,
// and if that call detects that the user defaults dictionary hasn't
// been set up yet, it sets it up and *then* returns the values

if (! userDefaultsDict) {
[self setUpExternalPrefsDictionary];
}
return userDefaultsDict;
}

- (CTFPreferencesDictionary *)dictionaryRepresentation;
{
return [self values];
}

- (void)setValues:(CTFPreferencesDictionary *)newUserDefaultsDict;
{
if (! userDefaultsDict) userDefaultsDict = [[CTFPreferencesDictionary alloc] init];
[userDefaultsDict removeAllObjects];
[userDefaultsDict addEntriesFromDictionary:newUserDefaultsDict];
}

- (void)pluginDefaultsDidChange:(NSNotification *)notification;
{
[[NSUserDefaults standardUserDefaults] setPersistentDomain:userDefaultsDict
forName:@"com.github.rentzsch.clicktoflash"];
}

- (id)objectForKey:(NSString *)defaultName;
{
return [[self values] objectForKey:defaultName];
}

- (void)setObject:(id)value forKey:(NSString *)defaultName;
{
[[self values] setObject:value forKey:defaultName];
}

- (int)integerForKey:(NSString *)defaultName;
{
return [[[self values] objectForKey:defaultName] intValue];
}

- (void)setIntegerForKey:(int)value forKey:(NSString *)defaultName;
{
[[self values] setObject:[NSNumber numberWithInt:value] forKey:defaultName];
}

- (BOOL)boolForKey:(NSString *)defaultName;
{
return [[[self values] objectForKey:defaultName] boolValue];
}

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
{
[[self values] setObject:[NSNumber numberWithBool:value] forKey:defaultName];
}

- (NSArray *)arrayForKey:(NSString *)defaultName;
{
id value = [[self values] objectForKey:defaultName];
id valueToReturn = nil;
if ([[value className] isEqualToString:@"NSCFArray"]) valueToReturn = value;
return valueToReturn;
}

- (void)removeObjectForKey:(NSString *)defaultName;
{
[[self values] removeObjectForKey:defaultName];
}

@end
13 changes: 8 additions & 5 deletions Plugin/CTFWhitelist.m
Expand Up @@ -29,11 +29,14 @@ of this software and associated documentation files (the "Software"), to deal
#import "CTFUtilities.h"
#import "CTFMenubarMenuController.h"

#import "CTFUserDefaultsController.h"
#import "CTFPreferencesDictionary.h"


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

// NSUserDefaults keys
// CTFUserDefaultsController keys
static NSString *sHostSiteInfoDefaultsKey = @"ClickToFlash_siteInfo";

typedef enum {
Expand Down Expand Up @@ -160,13 +163,13 @@ - (BOOL) _isHostWhitelisted

- (BOOL) _isWhiteListedForHostString:(NSString *)hostString
{
NSArray *hostWhitelist = [[NSUserDefaults standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey];
NSArray *hostWhitelist = [[CTFUserDefaultsController standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey];
return hostWhitelist && itemForSite(hostWhitelist, hostString) != nil;
}

- (NSMutableArray *) _mutableSiteInfo
{
NSMutableArray *hostWhitelist = [[[[NSUserDefaults standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey] mutableCopy] autorelease];
NSMutableArray *hostWhitelist = [[[[CTFUserDefaultsController standardUserDefaults] arrayForKey: sHostSiteInfoDefaultsKey] mutableCopy] autorelease];
if (hostWhitelist == nil) {
hostWhitelist = [NSMutableArray array];
}
Expand All @@ -177,7 +180,7 @@ - (void) _addHostToWhitelist
{
NSMutableArray *siteInfo = [self _mutableSiteInfo];
[siteInfo addObject: whitelistItemForSite([self host])];
[[NSUserDefaults standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
[[CTFUserDefaultsController standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
[[NSNotificationCenter defaultCenter] postNotificationName: sCTFWhitelistAdditionMade object: self];
}

Expand All @@ -188,7 +191,7 @@ - (void) _removeHostFromWhitelist

if(foundIndex != NSNotFound) {
[siteInfo removeObjectAtIndex: foundIndex];
[[NSUserDefaults standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
[[CTFUserDefaultsController standardUserDefaults] setObject: siteInfo forKey: sHostSiteInfoDefaultsKey];
}
}

Expand Down
11 changes: 11 additions & 0 deletions Plugin/CTFWhitelistWindowController.h
Expand Up @@ -5,9 +5,20 @@ extern NSString* kCTFCheckForUpdates;
@interface CTFWhitelistWindowController : NSWindowController {
IBOutlet NSArrayController *_controller;
IBOutlet NSButton *_checkNowButton;

IBOutlet NSPanel *confirmUninstallSheet;
IBOutlet NSPanel *successfulUninstallationSheet;
IBOutlet NSPanel *failedUninstallationSheet;
}

- (IBAction)checkForUpdates:(id)sender;
- (IBAction)uninstallClickToFlash:(id)sender;

- (IBAction)cancelUninstall:(id)sender;
- (IBAction)approveUninstall:(id)sender;

- (IBAction)dismissSuccessSheet:(id)sender;
- (IBAction)dismissFailureSheet:(id)sender;

@end

0 comments on commit 896243b

Please sign in to comment.