]> git.saurik.com Git - cydia.git/blobdiff - CyteKit/WebViewController.mm
Add output filename parameter to pngcrush.sh.
[cydia.git] / CyteKit / WebViewController.mm
index 8c9a016f5776109c7efe71c0ed36ea32e0cbae5c..496d8b21edca6c47e30048701e4533c23e23a8fc 100644 (file)
@@ -16,6 +16,7 @@ extern NSString * const kCAFilterNearest;
 
 #include <WebCore/WebCoreThread.h>
 
+#include <WebKit/WebKitErrors.h>
 #include <WebKit/WebPreferences.h>
 
 #include <WebKit/DOMCSSPrimitiveValue.h>
@@ -36,14 +37,6 @@ extern NSString * const kCAFilterNearest;
 // XXX: centralize these special class things to some file or mechanism?
 static Class $MFMailComposeViewController;
 
-template <typename Type_>
-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<WebPolicyDecisionListener>)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<NSFastEnumeration> *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<id>(webview, "_private"));
-    WebCore::Page *page(_private == nil ? NULL : MSHookIvar<WebCore::Page *>(_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 {