Unreviewed, fix iOS build with recent SDKs.
[WebKit-https.git] / Source / WebKit / UIProcess / API / Cocoa / WKUserContentController.mm
1 /*
2  * Copyright (C) 2014-2017 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 "WKUserContentControllerInternal.h"
28
29 #import "APISerializedScriptValue.h"
30 #import "APIUserContentWorld.h"
31 #import "InjectUserScriptImmediately.h"
32 #import "WKContentRuleListInternal.h"
33 #import "WKFrameInfoInternal.h"
34 #import "WKNSArray.h"
35 #import "WKScriptMessageHandler.h"
36 #import "WKScriptMessageInternal.h"
37 #import "WKUserScriptInternal.h"
38 #import "WKWebViewInternal.h"
39 #import "WebScriptMessageHandler.h"
40 #import "WebUserContentControllerProxy.h"
41 #import "_WKUserContentFilterInternal.h"
42 #import "_WKUserContentWorldInternal.h"
43 #import "_WKUserStyleSheetInternal.h"
44 #import <WebCore/SecurityOrigin.h>
45 #import <WebCore/SecurityOriginData.h>
46 #import <WebCore/SerializedScriptValue.h>
47
48 @implementation WKUserContentController
49
50 - (instancetype)init
51 {
52     if (!(self = [super init]))
53         return nil;
54
55     API::Object::constructInWrapper<WebKit::WebUserContentControllerProxy>(self);
56
57     return self;
58 }
59
60 - (void)dealloc
61 {
62     _userContentControllerProxy->~WebUserContentControllerProxy();
63
64     [super dealloc];
65 }
66
67 + (BOOL)supportsSecureCoding
68 {
69     return YES;
70 }
71
72 - (void)encodeWithCoder:(NSCoder *)coder
73 {
74 }
75
76 - (instancetype)initWithCoder:(NSCoder *)coder
77 {
78     if (!(self = [self init]))
79         return nil;
80
81     return self;
82 }
83
84 - (NSArray *)userScripts
85 {
86     return wrapper(_userContentControllerProxy->userScripts());
87 }
88
89 - (void)addUserScript:(WKUserScript *)userScript
90 {
91     _userContentControllerProxy->addUserScript(*userScript->_userScript, WebKit::InjectUserScriptImmediately::No);
92 }
93
94 - (void)removeAllUserScripts
95 {
96     _userContentControllerProxy->removeAllUserScripts();
97 }
98
99 - (void)addContentRuleList:(WKContentRuleList *)contentRuleList
100 {
101 #if ENABLE(CONTENT_EXTENSIONS)
102     _userContentControllerProxy->addContentRuleList(*contentRuleList->_contentRuleList);
103 #endif
104 }
105
106 - (void)removeContentRuleList:(WKContentRuleList *)contentRuleList
107 {
108 #if ENABLE(CONTENT_EXTENSIONS)
109     _userContentControllerProxy->removeContentRuleList(contentRuleList->_contentRuleList->name());
110 #endif
111 }
112
113 - (void)removeAllContentRuleLists
114 {
115 #if ENABLE(CONTENT_EXTENSIONS)
116     _userContentControllerProxy->removeAllContentRuleLists();
117 #endif
118 }
119
120 class ScriptMessageHandlerDelegate final : public WebKit::WebScriptMessageHandler::Client {
121 public:
122     ScriptMessageHandlerDelegate(WKUserContentController *controller, id <WKScriptMessageHandler> handler, NSString *name)
123         : m_controller(controller)
124         , m_handler(handler)
125         , m_name(adoptNS([name copy]))
126     {
127     }
128     
129     void didPostMessage(WebKit::WebPageProxy& page, const WebKit::FrameInfoData& frameInfoData, WebCore::SerializedScriptValue& serializedScriptValue) override
130     {
131         @autoreleasepool {
132             RetainPtr<WKFrameInfo> frameInfo = wrapper(API::FrameInfo::create(frameInfoData, &page));
133             id body = API::SerializedScriptValue::deserialize(serializedScriptValue, 0);
134             auto message = adoptNS([[WKScriptMessage alloc] _initWithBody:body webView:fromWebPageProxy(page) frameInfo:frameInfo.get() name:m_name.get()]);
135         
136             [m_handler userContentController:m_controller.get() didReceiveScriptMessage:message.get()];
137         }
138     }
139
140 private:
141     RetainPtr<WKUserContentController> m_controller;
142     RetainPtr<id <WKScriptMessageHandler>> m_handler;
143     RetainPtr<NSString> m_name;
144 };
145
146 - (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name
147 {
148     auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name, API::UserContentWorld::normalWorld());
149     if (!_userContentControllerProxy->addUserScriptMessageHandler(handler.get()))
150         [NSException raise:NSInvalidArgumentException format:@"Attempt to add script message handler with name '%@' when one already exists.", name];
151 }
152
153 - (void)removeScriptMessageHandlerForName:(NSString *)name
154 {
155     _userContentControllerProxy->removeUserMessageHandlerForName(name, API::UserContentWorld::normalWorld());
156 }
157
158 #pragma mark WKObject protocol implementation
159
160 - (API::Object&)_apiObject
161 {
162     return *_userContentControllerProxy;
163 }
164
165 @end
166
167 @implementation WKUserContentController (WKPrivate)
168
169 - (void)_removeUserScript:(WKUserScript *)userScript
170 {
171     _userContentControllerProxy->removeUserScript(*userScript->_userScript);
172 }
173
174 - (void)_removeAllUserScriptsAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld
175 {
176     _userContentControllerProxy->removeAllUserScripts(*userContentWorld->_userContentWorld);
177 }
178
179 - (void)_addUserScriptImmediately:(WKUserScript *)userScript
180 {
181     _userContentControllerProxy->addUserScript(*userScript->_userScript, WebKit::InjectUserScriptImmediately::Yes);
182 }
183
184 - (void)_addUserContentFilter:(_WKUserContentFilter *)userContentFilter
185 {
186 #if ENABLE(CONTENT_EXTENSIONS)
187     _userContentControllerProxy->addContentRuleList(*userContentFilter->_contentRuleList->_contentRuleList);
188 #endif
189 }
190
191 - (void)_removeUserContentFilter:(NSString *)userContentFilterName
192 {
193 #if ENABLE(CONTENT_EXTENSIONS)
194     _userContentControllerProxy->removeContentRuleList(userContentFilterName);
195 #endif
196 }
197
198 - (void)_removeAllUserContentFilters
199 {
200 #if ENABLE(CONTENT_EXTENSIONS)
201     _userContentControllerProxy->removeAllContentRuleLists();
202 #endif
203 }
204
205 - (NSArray *)_userStyleSheets
206 {
207     return wrapper(_userContentControllerProxy->userStyleSheets());
208 }
209
210 - (void)_addUserStyleSheet:(_WKUserStyleSheet *)userStyleSheet
211 {
212     _userContentControllerProxy->addUserStyleSheet(*userStyleSheet->_userStyleSheet);
213 }
214
215 - (void)_removeUserStyleSheet:(_WKUserStyleSheet *)userStyleSheet
216 {
217     _userContentControllerProxy->removeUserStyleSheet(*userStyleSheet->_userStyleSheet);
218 }
219
220 - (void)_removeAllUserStyleSheets
221 {
222     _userContentControllerProxy->removeAllUserStyleSheets();
223 }
224
225 - (void)_removeAllUserStyleSheetsAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld
226 {
227     _userContentControllerProxy->removeAllUserStyleSheets(*userContentWorld->_userContentWorld);
228 }
229
230 - (void)_addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld
231 {
232     auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name, *userContentWorld->_userContentWorld);
233     if (!_userContentControllerProxy->addUserScriptMessageHandler(handler.get()))
234         [NSException raise:NSInvalidArgumentException format:@"Attempt to add script message handler with name '%@' when one already exists.", name];
235 }
236
237 - (void)_removeScriptMessageHandlerForName:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld
238 {
239     _userContentControllerProxy->removeUserMessageHandlerForName(name, *userContentWorld->_userContentWorld);
240 }
241
242 - (void)_removeAllScriptMessageHandlersAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld
243 {
244     _userContentControllerProxy->removeAllUserMessageHandlers(*userContentWorld->_userContentWorld);
245 }
246
247 @end