void IDBDatabase::CloseInternal() { AssertIsOnOwningThread(); if (!mClosed) { mClosed = true; ExpireFileActors(/* aExpireAll */ true); if (mObserver) { mObserver->Revoke(); nsCOMPtr<nsIObserverService> obsSvc = GetObserverService(); if (obsSvc) { // These might not have been registered. obsSvc->RemoveObserver(mObserver, kCycleCollectionObserverTopic); obsSvc->RemoveObserver(mObserver, kMemoryPressureObserverTopic); MOZ_ALWAYS_TRUE(NS_SUCCEEDED( obsSvc->RemoveObserver(mObserver, kWindowObserverTopic))); } mObserver = nullptr; } if (mBackgroundActor && !mInvalidated) { mBackgroundActor->SendClose(); } } }
void ShutdownComplete() { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(IsEmpty()); nsCOMPtr<nsIObserverService> obs = GetObserverService(); obs->RemoveObserver(this, kShutdownTopic); }
// static already_AddRefed<IDBDatabase> IDBDatabase::Create(IDBOpenDBRequest* aRequest, IDBFactory* aFactory, BackgroundDatabaseChild* aActor, DatabaseSpec* aSpec) { MOZ_ASSERT(aRequest); MOZ_ASSERT(aFactory); aFactory->AssertIsOnOwningThread(); MOZ_ASSERT(aActor); MOZ_ASSERT(aSpec); RefPtr<IDBDatabase> db = new IDBDatabase(aRequest, aFactory, aActor, aSpec); db->SetScriptOwner(aRequest->GetScriptOwner()); if (NS_IsMainThread()) { if (nsPIDOMWindow* window = aFactory->GetParentObject()) { MOZ_ASSERT(window->IsInnerWindow()); uint64_t windowId = window->WindowID(); RefPtr<Observer> observer = new Observer(db, windowId); nsCOMPtr<nsIObserverService> obsSvc = GetObserverService(); MOZ_ASSERT(obsSvc); // This topic must be successfully registered. if (NS_WARN_IF(NS_FAILED( obsSvc->AddObserver(observer, kWindowObserverTopic, false)))) { observer->Revoke(); return nullptr; } // These topics are not crucial. if (NS_FAILED(obsSvc->AddObserver(observer, kCycleCollectionObserverTopic, false)) || NS_FAILED(obsSvc->AddObserver(observer, kMemoryPressureObserverTopic, false))) { NS_WARNING("Failed to add additional memory observers!"); } db->mObserver.swap(observer); } } return db.forget(); }
nsresult PermissionRequestBase::PromptIfNeeded(PermissionValue* aCurrentValue) { AssertSanity(); MOZ_ASSERT(aCurrentValue); MOZ_ASSERT(mPrincipal); // Tricky, we want to release the window and principal in all cases except // when we successfully prompt. nsCOMPtr<Element> element; mOwnerElement.swap(element); nsCOMPtr<nsIPrincipal> principal; mPrincipal.swap(principal); PermissionValue currentValue; nsresult rv = GetCurrentPermission(principal, ¤tValue); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } MOZ_ASSERT(currentValue != kPermissionDefault); if (currentValue == kPermissionPrompt) { nsCOMPtr<nsIObserverService> obsSvc = GetObserverService(); if (NS_WARN_IF(!obsSvc)) { return NS_ERROR_FAILURE; } // We're about to prompt so swap the members back. element.swap(mOwnerElement); principal.swap(mPrincipal); rv = obsSvc->NotifyObservers(static_cast<nsIObserver*>(this), kPermissionPromptTopic, nullptr); if (NS_WARN_IF(NS_FAILED(rv))) { // Finally release if we failed the prompt. mOwnerElement = nullptr; mPrincipal = nullptr; return rv; } } *aCurrentValue = currentValue; return NS_OK; }