diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 9be2862c190e..f4f4b7f659f4 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -82,6 +82,15 @@ void Window::OnPageTitleUpdated(bool* prevent_default, *prevent_default = Emit("page-title-updated", args); } +void Window::WillCreatePopupWindow(const base::string16& frame_name, + const GURL& target_url, + const std::string& partition_id) { + base::ListValue args; + args.AppendString(target_url.spec()); + args.AppendString(frame_name); + Emit("new-window", args); +} + void Window::WillCloseWindow(bool* prevent_default) { *prevent_default = Emit("close"); } diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 4caccefc414d..f17861359b81 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -45,6 +45,9 @@ class Window : public mate::EventEmitter, // Implementations of NativeWindowObserver: void OnPageTitleUpdated(bool* prevent_default, const std::string& title) override; + void WillCreatePopupWindow(const base::string16& frame_name, + const GURL& target_url, + const std::string& partition_id) override; void WillCloseWindow(bool* prevent_default) override; void OnWindowClosed() override; void OnWindowBlur() override; diff --git a/atom/browser/api/lib/browser-window.coffee b/atom/browser/api/lib/browser-window.coffee index 360f069e59aa..a21499d788a3 100644 --- a/atom/browser/api/lib/browser-window.coffee +++ b/atom/browser/api/lib/browser-window.coffee @@ -23,6 +23,10 @@ BrowserWindow::_init = -> value: BrowserWindow.windows.add(this) enumerable: true + # Route the "new-window" event to webContents. + @on 'new-window', (args...) => + @webContents?.emit 'new-window', args... + # Remove the window from weak map immediately when it's destroyed, since we # could be iterating windows before GC happened. @once 'closed', => diff --git a/atom/browser/api/lib/web-contents.coffee b/atom/browser/api/lib/web-contents.coffee index fa4bed486923..8ddcf361eb6c 100644 --- a/atom/browser/api/lib/web-contents.coffee +++ b/atom/browser/api/lib/web-contents.coffee @@ -2,6 +2,10 @@ EventEmitter = require('events').EventEmitter binding = process.atomBinding 'web_contents' ipc = require 'ipc' +# Routed window.open messages. +ipc.on 'ATOM_SHELL_WEB_CONTENTS_WINDOW_OPEN', (event, url, name, features) -> + event.sender.emit 'new-window', url, name, features + module.exports.wrap = (webContents) -> return null unless webContents.isAlive() diff --git a/atom/renderer/lib/override.coffee b/atom/renderer/lib/override.coffee index d9ece6696bbc..e876e10bacee 100644 --- a/atom/renderer/lib/override.coffee +++ b/atom/renderer/lib/override.coffee @@ -1,34 +1,31 @@ process = global.process +ipc = require 'ipc' remote = require 'remote' -unless process.guestInstanceId? - # Override default window.close, see: +if process.guestInstanceId? + # Override default window.close. window.close = -> remote.getCurrentWindow().close() - # Override default window.open. - window.open = (url, name, features) -> - options = {} - for feature in features.split ',' - [name, value] = feature.split '=' - options[name] = - if value is 'yes' - true - else if value is 'no' - false - else - value +# Make the browser window or guest view emit "new-window" event. +window.open = (url, name='', features='') -> + options = {} + for feature in features.split ',' + [name, value] = feature.split '=' + options[name] = + if value is 'yes' + true + else if value is 'no' + false + else + value + options.x ?= options.left + options.y ?= options.top + options.title ?= name + options.width ?= 800 + options.height ?= 600 - options.x ?= options.left - options.y ?= options.top - options.title ?= name - options.width ?= 800 - options.height ?= 600 - - BrowserWindow = require('remote').require 'browser-window' - browser = new BrowserWindow options - browser.loadUrl url - browser + ipc.send 'ATOM_SHELL_WEB_CONTENTS_WINDOW_OPEN', url, name, features # Use the dialog API to implement alert(). window.alert = (message, title='') ->