Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: third_party/WebKit/Source/core/fetch/RawResource.cpp

Issue 1667843003: Make Resource RefCountedWillBeGarbageCollectedFinalized, attempt #2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase + address review comments Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/fetch/RawResource.h ('k') | third_party/WebKit/Source/core/fetch/RawResourceTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698