void CachedResource::removeClient(CachedResourceClient* client) { OwnPtr<CachedResourceCallback> callback = m_clientsAwaitingCallback.take(client); if (callback) { ASSERT(!m_clients.contains(client)); callback->cancel(); callback.clear(); } else { ASSERT(m_clients.contains(client)); m_clients.remove(client); didRemoveClient(client); } bool deleted = deleteIfPossible(); if (!deleted && !hasClients()) { if (inCache()) { memoryCache()->removeFromLiveResourcesSize(this); memoryCache()->removeFromLiveDecodedResourcesList(this); } if (!m_switchingClientsToRevalidatedResource) allClientsRemoved(); destroyDecodedDataIfNeeded(); if (response().cacheControlContainsNoStore() && url().protocolIs("https")) { // RFC2616 14.9.2: // "no-store: ... MUST make a best-effort attempt to remove the information from volatile storage as promptly as possible" // "... History buffers MAY store such responses as part of their normal operation." // We allow non-secure content to be reused in history, but we do not allow secure content to be reused. memoryCache()->remove(this); } memoryCache()->prune(); } // This object may be dead here. }
void CachedResource::removeClient(CachedResourceClient& client) { auto callback = m_clientsAwaitingCallback.take(&client); if (callback) { ASSERT(!m_clients.contains(&client)); callback->cancel(); callback = nullptr; } else { ASSERT(m_clients.contains(&client)); m_clients.remove(&client); didRemoveClient(client); } if (deleteIfPossible()) { // `this` object is dead here. return; } if (hasClients()) return; auto& memoryCache = MemoryCache::singleton(); if (allowsCaching() && inCache()) { memoryCache.removeFromLiveResourcesSize(*this); memoryCache.removeFromLiveDecodedResourcesList(*this); } if (!m_switchingClientsToRevalidatedResource) allClientsRemoved(); destroyDecodedDataIfNeeded(); if (!allowsCaching()) return; if (response().cacheControlContainsNoStore() && url().protocolIs("https")) { // RFC2616 14.9.2: // "no-store: ... MUST make a best-effort attempt to remove the information from volatile storage as promptly as possible" // "... History buffers MAY store such responses as part of their normal operation." // We allow non-secure content to be reused in history, but we do not allow secure content to be reused. memoryCache.remove(*this); } memoryCache.pruneSoon(); }