promise.cc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright (c) 2018 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #include "shell/common/gin_helper/promise.h"
  5. namespace gin_helper {
  6. PromiseBase::PromiseBase(v8::Isolate* isolate)
  7. : PromiseBase(isolate,
  8. v8::Promise::Resolver::New(isolate->GetCurrentContext())
  9. .ToLocalChecked()) {}
  10. PromiseBase::PromiseBase(v8::Isolate* isolate,
  11. v8::Local<v8::Promise::Resolver> handle)
  12. : isolate_(isolate),
  13. context_(isolate, isolate->GetCurrentContext()),
  14. resolver_(isolate, handle) {}
  15. PromiseBase::PromiseBase(PromiseBase&&) = default;
  16. PromiseBase::~PromiseBase() = default;
  17. PromiseBase& PromiseBase::operator=(PromiseBase&&) = default;
  18. v8::Maybe<bool> PromiseBase::Reject() {
  19. gin_helper::Locker locker(isolate());
  20. v8::HandleScope handle_scope(isolate());
  21. gin_helper::MicrotasksScope microtasks_scope(isolate());
  22. v8::Context::Scope context_scope(GetContext());
  23. return GetInner()->Reject(GetContext(), v8::Undefined(isolate()));
  24. }
  25. v8::Maybe<bool> PromiseBase::Reject(v8::Local<v8::Value> except) {
  26. gin_helper::Locker locker(isolate());
  27. v8::HandleScope handle_scope(isolate());
  28. gin_helper::MicrotasksScope microtasks_scope(isolate());
  29. v8::Context::Scope context_scope(GetContext());
  30. return GetInner()->Reject(GetContext(), except);
  31. }
  32. v8::Maybe<bool> PromiseBase::RejectWithErrorMessage(base::StringPiece message) {
  33. gin_helper::Locker locker(isolate());
  34. v8::HandleScope handle_scope(isolate());
  35. gin_helper::MicrotasksScope microtasks_scope(isolate());
  36. v8::Context::Scope context_scope(GetContext());
  37. v8::Local<v8::Value> error =
  38. v8::Exception::Error(gin::StringToV8(isolate(), message));
  39. return GetInner()->Reject(GetContext(), (error));
  40. }
  41. v8::Local<v8::Context> PromiseBase::GetContext() const {
  42. return v8::Local<v8::Context>::New(isolate_, context_);
  43. }
  44. v8::Local<v8::Promise> PromiseBase::GetHandle() const {
  45. return GetInner()->GetPromise();
  46. }
  47. v8::Local<v8::Promise::Resolver> PromiseBase::GetInner() const {
  48. return resolver_.Get(isolate());
  49. }
  50. // static
  51. void Promise<void>::ResolvePromise(Promise<void> promise) {
  52. if (gin_helper::Locker::IsBrowserProcess() &&
  53. !content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
  54. base::PostTask(
  55. FROM_HERE, {content::BrowserThread::UI},
  56. base::BindOnce([](Promise<void> promise) { promise.Resolve(); },
  57. std::move(promise)));
  58. } else {
  59. promise.Resolve();
  60. }
  61. }
  62. // static
  63. v8::Local<v8::Promise> Promise<void>::ResolvedPromise(v8::Isolate* isolate) {
  64. Promise<void> resolved(isolate);
  65. resolved.Resolve();
  66. return resolved.GetHandle();
  67. }
  68. v8::Maybe<bool> Promise<void>::Resolve() {
  69. gin_helper::Locker locker(isolate());
  70. v8::HandleScope handle_scope(isolate());
  71. gin_helper::MicrotasksScope microtasks_scope(isolate());
  72. v8::Context::Scope context_scope(GetContext());
  73. return GetInner()->Resolve(GetContext(), v8::Undefined(isolate()));
  74. }
  75. } // namespace gin_helper