Commit d11275bd authored by Simon Giesecke's avatar Simon Giesecke
Browse files

Bug 1632128 - Dissolve FileHandleResultHelper class into a function....

Bug 1632128 - Dissolve FileHandleResultHelper class into a function. r=dom-workers-and-storage-reviewers,janv

Differential Revision: https://phabricator.services.mozilla.com/D75053
parent 4fc4c0a9
Loading
Loading
Loading
Loading
+88 −127
Original line number Diff line number Diff line
@@ -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))) {
@@ -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,
@@ -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));
@@ -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,
@@ -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) {
@@ -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) {