#define ShowInternals 0
#define LogBrowser 0
+#define LogMessages 0
#define lprintf(args...) fprintf(stderr, args)
+// WebThreadLocked {{{
+struct WebThreadLocked {
+ _finline WebThreadLocked() {
+ WebThreadLock();
+ }
+
+ _finline ~WebThreadLocked() {
+ WebThreadUnlock();
+ }
+};
+// }}}
+
template <typename Type_>
static inline void CYRelease(Type_ &value) {
if (value != nil) {
@interface WebView (Apple)
- (void) _setLayoutInterval:(float)interval;
+- (void) _setAllowsMessaging:(BOOL)allows;
@end
@interface WebPreferences (Apple)
return created;
}*/
+// webView:addMessageToConsole: (X.Xx) {{{
+static void $UIWebViewWebViewDelegate$webView$addMessageToConsole$(UIWebViewWebViewDelegate *self, SEL sel, WebView *view, NSDictionary *message) {
+ UIWebView *uiWebView(MSHookIvar<UIWebView *>(self, "uiWebView"));
+ if ([uiWebView respondsToSelector:@selector(webView:addMessageToConsole:)])
+ [uiWebView webView:view addMessageToConsole:message];
+}
+
+- (void) webView:(WebView *)view addMessageToConsole:(NSDictionary *)message {
+ id<CYWebViewDelegate> delegate([self delegate]);
+ if ([delegate respondsToSelector:@selector(webView:addMessageToConsole:)])
+ [delegate webView:view addMessageToConsole:message];
+ if ([UIWebView instancesRespondToSelector:@selector(webView:addMessageToConsole:)])
+ [super webView:view addMessageToConsole:message];
+}
+// }}}
// webView:decidePolicyForNavigationAction:request:frame:decisionListener: (2.0+) {{{
- (void) webView:(WebView *)view decidePolicyForNavigationAction:(NSDictionary *)action request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {
id<CYWebViewDelegate> delegate([self delegate]);
+ (void) initialize {
if (Class $UIWebViewWebViewDelegate = objc_getClass("UIWebViewWebViewDelegate")) {
+ class_addMethod($UIWebViewWebViewDelegate, @selector(webView:addMessageToConsole:), (IMP) &$UIWebViewWebViewDelegate$webView$addMessageToConsole$, "v16@0:4@8@12");
class_addMethod($UIWebViewWebViewDelegate, @selector(webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:), (IMP) &$UIWebViewWebViewDelegate$webView$decidePolicyForNewWindowAction$request$newFrameName$decisionListener$, "v28@0:4@8@12@16@20@24");
class_addMethod($UIWebViewWebViewDelegate, @selector(webView:didClearWindowObject:forFrame:), (IMP) &$UIWebViewWebViewDelegate$webView$didClearWindowObject$forFrame$, "v20@0:4@8@12@16");
class_addMethod($UIWebViewWebViewDelegate, @selector(webView:didReceiveTitle:forFrame:), (IMP) &$UIWebViewWebViewDelegate$webView$didReceiveTitle$forFrame$, "v20@0:4@8@12@16");
error_ = false;
- WebThreadLock();
+ WebThreadLocked lock;
[webview_ loadRequest:request];
- WebThreadUnlock();
}
-- (void) reloadURL {
+- (void) reloadURLWithCache:(BOOL)cache {
if (request_ == nil)
return;
+ NSMutableURLRequest *request([request_ mutableCopy]);
+ [request setCachePolicy:(cache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData)];
+
+ [request_ autorelease];
+ request_ = [request retain];
+
if ([request_ HTTPBody] == nil && [request_ HTTPBodyStream] == nil)
[self loadRequest:request_];
else {
message:nil
delegate:self
cancelButtonTitle:UCLocalize("CANCEL")
- otherButtonTitles:UCLocalize("SUBMIT"), nil
+ otherButtonTitles:
+ UCLocalize("SUBMIT"),
+ nil
] autorelease];
[alert setContext:@"submit"];
}
}
+- (void) reloadURL {
+ [self reloadURLWithCache:YES];
+}
+
- (void) reloadData {
[super reloadData];
- [self reloadURL];
+ [self reloadURLWithCache:YES];
}
- (void) setButtonImage:(NSString *)button withStyle:(NSString *)style toFunction:(id)function {
else
function_ = [function retain];
- [self applyRightButton];
+ [self performSelectorOnMainThread:@selector(applyRightButton) withObject:nil waitUntilDone:NO];
}
- (void) setButtonTitle:(NSString *)button withStyle:(NSString *)style toFunction:(id)function {
else
function_ = [function retain];
- [self applyRightButton];
+ [self performSelectorOnMainThread:@selector(applyRightButton) withObject:nil waitUntilDone:NO];
}
- (void) setPopupHook:(id)function {
}
// CYWebViewDelegate {{{
+- (void) webView:(WebView *)view addMessageToConsole:(NSDictionary *)message {
+#if LogMessages
+ NSLog(@"addMessageToConsole:%@", message);
+#endif
+}
+
- (void) webView:(WebView *)view decidePolicyForNavigationAction:(NSDictionary *)action request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {
#if LogBrowser
NSLog(@"decidePolicyForNavigationAction:%@ request:%@ frame:%@", action, request, frame);
if ([scheme isEqualToString:@"mailto"])
[self _openMailToURL:url];
- CYViewController *page([delegate_ pageForURL:url]);
+ // XXX: filter to internal usage?
+ CYViewController *page([delegate_ pageForURL:url forExternal:NO]);
if (page == nil) {
BrowserController *browser([[[class_ alloc] init] autorelease]);
if (button == [alert cancelButtonIndex]) {
} else if (button == [alert firstOtherButtonIndex]) {
if (request_ != nil) {
- WebThreadLock();
+ WebThreadLocked lock;
[webview_ loadRequest:request_];
- WebThreadUnlock();
}
}
[preferences setCacheModel:WebCacheModelDocumentBrowser];
[preferences setOfflineWebApplicationCacheEnabled:YES];
+#if LogMessages
+ if ([document respondsToSelector:@selector(setAllowsMessaging:)])
+ [document setAllowsMessaging:YES];
+ if ([webview respondsToSelector:@selector(_setAllowsMessaging:)])
+ [webview _setAllowsMessaging:YES];
+#endif
+
if ([webview_ respondsToSelector:@selector(_scrollView)]) {
scroller_ = [webview_ _scrollView];
}
- (void) callFunction:(WebScriptObject *)function {
- WebThreadLock();
+ WebThreadLocked lock;
WebView *webview([[webview_ _documentView] webView]);
WebFrame *frame([webview mainFrame]);
settings->setJavaScriptCanOpenWindowsAutomatically(no);*/
[preferences setJavaScriptCanOpenWindowsAutomatically:maybe];
-
- WebThreadUnlock();
}
- (void) reloadButtonClicked {
- [self reloadURL];
+ [self reloadURLWithCache:YES];
}
- (void) _customButtonClicked {
return 980;
}
+- (void) dispatchEvent:(NSString *)event {
+ WebThreadLocked lock;
+
+ NSString *script([NSString stringWithFormat:@
+ "(function() {"
+ "var event = this.document.createEvent('Events');"
+ "event.initEvent('%@', false, false);"
+ "this.document.dispatchEvent(event);"
+ "})();"
+ , event]);
+
+ NSMutableArray *frames([NSMutableArray arrayWithObjects:
+ [[[webview_ _documentView] webView] mainFrame]
+ , nil]);
+
+ while (WebFrame *frame = [frames lastObject]) {
+ WebScriptObject *object([frame windowObject]);
+ [object evaluateWebScript:script];
+ [frames removeLastObject];
+ [frames addObjectsFromArray:[frame childFrames]];
+ }
+}
+
+- (void) viewWillAppear:(BOOL)animated {
+ [self dispatchEvent:@"CydiaViewWillAppear"];
+ [super viewWillAppear:animated];
+}
+
+- (void) viewDidAppear:(BOOL)animated {
+ [self dispatchEvent:@"CydiaViewDidAppear"];
+ [super viewDidAppear:animated];
+}
+
+- (void) viewWillDisappear:(BOOL)animated {
+ [self dispatchEvent:@"CydiaViewWillDisappear"];
+ [super viewWillDisappear:animated];
+}
+
+- (void) viewDidDisappear:(BOOL)animated {
+ [self dispatchEvent:@"CydiaViewDidDisappear"];
+ [super viewDidDisappear:animated];
+}
+
@end