summaryrefslogtreecommitdiffstats
path: root/WebKit/mac/Misc/WebDownload.m
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:30:52 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:30:52 -0800
commit8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2 (patch)
tree11425ea0b299d6fb89c6d3618a22d97d5bf68d0f /WebKit/mac/Misc/WebDownload.m
parent648161bb0edfc3d43db63caed5cc5213bc6cb78f (diff)
downloadexternal_webkit-8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2.zip
external_webkit-8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2.tar.gz
external_webkit-8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2.tar.bz2
auto import from //depot/cupcake/@135843
Diffstat (limited to 'WebKit/mac/Misc/WebDownload.m')
-rw-r--r--WebKit/mac/Misc/WebDownload.m249
1 files changed, 249 insertions, 0 deletions
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 <WebKit/WebDownload.h>
+
+#import <Foundation/NSURLAuthenticationChallenge.h>
+#import <Foundation/NSURLDownload.h>
+#import <WebKit/WebPanelAuthenticationHandler.h>
+#import <wtf/Assertions.h>
+
+#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.
+ // <rdar://problem/3913270> NSURLConnection calls unimplemented delegate method in WebDownload
+}
+
+@end