]> git.saurik.com Git - cydia.git/blobdiff - CyteKit/WebViewController.mm
Copy strings that might get yanked from under us.
[cydia.git] / CyteKit / WebViewController.mm
index 08839728ee15fc75734b8dc99f723b24fbe5f4a8..c2f280cddef577c9dd948f4f7207d61655788157 100644 (file)
@@ -25,6 +25,9 @@ extern NSString * const kCAFilterNearest;
 #include <WebKit/DOMHTMLBodyElement.h>
 #include <WebKit/DOMRGBColor.h>
 
+#include <dlfcn.h>
+#include <objc/runtime.h>
+
 #define ForSaurik 0
 #define DefaultTimeout_ 120.0
 
@@ -37,14 +40,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,25 +141,8 @@ float CYScrollViewDecelerationRateNormal;
     NSLog(@"[CyteWebViewController dealloc]");
 #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];
 }
@@ -200,6 +178,7 @@ float CYScrollViewDecelerationRateNormal;
 #endif
 
     error_ = false;
+    ready_ = true;
 
     WebThreadLocked lock;
     [webview_ loadRequest:request];
@@ -238,7 +217,11 @@ float CYScrollViewDecelerationRateNormal;
 
 - (void) reloadData {
     [super reloadData];
-    [self reloadURLWithCache:YES];
+
+    if (ready_)
+        [self dispatchEvent:@"CydiaReloadData"];
+    else
+        [self reloadURLWithCache:YES];
 }
 
 - (void) setButtonImage:(NSString *)button withStyle:(NSString *)style toFunction:(id)function {
@@ -298,6 +281,9 @@ float CYScrollViewDecelerationRateNormal;
     [self dismissModalViewControllerAnimated:YES];
 }
 
+- (void) _setupMail:(MFMailComposeViewController *)controller {
+}
+
 - (void) _openMailToURL:(NSURL *)url {
     if ($MFMailComposeViewController != nil && [$MFMailComposeViewController canSendMail]) {
         MFMailComposeViewController *controller([[[$MFMailComposeViewController alloc] init] autorelease]);
@@ -305,6 +291,8 @@ float CYScrollViewDecelerationRateNormal;
 
         [controller setMailToURL:url];
 
+        [self _setupMail:controller];
+
         [self presentModalViewController:controller animated:YES];
         return;
     }
@@ -346,7 +334,7 @@ float CYScrollViewDecelerationRateNormal;
         return;
 
     if ([[error domain] isEqualToString:WebKitErrorDomain] && [error code] == WebKitErrorFrameLoadInterruptedByPolicyChange) {
-        request_ = (id) stage2_;
+        request_ = stage2_;
         stage1_ = nil;
         stage2_ = nil;
         return;
@@ -392,8 +380,6 @@ float CYScrollViewDecelerationRateNormal;
             action:@selector(close)
         ] autorelease]];
 
-        [delegate_ unloadData];
-
         [[self navigationController] presentModalViewController:navigation animated:YES];
     }
 }
@@ -436,7 +422,7 @@ float CYScrollViewDecelerationRateNormal;
     if ([frame parentFrame] == nil)
         if (decision == CYWebPolicyDecisionUse)
             if (!error_) {
-                stage1_ = (id) request_;
+                stage1_ = request_;
                 request_ = request;
             }
 }
@@ -529,23 +515,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_;
+        allowsNavigationAction_ = true;
+
+        stage2_ = stage1_;
         stage1_ = nil;
 
         [self setHidesNavigationBar:NO];
@@ -621,7 +611,6 @@ float CYScrollViewDecelerationRateNormal;
             _nodefault
         }
 
-        [challenge_ release];
         challenge_ = nil;
 
         [alert dismissWithClickedButtonIndex:-1 animated:YES];
@@ -754,9 +743,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]);
 
@@ -794,6 +783,9 @@ float CYScrollViewDecelerationRateNormal;
         [preferences setJavaScriptCanOpenWindowsAutomatically:YES];
         [preferences setOfflineWebApplicationCacheEnabled:YES];
 
+        if ([webview respondsToSelector:@selector(setShouldUpdateWhileOffscreen:)])
+            [webview setShouldUpdateWhileOffscreen:NO];
+
 #if LogMessages
         if ([document respondsToSelector:@selector(setAllowsMessaging:)])
             [document setAllowsMessaging:YES];
@@ -837,21 +829,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]);
@@ -940,7 +932,7 @@ float CYScrollViewDecelerationRateNormal;
 }
 
 - (void) dispatchEvent:(NSString *)event {
-    [webview_ dispatchEvent:event];
+    [(CyteWebView *) webview_ dispatchEvent:event];
 }
 
 - (bool) hidesNavigationBar {