910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_CRONET_ANDROID_COMPLETION_ONCE_CALLBACK_ADAPTER_H_
#define COMPONENTS_CRONET_ANDROID_COMPLETION_ONCE_CALLBACK_ADAPTER_H_

#include <jni.h>

#include "base/android/scoped_java_ref.h"
#include "base/task/single_thread_task_runner.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_errors.h"

namespace cronet {

// Adapter for org.chromium.net.impl.CompletionOnceCallback.
// TODO(https://crbug.com/442514750): Consider moving to
// base::android::ToJniCallback instead.
class CompletionOnceCallbackAdapter final {
 public:
  // Create a C++ CompletionOnceCallbackAdapter and a Java
  // CompletionOnceCallback. The lifetime of these two is tightly coupled:
  // CompletionOnceCallbackAdapter instances are owned by their Java
  // counterpart, CompletionOnceCallback. Ownership is then passed to
  // Cronet's embedder. This will be cleaned up only after the Java counterside
  // calls Run.
  static base::android::ScopedJavaLocalRef<jobject> Create(
      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
      net::CompletionOnceCallback callback);

  // Runs, asynchronously, the associated callback onto the TaskRunner passed to
  // the constructor.
  // Warning: Object will self-destroy on return.
  void Run(JNIEnv* env, net::Error result);

 private:
  // Don't expose: creating a C++ CompletionOnceCallbackAdapter, without a Java
  // CompletionOnceCallback, is always wrong. See `Create`.
  explicit CompletionOnceCallbackAdapter(
      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
      net::CompletionOnceCallback callback);
  ~CompletionOnceCallbackAdapter();

  net::CompletionOnceCallback callback_;
  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
};

}  // namespace cronet

#endif  // COMPONENTS_CRONET_ANDROID_COMPLETION_ONCE_CALLBACK_ADAPTER_H_