nsresult ParentRunnable::ReadMetadata() { AssertIsOnIOThread(); MOZ_ASSERT(mState == eReadyToReadMetadata); QuotaManager* qm = QuotaManager::Get(); MOZ_ASSERT(qm, "We are on the QuotaManager's IO thread"); nsresult rv = qm->EnsureOriginIsInitialized(quota::PERSISTENCE_TYPE_TEMPORARY, mSuffix, mGroup, mOrigin, getter_AddRefs(mDirectory)); if (NS_WARN_IF(NS_FAILED(rv))) { mResult = JS::AsmJSCache_StorageInitFailure; return rv; } rv = mDirectory->Append(NS_LITERAL_STRING(ASMJSCACHE_DIRECTORY_NAME)); NS_ENSURE_SUCCESS(rv, rv); bool exists; rv = mDirectory->Exists(&exists); NS_ENSURE_SUCCESS(rv, rv); if (!exists) { rv = mDirectory->Create(nsIFile::DIRECTORY_TYPE, 0755); NS_ENSURE_SUCCESS(rv, rv); } else { DebugOnly<bool> isDirectory; MOZ_ASSERT(NS_SUCCEEDED(mDirectory->IsDirectory(&isDirectory))); MOZ_ASSERT(isDirectory, "Should have caught this earlier!"); } rv = mDirectory->Clone(getter_AddRefs(mMetadataFile)); NS_ENSURE_SUCCESS(rv, rv); rv = mMetadataFile->Append(NS_LITERAL_STRING(ASMJSCACHE_METADATA_FILE_NAME)); NS_ENSURE_SUCCESS(rv, rv); rv = mMetadataFile->Exists(&exists); NS_ENSURE_SUCCESS(rv, rv); if (exists && NS_FAILED(ReadMetadataFile(mMetadataFile, mMetadata))) { exists = false; } if (!exists) { // If we are reading, we can't possibly have a cache hit. if (mOpenMode == eOpenForRead) { return NS_ERROR_FILE_NOT_FOUND; } // Initialize Metadata with a valid empty state for the LRU cache. for (unsigned i = 0; i < Metadata::kNumEntries; i++) { Metadata::Entry& entry = mMetadata.mEntries[i]; entry.mModuleIndex = i; entry.clear(); } } return NS_OK; }