15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/NetworkResourcesData.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMImplementation.h"
33e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/Resource.h"
341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/SharedBuffer.h"
35bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/ResourceResponse.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 100MB
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static size_t maximumResourcesContentSize = 100 * 1000 * 1000;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 10MB
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static size_t maximumSingleResourceContentSize = 10 * 1000 * 1000;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassRefPtr<XHRReplayData> XHRReplayData::create(const AtomicString& method, const KURL& url, bool async, PassRefPtr<FormData> formData, bool includeCredentials)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptRef(new XHRReplayData(method, url, async, formData, includeCredentials));
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void XHRReplayData::addHeader(const AtomicString& key, const AtomicString& value)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_headers.set(key, value);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)XHRReplayData::XHRReplayData(const AtomicString& method, const KURL& url, bool async, PassRefPtr<FormData> formData, bool includeCredentials)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_method(method)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_url(url)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_async(async)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_formData(formData)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_includeCredentials(includeCredentials)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ResourceData
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NetworkResourcesData::ResourceData::ResourceData(const String& requestId, const String& loaderId)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_requestId(requestId)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_loaderId(loaderId)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_base64Encoded(false)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isContentEvicted(false)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_type(InspectorPageAgent::OtherResource)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_cachedResource(0)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::ResourceData::setContent(const String& content, bool base64Encoded)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!hasData());
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!hasContent());
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_content = content;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_base64Encoded = base64Encoded;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static size_t contentSizeInBytes(const String& content)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return content.isNull() ? 0 : content.impl()->sizeInBytes();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned NetworkResourcesData::ResourceData::removeContent()
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned result = 0;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasData()) {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!hasContent());
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = m_dataBuffer->size();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_dataBuffer = nullptr;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasContent()) {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!hasData());
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = contentSizeInBytes(m_content);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_content = String();
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned NetworkResourcesData::ResourceData::evictContent()
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isContentEvicted = true;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return removeContent();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t NetworkResourcesData::ResourceData::dataLength() const
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_dataBuffer ? m_dataBuffer->size() : 0;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::ResourceData::appendData(const char* data, size_t dataLength)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!hasContent());
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_dataBuffer)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_dataBuffer = SharedBuffer::create(data, dataLength);
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_dataBuffer->append(data, dataLength);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t NetworkResourcesData::ResourceData::decodeDataToContent()
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!hasContent());
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t dataLength = m_dataBuffer->size();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_content = m_decoder->decode(m_dataBuffer->data(), m_dataBuffer->size());
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_content.append(m_decoder->flush());
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_dataBuffer = nullptr;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return contentSizeInBytes(m_content) - dataLength;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// NetworkResourcesData
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NetworkResourcesData::NetworkResourcesData()
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_contentSize(0)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maximumResourcesContentSize(maximumResourcesContentSize)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maximumSingleResourceContentSize(maximumSingleResourceContentSize)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NetworkResourcesData::~NetworkResourcesData()
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clear();
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::resourceCreated(const String& requestId, const String& loaderId)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ensureNoDataForRequestId(requestId);
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_requestIdToResourceDataMap.set(requestId, new ResourceData(requestId, loaderId));
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static PassOwnPtr<TextResourceDecoder> createOtherResourceTextDecoder(const String& mimeType, const String& textEncodingName)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    OwnPtr<TextResourceDecoder> decoder;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!textEncodingName.isEmpty())
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        decoder = TextResourceDecoder::create("text/plain", textEncodingName);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (DOMImplementation::isXMLMIMEType(mimeType.lower())) {
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        decoder = TextResourceDecoder::create("application/xml");
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        decoder->useLenientXMLDecoding();
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (equalIgnoringCase(mimeType, "text/html"))
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        decoder = TextResourceDecoder::create("text/html", "UTF-8");
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (mimeType == "text/plain")
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        decoder = TextResourceDecoder::create("text/plain", "ISO-8859-1");
16951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return decoder.release();
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::responseReceived(const String& requestId, const String& frameId, const ResourceResponse& response)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setFrameId(frameId);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setUrl(response.url());
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setDecoder(createOtherResourceTextDecoder(response.mimeType(), response.textEncodingName()));
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setHTTPStatusCode(response.httpStatusCode());
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::setResourceType(const String& requestId, InspectorPageAgent::ResourceType type)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setType(type);
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorPageAgent::ResourceType NetworkResourcesData::resourceType(const String& requestId)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return InspectorPageAgent::OtherResource;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return resourceData->type();
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::setResourceContent(const String& requestId, const String& content, bool base64Encoded)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t dataLength = contentSizeInBytes(content);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (dataLength > m_maximumSingleResourceContentSize)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceData->isContentEvicted())
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ensureFreeSpace(dataLength) && !resourceData->isContentEvicted()) {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We can not be sure that we didn't try to save this request data while it was loading, so remove it, if any.
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (resourceData->hasContent())
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_contentSize -= resourceData->removeContent();
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_requestIdsDeque.append(requestId);
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resourceData->setContent(content, base64Encoded);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_contentSize += dataLength;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::maybeAddResourceData(const String& requestId, const char* data, size_t dataLength)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData->decoder())
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceData->dataLength() + dataLength > m_maximumSingleResourceContentSize)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_contentSize -= resourceData->evictContent();
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceData->isContentEvicted())
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ensureFreeSpace(dataLength) && !resourceData->isContentEvicted()) {
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_requestIdsDeque.append(requestId);
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resourceData->appendData(data, dataLength);
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_contentSize += dataLength;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::maybeDecodeDataToContent(const String& requestId)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData->hasData())
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_contentSize += resourceData->decodeDataToContent();
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t dataLength = contentSizeInBytes(resourceData->content());
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (dataLength > m_maximumSingleResourceContentSize)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_contentSize -= resourceData->evictContent();
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
250fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid NetworkResourcesData::addResource(const String& requestId, Resource* cachedResource)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!resourceData)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
255fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    resourceData->setResource(cachedResource);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::addResourceSharedBuffer(const String& requestId, PassRefPtr<SharedBuffer> buffer, const String& textEncodingName)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setBuffer(buffer);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setTextEncodingName(textEncodingName);
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NetworkResourcesData::ResourceData const* NetworkResourcesData::data(const String& requestId)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return resourceDataForRequestId(requestId);
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)XHRReplayData* NetworkResourcesData::xhrReplayData(const String& requestId)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_reusedXHRReplayDataRequestIds.contains(requestId))
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return xhrReplayData(m_reusedXHRReplayDataRequestIds.get(requestId));
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return resourceData->xhrReplayData();
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::setXHRReplayData(const String& requestId, XHRReplayData* xhrReplayData)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resourceData) {
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Vector<String> result;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ReusedRequestIds::iterator it;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ReusedRequestIds::iterator end = m_reusedXHRReplayDataRequestIds.end();
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (it = m_reusedXHRReplayDataRequestIds.begin(); it != end; ++it) {
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (it->value == requestId)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                setXHRReplayData(it->key, xhrReplayData);
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setXHRReplayData(xhrReplayData);
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::reuseXHRReplayData(const String& requestId, const String& reusedRequestId)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* reusedResourceData = resourceDataForRequestId(reusedRequestId);
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!reusedResourceData || !resourceData) {
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_reusedXHRReplayDataRequestIds.set(requestId, reusedRequestId);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resourceData->setXHRReplayData(reusedResourceData->xhrReplayData());
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)Vector<NetworkResourcesData::ResourceData*> NetworkResourcesData::resources()
31306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){
31406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    Vector<ResourceData*> result;
31506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    for (ResourceDataMap::iterator it = m_requestIdToResourceDataMap.begin(); it != m_requestIdToResourceDataMap.end(); ++it)
31606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        result.append(it->value);
31706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return result;
31806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
31906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
320fff8884795cb540f87cf6e6d67b629519b00eb8bBen MurdochVector<String> NetworkResourcesData::removeResource(Resource* cachedResource)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> result;
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceDataMap::iterator it;
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceDataMap::iterator end = m_requestIdToResourceDataMap.end();
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (it = m_requestIdToResourceDataMap.begin(); it != end; ++it) {
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ResourceData* resourceData = it->value;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (resourceData->cachedResource() == cachedResource) {
328fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch            resourceData->setResource(0);
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(it->key);
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::clear(const String& preservedLoaderId)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_requestIdsDeque.clear();
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_contentSize = 0;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceDataMap preservedMap;
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceDataMap::iterator it;
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceDataMap::iterator end = m_requestIdToResourceDataMap.end();
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (it = m_requestIdToResourceDataMap.begin(); it != end; ++it) {
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ResourceData* resourceData = it->value;
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!preservedLoaderId.isNull() && resourceData->loaderId() == preservedLoaderId)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            preservedMap.set(it->key, it->value);
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete resourceData;
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_requestIdToResourceDataMap.swap(preservedMap);
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_reusedXHRReplayDataRequestIds.clear();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::setResourcesDataSizeLimits(size_t maximumResourcesContentSize, size_t maximumSingleResourceContentSize)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clear();
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maximumResourcesContentSize = maximumResourcesContentSize;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maximumSingleResourceContentSize = maximumSingleResourceContentSize;
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)NetworkResourcesData::ResourceData* NetworkResourcesData::resourceDataForRequestId(const String& requestId)
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (requestId.isNull())
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_requestIdToResourceDataMap.get(requestId);
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NetworkResourcesData::ensureNoDataForRequestId(const String& requestId)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceData* resourceData = resourceDataForRequestId(requestId);
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!resourceData)
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (resourceData->hasContent() || resourceData->hasData())
377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_contentSize -= resourceData->evictContent();
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    delete resourceData;
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_requestIdToResourceDataMap.remove(requestId);
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool NetworkResourcesData::ensureFreeSpace(size_t size)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (size > m_maximumResourcesContentSize)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (size > m_maximumResourcesContentSize - m_contentSize) {
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String requestId = m_requestIdsDeque.takeFirst();
389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ResourceData* resourceData = resourceDataForRequestId(requestId);
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (resourceData)
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_contentSize -= resourceData->evictContent();
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
398