diff --git a/atom/browser/lib/guest-window-manager.coffee b/atom/browser/lib/guest-window-manager.coffee index f92c1a46c05..861b0d10aa3 100644 --- a/atom/browser/lib/guest-window-manager.coffee +++ b/atom/browser/lib/guest-window-manager.coffee @@ -57,13 +57,19 @@ ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', (event, guestId, me if guestContents?.getUrl().indexOf(targetOrigin) is 0 or targetOrigin is '*' guestContents.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', message, targetOrigin -ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', (event, message, targetOrigin) -> +ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', (event, guestId, message, targetOrigin, sourceOrigin) -> embedder = v8Util.getHiddenValue event.sender, 'embedder' if embedder?.getUrl().indexOf(targetOrigin) is 0 or targetOrigin is '*' - embedder.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', message, targetOrigin + embedder.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', guestId, message, sourceOrigin ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) -> BrowserWindow.fromId(guestId)?.webContents?[method] args... -ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_IS_GUEST_WINDOW', (event) -> - event.returnValue = v8Util.getHiddenValue(event.sender, 'embedder') isnt undefined +ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID', (event) -> + embedder = v8Util.getHiddenValue event.sender, 'embedder' + if embedder? + guest = BrowserWindow.fromWebContents event.sender + if guest? + event.returnValue = guest.id + return + event.returnValue = null diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 86c9eb1cdeb..e17e8bf3db9 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -52,10 +52,6 @@ bool IsSwitchEnabled(base::CommandLine* command_line, return true; } -bool IsGuestFrame(blink::WebFrame* frame) { - return frame->uniqueName().utf8() == "ATOM_SHELL_GUEST_WEB_VIEW"; -} - // global.Uint8Array; v8::Local GetUint8ArrayConstructor( v8::Isolate* isolate, v8::Local context) { @@ -113,8 +109,7 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver { AtomRendererClient::AtomRendererClient() : node_bindings_(NodeBindings::Create(false)), - atom_bindings_(new AtomBindings), - main_frame_(nullptr) { + atom_bindings_(new AtomBindings) { } AtomRendererClient::~AtomRendererClient() { @@ -189,14 +184,9 @@ bool AtomRendererClient::OverrideCreatePlugin( void AtomRendererClient::DidCreateScriptContext( blink::WebFrame* frame, v8::Handle context) { - // Only attach node bindings in main frame or guest frame. - if (!IsGuestFrame(frame)) { - if (main_frame_) - return; - - // The first web frame is the main frame. - main_frame_ = frame; - } + // Only insert node integration for the main frame. + if (frame->parent()) + return; // Give the node loop a run to make sure everything is ready. node_bindings_->RunMessageLoop(); @@ -221,10 +211,6 @@ bool AtomRendererClient::ShouldFork(blink::WebFrame* frame, bool is_initial_navigation, bool is_server_redirect, bool* send_referrer) { - // Never fork renderer process for guests. - if (IsGuestFrame(frame)) - return false; - // Handle all the navigations and reloads in browser. // FIXME We only support GET here because http method will be ignored when // the OpenURLFromTab is triggered, which means form posting would not work, diff --git a/atom/renderer/atom_renderer_client.h b/atom/renderer/atom_renderer_client.h index 68201f3cd43..e59547cf8eb 100644 --- a/atom/renderer/atom_renderer_client.h +++ b/atom/renderer/atom_renderer_client.h @@ -64,9 +64,6 @@ class AtomRendererClient : public content::ContentRendererClient, scoped_ptr node_bindings_; scoped_ptr atom_bindings_; - // The main frame. - blink::WebFrame* main_frame_; - DISALLOW_COPY_AND_ASSIGN(AtomRendererClient); }; diff --git a/atom/renderer/lib/init.coffee b/atom/renderer/lib/init.coffee index 32d3ee76d1b..9825f75be92 100644 --- a/atom/renderer/lib/init.coffee +++ b/atom/renderer/lib/init.coffee @@ -29,8 +29,6 @@ for arg in process.argv if arg.indexOf('--guest-instance-id=') == 0 # This is a guest web view. process.guestInstanceId = parseInt arg.substr(arg.indexOf('=') + 1) - # Set the frame name to make AtomRendererClient recognize this guest. - require('web-frame').setName 'ATOM_SHELL_GUEST_WEB_VIEW' else if arg.indexOf('--node-integration=') == 0 nodeIntegration = arg.substr arg.indexOf('=') + 1 else if arg.indexOf('--preload=') == 0 diff --git a/atom/renderer/lib/override.coffee b/atom/renderer/lib/override.coffee index a413178442f..b60374e0475 100644 --- a/atom/renderer/lib/override.coffee +++ b/atom/renderer/lib/override.coffee @@ -94,14 +94,22 @@ window.confirm = (message, title='') -> window.prompt = -> throw new Error('prompt() is and will not be supported.') -# Simple implementation of postMessage. -if ipc.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_IS_GUEST_WINDOW' +# Implement window.postMessage if current window is a guest window. +guestId = ipc.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID' +if guestId? window.opener = postMessage: (message, targetOrigin='*') -> - ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', message, targetOrigin + ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', guestId, message, targetOrigin, location.origin -ipc.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (message, targetOrigin) -> - window.postMessage message, targetOrigin +ipc.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (guestId, message, sourceOrigin) -> + # Manually dispatch event instead of using postMessage because we also need to + # set event.source. + event = document.createEvent 'Event' + event.initEvent 'message', false, false + event.data = message + event.origin = sourceOrigin + event.source = new BrowserWindowProxy(guestId) + window.dispatchEvent event # Forward history operations to browser. sendHistoryOperation = (args...) -> diff --git a/spec/chromium-spec.coffee b/spec/chromium-spec.coffee index f98c8a75c74..c594a97f3b8 100644 --- a/spec/chromium-spec.coffee +++ b/spec/chromium-spec.coffee @@ -63,6 +63,15 @@ describe 'chromium feature', -> b.close() done(if opener isnt null then undefined else opener) + describe 'window.opener.postMessage', -> + it 'sets source and origin correctly', (done) -> + b = window.open "file://#{fixtures}/pages/window-opener-postMessage.html", 'test', 'show=no' + window.addEventListener 'message', (event) -> + b.close() + assert.equal event.source.guestId, b.guestId + assert.equal event.origin, 'file://' + done() + describe 'creating a Uint8Array under browser side', -> it 'does not crash', -> RUint8Array = remote.getGlobal 'Uint8Array' diff --git a/spec/fixtures/pages/post.html b/spec/fixtures/pages/post.html new file mode 100644 index 00000000000..06f6f365492 --- /dev/null +++ b/spec/fixtures/pages/post.html @@ -0,0 +1,10 @@ + + +
+

+
+ + + diff --git a/spec/fixtures/pages/window-opener-postMessage.html b/spec/fixtures/pages/window-opener-postMessage.html new file mode 100644 index 00000000000..5d0f8ede6d3 --- /dev/null +++ b/spec/fixtures/pages/window-opener-postMessage.html @@ -0,0 +1,7 @@ + + + + + diff --git a/spec/webview-spec.coffee b/spec/webview-spec.coffee index 7c2cd1a92ad..6eb391ac948 100644 --- a/spec/webview-spec.coffee +++ b/spec/webview-spec.coffee @@ -48,6 +48,14 @@ describe ' tag', -> webview.src = "file://#{fixtures}/pages/d.html" document.body.appendChild webview + it 'loads node symbols after POST navigation when set', (done) -> + webview.addEventListener 'console-message', (e) -> + assert.equal e.message, 'function object object' + done() + webview.setAttribute 'nodeintegration', 'on' + webview.src = "file://#{fixtures}/pages/post.html" + document.body.appendChild webview + # If the test is executed with the debug build on Windows, we will skip it # because native modules don't work with the debug build (see issue #2558). if process.platform isnt 'win32' or