2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #import "CoreIPCClientRunLoop.h"
29 #import <WebCore/ResourceHandle.h>
30 #import <wtf/RetainPtr.h>
32 using namespace WebCore;
34 @interface WKFunctionAdapter : NSObject
37 WebKit::FunctionWithContext function;
43 @implementation WKFunctionAdapter
54 static CFArrayRef createCoreIPCRunLoopModesArray()
56 // Ideally we'd like to list all modes here that might be used for run loops while we are handling networking.
57 // We have to explicitly include the run loop mode used for synchronous loads in WebCore so we don't get deadlock
58 // when those loads call security functions that are shimmed.
59 const void* values[2] = { kCFRunLoopCommonModes, ResourceHandle::synchronousLoadRunLoopMode() };
60 return CFArrayCreate(0, values, 2, &kCFTypeArrayCallBacks);
63 static NSArray *coreIPCRunLoopModesArray()
65 static CFArrayRef modes = createCoreIPCRunLoopModesArray();
66 return (NSArray *)modes;
69 void callOnCoreIPCClientRunLoopAndWait(FunctionWithContext function, void* context)
71 // FIXME: It would fit better with WebKit2 coding style to use a WorkItem here.
72 // To do that we'd need to make scheduleWork have an overload that takes an array of run loop modes or find some
73 // other way to specify that we want to include the synchronous load run loop mode.
74 RetainPtr<WKFunctionAdapter> adapter(AdoptNS, [[WKFunctionAdapter alloc] init]);
75 adapter->function = function;
76 adapter->context = context;
77 [adapter.get() performSelectorOnMainThread:@selector(perform) withObject:nil waitUntilDone:YES modes:coreIPCRunLoopModesArray()];