]> git.saurik.com Git - cydia.git/commitdiff
Add -[BrowserController _allowNavigationAction] to limit _top usage.
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 24 Feb 2011 16:56:10 +0000 (08:56 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 7 Mar 2011 10:41:15 +0000 (02:41 -0800)
MobileCydia.mm
UICaboodle/BrowserView.mm

index 015e071fc0c6cea68b9fc3636879d5a57aa959d1..aa9b342ee17c38605119895a47c867539411c9a8 100644 (file)
@@ -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")])
index f354be8faeda8e118bc7bf67fe2e04315f0a7775..29fbde667bb75bc4208bac8d033571c74addbf43 100644 (file)
@@ -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<WebPolicyDecisionListener>)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<WebPolicyDecisionListener>)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<WebPolicyDecisionListener>)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<WebPolicyDecisionListener>)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];
 }