OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All Rights Reserved. | 2 * Copyright (C) 2011 Google Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "core/fetch/RawResource.h" | 26 #include "core/fetch/RawResource.h" |
27 | 27 |
28 #include "core/fetch/FetchRequest.h" | 28 #include "core/fetch/FetchRequest.h" |
29 #include "core/fetch/MemoryCache.h" | 29 #include "core/fetch/MemoryCache.h" |
30 #include "core/fetch/ResourceClientWalker.h" | 30 #include "core/fetch/ResourceClientWalker.h" |
31 #include "core/fetch/ResourceFetcher.h" | 31 #include "core/fetch/ResourceFetcher.h" |
32 #include "core/fetch/ResourceLoader.h" | 32 #include "core/fetch/ResourceLoader.h" |
33 | 33 |
34 namespace blink { | 34 namespace blink { |
35 | 35 |
36 ResourcePtr<Resource> RawResource::fetchSynchronously(FetchRequest& request, Res
ourceFetcher* fetcher) | 36 PassRefPtrWillBeRawPtr<Resource> RawResource::fetchSynchronously(FetchRequest& r
equest, ResourceFetcher* fetcher) |
37 { | 37 { |
38 request.mutableResourceRequest().setTimeoutInterval(10); | 38 request.mutableResourceRequest().setTimeoutInterval(10); |
39 ResourceLoaderOptions options(request.options()); | 39 ResourceLoaderOptions options(request.options()); |
40 options.synchronousPolicy = RequestSynchronously; | 40 options.synchronousPolicy = RequestSynchronously; |
41 request.setOptions(options); | 41 request.setOptions(options); |
42 return fetcher->requestResource(request, RawResourceFactory(Resource::Raw)); | 42 return fetcher->requestResource(request, RawResourceFactory(Resource::Raw)); |
43 } | 43 } |
44 | 44 |
45 ResourcePtr<RawResource> RawResource::fetchImport(FetchRequest& request, Resourc
eFetcher* fetcher) | 45 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchImport(FetchRequest& reque
st, ResourceFetcher* fetcher) |
46 { | 46 { |
47 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 47 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
48 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textImport); | 48 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textImport); |
49 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::ImportResource))); | 49 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::ImportResource))); |
50 } | 50 } |
51 | 51 |
52 ResourcePtr<RawResource> RawResource::fetch(FetchRequest& request, ResourceFetch
er* fetcher) | 52 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetch(FetchRequest& request, Re
sourceFetcher* fetcher) |
53 { | 53 { |
54 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 54 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
55 ASSERT(request.resourceRequest().requestContext() != WebURLRequest::RequestC
ontextUnspecified); | 55 ASSERT(request.resourceRequest().requestContext() != WebURLRequest::RequestC
ontextUnspecified); |
56 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Raw))); | 56 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Raw))); |
57 } | 57 } |
58 | 58 |
59 ResourcePtr<RawResource> RawResource::fetchMainResource(FetchRequest& request, R
esourceFetcher* fetcher, const SubstituteData& substituteData) | 59 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchMainResource(FetchRequest&
request, ResourceFetcher* fetcher, const SubstituteData& substituteData) |
60 { | 60 { |
61 ASSERT(request.resourceRequest().frameType() != WebURLRequest::FrameTypeNone
); | 61 ASSERT(request.resourceRequest().frameType() != WebURLRequest::FrameTypeNone
); |
62 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextForm || request.resourceRequest().requestContext() == WebURLRequest::Reque
stContextFrame || request.resourceRequest().requestContext() == WebURLRequest::R
equestContextHyperlink || request.resourceRequest().requestContext() == WebURLRe
quest::RequestContextIframe || request.resourceRequest().requestContext() == Web
URLRequest::RequestContextInternal || request.resourceRequest().requestContext()
== WebURLRequest::RequestContextLocation); | 62 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextForm || request.resourceRequest().requestContext() == WebURLRequest::Reque
stContextFrame || request.resourceRequest().requestContext() == WebURLRequest::R
equestContextHyperlink || request.resourceRequest().requestContext() == WebURLRe
quest::RequestContextIframe || request.resourceRequest().requestContext() == Web
URLRequest::RequestContextInternal || request.resourceRequest().requestContext()
== WebURLRequest::RequestContextLocation); |
63 | 63 |
64 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::MainResource), substituteData)); | 64 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::MainResource), substituteData)); |
65 } | 65 } |
66 | 66 |
67 ResourcePtr<RawResource> RawResource::fetchMedia(FetchRequest& request, Resource
Fetcher* fetcher) | 67 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchMedia(FetchRequest& reques
t, ResourceFetcher* fetcher) |
68 { | 68 { |
69 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 69 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
70 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextAudio || request.resourceRequest().requestContext() == WebURLRequest::Requ
estContextVideo); | 70 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextAudio || request.resourceRequest().requestContext() == WebURLRequest::Requ
estContextVideo); |
71 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Media))); | 71 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Media))); |
72 } | 72 } |
73 | 73 |
74 ResourcePtr<RawResource> RawResource::fetchTextTrack(FetchRequest& request, Reso
urceFetcher* fetcher) | 74 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchTextTrack(FetchRequest& re
quest, ResourceFetcher* fetcher) |
75 { | 75 { |
76 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 76 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
77 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textTrack); | 77 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textTrack); |
78 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::TextTrack))); | 78 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::TextTrack))); |
79 } | 79 } |
80 | 80 |
81 ResourcePtr<RawResource> RawResource::fetchManifest(FetchRequest& request, Resou
rceFetcher* fetcher) | 81 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchManifest(FetchRequest& req
uest, ResourceFetcher* fetcher) |
82 { | 82 { |
83 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 83 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
84 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextManifest); | 84 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextManifest); |
85 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Manifest))); | 85 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Manifest))); |
86 } | 86 } |
87 | 87 |
88 RawResource::RawResource(const ResourceRequest& resourceRequest, Type type) | 88 RawResource::RawResource(const ResourceRequest& resourceRequest, Type type) |
89 : Resource(resourceRequest, type) | 89 : Resource(resourceRequest, type) |
90 { | 90 { |
91 } | 91 } |
92 | 92 |
93 void RawResource::appendData(const char* data, size_t length) | 93 void RawResource::appendData(const char* data, size_t length) |
94 { | 94 { |
95 Resource::appendData(data, length); | 95 Resource::appendData(data, length); |
96 | 96 |
97 ResourcePtr<RawResource> protect(this); | 97 RefPtrWillBeRawPtr<RawResource> protect(this); |
98 ResourceClientWalker<RawResourceClient> w(m_clients); | 98 ResourceClientWalker<RawResourceClient> w(m_clients); |
99 while (RawResourceClient* c = w.next()) | 99 while (RawResourceClient* c = w.next()) |
100 c->dataReceived(this, data, length); | 100 c->dataReceived(this, data, length); |
101 } | 101 } |
102 | 102 |
103 void RawResource::didAddClient(ResourceClient* c) | 103 void RawResource::didAddClient(ResourceClient* c) |
104 { | 104 { |
105 if (!hasClient(c)) | 105 if (!hasClient(c)) |
106 return; | 106 return; |
107 // The calls to the client can result in events running, potentially causing | 107 // The calls to the client can result in events running, potentially causing |
108 // this resource to be evicted from the cache and all clients to be removed, | 108 // this resource to be evicted from the cache and all clients to be removed, |
109 // so a protector is necessary. | 109 // so a protector is necessary. |
110 ResourcePtr<RawResource> protect(this); | 110 RefPtrWillBeRawPtr<RawResource> protect(this); |
111 ASSERT(c->resourceClientType() == RawResourceClient::expectedType()); | 111 ASSERT(c->resourceClientType() == RawResourceClient::expectedType()); |
112 RawResourceClient* client = static_cast<RawResourceClient*>(c); | 112 RawResourceClient* client = static_cast<RawResourceClient*>(c); |
113 for (const auto& redirect : redirectChain()) { | 113 for (const auto& redirect : redirectChain()) { |
114 ResourceRequest request(redirect.m_request); | 114 ResourceRequest request(redirect.m_request); |
115 client->redirectReceived(this, request, redirect.m_redirectResponse); | 115 client->redirectReceived(this, request, redirect.m_redirectResponse); |
116 if (!hasClient(c)) | 116 if (!hasClient(c)) |
117 return; | 117 return; |
118 } | 118 } |
119 | 119 |
120 if (!m_response.isNull()) | 120 if (!m_response.isNull()) |
121 client->responseReceived(this, m_response, nullptr); | 121 client->responseReceived(this, m_response, nullptr); |
122 if (!hasClient(c)) | 122 if (!hasClient(c)) |
123 return; | 123 return; |
124 if (m_data) | 124 if (m_data) |
125 client->dataReceived(this, m_data->data(), m_data->size()); | 125 client->dataReceived(this, m_data->data(), m_data->size()); |
126 if (!hasClient(c)) | 126 if (!hasClient(c)) |
127 return; | 127 return; |
128 Resource::didAddClient(client); | 128 Resource::didAddClient(client); |
129 } | 129 } |
130 | 130 |
131 void RawResource::willFollowRedirect(ResourceRequest& newRequest, const Resource
Response& redirectResponse) | 131 void RawResource::willFollowRedirect(ResourceRequest& newRequest, const Resource
Response& redirectResponse) |
132 { | 132 { |
133 ResourcePtr<RawResource> protect(this); | 133 RefPtrWillBeRawPtr<RawResource> protect(this); |
134 ASSERT(!redirectResponse.isNull()); | 134 ASSERT(!redirectResponse.isNull()); |
135 ResourceClientWalker<RawResourceClient> w(m_clients); | 135 ResourceClientWalker<RawResourceClient> w(m_clients); |
136 while (RawResourceClient* c = w.next()) | 136 while (RawResourceClient* c = w.next()) |
137 c->redirectReceived(this, newRequest, redirectResponse); | 137 c->redirectReceived(this, newRequest, redirectResponse); |
138 Resource::willFollowRedirect(newRequest, redirectResponse); | 138 Resource::willFollowRedirect(newRequest, redirectResponse); |
139 } | 139 } |
140 | 140 |
141 void RawResource::updateRequest(const ResourceRequest& request) | 141 void RawResource::updateRequest(const ResourceRequest& request) |
142 { | 142 { |
143 ResourcePtr<RawResource> protect(this); | 143 RefPtrWillBeRawPtr<RawResource> protect(this); |
144 ResourceClientWalker<RawResourceClient> w(m_clients); | 144 ResourceClientWalker<RawResourceClient> w(m_clients); |
145 while (RawResourceClient* c = w.next()) | 145 while (RawResourceClient* c = w.next()) |
146 c->updateRequest(this, request); | 146 c->updateRequest(this, request); |
147 } | 147 } |
148 | 148 |
149 void RawResource::responseReceived(const ResourceResponse& response, PassOwnPtr<
WebDataConsumerHandle> handle) | 149 void RawResource::responseReceived(const ResourceResponse& response, PassOwnPtr<
WebDataConsumerHandle> handle) |
150 { | 150 { |
151 InternalResourcePtr protect(this); | 151 RefPtrWillBeRawPtr<RawResource> protect(this); |
152 | 152 |
153 bool isSuccessfulRevalidation = isCacheValidator() && response.httpStatusCod
e() == 304; | 153 bool isSuccessfulRevalidation = isCacheValidator() && response.httpStatusCod
e() == 304; |
154 Resource::responseReceived(response, nullptr); | 154 Resource::responseReceived(response, nullptr); |
155 | 155 |
156 ResourceClientWalker<RawResourceClient> w(m_clients); | 156 ResourceClientWalker<RawResourceClient> w(m_clients); |
157 ASSERT(count() <= 1 || !handle); | 157 ASSERT(count() <= 1 || !handle); |
158 while (RawResourceClient* c = w.next()) { | 158 while (RawResourceClient* c = w.next()) { |
159 // |handle| is cleared when passed, but it's not a problem because | 159 // |handle| is cleared when passed, but it's not a problem because |
160 // |handle| is null when there are two or more clients, as asserted. | 160 // |handle| is null when there are two or more clients, as asserted. |
161 c->responseReceived(this, m_response, handle); | 161 c->responseReceived(this, m_response, handle); |
162 } | 162 } |
163 | 163 |
164 // If we successfully revalidated, we won't get appendData() calls. | 164 // If we successfully revalidated, we won't get appendData() calls. |
165 // Forward the data to clients now instead. | 165 // Forward the data to clients now instead. |
166 // Note: |m_data| can be null when no data is appended to the original | 166 // Note: |m_data| can be null when no data is appended to the original |
167 // resource. | 167 // resource. |
168 if (isSuccessfulRevalidation && m_data) { | 168 if (isSuccessfulRevalidation && m_data) { |
169 ResourceClientWalker<RawResourceClient> w(m_clients); | 169 ResourceClientWalker<RawResourceClient> w(m_clients); |
170 while (RawResourceClient* c = w.next()) | 170 while (RawResourceClient* c = w.next()) |
171 c->dataReceived(this, m_data->data(), m_data->size()); | 171 c->dataReceived(this, m_data->data(), m_data->size()); |
172 } | 172 } |
173 } | 173 } |
174 | 174 |
175 void RawResource::setSerializedCachedMetadata(const char* data, size_t size) | 175 void RawResource::setSerializedCachedMetadata(const char* data, size_t size) |
176 { | 176 { |
177 ResourcePtr<RawResource> protect(this); | 177 RefPtrWillBeRawPtr<RawResource> protect(this); |
178 Resource::setSerializedCachedMetadata(data, size); | 178 Resource::setSerializedCachedMetadata(data, size); |
179 ResourceClientWalker<RawResourceClient> w(m_clients); | 179 ResourceClientWalker<RawResourceClient> w(m_clients); |
180 while (RawResourceClient* c = w.next()) | 180 while (RawResourceClient* c = w.next()) |
181 c->setSerializedCachedMetadata(this, data, size); | 181 c->setSerializedCachedMetadata(this, data, size); |
182 } | 182 } |
183 | 183 |
184 void RawResource::didSendData(unsigned long long bytesSent, unsigned long long t
otalBytesToBeSent) | 184 void RawResource::didSendData(unsigned long long bytesSent, unsigned long long t
otalBytesToBeSent) |
185 { | 185 { |
186 ResourcePtr<RawResource> protect(this); | 186 RefPtrWillBeRawPtr<RawResource> protect(this); |
187 ResourceClientWalker<RawResourceClient> w(m_clients); | 187 ResourceClientWalker<RawResourceClient> w(m_clients); |
188 while (RawResourceClient* c = w.next()) | 188 while (RawResourceClient* c = w.next()) |
189 c->dataSent(this, bytesSent, totalBytesToBeSent); | 189 c->dataSent(this, bytesSent, totalBytesToBeSent); |
190 } | 190 } |
191 | 191 |
192 void RawResource::didDownloadData(int dataLength) | 192 void RawResource::didDownloadData(int dataLength) |
193 { | 193 { |
194 ResourcePtr<RawResource> protect(this); | 194 RefPtrWillBeRawPtr<RawResource> protect(this); |
195 ResourceClientWalker<RawResourceClient> w(m_clients); | 195 ResourceClientWalker<RawResourceClient> w(m_clients); |
196 while (RawResourceClient* c = w.next()) | 196 while (RawResourceClient* c = w.next()) |
197 c->dataDownloaded(this, dataLength); | 197 c->dataDownloaded(this, dataLength); |
198 } | 198 } |
199 | 199 |
200 void RawResource::reportResourceTimingToClients(const ResourceTimingInfo& info) | 200 void RawResource::reportResourceTimingToClients(const ResourceTimingInfo& info) |
201 { | 201 { |
202 ResourceClientWalker<RawResourceClient> w(m_clients); | 202 ResourceClientWalker<RawResourceClient> w(m_clients); |
203 while (RawResourceClient* c = w.next()) | 203 while (RawResourceClient* c = w.next()) |
204 c->didReceiveResourceTiming(this, info); | 204 c->didReceiveResourceTiming(this, info); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 for (const auto& header : oldHeaders) { | 266 for (const auto& header : oldHeaders) { |
267 AtomicString headerName = header.key; | 267 AtomicString headerName = header.key; |
268 if (!shouldIgnoreHeaderForCacheReuse(headerName) && header.value != newH
eaders.get(headerName)) | 268 if (!shouldIgnoreHeaderForCacheReuse(headerName) && header.value != newH
eaders.get(headerName)) |
269 return false; | 269 return false; |
270 } | 270 } |
271 | 271 |
272 return true; | 272 return true; |
273 } | 273 } |
274 | 274 |
275 } // namespace blink | 275 } // namespace blink |
OLD | NEW |