OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 } | 139 } |
140 | 140 |
141 DocumentThreadableLoader::~DocumentThreadableLoader() | 141 DocumentThreadableLoader::~DocumentThreadableLoader() |
142 { | 142 { |
143 if (m_resource) | 143 if (m_resource) |
144 m_resource->removeClient(this); | 144 m_resource->removeClient(this); |
145 } | 145 } |
146 | 146 |
147 void DocumentThreadableLoader::cancel() | 147 void DocumentThreadableLoader::cancel() |
148 { | 148 { |
149 if (m_client) { | 149 // Cacnel can re-enter and m_resource might be null here as a result. |
| 150 if (m_client && m_resource) { |
150 ResourceError error(errorDomainWebKitInternal, 0, m_resource->url(), "Lo
ad cancelled"); | 151 ResourceError error(errorDomainWebKitInternal, 0, m_resource->url(), "Lo
ad cancelled"); |
151 error.setIsCancellation(true); | 152 error.setIsCancellation(true); |
152 didFail(error); | 153 didFail(error); |
153 } | 154 } |
154 clearResource(); | 155 clearResource(); |
155 m_client = 0; | 156 m_client = 0; |
156 } | 157 } |
157 | 158 |
158 void DocumentThreadableLoader::setDefersLoading(bool value) | 159 void DocumentThreadableLoader::setDefersLoading(bool value) |
159 { | 160 { |
160 if (m_resource) | 161 if (m_resource) |
161 m_resource->setDefersLoading(value); | 162 m_resource->setDefersLoading(value); |
162 } | 163 } |
163 | 164 |
164 void DocumentThreadableLoader::clearResource() | 165 void DocumentThreadableLoader::clearResource() |
165 { | 166 { |
166 if (m_resource) { | 167 // Script can cancel and restart a request reentrantly within removeClient()
, |
167 m_resource->removeClient(this); | 168 // which could lead to calling CachedResource::removeClient() multiple times
for |
| 169 // this DocumentThreadableLoader. Save off a copy of m_resource and clear it
to |
| 170 // prevent the reentrancy. |
| 171 if (CachedResourceHandle<CachedRawResource> resource = m_resource) { |
168 m_resource = 0; | 172 m_resource = 0; |
| 173 resource->removeClient(this); |
169 } | 174 } |
170 } | 175 } |
171 | 176 |
172 void DocumentThreadableLoader::redirectReceived(CachedResource* resource, Resour
ceRequest& request, const ResourceResponse& redirectResponse) | 177 void DocumentThreadableLoader::redirectReceived(CachedResource* resource, Resour
ceRequest& request, const ResourceResponse& redirectResponse) |
173 { | 178 { |
174 ASSERT(m_client); | 179 ASSERT(m_client); |
175 ASSERT_UNUSED(resource, resource == m_resource); | 180 ASSERT_UNUSED(resource, resource == m_resource); |
176 | 181 |
177 RefPtr<DocumentThreadableLoader> protect(this); | 182 RefPtr<DocumentThreadableLoader> protect(this); |
178 // Allow same origin requests to continue after allowing clients to audit th
e redirect. | 183 // Allow same origin requests to continue after allowing clients to audit th
e redirect. |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 | 428 |
424 return m_sameOriginRequest && securityOrigin()->canRequest(url); | 429 return m_sameOriginRequest && securityOrigin()->canRequest(url); |
425 } | 430 } |
426 | 431 |
427 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const | 432 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const |
428 { | 433 { |
429 return m_options.securityOrigin ? m_options.securityOrigin.get() : m_documen
t->securityOrigin(); | 434 return m_options.securityOrigin ? m_options.securityOrigin.get() : m_documen
t->securityOrigin(); |
430 } | 435 } |
431 | 436 |
432 } // namespace WebCore | 437 } // namespace WebCore |
OLD | NEW |