| 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 |