Diff
Modified: trunk/Source/WebKit2/ChangeLog (86691 => 86692)
--- trunk/Source/WebKit2/ChangeLog 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/ChangeLog 2011-05-17 18:57:54 UTC (rev 86692)
@@ -1,3 +1,50 @@
+2011-05-17 Brady Eidson <[email protected]>
+
+ Reviewed by Anders Carlsson.
+
+ Part 4 of <rdar://problem/8814289> and https://bugs.webkit.org/show_bug.cgi?id=60595
+ Mac WebKit2 WebProcess needs a shim to make prompts appear to be from the UIProcess
+
+ This patch actually hooks up the shim to the WebProcess shim callbacks, which messages these
+ 4 calls up to the UIProcess and returns the result.
+
+ Note that this patch uncovered the fact that CoreIPC can't sync message out from a secondary thread,
+ so I filed https://bugs.webkit.org/show_bug.cgi?id=60975 as a followup to allow that.
+
+ * Shared/mac/SecItemResponseData.cpp:
+ (WebKit::SecItemResponseData::SecItemResponseData): Reorder the constructor arguments to be
+ a little cleaner.
+ * Shared/mac/SecItemResponseData.h:
+
+ Call the shim callbacks for each method:
+ * WebProcess/mac/WebProcessShim.mm:
+ (WebKit::shimSecItemCopyMatching):
+ (WebKit::shimSecItemAdd):
+ (WebKit::shimSecItemUpdate):
+ (WebKit::shimSecItemDelete):
+
+ Implement the shim callbacks, which each marshall to the main thread, which then calls out to CoreIPC:
+ * WebProcess/mac/WebProcessMac.mm:
+ (WebKit::WebSecItemCopyMatchingMainThread):
+ (WebKit::WebSecItemCopyMatching):
+ (WebKit::WebSecItemAddOnMainThread):
+ (WebKit::WebSecItemAdd):
+ (WebKit::WebSecItemUpdateOnMainThread):
+ (WebKit::WebSecItemUpdate):
+ (WebKit::WebSecItemDeleteOnMainThread):
+ (WebKit::WebSecItemDelete):
+
+ Add the 4 messages and their implementations in the UIProcess:
+ * UIProcess/WebProcessProxy.h:
+ * UIProcess/WebProcessProxy.messages.in:
+ * UIProcess/mac/WebProcessProxyMac.mm: Added.
+ (WebKit::WebProcessProxy::secItemCopyMatching):
+ (WebKit::WebProcessProxy::secItemAdd):
+ (WebKit::WebProcessProxy::secItemUpdate):
+ (WebKit::WebProcessProxy::secItemDelete):
+
+ * WebKit2.xcodeproj/project.pbxproj:
+
2011-05-17 Anders Carlsson <[email protected]>
Reviewed by Dan Bernstein.
Modified: trunk/Source/WebKit2/Shared/mac/SecItemResponseData.cpp (86691 => 86692)
--- trunk/Source/WebKit2/Shared/mac/SecItemResponseData.cpp 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/Shared/mac/SecItemResponseData.cpp 2011-05-17 18:57:54 UTC (rev 86692)
@@ -35,7 +35,7 @@
{
}
-SecItemResponseData::SecItemResponseData(CFTypeRef resultObject, OSStatus resultCode)
+SecItemResponseData::SecItemResponseData(OSStatus resultCode, CFTypeRef resultObject)
: m_resultObject(resultObject)
, m_resultCode(resultCode)
{
Modified: trunk/Source/WebKit2/Shared/mac/SecItemResponseData.h (86691 => 86692)
--- trunk/Source/WebKit2/Shared/mac/SecItemResponseData.h 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/Shared/mac/SecItemResponseData.h 2011-05-17 18:57:54 UTC (rev 86692)
@@ -38,7 +38,7 @@
class SecItemResponseData {
public:
SecItemResponseData();
- SecItemResponseData(CFTypeRef result, OSStatus);
+ SecItemResponseData(OSStatus, CFTypeRef result);
void encode(CoreIPC::ArgumentEncoder*) const;
static bool decode(CoreIPC::ArgumentDecoder*, SecItemResponseData&);
Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.h (86691 => 86692)
--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.h 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.h 2011-05-17 18:57:54 UTC (rev 86692)
@@ -47,6 +47,11 @@
namespace WebKit {
+#if PLATFORM(MAC)
+class SecItemRequestData;
+class SecItemResponseData;
+#endif
+
class WebBackForwardListItem;
class WebContext;
class WebPageGroup;
@@ -124,6 +129,12 @@
void getPluginProcessConnection(const String& pluginPath, PassRefPtr<Messages::WebProcessProxy::GetPluginProcessConnection::DelayedReply>);
void pluginSyncMessageSendTimedOut(const String& pluginPath);
#endif
+#if PLATFORM(MAC)
+ void secItemCopyMatching(const SecItemRequestData&, SecItemResponseData&);
+ void secItemAdd(const SecItemRequestData&, SecItemResponseData&);
+ void secItemUpdate(const SecItemRequestData&, SecItemResponseData&);
+ void secItemDelete(const SecItemRequestData&, SecItemResponseData&);
+#endif
// CoreIPC::Connection::Client
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in (86691 => 86692)
--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in 2011-05-17 18:57:54 UTC (rev 86692)
@@ -31,4 +31,12 @@
GetPluginProcessConnection(WTF::String pluginPath) -> (CoreIPC::MachPort connectionHandle) Delayed
PluginSyncMessageSendTimedOut(WTF::String pluginPath)
#endif
+
+#if PLATFORM(MAC)
+ SecItemCopyMatching(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
+ SecItemAdd(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
+ SecItemUpdate(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
+ SecItemDelete(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
+#endif
+
}
Added: trunk/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm (0 => 86692)
--- trunk/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm (rev 0)
+++ trunk/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm 2011-05-17 18:57:54 UTC (rev 86692)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "WebProcessProxy.h"
+
+#import "SecItemRequestData.h"
+#import "SecItemResponseData.h"
+#import <Security/SecItem.h>
+
+namespace WebKit {
+
+void WebProcessProxy::secItemCopyMatching(const SecItemRequestData& queryData, SecItemResponseData& result)
+{
+ CFDictionaryRef query = queryData.query();
+ CFTypeRef resultObject;
+ OSStatus resultCode;
+
+ resultCode = SecItemCopyMatching(query, &resultObject);
+
+ result = SecItemResponseData(resultCode, resultObject);
+}
+
+void WebProcessProxy::secItemAdd(const SecItemRequestData& queryData, SecItemResponseData& result)
+{
+ CFDictionaryRef query = queryData.query();
+ CFTypeRef resultObject;
+ OSStatus resultCode;
+
+ resultCode = SecItemAdd(query, &resultObject);
+
+ result = SecItemResponseData(resultCode, resultObject);
+}
+
+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);
+}
+
+} // namespace WebKit
Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (86691 => 86692)
--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2011-05-17 18:57:54 UTC (rev 86692)
@@ -374,6 +374,7 @@
51D130541382EAC000351EDD /* SecItemRequestData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D130501382EAC000351EDD /* SecItemRequestData.h */; };
51D130551382EAC000351EDD /* SecItemResponseData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51D130511382EAC000351EDD /* SecItemResponseData.cpp */; };
51D130561382EAC000351EDD /* SecItemResponseData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D130521382EAC000351EDD /* SecItemResponseData.h */; };
+ 51D130581382F10500351EDD /* WebProcessProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51D130571382F10500351EDD /* WebProcessProxyMac.mm */; };
6501BD1A12F1243400E9F248 /* WKBundleInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65B86F1712F11D7B00B7DD8A /* WKBundleInspector.cpp */; };
659C551E130006410025C0C2 /* InjectedBundlePageResourceLoadClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6546A82913000164000CEB1C /* InjectedBundlePageResourceLoadClient.cpp */; };
65B86F1E12F11DE300B7DD8A /* WKBundleInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = 65B86F1812F11D7B00B7DD8A /* WKBundleInspector.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -1301,6 +1302,7 @@
51D130501382EAC000351EDD /* SecItemRequestData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecItemRequestData.h; sourceTree = "<group>"; };
51D130511382EAC000351EDD /* SecItemResponseData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SecItemResponseData.cpp; sourceTree = "<group>"; };
51D130521382EAC000351EDD /* SecItemResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecItemResponseData.h; sourceTree = "<group>"; };
+ 51D130571382F10500351EDD /* WebProcessProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebProcessProxyMac.mm; sourceTree = "<group>"; };
5DAD7294116FF70B00EE5396 /* WebProcess.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = WebProcess.xcconfig; sourceTree = "<group>"; };
5DAD73F1116FF90C00EE5396 /* BaseTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = BaseTarget.xcconfig; sourceTree = "<group>"; };
6546A82913000164000CEB1C /* InjectedBundlePageResourceLoadClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageResourceLoadClient.cpp; sourceTree = "<group>"; };
@@ -3134,6 +3136,7 @@
BC5750951268F3C6006F0F12 /* WebPopupMenuProxyMac.h */,
BC5750961268F3C6006F0F12 /* WebPopupMenuProxyMac.mm */,
BC84EB1712A7100C0083F2DA /* WebPreferencesMac.mm */,
+ 51D130571382F10500351EDD /* WebProcessProxyMac.mm */,
CDCA85C6132ABA4E00E961DF /* WKFullScreenWindowController.mm */,
CDCA85C7132ABA4E00E961DF /* WKFullScreenWindowController.h */,
);
@@ -4457,6 +4460,7 @@
BCE17B7D1381F1170012A641 /* WKPagePrivateMac.cpp in Sources */,
51D130531382EAC000351EDD /* SecItemRequestData.cpp in Sources */,
51D130551382EAC000351EDD /* SecItemResponseData.cpp in Sources */,
+ 51D130581382F10500351EDD /* WebProcessProxyMac.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Modified: trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm (86691 => 86692)
--- trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm 2011-05-17 18:57:54 UTC (rev 86692)
@@ -28,8 +28,11 @@
#import "FullKeyboardAccessWatcher.h"
#import "SandboxExtension.h"
+#import "SecItemRequestData.h"
+#import "SecItemResponseData.h"
#import "WebPage.h"
#import "WebProcessCreationParameters.h"
+#import "WebProcessProxyMessages.h"
#import "WebProcessShim.h"
#import <WebCore/FileSystem.h>
#import <WebCore/LocalizedStrings.h>
@@ -239,28 +242,123 @@
method_setImplementation(methodToPatch, (IMP)NSApplicationAccessibilityFocusedUIElement);
}
-static OSStatus WebSecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result)
+// FIXME (https://bugs.webkit.org/show_bug.cgi?id=60975) - Once CoreIPC supports sync messaging from a secondary thread,
+// we can remove SecItemAPIContext and these 4 main-thread methods, and we can have the shim methods call out directly
+// from whatever thread they're on.
+
+struct SecItemAPIContext
{
- ASSERT_NOT_REACHED();
- return -1;
+ CFDictionaryRef query;
+ CFDictionaryRef attributesToUpdate;
+ CFTypeRef resultObject;
+ OSStatus resultCode;
+};
+
+static void WebSecItemCopyMatchingMainThread(void* voidContext)
+{
+ SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
+
+ SecItemRequestData requestData(context->query);
+ SecItemResponseData response;
+ if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemCopyMatching(requestData), Messages::WebProcessProxy::SecItemCopyMatching::Reply(response), 0)) {
+ context->resultCode = errSecInteractionNotAllowed;
+ ASSERT_NOT_REACHED();
+ return;
+ }
+
+ context->resultObject = response.resultObject().leakRef();
+ context->resultCode = response.resultCode();
}
-static OSStatus WebSecItemAdd(CFDictionaryRef query, CFTypeRef *result)
+static OSStatus WebSecItemCopyMatching(CFDictionaryRef query, CFTypeRef* result)
{
- ASSERT_NOT_REACHED();
- return -1;
+ SecItemAPIContext context;
+ context.query = query;
+
+ callOnMainThreadAndWait(WebSecItemCopyMatchingMainThread, &context);
+
+ if (result)
+ *result = context.resultObject;
+ return context.resultCode;
}
+static void WebSecItemAddOnMainThread(void* voidContext)
+{
+ SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
+
+ SecItemRequestData requestData(context->query);
+ SecItemResponseData response;
+ if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemAdd(requestData), Messages::WebProcessProxy::SecItemAdd::Reply(response), 0)) {
+ context->resultCode = errSecInteractionNotAllowed;
+ ASSERT_NOT_REACHED();
+ return;
+ }
+
+ context->resultObject = response.resultObject().leakRef();
+ context->resultCode = response.resultCode();
+}
+
+static OSStatus WebSecItemAdd(CFDictionaryRef query, CFTypeRef* result)
+{
+ SecItemAPIContext context;
+ context.query = query;
+
+ callOnMainThreadAndWait(WebSecItemAddOnMainThread, &context);
+
+ if (result)
+ *result = context.resultObject;
+ return context.resultCode;
+}
+
+static void WebSecItemUpdateOnMainThread(void* voidContext)
+{
+ SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
+
+ SecItemRequestData requestData(context->query, context->attributesToUpdate);
+ SecItemResponseData response;
+ if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemUpdate(requestData), Messages::WebProcessProxy::SecItemUpdate::Reply(response), 0)) {
+ context->resultCode = errSecInteractionNotAllowed;
+ ASSERT_NOT_REACHED();
+ return;
+ }
+
+ context->resultCode = response.resultCode();
+}
+
static OSStatus WebSecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)
+{
+ SecItemAPIContext context;
+ context.query = query;
+ context.attributesToUpdate = attributesToUpdate;
+
+ callOnMainThreadAndWait(WebSecItemUpdateOnMainThread, &context);
+
+ return context.resultCode;
+}
+
+static void WebSecItemDeleteOnMainThread(void* voidContext)
{
- ASSERT_NOT_REACHED();
- return -1;
+ SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
+
+ SecItemRequestData requestData(context->query);
+ SecItemResponseData response;
+ if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemDelete(requestData), Messages::WebProcessProxy::SecItemDelete::Reply(response), 0)) {
+ context->resultCode = errSecInteractionNotAllowed;
+ ASSERT_NOT_REACHED();
+ return;
+ }
+
+ context->resultCode = response.resultCode();
}
static OSStatus WebSecItemDelete(CFDictionaryRef query)
-{
- ASSERT_NOT_REACHED();
- return -1;
+{
+ SecItemAPIContext context;
+ context.query = query;
+
+ callOnMainThreadAndWait(WebSecItemDeleteOnMainThread, &context);
+
+ return context.resultCode;
}
void WebProcess::initializeShim()
Modified: trunk/Source/WebKit2/WebProcess/mac/WebProcessShim.mm (86691 => 86692)
--- trunk/Source/WebKit2/WebProcess/mac/WebProcessShim.mm 2011-05-17 18:37:32 UTC (rev 86691)
+++ trunk/Source/WebKit2/WebProcess/mac/WebProcessShim.mm 2011-05-17 18:57:54 UTC (rev 86692)
@@ -37,24 +37,24 @@
static WebProcessShimCallbacks webProcessShimCallbacks;
-static OSStatus shimSecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result)
+static OSStatus shimSecItemCopyMatching(CFDictionaryRef query, CFTypeRef* result)
{
- return SecItemCopyMatching(query, result);
+ return webProcessShimCallbacks.secItemCopyMatching(query, result);
}
-static OSStatus shimSecItemAdd(CFDictionaryRef query, CFTypeRef *result)
+static OSStatus shimSecItemAdd(CFDictionaryRef query, CFTypeRef* result)
{
- return SecItemAdd(query, result);
+ return webProcessShimCallbacks.secItemAdd(query, result);
}
static OSStatus shimSecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)
{
- return SecItemUpdate(query, attributesToUpdate);
+ return webProcessShimCallbacks.secItemUpdate(query, attributesToUpdate);
}
static OSStatus shimSecItemDelete(CFDictionaryRef query)
{
- return SecItemDelete(query);
+ return webProcessShimCallbacks.secItemDelete(query);
}
DYLD_INTERPOSE(shimSecItemCopyMatching, SecItemCopyMatching)