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