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 RawResourceFactory factory(Resource::ImportResource); | 49 RawResourceFactory factory(Resource::ImportResource); |
50 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::ImportResource))); | 50 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::ImportResource))); |
51 } | 51 } |
52 | 52 |
53 ResourcePtr<RawResource> RawResource::fetch(FetchRequest& request, ResourceFetch
er* fetcher) | 53 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetch(FetchRequest& request, Re
sourceFetcher* fetcher) |
54 { | 54 { |
55 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 55 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
56 ASSERT(request.resourceRequest().requestContext() != WebURLRequest::RequestC
ontextUnspecified); | 56 ASSERT(request.resourceRequest().requestContext() != WebURLRequest::RequestC
ontextUnspecified); |
57 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Raw))); | 57 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Raw))); |
58 } | 58 } |
59 | 59 |
60 ResourcePtr<RawResource> RawResource::fetchMainResource(FetchRequest& request, R
esourceFetcher* fetcher, const SubstituteData& substituteData) | 60 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchMainResource(FetchRequest&
request, ResourceFetcher* fetcher, const SubstituteData& substituteData) |
61 { | 61 { |
62 ASSERT(request.resourceRequest().frameType() != WebURLRequest::FrameTypeNone
); | 62 ASSERT(request.resourceRequest().frameType() != WebURLRequest::FrameTypeNone
); |
63 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 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); |
64 | 64 |
65 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::MainResource), substituteData)); | 65 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::MainResource), substituteData)); |
66 } | 66 } |
67 | 67 |
68 ResourcePtr<RawResource> RawResource::fetchMedia(FetchRequest& request, Resource
Fetcher* fetcher) | 68 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchMedia(FetchRequest& reques
t, ResourceFetcher* fetcher) |
69 { | 69 { |
70 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 70 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
71 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextAudio || request.resourceRequest().requestContext() == WebURLRequest::Requ
estContextVideo); | 71 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextAudio || request.resourceRequest().requestContext() == WebURLRequest::Requ
estContextVideo); |
72 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Media))); | 72 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Media))); |
73 } | 73 } |
74 | 74 |
75 ResourcePtr<RawResource> RawResource::fetchTextTrack(FetchRequest& request, Reso
urceFetcher* fetcher) | 75 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchTextTrack(FetchRequest& re
quest, ResourceFetcher* fetcher) |
76 { | 76 { |
77 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 77 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
78 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textTrack); | 78 request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestCon
textTrack); |
79 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::TextTrack))); | 79 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::TextTrack))); |
80 } | 80 } |
81 | 81 |
82 ResourcePtr<RawResource> RawResource::fetchManifest(FetchRequest& request, Resou
rceFetcher* fetcher) | 82 PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchManifest(FetchRequest& req
uest, ResourceFetcher* fetcher) |
83 { | 83 { |
84 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); | 84 ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone
); |
85 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextManifest); | 85 ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestC
ontextManifest); |
86 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Manifest))); | 86 return toRawResource(fetcher->requestResource(request, RawResourceFactory(Re
source::Manifest))); |
87 } | 87 } |
88 | 88 |
89 RawResource::RawResource(const ResourceRequest& resourceRequest, Type type) | 89 RawResource::RawResource(const ResourceRequest& resourceRequest, Type type) |
90 : Resource(resourceRequest, type) | 90 : Resource(resourceRequest, type) |
91 { | 91 { |
92 } | 92 } |
93 | 93 |
94 void RawResource::appendData(const char* data, size_t length) | 94 void RawResource::appendData(const char* data, size_t length) |
95 { | 95 { |
96 Resource::appendData(data, length); | 96 Resource::appendData(data, length); |
97 | 97 |
98 ResourcePtr<RawResource> protect(this); | 98 RefPtrWillBeRawPtr<RawResource> protect(this); |
99 ResourceClientWalker<RawResourceClient> w(m_clients); | 99 ResourceClientWalker<RawResourceClient> w(m_clients); |
100 while (RawResourceClient* c = w.next()) | 100 while (RawResourceClient* c = w.next()) |
101 c->dataReceived(this, data, length); | 101 c->dataReceived(this, data, length); |
102 } | 102 } |
103 | 103 |
104 void RawResource::didAddClient(ResourceClient* c) | 104 void RawResource::didAddClient(ResourceClient* c) |
105 { | 105 { |
106 if (!hasClient(c)) | 106 if (!hasClient(c)) |
107 return; | 107 return; |
108 // The calls to the client can result in events running, potentially causing | 108 // The calls to the client can result in events running, potentially causing |
109 // this resource to be evicted from the cache and all clients to be removed, | 109 // this resource to be evicted from the cache and all clients to be removed, |
110 // so a protector is necessary. | 110 // so a protector is necessary. |
111 ResourcePtr<RawResource> protect(this); | 111 RefPtrWillBeRawPtr<RawResource> protect(this); |
112 ASSERT(c->resourceClientType() == RawResourceClient::expectedType()); | 112 ASSERT(c->resourceClientType() == RawResourceClient::expectedType()); |
113 RawResourceClient* client = static_cast<RawResourceClient*>(c); | 113 RawResourceClient* client = static_cast<RawResourceClient*>(c); |
114 for (const auto& redirect : redirectChain()) { | 114 for (const auto& redirect : redirectChain()) { |
115 ResourceRequest request(redirect.m_request); | 115 ResourceRequest request(redirect.m_request); |
116 client->redirectReceived(this, request, redirect.m_redirectResponse); | 116 client->redirectReceived(this, request, redirect.m_redirectResponse); |
117 if (!hasClient(c)) | 117 if (!hasClient(c)) |
118 return; | 118 return; |
119 } | 119 } |
120 | 120 |
121 if (!m_response.isNull()) | 121 if (!m_response.isNull()) |
122 client->responseReceived(this, m_response, nullptr); | 122 client->responseReceived(this, m_response, nullptr); |
123 if (!hasClient(c)) | 123 if (!hasClient(c)) |
124 return; | 124 return; |
125 if (m_data) | 125 if (m_data) |
126 client->dataReceived(this, m_data->data(), m_data->size()); | 126 client->dataReceived(this, m_data->data(), m_data->size()); |
127 if (!hasClient(c)) | 127 if (!hasClient(c)) |
128 return; | 128 return; |
129 Resource::didAddClient(client); | 129 Resource::didAddClient(client); |
130 } | 130 } |
131 | 131 |
132 void RawResource::willFollowRedirect(ResourceRequest& newRequest, const Resource
Response& redirectResponse) | 132 void RawResource::willFollowRedirect(ResourceRequest& newRequest, const Resource
Response& redirectResponse) |
133 { | 133 { |
134 ResourcePtr<RawResource> protect(this); | 134 RefPtrWillBeRawPtr<RawResource> protect(this); |
135 ASSERT(!redirectResponse.isNull()); | 135 ASSERT(!redirectResponse.isNull()); |
136 ResourceClientWalker<RawResourceClient> w(m_clients); | 136 ResourceClientWalker<RawResourceClient> w(m_clients); |
137 while (RawResourceClient* c = w.next()) | 137 while (RawResourceClient* c = w.next()) |
138 c->redirectReceived(this, newRequest, redirectResponse); | 138 c->redirectReceived(this, newRequest, redirectResponse); |
139 Resource::willFollowRedirect(newRequest, redirectResponse); | 139 Resource::willFollowRedirect(newRequest, redirectResponse); |
140 } | 140 } |
141 | 141 |
142 void RawResource::updateRequest(const ResourceRequest& request) | 142 void RawResource::updateRequest(const ResourceRequest& request) |
143 { | 143 { |
144 ResourcePtr<RawResource> protect(this); | 144 RefPtrWillBeRawPtr<RawResource> protect(this); |
145 ResourceClientWalker<RawResourceClient> w(m_clients); | 145 ResourceClientWalker<RawResourceClient> w(m_clients); |
146 while (RawResourceClient* c = w.next()) | 146 while (RawResourceClient* c = w.next()) |
147 c->updateRequest(this, request); | 147 c->updateRequest(this, request); |
148 } | 148 } |
149 | 149 |
150 void RawResource::responseReceived(const ResourceResponse& response, PassOwnPtr<
WebDataConsumerHandle> handle) | 150 void RawResource::responseReceived(const ResourceResponse& response, PassOwnPtr<
WebDataConsumerHandle> handle) |
151 { | 151 { |
152 InternalResourcePtr protect(this); | 152 RefPtrWillBeRawPtr<RawResource> protect(this); |
153 | 153 |
154 bool isSuccessfulRevalidation = isCacheValidator() && response.httpStatusCod
e() == 304; | 154 bool isSuccessfulRevalidation = isCacheValidator() && response.httpStatusCod
e() == 304; |
155 Resource::responseReceived(response, nullptr); | 155 Resource::responseReceived(response, nullptr); |
156 | 156 |
157 ResourceClientWalker<RawResourceClient> w(m_clients); | 157 ResourceClientWalker<RawResourceClient> w(m_clients); |
158 ASSERT(count() <= 1 || !handle); | 158 ASSERT(count() <= 1 || !handle); |
159 while (RawResourceClient* c = w.next()) { | 159 while (RawResourceClient* c = w.next()) { |
160 // |handle| is cleared when passed, but it's not a problem because | 160 // |handle| is cleared when passed, but it's not a problem because |
161 // |handle| is null when there are two or more clients, as asserted. | 161 // |handle| is null when there are two or more clients, as asserted. |
162 c->responseReceived(this, m_response, handle); | 162 c->responseReceived(this, m_response, handle); |
163 } | 163 } |
164 | 164 |
165 // If we successfully revalidated, we won't get appendData() calls. | 165 // If we successfully revalidated, we won't get appendData() calls. |
166 // Forward the data to clients now instead. | 166 // Forward the data to clients now instead. |
167 // Note: |m_data| can be null when no data is appended to the original | 167 // Note: |m_data| can be null when no data is appended to the original |
168 // resource. | 168 // resource. |
169 if (isSuccessfulRevalidation && m_data) { | 169 if (isSuccessfulRevalidation && m_data) { |
170 ResourceClientWalker<RawResourceClient> w(m_clients); | 170 ResourceClientWalker<RawResourceClient> w(m_clients); |
171 while (RawResourceClient* c = w.next()) | 171 while (RawResourceClient* c = w.next()) |
172 c->dataReceived(this, m_data->data(), m_data->size()); | 172 c->dataReceived(this, m_data->data(), m_data->size()); |
173 } | 173 } |
174 } | 174 } |
175 | 175 |
176 void RawResource::setSerializedCachedMetadata(const char* data, size_t size) | 176 void RawResource::setSerializedCachedMetadata(const char* data, size_t size) |
177 { | 177 { |
178 ResourcePtr<RawResource> protect(this); | 178 RefPtrWillBeRawPtr<RawResource> protect(this); |
179 Resource::setSerializedCachedMetadata(data, size); | 179 Resource::setSerializedCachedMetadata(data, size); |
180 ResourceClientWalker<RawResourceClient> w(m_clients); | 180 ResourceClientWalker<RawResourceClient> w(m_clients); |
181 while (RawResourceClient* c = w.next()) | 181 while (RawResourceClient* c = w.next()) |
182 c->setSerializedCachedMetadata(this, data, size); | 182 c->setSerializedCachedMetadata(this, data, size); |
183 } | 183 } |
184 | 184 |
185 void RawResource::didSendData(unsigned long long bytesSent, unsigned long long t
otalBytesToBeSent) | 185 void RawResource::didSendData(unsigned long long bytesSent, unsigned long long t
otalBytesToBeSent) |
186 { | 186 { |
187 ResourcePtr<RawResource> protect(this); | 187 RefPtrWillBeRawPtr<RawResource> protect(this); |
188 ResourceClientWalker<RawResourceClient> w(m_clients); | 188 ResourceClientWalker<RawResourceClient> w(m_clients); |
189 while (RawResourceClient* c = w.next()) | 189 while (RawResourceClient* c = w.next()) |
190 c->dataSent(this, bytesSent, totalBytesToBeSent); | 190 c->dataSent(this, bytesSent, totalBytesToBeSent); |
191 } | 191 } |
192 | 192 |
193 void RawResource::didDownloadData(int dataLength) | 193 void RawResource::didDownloadData(int dataLength) |
194 { | 194 { |
195 ResourcePtr<RawResource> protect(this); | 195 RefPtrWillBeRawPtr<RawResource> protect(this); |
196 ResourceClientWalker<RawResourceClient> w(m_clients); | 196 ResourceClientWalker<RawResourceClient> w(m_clients); |
197 while (RawResourceClient* c = w.next()) | 197 while (RawResourceClient* c = w.next()) |
198 c->dataDownloaded(this, dataLength); | 198 c->dataDownloaded(this, dataLength); |
199 } | 199 } |
200 | 200 |
201 void RawResource::reportResourceTimingToClients(const ResourceTimingInfo& info) | 201 void RawResource::reportResourceTimingToClients(const ResourceTimingInfo& info) |
202 { | 202 { |
203 ResourceClientWalker<RawResourceClient> w(m_clients); | 203 ResourceClientWalker<RawResourceClient> w(m_clients); |
204 while (RawResourceClient* c = w.next()) | 204 while (RawResourceClient* c = w.next()) |
205 c->didReceiveResourceTiming(this, info); | 205 c->didReceiveResourceTiming(this, info); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 for (const auto& header : oldHeaders) { | 267 for (const auto& header : oldHeaders) { |
268 AtomicString headerName = header.key; | 268 AtomicString headerName = header.key; |
269 if (!shouldIgnoreHeaderForCacheReuse(headerName) && header.value != newH
eaders.get(headerName)) | 269 if (!shouldIgnoreHeaderForCacheReuse(headerName) && header.value != newH
eaders.get(headerName)) |
270 return false; | 270 return false; |
271 } | 271 } |
272 | 272 |
273 return true; | 273 return true; |
274 } | 274 } |
275 | 275 |
276 } // namespace blink | 276 } // namespace blink |
OLD | NEW |