event_emitter.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 "atom/browser/api/event_emitter.h"
  5. #include "atom/browser/api/event.h"
  6. #include "content/public/browser/render_frame_host.h"
  7. #include "native_mate/arguments.h"
  8. #include "native_mate/dictionary.h"
  9. #include "native_mate/object_template_builder.h"
  10. #include "ui/events/event_constants.h"
  11. #include "atom/common/node_includes.h"
  12. namespace mate {
  13. namespace {
  14. v8::Persistent<v8::ObjectTemplate> event_template;
  15. void PreventDefault(mate::Arguments* args) {
  16. mate::Dictionary self(args->isolate(), args->GetThis());
  17. self.Set("defaultPrevented", true);
  18. }
  19. // Create a pure JavaScript Event object.
  20. v8::Local<v8::Object> CreateEventObject(v8::Isolate* isolate) {
  21. if (event_template.IsEmpty()) {
  22. event_template.Reset(
  23. isolate,
  24. ObjectTemplateBuilder(isolate, v8::ObjectTemplate::New(isolate))
  25. .SetMethod("preventDefault", &PreventDefault)
  26. .Build());
  27. }
  28. return v8::Local<v8::ObjectTemplate>::New(isolate, event_template)
  29. ->NewInstance(isolate->GetCurrentContext())
  30. .ToLocalChecked();
  31. }
  32. } // namespace
  33. namespace internal {
  34. v8::Local<v8::Object> CreateJSEvent(v8::Isolate* isolate,
  35. v8::Local<v8::Object> object,
  36. content::RenderFrameHost* sender,
  37. IPC::Message* message) {
  38. v8::Local<v8::Object> event;
  39. bool use_native_event = sender && message;
  40. if (use_native_event) {
  41. mate::Handle<mate::Event> native_event = mate::Event::Create(isolate);
  42. native_event->SetSenderAndMessage(sender, message);
  43. event = v8::Local<v8::Object>::Cast(native_event.ToV8());
  44. } else {
  45. event = CreateEventObject(isolate);
  46. }
  47. mate::Dictionary dict(isolate, event);
  48. dict.Set("sender", object);
  49. if (sender)
  50. dict.Set("frameId", sender->GetRoutingID());
  51. return event;
  52. }
  53. v8::Local<v8::Object> CreateCustomEvent(v8::Isolate* isolate,
  54. v8::Local<v8::Object> object,
  55. v8::Local<v8::Object> custom_event) {
  56. v8::Local<v8::Object> event = CreateEventObject(isolate);
  57. (void)event->SetPrototype(custom_event->CreationContext(), custom_event);
  58. mate::Dictionary(isolate, event).Set("sender", object);
  59. return event;
  60. }
  61. v8::Local<v8::Object> CreateEventFromFlags(v8::Isolate* isolate, int flags) {
  62. mate::Dictionary obj = mate::Dictionary::CreateEmpty(isolate);
  63. obj.Set("shiftKey", static_cast<bool>(flags & ui::EF_SHIFT_DOWN));
  64. obj.Set("ctrlKey", static_cast<bool>(flags & ui::EF_CONTROL_DOWN));
  65. obj.Set("altKey", static_cast<bool>(flags & ui::EF_ALT_DOWN));
  66. obj.Set("metaKey", static_cast<bool>(flags & ui::EF_COMMAND_DOWN));
  67. return obj.GetHandle();
  68. }
  69. } // namespace internal
  70. } // namespace mate