Send reply for sync messages when event.returnValue is set.

This commit is contained in:
Cheng Zhao 2013-09-22 09:52:58 +08:00
parent ef4b36d621
commit d443b36446
6 changed files with 70 additions and 16 deletions

View file

@ -4,7 +4,9 @@
#include "browser/api/atom_api_event.h"
#include "common/api/api_messages.h"
#include "common/string16_conversions.h"
#include "ipc/ipc_sender.h"
using node::node_isolate;
@ -15,7 +17,9 @@ namespace api {
v8::Persistent<v8::FunctionTemplate> Event::constructor_template_;
Event::Event()
: prevent_default_(false) {
: sender_(NULL),
message_(NULL),
prevent_default_(false) {
}
Event::~Event() {
@ -33,6 +37,7 @@ v8::Handle<v8::Object> Event::CreateV8Object() {
constructor_template_->SetClassName(v8::String::NewSymbol("Event"));
NODE_SET_PROTOTYPE_METHOD(t, "preventDefault", PreventDefault);
NODE_SET_PROTOTYPE_METHOD(t, "sendReply", SendReply);
}
v8::Handle<v8::Object> v8_event =
@ -48,14 +53,24 @@ string16 Event::GetReturnValue(v8::Handle<v8::Object> event) {
return V8ValueToUTF16(json);
}
v8::Handle<v8::Value> Event::New(const v8::Arguments &args) {
void Event::SetSenderAndMessage(IPC::Sender* sender, IPC::Message* message) {
DCHECK(!sender_);
DCHECK(!message_);
sender_ = sender;
message_ = message;
}
// static
v8::Handle<v8::Value> Event::New(const v8::Arguments& args) {
Event* event = new Event;
event->Wrap(args.This());
return args.This();
}
v8::Handle<v8::Value> Event::PreventDefault(const v8::Arguments &args) {
// static
v8::Handle<v8::Value> Event::PreventDefault(const v8::Arguments& args) {
Event* event = Unwrap<Event>(args.This());
if (event == NULL)
return node::ThrowError("Event is already destroyed");
@ -65,6 +80,23 @@ v8::Handle<v8::Value> Event::PreventDefault(const v8::Arguments &args) {
return v8::Undefined();
}
// static
v8::Handle<v8::Value> Event::SendReply(const v8::Arguments& args) {
Event* event = Unwrap<Event>(args.This());
if (event == NULL)
return node::ThrowError("Event is already destroyed");
if (event->sender_ == NULL)
return node::ThrowError("Can only send reply to synchronous events");
string16 json = GetReturnValue(args.This());
AtomViewHostMsg_Message_Sync::WriteReplyParams(event->message_, json);
event->sender_->Send(event->message_);
return v8::Undefined();
}
} // namespace api
} // namespace atom