Add webContents.sendToAll to send message to all frames

This commit is contained in:
Cheng Zhao 2016-05-27 16:58:49 +09:00
parent c1facec5a6
commit 9ab76fb884
7 changed files with 58 additions and 18 deletions

View file

@ -59,6 +59,34 @@ std::vector<v8::Local<v8::Value>> ListValueToVector(
return result;
}
void EmitIPCEvent(blink::WebFrame* frame,
const base::string16& channel,
const base::ListValue& args) {
if (!frame || frame->isWebRemoteFrame())
return;
v8::Isolate* isolate = blink::mainThreadIsolate();
v8::HandleScope handle_scope(isolate);
v8::Local<v8::Context> context = frame->mainWorldScriptContext();
v8::Context::Scope context_scope(context);
// Only emit IPC event for context with node integration.
node::Environment* env = node::Environment::GetCurrent(context);
if (!env)
return;
v8::Local<v8::Object> ipc;
if (GetIPCObject(isolate, context, &ipc)) {
auto args_vector = ListValueToVector(isolate, args);
// Insert the Event object, event.sender is ipc.
mate::Dictionary event = mate::Dictionary::CreateEmpty(isolate);
event.Set("sender", ipc);
args_vector.insert(args_vector.begin(), event.GetHandle());
mate::EmitEvent(isolate, ipc, channel, args_vector);
}
}
base::StringPiece NetResourceProvider(int key) {
if (key == IDR_DIR_HEADER_HTML) {
base::StringPiece html_data =
@ -123,7 +151,8 @@ bool AtomRenderViewObserver::OnMessageReceived(const IPC::Message& message) {
return handled;
}
void AtomRenderViewObserver::OnBrowserMessage(const base::string16& channel,
void AtomRenderViewObserver::OnBrowserMessage(bool send_to_all,
const base::string16& channel,
const base::ListValue& args) {
if (!document_created_)
return;
@ -135,20 +164,13 @@ void AtomRenderViewObserver::OnBrowserMessage(const base::string16& channel,
if (!frame || frame->isWebRemoteFrame())
return;
v8::Isolate* isolate = blink::mainThreadIsolate();
v8::HandleScope handle_scope(isolate);
EmitIPCEvent(frame, channel, args);
v8::Local<v8::Context> context = frame->mainWorldScriptContext();
v8::Context::Scope context_scope(context);
v8::Local<v8::Object> ipc;
if (GetIPCObject(isolate, context, &ipc)) {
auto args_vector = ListValueToVector(isolate, args);
// Insert the Event object, event.sender is ipc.
mate::Dictionary event = mate::Dictionary::CreateEmpty(isolate);
event.Set("sender", ipc);
args_vector.insert(args_vector.begin(), event.GetHandle());
mate::EmitEvent(isolate, ipc, channel, args_vector);
// Also send the message to all sub-frames.
if (send_to_all) {
for (blink::WebFrame* child = frame->firstChild(); child;
child = child->nextSibling())
EmitIPCEvent(child, channel, args);
}
}

View file

@ -30,7 +30,8 @@ class AtomRenderViewObserver : public content::RenderViewObserver {
void DraggableRegionsChanged(blink::WebFrame* frame) override;
bool OnMessageReceived(const IPC::Message& message) override;
void OnBrowserMessage(const base::string16& channel,
void OnBrowserMessage(bool send_to_all,
const base::string16& channel,
const base::ListValue& args);
// Weak reference to renderer client.