diff options
| -rw-r--r-- | Framework/MASShortcutBinder.m | 25 | ||||
| -rw-r--r-- | Framework/MASShortcutBinderTests.m | 21 |
2 files changed, 13 insertions, 33 deletions
diff --git a/Framework/MASShortcutBinder.m b/Framework/MASShortcutBinder.m index 9b9f017..92ba6e8 100644 --- a/Framework/MASShortcutBinder.m +++ b/Framework/MASShortcutBinder.m @@ -23,7 +23,7 @@ - (void) dealloc { for (NSString *bindingName in [_actions allKeys]) { - [self unbind:[self encodeBindingName:bindingName]]; + [self unbind:bindingName]; } } @@ -41,8 +41,12 @@ - (void) bindShortcutWithDefaultsKey: (NSString*) defaultsKeyName toAction: (dispatch_block_t) action { + NSAssert([defaultsKeyName rangeOfString:@"."].location == NSNotFound, + @"Illegal character in binding name (“.”), please see http://git.io/x5YS."); + NSAssert([defaultsKeyName rangeOfString:@" "].location == NSNotFound, + @"Illegal character in binding name (“ ”), please see http://git.io/x5YS."); [_actions setObject:[action copy] forKey:defaultsKeyName]; - [self bind:[self encodeBindingName:defaultsKeyName] + [self bind:defaultsKeyName toObject:[NSUserDefaultsController sharedUserDefaultsController] withKeyPath:[@"values." stringByAppendingString:defaultsKeyName] options:_bindingOptions]; @@ -53,7 +57,7 @@ [_shortcutMonitor unregisterShortcut:[_shortcuts objectForKey:defaultsKeyName]]; [_shortcuts removeObjectForKey:defaultsKeyName]; [_actions removeObjectForKey:defaultsKeyName]; - [self unbind:[self encodeBindingName:defaultsKeyName]]; + [self unbind:defaultsKeyName]; } - (void) registerDefaultShortcuts: (NSDictionary*) defaultShortcuts @@ -76,18 +80,6 @@ #pragma mark Bindings -static NSString *const MASDotSymbolReplacement = @"__dot__"; - -- (NSString*) encodeBindingName: (NSString*) binding -{ - return [binding stringByReplacingOccurrencesOfString:@"." withString:MASDotSymbolReplacement]; -} - -- (NSString*) decodeBindingName: (NSString*) binding -{ - return [binding stringByReplacingOccurrencesOfString:MASDotSymbolReplacement withString:@"."]; -} - - (BOOL) isRegisteredAction: (NSString*) name { return !![_actions objectForKey:name]; @@ -95,7 +87,6 @@ static NSString *const MASDotSymbolReplacement = @"__dot__"; - (id) valueForUndefinedKey: (NSString*) key { - key = [self decodeBindingName:key]; return [self isRegisteredAction:key] ? [_shortcuts objectForKey:key] : [super valueForUndefinedKey:key]; @@ -103,8 +94,6 @@ static NSString *const MASDotSymbolReplacement = @"__dot__"; - (void) setValue: (id) value forUndefinedKey: (NSString*) key { - key = [self decodeBindingName:key]; - if (![self isRegisteredAction:key]) { [super setValue:value forUndefinedKey:key]; return; diff --git a/Framework/MASShortcutBinderTests.m b/Framework/MASShortcutBinderTests.m index 35542d4..ab8383e 100644 --- a/Framework/MASShortcutBinderTests.m +++ b/Framework/MASShortcutBinderTests.m @@ -95,22 +95,13 @@ static NSString *const SampleDefaultsKey = @"sampleShortcut"; @"Bind shortcut using a default value."); } -// The connection between user defaults and shortcuts is implemented -// using Cocoa Bindings where the dot symbol (“.”) has a special meaning. -// This means we have to escape the dot symbol used in defaults keys, -// otherwise things blow up. Details at <http://git.io/x5YS>. -- (void) testBindingsWithDotSymbol +// See issue #64 <http://git.io/x5YS> for rationale and discussion. +- (void) testIllegalSymbolsInBindingNames { - static NSString *const SampleDefaultsKeyWithDotSymbol = @"sample.Shortcut"; - MASShortcut *shortcut = [MASShortcut shortcutWithKeyCode:1 modifierFlags:1]; - XCTAssertNoThrow([_binder bindShortcutWithDefaultsKey:SampleDefaultsKeyWithDotSymbol toAction:^{}], - @"Binding a shortcut to a defaults key with a dot symbol must not throw."); - [_defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:shortcut] forKey:SampleDefaultsKeyWithDotSymbol]; - XCTAssertTrue([_monitor isShortcutRegistered:shortcut], - @"Read a shortcut value using a defaults key with a dot symbol."); - [_binder breakBindingWithDefaultsKey:SampleDefaultsKeyWithDotSymbol]; - XCTAssertFalse([_monitor isShortcutRegistered:shortcut], - @"Breaking a binding with a dot symbol."); + XCTAssertThrows([_binder bindShortcutWithDefaultsKey:@"foo.bar" toAction:^{}], + @"Throw for illegal binding symbols: a dot (“.”)."); + XCTAssertThrows([_binder bindShortcutWithDefaultsKey:@"foo bar" toAction:^{}], + @"Throw for illegal binding symbols: a space (“ ”)."); } @end |
