From 8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 3 Mar 2009 19:30:52 -0800 Subject: auto import from //depot/cupcake/@135843 --- WebKit/mac/Misc/WebDownload.m | 249 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 WebKit/mac/Misc/WebDownload.m (limited to 'WebKit/mac/Misc/WebDownload.m') diff --git a/WebKit/mac/Misc/WebDownload.m b/WebKit/mac/Misc/WebDownload.m new file mode 100644 index 0000000..2c53c1b --- /dev/null +++ b/WebKit/mac/Misc/WebDownload.m @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +#import +#import +#import +#import + +#import "WebTypesInternal.h" + +@class NSURLConnectionDelegateProxy; + +// FIXME: The following are NSURLDownload SPI - it would be nice to not have to override them at +// some point in the future +@interface NSURLDownload (WebDownloadCapability) +- (id)_initWithLoadingConnection:(NSURLConnection *)connection + request:(NSURLRequest *)request + response:(NSURLResponse *)response + delegate:(id)delegate + proxy:(NSURLConnectionDelegateProxy *)proxy; +- (id)_initWithRequest:(NSURLRequest *)request + delegate:(id)delegate + directory:(NSString *)directory; +@end + +@interface WebDownloadInternal : NSObject +{ +@public + id realDelegate; +} + +- (void)setRealDelegate:(id)rd; + +@end + +@implementation WebDownloadInternal + +- (void)dealloc +{ + [realDelegate release]; + [super dealloc]; +} + +- (void)setRealDelegate:(id)rd +{ + [rd retain]; + [realDelegate release]; + realDelegate = rd; +} + +- (BOOL)respondsToSelector:(SEL)selector +{ + if (selector == @selector(downloadDidBegin:) || + selector == @selector(download:willSendRequest:redirectResponse:) || + selector == @selector(download:didReceiveResponse:) || + selector == @selector(download:didReceiveDataOfLength:) || + selector == @selector(download:shouldDecodeSourceDataOfMIMEType:) || + selector == @selector(download:decideDestinationWithSuggestedFilename:) || + selector == @selector(download:didCreateDestination:) || + selector == @selector(downloadDidFinish:) || + selector == @selector(download:didFailWithError:) || + selector == @selector(download:shouldBeginChildDownloadOfSource:delegate:) || + selector == @selector(download:didBeginChildDownload:)) { + return [realDelegate respondsToSelector:selector]; + } + + return [super respondsToSelector:selector]; +} + +- (void)downloadDidBegin:(NSURLDownload *)download +{ +#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) + [[NSProcessInfo processInfo] disableSuddenTermination]; +#endif + [realDelegate downloadDidBegin:download]; +} + +- (NSURLRequest *)download:(NSURLDownload *)download willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse +{ + return [realDelegate download:download willSendRequest:request redirectResponse:redirectResponse]; +} + +- (void)download:(NSURLDownload *)download didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge +{ + if ([realDelegate respondsToSelector:@selector(download:didReceiveAuthenticationChallenge:)]) { + [realDelegate download:download didReceiveAuthenticationChallenge:challenge]; + } else { + NSWindow *window = nil; + if ([realDelegate respondsToSelector:@selector(downloadWindowForAuthenticationSheet:)]) { + window = [realDelegate downloadWindowForAuthenticationSheet:(WebDownload *)download]; + } + + [[WebPanelAuthenticationHandler sharedHandler] startAuthentication:challenge window:window]; + } +} + +- (void)download:(NSURLDownload *)download didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge +{ + if ([realDelegate respondsToSelector:@selector(download:didCancelAuthenticationChallenge:)]) { + [realDelegate download:download didCancelAuthenticationChallenge:challenge]; + } else { + [[WebPanelAuthenticationHandler sharedHandler] cancelAuthentication:challenge]; + } +} + +- (void)download:(NSURLDownload *)download didReceiveResponse:(NSURLResponse *)response +{ + [realDelegate download:download didReceiveResponse:response]; +} + +- (void)download:(NSURLDownload *)download didReceiveDataOfLength:(NSUInteger)length +{ + [realDelegate download:download didReceiveDataOfLength:length]; +} + +- (BOOL)download:(NSURLDownload *)download shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType +{ + return [realDelegate download:download shouldDecodeSourceDataOfMIMEType:encodingType]; +} + +- (void)download:(NSURLDownload *)download decideDestinationWithSuggestedFilename:(NSString *)filename +{ + [realDelegate download:download decideDestinationWithSuggestedFilename:filename]; +} + +- (void)download:(NSURLDownload *)download didCreateDestination:(NSString *)path +{ + [realDelegate download:download didCreateDestination:path]; +} + +- (void)downloadDidFinish:(NSURLDownload *)download +{ +#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) + [[NSProcessInfo processInfo] enableSuddenTermination]; +#endif + [realDelegate downloadDidFinish:download]; +} + +- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error +{ +#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) + [[NSProcessInfo processInfo] enableSuddenTermination]; +#endif + [realDelegate download:download didFailWithError:error]; +} + +- (NSURLRequest *)download:(NSURLDownload *)download shouldBeginChildDownloadOfSource:(NSURLRequest *)child delegate:(id *)childDelegate +{ + return [realDelegate download:download shouldBeginChildDownloadOfSource:child delegate:childDelegate]; +} + +- (void)download:(NSURLDownload *)parent didBeginChildDownload:(NSURLDownload *)child +{ + [realDelegate download:parent didBeginChildDownload:child]; +} + +@end + +@implementation WebDownload + +- (void)_setRealDelegate:(id)delegate +{ + if (_webInternal == nil) { + _webInternal = [[WebDownloadInternal alloc] init]; + [_webInternal setRealDelegate:delegate]; + } else { + ASSERT(_webInternal == delegate); + } +} + +- (id)init +{ + self = [super init]; + if (self != nil) { + // _webInternal can be set up before init by _setRealDelegate + if (_webInternal == nil) { + _webInternal = [[WebDownloadInternal alloc] init]; + } + } + return self; +} + +- (void)dealloc +{ + [_webInternal release]; + [super dealloc]; +} + +- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate +{ + [self _setRealDelegate:delegate]; + return [super initWithRequest:request delegate:_webInternal]; +} + +- (id)_initWithLoadingConnection:(NSURLConnection *)connection + request:(NSURLRequest *)request + response:(NSURLResponse *)response + delegate:(id)delegate + proxy:(NSURLConnectionDelegateProxy *)proxy +{ + [self _setRealDelegate:delegate]; + return [super _initWithLoadingConnection:connection request:request response:response delegate:_webInternal proxy:proxy]; +} + +- (id)_initWithRequest:(NSURLRequest *)request + delegate:(id)delegate + directory:(NSString *)directory +{ + [self _setRealDelegate:delegate]; + return [super _initWithRequest:request delegate:_webInternal directory:directory]; +} + +- (void)connection:(NSURLConnection *)connection willStopBufferingData:(NSData *)data +{ + // NSURLConnection calls this method even if it is not implemented. + // This happens because NSURLConnection caches the results of respondsToSelector. + // Those results become invalid when the delegate of NSURLConnectionDelegateProxy is changed. + // This is a workaround since this problem needs to be fixed in NSURLConnectionDelegateProxy. + // NSURLConnection calls unimplemented delegate method in WebDownload +} + +@end -- cgit v1.1