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