]> git.saurik.com Git - cydia.git/blob - CyteKit/CyteWebView.mm
3d2d36ff3027274ec331b7bda540d68fcd120e4c
[cydia.git] / CyteKit / CyteWebView.mm
1 #include "CyteKit/CyteWebView.h"
2
3 #include <CydiaSubstrate/CydiaSubstrate.h>
4
5 #include "iPhonePrivate.h"
6
7 // CYWebPolicyDecision* {{{
8 enum CYWebPolicyDecision {
9 CYWebPolicyDecisionUnknown,
10 CYWebPolicyDecisionDownload,
11 CYWebPolicyDecisionIgnore,
12 CYWebPolicyDecisionUse,
13 };
14
15 @interface CYWebPolicyDecisionMediator : NSObject <
16 WebPolicyDecisionListener
17 > {
18 id<WebPolicyDecisionListener> listener_;
19 CYWebPolicyDecision decision_;
20 }
21
22 - (id) initWithListener:(id<WebPolicyDecisionListener>)listener;
23
24 - (CYWebPolicyDecision) decision;
25 - (bool) decided;
26 - (bool) decide;
27
28 @end
29
30 @implementation CYWebPolicyDecisionMediator
31
32 - (id) initWithListener:(id<WebPolicyDecisionListener>)listener {
33 if ((self = [super init]) != nil) {
34 listener_ = listener;
35 } return self;
36 }
37
38 - (CYWebPolicyDecision) decision {
39 return decision_;
40 }
41
42 - (bool) decided {
43 return decision_ != CYWebPolicyDecisionUnknown;
44 }
45
46 - (bool) decide {
47 switch (decision_) {
48 case CYWebPolicyDecisionUnknown:
49 default:
50 NSLog(@"CYWebPolicyDecisionUnknown");
51 return false;
52
53 case CYWebPolicyDecisionDownload: [listener_ download]; break;
54 case CYWebPolicyDecisionIgnore: [listener_ ignore]; break;
55 case CYWebPolicyDecisionUse: [listener_ use]; break;
56 }
57
58 return true;
59 }
60
61 - (void) download {
62 decision_ = CYWebPolicyDecisionDownload;
63 }
64
65 - (void) ignore {
66 decision_ = CYWebPolicyDecisionIgnore;
67 }
68
69 - (void) use {
70 decision_ = CYWebPolicyDecisionUse;
71 }
72
73 @end
74 // }}}
75
76 @implementation CYWebView : UIWebView
77
78 #if ShowInternals
79 #include "CyteKit/UCInternal.h"
80 #endif
81
82 - (id) initWithFrame:(CGRect)frame {
83 if ((self = [super initWithFrame:frame]) != nil) {
84 } return self;
85 }
86
87 - (void) dealloc {
88 [super dealloc];
89 }
90
91 - (id<CYWebViewDelegate>) delegate {
92 return (id<CYWebViewDelegate>) [super delegate];
93 }
94
95 /*- (WebView *) webView:(WebView *)view createWebViewWithRequest:(NSURLRequest *)request {
96 id<CYWebViewDelegate> delegate([self delegate]);
97 WebView *created(nil);
98 if (created == nil && [delegate respondsToSelector:@selector(webView:createWebViewWithRequest:)])
99 created = [delegate webView:view createWebViewWithRequest:request];
100 if (created == nil && [UIWebView instancesRespondToSelector:@selector(webView:createWebViewWithRequest:)])
101 created = [super webView:view createWebViewWithRequest:request];
102 return created;
103 }*/
104
105 // webView:addMessageToConsole: (X.Xx) {{{
106 static void $UIWebViewWebViewDelegate$webView$addMessageToConsole$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view, NSDictionary *message) {
107 UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView"));
108 if ([uiWebView respondsToSelector:@selector(webView:addMessageToConsole:)])
109 [uiWebView webView:view addMessageToConsole:message];
110 }
111
112 - (void) webView:(WebView *)view addMessageToConsole:(NSDictionary *)message {
113 id<CYWebViewDelegate> delegate([self delegate]);
114 if ([delegate respondsToSelector:@selector(webView:addMessageToConsole:)])
115 [delegate webView:view addMessageToConsole:message];
116 if ([UIWebView instancesRespondToSelector:@selector(webView:addMessageToConsole:)])
117 [super webView:view addMessageToConsole:message];
118 }
119 // }}}
120 // webView:decidePolicyForNavigationAction:request:frame:decisionListener: (2.0+) {{{
121 - (void) webView:(WebView *)view decidePolicyForNavigationAction:(NSDictionary *)action request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {
122 id<CYWebViewDelegate> delegate([self delegate]);
123 CYWebPolicyDecisionMediator *mediator([[[CYWebPolicyDecisionMediator alloc] initWithListener:listener] autorelease]);
124 if (![mediator decided] && [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)])
125 [delegate webView:view decidePolicyForNavigationAction:action request:request frame:frame decisionListener:mediator];
126 if (![mediator decided] && [UIWebView instancesRespondToSelector:@selector(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)])
127 [super webView:view decidePolicyForNavigationAction:action request:request frame:frame decisionListener:mediator];
128 [mediator decide];
129 }
130 // }}}
131 // webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener: (3.0+) {{{
132 static void $UIWebViewWebViewDelegate$webView$decidePolicyForNewWindowAction$request$newFrameName$decisionListener$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view, NSDictionary *action, NSURLRequest *request, NSString *frame, id<WebPolicyDecisionListener> listener) {
133 UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView"));
134 if ([uiWebView respondsToSelector:@selector(webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:)])
135 [uiWebView webView:view decidePolicyForNewWindowAction:action request:request newFrameName:frame decisionListener:listener];
136 }
137
138 - (void) webView:(WebView *)view decidePolicyForNewWindowAction:(NSDictionary *)action request:(NSURLRequest *)request newFrameName:(NSString *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {
139 id<CYWebViewDelegate> delegate([self delegate]);
140 CYWebPolicyDecisionMediator *mediator([[[CYWebPolicyDecisionMediator alloc] initWithListener:listener] autorelease]);
141 if (![mediator decided] && [delegate respondsToSelector:@selector(webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:)])
142 [delegate webView:view decidePolicyForNewWindowAction:action request:request newFrameName:frame decisionListener:mediator];
143 if (![mediator decided] && [UIWebView instancesRespondToSelector:@selector(webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:)])
144 [super webView:view decidePolicyForNewWindowAction:action request:request newFrameName:frame decisionListener:mediator];
145 [mediator decide];
146 }
147 // }}}
148 // webView:didClearWindowObject:forFrame: (3.2+) {{{
149 static void $UIWebViewWebViewDelegate$webView$didClearWindowObject$forFrame$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view, WebScriptObject *window, WebFrame *frame) {
150 UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView"));
151 if ([uiWebView respondsToSelector:@selector(webView:didClearWindowObject:forFrame:)])
152 [uiWebView webView:view didClearWindowObject:window forFrame:frame];
153 }
154
155 - (void) webView:(WebView *)view didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame {
156 id<CYWebViewDelegate> delegate([self delegate]);
157 if ([delegate respondsToSelector:@selector(webView:didClearWindowObject:forFrame:)])
158 [delegate webView:view didClearWindowObject:window forFrame:frame];
159 if ([UIWebView instancesRespondToSelector:@selector(webView:didClearWindowObject:forFrame:)])
160 [super webView:view didClearWindowObject:window forFrame:frame];
161 }
162 // }}}
163 // webView:didFailLoadWithError:forFrame: (2.0+) {{{
164 - (void) webView:(WebView *)view didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame {
165 id<CYWebViewDelegate> delegate([self delegate]);
166 if ([delegate respondsToSelector:@selector(webView:didFailLoadWithError:forFrame:)])
167 [delegate webView:view didFailLoadWithError:error forFrame:frame];
168 if ([UIWebView instancesRespondToSelector:@selector(webView:didFailLoadWithError:forFrame:)])
169 [super webView:view didFailLoadWithError:error forFrame:frame];
170 }
171 // }}}
172 // webView:didFailProvisionalLoadWithError:forFrame: (2.0+) {{{
173 - (void) webView:(WebView *)view didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame {
174 id<CYWebViewDelegate> delegate([self delegate]);
175 if ([delegate respondsToSelector:@selector(webView:didFailProvisionalLoadWithError:forFrame:)])
176 [delegate webView:view didFailProvisionalLoadWithError:error forFrame:frame];
177 if ([UIWebView instancesRespondToSelector:@selector(webView:didFailProvisionalLoadWithError:forFrame:)])
178 [super webView:view didFailProvisionalLoadWithError:error forFrame:frame];
179 }
180 // }}}
181 // webView:didFinishLoadForFrame: (2.0+) {{{
182 - (void) webView:(WebView *)view didFinishLoadForFrame:(WebFrame *)frame {
183 id<CYWebViewDelegate> delegate([self delegate]);
184 if ([delegate respondsToSelector:@selector(webView:didFinishLoadForFrame:)])
185 [delegate webView:view didFinishLoadForFrame:frame];
186 if ([UIWebView instancesRespondToSelector:@selector(webView:didFinishLoadForFrame:)])
187 [super webView:view didFinishLoadForFrame:frame];
188 }
189 // }}}
190 // webView:didReceiveTitle:forFrame: (3.2+) {{{
191 static void $UIWebViewWebViewDelegate$webView$didReceiveTitle$forFrame$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view, NSString *title, WebFrame *frame) {
192 UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView"));
193 if ([uiWebView respondsToSelector:@selector(webView:didReceiveTitle:forFrame:)])
194 [uiWebView webView:view didReceiveTitle:title forFrame:frame];
195 }
196
197 - (void) webView:(WebView *)view didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame {
198 id<CYWebViewDelegate> delegate([self delegate]);
199 if ([delegate respondsToSelector:@selector(webView:didReceiveTitle:forFrame:)])
200 [delegate webView:view didReceiveTitle:title forFrame:frame];
201 if ([UIWebView instancesRespondToSelector:@selector(webView:didReceiveTitle:forFrame:)])
202 [super webView:view didReceiveTitle:title forFrame:frame];
203 }
204 // }}}
205 // webView:didStartProvisionalLoadForFrame: (2.0+) {{{
206 - (void) webView:(WebView *)view didStartProvisionalLoadForFrame:(WebFrame *)frame {
207 id<CYWebViewDelegate> delegate([self delegate]);
208 if ([delegate respondsToSelector:@selector(webView:didStartProvisionalLoadForFrame:)])
209 [delegate webView:view didStartProvisionalLoadForFrame:frame];
210 if ([UIWebView instancesRespondToSelector:@selector(webView:didStartProvisionalLoadForFrame:)])
211 [super webView:view didStartProvisionalLoadForFrame:frame];
212 }
213 // }}}
214 // webView:resource:willSendRequest:redirectResponse:fromDataSource: (3.2+) {{{
215 static NSURLRequest *$UIWebViewWebViewDelegate$webView$resource$willSendRequest$redirectResponse$fromDataSource$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view, id identifier, NSURLRequest *request, NSURLResponse *response, WebDataSource *source) {
216 UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView"));
217 if ([uiWebView respondsToSelector:@selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:)])
218 request = [uiWebView webView:view resource:identifier willSendRequest:request redirectResponse:response fromDataSource:source];
219 return request;
220 }
221
222 - (NSURLRequest *) webView:(WebView *)view resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)source {
223 id<CYWebViewDelegate> delegate([self delegate]);
224 if ([UIWebView instancesRespondToSelector:@selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:)])
225 request = [super webView:view resource:identifier willSendRequest:request redirectResponse:response fromDataSource:source];
226 if ([delegate respondsToSelector:@selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:)])
227 request = [delegate webView:view resource:identifier willSendRequest:request redirectResponse:response fromDataSource:source];
228 return request;
229 }
230 // }}}
231 // webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame: (2.1+) {{{
232 - (void) webView:(WebView *)view runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
233 id<CYWebViewDelegate> delegate([self delegate]);
234 if ([UIWebView instancesRespondToSelector:@selector(webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:)])
235 if (
236 ![delegate respondsToSelector:@selector(webView:shouldRunJavaScriptAlertPanelWithMessage:initiatedByFrame:)] ||
237 [delegate webView:view shouldRunJavaScriptAlertPanelWithMessage:message initiatedByFrame:frame]
238 )
239 [super webView:view runJavaScriptAlertPanelWithMessage:message initiatedByFrame:frame];
240 }
241 // }}}
242 // webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame: (2.1+) {{{
243 - (BOOL) webView:(WebView *)view runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
244 id<CYWebViewDelegate> delegate([self delegate]);
245 if ([UIWebView instancesRespondToSelector:@selector(webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:)])
246 if (
247 ![delegate respondsToSelector:@selector(webView:shouldRunJavaScriptConfirmPanelWithMessage:initiatedByFrame:)] ||
248 [delegate webView:view shouldRunJavaScriptConfirmPanelWithMessage:message initiatedByFrame:frame]
249 )
250 return [super webView:view runJavaScriptConfirmPanelWithMessage:message initiatedByFrame:frame];
251 return NO;
252 }
253 // }}}
254 // webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame: (2.1+) {{{
255 - (NSString *) webView:(WebView *)view runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)text initiatedByFrame:(WebFrame *)frame {
256 id<CYWebViewDelegate> delegate([self delegate]);
257 if ([UIWebView instancesRespondToSelector:@selector(webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:)])
258 if (
259 ![delegate respondsToSelector:@selector(webView:shouldRunJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:)] ||
260 [delegate webView:view shouldRunJavaScriptTextInputPanelWithPrompt:prompt defaultText:text initiatedByFrame:frame]
261 )
262 return [super webView:view runJavaScriptTextInputPanelWithPrompt:prompt defaultText:text initiatedByFrame:frame];
263 return nil;
264 }
265 // }}}
266 // webViewClose: (3.2+) {{{
267 static void $UIWebViewWebViewDelegate$webViewClose$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view) {
268 UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView"));
269 if ([uiWebView respondsToSelector:@selector(webViewClose:)])
270 [uiWebView webViewClose:view];
271 }
272
273 - (void) webViewClose:(WebView *)view {
274 id<CYWebViewDelegate> delegate([self delegate]);
275 if ([delegate respondsToSelector:@selector(webViewClose:)])
276 [delegate webViewClose:view];
277 if ([UIWebView instancesRespondToSelector:@selector(webViewClose:)])
278 [super webViewClose:view];
279 }
280 // }}}
281
282 - (void) _updateViewSettings {
283 [super _updateViewSettings];
284
285 id<CYWebViewDelegate> delegate([self delegate]);
286 if ([delegate respondsToSelector:@selector(webViewUpdateViewSettings:)])
287 [delegate webViewUpdateViewSettings:self];
288 }
289
290 + (void) initialize {
291 if (Class $UIWebViewWebViewDelegate = objc_getClass("UIWebViewWebViewDelegate")) {
292 class_addMethod($UIWebViewWebViewDelegate, @selector(webView:addMessageToConsole:), (IMP) &$UIWebViewWebViewDelegate$webView$addMessageToConsole$, "v16@0:4@8@12");
293 class_addMethod($UIWebViewWebViewDelegate, @selector(webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:), (IMP) &$UIWebViewWebViewDelegate$webView$decidePolicyForNewWindowAction$request$newFrameName$decisionListener$, "v28@0:4@8@12@16@20@24");
294 class_addMethod($UIWebViewWebViewDelegate, @selector(webView:didClearWindowObject:forFrame:), (IMP) &$UIWebViewWebViewDelegate$webView$didClearWindowObject$forFrame$, "v20@0:4@8@12@16");
295 class_addMethod($UIWebViewWebViewDelegate, @selector(webView:didReceiveTitle:forFrame:), (IMP) &$UIWebViewWebViewDelegate$webView$didReceiveTitle$forFrame$, "v20@0:4@8@12@16");
296 class_addMethod($UIWebViewWebViewDelegate, @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:), (IMP) &$UIWebViewWebViewDelegate$webView$resource$willSendRequest$redirectResponse$fromDataSource$, "@28@0:4@8@12@16@20@24");
297 class_addMethod($UIWebViewWebViewDelegate, @selector(webViewClose:), (IMP) &$UIWebViewWebViewDelegate$webViewClose$, "v12@0:4@8");
298 }
299 }
300
301 @end