Merge pull request #4917 from deepak1556/new_window_disposition_patch
browser: fix disposition value for new-window event
This commit is contained in:
commit
0416e65b8b
10 changed files with 91 additions and 29 deletions
|
@ -229,6 +229,23 @@ void App::OnLogin(LoginHandler* login_handler) {
|
||||||
login_handler->CancelAuth();
|
login_handler->CancelAuth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void App::OnCreateWindow(const GURL& target_url,
|
||||||
|
const std::string& frame_name,
|
||||||
|
WindowOpenDisposition disposition,
|
||||||
|
int render_process_id,
|
||||||
|
int render_frame_id) {
|
||||||
|
v8::Locker locker(isolate());
|
||||||
|
v8::HandleScope handle_scope(isolate());
|
||||||
|
content::RenderFrameHost* rfh =
|
||||||
|
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
|
||||||
|
content::WebContents* web_contents =
|
||||||
|
content::WebContents::FromRenderFrameHost(rfh);
|
||||||
|
if (web_contents) {
|
||||||
|
auto api_web_contents = WebContents::CreateFrom(isolate(), web_contents);
|
||||||
|
api_web_contents->CreateWindow(target_url, frame_name, disposition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void App::AllowCertificateError(
|
void App::AllowCertificateError(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
int cert_error,
|
int cert_error,
|
||||||
|
|
|
@ -34,6 +34,13 @@ class App : public AtomBrowserClient::Delegate,
|
||||||
public:
|
public:
|
||||||
static mate::Handle<App> Create(v8::Isolate* isolate);
|
static mate::Handle<App> Create(v8::Isolate* isolate);
|
||||||
|
|
||||||
|
// Called when window with disposition needs to be created.
|
||||||
|
void OnCreateWindow(const GURL& target_url,
|
||||||
|
const std::string& frame_name,
|
||||||
|
WindowOpenDisposition disposition,
|
||||||
|
int render_process_id,
|
||||||
|
int render_frame_id);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
App();
|
App();
|
||||||
virtual ~App();
|
virtual ~App();
|
||||||
|
|
|
@ -316,21 +316,13 @@ bool WebContents::AddMessageToConsole(content::WebContents* source,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebContents::ShouldCreateWebContents(
|
void WebContents::CreateWindow(const GURL& target_url,
|
||||||
content::WebContents* web_contents,
|
const std::string& frame_name,
|
||||||
int32_t route_id,
|
WindowOpenDisposition disposition) {
|
||||||
int32_t main_frame_route_id,
|
|
||||||
int32_t main_frame_widget_route_id,
|
|
||||||
WindowContainerType window_container_type,
|
|
||||||
const std::string& frame_name,
|
|
||||||
const GURL& target_url,
|
|
||||||
const std::string& partition_id,
|
|
||||||
content::SessionStorageNamespace* session_storage_namespace) {
|
|
||||||
if (type_ == BROWSER_WINDOW)
|
if (type_ == BROWSER_WINDOW)
|
||||||
Emit("-new-window", target_url, frame_name, NEW_FOREGROUND_TAB);
|
Emit("-new-window", target_url, frame_name, disposition);
|
||||||
else
|
else
|
||||||
Emit("new-window", target_url, frame_name, NEW_FOREGROUND_TAB);
|
Emit("new-window", target_url, frame_name, disposition);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
content::WebContents* WebContents::OpenURLFromTab(
|
content::WebContents* WebContents::OpenURLFromTab(
|
||||||
|
|
|
@ -138,6 +138,11 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
||||||
const GURL& origin,
|
const GURL& origin,
|
||||||
bool allowed);
|
bool allowed);
|
||||||
|
|
||||||
|
// Create window with the given disposition.
|
||||||
|
void CreateWindow(const GURL& target_url,
|
||||||
|
const std::string& frame_name,
|
||||||
|
WindowOpenDisposition disposition);
|
||||||
|
|
||||||
// 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);
|
||||||
|
|
||||||
|
@ -165,16 +170,6 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
||||||
const base::string16& message,
|
const base::string16& message,
|
||||||
int32_t line_no,
|
int32_t line_no,
|
||||||
const base::string16& source_id) override;
|
const base::string16& source_id) override;
|
||||||
bool ShouldCreateWebContents(
|
|
||||||
content::WebContents* web_contents,
|
|
||||||
int32_t route_id,
|
|
||||||
int32_t main_frame_route_id,
|
|
||||||
int32_t main_frame_widget_route_id,
|
|
||||||
WindowContainerType window_container_type,
|
|
||||||
const std::string& frame_name,
|
|
||||||
const GURL& target_url,
|
|
||||||
const std::string& partition_id,
|
|
||||||
content::SessionStorageNamespace* session_storage_namespace) override;
|
|
||||||
content::WebContents* OpenURLFromTab(
|
content::WebContents* OpenURLFromTab(
|
||||||
content::WebContents* source,
|
content::WebContents* source,
|
||||||
const content::OpenURLParams& params) override;
|
const content::OpenURLParams& params) override;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "atom/browser/api/atom_api_app.h"
|
||||||
#include "atom/browser/atom_access_token_store.h"
|
#include "atom/browser/atom_access_token_store.h"
|
||||||
#include "atom/browser/atom_browser_context.h"
|
#include "atom/browser/atom_browser_context.h"
|
||||||
#include "atom/browser/atom_browser_main_parts.h"
|
#include "atom/browser/atom_browser_main_parts.h"
|
||||||
|
@ -264,6 +265,39 @@ void AtomBrowserClient::ResourceDispatcherHostCreated() {
|
||||||
resource_dispatcher_host_delegate_.get());
|
resource_dispatcher_host_delegate_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AtomBrowserClient::CanCreateWindow(
|
||||||
|
const GURL& opener_url,
|
||||||
|
const GURL& opener_top_level_frame_url,
|
||||||
|
const GURL& source_origin,
|
||||||
|
WindowContainerType container_type,
|
||||||
|
const std::string& frame_name,
|
||||||
|
const GURL& target_url,
|
||||||
|
const content::Referrer& referrer,
|
||||||
|
WindowOpenDisposition disposition,
|
||||||
|
const blink::WebWindowFeatures& features,
|
||||||
|
bool user_gesture,
|
||||||
|
bool opener_suppressed,
|
||||||
|
content::ResourceContext* context,
|
||||||
|
int render_process_id,
|
||||||
|
int opener_render_view_id,
|
||||||
|
int opener_render_frame_id,
|
||||||
|
bool* no_javascript_access) {
|
||||||
|
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
||||||
|
|
||||||
|
if (delegate_) {
|
||||||
|
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
||||||
|
base::Bind(&api::App::OnCreateWindow,
|
||||||
|
base::Unretained(static_cast<api::App*>(delegate_)),
|
||||||
|
target_url,
|
||||||
|
frame_name,
|
||||||
|
disposition,
|
||||||
|
render_process_id,
|
||||||
|
opener_render_frame_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts(
|
brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts(
|
||||||
const content::MainFunctionParams&) {
|
const content::MainFunctionParams&) {
|
||||||
v8::V8::Initialize(); // Init V8 before creating main parts.
|
v8::V8::Initialize(); // Init V8 before creating main parts.
|
||||||
|
|
|
@ -76,6 +76,22 @@ class AtomBrowserClient : public brightray::BrowserClient,
|
||||||
net::SSLCertRequestInfo* cert_request_info,
|
net::SSLCertRequestInfo* cert_request_info,
|
||||||
scoped_ptr<content::ClientCertificateDelegate> delegate) override;
|
scoped_ptr<content::ClientCertificateDelegate> delegate) override;
|
||||||
void ResourceDispatcherHostCreated() override;
|
void ResourceDispatcherHostCreated() override;
|
||||||
|
bool CanCreateWindow(const GURL& opener_url,
|
||||||
|
const GURL& opener_top_level_frame_url,
|
||||||
|
const GURL& source_origin,
|
||||||
|
WindowContainerType container_type,
|
||||||
|
const std::string& frame_name,
|
||||||
|
const GURL& target_url,
|
||||||
|
const content::Referrer& referrer,
|
||||||
|
WindowOpenDisposition disposition,
|
||||||
|
const blink::WebWindowFeatures& features,
|
||||||
|
bool user_gesture,
|
||||||
|
bool opener_suppressed,
|
||||||
|
content::ResourceContext* context,
|
||||||
|
int render_process_id,
|
||||||
|
int opener_render_view_id,
|
||||||
|
int opener_render_frame_id,
|
||||||
|
bool* no_javascript_access) override;
|
||||||
|
|
||||||
// brightray::BrowserClient:
|
// brightray::BrowserClient:
|
||||||
brightray::BrowserMainParts* OverrideCreateBrowserMainParts(
|
brightray::BrowserMainParts* OverrideCreateBrowserMainParts(
|
||||||
|
|
|
@ -21,14 +21,14 @@ 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) => {
|
this.webContents.on('-new-window', (event, url, frameName, disposition) => {
|
||||||
var options
|
var options
|
||||||
options = {
|
options = {
|
||||||
show: true,
|
show: true,
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600
|
height: 600
|
||||||
}
|
}
|
||||||
return ipcMain.emit('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, options)
|
return ipcMain.emit('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, disposition, options)
|
||||||
})
|
})
|
||||||
|
|
||||||
// window.resizeTo(...)
|
// window.resizeTo(...)
|
||||||
|
|
|
@ -80,9 +80,9 @@ var createGuest = function (embedder, url, frameName, options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Routed window.open messages.
|
// Routed window.open messages.
|
||||||
ipcMain.on('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', function (event, url, frameName, options) {
|
ipcMain.on('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', function (event, url, frameName, disposition, options) {
|
||||||
options = mergeBrowserWindowOptions(event.sender, options)
|
options = mergeBrowserWindowOptions(event.sender, options)
|
||||||
event.sender.emit('new-window', event, url, frameName, 'new-window', options)
|
event.sender.emit('new-window', event, url, frameName, disposition, options)
|
||||||
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 {
|
||||||
|
|
|
@ -100,6 +100,7 @@ window.open = function (url, frameName, features) {
|
||||||
// TODO remove hyphenated options in both of the following arrays for 1.0
|
// TODO remove hyphenated options in both of the following arrays for 1.0
|
||||||
const ints = ['x', 'y', 'width', 'height', 'min-width', 'minWidth', 'max-width', 'maxWidth', 'min-height', 'minHeight', 'max-height', 'maxHeight', 'zoom-factor', 'zoomFactor']
|
const ints = ['x', 'y', 'width', 'height', 'min-width', 'minWidth', 'max-width', 'maxWidth', 'min-height', 'minHeight', 'max-height', 'maxHeight', 'zoom-factor', 'zoomFactor']
|
||||||
const webPreferences = ['zoom-factor', 'zoomFactor', 'node-integration', 'nodeIntegration', 'preload']
|
const webPreferences = ['zoom-factor', 'zoomFactor', 'node-integration', 'nodeIntegration', 'preload']
|
||||||
|
const disposition = 'new-window'
|
||||||
|
|
||||||
// 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*/)
|
||||||
|
@ -146,7 +147,7 @@ window.open = function (url, frameName, features) {
|
||||||
options[name] = parseInt(options[name], 10)
|
options[name] = parseInt(options[name], 10)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
guestId = ipcRenderer.sendSync('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, options)
|
guestId = ipcRenderer.sendSync('ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, disposition, options)
|
||||||
if (guestId) {
|
if (guestId) {
|
||||||
return BrowserWindowProxy.getOrCreate(guestId)
|
return BrowserWindowProxy.getOrCreate(guestId)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -8,7 +8,7 @@ import sys
|
||||||
|
|
||||||
BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \
|
BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \
|
||||||
'https://s3.amazonaws.com/github-janky-artifacts/libchromiumcontent'
|
'https://s3.amazonaws.com/github-janky-artifacts/libchromiumcontent'
|
||||||
LIBCHROMIUMCONTENT_COMMIT = 'b06d4c307b861cdb091f4ba26b1a185333889033'
|
LIBCHROMIUMCONTENT_COMMIT = 'd41c1e48f428257d99abcf29fd9f26928e9fc53e'
|
||||||
|
|
||||||
PLATFORM = {
|
PLATFORM = {
|
||||||
'cygwin': 'win32',
|
'cygwin': 'win32',
|
||||||
|
|
Loading…
Reference in a new issue