]> git.saurik.com Git - cydia.git/blobdiff - UICaboodle/BrowserView.mm
Merge CYViewController into UCViewController.
[cydia.git] / UICaboodle / BrowserView.mm
index 5f984d1faebb6e59c98065372befb449d111f3a8..793678ef80e264357b35adaa12e2ecb961e304a7 100644 (file)
@@ -1,26 +1,44 @@
+#include <UIKit/UIKit.h>
+#include "iPhonePrivate.h"
+
+#include "UCPlatform.h"
+
 #include <UICaboodle/BrowserView.h>
 #include <UICaboodle/UCLocalize.h>
 
-#import <QuartzCore/CALayer.h>
+//#include <QuartzCore/CALayer.h>
 // XXX: fix the minimum requirement
 extern NSString * const kCAFilterNearest;
 
 #include <WebCore/WebCoreThread.h>
-#include <WebKit/WebPreferences-WebPrivate.h>
+
+#include <WebKit/WebPolicyDelegate.h>
+#include <WebKit/WebPreferences.h>
+
+#include <WebKit/DOMCSSPrimitiveValue.h>
+#include <WebKit/DOMCSSStyleDeclaration.h>
+#include <WebKit/DOMDocument.h>
+#include <WebKit/DOMHTMLBodyElement.h>
+#include <WebKit/DOMRGBColor.h>
+
+//#include <WebCore/Page.h>
+//#include <WebCore/Settings.h>
 
 #include "substrate.h"
 
-#define ForSaurik 1
+#define ForSaurik 0
+
+static bool Wildcat_;
 
 static CFArrayRef (*$GSSystemCopyCapability)(CFStringRef);
 static CFArrayRef (*$GSSystemGetCapability)(CFStringRef);
-
-@interface NSString (UIKit)
-- (NSString *) stringByAddingPercentEscapes;
-@end
+static Class $UIFormAssistant;
+static Class $UIWebBrowserView;
 
 /* Indirect Delegate {{{ */
-@interface IndirectDelegate : NSObject {
+@interface IndirectDelegate : NSObject <
+    HookProtocol
+> {
     _transient volatile id delegate_;
 }
 
@@ -85,6 +103,11 @@ static CFArrayRef (*$GSSystemGetCapability)(CFStringRef);
     return nil;
 }
 
+- (void) didDismissModalViewController {
+    if (delegate_ != nil)
+        return [delegate_ didDismissModalViewController];
+}
+
 - (IMP) methodForSelector:(SEL)sel {
     if (IMP method = [super methodForSelector:sel])
         return method;
@@ -121,11 +144,19 @@ static CFArrayRef (*$GSSystemGetCapability)(CFStringRef);
 /* }}} */
 
 @interface WebView (UICaboodle)
-- (void) setScriptDebugDelegate:(id)delegate;
++ (BOOL) _canHandleRequest:(NSURLRequest *)request;
 - (void) _setFormDelegate:(id)delegate;
+- (void) _setLayoutInterval:(float)interval;
+- (void) setScriptDebugDelegate:(id)delegate;
 - (void) _setUIKitDelegate:(id)delegate;
+- (void) _setUsesLoaderCache:(BOOL)uses;
 - (void) setWebMailDelegate:(id)delegate;
-- (void) _setLayoutInterval:(float)interval;
+@end
+
+@interface WebPreferences (Apple)
++ (void) _setInitialDefaultTextEncodingToSystemEncoding;
+- (void) _setLayoutInterval:(NSInteger)interval;
+- (void) setOfflineWebApplicationCacheEnabled:(BOOL)enabled;
 @end
 
 @implementation WebScriptObject (UICaboodle)
@@ -144,90 +175,43 @@ static CFArrayRef (*$GSSystemGetCapability)(CFStringRef);
 
 @end
 
-#if 0
-/* Mail Composition {{{ */
-@interface MailToView : PopUpView {
-    MailComposeController *controller_;
+@interface BrowserView : UIView {
+@private
+    UIWebDocumentView *documentView;
 }
-
-- (id) initWithView:(UIView *)view delegate:(id)delegate url:(NSURL *)url;
-
+@property (nonatomic, retain) UIWebDocumentView *documentView;
 @end
 
-@implementation MailToView
-
-- (void) dealloc {
-    [controller_ release];
-    [super dealloc];
-}
-
-- (void) mailComposeControllerWillAttemptToSend:(MailComposeController *)controller {
-    NSLog(@"will");
-}
-
-- (void) mailComposeControllerDidAttemptToSend:(MailComposeController *)controller mailDelivery:(id)delivery {
-    NSLog(@"did:%@", delivery);
-// [UIApp setStatusBarShowsProgress:NO];
-if ([controller error]){
-NSArray *buttons = [NSArray arrayWithObjects:UCLocalize("OK"), nil];
-UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize("ERROR") buttons:buttons defaultButtonIndex:0 delegate:self context:self];
-[mailAlertSheet setBodyText:[controller error]];
-[mailAlertSheet popupAlertAnimated:YES];
-}
-}
-
-- (void) showError {
-    NSLog(@"%@", [controller_ error]);
-    NSArray *buttons = [NSArray arrayWithObjects:UCLocalize("OK"), nil];
-    UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize("ERROR") buttons:buttons defaultButtonIndex:0 delegate:self context:self];
-    [mailAlertSheet setBodyText:[controller_ error]];
-    [mailAlertSheet popupAlertAnimated:YES];
-}
-
-- (void) deliverMessage { _pooled
-    setuid(501);
-    setgid(501);
+@implementation BrowserView
 
-    if (![controller_ deliverMessage])
-        [self performSelectorOnMainThread:@selector(showError) withObject:nil waitUntilDone:NO];
-}
+@synthesize documentView;
 
-- (void) mailComposeControllerCompositionFinished:(MailComposeController *)controller {
-    if ([controller_ needsDelivery])
-        [NSThread detachNewThreadSelector:@selector(deliverMessage) toTarget:self withObject:nil];
-    else
-        [self cancel];
+- (void)dealloc {
+    [documentView release];
+    [super dealloc];
 }
 
-- (id) initWithView:(UIView *)view delegate:(id)delegate url:(NSURL *)url {
-    if ((self = [super initWithView:view delegate:delegate]) != nil) {
-        controller_ = [[MailComposeController alloc] initForContentSize:[overlay_ bounds].size];
-        [controller_ setDelegate:self];
-        [controller_ initializeUI];
-        [controller_ setupForURL:url];
-
-        UIView *view([controller_ view]);
-        [overlay_ addSubview:view];
-    } return self;
+- (void)layoutSubviews {
+    [super layoutSubviews];
+    if ([documentView respondsToSelector:@selector(setMinimumSize:)])
+        [documentView setMinimumSize:documentView.bounds.size];
 }
 
 @end
-/* }}} */
-#endif
 
 #define ShowInternals 0
 #define LogBrowser 1
 
 #define lprintf(args...) fprintf(stderr, args)
 
-@implementation BrowserView
+@implementation BrowserController
 
 #if ShowInternals
 #include "UICaboodle/UCInternal.h"
 #endif
 
 + (void) _initialize {
-    [WebView enableWebThread];
+    //[WebView enableWebThread];
 
     WebPreferences *preferences([WebPreferences standardPreferences]);
     [preferences setCacheModel:WebCacheModelDocumentBrowser];
@@ -237,11 +221,20 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 
     $GSSystemCopyCapability = reinterpret_cast<CFArrayRef (*)(CFStringRef)>(dlsym(RTLD_DEFAULT, "GSSystemCopyCapability"));
     $GSSystemGetCapability = reinterpret_cast<CFArrayRef (*)(CFStringRef)>(dlsym(RTLD_DEFAULT, "GSSystemGetCapability"));
+    $UIFormAssistant = objc_getClass("UIFormAssistant");
+
+    $UIWebBrowserView = objc_getClass("UIWebBrowserView");
+    if ($UIWebBrowserView == nil) {
+        Wildcat_ = false;
+        $UIWebBrowserView = objc_getClass("UIWebDocumentView");
+    } else {
+        Wildcat_ = true;
+    }
 }
 
 - (void) dealloc {
 #if LogBrowser
-    NSLog(@"[BrowserView dealloc]");
+    NSLog(@"[BrowserController dealloc]");
 #endif
 
     if (challenge_ != nil)
@@ -249,7 +242,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 
     WebThreadLock();
 
-    WebView *webview = [webview_ webView];
+    WebView *webview = [document_ webView];
     [webview setFrameLoadDelegate:nil];
     [webview setResourceLoadDelegate:nil];
     [webview setUIDelegate:nil];
@@ -265,10 +258,13 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     /* XXX: no one sets this, ever
     [webview setWebMailDelegate:nil];*/
 
-    [webview_ setDelegate:nil];
-    [webview_ setGestureDelegate:nil];
-    [webview_ setFormEditingDelegate:nil];
-    [webview_ setInteractionDelegate:nil];
+    [document_ setDelegate:nil];
+    [document_ setGestureDelegate:nil];
+
+    if ([document_ respondsToSelector:@selector(setFormEditingDelegate:)])
+        [document_ setFormEditingDelegate:nil];
+
+    [document_ setInteractionDelegate:nil];
 
     [indirect_ setDelegate:nil];
 
@@ -277,10 +273,10 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     [webview close];
 
 #if RecycleWebViews
-    [webview_ removeFromSuperview];
-    [Documents_ addObject:[webview_ autorelease]];
+    [document_ removeFromSuperview];
+    [Documents_ addObject:[document_ autorelease]];
 #else
-    [webview_ release];
+    [document_ release];
 #endif
 
     [indirect_ release];
@@ -310,6 +306,11 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         [sensitive_ release];
     if (title_ != nil)
         [title_ release];
+    if (reloaditem_ != nil)
+        [reloaditem_ release];
+    if (loadingitem_ != nil)
+        [loadingitem_ release];
+
     [super dealloc];
 }
 
@@ -317,7 +318,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     [self loadRequest:[NSURLRequest
         requestWithURL:url
         cachePolicy:policy
-        timeoutInterval:30.0
+        timeoutInterval:120.0
     ]];
 }
 
@@ -330,7 +331,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     error_ = false;
 
     WebThreadLock();
-    [webview_ loadRequest:request];
+    [document_ loadRequest:request];
     WebThreadUnlock();
 }
 
@@ -341,34 +342,34 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     if ([request_ HTTPBody] == nil && [request_ HTTPBodyStream] == nil)
         [self loadRequest:request_];
     else {
-        UIActionSheet *sheet = [[[UIActionSheet alloc]
+        UIAlertView *alert = [[[UIAlertView alloc]
             initWithTitle:UCLocalize("RESUBMIT_FORM")
-            buttons:[NSArray arrayWithObjects:UCLocalize("CANCEL"), UCLocalize("SUBMIT"), nil]
-            defaultButtonIndex:0
+            message:nil
             delegate:self
-            context:@"submit"
+            cancelButtonTitle:UCLocalize("CANCEL")
+            otherButtonTitles:UCLocalize("SUBMIT"), nil
         ] autorelease];
-
-        [sheet setNumberOfRows:1];
-        [sheet popupAlertAnimated:YES];
+        [alert setContext:@"submit"];
+        [alert show];
     }
 }
 
 - (WebView *) webView {
-    return [webview_ webView];
+    return [document_ webView];
 }
 
 - (UIWebDocumentView *) documentView {
-    return webview_;
+    return document_;
 }
 
 /* XXX: WebThreadLock? */
 - (void) _fixScroller:(CGRect)bounds {
     float extra;
-    if (!editing_)
+
+    if (!editing_ || $UIFormAssistant == nil)
         extra = 0;
     else {
-        UIFormAssistant *assistant([UIFormAssistant sharedFormAssistant]);
+        UIFormAssistant *assistant([$UIFormAssistant sharedFormAssistant]);
         CGRect peripheral([assistant peripheralFrame]);
 #if LogBrowser
         NSLog(@"per:%f", peripheral.size.height);
@@ -378,20 +379,22 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 
     CGRect subrect([scroller_ frame]);
     subrect.size.height -= extra;
-    [scroller_ setScrollerIndicatorSubrect:subrect];
 
-    NSSize visible(NSMakeSize(subrect.size.width, subrect.size.height));
-    [webview_ setValue:[NSValue valueWithSize:visible] forGestureAttribute:UIGestureAttributeVisibleSize];
+    if ([scroller_ respondsToSelector:@selector(setScrollerIndicatorSubrect:)])
+        [scroller_ setScrollerIndicatorSubrect:subrect];
+
+    [document_ setValue:[NSValue valueWithSize:CGSizeMake(subrect.size.width, subrect.size.height)] forGestureAttribute:UIGestureAttributeVisibleSize];
 
     CGSize size(size_);
     size.height += extra;
     [scroller_ setContentSize:size];
 
-    [scroller_ releaseRubberBandIfNecessary];
+    if ([scroller_ respondsToSelector:@selector(releaseRubberBandIfNecessary)])
+        [scroller_ releaseRubberBandIfNecessary];
 }
 
 - (void) fixScroller {
-    CGRect bounds([webview_ documentBounds]);
+    CGRect bounds([document_ documentBounds]);
 #if TrackResize
     NSLog(@"_fs:(%f,%f+%f,%f)", bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height);
 #endif
@@ -410,10 +413,10 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     [self view:sender didSetFrame:frame];
 }
 
-- (void) pushPage:(RVPage *)page {
+- (void) pushPage:(CYViewController *)page {
     [page setDelegate:delegate_];
-    [self setBackButtonTitle:title_];
-    [book_ pushPage:page];
+    [[self navigationItem] setTitle:title_];
+    [[self navigationController] pushViewController:page animated:YES];
 }
 
 - (void) _pushPage {
@@ -421,15 +424,14 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         return;
     // WTR: [self autorelease];
     pushed_ = true;
-    [book_ pushPage:self];
+    [[self navigationController] pushViewController:self animated:YES];
 }
 
-- (void) swapPage:(RVPage *)page {
+- (void) swapPage:(CYViewController *)page {
     [page setDelegate:delegate_];
-    if (pushed_)
-        [book_ swapPage:page];
-    else
-        [book_ pushPage:page];
+    if (pushed_) [[self navigationController] popViewControllerAnimated:NO];
+
+    [[self navigationController] pushViewController:page animated:NO];
 }
 
 - (BOOL) getSpecial:(NSURL *)url swap:(BOOL)swap {
@@ -437,7 +439,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     NSLog(@"getSpecial:%@", url);
 #endif
 
-    if (RVPage *page = [delegate_ pageForURL:url hasTag:NULL]) {
+    if (CYViewController *page = [delegate_ pageForURL:url hasTag:NULL]) {
         if (swap)
             [self swapPage:page];
         else
@@ -470,19 +472,19 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 - (void) _promptForSensitive:(NSMutableArray *)array {
     NSString *name([array objectAtIndex:0]);
 
-    UIActionSheet *sheet = [[[UIActionSheet alloc]
+    UIAlertView *alert = [[[UIAlertView alloc]
         initWithTitle:nil
-        buttons:[NSArray arrayWithObjects:UCLocalize("YES"), UCLocalize("NO"), nil]
-        defaultButtonIndex:0
+        message:nil
         delegate:indirect_
-        context:@"sensitive"
+        cancelButtonTitle:UCLocalize("NO")
+        otherButtonTitles:UCLocalize("YES"), nil
     ] autorelease];
 
     NSString *host(@"XXX");
 
-    [sheet setNumberOfRows:1];
-    [sheet setBodyText:[NSString stringWithFormat:@"The website at %@ is requesting your phone's %@. This is almost certainly for product licensing purposes. Will you allow this?", host, name]];
-    [sheet popupAlertAnimated:YES];
+    [alert setContext:@"sensitive"];
+    [alert setMessage:[NSString stringWithFormat:@"The website at %@ is requesting your phone's %@. This is almost certainly for product licensing purposes. Will you allow this?", host, name]];
+    [alert show];
 
     NSRunLoop *loop([NSRunLoop currentRunLoop]);
     NSDate *future([NSDate distantFuture]);
@@ -512,16 +514,15 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         return;
     [self retain];
 
-    UIActionSheet *sheet = [[[UIActionSheet alloc]
+    UIAlertView *alert = [[[UIAlertView alloc]
         initWithTitle:nil
-        buttons:[NSArray arrayWithObjects:UCLocalize("OK"), nil]
-        defaultButtonIndex:0
+        message:message
         delegate:self
-        context:@"alert"
+        cancelButtonTitle:UCLocalize("OK")
+        otherButtonTitles:nil
     ] autorelease];
-
-    [sheet setBodyText:message];
-    [sheet popupAlertAnimated:YES];
+    [alert setContext:@"alert"];
+    [alert show];
 }
 
 - (BOOL) webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
@@ -529,17 +530,16 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         return NO;
     [self retain];
 
-    UIActionSheet *sheet = [[[UIActionSheet alloc]
+    UIAlertView *alert = [[[UIAlertView alloc]
         initWithTitle:nil
-        buttons:[NSArray arrayWithObjects:UCLocalize("OK"), UCLocalize("CANCEL"), nil]
-        defaultButtonIndex:0
+        message:message
         delegate:indirect_
-        context:@"confirm"
+        cancelButtonTitle:UCLocalize("CANCEL")
+        otherButtonTitles:UCLocalize("OK"), nil
     ] autorelease];
 
-    [sheet setNumberOfRows:1];
-    [sheet setBodyText:message];
-    [sheet popupAlertAnimated:YES];
+    [alert setContext:@"confirm"];
+    [alert show];
 
     NSRunLoop *loop([NSRunLoop currentRunLoop]);
     NSDate *future([NSDate distantFuture]);
@@ -576,7 +576,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         [function_ autorelease];
     function_ = function == nil ? nil : [function retain];
 
-    [self reloadButtons];
+    [self applyRightButton];
 }
 
 - (void) setButtonTitle:(NSString *)button withStyle:(NSString *)style toFunction:(id)function {
@@ -592,7 +592,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         [function_ autorelease];
     function_ = function == nil ? nil : [function retain];
 
-    [self reloadButtons];
+    [self applyRightButton];
 }
 
 - (void) setFinishHook:(id)function {
@@ -608,12 +608,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 }
 
 - (void) _openMailToURL:(NSURL *)url {
-// XXX: this makes me sad
-#if 0
-    [[[MailToView alloc] initWithView:underlay_ delegate:self url:url] autorelease];
-#else
-    [UIApp openURL:url];// asPanel:YES];
-#endif
+    [[UIApplication sharedApplication] openURL:url];// asPanel:YES];
 }
 
 - (void) webView:(WebView *)sender willBeginEditingFormElement:(id)element {
@@ -630,11 +625,11 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 }
 
 - (void) webViewClose:(WebView *)sender {
-    [book_ close];
+    [self close];
 }
 
 - (void) close {
-    [book_ close];
+    [[self navigationController] dismissModalViewControllerAnimated:YES];
 }
 
 - (void) webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame {
@@ -664,25 +659,32 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
             if ([scheme isEqualToString:@"mailto"])
                 [self _openMailToURL:url];
             else {
-                RVBook *book([[[RVPopUpBook alloc] initWithFrame:[delegate_ popUpBounds]] autorelease]);
-                [book setHook:indirect_];
+                UCNavigationController *navigation([[[UCNavigationController alloc] init] autorelease]);
+                [navigation setHook:indirect_];
 
-                RVPage *page([delegate_ pageForURL:url hasTag:NULL]);
+                CYViewController *page([delegate_ pageForURL:url hasTag:NULL]);
                 if (page == nil) {
                     /* XXX: call createWebViewWithRequest instead? */
 
-                    [self setBackButtonTitle:title_];
-
-                    BrowserView *browser([[[class_ alloc] initWithBook:book] autorelease]);
+                    BrowserController *browser([[[class_ alloc] init] autorelease]);
                     [browser loadURL:url];
                     page = browser;
                 }
 
-                [book setDelegate:delegate_];
+                [navigation setDelegate:delegate_];
                 [page setDelegate:delegate_];
 
-                [book setPage:page];
-                [book_ pushBook:book];
+                [navigation setViewControllers:[NSArray arrayWithObject:page]];
+                UIBarButtonItem *closeItem = [[UIBarButtonItem alloc]
+                    initWithTitle:UCLocalize("CLOSE")
+                    style:UIBarButtonItemStylePlain
+                    target:page
+                    action:@selector(close)
+                ];
+                [[page navigationItem] setLeftBarButtonItem:closeItem];
+                [closeItem release];
+
+                [[self navigationController] presentModalViewController:navigation animated:YES];
             }
         } else goto unknown;
 
@@ -698,9 +700,9 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         // XXX: handle more mime types!
         [listener ignore];
 
-        WebView *webview([webview_ webView]);
+        WebView *webview([document_ webView]);
         if (frame == [webview mainFrame])
-            [UIApp openURL:[request URL]];
+            [[UIApplication sharedApplication] openURL:[request URL]];
     }
 }
 
@@ -725,7 +727,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 
         [listener use];
 
-        WebView *webview([webview_ webView]);
+        WebView *webview([document_ webView]);
         if (frame == [webview mainFrame])
             [self _pushPage];
         return;
@@ -753,7 +755,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     )) {
         url = open;
       open:
-        [UIApp openURL:url];
+        [[UIApplication sharedApplication] openURL:url];
         goto ignore;
     }
 
@@ -798,12 +800,12 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     //lprintf("Status:%s\n", [text UTF8String]);
 }
 
-- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
-    NSString *context([sheet context]);
+- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)button {
+    NSString *context([alert context]);
 
     if ([context isEqualToString:@"alert"]) {
         [self autorelease];
-        [sheet dismiss];
+        [alert dismissWithClickedButtonIndex:-1 animated:YES];
     } else if ([context isEqualToString:@"confirm"]) {
         switch (button) {
             case 1:
@@ -815,7 +817,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
             break;
         }
 
-        [sheet dismiss];
+        [alert dismissWithClickedButtonIndex:-1 animated:YES];
     } else if ([context isEqualToString:@"sensitive"]) {
         switch (button) {
             case 1:
@@ -827,14 +829,14 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
             break;
         }
 
-        [sheet dismiss];
+        [alert dismissWithClickedButtonIndex:-1 animated:YES];
     } else if ([context isEqualToString:@"challenge"]) {
         id<NSURLAuthenticationChallengeSender> sender([challenge_ sender]);
 
         switch (button) {
             case 1: {
-                NSString *username([[sheet textFieldAtIndex:0] text]);
-                NSString *password([[sheet textFieldAtIndex:1] text]);
+                NSString *username([[alert textFieldAtIndex:0] text]);
+                NSString *password([[alert textFieldAtIndex:1] text]);
 
                 NSURLCredential *credential([NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession]);
 
@@ -845,14 +847,13 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
                 [sender cancelAuthenticationChallenge:challenge_];
             break;
 
-            default:
-                _assert(false);
+            _nodefault
         }
 
         [challenge_ release];
         challenge_ = nil;
 
-        [sheet dismiss];
+        [alert dismissWithClickedButtonIndex:-1 animated:YES];
     } else if ([context isEqualToString:@"submit"]) {
         switch (button) {
             case 1:
@@ -861,16 +862,15 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
             case 2:
                 if (request_ != nil) {
                     WebThreadLock();
-                    [webview_ loadRequest:request_];
+                    [document_ loadRequest:request_];
                     WebThreadUnlock();
                 }
             break;
 
-            default:
-                _assert(false);
+            _nodefault
         }
 
-        [sheet dismiss];
+        [alert dismissWithClickedButtonIndex:-1 animated:YES];
     }
 }
 
@@ -882,20 +882,21 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     if (realm == nil)
         realm = @"";
 
-    UIActionSheet *sheet = [[[UIActionSheet alloc]
+    UIAlertView *alert = [[[UIAlertView alloc]
         initWithTitle:realm
-        buttons:[NSArray arrayWithObjects:UCLocalize("LOGIN"), UCLocalize("CANCEL"), nil]
-        defaultButtonIndex:0
+        message:nil
         delegate:self
-        context:@"challenge"
+        cancelButtonTitle:UCLocalize("CANCEL")
+        otherButtonTitles:UCLocalize("LOGIN"), nil
     ] autorelease];
 
-    [sheet setNumberOfRows:1];
+    [alert setContext:@"challenge"];
+    [alert setNumberOfRows:1];
 
-    [sheet addTextFieldWithValue:@"" label:UCLocalize("USERNAME")];
-    [sheet addTextFieldWithValue:@"" label:UCLocalize("PASSWORD")];
+    [alert addTextFieldWithValue:@"" label:UCLocalize("USERNAME")];
+    [alert addTextFieldWithValue:@"" label:UCLocalize("PASSWORD")];
 
-    UITextField *username([sheet textFieldAtIndex:0]); {
+    UITextField *username([alert textFieldAtIndex:0]); {
         UITextInputTraits *traits([username textInputTraits]);
         [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone];
         [traits setAutocorrectionType:UITextAutocorrectionTypeNo];
@@ -903,7 +904,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         [traits setReturnKeyType:UIReturnKeyNext];
     }
 
-    UITextField *password([sheet textFieldAtIndex:1]); {
+    UITextField *password([alert textFieldAtIndex:1]); {
         UITextInputTraits *traits([password textInputTraits]);
         [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone];
         [traits setAutocorrectionType:UITextAutocorrectionTypeNo];
@@ -913,7 +914,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         [traits setSecureTextEntry:YES];
     }
 
-    [sheet popupAlertAnimated:YES];
+    [alert show];
 }
 
 - (NSURLRequest *) webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)source {
@@ -930,25 +931,34 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     NSNumber *value([features objectForKey:@"width"]);
     float width(value == nil ? 0 : [value floatValue]);
 
-    RVBook *book(!popup_ ? book_ : [[[RVPopUpBook alloc] initWithFrame:[delegate_ popUpBounds]] autorelease]);
+    UCNavigationController *navigation(!popup_ ? [self navigationController] : [[[UCNavigationController alloc] init] autorelease]);
 
     /* XXX: deal with cydia:// pages */
-    BrowserView *browser([[[class_ alloc] initWithBook:book forWidth:width] autorelease]);
+    BrowserController *browser([[[class_ alloc] initWithWidth:width] autorelease]);
 
     if (features != nil && popup_) {
-        [book setDelegate:delegate_];
-        [book setHook:indirect_];
+        [navigation setDelegate:delegate_];
+        [navigation setHook:indirect_];
         [browser setDelegate:delegate_];
 
         [browser loadRequest:request];
 
-        [book setPage:browser];
-        [book_ pushBook:book];
-    } else if (request == nil) {
-        [self setBackButtonTitle:title_];
+        [navigation setViewControllers:[NSArray arrayWithObject:browser]];
+        UIBarButtonItem *closeItem = [[UIBarButtonItem alloc]
+            initWithTitle:UCLocalize("CLOSE")
+            style:UIBarButtonItemStylePlain
+            target:browser
+            action:@selector(close)
+        ];
+        [[browser navigationItem] setLeftBarButtonItem:closeItem];
+        [closeItem release];
+
+        [[self navigationController] presentModalViewController:navigation animated:YES];
+    } /*else if (request == nil) {
+        [[self navigationItem] setTitle:title_];
         [browser setDelegate:delegate_];
         [browser retain];
-    } else {
+    }*/ else {
         [self pushPage:browser];
         [browser loadRequest:request];
     }
@@ -966,7 +976,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         return;
 
     title_ = [title retain];
-    [book_ reloadTitleForPage:self];
+    [[self navigationItem] setTitle:title_];
 }
 
 - (void) webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame {
@@ -975,7 +985,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     [loading_ addObject:[NSValue valueWithNonretainedObject:frame]];
 
     if ([frame parentFrame] == nil) {
-        [webview_ resignFirstResponder];
+        [document_ resignFirstResponder];
 
         reloading_ = false;
 
@@ -1014,9 +1024,18 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
             special_ = nil;
         }
 
-        [book_ reloadTitleForPage:self];
+        [[self navigationItem] setTitle:title_];
 
-        [scroller_ scrollPointVisibleAtTopLeft:CGPointZero];
+        if (Wildcat_) {
+            CGRect webrect = [scroller_ bounds];
+            webrect.size.height = 1;
+            [document_ setFrame:webrect];
+        }
+
+        if ([scroller_ respondsToSelector:@selector(scrollPointVisibleAtTopLeft:)])
+            [scroller_ scrollPointVisibleAtTopLeft:CGPointZero];
+        else
+            [scroller_ scrollRectToVisible:CGRectZero animated:NO];
 
         if ([scroller_ respondsToSelector:@selector(setZoomScale:duration:)])
             [scroller_ setZoomScale:1 duration:0];
@@ -1025,12 +1044,59 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         /*else if ([scroller_ respondsToSelector:@selector(setZoomScale:animated:)])
             [scroller_ setZoomScale:1 animated:NO];*/
 
-        CGRect webrect = [scroller_ bounds];
-        webrect.size.height = 0;
-        [webview_ setFrame:webrect];
+        if (!Wildcat_) {
+            CGRect webrect = [scroller_ bounds];
+            webrect.size.height = 0;
+            [document_ setFrame:webrect];
+        }
+    }
+
+    [self _startLoading];
+}
+
+- (UIBarButtonItemStyle) rightButtonStyle {
+    if (style_ == nil) normal:
+        return UIBarButtonItemStylePlain;
+    else if ([style_ isEqualToString:@"Normal"])
+        return UIBarButtonItemStylePlain;
+    else if ([style_ isEqualToString:@"Highlighted"])
+        return UIBarButtonItemStyleDone;
+    else goto normal;
+}
+
+- (UIBarButtonItem *) customButton {
+    UIBarButtonItem *customItem = [[UIBarButtonItem alloc]
+        initWithTitle:button_
+        style:[self rightButtonStyle]
+        target:self
+        action:@selector(customButtonClicked)
+    ];
+
+    return [customItem autorelease];
+}
+
+- (UIBarButtonItem *) rightButton {
+    return reloaditem_;
+}
+
+- (void) applyLoadingTitle {
+    [[self navigationItem] setTitle:UCLocalize("LOADING")];
+}
+
+- (void) applyRightButton {
+    if ([self isLoading]) {
+        [[self navigationItem] setRightBarButtonItem:loadingitem_ animated:YES];
+        [[loadingitem_ view] addSubview:indicator_];
+        [self applyLoadingTitle];
+    } else if (button_) {
+        [[self navigationItem] setRightBarButtonItem:[self customButton] animated:YES];
+    } else {
+        [[self navigationItem] setRightBarButtonItem:[self rightButton] animated:YES];
     }
+}
 
-    [self reloadButtons];
+- (void) _startLoading {
+    [self applyRightButton];
 }
 
 - (void) _finishLoading {
@@ -1041,40 +1107,34 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         return;
     if (finish_ != nil)
         [self callFunction:finish_];
-    [self reloadButtons];
+
+    [self applyRightButton];
+    if (![self isLoading]) [[self navigationItem] setTitle:title_];
 }
 
 - (bool) isLoading {
     return [loading_ count] != 0;
 }
 
-- (void) reloadButtons {
-    if ([self isLoading])
-        [indicator_ startAnimation];
-    else
-        [indicator_ stopAnimation];
-    [super reloadButtons];
-}
-
 - (BOOL) webView:(WebView *)sender shouldScrollToPoint:(struct CGPoint)point forFrame:(WebFrame *)frame {
-    return [webview_ webView:sender shouldScrollToPoint:point forFrame:frame];
+    return [document_ webView:sender shouldScrollToPoint:point forFrame:frame];
 }
 
 - (void) webView:(WebView *)sender didReceiveViewportArguments:(id)arguments forFrame:(WebFrame *)frame {
-    return [webview_ webView:sender didReceiveViewportArguments:arguments forFrame:frame];
+    return [document_ webView:sender didReceiveViewportArguments:arguments forFrame:frame];
 }
 
 - (void) webView:(WebView *)sender needsScrollNotifications:(id)notifications forFrame:(WebFrame *)frame {
-    return [webview_ webView:sender needsScrollNotifications:notifications forFrame:frame];
+    return [document_ webView:sender needsScrollNotifications:notifications forFrame:frame];
 }
 
 - (void) webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame {
     [self _pushPage];
-    return [webview_ webView:sender didCommitLoadForFrame:frame];
+    return [document_ webView:sender didCommitLoadForFrame:frame];
 }
 
 - (void) webView:(WebView *)sender didReceiveDocTypeForFrame:(WebFrame *)frame {
-    return [webview_ webView:sender didReceiveDocTypeForFrame:frame];
+    return [document_ webView:sender didReceiveDocTypeForFrame:frame];
 }
 
 - (void) webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
@@ -1123,7 +1183,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
                 }
     }
 
-    return [webview_ webView:sender didFinishLoadForFrame:frame];
+    return [document_ webView:sender didFinishLoadForFrame:frame];
 }
 
 - (void) _didFailWithError:(NSError *)error forFrame:(WebFrame *)frame {
@@ -1149,6 +1209,8 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 
 - (void) webView:(WebView *)sender didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame {
     [self _didFailWithError:error forFrame:frame];
+    if ([document_ respondsToSelector:@selector(webView:didFailLoadWithError:forFrame:)])
+        [document_ webView:sender didFailLoadWithError:error forFrame:frame];
 }
 
 - (void) webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame {
@@ -1161,18 +1223,100 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 #endif
 }
 
+- (void) webView:(WebView *)sender didReceiveMessage:(NSDictionary *)dictionary {
+#if LogBrowser || ForSaurik
+    lprintf("Console:%s\n", [[dictionary description] UTF8String]);
+#endif
+    if ([document_ respondsToSelector:@selector(webView:didReceiveMessage:)])
+        [document_ webView:sender didReceiveMessage:dictionary];
+}
+
+- (void) webView:(id)sender willCloseFrame:(id)frame {
+    if ([document_ respondsToSelector:@selector(webView:willCloseFrame:)])
+        [document_ webView:sender willCloseFrame:frame];
+}
+
+- (void) webView:(id)sender didFinishDocumentLoadForFrame:(id)frame {
+    if ([document_ respondsToSelector:@selector(webView:didFinishDocumentLoadForFrame:)])
+        [document_ webView:sender didFinishDocumentLoadForFrame:frame];
+}
+
+- (void) webView:(id)sender didFirstLayoutInFrame:(id)frame {
+    if ([document_ respondsToSelector:@selector(webView:didFirstLayoutInFrame:)])
+        [document_ webView:sender didFirstLayoutInFrame:frame];
+}
+
+- (void) webViewFormEditedStatusHasChanged:(id)changed {
+    if ([document_ respondsToSelector:@selector(webViewFormEditedStatusHasChanged:)])
+        [document_ webViewFormEditedStatusHasChanged:changed];
+}
+
+- (void) webView:(id)sender formStateDidFocusNode:(id)formState {
+    if ([document_ respondsToSelector:@selector(webView:formStateDidFocusNode:)])
+        [document_ webView:sender formStateDidFocusNode:formState];
+}
+
+- (void) webView:(id)sender formStateDidBlurNode:(id)formState {
+    if ([document_ respondsToSelector:@selector(webView:formStateDidBlurNode:)])
+        [document_ webView:sender formStateDidBlurNode:formState];
+}
+
 /* XXX: fix this stupid include file
 - (void) webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(WebSecurityOrigin *)origin database:(NSString *)database {
     [origin setQuota:0x500000];
 }*/
 
+- (void) webViewDidLayout:(id)sender {
+    [document_ webViewDidLayout:sender];
+}
+
+- (void) webView:(id)sender didFirstVisuallyNonEmptyLayoutInFrame:(id)frame {
+    [document_ webView:sender didFirstVisuallyNonEmptyLayoutInFrame:frame];
+}
+
+- (void) webView:(id)sender saveStateToHistoryItem:(id)item forFrame:(id)frame {
+    [document_ webView:sender saveStateToHistoryItem:item forFrame:frame];
+}
+
+- (void) webView:(id)sender restoreStateFromHistoryItem:(id)item forFrame:(id)frame force:(BOOL)force {
+    [document_ webView:sender restoreStateFromHistoryItem:item forFrame:frame force:force];
+}
+
+- (void) webView:(id)sender attachRootLayer:(id)layer {
+    [document_ webView:sender attachRootLayer:layer];
+}
+
+- (id) webView:(id)sender plugInViewWithArguments:(id)arguments fromPlugInPackage:(id)package {
+    return [document_ webView:sender plugInViewWithArguments:arguments fromPlugInPackage:package];
+}
+
+- (void) webView:(id)sender willShowFullScreenForPlugInView:(id)view {
+    [document_ webView:sender willShowFullScreenForPlugInView:view];
+}
+
+- (void) webView:(id)sender didHideFullScreenForPlugInView:(id)view {
+    [document_ webView:sender didHideFullScreenForPlugInView:view];
+}
+
+- (void) webView:(id)sender willAddPlugInView:(id)view {
+    [document_ webView:sender willAddPlugInView:view];
+}
+
+- (void) webView:(id)sender didObserveDeferredContentChange:(int)change forFrame:(id)frame {
+    [document_ webView:sender didObserveDeferredContentChange:change forFrame:frame];
+}
+
+- (void) webViewDidPreventDefaultForEvent:(id)sender {
+    [document_ webViewDidPreventDefaultForEvent:sender];
+}
+
 - (void) _setTileDrawingEnabled:(BOOL)enabled {
-    //[webview_ setTileDrawingEnabled:enabled];
+    //[document_ setTileDrawingEnabled:enabled];
 }
 
 - (void) setViewportWidth:(float)width {
     width_ = width != 0 ? width : [[self class] defaultWidth];
-    [webview_ setViewportSize:CGSizeMake(width_, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x10];
+    [document_ setViewportSize:CGSizeMake(width_, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x10];
 }
 
 - (void) willStartGesturesInView:(UIView *)view forEvent:(GSEventRef)event {
@@ -1181,7 +1325,7 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 
 - (void) didFinishGesturesInView:(UIView *)view forEvent:(GSEventRef)event {
     [self _setTileDrawingEnabled:YES];
-    [webview_ redrawScaledDocument];
+    [document_ redrawScaledDocument];
 }
 
 - (void) scrollerWillStartDragging:(UIScroller *)scroller {
@@ -1196,34 +1340,53 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     [self _setTileDrawingEnabled:YES];
 }
 
-- (id) initWithBook:(RVBook *)book forWidth:(float)width ofClass:(Class)_class {
-    if ((self = [super initWithBook:book]) != nil) {
+- (id) initWithWidth:(float)width ofClass:(Class)_class {
+    if ((self = [super init]) != nil) {
         class_ = _class;
         loading_ = [[NSMutableSet alloc] initWithCapacity:3];
         popup_ = false;
 
-        struct CGRect bounds = [self bounds];
+        BrowserView *actualView = [[BrowserView alloc] initWithFrame:CGRectZero];
+        [self setView:actualView];
+
+        struct CGRect bounds = [[self view] bounds];
 
-        scroller_ = [[UIScroller alloc] initWithFrame:bounds];
-        [self addSubview:scroller_];
+        scroller_ = [[objc_getClass(Wildcat_ ? "UIScrollView" : "UIScroller") alloc] initWithFrame:bounds];
+        [[self view] addSubview:scroller_];
 
         [scroller_ setFixedBackgroundPattern:YES];
         [scroller_ setBackgroundColor:[UIColor pinStripeColor]];
 
         [scroller_ setScrollingEnabled:YES];
         [scroller_ setClipsSubviews:YES];
-        [scroller_ setAllowsRubberBanding:YES];
+
+        if (!Wildcat_)
+            [scroller_ setAllowsRubberBanding:YES];
 
         [scroller_ setDelegate:self];
         [scroller_ setBounces:YES];
-        [scroller_ setScrollHysteresis:8];
-        [scroller_ setThumbDetectionEnabled:NO];
-        [scroller_ setDirectionalScrolling:YES];
-        [scroller_ setScrollDecelerationFactor:0.99]; /* 0.989324 */
-        [scroller_ setEventMode:YES];
+
+        if (!Wildcat_) {
+            [scroller_ setScrollHysteresis:8];
+            [scroller_ setThumbDetectionEnabled:NO];
+            [scroller_ setDirectionalScrolling:YES];
+            //[scroller_ setScrollDecelerationFactor:0.99]; /* 0.989324 */
+            [scroller_ setEventMode:YES];
+        }
+
+        if (Wildcat_) {
+            UIScrollView *scroller((UIScrollView *)scroller_);
+            //[scroller setDirectionalLockEnabled:NO];
+            [scroller setDelaysContentTouches:NO];
+            //[scroller setScrollsToTop:NO];
+            //[scroller setCanCancelContentTouches:NO];
+        }
+
         [scroller_ setShowBackgroundShadow:NO]; /* YES */
-        [scroller_ setAllowsRubberBanding:YES]; /* Vertical */
-        [scroller_ setAdjustForContentSizeChange:YES]; /* NO */
+        //[scroller_ setAllowsRubberBanding:YES]; /* Vertical */
+
+        if (!Wildcat_)
+            [scroller_ setAdjustForContentSizeChange:YES]; /* NO */
 
         CGRect webrect = [scroller_ bounds];
         webrect.size.height = 0;
@@ -1233,68 +1396,67 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         WebThreadLock();
 
 #if RecycleWebViews
-        webview_ = [Documents_ lastObject];
-        if (webview_ != nil) {
-            webview_ = [webview_ retain];
-            webview = [webview_ webView];
+        document_ = [Documents_ lastObject];
+        if (document_ != nil) {
+            document_ = [document_ retain];
+            webview = [document_ webView];
             [Documents_ removeLastObject];
-            [webview_ setFrame:webrect];
+            [document_ setFrame:webrect];
         } else {
 #else
         if (true) {
 #endif
-            webview_ = [[UIWebDocumentView alloc] initWithFrame:webrect];
-            webview = [webview_ webView];
+            document_ = [[$UIWebBrowserView alloc] initWithFrame:webrect];
+            webview = [document_ webView];
 
             // XXX: this is terribly (too?) expensive
-            //[webview_ setDrawsBackground:NO];
+            //[document_ setDrawsBackground:NO];
             [webview setPreferencesIdentifier:@"Cydia"];
 
-            [webview_ setTileSize:CGSizeMake(webrect.size.width, 500)];
-
-            if ([webview_ respondsToSelector:@selector(enableReachability)])
-                [webview_ enableReachability];
+            [document_ setTileSize:CGSizeMake(webrect.size.width, 500)];
 
-            [webview_ setAllowsMessaging:YES];
+            if ([document_ respondsToSelector:@selector(enableReachability)])
+                [document_ enableReachability];
+            if ([document_ respondsToSelector:@selector(setAllowsMessaging:)])
+                [document_ setAllowsMessaging:YES];
+            if ([document_ respondsToSelector:@selector(useSelectionAssistantWithMode:)])
+                [document_ useSelectionAssistantWithMode:0];
 
-            if ([webview_ respondsToSelector:@selector(useSelectionAssistantWithMode:)])
-                [webview_ useSelectionAssistantWithMode:0];
+            [document_ setTilingEnabled:YES];
+            [document_ setDrawsGrid:NO];
+            [document_ setLogsTilingChanges:NO];
+            [document_ setTileMinificationFilter:kCAFilterNearest];
 
-            [webview_ setTilingEnabled:YES];
-            [webview_ setDrawsGrid:NO];
-            [webview_ setLogsTilingChanges:NO];
-            [webview_ setTileMinificationFilter:kCAFilterNearest];
-
-            if ([webview_ respondsToSelector:@selector(setDataDetectorTypes:)])
+            if ([document_ respondsToSelector:@selector(setDataDetectorTypes:)])
                 /* XXX: abstractify */
-                [webview_ setDataDetectorTypes:0x80000000];
+                [document_ setDataDetectorTypes:0x80000000];
             else
-                [webview_ setDetectsPhoneNumbers:NO];
+                [document_ setDetectsPhoneNumbers:NO];
 
-            [webview_ setAutoresizes:YES];
+            [document_ setAutoresizes:YES];
 
-            [webview_ setMinimumScale:0.25f forDocumentTypes:0x10];
-            [webview_ setMaximumScale:5.00f forDocumentTypes:0x10];
-            [webview_ setInitialScale:UIWebViewScalesToFitScale forDocumentTypes:0x10];
-            //[webview_ setViewportSize:CGSizeMake(980, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x10];
+            [document_ setMinimumScale:0.25f forDocumentTypes:0x10];
+            [document_ setMaximumScale:5.00f forDocumentTypes:0x10];
+            [document_ setInitialScale:UIWebViewScalesToFitScale forDocumentTypes:0x10];
+            //[document_ setViewportSize:CGSizeMake(980, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x10];
 
-            [webview_ setViewportSize:CGSizeMake(320, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x2];
+            [document_ setViewportSize:CGSizeMake(320, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x2];
 
-            [webview_ setMinimumScale:1.00f forDocumentTypes:0x8];
-            [webview_ setInitialScale:UIWebViewScalesToFitScale forDocumentTypes:0x8];
-            [webview_ setViewportSize:CGSizeMake(320, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x8];
+            [document_ setMinimumScale:1.00f forDocumentTypes:0x8];
+            [document_ setInitialScale:UIWebViewScalesToFitScale forDocumentTypes:0x8];
+            [document_ setViewportSize:CGSizeMake(320, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x8];
 
-            [webview_ _setDocumentType:0x4];
+            [document_ _setDocumentType:0x4];
 
-            if ([webview_ respondsToSelector:@selector(UIWebDocumentView:)])
-                [webview_ setZoomsFocusedFormControl:YES];
-            [webview_ setContentsPosition:7];
-            [webview_ setEnabledGestures:0xa];
-            [webview_ setValue:[NSNumber numberWithBool:YES] forGestureAttribute:UIGestureAttributeIsZoomRubberBandEnabled];
-            [webview_ setValue:[NSNumber numberWithBool:YES] forGestureAttribute:UIGestureAttributeUpdatesScroller];
+            if ([document_ respondsToSelector:@selector(setZoomsFocusedFormControl:)])
+                [document_ setZoomsFocusedFormControl:YES];
+            [document_ setContentsPosition:7];
+            [document_ setEnabledGestures:0xa];
+            [document_ setValue:[NSNumber numberWithBool:YES] forGestureAttribute:UIGestureAttributeIsZoomRubberBandEnabled];
+            [document_ setValue:[NSNumber numberWithBool:YES] forGestureAttribute:UIGestureAttributeUpdatesScroller];
 
-            [webview_ setSmoothsFonts:YES];
-            [webview_ setAllowsImageSheet:YES];
+            [document_ setSmoothsFonts:YES];
+            [document_ setAllowsImageSheet:YES];
             [webview _setUsesLoaderCache:YES];
 
             [webview setGroupName:@"CydiaGroup"];
@@ -1307,14 +1469,20 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
                 [preferences _setLayoutInterval:0];
         }
 
+        actualView.documentView = document_;
+        [actualView release];
+
         [self setViewportWidth:width];
 
-        [webview_ setDelegate:self];
-        [webview_ setGestureDelegate:self];
-        [webview_ setFormEditingDelegate:self];
-        [webview_ setInteractionDelegate:self];
+        [document_ setDelegate:self];
+        [document_ setGestureDelegate:self];
+
+        if ([document_ respondsToSelector:@selector(setFormEditingDelegate:)])
+            [document_ setFormEditingDelegate:self];
 
-        [scroller_ addSubview:webview_];
+        [document_ setInteractionDelegate:self];
+
+        [scroller_ addSubview:document_];
 
         //NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
 
@@ -1331,29 +1499,46 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
         WebThreadUnlock();
 
         CGSize indsize = [UIProgressIndicator defaultSizeForStyle:UIProgressIndicatorStyleMediumWhite];
-        indicator_ = [[UIProgressIndicator alloc] initWithFrame:CGRectMake(281, 12, indsize.width, indsize.height)];
+        indicator_ = [[UIProgressIndicator alloc] initWithFrame:CGRectMake(15, 5, indsize.width, indsize.height)];
         [indicator_ setStyle:UIProgressIndicatorStyleMediumWhite];
+        [indicator_ startAnimation];
 
-        [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
-        [scroller_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
-
-        /*UIWebView *test([[[UIWebView alloc] initWithFrame:[self bounds]] autorelease]);
+        reloaditem_ = [[UIBarButtonItem alloc]
+            initWithTitle:UCLocalize("RELOAD")
+            style:[self rightButtonStyle]
+            target:self
+            action:@selector(reloadButtonClicked)
+        ];
+
+        loadingitem_ = [[UIBarButtonItem alloc]
+            initWithTitle:@" "
+            style:UIBarButtonItemStylePlain
+            target:self
+            action:@selector(reloadButtonClicked)
+        ];
+        [[loadingitem_ view] addSubview:indicator_];
+
+        [scroller_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+        [indicator_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
+        [document_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
+
+        /*UIWebView *test([[[UIWebView alloc] initWithFrame:[[self view] bounds]] autorelease]);
         [test loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.saurik.com/"]]];
-        [self addSubview:test];*/
+        [[self view] addSubview:test];*/
     } return self;
 }
 
-- (id) initWithBook:(RVBook *)book forWidth:(float)width {
-    return [self initWithBook:book forWidth:width ofClass:[self class]];
+- (id) initWithWidth:(float)width {
+    return [self initWithWidth:width ofClass:[self class]];
 }
 
-- (id) initWithBook:(RVBook *)book {
-    return [self initWithBook:book forWidth:0];
+- (id) init {
+    return [self initWithWidth:0];
 }
 
 - (NSString *) stringByEvaluatingJavaScriptFromString:(NSString *)script {
     WebThreadLock();
-    WebView *webview([webview_ webView]);
+    WebView *webview([document_ webView]);
     NSString *string([webview stringByEvaluatingJavaScriptFromString:script]);
     WebThreadUnlock();
     return string;
@@ -1362,10 +1547,14 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
 - (void) callFunction:(WebScriptObject *)function {
     WebThreadLock();
 
-    WebView *webview([webview_ webView]);
+    WebView *webview([document_ webView]);
     WebFrame *frame([webview mainFrame]);
+    WebPreferences *preferences([webview preferences]);
+
+    bool maybe([preferences javaScriptCanOpenWindowsAutomatically]);
+    [preferences setJavaScriptCanOpenWindowsAutomatically:NO];
 
-    id _private(MSHookIvar<id>(webview, "_private"));
+    /*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());
 
@@ -1375,9 +1564,9 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     else {
         no = settings->JavaScriptCanOpenWindowsAutomatically();
         settings->setJavaScriptCanOpenWindowsAutomatically(true);
-    }
+    }*/
 
-    if (UIWindow *window = [self window])
+    if (UIWindow *window = [[self view] window])
         if (UIResponder *responder = [window firstResponder])
             [responder resignFirstResponder];
 
@@ -1385,66 +1574,42 @@ UIActionSheet *mailAlertSheet = [[UIActionSheet alloc] initWithTitle:UCLocalize(
     JSGlobalContextRef context([frame globalContext]);
     JSObjectCallAsFunction(context, object, NULL, 0, NULL, NULL);
 
-    if (settings != NULL)
-        settings->setJavaScriptCanOpenWindowsAutomatically(no);
+    /*if (settings != NULL)
+        settings->setJavaScriptCanOpenWindowsAutomatically(no);*/
+
+    [preferences setJavaScriptCanOpenWindowsAutomatically:maybe];
 
     WebThreadUnlock();
 }
 
-- (void) didCloseBook:(RVBook *)book {
+- (void) didDismissModalViewController {
     if (closer_ != nil)
         [self callFunction:closer_];
 }
 
-- (void) __rightButtonClicked {
+- (void) reloadButtonClicked {
     reloading_ = true;
     [self reloadURL];
 }
 
-- (void) _rightButtonClicked {
+- (void) _customButtonClicked {
+    [self reloadButtonClicked];
+}
+
+- (void) customButtonClicked {
 #if !AlwaysReload
     if (function_ != nil)
         [self callFunction:function_];
     else
 #endif
-        [self __rightButtonClicked];
-}
-
-- (id) _rightButtonTitle {
-    return UCLocalize("RELOAD");
-}
-
-- (id) rightButtonTitle {
-    return [self isLoading] ? @"" : button_ != nil ? button_ : [self _rightButtonTitle];
-}
-
-- (UINavigationButtonStyle) rightButtonStyle {
-    if (style_ == nil) normal:
-        return UINavigationButtonStyleNormal;
-    else if ([style_ isEqualToString:@"Normal"])
-        return UINavigationButtonStyleNormal;
-    else if ([style_ isEqualToString:@"Back"])
-        return UINavigationButtonStyleBack;
-    else if ([style_ isEqualToString:@"Highlighted"])
-        return UINavigationButtonStyleHighlighted;
-    else if ([style_ isEqualToString:@"Destructive"])
-        return UINavigationButtonStyleDestructive;
-    else goto normal;
-}
-
-- (NSString *) title {
-    return title_ == nil ? UCLocalize("LOADING") : title_;
-}
-
-- (NSString *) backButtonTitle {
-    return UCLocalize("BROWSER");
+    [self _customButtonClicked];
 }
 
 - (void) setPageActive:(BOOL)active {
     if (!active)
         [indicator_ removeFromSuperview];
     else
-        [[book_ navigationBar] addSubview:indicator_];
+        [[[[self navigationItem] rightBarButtonItem] view] addSubview:indicator_];
 }
 
 - (void) resetViewAnimated:(BOOL)animated {