void ResourceLoader::didFail(const ResourceError& error) { if (wasCancelled()) return; ASSERT(!m_reachedTerminalState); // Protect this in this delegate method since the additional processing can do // anything including possibly derefing this; one example of this is Radar 3266216. Ref<ResourceLoader> protect(*this); cleanupForError(error); releaseResources(); }
void ResourceLoader::cancel(const ResourceError& error) { // If the load has already completed - succeeded, failed, or previously cancelled - do nothing. if (m_reachedTerminalState) return; ResourceError nonNullError = error.isNull() ? cancelledError() : error; // willCancel() and didFailToLoad() both call out to clients that might do // something causing the last reference to this object to go away. Ref<ResourceLoader> protect(*this); // If we re-enter cancel() from inside willCancel(), we want to pick up from where we left // off without re-running willCancel() if (m_cancellationStatus == NotCancelled) { m_cancellationStatus = CalledWillCancel; willCancel(nonNullError); } // If we re-enter cancel() from inside didFailToLoad(), we want to pick up from where we // left off without redoing any of this work. if (m_cancellationStatus == CalledWillCancel) { m_cancellationStatus = Cancelled; if (m_handle) m_handle->clearAuthentication(); m_documentLoader->cancelPendingSubstituteLoad(this); if (m_handle) { m_handle->cancel(); m_handle = 0; } cleanupForError(nonNullError); } // If cancel() completed from within the call to willCancel() or didFailToLoad(), // we don't want to redo didCancel() or releasesResources(). if (m_reachedTerminalState) return; didCancel(nonNullError); if (m_cancellationStatus == FinishedCancel) return; m_cancellationStatus = FinishedCancel; releaseResources(); }
void SubresourceLoader::didFail(const ResourceError& error) { if (m_state != Initialized) return; ASSERT(!reachedTerminalState()); LOG(ResourceLoading, "Failed to load '%s'.\n", m_resource->url().string().latin1().data()); Ref<SubresourceLoader> protect(*this); CachedResourceHandle<CachedResource> protectResource(m_resource); m_state = Finishing; if (m_resource->resourceToRevalidate()) memoryCache()->revalidationFailed(m_resource); m_resource->setResourceError(error); if (!m_resource->isPreloaded()) memoryCache()->remove(m_resource); m_resource->error(CachedResource::LoadError); cleanupForError(error); notifyDone(); if (reachedTerminalState()) return; releaseResources(); }