Deprecate WKConnection
[WebKit-https.git] / Source / WebKit / WebProcess / InjectedBundle / API / mac / WKWebProcessPlugIn.mm
1 /*
2  * Copyright (C) 2012-2018 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 "WKWebProcessPlugInInternal.h"
28
29 #if WK_API_ENABLED
30
31 #import "APIArray.h"
32 #import "WKConnectionInternal.h"
33 #import "WKBundle.h"
34 #import "WKBundleAPICast.h"
35 #import "WKRetainPtr.h"
36 #import "WKStringCF.h"
37 #import "WKWebProcessPlugInBrowserContextControllerInternal.h"
38 #import <wtf/RetainPtr.h>
39
40 @interface WKWebProcessPlugInController () {
41     API::ObjectStorage<WebKit::InjectedBundle> _bundle;
42     RetainPtr<id <WKWebProcessPlugIn>> _principalClassInstance;
43 }
44 @end
45
46 @implementation WKWebProcessPlugInController
47
48 - (void)dealloc
49 {
50     _bundle->~InjectedBundle();
51
52     [super dealloc];
53 }
54
55 static void didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
56 {
57     auto plugInController = (__bridge WKWebProcessPlugInController *)clientInfo;
58     id <WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();
59
60     if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:didCreateBrowserContextController:)])
61         [principalClassInstance webProcessPlugIn:plugInController didCreateBrowserContextController:wrapper(*WebKit::toImpl(page))];
62 }
63
64 static void willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
65 {
66     auto plugInController = (__bridge WKWebProcessPlugInController *)clientInfo;
67     id <WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();
68
69     if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:willDestroyBrowserContextController:)])
70         [principalClassInstance webProcessPlugIn:plugInController willDestroyBrowserContextController:wrapper(*WebKit::toImpl(page))];
71 }
72
73 static void setUpBundleClient(WKWebProcessPlugInController *plugInController, WebKit::InjectedBundle& bundle)
74 {
75     WKBundleClientV1 bundleClient;
76     memset(&bundleClient, 0, sizeof(bundleClient));
77
78     bundleClient.base.version = 1;
79     bundleClient.base.clientInfo = (__bridge void*)plugInController;
80     bundleClient.didCreatePage = didCreatePage;
81     bundleClient.willDestroyPage = willDestroyPage;
82
83     WKBundleSetClient(toAPI(&bundle), &bundleClient.base);
84 }
85
86 - (void)_setPrincipalClassInstance:(id <WKWebProcessPlugIn>)principalClassInstance
87 {
88     ASSERT(!_principalClassInstance);
89     _principalClassInstance = principalClassInstance;
90
91     setUpBundleClient(self, *_bundle);
92 }
93
94 ALLOW_DEPRECATED_DECLARATIONS_BEGIN
95 - (WKConnection *)connection
96 {
97     return wrapper(*_bundle->webConnectionToUIProcess());
98 }
99 ALLOW_DEPRECATED_DECLARATIONS_END
100
101 - (id)parameters
102 {
103     return _bundle->bundleParameters();
104 }
105
106 static Ref<API::Array> createWKArray(NSArray *array)
107 {
108     NSUInteger count = [array count];
109     Vector<RefPtr<API::Object>> strings;
110     strings.reserveInitialCapacity(count);
111     
112     for (id entry in array) {
113         if ([entry isKindOfClass:[NSString class]])
114             strings.uncheckedAppend(adoptRef(WebKit::toImpl(WKStringCreateWithCFString((__bridge CFStringRef)entry))));
115     }
116     
117     return API::Array::create(WTFMove(strings));
118 }
119
120 - (void)extendClassesForParameterCoder:(NSArray *)classes
121 {
122     auto classList = createWKArray(classes);
123     _bundle->extendClassesForParameterCoder(classList.get());
124 }
125
126 #pragma mark WKObject protocol implementation
127
128 - (API::Object&)_apiObject
129 {
130     return *_bundle;
131 }
132
133 @end
134
135 @implementation WKWebProcessPlugInController (Private)
136
137 - (WKBundleRef)_bundleRef
138 {
139     return toAPI(_bundle.get());
140 }
141
142 @end
143
144 #endif // WK_API_ENABLED