NS_IMETHODIMP _OldStorage::AsyncEvictStorage(nsICacheEntryDoomCallback* aCallback) { LOG(("_OldStorage::AsyncEvictStorage")); nsresult rv; if (!mAppCache && mOfflineStorage) { // Special casing for pure offline storage if (mLoadInfo->AppId() == nsILoadContextInfo::NO_APP_ID && !mLoadInfo->IsInBrowserElement()) { // Clear everything. nsCOMPtr<nsICacheService> serv = do_GetService(NS_CACHESERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = serv->EvictEntries(nsICache::STORE_OFFLINE); NS_ENSURE_SUCCESS(rv, rv); } else { // Clear app or inbrowser staff. nsCOMPtr<nsIApplicationCacheService> appCacheService = do_GetService(NS_APPLICATIONCACHESERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = appCacheService->DiscardByAppId(mLoadInfo->AppId(), mLoadInfo->IsInBrowserElement()); NS_ENSURE_SUCCESS(rv, rv); } } else { nsCOMPtr<nsICacheSession> session; rv = GetCacheSession(mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); NS_ENSURE_SUCCESS(rv, rv); rv = session->EvictEntries(); NS_ENSURE_SUCCESS(rv, rv); } if (aCallback) { nsRefPtr<DoomCallbackSynchronizer> sync = new DoomCallbackSynchronizer(aCallback); rv = sync->Dispatch(); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }
NS_IMETHODIMP _OldStorage::AsyncDoomURI(nsIURI *aURI, const nsACString & aIdExtension, nsICacheEntryDoomCallback* aCallback) { LOG(("_OldStorage::AsyncDoomURI")); nsresult rv; nsAutoCString cacheKey; rv = AssembleCacheKey(aURI, aIdExtension, cacheKey); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsICacheSession> session; rv = GetCacheSession(mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); NS_ENSURE_SUCCESS(rv, rv); nsRefPtr<DoomCallbackWrapper> cb = aCallback ? new DoomCallbackWrapper(aCallback) : nullptr; rv = session->DoomEntry(cacheKey, cb); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
NS_IMETHODIMP _OldStorage::AsyncEvictStorage(nsICacheEntryDoomCallback* aCallback) { LOG(("_OldStorage::AsyncEvictStorage")); nsresult rv; if (!mAppCache && mOfflineStorage) { // Special casing for pure offline storage if (mLoadInfo->AppId() == nsILoadContextInfo::NO_APP_ID && !mLoadInfo->IsInBrowserElement()) { // Clear everything. nsCOMPtr<nsICacheService> serv = do_GetService(NS_CACHESERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = nsCacheService::GlobalInstance()->EvictEntriesInternal(nsICache::STORE_OFFLINE); NS_ENSURE_SUCCESS(rv, rv); } else { // Clear app or inbrowser staff. nsCOMPtr<nsIApplicationCacheService> appCacheService = do_GetService(NS_APPLICATIONCACHESERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = appCacheService->DiscardByAppId(mLoadInfo->AppId(), mLoadInfo->IsInBrowserElement()); NS_ENSURE_SUCCESS(rv, rv); } } else { if (mAppCache) { nsCOMPtr<nsICacheSession> session; rv = GetCacheSession(EmptyCString(), mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); NS_ENSURE_SUCCESS(rv, rv); rv = session->EvictEntries(); NS_ENSURE_SUCCESS(rv, rv); } else { // Oh, I'll be so happy when session names are gone... nsCOMPtr<nsICacheSession> session; rv = GetCacheSession(NS_LITERAL_CSTRING("http"), mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); NS_ENSURE_SUCCESS(rv, rv); rv = session->EvictEntries(); NS_ENSURE_SUCCESS(rv, rv); rv = GetCacheSession(NS_LITERAL_CSTRING("wyciwyg"), mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); NS_ENSURE_SUCCESS(rv, rv); rv = session->EvictEntries(); NS_ENSURE_SUCCESS(rv, rv); // This clears any data from scheme other then http, wyciwyg or ftp rv = GetCacheSession(EmptyCString(), mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); NS_ENSURE_SUCCESS(rv, rv); rv = session->EvictEntries(); NS_ENSURE_SUCCESS(rv, rv); } } if (aCallback) { RefPtr<DoomCallbackSynchronizer> sync = new DoomCallbackSynchronizer(aCallback); rv = sync->Dispatch(); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }
NS_IMETHODIMP _OldCacheLoad::Run() { LOG(("_OldCacheLoad::Run [this=%p, key=%s, cb=%p]", this, mCacheKey.get(), mCallback.get())); nsresult rv; if (mOpening) { mOpening = false; nsCOMPtr<nsICacheSession> session; rv = GetCacheSession(mScheme, mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); if (NS_SUCCEEDED(rv)) { // AsyncOpenCacheEntry isn't really async when its called on the // cache service thread. nsCacheAccessMode cacheAccess; if (mFlags & nsICacheStorage::OPEN_TRUNCATE) cacheAccess = nsICache::ACCESS_WRITE; else if ((mFlags & nsICacheStorage::OPEN_READONLY) || mAppCache) cacheAccess = nsICache::ACCESS_READ; else cacheAccess = nsICache::ACCESS_READ_WRITE; LOG((" session->AsyncOpenCacheEntry with access=%d", cacheAccess)); bool bypassBusy = mFlags & nsICacheStorage::OPEN_BYPASS_IF_BUSY; if (mSync && cacheAccess == nsICache::ACCESS_WRITE) { nsCOMPtr<nsICacheEntryDescriptor> entry; rv = session->OpenCacheEntry(mCacheKey, cacheAccess, bypassBusy, getter_AddRefs(entry)); nsCacheAccessMode grantedAccess = 0; if (NS_SUCCEEDED(rv)) { entry->GetAccessGranted(&grantedAccess); } return OnCacheEntryAvailable(entry, grantedAccess, rv); } rv = session->AsyncOpenCacheEntry(mCacheKey, cacheAccess, this, bypassBusy); if (NS_SUCCEEDED(rv)) return NS_OK; } // Opening failed, propagate the error to the consumer LOG((" Opening cache entry failed with rv=0x%08x", rv)); mStatus = rv; mNew = false; NS_DispatchToMainThread(this); } else { if (!mCallback) { LOG((" duplicate call, bypassed")); return NS_OK; } if (NS_SUCCEEDED(mStatus)) { if (mFlags & nsICacheStorage::OPEN_TRUNCATE) { mozilla::Telemetry::AccumulateTimeDelta( mozilla::Telemetry::NETWORK_CACHE_V1_TRUNCATE_TIME_MS, mLoadStart); } else if (mNew) { mozilla::Telemetry::AccumulateTimeDelta( mozilla::Telemetry::NETWORK_CACHE_V1_MISS_TIME_MS, mLoadStart); } else { mozilla::Telemetry::AccumulateTimeDelta( mozilla::Telemetry::NETWORK_CACHE_V1_HIT_TIME_MS, mLoadStart); } } if (!(mFlags & CHECK_MULTITHREADED)) Check(); // break cycles nsCOMPtr<nsICacheEntryOpenCallback> cb = mCallback.forget(); mCacheThread = nullptr; nsCOMPtr<nsICacheEntry> entry = mCacheEntry.forget(); rv = cb->OnCacheEntryAvailable(entry, mNew, mAppCache, mStatus); if (NS_FAILED(rv) && entry) { LOG((" cb->OnCacheEntryAvailable failed with rv=0x%08x", rv)); if (mNew) entry->AsyncDoom(nullptr); else entry->Close(); } } return rv; }
NS_IMETHODIMP _OldCacheLoad::Run() { LOG(("_OldCacheLoad::Run [this=%p, key=%s, cb=%p]", this, mCacheKey.get(), mCallback.get())); nsresult rv; if (!NS_IsMainThread()) { nsCOMPtr<nsICacheSession> session; rv = GetCacheSession(mWriteToDisk, mLoadInfo, mAppCache, getter_AddRefs(session)); if (NS_SUCCEEDED(rv)) { // AsyncOpenCacheEntry isn't really async when its called on the // cache service thread. nsCacheAccessMode cacheAccess; if (mFlags & nsICacheStorage::OPEN_TRUNCATE) cacheAccess = nsICache::ACCESS_WRITE; else if ((mFlags & nsICacheStorage::OPEN_READONLY) || mAppCache) cacheAccess = nsICache::ACCESS_READ; else cacheAccess = nsICache::ACCESS_READ_WRITE; LOG((" session->AsyncOpenCacheEntry with access=%d", cacheAccess)); bool bypassBusy = mFlags & nsICacheStorage::OPEN_BYPASS_IF_BUSY; rv = session->AsyncOpenCacheEntry(mCacheKey, cacheAccess, this, bypassBusy); if (NS_SUCCEEDED(rv)) return NS_OK; } // Opening failed, propagate the error to the consumer LOG((" Opening cache entry failed with rv=0x%08x", rv)); mStatus = rv; mNew = false; NS_DispatchToMainThread(this); } else { if (!mCallback) { LOG((" duplicate call, bypassed")); return NS_OK; } if (mMainThreadOnly) Check(); // break cycles nsCOMPtr<nsICacheEntryOpenCallback> cb = mCallback.forget(); mCacheThread = nullptr; nsCOMPtr<nsICacheEntry> entry = mCacheEntry.forget(); rv = cb->OnCacheEntryAvailable(entry, mNew, mAppCache, mStatus); if (NS_FAILED(rv) && entry) { LOG((" cb->OnCacheEntryAvailable failed with rv=0x%08x", rv)); if (mNew) entry->AsyncDoom(nullptr); else entry->Close(); } } return rv; }