DownloadProxy.cpp revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
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
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DownloadProxy.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DataReference.h"
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContext.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebData.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessMessages.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/CString.h>
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic uint64_t generateDownloadID()
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static uint64_t uniqueDownloadID = 0;
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ++uniqueDownloadID;
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<DownloadProxy> DownloadProxy::create(WebContext* webContext)
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptRef(new DownloadProxy(webContext));
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDownloadProxy::DownloadProxy(WebContext* webContext)
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_webContext(webContext)
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_downloadID(generateDownloadID())
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochDownloadProxy::~DownloadProxy()
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_webContext);
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::cancel()
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->process()->send(Messages::WebProcess::CancelDownload(m_downloadID), 0);
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::invalidate()
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_webContext);
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext = 0;
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::processDidClose()
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().processDidCrash(m_webContext, this);
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didStart(const ResourceRequest& request)
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_request = request;
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didStart(m_webContext, this);
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didReceiveResponse(const ResourceResponse& response)
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didReceiveResponse(m_webContext, this, response);
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didReceiveData(uint64_t length)
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didReceiveData(m_webContext, this, length);
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::shouldDecodeSourceDataOfMIMEType(const String& mimeType, bool& result)
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    result = m_webContext->downloadClient().shouldDecodeSourceDataOfMIMEType(m_webContext, this, mimeType);
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::decideDestinationWithSuggestedFilename(const String& filename, String& destination, bool& allowOverwrite, SandboxExtension::Handle& sandboxExtensionHandle)
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    destination = m_webContext->downloadClient().decideDestinationWithSuggestedFilename(m_webContext, this, filename, allowOverwrite);
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!destination.isNull())
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SandboxExtension::createHandle(destination, SandboxExtension::WriteOnly, sandboxExtensionHandle);
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didCreateDestination(const String& path)
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didCreateDestination(m_webContext, this, path);
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didFinish()
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didFinish(m_webContext, this);
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This can cause the DownloadProxy object to be deleted.
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadFinished(this);
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic PassRefPtr<WebData> createWebData(const CoreIPC::DataReference& data)
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (data.isEmpty())
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return WebData::create(data.data(), data.size());
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didFail(const ResourceError& error, const CoreIPC::DataReference& resumeData)
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_webContext)
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_resumeData = createWebData(resumeData);
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didFail(m_webContext, this, error);
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This can cause the DownloadProxy object to be deleted.
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadFinished(this);
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid DownloadProxy::didCancel(const CoreIPC::DataReference& resumeData)
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_resumeData = createWebData(resumeData);
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadClient().didCancel(m_webContext, this);
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This can cause the DownloadProxy object to be deleted.
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_webContext->downloadFinished(this);
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
180