StorageNamespaceImpl::~StorageNamespaceImpl() { ASSERT(isMainThread() || pthread_main_np()); if (m_storageType == LocalStorage) { ASSERT(localStorageNamespaceMap().get(m_path) == this); localStorageNamespaceMap().remove(m_path); } if (!m_isShutdown) close(); }
PassRefPtr<StorageNamespace> StorageNamespaceImpl::localStorageNamespace(const String& path, unsigned quota) { const String lookupPath = path.isNull() ? String("") : path; LocalStorageNamespaceMap::iterator it = localStorageNamespaceMap().find(lookupPath); if (it == localStorageNamespaceMap().end()) { RefPtr<StorageNamespace> storageNamespace = adoptRef(new StorageNamespaceImpl(LocalStorage, lookupPath, quota)); localStorageNamespaceMap().set(lookupPath, storageNamespace.get()); return storageNamespace.release(); } return it->second; }
Ref<StorageNamespaceImpl> StorageNamespaceImpl::getOrCreateLocalStorageNamespace(const String& databasePath, unsigned quota) { ASSERT(!databasePath.isNull()); auto& slot = localStorageNamespaceMap().add(databasePath, nullptr).iterator->value; if (slot) return *slot; Ref<StorageNamespaceImpl> storageNamespace = adoptRef(*new StorageNamespaceImpl(LocalStorage, databasePath, quota)); slot = storageNamespace.ptr(); return storageNamespace; }
PassRefPtr<StorageNamespace> StorageNamespaceImpl::localStorageNamespace(PageGroup* pageGroup) { // Need a page in this page group to query the settings for the local storage database path. // Having these parameters attached to the page settings is unfortunate since these settings are // not per-page (and, in fact, we simply grab the settings from some page at random), but // at this point we're stuck with it. Page* page = *pageGroup->pages().begin(); const String& path = page->settings()->localStorageDatabasePath(); unsigned quota = pageGroup->groupSettings()->localStorageQuotaBytes(); const String lookupPath = path.isNull() ? emptyString() : path; LocalStorageNamespaceMap::AddResult result = localStorageNamespaceMap().add(lookupPath, 0); if (!result.isNewEntry) return result.iterator->value; RefPtr<StorageNamespace> storageNamespace = adoptRef(new StorageNamespaceImpl(LocalStorage, lookupPath, quota)); result.iterator->value = storageNamespace.get(); return storageNamespace.release(); }