summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/mac
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-01-11 10:03:25 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-01-11 10:03:25 +0100
commitd11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (patch)
treeb318cf594dc1da2fa48224005945c9157f35bb41 /Source/WebKit2/UIProcess/mac
parent6300a96eca9f152b379f1bcf3d9efdc5572d989a (diff)
downloadqtwebkit-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.mm145
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()