event.cc 2.3 KB

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