From 3e9c9e85a99a501aa15c04f48262bc159d3197af Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Mon, 26 Jan 2009 10:31:46 +0000 Subject: [PATCH] Polished browser and finished repotagging. --- Cydia.mm | 58 +++++++++++++++++++-------- UICaboodle/BrowserView.h | 6 +++ UICaboodle/BrowserView.m | 84 ++++++++++++++++++++++++++++++++++------ control | 2 +- 4 files changed, 121 insertions(+), 29 deletions(-) diff --git a/Cydia.mm b/Cydia.mm index 131c0eed..92f58229 100644 --- a/Cydia.mm +++ b/Cydia.mm @@ -263,8 +263,7 @@ void NSLogRect(const char *fix, const CGRect &rect) { } - (id) yieldToSelector:(SEL)selector withObject:(id)object { - /*[self performSelector:selector withObject:object]; - return;*/ + /*return [self performSelector:selector withObject:object];*/ volatile bool stopped(false); @@ -382,9 +381,9 @@ extern NSString * const kCAFilterNearest; #define lprintf(args...) fprintf(stderr, args) -#define ForRelease 0 +#define ForRelease 1 #define ForSaurik (1 && !ForRelease) -#define ShowInternals (0 && !ForRelease) +#define ShowInternals (1 && !ForRelease) #define IgnoreInstall (0 && !ForRelease) #define RecycleWebViews 0 #define AlwaysReload (1 && !ForRelease) @@ -393,9 +392,9 @@ extern NSString * const kCAFilterNearest; #undef _trace #define _trace(args...) #undef _profile -#define _profile(name) +#define _profile(name) { #undef _end -#define _end +#define _end } #define PrintTimes() do {} while (false) #endif @@ -787,6 +786,8 @@ static UIFont *Font22Bold_; static const char *Machine_ = NULL; static const NSString *UniqueID_ = nil; static const NSString *Build_ = nil; +static const NSString *Product_ = nil; +static const NSString *Safari_ = nil; CFLocaleRef Locale_; CGColorSpaceRef space_; @@ -4145,6 +4146,10 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [super webView:sender didClearWindowObject:window forFrame:frame]; } +- (bool) _allowJavaScriptPanel { + return false; +} + #if !AlwaysReload - (void) _rightButtonClicked { /*[super _rightButtonClicked]; @@ -4695,7 +4700,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { } - (NSString *) getWarning { - NSString *href([href_ stringByAddingPercentEscapesIncludingReserved]); + NSString *href(href_); + NSRange colon([href rangeOfString:@"://"]); + if (colon.location != NSNotFound) + href = [href substringFromIndex:(colon.location + 3)]; + href = [href stringByAddingPercentEscapes]; href = [@"http://cydia.saurik.com/api/repotag/" stringByAppendingString:href]; href = [href stringByCachingURLWithCurrentCDN]; @@ -4723,17 +4732,15 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { trivial_bz2_ == nil && trivial_gz_ == nil ) { - [delegate_ setStatusBarShowsProgress:NO]; - [delegate_ removeProgressHUD:hud_]; - - [hud_ autorelease]; - hud_ = nil; + bool defer(false); if (trivial_) { if (NSString *warning = [self yieldToSelector:@selector(getWarning)]) { + defer = true; + UIActionSheet *sheet = [[[UIActionSheet alloc] - initWithTitle:@"Repository Warning" - buttons:[NSArray arrayWithObjects:@"Add Source", @"Cancel", nil] + initWithTitle:@"Source Warning" + buttons:[NSArray arrayWithObjects:@"Add Anyway", @"Cancel", nil] defaultButtonIndex:0 delegate:self context:@"warning" @@ -4769,8 +4776,16 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [sheet popupAlertAnimated:YES]; } - [href_ release]; - href_ = nil; + [delegate_ setStatusBarShowsProgress:NO]; + [delegate_ removeProgressHUD:hud_]; + + [hud_ autorelease]; + hud_ = nil; + + if (!defer) { + [href_ release]; + href_ = nil; + } if (error_ != nil) { [error_ release]; @@ -4860,6 +4875,9 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { _assert(false); } + [href_ release]; + href_ = nil; + [sheet dismiss]; } } @@ -6466,8 +6484,10 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (void) _reloadData { UIView *block(); + static bool loaded(false); UIProgressHUD *hud([self addProgressHUD]); - [hud setText:@"Reloading Data"]; + [hud setText:(loaded ? @"Reloading Data" : @"Loading Data")]; + loaded = true; [database_ yieldToSelector:@selector(reloadData) withObject:nil]; _trace(); @@ -7323,6 +7343,10 @@ int main(int argc, char *argv[]) { _pooled if (NSDictionary *system = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]) Build_ = [system objectForKey:@"ProductBuildVersion"]; + if (NSDictionary *info = [NSDictionary dictionaryWithContentsOfFile:@"/Applications/MobileSafari.app/Info.plist"]) { + Product_ = [info objectForKey:@"SafariProductVersion"]; + Safari_ = [info objectForKey:@"CFBundleVersion"]; + } /*AddPreferences(@"/Applications/Preferences.app/Settings-iPhone.plist"); AddPreferences(@"/Applications/Preferences.app/Settings-iPod.plist");*/ diff --git a/UICaboodle/BrowserView.h b/UICaboodle/BrowserView.h index 09680e35..cbb407f7 100644 --- a/UICaboodle/BrowserView.h +++ b/UICaboodle/BrowserView.h @@ -57,6 +57,9 @@ WebScriptObject *function_; bool pushed_; + + float width_; + bool popup_; } - (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button; @@ -71,8 +74,11 @@ - (UIWebDocumentView *) documentView; - (id) initWithBook:(RVBook *)book; +- (id) initWithBook:(RVBook *)book forWidth:(float)width; - (void) webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame; - (void) webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame; ++ (float) defaultWidth; + @end diff --git a/UICaboodle/BrowserView.m b/UICaboodle/BrowserView.m index fa41f2e9..d2a97c84 100644 --- a/UICaboodle/BrowserView.m +++ b/UICaboodle/BrowserView.m @@ -73,6 +73,8 @@ + (NSString *) webScriptNameForSelector:(SEL)selector { if (selector == @selector(getPackageById:)) return @"getPackageById"; + else if (selector == @selector(setAutoPopup:)) + return @"setAutoPopup"; else if (selector == @selector(setButtonImage:withStyle:toFunction:)) return @"setButtonImage"; else if (selector == @selector(setButtonTitle:withStyle:toFunction:)) @@ -155,6 +157,10 @@ return value; } +- (void) setAutoPopup:(BOOL)popup { + [indirect_ setAutoPopup:popup]; +} + - (void) setButtonImage:(NSString *)button withStyle:(NSString *)style toFunction:(id)function { [indirect_ setButtonImage:button withStyle:style toFunction:function]; } @@ -173,7 +179,9 @@ #endif - (void) dealloc { - NSLog(@"deallocating WebView"); +#if ForSaurik + NSLog(@"[BrowserView dealloc]"); +#endif if (challenge_ != nil) [challenge_ release]; @@ -339,7 +347,14 @@ /* XXX: this is where I cry myself to sleep */ } +- (bool) _allowJavaScriptPanel { + return true; +} + - (void) webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { + if ([self _allowJavaScriptPanel]) + return; + UIActionSheet *sheet = [[[UIActionSheet alloc] initWithTitle:nil buttons:[NSArray arrayWithObjects:@"OK", nil] @@ -353,6 +368,9 @@ } - (BOOL) webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { + if (![self _allowJavaScriptPanel]) + return NO; + UIActionSheet *sheet = [[[UIActionSheet alloc] initWithTitle:nil buttons:[NSArray arrayWithObjects:@"OK", @"Cancel", nil] @@ -375,6 +393,10 @@ return [confirm boolValue]; } +- (void) setAutoPopup:(BOOL)popup { + popup_ = popup; +} + - (void) setButtonImage:(NSString *)button withStyle:(NSString *)style toFunction:(id)function { if (button_ != nil) [button_ autorelease]; @@ -416,7 +438,9 @@ } - (void) webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)action request:(NSURLRequest *)request newFrameName:(NSString *)name decisionListener:(id)listener { +#if ForSaurik NSLog(@"nwa:%@", name); +#endif if (NSURL *url = [request URL]) { if (name == nil) unknown: { @@ -433,7 +457,7 @@ RVPage *page([delegate_ pageForURL:url hasTag:NULL]); if (page == nil) { - /* XXX: call createWebViewWithRequest instead */ + /* XXX: call createWebViewWithRequest instead? */ [self setBackButtonTitle:title_]; @@ -505,7 +529,10 @@ int store(_not(int)); if (NSURL *itms = [url itmsURL:&store]) { +#if ForSaurik NSLog(@"itms#%@#%u#%@", url, store, itms); +#endif + if ( store == 1 && [capability containsObject:@"com.apple.MobileStore"] || store == 2 && [capability containsObject:@"com.apple.AppStore"] @@ -648,13 +675,29 @@ } - (WebView *) webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request windowFeatures:(NSDictionary *)features { +//- (WebView *) webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request userGesture:(BOOL)gesture { #if ForSaurik - NSLog(@"cwv:%@ (%@)", request, title_); + NSLog(@"cwv:%@ (%@): %@", request, title_, features == nil ? @"{}" : [features description]); + //NSLog(@"cwv:%@ (%@): %@", request, title_, gesture ? @"Yes" : @"No"); #endif - BrowserView *browser = [[[BrowserView alloc] initWithBook:book_] autorelease]; + NSNumber *value([features objectForKey:@"width"]); + float width(value == nil ? [BrowserView defaultWidth] : [value floatValue]); + + RVBook *book(!popup_ ? book_ : [[[RVPopUpBook alloc] initWithFrame:[delegate_ popUpBounds]] autorelease]); + + /* XXX: deal with cydia:// pages */ + BrowserView *browser([[[BrowserView alloc] initWithBook:book forWidth:width] autorelease]); + + if (features == nil && popup_) { + [book setDelegate:delegate_]; + [browser setDelegate:delegate_]; + + [browser loadRequest:request]; - if (request == nil) { + [book setPage:browser]; + [book_ pushBook:book]; + } else if (request == nil) { [self setBackButtonTitle:title_]; [browser setDelegate:delegate_]; [browser retain]; @@ -668,6 +711,7 @@ - (WebView *) webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request { return [self webView:sender createWebViewWithRequest:request windowFeatures:nil]; + //return [self webView:sender createWebViewWithRequest:request userGesture:YES]; } - (void) webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame { @@ -823,9 +867,11 @@ #endif } -- (id) initWithBook:(RVBook *)book { +- (id) initWithBook:(RVBook *)book forWidth:(float)width { if ((self = [super initWithBook:book]) != nil) { loading_ = false; + width_ = width; + popup_ = false; struct CGRect bounds = [self bounds]; @@ -878,12 +924,13 @@ [webview_ 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]; + //[webview_ setViewportSize:CGSizeMake(980, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x10]; [webview_ setViewportSize:CGSizeMake(320, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x2]; - [webview_ setMinimumScale:1.0f forDocumentTypes:0x8]; + [webview_ setMinimumScale:1.00f forDocumentTypes:0x8]; [webview_ setInitialScale:UIWebViewScalesToFitScale forDocumentTypes:0x8]; [webview_ setViewportSize:CGSizeMake(320, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x8]; @@ -896,12 +943,15 @@ [webview_ setValue:[NSNumber numberWithBool:YES] forGestureAttribute:UIGestureAttributeUpdatesScroller]; [webview_ setSmoothsFonts:YES]; - + [webview_ setAllowsImageSheet:YES]; [webview _setUsesLoaderCache:YES]; - [webview setGroupName:@"Cydia"]; + + [webview setGroupName:@"CydiaGroup"]; [webview _setLayoutInterval:0]; } + [webview_ setViewportSize:CGSizeMake(width_, UIWebViewGrowsAndShrinksToFitHeight) forDocumentTypes:0x10]; + [webview_ setDelegate:self]; [webview_ setGestureDelegate:self]; [scroller_ addSubview:webview_]; @@ -918,8 +968,12 @@ [package installed] ]; + if (Product_ != nil) + application = [NSString stringWithFormat:@"%@ Version/%@", application, Product_]; if (Build_ != nil) - application = [NSString stringWithFormat:@"Mobile/%@ %@", Build_, application]; + application = [NSString stringWithFormat:@"%@ Mobile/%@", application, Build_]; + if (Safari_ != nil) + application = [NSString stringWithFormat:@"%@ Safari/%@", application, Safari_]; /* XXX: lookup application directory? */ /*if (NSDictionary *safari = [NSDictionary dictionaryWithContentsOfFile:@"/Applications/MobileSafari.app/Info.plist"]) @@ -942,6 +996,10 @@ } return self; } +- (id) initWithBook:(RVBook *)book { + return [self initWithBook:book forWidth:[[self class] defaultWidth]]; +} + - (void) didFinishGesturesInView:(UIView *)view forEvent:(id)event { [webview_ redrawScaledDocument]; } @@ -1020,4 +1078,8 @@ pushed_ = pushed; } ++ (float) defaultWidth { + return 980; +} + @end diff --git a/control b/control index 9a3a92d8..92b20a26 100644 --- a/control +++ b/control @@ -4,7 +4,7 @@ Priority: required Section: Packaging Maintainer: Jay Freeman (saurik) Architecture: iphoneos-arm -Version: 1.0.2699-41 +Version: 1.0.2705-41 Replaces: com.sosiphone.addcydia Depends: apt, darwintools, pcre, shell-cmds Conflicts: com.sosiphone.addcydia -- 2.45.2