⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webdownload.m

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 M
字号:
/* * 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -