event.cc 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright (c) 2014 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/browser/api/event.h"
  5. #include <utility>
  6. #include "gin/data_object_builder.h"
  7. #include "gin/object_template_builder.h"
  8. #include "shell/browser/javascript_environment.h"
  9. #include "shell/common/gin_converters/blink_converter.h"
  10. #include "shell/common/gin_converters/std_converter.h"
  11. namespace gin_helper {
  12. gin::WrapperInfo Event::kWrapperInfo = {gin::kEmbedderNativeGin};
  13. Event::Event() = default;
  14. Event::~Event() {
  15. if (callback_) {
  16. v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
  17. // If there's no current context, it means we're shutting down, so we don't
  18. // need to send an event.
  19. if (!isolate->GetCurrentContext().IsEmpty()) {
  20. v8::HandleScope scope(isolate);
  21. auto message = gin::DataObjectBuilder(isolate)
  22. .Set("error", "reply was never sent")
  23. .Build();
  24. SendReply(isolate, message);
  25. }
  26. }
  27. }
  28. void Event::SetCallback(InvokeCallback callback) {
  29. DCHECK(!callback_);
  30. callback_ = std::move(callback);
  31. }
  32. void Event::PreventDefault(v8::Isolate* isolate) {
  33. v8::Local<v8::Object> self = GetWrapper(isolate).ToLocalChecked();
  34. self->Set(isolate->GetCurrentContext(),
  35. gin::StringToV8(isolate, "defaultPrevented"), v8::True(isolate))
  36. .Check();
  37. }
  38. bool Event::SendReply(v8::Isolate* isolate, v8::Local<v8::Value> result) {
  39. if (!callback_)
  40. return false;
  41. blink::CloneableMessage message;
  42. if (!gin::ConvertFromV8(isolate, result, &message)) {
  43. return false;
  44. }
  45. std::move(callback_).Run(std::move(message));
  46. return true;
  47. }
  48. gin::ObjectTemplateBuilder Event::GetObjectTemplateBuilder(
  49. v8::Isolate* isolate) {
  50. return gin::Wrappable<Event>::GetObjectTemplateBuilder(isolate)
  51. .SetMethod("preventDefault", &Event::PreventDefault)
  52. .SetMethod("sendReply", &Event::SendReply);
  53. }
  54. const char* Event::GetTypeName() {
  55. return "Event";
  56. }
  57. // static
  58. gin::Handle<Event> Event::Create(v8::Isolate* isolate) {
  59. return gin::CreateHandle(isolate, new Event());
  60. }
  61. } // namespace gin_helper