diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-01-11 10:03:25 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-01-11 10:03:25 +0100 |
commit | d11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (patch) | |
tree | b318cf594dc1da2fa48224005945c9157f35bb41 /Source/WebKit2/UIProcess/mac | |
parent | 6300a96eca9f152b379f1bcf3d9efdc5572d989a (diff) | |
download | qtwebkit-d11f84f5b5cdc0d92a08af01b13472fdd5f9acb9.tar.gz |
Imported WebKit commit 75bb2fc5882d2e1b3d5572c2961507996cbca5e3 (http://svn.webkit.org/repository/webkit/trunk@104681)
Diffstat (limited to 'Source/WebKit2/UIProcess/mac')
-rw-r--r-- | Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm | 145 |
1 files changed, 84 insertions, 61 deletions
diff --git a/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm b/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm index 467155e92..37e8caae0 100644 --- a/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm +++ b/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm @@ -30,82 +30,105 @@ #import "SecItemResponseData.h" #import "SecKeychainItemRequestData.h" #import "SecKeychainItemResponseData.h" +#import "WebProcessMessages.h" #import "WKFullKeyboardAccessWatcher.h" #import <Security/SecItem.h> namespace WebKit { -void WebProcessProxy::secItemCopyMatching(const SecItemRequestData& queryData, SecItemResponseData& result) +static void handleSecItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecItemRequestData& request) { - CFDictionaryRef query = queryData.query(); - CFTypeRef resultObjectRef; - OSStatus resultCode = SecItemCopyMatching(query, &resultObjectRef); - - RetainPtr<CFTypeRef> resultObject(AdoptCF, resultObjectRef); - result = SecItemResponseData(resultCode, resultObject.get()); -} - -void WebProcessProxy::secItemAdd(const SecItemRequestData& queryData, SecItemResponseData& result) -{ - CFDictionaryRef query = queryData.query(); - CFTypeRef resultObjectRef; - OSStatus resultCode = SecItemAdd(query, &resultObjectRef); - - RetainPtr<CFTypeRef> resultObject(AdoptCF, resultObjectRef); - result = SecItemResponseData(resultCode, resultObject.get()); -} - -void WebProcessProxy::secItemUpdate(const SecItemRequestData& queryData, SecItemResponseData& result) -{ - CFDictionaryRef query = queryData.query(); - CFDictionaryRef attributesToMatch = queryData.attributesToMatch(); - OSStatus resultCode; - - resultCode = SecItemUpdate(query, attributesToMatch); - - result = SecItemResponseData(resultCode, 0); -} - -void WebProcessProxy::secItemDelete(const SecItemRequestData& queryData, SecItemResponseData& result) -{ - CFDictionaryRef query = queryData.query(); - OSStatus resultCode; - - resultCode = SecItemDelete(query); - - result = SecItemResponseData(resultCode, 0); + SecItemResponseData response; + + switch (request.type()) { + case SecItemRequestData::CopyMatching: { + CFTypeRef resultObject = 0; + OSStatus resultCode = SecItemCopyMatching(request.query(), &resultObject); + response = SecItemResponseData(resultCode, adoptCF(resultObject).get()); + break; + } + + case SecItemRequestData::Add: { + CFTypeRef resultObject = 0; + OSStatus resultCode = SecItemAdd(request.query(), &resultObject); + response = SecItemResponseData(resultCode, adoptCF(resultObject).get()); + break; + } + + case SecItemRequestData::Update: { + OSStatus resultCode = SecItemUpdate(request.query(), request.attributesToMatch()); + response = SecItemResponseData(resultCode, 0); + break; + } + + case SecItemRequestData::Delete: { + OSStatus resultCode = SecItemDelete(request.query()); + response = SecItemResponseData(resultCode, 0); + break; + } + + default: + return; + } + + connection->send(Messages::WebProcess::SecItemResponse(requestID, response), 0); } -void WebProcessProxy::secKeychainItemCopyContent(const SecKeychainItemRequestData& request, SecKeychainItemResponseData& response) +void WebProcessProxy::secItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecItemRequestData& request) { - SecKeychainItemRef item = request.keychainItem(); - SecItemClass itemClass; - SecKeychainAttributeList* attrList = request.attributeList(); - UInt32 length = 0; - void* outData = 0; - - OSStatus resultCode = SecKeychainItemCopyContent(item, &itemClass, attrList, &length, &outData); - - RetainPtr<CFDataRef> data(AdoptCF, CFDataCreate(0, static_cast<const UInt8*>(outData), length)); - response = SecKeychainItemResponseData(resultCode, itemClass, attrList, data.get()); - - SecKeychainItemFreeContent(attrList, outData); + // Since we don't want the connection work queue to be held up, we do all + // keychain interaction work on a global dispatch queue. + dispatch_queue_t keychainWorkQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_async(keychainWorkQueue, bind(handleSecItemRequest, RefPtr<CoreIPC::Connection>(connection), requestID, request)); } -void WebProcessProxy::secKeychainItemCreateFromContent(const SecKeychainItemRequestData& request, SecKeychainItemResponseData& response) +static void handleSecKeychainItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecKeychainItemRequestData& request) { - SecKeychainItemRef keychainItem; - - OSStatus resultCode = SecKeychainItemCreateFromContent(request.itemClass(), request.attributeList(), request.length(), request.data(), 0, 0, &keychainItem); - - response = SecKeychainItemResponseData(resultCode, RetainPtr<SecKeychainItemRef>(AdoptCF, keychainItem)); + SecKeychainItemResponseData response; + + switch (request.type()) { + case SecKeychainItemRequestData::CopyContent: { + SecKeychainItemRef item = request.keychainItem(); + SecItemClass itemClass; + SecKeychainAttributeList* attrList = request.attributeList(); + UInt32 length = 0; + void* outData = 0; + + OSStatus resultCode = SecKeychainItemCopyContent(item, &itemClass, attrList, &length, &outData); + RetainPtr<CFDataRef> data(AdoptCF, CFDataCreate(0, static_cast<const UInt8*>(outData), length)); + response = SecKeychainItemResponseData(resultCode, itemClass, attrList, data.get()); + + SecKeychainItemFreeContent(attrList, outData); + break; + } + + case SecKeychainItemRequestData::CreateFromContent: { + SecKeychainItemRef keychainItem; + + OSStatus resultCode = SecKeychainItemCreateFromContent(request.itemClass(), request.attributeList(), request.length(), request.data(), 0, 0, &keychainItem); + response = SecKeychainItemResponseData(resultCode, adoptCF(keychainItem)); + break; + } + + case SecKeychainItemRequestData::ModifyContent: { + OSStatus resultCode = SecKeychainItemModifyContent(request.keychainItem(), request.attributeList(), request.length(), request.data()); + response = resultCode; + break; + } + + default: + return; + } + + connection->send(Messages::WebProcess::SecKeychainItemResponse(requestID, response), 0); } -void WebProcessProxy::secKeychainItemModifyContent(const SecKeychainItemRequestData& request, SecKeychainItemResponseData& response) +void WebProcessProxy::secKeychainItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecKeychainItemRequestData& request) { - OSStatus resultCode = SecKeychainItemModifyContent(request.keychainItem(), request.attributeList(), request.length(), request.data()); - - response = resultCode; + // Since we don't want the connection work queue to be held up, we do all + // keychain interaction work on a global dispatch queue. + dispatch_queue_t keychainWorkQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_async(keychainWorkQueue, bind(handleSecKeychainItemRequest, RefPtr<CoreIPC::Connection>(connection), requestID, request)); } bool WebProcessProxy::fullKeyboardAccessEnabled() |