1 #include "CyteKit/CyteWebView.h"
3 #include <CydiaSubstrate/CydiaSubstrate.h>
5 #include "iPhonePrivate.h"
7 // CYWebPolicyDecision* {{{
8 enum CYWebPolicyDecision {
9 CYWebPolicyDecisionUnknown,
10 CYWebPolicyDecisionDownload,
11 CYWebPolicyDecisionIgnore,
12 CYWebPolicyDecisionUse,
15 @interface CYWebPolicyDecisionMediator : NSObject <
16 WebPolicyDecisionListener
18 id<WebPolicyDecisionListener> listener_;
19 CYWebPolicyDecision decision_;
22 - (id) initWithListener:(id<WebPolicyDecisionListener>)listener;
24 - (CYWebPolicyDecision) decision;
30 @implementation CYWebPolicyDecisionMediator
32 - (id) initWithListener:(id<WebPolicyDecisionListener>)listener {
33 if ((self = [super init]) != nil) {
38 - (CYWebPolicyDecision) decision {
43 return decision_ != CYWebPolicyDecisionUnknown;
48 case CYWebPolicyDecisionUnknown:
50 NSLog(@"CYWebPolicyDecisionUnknown");
53 case CYWebPolicyDecisionDownload: [listener_ download]; break;
54 case CYWebPolicyDecisionIgnore: [listener_ ignore]; break;
55 case CYWebPolicyDecisionUse: [listener_ use]; break;
62 decision_ = CYWebPolicyDecisionDownload;
66 decision_ = CYWebPolicyDecisionIgnore;
70 decision_ = CYWebPolicyDecisionUse;
76 @implementation CYWebView : UIWebView
79 #include "CyteKit/UCInternal.h"
82 - (id) initWithFrame:(CGRect)frame {
83 if ((self = [super initWithFrame:frame]) != nil) {
91 - (id<CYWebViewDelegate>) delegate {
92 return (id<CYWebViewDelegate>) [super delegate];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
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:)])
236 ![delegate respondsToSelector:@selector(webView:shouldRunJavaScriptAlertPanelWithMessage:initiatedByFrame:)] ||
237 [delegate webView:view shouldRunJavaScriptAlertPanelWithMessage:message initiatedByFrame:frame]
239 [super webView:view runJavaScriptAlertPanelWithMessage:message initiatedByFrame:frame];
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:)])
247 ![delegate respondsToSelector:@selector(webView:shouldRunJavaScriptConfirmPanelWithMessage:initiatedByFrame:)] ||
248 [delegate webView:view shouldRunJavaScriptConfirmPanelWithMessage:message initiatedByFrame:frame]
250 return [super webView:view runJavaScriptConfirmPanelWithMessage:message initiatedByFrame:frame];
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:)])
259 ![delegate respondsToSelector:@selector(webView:shouldRunJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:)] ||
260 [delegate webView:view shouldRunJavaScriptTextInputPanelWithPrompt:prompt defaultText:text initiatedByFrame:frame]
262 return [super webView:view runJavaScriptTextInputPanelWithPrompt:prompt defaultText:text initiatedByFrame:frame];
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];
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];
282 - (void) _updateViewSettings {
283 [super _updateViewSettings];
285 id<CYWebViewDelegate> delegate([self delegate]);
286 if ([delegate respondsToSelector:@selector(webViewUpdateViewSettings:)])
287 [delegate webViewUpdateViewSettings:self];
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");