Deprecate WKConnection
[WebKit-https.git] / Source / WebKit / Shared / Cocoa / APIObject.mm
1 /*
2  * Copyright (C) 2013 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 "APIObject.h"
28
29 #if WK_API_ENABLED
30
31 #import "WKBackForwardListInternal.h"
32 #import "WKBackForwardListItemInternal.h"
33 #import "WKBrowsingContextControllerInternal.h"
34 #import "WKBrowsingContextGroupInternal.h"
35 #import "WKConnectionInternal.h"
36 #import "WKContentRuleListInternal.h"
37 #import "WKContentRuleListStoreInternal.h"
38 #import "WKFrameInfoInternal.h"
39 #import "WKHTTPCookieStoreInternal.h"
40 #import "WKNSArray.h"
41 #import "WKNSData.h"
42 #import "WKNSDictionary.h"
43 #import "WKNSError.h"
44 #import "WKNSNumber.h"
45 #import "WKNSString.h"
46 #import "WKNSURL.h"
47 #import "WKNSURLAuthenticationChallenge.h"
48 #import "WKNSURLRequest.h"
49 #import "WKNavigationActionInternal.h"
50 #import "WKNavigationDataInternal.h"
51 #import "WKNavigationInternal.h"
52 #import "WKNavigationResponseInternal.h"
53 #import "WKOpenPanelParametersInternal.h"
54 #import "WKPreferencesInternal.h"
55 #import "WKProcessPoolInternal.h"
56 #import "WKSecurityOriginInternal.h"
57 #import "WKURLSchemeTaskInternal.h"
58 #import "WKUserContentControllerInternal.h"
59 #import "WKUserScriptInternal.h"
60 #import "WKWebProcessPlugInBrowserContextControllerInternal.h"
61 #import "WKWebProcessPlugInFrameInternal.h"
62 #import "WKWebProcessPlugInHitTestResultInternal.h"
63 #import "WKWebProcessPlugInInternal.h"
64 #import "WKWebProcessPlugInNodeHandleInternal.h"
65 #import "WKWebProcessPlugInPageGroupInternal.h"
66 #import "WKWebProcessPlugInRangeHandleInternal.h"
67 #import "WKWebProcessPlugInScriptWorldInternal.h"
68 #import "WKWebsiteDataRecordInternal.h"
69 #import "WKWebsiteDataStoreInternal.h"
70 #import "WKWindowFeaturesInternal.h"
71 #import "_WKAttachmentInternal.h"
72 #import "_WKAutomationSessionInternal.h"
73 #import "_WKDownloadInternal.h"
74 #import "_WKExperimentalFeatureInternal.h"
75 #import "_WKFrameHandleInternal.h"
76 #import "_WKGeolocationPositionInternal.h"
77 #import "_WKHitTestResultInternal.h"
78 #import "_WKInspectorInternal.h"
79 #import "_WKInternalDebugFeatureInternal.h"
80 #import "_WKProcessPoolConfigurationInternal.h"
81 #import "_WKUserContentWorldInternal.h"
82 #import "_WKUserInitiatedActionInternal.h"
83 #import "_WKUserStyleSheetInternal.h"
84 #import "_WKVisitedLinkStoreInternal.h"
85 #import "_WKWebsitePoliciesInternal.h"
86
87 #if ENABLE(APPLICATION_MANIFEST)
88 #import "_WKApplicationManifestInternal.h"
89 #endif
90
91 static const size_t minimumObjectAlignment = 8;
92 static_assert(minimumObjectAlignment >= alignof(void*), "Objects should always be at least pointer-aligned.");
93 static const size_t maximumExtraSpaceForAlignment = minimumObjectAlignment - alignof(void*);
94
95 namespace API {
96
97 void Object::ref()
98 {
99     CFRetain((__bridge CFTypeRef)wrapper());
100 }
101
102 void Object::deref()
103 {
104     CFRelease((__bridge CFTypeRef)wrapper());
105 }
106
107 static id <WKObject> allocateWKObject(Class cls, size_t size)
108 {
109     return class_createInstance(cls, size + maximumExtraSpaceForAlignment);
110 }
111
112 API::Object& Object::fromWKObjectExtraSpace(id <WKObject> obj)
113 {
114     size_t size = sizeof(API::Object);
115     size_t spaceAvailable = size + maximumExtraSpaceForAlignment;
116     void* indexedIvars = object_getIndexedIvars(obj);
117     return *static_cast<API::Object*>(std::align(minimumObjectAlignment, size, indexedIvars, spaceAvailable));
118 }
119
120 void* Object::newObject(size_t size, Type type)
121 {
122     id <WKObject> wrapper;
123
124     // Wrappers that inherit from WKObject store the API::Object in their extra bytes, so they are
125     // allocated using NSAllocatedObject. The other wrapper classes contain inline storage for the
126     // API::Object, so they are allocated using +alloc.
127
128     switch (type) {
129 #if ENABLE(APPLICATION_MANIFEST)
130     case Type::ApplicationManifest:
131         wrapper = [_WKApplicationManifest alloc];
132         break;
133 #endif
134
135     case Type::Array:
136         wrapper = [WKNSArray alloc];
137         break;
138
139 #if ENABLE(ATTACHMENT_ELEMENT)
140     case Type::Attachment:
141         wrapper = [_WKAttachment alloc];
142         break;
143 #endif
144
145     case Type::AuthenticationChallenge:
146         ALLOW_DEPRECATED_DECLARATIONS_BEGIN
147         wrapper = allocateWKObject([WKNSURLAuthenticationChallenge self], size);
148         ALLOW_DEPRECATED_DECLARATIONS_END
149         break;
150
151     case Type::AutomationSession:
152         wrapper = [_WKAutomationSession alloc];
153         break;
154
155     case Type::BackForwardList:
156         wrapper = [WKBackForwardList alloc];
157         break;
158
159     case Type::BackForwardListItem:
160         wrapper = [WKBackForwardListItem alloc];
161         break;
162
163     case Type::Boolean:
164     case Type::Double:
165     case Type::UInt64:
166         wrapper = [WKNSNumber alloc];
167         ((WKNSNumber *)wrapper)->_type = type;
168         break;
169
170     case Type::Bundle:
171         wrapper = [WKWebProcessPlugInController alloc];
172         break;
173
174     case Type::BundlePage:
175         wrapper = [WKWebProcessPlugInBrowserContextController alloc];
176         break;
177
178     case Type::Connection:
179         // While not actually a WKObject instance, WKConnection uses allocateWKObject to allocate extra space
180         // instead of using ObjectStorage because the wrapped C++ object is a subclass of WebConnection.
181         ALLOW_DEPRECATED_DECLARATIONS_BEGIN
182         wrapper = allocateWKObject([WKConnection self], size);
183         ALLOW_DEPRECATED_DECLARATIONS_END
184         break;
185
186     case Type::Preferences:
187         wrapper = [WKPreferences alloc];
188         break;
189
190     case Type::ProcessPool:
191         wrapper = [WKProcessPool alloc];
192         break;
193
194     case Type::ProcessPoolConfiguration:
195         wrapper = [_WKProcessPoolConfiguration alloc];
196         break;
197
198     case Type::Data:
199         wrapper = [WKNSData alloc];
200         break;
201
202     case Type::InternalDebugFeature:
203         wrapper = [_WKInternalDebugFeature alloc];
204         break;
205
206     case Type::Dictionary:
207         wrapper = [WKNSDictionary alloc];
208         break;
209
210     case Type::Download:
211         wrapper = [_WKDownload alloc];
212         break;
213
214     case Type::ExperimentalFeature:
215         wrapper = [_WKExperimentalFeature alloc];
216         break;
217
218     case Type::Error:
219         wrapper = allocateWKObject([WKNSError self], size);
220         break;
221
222     case Type::FrameHandle:
223         wrapper = [_WKFrameHandle alloc];
224         break;
225
226     case Type::FrameInfo:
227         wrapper = [WKFrameInfo alloc];
228         break;
229
230 #if PLATFORM(IOS)
231     case Type::GeolocationPosition:
232         wrapper = [_WKGeolocationPosition alloc];
233         break;
234 #endif
235
236     case Type::HTTPCookieStore:
237         wrapper = [WKHTTPCookieStore alloc];
238         break;
239
240 #if PLATFORM(MAC)
241     case Type::HitTestResult:
242         wrapper = [_WKHitTestResult alloc];
243         break;
244 #endif
245
246     case Type::Inspector:
247         wrapper = [_WKInspector alloc];
248         break;
249         
250     case Type::Navigation:
251         wrapper = [WKNavigation alloc];
252         break;
253
254     case Type::NavigationAction:
255         wrapper = [WKNavigationAction alloc];
256         break;
257
258     case Type::NavigationData:
259         ALLOW_DEPRECATED_DECLARATIONS_BEGIN
260         wrapper = [WKNavigationData alloc];
261         ALLOW_DEPRECATED_DECLARATIONS_END
262         break;
263
264     case Type::NavigationResponse:
265         wrapper = [WKNavigationResponse alloc];
266         break;
267
268 #if PLATFORM(MAC)
269     case Type::OpenPanelParameters:
270         wrapper = [WKOpenPanelParameters alloc];
271         break;
272 #endif
273
274     case Type::PageGroup:
275         ALLOW_DEPRECATED_DECLARATIONS_BEGIN
276         wrapper = [WKBrowsingContextGroup alloc];
277         ALLOW_DEPRECATED_DECLARATIONS_END
278         break;
279
280     case Type::SecurityOrigin:
281         wrapper = [WKSecurityOrigin alloc];
282         break;
283
284     case Type::String:
285         wrapper = allocateWKObject([WKNSString self], size);
286         break;
287
288     case Type::URL:
289         wrapper = allocateWKObject([WKNSURL self], size);
290         break;
291
292     case Type::URLRequest:
293         wrapper = allocateWKObject([WKNSURLRequest self], size);
294         break;
295
296     case Type::URLSchemeTask:
297         wrapper = [WKURLSchemeTaskImpl alloc];
298         break;
299
300     case Type::UserContentController:
301         wrapper = [WKUserContentController alloc];
302         break;
303
304     case Type::ContentRuleList:
305         wrapper = [WKContentRuleList alloc];
306         break;
307
308     case Type::ContentRuleListStore:
309         wrapper = [WKContentRuleListStore alloc];
310         break;
311
312     case Type::UserContentWorld:
313         wrapper = [_WKUserContentWorld alloc];
314         break;
315
316     case Type::UserInitiatedAction:
317         wrapper = [_WKUserInitiatedAction alloc];
318         break;
319
320     case Type::UserScript:
321         wrapper = [WKUserScript alloc];
322         break;
323
324     case Type::UserStyleSheet:
325         wrapper = [_WKUserStyleSheet alloc];
326         break;
327
328     case Type::VisitedLinkStore:
329         wrapper = [_WKVisitedLinkStore alloc];
330         break;
331
332     case Type::WebsiteDataRecord:
333         wrapper = [WKWebsiteDataRecord alloc];
334         break;
335
336     case Type::WebsiteDataStore:
337         wrapper = [WKWebsiteDataStore alloc];
338         break;
339
340     case Type::WebsitePolicies:
341         wrapper = [_WKWebsitePolicies alloc];
342         break;
343
344     case Type::WindowFeatures:
345         wrapper = [WKWindowFeatures alloc];
346         break;
347
348     case Type::BundleFrame:
349         wrapper = [WKWebProcessPlugInFrame alloc];
350         break;
351
352     case Type::BundleHitTestResult:
353         wrapper = [WKWebProcessPlugInHitTestResult alloc];
354         break;
355
356     case Type::BundleNodeHandle:
357         wrapper = [WKWebProcessPlugInNodeHandle alloc];
358         break;
359
360     case Type::BundlePageGroup:
361         wrapper = [WKWebProcessPlugInPageGroup alloc];
362         break;
363
364     case Type::BundleRangeHandle:
365         wrapper = [WKWebProcessPlugInRangeHandle alloc];
366         break;
367
368     case Type::BundleScriptWorld:
369         wrapper = [WKWebProcessPlugInScriptWorld alloc];
370         break;
371
372     default:
373         wrapper = allocateWKObject([WKObject self], size);
374         break;
375     }
376
377     Object& object = wrapper._apiObject;
378     object.m_wrapper = wrapper;
379
380     return &object;
381 }
382
383 void* Object::wrap(API::Object* object)
384 {
385     if (!object)
386         return nullptr;
387
388     return (__bridge void*)object->wrapper();
389 }
390
391 API::Object* Object::unwrap(void* object)
392 {
393     if (!object)
394         return nullptr;
395
396     return &((__bridge id <WKObject>)object)._apiObject;
397 }
398
399 } // namespace API
400
401 #endif // WK_API_ENABLED