165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 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#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DownloadProxy.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "AuthenticationChallengeProxy.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DataReference.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContext.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebData.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessMessages.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/CString.h>
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic uint64_t generateDownloadID()
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static uint64_t uniqueDownloadID = 0;
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ++uniqueDownloadID;
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<DownloadProxy> DownloadProxy::create(WebContext* webContext)
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptRef(new DownloadProxy(webContext));
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDownloadProxy::DownloadProxy(WebContext* webContext)
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_webContext(webContext)
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_downloadID(generateDownloadID())
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDownloadProxy::~DownloadProxy()
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_webContext);
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::cancel()
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME (Multi-WebProcess): Downloads shouldn't be handled in the web process.
692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_webContext->sendToAllProcesses(Messages::WebProcess::CancelDownload(m_downloadID));
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::invalidate()
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_webContext);
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext = 0;
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::processDidClose()
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().processDidCrash(m_webContext, this);
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didStart(const ResourceRequest& request)
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_request = request;
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didStart(m_webContext, this);
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
962bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid DownloadProxy::didReceiveAuthenticationChallenge(const AuthenticationChallenge& authenticationChallenge, uint64_t challengeID)
972bde8e466a4451c7319e3a072d118917957d6554Steve Block{
982bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_webContext)
992bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<AuthenticationChallengeProxy> authenticationChallengeProxy = AuthenticationChallengeProxy::create(authenticationChallenge, challengeID, m_webContext->process());
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_webContext->downloadClient().didReceiveAuthenticationChallenge(m_webContext, this, authenticationChallengeProxy.get());
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didReceiveResponse(const ResourceResponse& response)
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didReceiveResponse(m_webContext, this, response);
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didReceiveData(uint64_t length)
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didReceiveData(m_webContext, this, length);
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::shouldDecodeSourceDataOfMIMEType(const String& mimeType, bool& result)
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    result = m_webContext->downloadClient().shouldDecodeSourceDataOfMIMEType(m_webContext, this, mimeType);
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::decideDestinationWithSuggestedFilename(const String& filename, String& destination, bool& allowOverwrite, SandboxExtension::Handle& sandboxExtensionHandle)
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    destination = m_webContext->downloadClient().decideDestinationWithSuggestedFilename(m_webContext, this, filename, allowOverwrite);
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!destination.isNull())
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SandboxExtension::createHandle(destination, SandboxExtension::WriteOnly, sandboxExtensionHandle);
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didCreateDestination(const String& path)
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didCreateDestination(m_webContext, this, path);
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didFinish()
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didFinish(m_webContext, this);
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This can cause the DownloadProxy object to be deleted.
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadFinished(this);
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic PassRefPtr<WebData> createWebData(const CoreIPC::DataReference& data)
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (data.isEmpty())
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return WebData::create(data.data(), data.size());
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didFail(const ResourceError& error, const CoreIPC::DataReference& resumeData)
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_resumeData = createWebData(resumeData);
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didFail(m_webContext, this, error);
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This can cause the DownloadProxy object to be deleted.
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadFinished(this);
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didCancel(const CoreIPC::DataReference& resumeData)
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_resumeData = createWebData(resumeData);
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didCancel(m_webContext, this);
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This can cause the DownloadProxy object to be deleted.
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadFinished(this);
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
192