Async XMLHttpRequest should get access to AppCache resources stored as flat files
[WebKit-https.git] / Source / WebCore / loader / appcache / ApplicationCacheResource.cpp
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "ApplicationCacheResource.h"
28 #include <stdio.h>
29
30 namespace WebCore {
31
32 ApplicationCacheResource::ApplicationCacheResource(const URL& url, const ResourceResponse& response, unsigned type, PassRefPtr<SharedBuffer> data, const String& path)
33     : SubstituteResource(url, response, data)
34     , m_type(type)
35     , m_storageID(0)
36     , m_estimatedSizeInStorage(0)
37     , m_path(path)
38 {
39 }
40
41 void ApplicationCacheResource::deliver(ResourceLoader& loader)
42 {
43     RefPtr<SharedBuffer> buffer;
44     if (m_path.isEmpty())
45         buffer = data()->copy();
46     else
47         buffer = SharedBuffer::createWithContentsOfFile(m_path);
48     loader.deliverResponseAndData(response(), WTF::move(buffer));
49 }
50
51 void ApplicationCacheResource::addType(unsigned type) 
52 {
53     // Caller should take care of storing the new type in database.
54     m_type |= type; 
55 }
56
57 int64_t ApplicationCacheResource::estimatedSizeInStorage()
58 {
59     if (m_estimatedSizeInStorage)
60       return m_estimatedSizeInStorage;
61
62     if (data())
63         m_estimatedSizeInStorage = data()->size();
64
65     for (const auto& headerField : response().httpHeaderFields())
66         m_estimatedSizeInStorage += (headerField.key.length() + headerField.value.length() + 2) * sizeof(UChar);
67
68     m_estimatedSizeInStorage += url().string().length() * sizeof(UChar);
69     m_estimatedSizeInStorage += sizeof(int); // response().m_httpStatusCode
70     m_estimatedSizeInStorage += response().url().string().length() * sizeof(UChar);
71     m_estimatedSizeInStorage += sizeof(unsigned); // dataId
72     m_estimatedSizeInStorage += response().mimeType().length() * sizeof(UChar);
73     m_estimatedSizeInStorage += response().textEncodingName().length() * sizeof(UChar);
74
75     return m_estimatedSizeInStorage;
76 }
77
78 #ifndef NDEBUG
79 void ApplicationCacheResource::dumpType(unsigned type)
80 {
81     if (type & Master)
82         printf("master ");
83     if (type & Manifest)
84         printf("manifest ");
85     if (type & Explicit)
86         printf("explicit ");
87     if (type & Foreign)
88         printf("foreign ");
89     if (type & Fallback)
90         printf("fallback ");
91     
92     printf("\n");
93 }
94 #endif
95
96 } // namespace WebCore