Loading dom/indexedDB/ActorsChild.cpp +88 −127 Original line number Diff line number Diff line Loading @@ -889,65 +889,20 @@ class MOZ_STACK_CLASS AutoSetCurrentFileHandle final { IDBFileHandle* FileHandle() const { return mFileHandle; } }; class MOZ_STACK_CLASS FileHandleResultHelper final { IDBFileRequest* const mFileRequest; AutoSetCurrentFileHandle mAutoFileHandle; mozilla::Variant<File*, const nsCString*, const FileRequestMetadata*, const JS::Handle<JS::Value>*> mResult; public: template <typename T> FileHandleResultHelper(IDBFileRequest* aFileRequest, IDBFileHandle* aFileHandle, T* aResult) : mFileRequest(aFileRequest), mAutoFileHandle(aFileHandle), mResult(aResult) { MOZ_ASSERT(aFileRequest); MOZ_ASSERT(aFileHandle); MOZ_ASSERT(aResult); } IDBFileRequest* FileRequest() const { return mFileRequest; } IDBFileHandle* FileHandle() const { return mAutoFileHandle.FileHandle(); } nsresult operator()(JSContext* aCx, JS::MutableHandle<JS::Value> aResult) const { MOZ_ASSERT(aCx); MOZ_ASSERT(mFileRequest); #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wunused-lambda-capture" #endif return mResult.match([aCx, aResult, this](auto* aPtr) { return GetResult(aCx, aPtr, aResult); }); #ifdef __clang__ # pragma clang diagnostic pop #endif } void SetFileHandleResultAndDispatchSuccessEvent( const RefPtr<IDBFileRequest>& aFileRequest, const RefPtr<IDBFileHandle>& aFileHandle, T* aPtr); private: static nsresult GetResult(JSContext* aCx, File* aFile, namespace detail { nsresult GetFileHandleResult(const RefPtr<IDBFileRequest>& aFileRequest, JSContext* aCx, const nsCString* aString, JS::MutableHandle<JS::Value> aResult) { const bool ok = GetOrCreateDOMReflector(aCx, aFile, aResult); if (NS_WARN_IF(!ok)) { return NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR; } return NS_OK; } nsresult GetResult(JSContext* aCx, const nsCString* aString, JS::MutableHandle<JS::Value> aResult) const { const nsCString& data = *aString; nsresult rv; if (!mFileRequest->HasEncoding()) { if (!aFileRequest->HasEncoding()) { JS::Rooted<JSObject*> arrayBuffer(aCx); rv = nsContentUtils::CreateArrayBuffer(aCx, data, arrayBuffer.address()); if (NS_WARN_IF(NS_FAILED(rv))) { Loading @@ -959,7 +914,7 @@ class MOZ_STACK_CLASS FileHandleResultHelper final { } // Try the API argument. const Encoding* encoding = Encoding::ForLabel(mFileRequest->GetEncoding()); const Encoding* encoding = Encoding::ForLabel(aFileRequest->GetEncoding()); if (!encoding) { // API argument failed. Since we are dealing with a file system file, // we don't have a meaningful type attribute for the blob available, Loading @@ -980,7 +935,8 @@ class MOZ_STACK_CLASS FileHandleResultHelper final { return NS_OK; } static nsresult GetResult(JSContext* aCx, nsresult GetFileHandleResult(const RefPtr<IDBFileRequest>& /*aFileRequest*/, JSContext* aCx, const FileRequestMetadata* aMetadata, JS::MutableHandle<JS::Value> aResult) { JS::Rooted<JSObject*> obj(aCx, JS_NewPlainObject(aCx)); Loading Loading @@ -1014,12 +970,14 @@ class MOZ_STACK_CLASS FileHandleResultHelper final { return NS_OK; } static nsresult GetResult(JSContext* aCx, const JS::Handle<JS::Value>* aValue, nsresult GetFileHandleResult(const RefPtr<IDBFileRequest>& /*aFileRequest*/, JSContext* aCx, const JS::Handle<JS::Value>* aValue, JS::MutableHandle<JS::Value> aResult) { aResult.set(*aValue); return NS_OK; } }; } // namespace detail void DispatchFileHandleErrorEvent(IDBFileRequest* aFileRequest, nsresult aErrorCode, Loading @@ -1040,26 +998,32 @@ void DispatchFileHandleErrorEvent(IDBFileRequest* aFileRequest, MOZ_ASSERT(fileHandle->IsOpen() || fileHandle->IsAborted()); } void DispatchFileHandleSuccessEvent(FileHandleResultHelper* aResultHelper) { MOZ_ASSERT(aResultHelper); template <typename T> void SetFileHandleResultAndDispatchSuccessEvent( const RefPtr<IDBFileRequest>& aFileRequest, const RefPtr<IDBFileHandle>& aFileHandle, T* aPtr) { MOZ_ASSERT(aFileRequest); MOZ_ASSERT(aFileHandle); MOZ_ASSERT(aPtr); const RefPtr<IDBFileRequest> fileRequest = aResultHelper->FileRequest(); MOZ_ASSERT(fileRequest); fileRequest->AssertIsOnOwningThread(); auto autoFileHandle = AutoSetCurrentFileHandle{aFileHandle}; const RefPtr<IDBFileHandle> fileHandle = aResultHelper->FileHandle(); MOZ_ASSERT(fileHandle); aFileRequest->AssertIsOnOwningThread(); if (fileHandle->IsAborted()) { fileRequest->FireError(NS_ERROR_DOM_FILEHANDLE_ABORT_ERR); if (aFileHandle->IsAborted()) { aFileRequest->FireError(NS_ERROR_DOM_FILEHANDLE_ABORT_ERR); return; } MOZ_ASSERT(fileHandle->IsOpen()); MOZ_ASSERT(aFileHandle->IsOpen()); fileRequest->SetResult(*aResultHelper); aFileRequest->SetResult( [aFileRequest, aPtr](JSContext* aCx, JS::MutableHandle<JS::Value> aResult) { return detail::GetFileHandleResult(aFileRequest, aCx, aPtr, aResult); }); MOZ_ASSERT(fileHandle->IsOpen() || fileHandle->IsAborted()); MOZ_ASSERT(aFileHandle->IsOpen() || aFileHandle->IsAborted()); } auto GetKeyOperator(const IDBCursorDirection aDirection) { Loading Loading @@ -3693,27 +3657,24 @@ void BackgroundFileRequestChild::HandleResponse(nsresult aResponse) { void BackgroundFileRequestChild::HandleResponse(const nsCString& aResponse) { AssertIsOnOwningThread(); FileHandleResultHelper helper(mFileRequest, mFileHandle, &aResponse); DispatchFileHandleSuccessEvent(&helper); SetFileHandleResultAndDispatchSuccessEvent(mFileRequest, mFileHandle, &aResponse); } void BackgroundFileRequestChild::HandleResponse( const FileRequestMetadata& aResponse) { AssertIsOnOwningThread(); FileHandleResultHelper helper(mFileRequest, mFileHandle, &aResponse); DispatchFileHandleSuccessEvent(&helper); SetFileHandleResultAndDispatchSuccessEvent(mFileRequest, mFileHandle, &aResponse); } void BackgroundFileRequestChild::HandleResponse( const JS::Handle<JS::Value> aResponse) { AssertIsOnOwningThread(); FileHandleResultHelper helper(mFileRequest, mFileHandle, &aResponse); DispatchFileHandleSuccessEvent(&helper); SetFileHandleResultAndDispatchSuccessEvent(mFileRequest, mFileHandle, &aResponse); } void BackgroundFileRequestChild::ActorDestroy(ActorDestroyReason aWhy) { Loading Loading
dom/indexedDB/ActorsChild.cpp +88 −127 Original line number Diff line number Diff line Loading @@ -889,65 +889,20 @@ class MOZ_STACK_CLASS AutoSetCurrentFileHandle final { IDBFileHandle* FileHandle() const { return mFileHandle; } }; class MOZ_STACK_CLASS FileHandleResultHelper final { IDBFileRequest* const mFileRequest; AutoSetCurrentFileHandle mAutoFileHandle; mozilla::Variant<File*, const nsCString*, const FileRequestMetadata*, const JS::Handle<JS::Value>*> mResult; public: template <typename T> FileHandleResultHelper(IDBFileRequest* aFileRequest, IDBFileHandle* aFileHandle, T* aResult) : mFileRequest(aFileRequest), mAutoFileHandle(aFileHandle), mResult(aResult) { MOZ_ASSERT(aFileRequest); MOZ_ASSERT(aFileHandle); MOZ_ASSERT(aResult); } IDBFileRequest* FileRequest() const { return mFileRequest; } IDBFileHandle* FileHandle() const { return mAutoFileHandle.FileHandle(); } nsresult operator()(JSContext* aCx, JS::MutableHandle<JS::Value> aResult) const { MOZ_ASSERT(aCx); MOZ_ASSERT(mFileRequest); #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wunused-lambda-capture" #endif return mResult.match([aCx, aResult, this](auto* aPtr) { return GetResult(aCx, aPtr, aResult); }); #ifdef __clang__ # pragma clang diagnostic pop #endif } void SetFileHandleResultAndDispatchSuccessEvent( const RefPtr<IDBFileRequest>& aFileRequest, const RefPtr<IDBFileHandle>& aFileHandle, T* aPtr); private: static nsresult GetResult(JSContext* aCx, File* aFile, namespace detail { nsresult GetFileHandleResult(const RefPtr<IDBFileRequest>& aFileRequest, JSContext* aCx, const nsCString* aString, JS::MutableHandle<JS::Value> aResult) { const bool ok = GetOrCreateDOMReflector(aCx, aFile, aResult); if (NS_WARN_IF(!ok)) { return NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR; } return NS_OK; } nsresult GetResult(JSContext* aCx, const nsCString* aString, JS::MutableHandle<JS::Value> aResult) const { const nsCString& data = *aString; nsresult rv; if (!mFileRequest->HasEncoding()) { if (!aFileRequest->HasEncoding()) { JS::Rooted<JSObject*> arrayBuffer(aCx); rv = nsContentUtils::CreateArrayBuffer(aCx, data, arrayBuffer.address()); if (NS_WARN_IF(NS_FAILED(rv))) { Loading @@ -959,7 +914,7 @@ class MOZ_STACK_CLASS FileHandleResultHelper final { } // Try the API argument. const Encoding* encoding = Encoding::ForLabel(mFileRequest->GetEncoding()); const Encoding* encoding = Encoding::ForLabel(aFileRequest->GetEncoding()); if (!encoding) { // API argument failed. Since we are dealing with a file system file, // we don't have a meaningful type attribute for the blob available, Loading @@ -980,7 +935,8 @@ class MOZ_STACK_CLASS FileHandleResultHelper final { return NS_OK; } static nsresult GetResult(JSContext* aCx, nsresult GetFileHandleResult(const RefPtr<IDBFileRequest>& /*aFileRequest*/, JSContext* aCx, const FileRequestMetadata* aMetadata, JS::MutableHandle<JS::Value> aResult) { JS::Rooted<JSObject*> obj(aCx, JS_NewPlainObject(aCx)); Loading Loading @@ -1014,12 +970,14 @@ class MOZ_STACK_CLASS FileHandleResultHelper final { return NS_OK; } static nsresult GetResult(JSContext* aCx, const JS::Handle<JS::Value>* aValue, nsresult GetFileHandleResult(const RefPtr<IDBFileRequest>& /*aFileRequest*/, JSContext* aCx, const JS::Handle<JS::Value>* aValue, JS::MutableHandle<JS::Value> aResult) { aResult.set(*aValue); return NS_OK; } }; } // namespace detail void DispatchFileHandleErrorEvent(IDBFileRequest* aFileRequest, nsresult aErrorCode, Loading @@ -1040,26 +998,32 @@ void DispatchFileHandleErrorEvent(IDBFileRequest* aFileRequest, MOZ_ASSERT(fileHandle->IsOpen() || fileHandle->IsAborted()); } void DispatchFileHandleSuccessEvent(FileHandleResultHelper* aResultHelper) { MOZ_ASSERT(aResultHelper); template <typename T> void SetFileHandleResultAndDispatchSuccessEvent( const RefPtr<IDBFileRequest>& aFileRequest, const RefPtr<IDBFileHandle>& aFileHandle, T* aPtr) { MOZ_ASSERT(aFileRequest); MOZ_ASSERT(aFileHandle); MOZ_ASSERT(aPtr); const RefPtr<IDBFileRequest> fileRequest = aResultHelper->FileRequest(); MOZ_ASSERT(fileRequest); fileRequest->AssertIsOnOwningThread(); auto autoFileHandle = AutoSetCurrentFileHandle{aFileHandle}; const RefPtr<IDBFileHandle> fileHandle = aResultHelper->FileHandle(); MOZ_ASSERT(fileHandle); aFileRequest->AssertIsOnOwningThread(); if (fileHandle->IsAborted()) { fileRequest->FireError(NS_ERROR_DOM_FILEHANDLE_ABORT_ERR); if (aFileHandle->IsAborted()) { aFileRequest->FireError(NS_ERROR_DOM_FILEHANDLE_ABORT_ERR); return; } MOZ_ASSERT(fileHandle->IsOpen()); MOZ_ASSERT(aFileHandle->IsOpen()); fileRequest->SetResult(*aResultHelper); aFileRequest->SetResult( [aFileRequest, aPtr](JSContext* aCx, JS::MutableHandle<JS::Value> aResult) { return detail::GetFileHandleResult(aFileRequest, aCx, aPtr, aResult); }); MOZ_ASSERT(fileHandle->IsOpen() || fileHandle->IsAborted()); MOZ_ASSERT(aFileHandle->IsOpen() || aFileHandle->IsAborted()); } auto GetKeyOperator(const IDBCursorDirection aDirection) { Loading Loading @@ -3693,27 +3657,24 @@ void BackgroundFileRequestChild::HandleResponse(nsresult aResponse) { void BackgroundFileRequestChild::HandleResponse(const nsCString& aResponse) { AssertIsOnOwningThread(); FileHandleResultHelper helper(mFileRequest, mFileHandle, &aResponse); DispatchFileHandleSuccessEvent(&helper); SetFileHandleResultAndDispatchSuccessEvent(mFileRequest, mFileHandle, &aResponse); } void BackgroundFileRequestChild::HandleResponse( const FileRequestMetadata& aResponse) { AssertIsOnOwningThread(); FileHandleResultHelper helper(mFileRequest, mFileHandle, &aResponse); DispatchFileHandleSuccessEvent(&helper); SetFileHandleResultAndDispatchSuccessEvent(mFileRequest, mFileHandle, &aResponse); } void BackgroundFileRequestChild::HandleResponse( const JS::Handle<JS::Value> aResponse) { AssertIsOnOwningThread(); FileHandleResultHelper helper(mFileRequest, mFileHandle, &aResponse); DispatchFileHandleSuccessEvent(&helper); SetFileHandleResultAndDispatchSuccessEvent(mFileRequest, mFileHandle, &aResponse); } void BackgroundFileRequestChild::ActorDestroy(ActorDestroyReason aWhy) { Loading