1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#import "config.h" 27#import "WKFullKeyboardAccessWatcher.h" 28 29#if PLATFORM(MAC) 30 31#import "WebContext.h" 32 33NSString * const KeyboardUIModeDidChangeNotification = @"com.apple.KeyboardUIModeDidChange"; 34const CFStringRef AppleKeyboardUIMode = CFSTR("AppleKeyboardUIMode"); 35 36using namespace WebKit; 37 38@implementation WKFullKeyboardAccessWatcher 39 40- (void)notifyAllWebContexts 41{ 42 const Vector<WebContext*>& contexts = WebContext::allContexts(); 43 for (size_t i = 0; i < contexts.size(); ++i) 44 contexts[i]->fullKeyboardAccessModeChanged(fullKeyboardAccessEnabled); 45} 46 47- (void)retrieveKeyboardUIModeFromPreferences:(NSNotification *)notification 48{ 49 BOOL oldValue = fullKeyboardAccessEnabled; 50 51 CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); 52 53 Boolean keyExistsAndHasValidFormat; 54 int mode = CFPreferencesGetAppIntegerValue(AppleKeyboardUIMode, kCFPreferencesCurrentApplication, &keyExistsAndHasValidFormat); 55 if (keyExistsAndHasValidFormat) { 56 // The keyboard access mode has two bits: 57 // Bit 0 is set if user can set the focus to menus, the dock, and various windows using the keyboard. 58 // Bit 1 is set if controls other than text fields are included in the tab order (WebKit also always includes lists). 59 fullKeyboardAccessEnabled = (mode & 0x2); 60 } 61 62 if (fullKeyboardAccessEnabled != oldValue) 63 [self notifyAllWebContexts]; 64} 65 66- (id)init 67{ 68 self = [super init]; 69 if (!self) 70 return nil; 71 72 [self retrieveKeyboardUIModeFromPreferences:nil]; 73 74 [[NSDistributedNotificationCenter defaultCenter] 75 addObserver:self selector:@selector(retrieveKeyboardUIModeFromPreferences:) 76 name:KeyboardUIModeDidChangeNotification object:nil]; 77 78 return self; 79} 80 81+ (BOOL)fullKeyboardAccessEnabled 82{ 83 static WKFullKeyboardAccessWatcher *watcher = [[WKFullKeyboardAccessWatcher alloc] init]; 84 return watcher->fullKeyboardAccessEnabled; 85} 86 87@end 88 89#endif // PLATFORM(MAC) 90