template<class Super> mozilla::ipc::IPCResult 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 IPCResult(this, 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 IPCResult(this, false); } return IPC_OK(); }
IPCResult IPCResult::Fail(NotNull<IProtocol*> actor, const char* where, const char* why) { // Calls top-level protocol to handle the error. nsPrintfCString errorMsg("%s::%s %s\n", actor->ProtocolName(), where, why); actor->GetIPCChannel()->Listener()->ProcessingError( HasResultCodes::MsgProcessingError, errorMsg.get()); return IPCResult(false); }
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(); }