// static nsresult IDBFactory::Create(JSContext* aCx, JSObject* aOwningObject, IDBFactory** aFactory) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(aCx, "Null context!"); NS_ASSERTION(aOwningObject, "Null object!"); NS_ASSERTION(JS_GetGlobalForObject(aCx, aOwningObject) == aOwningObject, "Not a global object!"); NS_ASSERTION(nsContentUtils::IsCallerChrome(), "Only for chrome!"); nsCString origin; nsresult rv = IndexedDatabaseManager::GetASCIIOriginFromWindow(nsnull, origin); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); nsRefPtr<IDBFactory> factory = new IDBFactory(); factory->mASCIIOrigin = origin; factory->mOwningObject = aOwningObject; if (!IndexedDatabaseManager::IsMainProcess()) { ContentChild* contentChild = ContentChild::GetSingleton(); NS_ENSURE_TRUE(contentChild, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); IndexedDBChild* actor = new IndexedDBChild(origin); contentChild->SendPIndexedDBConstructor(actor); actor->SetFactory(factory); } factory.forget(aFactory); return NS_OK; }
// 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(JSContext* aCx, JS::Handle<JSObject*> aOwningObject, ContentParent* aContentParent, IDBFactory** aFactory) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(aCx, "Null context!"); NS_ASSERTION(aOwningObject, "Null object!"); NS_ASSERTION(JS_GetGlobalForObject(aCx, aOwningObject) == aOwningObject, "Not a global object!"); NS_ASSERTION(nsContentUtils::IsCallerChrome(), "Only for chrome!"); // Make sure that the manager is up before we do anything here since lots of // decisions depend on which process we're running in. IndexedDatabaseManager* mgr = IndexedDatabaseManager::GetOrCreate(); IDB_ENSURE_TRUE(mgr, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); nsCString group; nsCString origin; StoragePrivilege privilege; PersistenceType defaultPersistenceType; QuotaManager::GetInfoForChrome(&group, &origin, &privilege, &defaultPersistenceType); nsRefPtr<IDBFactory> factory = new IDBFactory(); factory->mGroup = group; factory->mASCIIOrigin = origin; factory->mPrivilege = privilege; factory->mDefaultPersistenceType = defaultPersistenceType; factory->mOwningObject = aOwningObject; factory->mContentParent = aContentParent; mozilla::HoldJSObjects(factory.get()); factory->mRootedOwningObject = true; if (!IndexedDatabaseManager::IsMainProcess()) { ContentChild* contentChild = ContentChild::GetSingleton(); IDB_ENSURE_TRUE(contentChild, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); IndexedDBChild* actor = new IndexedDBChild(origin); contentChild->SendPIndexedDBConstructor(actor); actor->SetFactory(factory); } factory.forget(aFactory); return NS_OK; }
// static nsresult IDBFactory::Create(JSContext* aCx, JS::Handle<JSObject*> aOwningObject, ContentParent* aContentParent, IDBFactory** aFactory) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(aCx, "Null context!"); NS_ASSERTION(aOwningObject, "Null object!"); NS_ASSERTION(JS_GetGlobalForObject(aCx, aOwningObject) == aOwningObject, "Not a global object!"); NS_ASSERTION(nsContentUtils::IsCallerChrome(), "Only for chrome!"); nsCString group; nsCString origin; StoragePrivilege privilege; PersistenceType defaultPersistenceType; QuotaManager::GetInfoForChrome(&group, &origin, &privilege, &defaultPersistenceType); nsRefPtr<IDBFactory> factory = new IDBFactory(); factory->mGroup = group; factory->mASCIIOrigin = origin; factory->mPrivilege = privilege; factory->mDefaultPersistenceType = defaultPersistenceType; factory->mOwningObject = aOwningObject; factory->mContentParent = aContentParent; if (!IndexedDatabaseManager::IsMainProcess()) { ContentChild* contentChild = ContentChild::GetSingleton(); NS_ENSURE_TRUE(contentChild, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); IndexedDBChild* actor = new IndexedDBChild(origin); contentChild->SendPIndexedDBConstructor(actor); 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; }