NS_IMETHODIMP nsDOMOfflineResourceList::MozRemove(const nsAString& aURI) { nsresult rv = Init(); NS_ENSURE_SUCCESS(rv, rv); if (!nsContentUtils::OfflineAppAllowed(mDocumentURI)) { return NS_ERROR_DOM_SECURITY_ERR; } nsCOMPtr<nsIApplicationCache> appCache = GetDocumentAppCache(); if (!appCache) { return NS_ERROR_DOM_INVALID_STATE_ERR; } nsCAutoString key; rv = GetCacheKey(aURI, key); NS_ENSURE_SUCCESS(rv, rv); ClearCachedKeys(); // XXX: This is a race condition. remove() is specced to remove // from the currently associated application cache, but if this // happens during an update (or after an update, if we haven't // swapped yet), that remove() will be lost when the next update is // finished. Need to bring this issue up. rv = appCache->UnmarkEntry(key, nsIApplicationCache::ITEM_DYNAMIC); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
NS_IMETHODIMP nsDOMOfflineResourceList::SwapCache() { nsresult rv = Init(); NS_ENSURE_SUCCESS(rv, rv); if (!nsContentUtils::OfflineAppAllowed(mDocumentURI)) { return NS_ERROR_DOM_SECURITY_ERR; } nsCOMPtr<nsIApplicationCache> currentAppCache = GetDocumentAppCache(); if (!currentAppCache) { return NS_ERROR_DOM_INVALID_STATE_ERR; } // Check the current and potentially newly available cache are not identical. if (mAvailableApplicationCache == currentAppCache) { return NS_ERROR_DOM_INVALID_STATE_ERR; } if (mAvailableApplicationCache) { nsCString currClientId, availClientId; currentAppCache->GetClientID(currClientId); mAvailableApplicationCache->GetClientID(availClientId); if (availClientId == currClientId) return NS_ERROR_DOM_INVALID_STATE_ERR; } ClearCachedKeys(); nsCOMPtr<nsIApplicationCacheContainer> appCacheContainer = GetDocumentAppCacheContainer(); // In the case of an obsolete cache group, newAppCache might be null. // We will disassociate from the cache in that case. if (appCacheContainer) { rv = appCacheContainer->SetApplicationCache(mAvailableApplicationCache); NS_ENSURE_SUCCESS(rv, rv); } mAvailableApplicationCache = nsnull; mStatus = nsIDOMOfflineResourceList::IDLE; return NS_OK; }
NS_IMETHODIMP nsDOMOfflineResourceList::SwapCache() { nsresult rv = Init(); NS_ENSURE_SUCCESS(rv, rv); if (!nsContentUtils::OfflineAppAllowed(mDocumentURI)) { return NS_ERROR_DOM_SECURITY_ERR; } nsCOMPtr<nsIApplicationCacheService> serv = do_GetService(NS_APPLICATIONCACHESERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIApplicationCache> currentAppCache = GetDocumentAppCache(); nsCOMPtr<nsIApplicationCache> newAppCache; rv = serv->GetActiveCache(mManifestSpec, getter_AddRefs(newAppCache)); NS_ENSURE_SUCCESS(rv, rv); // In the case of an obsolete cache group, newAppCache might be null. // We will disassociate from the cache in that case. if (newAppCache == currentAppCache) { return NS_ERROR_DOM_INVALID_STATE_ERR; } ClearCachedKeys(); nsCOMPtr<nsIApplicationCacheContainer> appCacheContainer = GetDocumentAppCacheContainer(); if (appCacheContainer) { rv = appCacheContainer->SetApplicationCache(newAppCache); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }
NS_IMETHODIMP nsDOMOfflineResourceList::MozAdd(const nsAString& aURI) { nsresult rv = Init(); NS_ENSURE_SUCCESS(rv, rv); if (!nsContentUtils::OfflineAppAllowed(mDocumentURI)) { return NS_ERROR_DOM_SECURITY_ERR; } nsCOMPtr<nsIApplicationCache> appCache = GetDocumentAppCache(); if (!appCache) { return NS_ERROR_DOM_INVALID_STATE_ERR; } if (aURI.Length() > MAX_URI_LENGTH) return NS_ERROR_DOM_BAD_URI; // this will fail if the URI is not absolute nsCOMPtr<nsIURI> requestedURI; rv = NS_NewURI(getter_AddRefs(requestedURI), aURI); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString scheme; rv = requestedURI->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); PRBool match; rv = mManifestURI->SchemeIs(scheme.get(), &match); NS_ENSURE_SUCCESS(rv, rv); if (!match) { return NS_ERROR_DOM_SECURITY_ERR; } PRUint32 length; rv = GetMozLength(&length); NS_ENSURE_SUCCESS(rv, rv); PRUint32 maxEntries = nsContentUtils::GetIntPref(kMaxEntriesPref, DEFAULT_MAX_ENTRIES); if (length > maxEntries) return NS_ERROR_NOT_AVAILABLE; ClearCachedKeys(); nsCOMPtr<nsIOfflineCacheUpdate> update = do_CreateInstance(NS_OFFLINECACHEUPDATE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString clientID; rv = appCache->GetClientID(clientID); NS_ENSURE_SUCCESS(rv, rv); rv = update->InitPartial(mManifestURI, clientID, mDocumentURI); NS_ENSURE_SUCCESS(rv, rv); rv = update->AddDynamicURI(requestedURI); NS_ENSURE_SUCCESS(rv, rv); rv = update->Schedule(); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
nsDOMOfflineResourceList::~nsDOMOfflineResourceList() { ClearCachedKeys(); }