165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "config.h"
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "Download.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#import <WebCore/AuthenticationMac.h>
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebCore/BackForwardController.h>
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebCore/HistoryItem.h>
3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#import <WebCore/NotImplemented.h>
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebCore/Page.h>
342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebCore/ResourceHandle.h>
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebCore/ResourceResponse.h>
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "DataReference.h"
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WebPage.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@interface NSURLDownload (WebNSURLDownloadDetails)
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch+(id)_downloadWithLoadingConnection:(NSURLConnection *)connection
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                            request:(NSURLRequest *)request
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                           response:(NSURLResponse *)r
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                           delegate:(id)delegate
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                              proxy:(id)proxy;
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setOriginatingURL:(NSURL *)originatingURL;
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@interface WKDownloadAsDelegate : NSObject <NSURLDownloadDelegate> {
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebKit::Download* _download;
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithDownload:(WebKit::Download*)download;
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)invalidate;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic KURL originatingURLFromBackForwardList(WebPage *webPage)
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!webPage)
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return KURL();
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Page* page = webPage->corePage();
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!page)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return KURL();
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    KURL originalURL;
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int backCount = page->backForward()->backCount();
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (int backIndex = 0; backIndex <= backCount; backIndex++) {
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: At one point we had code here to check a "was user gesture" flag.
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Do we need to restore that logic?
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        HistoryItem* historyItem = page->backForward()->itemAtIndex(-backIndex);
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!historyItem)
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            continue;
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        originalURL = historyItem->originalURL();
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!originalURL.isNull())
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return originalURL;
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return KURL();
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void setOriginalURLForDownload(WebPage *webPage, NSURLDownload *download, const ResourceRequest& initialRequest)
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    KURL originalURL;
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If there was no referrer, don't traverse the back/forward history
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // since this download was initiated directly. <rdar://problem/5294691>
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!initialRequest.httpReferrer().isNull()) {
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // find the first item in the history that was originated by the user
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        originalURL = originatingURLFromBackForwardList(webPage);
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (originalURL.isNull())
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        originalURL = initialRequest.url();
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSURL *originalNSURL = originalURL;
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString *scheme = [originalNSURL scheme];
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString *host = [originalNSURL host];
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (scheme && host && [scheme length] && [host length]) {
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSNumber *port = [originalNSURL port];
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (port && [port intValue] < 0)
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            port = nil;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        RetainPtr<NSString> hostOnlyURLString;
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (port)
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            hostOnlyURLString.adoptNS([[NSString alloc] initWithFormat:@"%@://%@:%d", scheme, host, [port intValue]]);
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            hostOnlyURLString.adoptNS([[NSString alloc] initWithFormat:@"%@://%@", scheme, host]);
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        RetainPtr<NSURL> hostOnlyURL = [[NSURL alloc] initWithString:hostOnlyURLString.get()];
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT([download respondsToSelector:@selector(_setOriginatingURL:)]);
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [download _setOriginatingURL:hostOnlyURL.get()];
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid Download::start(WebPage* initiatingPage)
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_nsURLDownload);
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_delegate);
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_delegate.adoptNS([[WKDownloadAsDelegate alloc] initWithDownload:this]);
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_nsURLDownload.adoptNS([[NSURLDownload alloc] initWithRequest:m_request.nsURLRequest() delegate:m_delegate.get()]);
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Allow this to be changed by the client.
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [m_nsURLDownload.get() setDeletesFileUponFailure:NO];
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setOriginalURLForDownload(initiatingPage, m_nsURLDownload.get(), m_request);
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid Download::startWithHandle(WebPage* initiatingPage, ResourceHandle* handle, const ResourceRequest& initialRequest, const ResourceResponse& response)
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_nsURLDownload);
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_delegate);
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    id proxy = handle->releaseProxy();
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(proxy);
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_delegate.adoptNS([[WKDownloadAsDelegate alloc] initWithDownload:this]);
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_nsURLDownload = [NSURLDownload _downloadWithLoadingConnection:handle->connection()
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                            request:m_request.nsURLRequest()
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                           response:response.nsURLResponse()
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                            delegate:m_delegate.get()
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                               proxy:proxy];
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Allow this to be changed by the client.
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [m_nsURLDownload.get() setDeletesFileUponFailure:NO];
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setOriginalURLForDownload(initiatingPage, m_nsURLDownload.get(), initialRequest);
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid Download::cancel()
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [m_nsURLDownload.get() cancel];
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RetainPtr<NSData> resumeData = [m_nsURLDownload.get() resumeData];
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    didCancel(CoreIPC::DataReference(reinterpret_cast<const uint8_t*>([resumeData.get() bytes]), [resumeData.get() length]));
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid Download::platformInvalidate()
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_nsURLDownload);
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_delegate);
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [m_delegate.get() invalidate];
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_delegate = nullptr;
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_nsURLDownload = nullptr;
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1732fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid Download::didDecideDestination(const String& destination, bool allowOverwrite)
1742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid Download::platformDidFinish()
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1812bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid Download::receivedCredential(const AuthenticationChallenge& authenticationChallenge, const Credential& credential)
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1832bde8e466a4451c7319e3a072d118917957d6554Steve Block    [authenticationChallenge.sender() useCredential:mac(credential) forAuthenticationChallenge:authenticationChallenge.nsURLAuthenticationChallenge()];
1842bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1852bde8e466a4451c7319e3a072d118917957d6554Steve Block
1862bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid Download::receivedRequestToContinueWithoutCredential(const AuthenticationChallenge& authenticationChallenge)
1872bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1882bde8e466a4451c7319e3a072d118917957d6554Steve Block    [authenticationChallenge.sender() continueWithoutCredentialForAuthenticationChallenge:authenticationChallenge.nsURLAuthenticationChallenge()];
1892bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1902bde8e466a4451c7319e3a072d118917957d6554Steve Block
1912bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid Download::receivedCancellation(const AuthenticationChallenge& authenticationChallenge)
1922bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block    [authenticationChallenge.sender() cancelAuthenticationChallenge:authenticationChallenge.nsURLAuthenticationChallenge()];
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@implementation WKDownloadAsDelegate
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithDownload:(WebKit::Download*)download
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    self = [super init];
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!self)
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return nil;
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _download = download;
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return self;
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)invalidate
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _download = 0;
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)downloadDidBegin:(NSURLDownload *)download
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_download)
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _download->didStart();
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSURLRequest *)download:(NSURLDownload *)download willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return request;
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)download:(NSURLDownload *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Implement.
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    notImplemented();
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NO;
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2352bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (_download)
2362bde8e466a4451c7319e3a072d118917957d6554Steve Block        _download->didReceiveAuthenticationChallenge(core(challenge));
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Implement.
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    notImplemented();
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)downloadShouldUseCredentialStorage:(NSURLDownload *)download
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2472bde8e466a4451c7319e3a072d118917957d6554Steve Block    return NO;
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download didReceiveResponse:(NSURLResponse *)response
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_download)
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _download->didReceiveResponse(response);
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download willResumeWithResponse:(NSURLResponse *)response fromByte:(long long)startingByte
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Implement.
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    notImplemented();
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download didReceiveDataOfLength:(NSUInteger)length
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_download)
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _download->didReceiveData(length);
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)download:(NSURLDownload *)download shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_download)
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _download->shouldDecodeSourceDataOfMIMEType(encodingType);
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download decideDestinationWithSuggestedFilename:(NSString *)filename
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String destination;
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool allowOverwrite;
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_download)
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destination = _download->decideDestinationWithSuggestedFilename(filename, allowOverwrite);
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!destination.isNull())
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [download setDestination:destination allowOverwrite:allowOverwrite];
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download didCreateDestination:(NSString *)path
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_download)
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _download->didCreateDestination(path);
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)downloadDidFinish:(NSURLDownload *)download
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_download)
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _download->didFinish();
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!_download)
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RetainPtr<NSData> resumeData = [download resumeData];
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CoreIPC::DataReference dataReference(reinterpret_cast<const uint8_t*>([resumeData.get() bytes]), [resumeData.get() length]);
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _download->didFail(error, dataReference);
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
311