*
* The same message listener can be added more than once and in that
* case it will be called more than once for each message.
+ *
+ * If data is specified, it will be passed to the callback when it is called.
+ * Otherwise, the exception object will be passed to the callback instead.
*/
- static bool AddMessageListener(MessageCallback that);
+ static bool AddMessageListener(MessageCallback that,
+ Handle<Value> data = Handle<Value>());
/**
* Remove all message listeners from the specified callback function.
}
-bool V8::AddMessageListener(MessageCallback that) {
+bool V8::AddMessageListener(MessageCallback that, Handle<Value> data) {
i::Isolate* isolate = i::Isolate::Current();
EnsureInitializedForIsolate(isolate, "v8::V8::AddMessageListener()");
ON_BAILOUT(isolate, "v8::V8::AddMessageListener()", return false);
ENTER_V8(isolate);
i::HandleScope scope(isolate);
NeanderArray listeners(isolate->factory()->message_listeners());
- listeners.add(isolate->factory()->NewForeign(FUNCTION_ADDR(that)));
+ NeanderObject obj(2);
+ obj.set(0, *isolate->factory()->NewForeign(FUNCTION_ADDR(that)));
+ obj.set(1, data.IsEmpty() ? isolate->heap()->undefined_value()
+ : *Utils::OpenHandle(*data));
+ listeners.add(obj.value());
return true;
}
for (int i = 0; i < listeners.length(); i++) {
if (listeners.get(i)->IsUndefined()) continue; // skip deleted ones
- i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listeners.get(i)));
+ NeanderObject listener(i::JSObject::cast(listeners.get(i)));
+ i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0)));
if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) {
listeners.set(i, isolate->heap()->undefined_value());
}
for (int i = 0; i < global_length; i++) {
HandleScope scope(isolate);
if (global_listeners.get(i)->IsUndefined()) continue;
- Handle<Foreign> callback_obj(Foreign::cast(global_listeners.get(i)));
+ v8::NeanderObject listener(JSObject::cast(global_listeners.get(i)));
+ Handle<Foreign> callback_obj(Foreign::cast(listener.get(0)));
v8::MessageCallback callback =
FUNCTION_CAST<v8::MessageCallback>(callback_obj->foreign_address());
+ Handle<Object> callback_data(listener.get(1), isolate);
{
// Do not allow exceptions to propagate.
v8::TryCatch try_catch;
- callback(api_message_obj, api_exception_obj);
+ callback(api_message_obj, callback_data->IsUndefined()
+ ? api_exception_obj
+ : v8::Utils::ToLocal(callback_data));
}
if (isolate->has_scheduled_exception()) {
isolate->clear_scheduled_exception();
static void check_message_0(v8::Handle<v8::Message> message,
v8::Handle<Value> data) {
+ CHECK_EQ(5.76, data->NumberValue());
CHECK_EQ(6.75, message->GetScriptResourceName()->NumberValue());
CHECK_EQ(7.56, message->GetScriptData()->NumberValue());
message_received = true;
message_received = false;
v8::HandleScope scope;
CHECK(!message_received);
- v8::V8::AddMessageListener(check_message_0);
+ v8::V8::AddMessageListener(check_message_0, v8_num(5.76));
LocalContext context;
v8::ScriptOrigin origin =
v8::ScriptOrigin(v8_str("6.75"));