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

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: Fix known issues 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 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698