From c14c6a3521e1e9ada3449611f72471703764d6bb Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 26 Jan 2015 15:50:10 -0800 Subject: [PATCH 1/4] spec: The preload script should be able to receive ipc messages --- spec/fixtures/module/preload-ipc.js | 4 ++++ spec/webview-spec.coffee | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 spec/fixtures/module/preload-ipc.js diff --git a/spec/fixtures/module/preload-ipc.js b/spec/fixtures/module/preload-ipc.js new file mode 100644 index 000000000000..9b6e0201248e --- /dev/null +++ b/spec/fixtures/module/preload-ipc.js @@ -0,0 +1,4 @@ +var ipc = require('ipc'); +ipc.on('ping', function(message) { + ipc.sendToHost('pong', message); +}); diff --git a/spec/webview-spec.coffee b/spec/webview-spec.coffee index 1f0968204bb2..6419d4ab0452 100644 --- a/spec/webview-spec.coffee +++ b/spec/webview-spec.coffee @@ -58,6 +58,22 @@ describe ' tag', -> webview.src = "file://#{fixtures}/pages/e.html" document.body.appendChild webview + it 'receives ipc message in preload script', (done) -> + message = 'boom!' + listener = (e) -> + assert.equal e.channel, 'pong' + assert.deepEqual e.args, [message] + webview.removeEventListener 'ipc-message', listener + done() + listener2 = (e) -> + webview.send 'ping', message + webview.removeEventListener 'did-finish-load', listener2 + webview.addEventListener 'ipc-message', listener + webview.addEventListener 'did-finish-load', listener2 + webview.setAttribute 'preload', "#{fixtures}/module/preload-ipc.js" + webview.src = "file://#{fixtures}/pages/e.html" + document.body.appendChild webview + describe 'httpreferrer attribute', -> it 'sets the referrer url', (done) -> referrer = 'http://github.com/' From a10782cdea3ad7ae0e869164f8f08721f0f2842a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 26 Jan 2015 18:42:43 -0800 Subject: [PATCH 2/4] Don't rely on the global process object for message dispatching --- atom/renderer/api/lib/ipc.coffee | 35 ++++++++++------------ atom/renderer/atom_render_view_observer.cc | 12 ++++---- atom/renderer/lib/init.coffee | 5 ++++ 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/atom/renderer/api/lib/ipc.coffee b/atom/renderer/api/lib/ipc.coffee index 1dfb9b408334..5215b2c5f2e8 100644 --- a/atom/renderer/api/lib/ipc.coffee +++ b/atom/renderer/api/lib/ipc.coffee @@ -1,26 +1,23 @@ -EventEmitter = require('events').EventEmitter -process = global.process -ipc = process.atomBinding('ipc') +binding = process.atomBinding 'ipc' +v8Util = process.atomBinding 'v8_util' -class Ipc extends EventEmitter - constructor: -> - process.on 'ATOM_INTERNAL_MESSAGE', (args...) => - @emit args... +# Created by init.coffee. +ipc = v8Util.getHiddenValue global, 'ipc' - window.addEventListener 'unload', (event) -> - process.removeAllListeners 'ATOM_INTERNAL_MESSAGE' +ipc.on 'ATOM_INTERNAL_MESSAGE', (args...) -> + @emit args... - send: (args...) -> - ipc.send 'ipc-message', [args...] +ipc.send = (args...) -> + binding.send 'ipc-message', [args...] - sendSync: (args...) -> - JSON.parse ipc.sendSync('ipc-message-sync', [args...]) +ipc.sendSync = (args...) -> + JSON.parse binding.sendSync('ipc-message-sync', [args...]) - sendToHost: (args...) -> - ipc.send 'ipc-message-host', [args...] +ipc.sendToHost = (args...) -> + binding.send 'ipc-message-host', [args...] - # Discarded - sendChannel: -> @send.apply this, arguments - sendChannelSync: -> @sendSync.apply this, arguments +# Deprecated. +ipc.sendChannel = ipc.send +ipc.sendChannelSync = ipc.sendSync -module.exports = new Ipc +module.exports = ipc diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index ebb836fb9a63..046b02902642 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -29,10 +29,10 @@ namespace atom { namespace { -v8::Handle GetProcessObject(v8::Isolate* isolate, - v8::Handle context) { - v8::Handle key = mate::StringToV8(isolate, "process"); - return context->Global()->Get(key)->ToObject(); +v8::Handle GetIPCObject(v8::Isolate* isolate, + v8::Handle context) { + v8::Handle key = mate::StringToV8(isolate, "ipc"); + return context->Global()->GetHiddenValue(key)->ToObject(); } std::vector> ListValueToVector( @@ -118,8 +118,8 @@ void AtomRenderViewObserver::OnBrowserMessage(const base::string16& channel, isolate, args); arguments.insert(arguments.begin(), mate::ConvertToV8(isolate, channel)); - v8::Handle process = GetProcessObject(isolate, context); - node::MakeCallback(isolate, process, "emit", arguments.size(), &arguments[0]); + v8::Handle ipc = GetIPCObject(isolate, context); + node::MakeCallback(isolate, ipc, "emit", arguments.size(), &arguments[0]); } } // namespace atom diff --git a/atom/renderer/lib/init.coffee b/atom/renderer/lib/init.coffee index eca509994ad0..b90677462753 100644 --- a/atom/renderer/lib/init.coffee +++ b/atom/renderer/lib/init.coffee @@ -1,4 +1,5 @@ process = global.process +events = require 'events' path = require 'path' url = require 'url' Module = require 'module' @@ -21,6 +22,10 @@ globalPaths.push path.join(process.resourcesPath, 'app') # Import common settings. require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init') +# The global variable will be used by ipc for event dispatching +v8Util = process.atomBinding 'v8_util' +v8Util.setHiddenValue global, 'ipc', new events.EventEmitter + # Process command line arguments. nodeIntegration = 'false' for arg in process.argv From ad16e9ea4937ca6daf1c9007619ba04c462d1a98 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 26 Jan 2015 18:47:23 -0800 Subject: [PATCH 3/4] Check for the existence of "ipc" object --- atom/renderer/atom_render_view_observer.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index 046b02902642..afaf20b08aef 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -29,10 +29,15 @@ namespace atom { namespace { -v8::Handle GetIPCObject(v8::Isolate* isolate, - v8::Handle context) { +bool GetIPCObject(v8::Isolate* isolate, + v8::Handle context, + v8::Handle* ipc) { v8::Handle key = mate::StringToV8(isolate, "ipc"); - return context->Global()->GetHiddenValue(key)->ToObject(); + v8::Handle value = context->Global()->GetHiddenValue(key); + if (value.IsEmpty() || !value->IsObject()) + return false; + *ipc = value->ToObject(); + return true; } std::vector> ListValueToVector( @@ -118,8 +123,9 @@ void AtomRenderViewObserver::OnBrowserMessage(const base::string16& channel, isolate, args); arguments.insert(arguments.begin(), mate::ConvertToV8(isolate, channel)); - v8::Handle ipc = GetIPCObject(isolate, context); - node::MakeCallback(isolate, ipc, "emit", arguments.size(), &arguments[0]); + v8::Handle ipc; + if (GetIPCObject(isolate, context, &ipc)) + node::MakeCallback(isolate, ipc, "emit", arguments.size(), &arguments[0]); } } // namespace atom From 20431f4f2fb4b036d74ce86bf3785519595ef2d2 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 27 Jan 2015 10:47:11 -0800 Subject: [PATCH 4/4] No need to route via ATOM_INTERNAL_MESSAGE --- atom/browser/api/lib/web-contents.coffee | 4 ++-- atom/renderer/api/lib/ipc.coffee | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/atom/browser/api/lib/web-contents.coffee b/atom/browser/api/lib/web-contents.coffee index 5217a7b386de..cb772fd8c27e 100644 --- a/atom/browser/api/lib/web-contents.coffee +++ b/atom/browser/api/lib/web-contents.coffee @@ -9,8 +9,8 @@ module.exports.wrap = (webContents) -> webContents.__proto__ = EventEmitter.prototype # WebContents::send(channel, args..) - webContents.send = (args...) -> - @_send 'ATOM_INTERNAL_MESSAGE', [args...] + webContents.send = (channel, args...) -> + @_send channel, [args...] # Make sure webContents.executeJavaScript would run the code only when the # web contents has been loaded. diff --git a/atom/renderer/api/lib/ipc.coffee b/atom/renderer/api/lib/ipc.coffee index 5215b2c5f2e8..1c508a3a5493 100644 --- a/atom/renderer/api/lib/ipc.coffee +++ b/atom/renderer/api/lib/ipc.coffee @@ -4,9 +4,6 @@ v8Util = process.atomBinding 'v8_util' # Created by init.coffee. ipc = v8Util.getHiddenValue global, 'ipc' -ipc.on 'ATOM_INTERNAL_MESSAGE', (args...) -> - @emit args... - ipc.send = (args...) -> binding.send 'ipc-message', [args...]