From d331bfc3c3efdde44dfd4e81c50703e51f958a2f Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Wed, 29 Oct 2014 08:22:05 -0700 Subject: Fix Cydia's popup blocking (broken since iOS 4.2). --- CyteKit/WebViewController.mm | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'CyteKit') diff --git a/CyteKit/WebViewController.mm b/CyteKit/WebViewController.mm index bf2643b..7d91177 100644 --- a/CyteKit/WebViewController.mm +++ b/CyteKit/WebViewController.mm @@ -942,7 +942,7 @@ float CYScrollViewDecelerationRateNormal; [preferences _setLayoutInterval:0]; [preferences setCacheModel:WebCacheModelDocumentBrowser]; - [preferences setJavaScriptCanOpenWindowsAutomatically:YES]; + [preferences setJavaScriptCanOpenWindowsAutomatically:NO]; if ([preferences respondsToSelector:@selector(setOfflineWebApplicationCacheEnabled:)]) [preferences setOfflineWebApplicationCacheEnabled:YES]; @@ -1040,16 +1040,34 @@ float CYScrollViewDecelerationRateNormal; } return self; } ++ (void) _lockJavaScript:(WebPreferences *)preferences { + WebThreadLocked lock; + [preferences setJavaScriptCanOpenWindowsAutomatically:NO]; +} + - (void) callFunction:(WebScriptObject *)function { WebThreadLocked lock; WebView *webview([[[self webView] _documentView] webView]); - WebFrame *frame([webview mainFrame]); + WebPreferences *preferences([webview preferences]); + [preferences setJavaScriptCanOpenWindowsAutomatically:YES]; + if ([webview respondsToSelector:@selector(_preferencesChanged:)]) + [webview _preferencesChanged:preferences]; + else + [webview _preferencesChangedNotification:[NSNotification notificationWithName:@"" object:preferences]]; + + WebFrame *frame([webview mainFrame]); JSGlobalContextRef context([frame globalContext]); + JSObjectRef object([function JSObject]); if ($JSObjectCallAsFunction != NULL) ($JSObjectCallAsFunction)(context, object, NULL, 0, NULL, NULL); + + // XXX: the JavaScript code submits a form, which seems to happen asynchronously + NSObject *target([CyteWebViewController class]); + [NSObject cancelPreviousPerformRequestsWithTarget:target selector:@selector(_lockJavaScript:) object:preferences]; + [target performSelector:@selector(_lockJavaScript:) withObject:preferences afterDelay:1]; } - (void) reloadButtonClicked { -- cgit v1.2.3