Changeset 86692 in webkit


Ignore:
Timestamp:
May 17, 2011 11:57:54 AM (13 years ago)
Author:
beidson@apple.com
Message:

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

Reviewed by Anders Carlsson.

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:
Location:
trunk/Source/WebKit2
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r86689 r86692  
     12011-05-17  Brady Eidson  <beidson@apple.com>
     2
     3        Reviewed by Anders Carlsson.
     4
     5        Part 4 of <rdar://problem/8814289> and https://bugs.webkit.org/show_bug.cgi?id=60595
     6        Mac WebKit2 WebProcess needs a shim to make prompts appear to be from the UIProcess
     7
     8        This patch actually hooks up the shim to the WebProcess shim callbacks, which messages these
     9        4 calls up to the UIProcess and returns the result.
     10
     11        Note that this patch uncovered the fact that CoreIPC can't sync message out from a secondary thread,
     12        so I filed https://bugs.webkit.org/show_bug.cgi?id=60975 as a followup to allow that.
     13
     14        * Shared/mac/SecItemResponseData.cpp:
     15        (WebKit::SecItemResponseData::SecItemResponseData): Reorder the constructor arguments to be
     16          a little cleaner.
     17        * Shared/mac/SecItemResponseData.h:
     18
     19        Call the shim callbacks for each method:
     20        * WebProcess/mac/WebProcessShim.mm:
     21        (WebKit::shimSecItemCopyMatching):
     22        (WebKit::shimSecItemAdd):
     23        (WebKit::shimSecItemUpdate):
     24        (WebKit::shimSecItemDelete):
     25
     26        Implement the shim callbacks, which each marshall to the main thread, which then calls out to CoreIPC:
     27        * WebProcess/mac/WebProcessMac.mm:
     28        (WebKit::WebSecItemCopyMatchingMainThread):
     29        (WebKit::WebSecItemCopyMatching):
     30        (WebKit::WebSecItemAddOnMainThread):
     31        (WebKit::WebSecItemAdd):
     32        (WebKit::WebSecItemUpdateOnMainThread):
     33        (WebKit::WebSecItemUpdate):
     34        (WebKit::WebSecItemDeleteOnMainThread):
     35        (WebKit::WebSecItemDelete):
     36
     37        Add the 4 messages and their implementations in the UIProcess:
     38        * UIProcess/WebProcessProxy.h:
     39        * UIProcess/WebProcessProxy.messages.in:
     40        * UIProcess/mac/WebProcessProxyMac.mm: Added.
     41        (WebKit::WebProcessProxy::secItemCopyMatching):
     42        (WebKit::WebProcessProxy::secItemAdd):
     43        (WebKit::WebProcessProxy::secItemUpdate):
     44        (WebKit::WebProcessProxy::secItemDelete):
     45
     46        * WebKit2.xcodeproj/project.pbxproj:
     47
    1482011-05-17  Anders Carlsson  <andersca@apple.com>
    249
  • trunk/Source/WebKit2/Shared/mac/SecItemResponseData.cpp

    r86688 r86692  
    3636}
    3737
    38 SecItemResponseData::SecItemResponseData(CFTypeRef resultObject, OSStatus resultCode)
     38SecItemResponseData::SecItemResponseData(OSStatus resultCode, CFTypeRef resultObject)
    3939    : m_resultObject(resultObject)
    4040    , m_resultCode(resultCode)
  • trunk/Source/WebKit2/Shared/mac/SecItemResponseData.h

    r86688 r86692  
    3939public:
    4040    SecItemResponseData();
    41     SecItemResponseData(CFTypeRef result, OSStatus);
     41    SecItemResponseData(OSStatus, CFTypeRef result);
    4242
    4343    void encode(CoreIPC::ArgumentEncoder*) const;
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.h

    r86101 r86692  
    4848namespace WebKit {
    4949
     50#if PLATFORM(MAC)
     51class SecItemRequestData;
     52class SecItemResponseData;
     53#endif
     54
    5055class WebBackForwardListItem;
    5156class WebContext;
     
    125130    void pluginSyncMessageSendTimedOut(const String& pluginPath);
    126131#endif
     132#if PLATFORM(MAC)
     133    void secItemCopyMatching(const SecItemRequestData&, SecItemResponseData&);
     134    void secItemAdd(const SecItemRequestData&, SecItemResponseData&);
     135    void secItemUpdate(const SecItemRequestData&, SecItemResponseData&);
     136    void secItemDelete(const SecItemRequestData&, SecItemResponseData&);
     137#endif
    127138
    128139    // CoreIPC::Connection::Client
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in

    r84302 r86692  
    3232    PluginSyncMessageSendTimedOut(WTF::String pluginPath)
    3333#endif
     34
     35#if PLATFORM(MAC)
     36    SecItemCopyMatching(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
     37    SecItemAdd(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
     38    SecItemUpdate(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
     39    SecItemDelete(WebKit::SecItemRequestData query) -> (WebKit::SecItemResponseData result)
     40#endif
     41
    3442}
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r86688 r86692  
    375375                51D130551382EAC000351EDD /* SecItemResponseData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51D130511382EAC000351EDD /* SecItemResponseData.cpp */; };
    376376                51D130561382EAC000351EDD /* SecItemResponseData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D130521382EAC000351EDD /* SecItemResponseData.h */; };
     377                51D130581382F10500351EDD /* WebProcessProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51D130571382F10500351EDD /* WebProcessProxyMac.mm */; };
    377378                6501BD1A12F1243400E9F248 /* WKBundleInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65B86F1712F11D7B00B7DD8A /* WKBundleInspector.cpp */; };
    378379                659C551E130006410025C0C2 /* InjectedBundlePageResourceLoadClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6546A82913000164000CEB1C /* InjectedBundlePageResourceLoadClient.cpp */; };
     
    13021303                51D130511382EAC000351EDD /* SecItemResponseData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SecItemResponseData.cpp; sourceTree = "<group>"; };
    13031304                51D130521382EAC000351EDD /* SecItemResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecItemResponseData.h; sourceTree = "<group>"; };
     1305                51D130571382F10500351EDD /* WebProcessProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebProcessProxyMac.mm; sourceTree = "<group>"; };
    13041306                5DAD7294116FF70B00EE5396 /* WebProcess.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = WebProcess.xcconfig; sourceTree = "<group>"; };
    13051307                5DAD73F1116FF90C00EE5396 /* BaseTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = BaseTarget.xcconfig; sourceTree = "<group>"; };
     
    31353137                                BC5750961268F3C6006F0F12 /* WebPopupMenuProxyMac.mm */,
    31363138                                BC84EB1712A7100C0083F2DA /* WebPreferencesMac.mm */,
     3139                                51D130571382F10500351EDD /* WebProcessProxyMac.mm */,
    31373140                                CDCA85C6132ABA4E00E961DF /* WKFullScreenWindowController.mm */,
    31383141                                CDCA85C7132ABA4E00E961DF /* WKFullScreenWindowController.h */,
     
    44584461                                51D130531382EAC000351EDD /* SecItemRequestData.cpp in Sources */,
    44594462                                51D130551382EAC000351EDD /* SecItemResponseData.cpp in Sources */,
     4463                                51D130581382F10500351EDD /* WebProcessProxyMac.mm in Sources */,
    44604464                        );
    44614465                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm

    r86686 r86692  
    2929#import "FullKeyboardAccessWatcher.h"
    3030#import "SandboxExtension.h"
     31#import "SecItemRequestData.h"
     32#import "SecItemResponseData.h"
    3133#import "WebPage.h"
    3234#import "WebProcessCreationParameters.h"
     35#import "WebProcessProxyMessages.h"
    3336#import "WebProcessShim.h"
    3437#import <WebCore/FileSystem.h>
     
    240243}
    241244
    242 static OSStatus WebSecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result)
    243 {
    244     ASSERT_NOT_REACHED();
    245     return -1;
    246 }
    247 
    248 static OSStatus WebSecItemAdd(CFDictionaryRef query, CFTypeRef *result)
    249 {
    250     ASSERT_NOT_REACHED();
    251     return -1;
     245// FIXME (https://bugs.webkit.org/show_bug.cgi?id=60975) - Once CoreIPC supports sync messaging from a secondary thread,
     246// we can remove SecItemAPIContext and these 4 main-thread methods, and we can have the shim methods call out directly
     247// from whatever thread they're on.
     248
     249struct SecItemAPIContext
     250{
     251    CFDictionaryRef query;
     252    CFDictionaryRef attributesToUpdate;
     253    CFTypeRef resultObject;
     254    OSStatus resultCode;
     255};
     256
     257static void WebSecItemCopyMatchingMainThread(void* voidContext)
     258{
     259    SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
     260   
     261    SecItemRequestData requestData(context->query);
     262    SecItemResponseData response;
     263    if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemCopyMatching(requestData), Messages::WebProcessProxy::SecItemCopyMatching::Reply(response), 0)) {
     264        context->resultCode = errSecInteractionNotAllowed;
     265        ASSERT_NOT_REACHED();
     266        return;
     267    }
     268   
     269    context->resultObject = response.resultObject().leakRef();
     270    context->resultCode = response.resultCode();
     271}
     272
     273static OSStatus WebSecItemCopyMatching(CFDictionaryRef query, CFTypeRef* result)
     274{
     275    SecItemAPIContext context;
     276    context.query = query;
     277   
     278    callOnMainThreadAndWait(WebSecItemCopyMatchingMainThread, &context);
     279   
     280    if (result)
     281        *result = context.resultObject;
     282    return context.resultCode;
     283}
     284
     285static void WebSecItemAddOnMainThread(void* voidContext)
     286{
     287    SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
     288   
     289    SecItemRequestData requestData(context->query);
     290    SecItemResponseData response;
     291    if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemAdd(requestData), Messages::WebProcessProxy::SecItemAdd::Reply(response), 0)) {
     292        context->resultCode = errSecInteractionNotAllowed;
     293        ASSERT_NOT_REACHED();
     294        return;
     295    }
     296   
     297    context->resultObject = response.resultObject().leakRef();
     298    context->resultCode = response.resultCode();
     299}
     300
     301static OSStatus WebSecItemAdd(CFDictionaryRef query, CFTypeRef* result)
     302{   
     303    SecItemAPIContext context;
     304    context.query = query;
     305   
     306    callOnMainThreadAndWait(WebSecItemAddOnMainThread, &context);
     307   
     308    if (result)
     309        *result = context.resultObject;
     310    return context.resultCode;
     311}
     312
     313static void WebSecItemUpdateOnMainThread(void* voidContext)
     314{
     315    SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
     316   
     317    SecItemRequestData requestData(context->query, context->attributesToUpdate);
     318    SecItemResponseData response;
     319    if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemUpdate(requestData), Messages::WebProcessProxy::SecItemUpdate::Reply(response), 0)) {
     320        context->resultCode = errSecInteractionNotAllowed;
     321        ASSERT_NOT_REACHED();
     322        return;
     323    }
     324   
     325    context->resultCode = response.resultCode();
    252326}
    253327
    254328static OSStatus WebSecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)
    255 {
    256     ASSERT_NOT_REACHED();
    257     return -1;
     329{   
     330    SecItemAPIContext context;
     331    context.query = query;
     332    context.attributesToUpdate = attributesToUpdate;
     333   
     334    callOnMainThreadAndWait(WebSecItemUpdateOnMainThread, &context);
     335   
     336    return context.resultCode;
     337}
     338
     339static void WebSecItemDeleteOnMainThread(void* voidContext)
     340{
     341    SecItemAPIContext* context = (SecItemAPIContext*)voidContext;
     342   
     343    SecItemRequestData requestData(context->query);
     344    SecItemResponseData response;
     345    if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::SecItemDelete(requestData), Messages::WebProcessProxy::SecItemDelete::Reply(response), 0)) {
     346        context->resultCode = errSecInteractionNotAllowed;
     347        ASSERT_NOT_REACHED();
     348        return;
     349    }
     350   
     351    context->resultCode = response.resultCode();
    258352}
    259353
    260354static OSStatus WebSecItemDelete(CFDictionaryRef query)
    261 {
    262     ASSERT_NOT_REACHED();
    263     return -1;
     355{   
     356    SecItemAPIContext context;
     357    context.query = query;
     358   
     359    callOnMainThreadAndWait(WebSecItemDeleteOnMainThread, &context);
     360
     361    return context.resultCode;
    264362}
    265363
  • trunk/Source/WebKit2/WebProcess/mac/WebProcessShim.mm

    r86686 r86692  
    3838static WebProcessShimCallbacks webProcessShimCallbacks;
    3939
    40 static OSStatus shimSecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result)
     40static OSStatus shimSecItemCopyMatching(CFDictionaryRef query, CFTypeRef* result)
    4141{
    42     return SecItemCopyMatching(query, result);
     42    return webProcessShimCallbacks.secItemCopyMatching(query, result);
    4343}
    4444
    45 static OSStatus shimSecItemAdd(CFDictionaryRef query, CFTypeRef *result)
     45static OSStatus shimSecItemAdd(CFDictionaryRef query, CFTypeRef* result)
    4646{
    47     return SecItemAdd(query, result);
     47    return webProcessShimCallbacks.secItemAdd(query, result);
    4848}
    4949
    5050static OSStatus shimSecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)
    5151{
    52     return SecItemUpdate(query, attributesToUpdate);
     52    return webProcessShimCallbacks.secItemUpdate(query, attributesToUpdate);
    5353}
    5454
    5555static OSStatus shimSecItemDelete(CFDictionaryRef query)
    5656{
    57     return SecItemDelete(query);
     57    return webProcessShimCallbacks.secItemDelete(query);
    5858}
    5959
Note: See TracChangeset for help on using the changeset viewer.