From 52498c7e59d6854bad363b67acd1359e25209c46 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Thu, 24 Feb 2011 08:56:10 -0800 Subject: Add -[BrowserController _allowNavigationAction] to limit _top usage. --- MobileCydia.mm | 5 +++ UICaboodle/BrowserView.mm | 84 ++++++++++++++++++++++++++++------------------- 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/MobileCydia.mm b/MobileCydia.mm index 015e071..aa9b342 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -5919,6 +5919,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { return [NSURL URLWithString:[NSString stringWithFormat:@"cydia://package/%@", name_]]; } +- (bool) _allowNavigationAction { + // XXX: damn it... I really want this. + return true; +} + /* XXX: this is not safe at all... localization of /fail/ */ - (void) _clickButtonWithName:(NSString *)name { if ([name isEqualToString:UCLocalize("CLEAR")]) diff --git a/UICaboodle/BrowserView.mm b/UICaboodle/BrowserView.mm index f354be8..29fbde6 100644 --- a/UICaboodle/BrowserView.mm +++ b/UICaboodle/BrowserView.mm @@ -637,6 +637,10 @@ static void $UIWebViewWebViewDelegate$webViewClose$(UIWebViewWebViewDelegate *se return true; } +- (bool) _allowNavigationAction { + return true; +} + - (void) _didFailWithError:(NSError *)error forFrame:(WebFrame *)frame { [loading_ removeObject:[NSValue valueWithNonretainedObject:frame]]; [self _didFinishLoading]; @@ -654,39 +658,8 @@ static void $UIWebViewWebViewDelegate$webViewClose$(UIWebViewWebViewDelegate *se } } -// 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)listener { -#if LogBrowser - NSLog(@"decidePolicyForNavigationAction:%@ request:%@ frame:%@", action, request, frame); -#endif - - if ([frame parentFrame] == nil) { - if (!error_) - 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); -#endif - +- (void) pushRequest:(NSURLRequest *)request asPop:(bool)pop { NSURL *url([request URL]); - if (url == nil) - return; - - if ([frame isEqualToString:@"_open"]) - [delegate_ openURL:url]; - - NSString *scheme([[url scheme] lowercaseString]); - if ([scheme isEqualToString:@"mailto"]) - [self _openMailToURL:url]; // XXX: filter to internal usage? CYViewController *page([delegate_ pageForURL:url forExternal:NO]); @@ -699,7 +672,7 @@ static void $UIWebViewWebViewDelegate$webViewClose$(UIWebViewWebViewDelegate *se [page setDelegate:delegate_]; - if (![frame isEqualToString:@"_popup"]) { + if (!pop) { [[self navigationItem] setTitle:title_]; [[self navigationController] pushViewController:page animated:YES]; @@ -718,6 +691,51 @@ static void $UIWebViewWebViewDelegate$webViewClose$(UIWebViewWebViewDelegate *se [[self navigationController] presentModalViewController:navigation animated:YES]; } +} + +// 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)listener { +#if LogBrowser + NSLog(@"decidePolicyForNavigationAction:%@ request:%@ frame:%@", action, request, frame); +#endif + + if ([frame parentFrame] == nil) { + if (!error_) { + if ([self _allowNavigationAction]) + request_ = request; + else { + if ([request URL] != nil) + [self pushRequest:request asPop:NO]; + [listener ignore]; + } + } + } +} + +- (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); +#endif + + NSURL *url([request URL]); + if (url == nil) + return; + + if ([frame isEqualToString:@"_open"]) + [delegate_ openURL:url]; + else { + NSString *scheme([[url scheme] lowercaseString]); + if ([scheme isEqualToString:@"mailto"]) + [self _openMailToURL:url]; + else + [self pushRequest:request asPop:[frame isEqualToString:@"_popup"]]; + } [listener ignore]; } -- cgit v1.2.3