js_sandbox_isolate.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef ANDROID_WEBVIEW_JS_SANDBOX_SERVICE_JS_SANDBOX_ISOLATE_H_
  5. #define ANDROID_WEBVIEW_JS_SANDBOX_SERVICE_JS_SANDBOX_ISOLATE_H_
  6. #include <memory>
  7. #include <string>
  8. #include <unordered_map>
  9. #include "base/android/scoped_java_ref.h"
  10. #include "base/callback_forward.h"
  11. #include "base/compiler_specific.h"
  12. #include "base/files/scoped_file.h"
  13. #include "base/memory/scoped_refptr.h"
  14. #include "base/synchronization/lock.h"
  15. #include "base/thread_annotations.h"
  16. #include "v8/include/v8-promise.h"
  17. namespace base {
  18. class CancelableTaskTracker;
  19. class SequencedTaskRunner;
  20. class SingleThreadTaskRunner;
  21. } // namespace base
  22. namespace gin {
  23. class Arguments;
  24. class IsolateHolder;
  25. class ContextHolder;
  26. } // namespace gin
  27. namespace v8 {
  28. class BackingStore;
  29. class ObjectTemplate;
  30. } // namespace v8
  31. namespace android_webview {
  32. class FdWithLength;
  33. class JsSandboxIsolate {
  34. public:
  35. explicit JsSandboxIsolate(jlong max_heap_size_bytes = 0);
  36. ~JsSandboxIsolate();
  37. using FinishedCallback = base::OnceCallback<void(const std::string&)>;
  38. jboolean EvaluateJavascript(
  39. JNIEnv* env,
  40. const base::android::JavaParamRef<jobject>& obj,
  41. const base::android::JavaParamRef<jstring>& jcode,
  42. const base::android::JavaParamRef<jobject>& j_success_callback,
  43. const base::android::JavaParamRef<jobject>& j_failure_callback);
  44. void DestroyNative(JNIEnv* env,
  45. const base::android::JavaParamRef<jobject>& obj);
  46. jboolean ProvideNamedData(JNIEnv* env,
  47. const base::android::JavaParamRef<jobject>& obj,
  48. const base::android::JavaParamRef<jstring>& jname,
  49. const jint fd,
  50. const jint length);
  51. private:
  52. void DeleteSelf();
  53. void InitializeIsolateOnThread();
  54. void EvaluateJavascriptOnThread(const std::string code,
  55. FinishedCallback success_callback,
  56. FinishedCallback failure_callback);
  57. void PromiseRejectCallback(FinishedCallback error_callback,
  58. gin::Arguments* args);
  59. void TerminateAndDestroy();
  60. void DestroyWhenPossible();
  61. void NotifyInitComplete();
  62. void CreateCancelableTaskTracker();
  63. void PostEvaluationToIsolateThread(const std::string code,
  64. FinishedCallback success_callback,
  65. FinishedCallback error_callback);
  66. void ConvertPromiseToArrayBufferInThreadPool(base::ScopedFD fd,
  67. ssize_t length,
  68. std::string name);
  69. void ConvertPromiseToArrayBufferInControlSequence(
  70. std::string name,
  71. std::unique_ptr<v8::BackingStore> backing_store);
  72. void ConvertPromiseToFailureInControlSequence(std::string name,
  73. std::string reason);
  74. void ConvertPromiseToFailureInIsolateSequence(std::string name,
  75. std::string reason);
  76. void ConvertPromiseToArrayBufferInIsolateSequence(
  77. std::string name,
  78. std::unique_ptr<v8::BackingStore>);
  79. void ConsumeNamedDataAsArrayBuffer(gin::Arguments* args);
  80. v8::Local<v8::ObjectTemplate> CreateAndroidNamespaceTemplate(
  81. v8::Isolate* isolate);
  82. // Used as a control sequence to add ordering to binder threadpool requests.
  83. scoped_refptr<base::SequencedTaskRunner> control_task_runner_;
  84. // Should be used from control_task_runner_.
  85. bool isolate_init_complete = false;
  86. // Should be used from control_task_runner_.
  87. bool destroy_called_before_init = false;
  88. // Should be used from control_task_runner_.
  89. std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_;
  90. // Used for interaction with the isolate.
  91. scoped_refptr<base::SingleThreadTaskRunner> isolate_task_runner_;
  92. // Should be used from isolate_task_runner_.
  93. std::unique_ptr<gin::IsolateHolder> isolate_holder_;
  94. // Should be used from isolate_task_runner_.
  95. std::unique_ptr<gin::ContextHolder> context_holder_;
  96. // Should be used from isolate_task_runner_.
  97. std::unordered_map<std::string, v8::Global<v8::Promise::Resolver>>
  98. named_resolver_;
  99. base::Lock named_fd_lock_;
  100. std::unordered_map<std::string, FdWithLength> named_fd_
  101. GUARDED_BY(named_fd_lock_);
  102. jlong isolate_max_heap_size_bytes_;
  103. };
  104. } // namespace android_webview
  105. #endif // ANDROID_WEBVIEW_JS_SANDBOX_SERVICE_JS_SANDBOX_ISOLATE_H_