X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/45e660378a2efdec34832ccc597cd72f7f8c6430..df27070399c61922ec227823602f0d7f06043726:/CyteKit/WebViewController.mm diff --git a/CyteKit/WebViewController.mm b/CyteKit/WebViewController.mm index 8c9a016f..496d8b21 100644 --- a/CyteKit/WebViewController.mm +++ b/CyteKit/WebViewController.mm @@ -16,6 +16,7 @@ extern NSString * const kCAFilterNearest; #include +#include #include #include @@ -36,14 +37,6 @@ extern NSString * const kCAFilterNearest; // XXX: centralize these special class things to some file or mechanism? static Class $MFMailComposeViewController; -template -static inline void CYRelease(Type_ &value) { - if (value != nil) { - [value release]; - value = nil; - } -} - float CYScrollViewDecelerationRateNormal; @interface WebView (Apple) @@ -146,24 +139,10 @@ float CYScrollViewDecelerationRateNormal; #endif [webview_ setDelegate:nil]; - [indirect_ setDelegate:nil]; - [indirect_ release]; - - if (challenge_ != nil) - [challenge_ release]; - - if (title_ != nil) - [title_ release]; if ([loading_ count] != 0) [delegate_ releaseNetworkActivityIndicator]; - [loading_ release]; - - [reloaditem_ release]; - [loadingitem_ release]; - - [indicator_ release]; [super dealloc]; } @@ -341,9 +320,16 @@ float CYScrollViewDecelerationRateNormal; [loading_ removeObject:[NSValue valueWithNonretainedObject:frame]]; [self _didFinishLoading]; - if ([error code] == NSURLErrorCancelled) + if ([[error domain] isEqualToString:NSURLErrorDomain] && [error code] == NSURLErrorCancelled) return; + if ([[error domain] isEqualToString:WebKitErrorDomain] && [error code] == WebKitErrorFrameLoadInterruptedByPolicyChange) { + request_ = (id) stage2_; + stage1_ = nil; + stage2_ = nil; + return; + } + if ([frame parentFrame] == nil) { [self loadURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?%@", [[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"error" ofType:@"html"]] absoluteString], @@ -393,7 +379,11 @@ float CYScrollViewDecelerationRateNormal; // CyteWebViewDelegate {{{ - (void) webView:(WebView *)view addMessageToConsole:(NSDictionary *)message { #if LogMessages - static Pcre irritating("^(?:The page at .* displayed insecure content from .*\\.|Unsafe JavaScript attempt to access frame with URL .* from frame with URL .*\\. Domains, protocols and ports must match\\.)\\n$"); + static Pcre irritating("^(?" + ":" "The page at .* displayed insecure content from .*\\." + "|" "Unsafe JavaScript attempt to access frame with URL .* from frame with URL .*\\. Domains, protocols and ports must match\\." + ")\\n$"); + if (NSString *data = [message objectForKey:@"message"]) if (irritating(data)) return; @@ -411,9 +401,7 @@ float CYScrollViewDecelerationRateNormal; if (!error_) { NSURL *url(request == nil ? nil : [request URL]); - if (request_ == nil || [self allowsNavigationAction] || [[request_ URL] isEqual:url]) - request_ = request; - else { + if (request_ != nil && ![[request_ URL] isEqual:url] && ![self allowsNavigationAction]) { if (url != nil) [self pushRequest:request asPop:NO]; [listener ignore]; @@ -422,6 +410,15 @@ float CYScrollViewDecelerationRateNormal; } } +- (void) webView:(WebView *)view didDecidePolicy:(CYWebPolicyDecision)decision forNavigationAction:(NSDictionary *)action request:(NSURLRequest *)request frame:(WebFrame *)frame { + if ([frame parentFrame] == nil) + if (decision == CYWebPolicyDecisionUse) + if (!error_) { + stage1_ = (id) request_; + request_ = request; + } +} + - (void) webView:(WebView *)view decidePolicyForNewWindowAction:(NSDictionary *)action request:(NSURLRequest *)request newFrameName:(NSString *)frame decisionListener:(id)listener { #if LogBrowser NSLog(@"decidePolicyForNewWindowAction:%@ request:%@ newFrameName:%@", action, request, frame); @@ -467,6 +464,9 @@ float CYScrollViewDecelerationRateNormal; [loading_ removeObject:[NSValue valueWithNonretainedObject:frame]]; if ([frame parentFrame] == nil) { + stage1_ = nil; + stage2_ = nil; + if (DOMDocument *document = [frame DOMDocument]) if (DOMNodeList *bodies = [document getElementsByTagName:@"body"]) for (DOMHTMLBodyElement *body in (id) bodies) { @@ -507,22 +507,27 @@ float CYScrollViewDecelerationRateNormal; if ([frame parentFrame] != nil) return; - if (title_ != nil) - [title_ autorelease]; - title_ = [title retain]; + title_ = title; [[self navigationItem] setTitle:title_]; } - (void) webView:(WebView *)view didStartProvisionalLoadForFrame:(WebFrame *)frame { +#if LogBrowser + NSLog(@"didStartProvisionalLoadForFrame:%@", frame); +#endif + [loading_ addObject:[NSValue valueWithNonretainedObject:frame]]; if ([frame parentFrame] == nil) { - CYRelease(title_); + title_ = nil; custom_ = nil; style_ = nil; function_ = nil; + stage2_ = (id) stage1_; + stage1_ = nil; + [self setHidesNavigationBar:NO]; // XXX: do we still need to do this? @@ -596,7 +601,6 @@ float CYScrollViewDecelerationRateNormal; _nodefault } - [challenge_ release]; challenge_ = nil; [alert dismissWithClickedButtonIndex:-1 animated:YES]; @@ -729,9 +733,9 @@ float CYScrollViewDecelerationRateNormal; allowsNavigationAction_ = true; class_ = _class; - loading_ = [[NSMutableSet alloc] initWithCapacity:5]; + loading_ = [NSMutableSet setWithCapacity:5]; - indirect_ = [[IndirectDelegate alloc] initWithDelegate:self]; + indirect_ = [[[IndirectDelegate alloc] initWithDelegate:self] autorelease]; CGRect bounds([[self view] bounds]); @@ -766,6 +770,7 @@ float CYScrollViewDecelerationRateNormal; [preferences _setLayoutInterval:0]; [preferences setCacheModel:WebCacheModelDocumentBrowser]; + [preferences setJavaScriptCanOpenWindowsAutomatically:YES]; [preferences setOfflineWebApplicationCacheEnabled:YES]; #if LogMessages @@ -811,21 +816,21 @@ float CYScrollViewDecelerationRateNormal; [self setViewportWidth:width]; - reloaditem_ = [[UIBarButtonItem alloc] + reloaditem_ = [[[UIBarButtonItem alloc] initWithTitle:UCLocalize("RELOAD") style:[self rightButtonStyle] target:self action:@selector(reloadButtonClicked) - ]; + ] autorelease]; - loadingitem_ = [[UIBarButtonItem alloc] + loadingitem_ = [[[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:self action:@selector(reloadButtonClicked) - ]; + ] autorelease]; - indicator_ = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; + indicator_ = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease]; [indicator_ setFrame:CGRectMake(15, 5, [indicator_ frame].size.width, [indicator_ frame].size.height)]; UITableView *table([[[UITableView alloc] initWithFrame:bounds style:UITableViewStyleGrouped] autorelease]); @@ -859,35 +864,10 @@ float CYScrollViewDecelerationRateNormal; WebView *webview([[webview_ _documentView] webView]); WebFrame *frame([webview mainFrame]); - WebPreferences *preferences([webview preferences]); - - bool maybe([preferences javaScriptCanOpenWindowsAutomatically]); - [preferences setJavaScriptCanOpenWindowsAutomatically:NO]; - /*id _private(MSHookIvar(webview, "_private")); - WebCore::Page *page(_private == nil ? NULL : MSHookIvar(_private, "page")); - WebCore::Settings *settings(page == NULL ? NULL : page->settings()); - - bool no; - if (settings == NULL) - no = 0; - else { - no = settings->JavaScriptCanOpenWindowsAutomatically(); - settings->setJavaScriptCanOpenWindowsAutomatically(true); - }*/ - - if (UIWindow *window = [[self view] window]) - if (UIResponder *responder = [window firstResponder]) - [responder resignFirstResponder]; - - JSObjectRef object([function JSObject]); JSGlobalContextRef context([frame globalContext]); + JSObjectRef object([function JSObject]); JSObjectCallAsFunction(context, object, NULL, 0, NULL, NULL); - - /*if (settings != NULL) - settings->setJavaScriptCanOpenWindowsAutomatically(no);*/ - - [preferences setJavaScriptCanOpenWindowsAutomatically:maybe]; } - (void) reloadButtonClicked {