event.cc 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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.h"
  5. #include <utility>
  6. #include "atom/common/api/api_messages.h"
  7. #include "atom/common/native_mate_converters/string16_converter.h"
  8. #include "atom/common/native_mate_converters/value_converter.h"
  9. #include "content/public/browser/render_frame_host.h"
  10. #include "content/public/browser/web_contents.h"
  11. #include "native_mate/object_template_builder.h"
  12. namespace mate {
  13. Event::Event(v8::Isolate* isolate) {
  14. Init(isolate);
  15. }
  16. Event::~Event() {}
  17. void Event::SetSenderAndMessage(content::RenderFrameHost* sender,
  18. base::Optional<MessageSyncCallback> callback) {
  19. DCHECK(!sender_);
  20. DCHECK(!callback_);
  21. sender_ = sender;
  22. callback_ = std::move(callback);
  23. Observe(content::WebContents::FromRenderFrameHost(sender));
  24. }
  25. void Event::RenderFrameDeleted(content::RenderFrameHost* rfh) {
  26. if (sender_ != rfh)
  27. return;
  28. sender_ = nullptr;
  29. callback_.reset();
  30. }
  31. void Event::RenderFrameHostChanged(content::RenderFrameHost* old_rfh,
  32. content::RenderFrameHost* new_rfh) {
  33. if (sender_ && sender_ == old_rfh)
  34. sender_ = new_rfh;
  35. }
  36. void Event::FrameDeleted(content::RenderFrameHost* rfh) {
  37. if (sender_ != rfh)
  38. return;
  39. sender_ = nullptr;
  40. callback_.reset();
  41. }
  42. void Event::PreventDefault(v8::Isolate* isolate) {
  43. GetWrapper()
  44. ->Set(isolate->GetCurrentContext(),
  45. StringToV8(isolate, "defaultPrevented"), v8::True(isolate))
  46. .Check();
  47. }
  48. bool Event::SendReply(const base::ListValue& result) {
  49. if (!callback_ || sender_ == nullptr)
  50. return false;
  51. std::move(*callback_).Run(result.Clone());
  52. callback_.reset();
  53. return true;
  54. }
  55. // static
  56. Handle<Event> Event::Create(v8::Isolate* isolate) {
  57. return mate::CreateHandle(isolate, new Event(isolate));
  58. }
  59. // static
  60. void Event::BuildPrototype(v8::Isolate* isolate,
  61. v8::Local<v8::FunctionTemplate> prototype) {
  62. prototype->SetClassName(mate::StringToV8(isolate, "Event"));
  63. mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
  64. .SetMethod("preventDefault", &Event::PreventDefault)
  65. .SetMethod("sendReply", &Event::SendReply);
  66. }
  67. } // namespace mate