- function_ = function == nil ? nil : [function retain];
-
- [self applyRightButton];
-}
-
-- (void) setFinishHook:(id)function {
- if (finish_ != nil)
- [finish_ autorelease];
- finish_ = function == nil ? nil : [function retain];
-}
-
-- (void) setPopupHook:(id)function {
- if (closer_ != nil)
- [closer_ autorelease];
- closer_ = function == nil ? nil : [function retain];
-}
-
-- (void) _openMailToURL:(NSURL *)url {
- [[UIApplication sharedApplication] openURL:url];// asPanel:YES];
-}
-
-- (void) webView:(WebView *)sender willBeginEditingFormElement:(id)element {
- editing_ = true;
-}
-
-- (void) webView:(WebView *)sender didBeginEditingFormElement:(id)element {
- [self fixScroller];
-}
-
-- (void) webViewDidEndEditingFormElements:(WebView *)sender {
- editing_ = false;
- [self fixScroller];
-}
-
-- (void) webViewClose:(WebView *)sender {
- [self close];
-}
-
-- (void) close {
- [[self navigationController] dismissModalViewControllerAnimated:YES];
-}
-
-- (void) webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame {
-}
-
-- (void) webView:(WebView *)sender unableToImplementPolicyWithError:(NSError *)error frame:(WebFrame *)frame {
- NSLog(@"err:%@", error);
-}
-
-- (void) webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)action request:(NSURLRequest *)request newFrameName:(NSString *)name decisionListener:(id<WebPolicyDecisionListener>)listener {
-#if LogBrowser
- NSLog(@"nwa:%@", name);
-#endif
-
- if (NSURL *url = [request URL]) {
- if (name == nil) unknown: {
- if (![self getSpecial:url swap:NO]) {
- NSString *scheme([[url scheme] lowercaseString]);
- if ([scheme isEqualToString:@"mailto"])
- [self _openMailToURL:url];
- else goto use;
- }
- } else if ([name isEqualToString:@"_open"])
- [delegate_ openURL:url];
- else if ([name isEqualToString:@"_popup"]) {
- NSString *scheme([[url scheme] lowercaseString]);
- if ([scheme isEqualToString:@"mailto"])
- [self _openMailToURL:url];
- else {
- UCNavigationController *navigation([[[UCNavigationController alloc] init] autorelease]);
- [navigation setHook:indirect_];
-
- UCViewController *page([delegate_ pageForURL:url hasTag:NULL]);
- if (page == nil) {
- /* XXX: call createWebViewWithRequest instead? */
-
- BrowserController *browser([[[class_ alloc] init] autorelease]);
- [browser loadURL:url];
- page = browser;
- }
-
- [navigation setDelegate:delegate_];
- [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];
-
- [[self navigationController] presentModalViewController:navigation animated:YES];
- }
- } else goto unknown;
-
- [listener ignore];
- } else use:
- [listener use];
-}
-
-- (void) webView:(WebView *)sender decidePolicyForMIMEType:(NSString *)type request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {
- if ([WebView canShowMIMEType:type])
- [listener use];
- else {
- // XXX: handle more mime types!
- [listener ignore];
-
- WebView *webview([document_ webView]);
- if (frame == [webview mainFrame])
- [[UIApplication sharedApplication] openURL:[request URL]];
- }
-}
-
-- (void) webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)action request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {
- if (request == nil) ignore: {
- [listener ignore];
- return;
- }
-
- NSURL *url([request URL]);
- NSString *host([url host]);
-
- if (url == nil) use: {
- if (!error_ && [frame parentFrame] == nil) {
- if (request_ != nil)
- [request_ autorelease];
- request_ = [request retain];
-#if LogBrowser
- NSLog(@"dpn:%@", request_);
-#endif
- }
-
- [listener use];
-
- WebView *webview([document_ webView]);
- if (frame == [webview mainFrame])
- [self _pushPage];
- return;
- }
-#if LogBrowser
- else NSLog(@"nav:%@:%@", url, [action description]);
-#endif
-
- const NSArray *capability;
-
- if ($GSSystemCopyCapability != NULL) {
- capability = reinterpret_cast<const NSArray *>((*$GSSystemCopyCapability)(kGSDisplayIdentifiersCapability));
- capability = [capability autorelease];
- } else if ($GSSystemGetCapability != NULL) {
- capability = reinterpret_cast<const NSArray *>((*$GSSystemGetCapability)(kGSDisplayIdentifiersCapability));
- } else
- capability = nil;
-
- NSURL *open(nil);
-
- if (capability != nil && (
- [url isGoogleMapsURL] && [capability containsObject:@"com.apple.Maps"] && (open = [url mapsURL]) != nil||
- [host hasSuffix:@"youtube.com"] && [capability containsObject:@"com.apple.youtube"] && (open = [url youTubeURL]) != nil ||
- [url respondsToSelector:@selector(phobosURL)] && (open = [url phobosURL]) != nil
- )) {
- url = open;
- open:
- [[UIApplication sharedApplication] openURL:url];
- goto ignore;
- }
-
- int store(_not(int));
- if (NSURL *itms = [url itmsURL:&store]) {
-#if LogBrowser
- NSLog(@"itms#%@#%u#%@", url, store, itms);
-#endif
-
- if (capability != nil && (
- store == 1 && [capability containsObject:@"com.apple.MobileStore"] ||
- store == 2 && [capability containsObject:@"com.apple.AppStore"]
- )) {
- url = itms;
- goto open;
- }
- }
-
- NSString *scheme([[url scheme] lowercaseString]);
-
- if ([scheme isEqualToString:@"tel"]) {
- // XXX: intelligence
- goto open;
- }
-
- if ([scheme isEqualToString:@"mailto"]) {
- [self _openMailToURL:url];
- goto ignore;
- }
-
- if ([self getSpecial:url swap:YES])
- goto ignore;
- else if ([WebView _canHandleRequest:request])
- goto use;
- else if ([url isSpringboardHandledURL])
- goto open;
- else
- goto use;
-}
-
-- (void) webView:(WebView *)sender setStatusText:(NSString *)text {
- //lprintf("Status:%s\n", [text UTF8String]);
-}
-
-- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)button {
- NSString *context([alert context]);
-
- if ([context isEqualToString:@"alert"]) {
- [self autorelease];
- [alert dismissWithClickedButtonIndex:-1 animated:YES];
- } else if ([context isEqualToString:@"confirm"]) {
- switch (button) {
- case 1:
- confirm_ = [NSNumber numberWithBool:YES];
- break;
-
- case 2:
- confirm_ = [NSNumber numberWithBool:NO];
- break;
- }
-
- [alert dismissWithClickedButtonIndex:-1 animated:YES];
- } else if ([context isEqualToString:@"sensitive"]) {
- switch (button) {
- case 1:
- sensitive_ = [NSNumber numberWithBool:YES];
- break;
-
- case 2:
- sensitive_ = [NSNumber numberWithBool:NO];
- break;
- }
-
- [alert dismissWithClickedButtonIndex:-1 animated:YES];
- } else if ([context isEqualToString:@"challenge"]) {
- id<NSURLAuthenticationChallengeSender> sender([challenge_ sender]);
-
- switch (button) {
- case 1: {
- NSString *username([[alert textFieldAtIndex:0] text]);
- NSString *password([[alert textFieldAtIndex:1] text]);
-
- NSURLCredential *credential([NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession]);
-
- [sender useCredential:credential forAuthenticationChallenge:challenge_];
- } break;
-
- case 2:
- [sender cancelAuthenticationChallenge:challenge_];
- break;
-
- _nodefault
- }
-
- [challenge_ release];
- challenge_ = nil;
-
- [alert dismissWithClickedButtonIndex:-1 animated:YES];
- } else if ([context isEqualToString:@"submit"]) {
- switch (button) {
- case 1:
- break;
-
- case 2:
- if (request_ != nil) {
- WebThreadLock();
- [document_ loadRequest:request_];
- WebThreadUnlock();
- }
- break;
-
- _nodefault
- }
-
- [alert dismissWithClickedButtonIndex:-1 animated:YES];
- }
-}
-
-- (void) webView:(WebView *)sender resource:(id)identifier didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)source {
- challenge_ = [challenge retain];
-
- NSURLProtectionSpace *space([challenge protectionSpace]);
- NSString *realm([space realm]);
- if (realm == nil)
- realm = @"";
-
- UIAlertView *alert = [[[UIAlertView alloc]
- initWithTitle:realm
- message:nil
- delegate:self
- cancelButtonTitle:UCLocalize("CANCEL")
- otherButtonTitles:UCLocalize("LOGIN"), nil
- ] autorelease];
-
- [alert setContext:@"challenge"];
- [alert setNumberOfRows:1];
-
- [alert addTextFieldWithValue:@"" label:UCLocalize("USERNAME")];
- [alert addTextFieldWithValue:@"" label:UCLocalize("PASSWORD")];
-
- UITextField *username([alert textFieldAtIndex:0]); {
- UITextInputTraits *traits([username textInputTraits]);
- [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone];
- [traits setAutocorrectionType:UITextAutocorrectionTypeNo];
- [traits setKeyboardType:UIKeyboardTypeASCIICapable];
- [traits setReturnKeyType:UIReturnKeyNext];
- }
-
- UITextField *password([alert textFieldAtIndex:1]); {
- UITextInputTraits *traits([password textInputTraits]);
- [traits setAutocapitalizationType:UITextAutocapitalizationTypeNone];
- [traits setAutocorrectionType:UITextAutocorrectionTypeNo];
- [traits setKeyboardType:UIKeyboardTypeASCIICapable];
- // XXX: UIReturnKeyDone
- [traits setReturnKeyType:UIReturnKeyNext];
- [traits setSecureTextEntry:YES];
- }
-
- [alert show];
-}
-
-- (NSURLRequest *) webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)source {
- return request;
-}
-
-- (WebView *) webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request windowFeatures:(NSDictionary *)features {
-//- (WebView *) webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request userGesture:(BOOL)gesture {
-#if LogBrowser
- NSLog(@"cwv:%@ (%@): %@", request, title_, features == nil ? @"{}" : [features description]);
- //NSLog(@"cwv:%@ (%@): %@", request, title_, gesture ? @"Yes" : @"No");
-#endif
-
- NSNumber *value([features objectForKey:@"width"]);
- float width(value == nil ? 0 : [value floatValue]);
-
- UCNavigationController *navigation(!popup_ ? [self navigationController] : [[[UCNavigationController alloc] init] autorelease]);
-
- /* XXX: deal with cydia:// pages */
- BrowserController *browser([[[class_ alloc] initWithWidth:width] autorelease]);
-
- if (features != nil && popup_) {
- [navigation setDelegate:delegate_];
- [navigation setHook:indirect_];
- [browser setDelegate:delegate_];