X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/766b71dd4f1e125f68905d928c6735f2346cb5ea..881fe77f403bc1e66c1a0e1e5ed0bddb1cf4a816:/UICaboodle/BrowserView.mm diff --git a/UICaboodle/BrowserView.mm b/UICaboodle/BrowserView.mm index 7c123f97..793678ef 100644 --- a/UICaboodle/BrowserView.mm +++ b/UICaboodle/BrowserView.mm @@ -1,12 +1,28 @@ +#include +#include "iPhonePrivate.h" + +#include "UCPlatform.h" + #include #include -#import +//#include // XXX: fix the minimum requirement extern NSString * const kCAFilterNearest; #include -#include + +#include +#include + +#include +#include +#include +#include +#include + +//#include +//#include #include "substrate.h" @@ -19,12 +35,10 @@ static CFArrayRef (*$GSSystemGetCapability)(CFStringRef); static Class $UIFormAssistant; static Class $UIWebBrowserView; -@interface NSString (UIKit) -- (NSString *) stringByAddingPercentEscapes; -@end - /* Indirect Delegate {{{ */ -@interface IndirectDelegate : NSObject { +@interface IndirectDelegate : NSObject < + HookProtocol +> { _transient volatile id delegate_; } @@ -89,6 +103,11 @@ static Class $UIWebBrowserView; return nil; } +- (void) didDismissModalViewController { + if (delegate_ != nil) + return [delegate_ didDismissModalViewController]; +} + - (IMP) methodForSelector:(SEL)sel { if (IMP method = [super methodForSelector:sel]) return method; @@ -125,11 +144,19 @@ static Class $UIWebBrowserView; /* }}} */ @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) @@ -283,7 +310,7 @@ static Class $UIWebBrowserView; [reloaditem_ release]; if (loadingitem_ != nil) [loadingitem_ release]; - + [super dealloc]; } @@ -315,18 +342,15 @@ static Class $UIWebBrowserView; 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 setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; - - [sheet setNumberOfRows:1]; - [sheet popupAlertAnimated:YES]; + [alert setContext:@"submit"]; + [alert show]; } } @@ -340,7 +364,7 @@ static Class $UIWebBrowserView; /* XXX: WebThreadLock? */ - (void) _fixScroller:(CGRect)bounds { - float extra; + float extra; if (!editing_ || $UIFormAssistant == nil) extra = 0; @@ -359,7 +383,7 @@ static Class $UIWebBrowserView; if ([scroller_ respondsToSelector:@selector(setScrollerIndicatorSubrect:)]) [scroller_ setScrollerIndicatorSubrect:subrect]; - [document_ setValue:[NSValue valueWithSize:NSMakeSize(subrect.size.width, subrect.size.height)] forGestureAttribute:UIGestureAttributeVisibleSize]; + [document_ setValue:[NSValue valueWithSize:CGSizeMake(subrect.size.width, subrect.size.height)] forGestureAttribute:UIGestureAttributeVisibleSize]; CGSize size(size_); size.height += extra; @@ -389,7 +413,7 @@ static Class $UIWebBrowserView; [self view:sender didSetFrame:frame]; } -- (void) pushPage:(UCViewController *)page { +- (void) pushPage:(CYViewController *)page { [page setDelegate:delegate_]; [[self navigationItem] setTitle:title_]; [[self navigationController] pushViewController:page animated:YES]; @@ -403,11 +427,11 @@ static Class $UIWebBrowserView; [[self navigationController] pushViewController:self animated:YES]; } -- (void) swapPage:(UCViewController *)page { +- (void) swapPage:(CYViewController *)page { [page setDelegate:delegate_]; if (pushed_) [[self navigationController] popViewControllerAnimated:NO]; - - [[self navigationController] pushViewController:page animated:NO]; + + [[self navigationController] pushViewController:page animated:NO]; } - (BOOL) getSpecial:(NSURL *)url swap:(BOOL)swap { @@ -415,7 +439,7 @@ static Class $UIWebBrowserView; NSLog(@"getSpecial:%@", url); #endif - if (UCViewController *page = [delegate_ pageForURL:url hasTag:NULL]) { + if (CYViewController *page = [delegate_ pageForURL:url hasTag:NULL]) { if (swap) [self swapPage:page]; else @@ -448,21 +472,19 @@ static Class $UIWebBrowserView; - (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]; - [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; - 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]); @@ -492,18 +514,15 @@ static Class $UIWebBrowserView; 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 setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; - - [sheet setBodyText:message]; - [sheet popupAlertAnimated:YES]; + [alert setContext:@"alert"]; + [alert show]; } - (BOOL) webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { @@ -511,19 +530,16 @@ static Class $UIWebBrowserView; 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 setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; - - [sheet setNumberOfRows:1]; - [sheet setBodyText:message]; - [sheet popupAlertAnimated:YES]; + [alert setContext:@"confirm"]; + [alert show]; NSRunLoop *loop([NSRunLoop currentRunLoop]); NSDate *future([NSDate distantFuture]); @@ -560,7 +576,7 @@ static Class $UIWebBrowserView; [function_ autorelease]; function_ = function == nil ? nil : [function retain]; - [self applyRightButton]; + [self applyRightButton]; } - (void) setButtonTitle:(NSString *)button withStyle:(NSString *)style toFunction:(id)function { @@ -576,7 +592,7 @@ static Class $UIWebBrowserView; [function_ autorelease]; function_ = function == nil ? nil : [function retain]; - [self applyRightButton]; + [self applyRightButton]; } - (void) setFinishHook:(id)function { @@ -592,7 +608,7 @@ static Class $UIWebBrowserView; } - (void) _openMailToURL:(NSURL *)url { - [UIApp openURL:url];// asPanel:YES]; + [[UIApplication sharedApplication] openURL:url];// asPanel:YES]; } - (void) webView:(WebView *)sender willBeginEditingFormElement:(id)element { @@ -609,7 +625,7 @@ static Class $UIWebBrowserView; } - (void) webViewClose:(WebView *)sender { - [self close]; + [self close]; } - (void) close { @@ -646,7 +662,7 @@ static Class $UIWebBrowserView; UCNavigationController *navigation([[[UCNavigationController alloc] init] autorelease]); [navigation setHook:indirect_]; - UCViewController *page([delegate_ pageForURL:url hasTag:NULL]); + CYViewController *page([delegate_ pageForURL:url hasTag:NULL]); if (page == nil) { /* XXX: call createWebViewWithRequest instead? */ @@ -659,15 +675,15 @@ static Class $UIWebBrowserView; [page setDelegate:delegate_]; [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]; - + 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; @@ -686,7 +702,7 @@ static Class $UIWebBrowserView; WebView *webview([document_ webView]); if (frame == [webview mainFrame]) - [UIApp openURL:[request URL]]; + [[UIApplication sharedApplication] openURL:[request URL]]; } } @@ -739,7 +755,7 @@ static Class $UIWebBrowserView; )) { url = open; open: - [UIApp openURL:url]; + [[UIApplication sharedApplication] openURL:url]; goto ignore; } @@ -784,12 +800,12 @@ static Class $UIWebBrowserView; //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: @@ -801,7 +817,7 @@ static Class $UIWebBrowserView; break; } - [sheet dismiss]; + [alert dismissWithClickedButtonIndex:-1 animated:YES]; } else if ([context isEqualToString:@"sensitive"]) { switch (button) { case 1: @@ -813,14 +829,14 @@ static Class $UIWebBrowserView; break; } - [sheet dismiss]; + [alert dismissWithClickedButtonIndex:-1 animated:YES]; } else if ([context isEqualToString:@"challenge"]) { id 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]); @@ -837,7 +853,7 @@ static Class $UIWebBrowserView; [challenge_ release]; challenge_ = nil; - [sheet dismiss]; + [alert dismissWithClickedButtonIndex:-1 animated:YES]; } else if ([context isEqualToString:@"submit"]) { switch (button) { case 1: @@ -854,7 +870,7 @@ static Class $UIWebBrowserView; _nodefault } - [sheet dismiss]; + [alert dismissWithClickedButtonIndex:-1 animated:YES]; } } @@ -866,22 +882,21 @@ static Class $UIWebBrowserView; 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 setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; + [alert setContext:@"challenge"]; + [alert setNumberOfRows:1]; - [sheet setNumberOfRows:1]; + [alert addTextFieldWithValue:@"" label:UCLocalize("USERNAME")]; + [alert addTextFieldWithValue:@"" label:UCLocalize("PASSWORD")]; - [sheet addTextFieldWithValue:@"" label:UCLocalize("USERNAME")]; - [sheet addTextFieldWithValue:@"" label:UCLocalize("PASSWORD")]; - - UITextField *username([sheet textFieldAtIndex:0]); { + UITextField *username([alert textFieldAtIndex:0]); { UITextInputTraits *traits([username textInputTraits]); [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone]; [traits setAutocorrectionType:UITextAutocorrectionTypeNo]; @@ -889,7 +904,7 @@ static Class $UIWebBrowserView; [traits setReturnKeyType:UIReturnKeyNext]; } - UITextField *password([sheet textFieldAtIndex:1]); { + UITextField *password([alert textFieldAtIndex:1]); { UITextInputTraits *traits([password textInputTraits]); [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone]; [traits setAutocorrectionType:UITextAutocorrectionTypeNo]; @@ -899,7 +914,7 @@ static Class $UIWebBrowserView; [traits setSecureTextEntry:YES]; } - [sheet popupAlertAnimated:YES]; + [alert show]; } - (NSURLRequest *) webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)source { @@ -929,15 +944,15 @@ static Class $UIWebBrowserView; [browser loadRequest:request]; [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]; - + 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_]; @@ -1036,48 +1051,48 @@ static Class $UIWebBrowserView; } } - [self _startLoading]; + [self _startLoading]; } -- (UINavigationButtonStyle) rightButtonStyle { +- (UIBarButtonItemStyle) rightButtonStyle { if (style_ == nil) normal: - return UINavigationButtonStyleNormal; + return UIBarButtonItemStylePlain; else if ([style_ isEqualToString:@"Normal"]) - return UINavigationButtonStyleNormal; - else if ([style_ isEqualToString:@"Back"]) - return UINavigationButtonStyleBack; + return UIBarButtonItemStylePlain; else if ([style_ isEqualToString:@"Highlighted"]) - return UINavigationButtonStyleHighlighted; - else if ([style_ isEqualToString:@"Destructive"]) - return UINavigationButtonStyleDestructive; + return UIBarButtonItemStyleDone; else goto normal; } - (UIBarButtonItem *) customButton { UIBarButtonItem *customItem = [[UIBarButtonItem alloc] - initWithTitle:button_ - style:[self rightButtonStyle] - target:self - action:@selector(customButtonClicked) - ]; - + 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_]; + 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:reloaditem_ animated:YES]; - } + [[self navigationItem] setRightBarButtonItem:[self rightButton] animated:YES]; + } } - (void) _startLoading { @@ -1093,8 +1108,8 @@ static Class $UIWebBrowserView; if (finish_ != nil) [self callFunction:finish_]; - [self applyRightButton]; - if (![self isLoading]) [[self navigationItem] setTitle:title_]; + [self applyRightButton]; + if (![self isLoading]) [[self navigationItem] setTitle:title_]; } - (bool) isLoading { @@ -1333,7 +1348,7 @@ static Class $UIWebBrowserView; BrowserView *actualView = [[BrowserView alloc] initWithFrame:CGRectZero]; [self setView:actualView]; - + struct CGRect bounds = [[self view] bounds]; scroller_ = [[objc_getClass(Wildcat_ ? "UIScrollView" : "UIScroller") alloc] initWithFrame:bounds]; @@ -1453,7 +1468,7 @@ static Class $UIWebBrowserView; else [preferences _setLayoutInterval:0]; } - + actualView.documentView = document_; [actualView release]; @@ -1486,22 +1501,22 @@ static Class $UIWebBrowserView; CGSize indsize = [UIProgressIndicator defaultSizeForStyle:UIProgressIndicatorStyleMediumWhite]; indicator_ = [[UIProgressIndicator alloc] initWithFrame:CGRectMake(15, 5, indsize.width, indsize.height)]; [indicator_ setStyle:UIProgressIndicatorStyleMediumWhite]; - [indicator_ startAnimation]; - - 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_]; + [indicator_ startAnimation]; + + 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]; @@ -1534,8 +1549,12 @@ static Class $UIWebBrowserView; WebView *webview([document_ webView]); WebFrame *frame([webview mainFrame]); + WebPreferences *preferences([webview preferences]); + + bool maybe([preferences javaScriptCanOpenWindowsAutomatically]); + [preferences setJavaScriptCanOpenWindowsAutomatically:NO]; - id _private(MSHookIvar(webview, "_private")); + /*id _private(MSHookIvar(webview, "_private")); WebCore::Page *page(_private == nil ? NULL : MSHookIvar(_private, "page")); WebCore::Settings *settings(page == NULL ? NULL : page->settings()); @@ -1545,7 +1564,7 @@ static Class $UIWebBrowserView; else { no = settings->JavaScriptCanOpenWindowsAutomatically(); settings->setJavaScriptCanOpenWindowsAutomatically(true); - } + }*/ if (UIWindow *window = [[self view] window]) if (UIResponder *responder = [window firstResponder]) @@ -1555,8 +1574,10 @@ static Class $UIWebBrowserView; 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(); } @@ -1571,20 +1592,24 @@ static Class $UIWebBrowserView; [self reloadURL]; } +- (void) _customButtonClicked { + [self reloadButtonClicked]; +} + - (void) customButtonClicked { #if !AlwaysReload if (function_ != nil) [self callFunction:function_]; else #endif - [self reloadButtonClicked]; + [self _customButtonClicked]; } - (void) setPageActive:(BOOL)active { if (!active) [indicator_ removeFromSuperview]; else - [[[[self navigationItem] rightBarButtonItem] view] addSubview:indicator_]; + [[[[self navigationItem] rightBarButtonItem] view] addSubview:indicator_]; } - (void) resetViewAnimated:(BOOL)animated { @@ -1598,4 +1623,4 @@ static Class $UIWebBrowserView; return 980; } -@end \ No newline at end of file +@end