initial import
[vuplus_webkit] / Source / WebKit2 / WebProcess / mac / CoreIPCClientRunLoop.mm
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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.
24  */
25
26 #import "config.h"
27 #import "CoreIPCClientRunLoop.h"
28
29 #import <WebCore/ResourceHandle.h>
30 #import <wtf/RetainPtr.h>
31
32 using namespace WebCore;
33
34 @interface WKFunctionAdapter : NSObject
35 {
36 @public
37     WebKit::FunctionWithContext function;
38     void* context;
39 }
40 - (void)perform;
41 @end
42
43 @implementation WKFunctionAdapter
44
45 - (void)perform
46 {
47     function(context);
48 }
49
50 @end
51
52 namespace WebKit {
53
54 static CFArrayRef createCoreIPCRunLoopModesArray()
55 {
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);
61 }
62
63 static NSArray *coreIPCRunLoopModesArray()
64 {
65     static CFArrayRef modes = createCoreIPCRunLoopModesArray();
66     return (NSArray *)modes;
67 }
68
69 void callOnCoreIPCClientRunLoopAndWait(FunctionWithContext function, void* context)
70 {
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()];
78 }
79
80 }