| Index: mojo/edk/system/node_channel.cc
|
| diff --git a/mojo/edk/system/node_channel.cc b/mojo/edk/system/node_channel.cc
|
| index 885750d66786674d008f5f75e7b65d54a99240ca..22d97e266e9004491fcebe139a91a76d53a8eec7 100644
|
| --- a/mojo/edk/system/node_channel.cc
|
| +++ b/mojo/edk/system/node_channel.cc
|
| @@ -39,6 +39,7 @@ enum class MessageType : uint32_t {
|
| REQUEST_PORT_MERGE,
|
| REQUEST_INTRODUCTION,
|
| INTRODUCE,
|
| + BROADCAST,
|
| #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
|
| RELAY_PORTS_MESSAGE,
|
| #endif
|
| @@ -329,6 +330,15 @@ void NodeChannel::Introduce(const ports::NodeName& name,
|
| WriteChannelMessage(std::move(message));
|
| }
|
|
|
| +void NodeChannel::Broadcast(Channel::MessagePtr message) {
|
| + DCHECK(!message->has_handles());
|
| + void* data;
|
| + Channel::MessagePtr broadcast_message = CreateMessage(
|
| + MessageType::BROADCAST, message->data_num_bytes(), 0, &data);
|
| + memcpy(data, message->data(), message->data_num_bytes());
|
| + WriteChannelMessage(std::move(broadcast_message));
|
| +}
|
| +
|
| #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
|
| void NodeChannel::RelayPortsMessage(const ports::NodeName& destination,
|
| Channel::MessagePtr message) {
|
| @@ -574,6 +584,21 @@ void NodeChannel::OnChannelMessage(const void* payload,
|
| break;
|
| }
|
|
|
| + case MessageType::BROADCAST: {
|
| + if (payload_size <= sizeof(Header))
|
| + break;
|
| + const void* data = static_cast<const void*>(
|
| + reinterpret_cast<const Header*>(payload) + 1);
|
| + Channel::MessagePtr message =
|
| + Channel::Message::Deserialize(data, payload_size - sizeof(Header));
|
| + if (!message) {
|
| + DLOG(ERROR) << "Dropping invalid broadcast message.";
|
| + break;
|
| + }
|
| + delegate_->OnBroadcast(std::move(message));
|
| + return;
|
| + }
|
| +
|
| #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
|
| case MessageType::RELAY_PORTS_MESSAGE: {
|
| base::ProcessHandle from_process;
|
|
|