Updated required code to handle missing additional features for popup windows

This commit is contained in:
Michael Vasseur 2016-09-15 15:37:35 +02:00 committed by Cheng Zhao
parent ef88a06f08
commit c811188e22
9 changed files with 35 additions and 17 deletions

View file

@ -525,6 +525,7 @@ void App::OnLogin(LoginHandler* login_handler,
void App::OnCreateWindow(const GURL& target_url, void App::OnCreateWindow(const GURL& target_url,
const std::string& frame_name, const std::string& frame_name,
WindowOpenDisposition disposition, WindowOpenDisposition disposition,
const std::vector<base::string16>& features,
int render_process_id, int render_process_id,
int render_frame_id) { int render_frame_id) {
v8::Locker locker(isolate()); v8::Locker locker(isolate());
@ -535,7 +536,10 @@ void App::OnCreateWindow(const GURL& target_url,
content::WebContents::FromRenderFrameHost(rfh); content::WebContents::FromRenderFrameHost(rfh);
if (web_contents) { if (web_contents) {
auto api_web_contents = WebContents::CreateFrom(isolate(), web_contents); auto api_web_contents = WebContents::CreateFrom(isolate(), web_contents);
api_web_contents->OnCreateWindow(target_url, frame_name, disposition); api_web_contents->OnCreateWindow(target_url,
frame_name,
disposition,
features);
} }
} }

View file

@ -6,6 +6,7 @@
#define ATOM_BROWSER_API_ATOM_API_APP_H_ #define ATOM_BROWSER_API_ATOM_API_APP_H_
#include <string> #include <string>
#include <vector>
#include "atom/browser/api/event_emitter.h" #include "atom/browser/api/event_emitter.h"
#include "atom/browser/atom_browser_client.h" #include "atom/browser/atom_browser_client.h"
@ -50,6 +51,7 @@ class App : public AtomBrowserClient::Delegate,
void OnCreateWindow(const GURL& target_url, void OnCreateWindow(const GURL& target_url,
const std::string& frame_name, const std::string& frame_name,
WindowOpenDisposition disposition, WindowOpenDisposition disposition,
const std::vector<base::string16>& features,
int render_process_id, int render_process_id,
int render_frame_id); int render_frame_id);

View file

@ -416,11 +416,12 @@ bool WebContents::AddMessageToConsole(content::WebContents* source,
void WebContents::OnCreateWindow(const GURL& target_url, void WebContents::OnCreateWindow(const GURL& target_url,
const std::string& frame_name, const std::string& frame_name,
WindowOpenDisposition disposition) { WindowOpenDisposition disposition,
const std::vector<base::string16>& features) {
if (type_ == BROWSER_WINDOW || type_ == OFF_SCREEN) if (type_ == BROWSER_WINDOW || type_ == OFF_SCREEN)
Emit("-new-window", target_url, frame_name, disposition); Emit("-new-window", target_url, frame_name, disposition, features);
else else
Emit("new-window", target_url, frame_name, disposition); Emit("new-window", target_url, frame_name, disposition, features);
} }
void WebContents::WebContentsCreated(content::WebContents* source_contents, void WebContents::WebContentsCreated(content::WebContents* source_contents,

View file

@ -178,7 +178,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
// Create window with the given disposition. // Create window with the given disposition.
void OnCreateWindow(const GURL& target_url, void OnCreateWindow(const GURL& target_url,
const std::string& frame_name, const std::string& frame_name,
WindowOpenDisposition disposition); WindowOpenDisposition disposition,
const std::vector<base::string16>& features);
// Returns the web preferences of current WebContents. // Returns the web preferences of current WebContents.
v8::Local<v8::Value> GetWebPreferences(v8::Isolate* isolate); v8::Local<v8::Value> GetWebPreferences(v8::Isolate* isolate);

View file

@ -318,6 +318,7 @@ bool AtomBrowserClient::CanCreateWindow(
const content::Referrer& referrer, const content::Referrer& referrer,
WindowOpenDisposition disposition, WindowOpenDisposition disposition,
const blink::WebWindowFeatures& features, const blink::WebWindowFeatures& features,
const std::vector<base::string16>& additional_features,
bool user_gesture, bool user_gesture,
bool opener_suppressed, bool opener_suppressed,
content::ResourceContext* context, content::ResourceContext* context,
@ -339,6 +340,7 @@ bool AtomBrowserClient::CanCreateWindow(
target_url, target_url,
frame_name, frame_name,
disposition, disposition,
additional_features,
render_process_id, render_process_id,
opener_render_frame_id)); opener_render_frame_id));
} }

View file

@ -88,6 +88,7 @@ class AtomBrowserClient : public brightray::BrowserClient,
const content::Referrer& referrer, const content::Referrer& referrer,
WindowOpenDisposition disposition, WindowOpenDisposition disposition,
const blink::WebWindowFeatures& features, const blink::WebWindowFeatures& features,
const std::vector<base::string16>& additional_features,
bool user_gesture, bool user_gesture,
bool opener_suppressed, bool opener_suppressed,
content::ResourceContext* context, content::ResourceContext* context,

View file

@ -18,13 +18,13 @@ BrowserWindow.prototype._init = function () {
} }
// Make new windows requested by links behave like "window.open" // Make new windows requested by links behave like "window.open"
this.webContents.on('-new-window', (event, url, frameName, disposition) => { this.webContents.on('-new-window', (event, url, frameName, disposition, additionalFeatures) => {
const options = { const options = {
show: true, show: true,
width: 800, width: 800,
height: 600 height: 600
} }
ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, disposition, options) ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, disposition, options, additionalFeatures)
}) })
this.webContents.on('-web-contents-created', (event, webContents, url, this.webContents.on('-web-contents-created', (event, webContents, url,

View file

@ -135,9 +135,9 @@ const getGuestWindow = function (guestId) {
} }
// Routed window.open messages. // Routed window.open messages.
ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', function (event, url, frameName, disposition, options) { ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', function (event, url, frameName, disposition, options, additionalFeatures) {
options = mergeBrowserWindowOptions(event.sender, options) options = mergeBrowserWindowOptions(event.sender, options)
event.sender.emit('new-window', event, url, frameName, disposition, options) event.sender.emit('new-window', event, url, frameName, disposition, options, additionalFeatures)
if ((event.sender.isGuest() && !event.sender.allowPopups) || event.defaultPrevented) { if ((event.sender.isGuest() && !event.sender.allowPopups) || event.defaultPrevented) {
event.returnValue = null event.returnValue = null
} else { } else {

View file

@ -88,7 +88,7 @@ if (process.guestInstanceId == null) {
// Make the browser window or guest view emit "new-window" event. // Make the browser window or guest view emit "new-window" event.
window.open = function (url, frameName, features) { window.open = function (url, frameName, features) {
var feature, guestId, i, j, len, len1, name, options, ref1, ref2, value var feature, guestId, i, j, len, len1, name, options, ref1, ref2, value, additionalFeatures
if (frameName == null) { if (frameName == null) {
frameName = '' frameName = ''
} }
@ -101,6 +101,9 @@ window.open = function (url, frameName, features) {
const webPreferences = ['zoomFactor', 'nodeIntegration', 'preload'] const webPreferences = ['zoomFactor', 'nodeIntegration', 'preload']
const disposition = 'new-window' const disposition = 'new-window'
// Used to store additional features
additionalFeatures = []
// Make sure to get rid of excessive whitespace in the property name // Make sure to get rid of excessive whitespace in the property name
ref1 = features.split(/,\s*/) ref1 = features.split(/,\s*/)
for (i = 0, len = ref1.length; i < len; i++) { for (i = 0, len = ref1.length; i < len; i++) {
@ -109,6 +112,9 @@ window.open = function (url, frameName, features) {
name = ref2[0] name = ref2[0]
value = ref2[1] value = ref2[1]
value = value === 'yes' || value === '1' ? true : value === 'no' || value === '0' ? false : value value = value === 'yes' || value === '1' ? true : value === 'no' || value === '0' ? false : value
if (value === undefined) {
additionalFeatures.push(feature)
} else {
if (webPreferences.includes(name)) { if (webPreferences.includes(name)) {
if (options.webPreferences == null) { if (options.webPreferences == null) {
options.webPreferences = {} options.webPreferences = {}
@ -118,6 +124,7 @@ window.open = function (url, frameName, features) {
options[name] = value options[name] = value
} }
} }
}
if (options.left) { if (options.left) {
if (options.x == null) { if (options.x == null) {
options.x = options.left options.x = options.left
@ -150,7 +157,7 @@ window.open = function (url, frameName, features) {
options[name] = parseInt(options[name], 10) options[name] = parseInt(options[name], 10)
} }
} }
guestId = ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, disposition, options) guestId = ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, disposition, options, additionalFeatures)
if (guestId) { if (guestId) {
return BrowserWindowProxy.getOrCreate(guestId) return BrowserWindowProxy.getOrCreate(guestId)
} else { } else {