template<class Super> bool Parent<Super>::RecvSanitizeOriginKeys(const uint64_t& aSinceWhen, const bool& aOnlyPrivateBrowsing) { MOZ_ASSERT(NS_IsMainThread()); nsCOMPtr<nsIFile> profileDir; nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(profileDir)); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } // Over to stream-transport thread to do the file io. nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); MOZ_ASSERT(sts); RefPtr<OriginKeyStore> store(mOriginKeyStore); rv = sts->Dispatch(NewRunnableFrom([profileDir, store, aSinceWhen, aOnlyPrivateBrowsing]() -> nsresult { MOZ_ASSERT(!NS_IsMainThread()); store->mPrivateBrowsingOriginKeys.Clear(aSinceWhen); if (!aOnlyPrivateBrowsing) { store->mOriginKeys.SetProfileDir(profileDir); store->mOriginKeys.Clear(aSinceWhen); } return NS_OK; }), NS_DISPATCH_NORMAL); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } return true; }
template<class Super> bool Parent<Super>::RecvGetOriginKey(const uint32_t& aRequestId, const nsCString& aOrigin, const bool& aPrivateBrowsing, const bool& aPersist) { MOZ_ASSERT(NS_IsMainThread()); // First, get profile dir. MOZ_ASSERT(NS_IsMainThread()); nsCOMPtr<nsIFile> profileDir; nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(profileDir)); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } // Then over to stream-transport thread to do the actual file io. // Stash a pledge to hold the answer and get an id for this request. RefPtr<Pledge<nsCString>> p = new Pledge<nsCString>(); uint32_t id = mOutstandingPledges.Append(*p); nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); MOZ_ASSERT(sts); RefPtr<OriginKeyStore> store(mOriginKeyStore); bool sameProcess = mSameProcess; rv = sts->Dispatch(NewRunnableFrom([id, profileDir, store, sameProcess, aOrigin, aPrivateBrowsing, aPersist]() -> nsresult { MOZ_ASSERT(!NS_IsMainThread()); store->mOriginKeys.SetProfileDir(profileDir); nsCString result; if (aPrivateBrowsing) { store->mPrivateBrowsingOriginKeys.GetOriginKey(aOrigin, result); } else { store->mOriginKeys.GetOriginKey(aOrigin, result, aPersist); } // Pass result back to main thread. nsresult rv; rv = NS_DispatchToMainThread(NewRunnableFrom([id, store, sameProcess, result]() -> nsresult { Parent* parent = GccGetSingleton<Super>(); // GetSingleton(); if (!parent) { return NS_OK; } RefPtr<Pledge<nsCString>> p = parent->mOutstandingPledges.Remove(id); if (!p) { return NS_ERROR_UNEXPECTED; } p->Resolve(result); return NS_OK; }), NS_DISPATCH_NORMAL); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return NS_OK; }), NS_DISPATCH_NORMAL); if (NS_WARN_IF(NS_FAILED(rv))) { return false; } p->Then([aRequestId, sameProcess](const nsCString& aKey) mutable { if (!sameProcess) { if (!sIPCServingParent) { return NS_OK; } Unused << sIPCServingParent->SendGetOriginKeyResponse(aRequestId, aKey); } else { RefPtr<MediaManager> mgr = MediaManager::GetInstance(); if (!mgr) { return NS_OK; } RefPtr<Pledge<nsCString>> pledge = mgr->mGetOriginKeyPledges.Remove(aRequestId); if (pledge) { pledge->Resolve(aKey); } } return NS_OK; }); return true; }
template<class Super> mozilla::ipc::IPCResult Parent<Super>::RecvGetPrincipalKey(const uint32_t& aRequestId, const ipc::PrincipalInfo& aPrincipalInfo, const bool& aPersist) { MOZ_ASSERT(NS_IsMainThread()); // First, get profile dir. MOZ_ASSERT(NS_IsMainThread()); nsCOMPtr<nsIFile> profileDir; nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(profileDir)); if (NS_WARN_IF(NS_FAILED(rv))) { return IPCResult(this, false); } // Then over to stream-transport thread to do the actual file io. // Stash a pledge to hold the answer and get an id for this request. RefPtr<Pledge<nsCString>> p = new Pledge<nsCString>(); uint32_t id = mOutstandingPledges.Append(*p); nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); MOZ_ASSERT(sts); RefPtr<Parent<Super>> that(this); rv = sts->Dispatch(NewRunnableFrom([this, that, id, profileDir, aPrincipalInfo, aPersist]() -> nsresult { MOZ_ASSERT(!NS_IsMainThread()); mOriginKeyStore->mOriginKeys.SetProfileDir(profileDir); nsresult rv; nsAutoCString result; if (IsPincipalInfoPrivate(aPrincipalInfo)) { rv = mOriginKeyStore->mPrivateBrowsingOriginKeys.GetPrincipalKey(aPrincipalInfo, result); } else { rv = mOriginKeyStore->mOriginKeys.GetPrincipalKey(aPrincipalInfo, result, aPersist); } if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } // Pass result back to main thread. rv = NS_DispatchToMainThread(NewRunnableFrom([this, that, id, result]() -> nsresult { if (mDestroyed) { return NS_OK; } RefPtr<Pledge<nsCString>> p = mOutstandingPledges.Remove(id); if (!p) { return NS_ERROR_UNEXPECTED; } p->Resolve(result); return NS_OK; }), NS_DISPATCH_NORMAL); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return NS_OK; }), NS_DISPATCH_NORMAL); if (NS_WARN_IF(NS_FAILED(rv))) { return IPCResult(this, false); } p->Then([this, that, aRequestId](const nsCString& aKey) mutable { if (mDestroyed) { return NS_OK; } Unused << this->SendGetPrincipalKeyResponse(aRequestId, aKey); return NS_OK; }); return IPC_OK(); }