// static nsresult IDBFactory::Create(nsPIDOMWindow* aWindow, const nsACString& aASCIIOrigin, IDBFactory** aFactory) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(aASCIIOrigin.IsEmpty() || nsContentUtils::IsCallerChrome(), "Non-chrome may not supply their own origin!"); NS_ENSURE_TRUE(aWindow, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); if (aWindow->IsOuterWindow()) { aWindow = aWindow->GetCurrentInnerWindow(); NS_ENSURE_TRUE(aWindow, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); } // Make sure that the manager is up before we do anything here since lots of // decisions depend on which process we're running in. nsRefPtr<indexedDB::IndexedDatabaseManager> mgr = indexedDB::IndexedDatabaseManager::GetOrCreate(); NS_ENSURE_TRUE(mgr, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); nsresult rv; nsCString origin(aASCIIOrigin); if (origin.IsEmpty()) { rv = IndexedDatabaseManager::GetASCIIOriginFromWindow(aWindow, origin); if (NS_FAILED(rv)) { // Not allowed. *aFactory = nsnull; return NS_OK; } } nsRefPtr<IDBFactory> factory = new IDBFactory(); factory->mASCIIOrigin = origin; factory->mWindow = aWindow; if (!IndexedDatabaseManager::IsMainProcess()) { TabChild* tabChild = GetTabChildFrom(aWindow); NS_ENSURE_TRUE(tabChild, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); IndexedDBChild* actor = new IndexedDBChild(origin); bool allowed; tabChild->SendPIndexedDBConstructor(actor, origin, &allowed); if (!allowed) { actor->Send__delete__(actor); *aFactory = nsnull; return NS_OK; } actor->SetFactory(factory); } factory.forget(aFactory); return NS_OK; }
// static nsresult IDBFactory::Create(nsPIDOMWindow* aWindow, const nsACString& aGroup, const nsACString& aASCIIOrigin, ContentParent* aContentParent, IDBFactory** aFactory) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(aASCIIOrigin.IsEmpty() || nsContentUtils::IsCallerChrome(), "Non-chrome may not supply their own origin!"); NS_ENSURE_TRUE(aWindow, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); if (aWindow->IsOuterWindow()) { aWindow = aWindow->GetCurrentInnerWindow(); NS_ENSURE_TRUE(aWindow, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); } // Make sure that the manager is up before we do anything here since lots of // decisions depend on which process we're running in. indexedDB::IndexedDatabaseManager* mgr = indexedDB::IndexedDatabaseManager::GetOrCreate(); NS_ENSURE_TRUE(mgr, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); nsresult rv; nsCString group(aGroup); nsCString origin(aASCIIOrigin); StoragePrivilege privilege; PersistenceType defaultPersistenceType; if (origin.IsEmpty()) { NS_ASSERTION(aGroup.IsEmpty(), "Should be empty too!"); rv = QuotaManager::GetInfoFromWindow(aWindow, &group, &origin, &privilege, &defaultPersistenceType); } else { rv = QuotaManager::GetInfoFromWindow(aWindow, nullptr, nullptr, &privilege, &defaultPersistenceType); } if (NS_FAILED(rv)) { // Not allowed. *aFactory = nullptr; return NS_OK; } nsRefPtr<IDBFactory> factory = new IDBFactory(); factory->mGroup = group; factory->mASCIIOrigin = origin; factory->mPrivilege = privilege; factory->mDefaultPersistenceType = defaultPersistenceType; factory->mWindow = aWindow; factory->mContentParent = aContentParent; if (!IndexedDatabaseManager::IsMainProcess()) { TabChild* tabChild = TabChild::GetFrom(aWindow); NS_ENSURE_TRUE(tabChild, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); IndexedDBChild* actor = new IndexedDBChild(origin); bool allowed; tabChild->SendPIndexedDBConstructor(actor, group, origin, &allowed); if (!allowed) { actor->Send__delete__(actor); *aFactory = nullptr; return NS_OK; } actor->SetFactory(factory); } factory.forget(aFactory); return NS_OK; }