123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- // Copyright 2022 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef ANDROID_WEBVIEW_JS_SANDBOX_SERVICE_JS_SANDBOX_ISOLATE_H_
- #define ANDROID_WEBVIEW_JS_SANDBOX_SERVICE_JS_SANDBOX_ISOLATE_H_
- #include <memory>
- #include <string>
- #include <unordered_map>
- #include "base/android/scoped_java_ref.h"
- #include "base/callback_forward.h"
- #include "base/compiler_specific.h"
- #include "base/files/scoped_file.h"
- #include "base/memory/scoped_refptr.h"
- #include "base/synchronization/lock.h"
- #include "base/thread_annotations.h"
- #include "v8/include/v8-promise.h"
- namespace base {
- class CancelableTaskTracker;
- class SequencedTaskRunner;
- class SingleThreadTaskRunner;
- } // namespace base
- namespace gin {
- class Arguments;
- class IsolateHolder;
- class ContextHolder;
- } // namespace gin
- namespace v8 {
- class BackingStore;
- class ObjectTemplate;
- } // namespace v8
- namespace android_webview {
- class FdWithLength;
- class JsSandboxIsolate {
- public:
- explicit JsSandboxIsolate(jlong max_heap_size_bytes = 0);
- ~JsSandboxIsolate();
- using FinishedCallback = base::OnceCallback<void(const std::string&)>;
- jboolean EvaluateJavascript(
- JNIEnv* env,
- const base::android::JavaParamRef<jobject>& obj,
- const base::android::JavaParamRef<jstring>& jcode,
- const base::android::JavaParamRef<jobject>& j_success_callback,
- const base::android::JavaParamRef<jobject>& j_failure_callback);
- void DestroyNative(JNIEnv* env,
- const base::android::JavaParamRef<jobject>& obj);
- jboolean ProvideNamedData(JNIEnv* env,
- const base::android::JavaParamRef<jobject>& obj,
- const base::android::JavaParamRef<jstring>& jname,
- const jint fd,
- const jint length);
- private:
- void DeleteSelf();
- void InitializeIsolateOnThread();
- void EvaluateJavascriptOnThread(const std::string code,
- FinishedCallback success_callback,
- FinishedCallback failure_callback);
- void PromiseRejectCallback(FinishedCallback error_callback,
- gin::Arguments* args);
- void TerminateAndDestroy();
- void DestroyWhenPossible();
- void NotifyInitComplete();
- void CreateCancelableTaskTracker();
- void PostEvaluationToIsolateThread(const std::string code,
- FinishedCallback success_callback,
- FinishedCallback error_callback);
- void ConvertPromiseToArrayBufferInThreadPool(base::ScopedFD fd,
- ssize_t length,
- std::string name);
- void ConvertPromiseToArrayBufferInControlSequence(
- std::string name,
- std::unique_ptr<v8::BackingStore> backing_store);
- void ConvertPromiseToFailureInControlSequence(std::string name,
- std::string reason);
- void ConvertPromiseToFailureInIsolateSequence(std::string name,
- std::string reason);
- void ConvertPromiseToArrayBufferInIsolateSequence(
- std::string name,
- std::unique_ptr<v8::BackingStore>);
- void ConsumeNamedDataAsArrayBuffer(gin::Arguments* args);
- v8::Local<v8::ObjectTemplate> CreateAndroidNamespaceTemplate(
- v8::Isolate* isolate);
- // Used as a control sequence to add ordering to binder threadpool requests.
- scoped_refptr<base::SequencedTaskRunner> control_task_runner_;
- // Should be used from control_task_runner_.
- bool isolate_init_complete = false;
- // Should be used from control_task_runner_.
- bool destroy_called_before_init = false;
- // Should be used from control_task_runner_.
- std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_;
- // Used for interaction with the isolate.
- scoped_refptr<base::SingleThreadTaskRunner> isolate_task_runner_;
- // Should be used from isolate_task_runner_.
- std::unique_ptr<gin::IsolateHolder> isolate_holder_;
- // Should be used from isolate_task_runner_.
- std::unique_ptr<gin::ContextHolder> context_holder_;
- // Should be used from isolate_task_runner_.
- std::unordered_map<std::string, v8::Global<v8::Promise::Resolver>>
- named_resolver_;
- base::Lock named_fd_lock_;
- std::unordered_map<std::string, FdWithLength> named_fd_
- GUARDED_BY(named_fd_lock_);
- jlong isolate_max_heap_size_bytes_;
- };
- } // namespace android_webview
- #endif // ANDROID_WEBVIEW_JS_SANDBOX_SERVICE_JS_SANDBOX_ISOLATE_H_
|