diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index ffca4a077ba7..5045efae2a37 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -90,7 +90,8 @@ bool WebContents::ShouldCreateWebContents( base::ListValue args; args.AppendString(target_url.spec()); args.AppendString(frame_name); - Emit("new-window", args); + args.AppendInteger(NEW_FOREGROUND_TAB); + Emit("-new-window", args); return false; } @@ -101,8 +102,14 @@ void WebContents::CloseContents(content::WebContents* source) { content::WebContents* WebContents::OpenURLFromTab( content::WebContents* source, const content::OpenURLParams& params) { - if (params.disposition != CURRENT_TAB) - return NULL; + if (params.disposition != CURRENT_TAB) { + base::ListValue args; + args.AppendString(params.url.spec()); + args.AppendString(""); + args.AppendInteger(params.disposition); + Emit("-new-window", args); + return NULL; + } content::NavigationController::LoadURLParams load_url_params(params.url); load_url_params.referrer = params.referrer; diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 4756d324da3d..1f4a4bbe6ce4 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -85,11 +85,13 @@ void Window::OnPageTitleUpdated(bool* prevent_default, void Window::WillCreatePopupWindow(const base::string16& frame_name, const GURL& target_url, - const std::string& partition_id) { + const std::string& partition_id, + WindowOpenDisposition disposition) { base::ListValue args; args.AppendString(target_url.spec()); args.AppendString(frame_name); - Emit("new-window", args); + args.AppendInteger(disposition); + Emit("-new-window", args); } void Window::WillCloseWindow(bool* prevent_default) { diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index d4abf42bf5cc..905559a8c35f 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -48,7 +48,8 @@ class Window : public mate::EventEmitter, const std::string& title) override; void WillCreatePopupWindow(const base::string16& frame_name, const GURL& target_url, - const std::string& partition_id) override; + const std::string& partition_id, + WindowOpenDisposition disposition) 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 7d27234d0a2a..e855a93524fc 100644 --- a/atom/browser/api/lib/browser-window.coffee +++ b/atom/browser/api/lib/browser-window.coffee @@ -25,7 +25,7 @@ BrowserWindow::_init = -> enumerable: true # Make new windows requested by links behave like "window.open" - @on 'new-window', (event, url, frameName) => + @on '-new-window', (event, url, frameName) => event.sender = @webContents options = show: true, width: 800, height: 600 ipc.emit 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, options diff --git a/atom/browser/api/lib/web-contents.coffee b/atom/browser/api/lib/web-contents.coffee index fa4bed486923..e22d5e01c2b7 100644 --- a/atom/browser/api/lib/web-contents.coffee +++ b/atom/browser/api/lib/web-contents.coffee @@ -26,6 +26,17 @@ module.exports.wrap = (webContents) -> webContents.getId = -> "#{@getProcessId()}-#{@getRoutingId()}" webContents.equal = (other) -> @getId() is other.getId() + # Translate |disposition| to string for 'new-window' event. + webContents.on '-new-window', (args..., disposition) -> + disposition = + switch disposition + when 2 then 'default' + when 4 then 'foreground-tab' + when 5 then 'background-tab' + when 6, 7 then 'new-window' + else 'other' + @emit 'new-window', args..., disposition + # Tell the rpc server that a render view has been deleted and we need to # release all objects owned by it. webContents.on 'render-view-deleted', (event, processId, routingId) -> diff --git a/atom/browser/lib/guest-window-manager.coffee b/atom/browser/lib/guest-window-manager.coffee index 67aac2ea77f7..123c3898a9d4 100644 --- a/atom/browser/lib/guest-window-manager.coffee +++ b/atom/browser/lib/guest-window-manager.coffee @@ -34,7 +34,8 @@ createGuest = (embedder, url, frameName, options) -> # Routed window.open messages. ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) -> - event.sender.emit 'new-window', event, args... + [url, frameName, options] = args + event.sender.emit '-new-window', event, url, frameName, 7 if event.sender.isGuest() or event.defaultPrevented event.returnValue = null else diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 3a4a7437986c..a4366649b3a1 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -437,7 +437,8 @@ bool NativeWindow::ShouldCreateWebContents( observers_, WillCreatePopupWindow(frame_name, target_url, - partition_id)); + partition_id, + NEW_FOREGROUND_TAB)); return false; } @@ -448,8 +449,15 @@ bool NativeWindow::ShouldCreateWebContents( content::WebContents* NativeWindow::OpenURLFromTab( content::WebContents* source, const content::OpenURLParams& params) { - if (params.disposition != CURRENT_TAB) - return NULL; + if (params.disposition != CURRENT_TAB) { + FOR_EACH_OBSERVER(NativeWindowObserver, + observers_, + WillCreatePopupWindow(base::string16(), + params.url, + "", + params.disposition)); + return NULL; + } content::NavigationController::LoadURLParams load_url_params(params.url); load_url_params.referrer = params.referrer; diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index f91f426762be..3d3240585f4d 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -8,6 +8,7 @@ #include #include "base/strings/string16.h" +#include "ui/base/window_open_disposition.h" #include "url/gurl.h" namespace atom { @@ -23,7 +24,8 @@ class NativeWindowObserver { // Called when the web page in window wants to create a popup window. virtual void WillCreatePopupWindow(const base::string16& frame_name, const GURL& target_url, - const std::string& partition_id) {} + const std::string& partition_id, + WindowOpenDisposition disposition) {} // Called when the window is gonna closed. virtual void WillCloseWindow(bool* prevent_default) {} diff --git a/atom/renderer/lib/guest-view-internal.coffee b/atom/renderer/lib/guest-view-internal.coffee index e5e64d0a8066..76474d27ec54 100644 --- a/atom/renderer/lib/guest-view-internal.coffee +++ b/atom/renderer/lib/guest-view-internal.coffee @@ -10,7 +10,7 @@ WEB_VIEW_EVENTS = 'did-stop-loading': [] 'did-get-redirect-request': ['oldUrl', 'newUrl', 'isMainFrame'] 'console-message': ['level', 'message', 'line', 'sourceId'] - 'new-window': ['url', 'frameName'] + 'new-window': ['url', 'frameName', 'disposition'] 'close': [] 'crashed': [] 'destroyed': [] diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 4455770334f5..8406f328d5bf 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -551,7 +551,8 @@ Emitted when a redirect was received while requesting a resource. * `event` Event * `url` String * `frameName` String -* `options` Object +* `disposition` String - Can be `default`, `foreground-tab`, `background-tab`, + `new-window` and `other` Emitted when the page requested to open a new window for `url`. It could be requested by `window.open` or an external link like ``. diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index 7b801d9bd692..d0b574539eb1 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -250,6 +250,8 @@ webview.addEventListener('console-message', function(e) { * `url` String * `frameName` String +* `disposition` String - Can be `default`, `foreground-tab`, `background-tab`, + `new-window` and `other` Fired when the guest page attempts to open a new browser window.