Skip to content

Commit

Permalink
Propagate referrer to new windows
Browse files Browse the repository at this point in the history
Fixes #9205
  • Loading branch information
nornagon committed Mar 21, 2018
1 parent e3dfffb commit 98ab903
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 13 deletions.
4 changes: 2 additions & 2 deletions atom/browser/api/atom_api_app.cc
Expand Up @@ -689,8 +689,8 @@ bool App::CanCreateWindow(
content::WebContents::FromRenderFrameHost(opener);
if (web_contents) {
auto api_web_contents = WebContents::CreateFrom(isolate(), web_contents);
api_web_contents->OnCreateWindow(target_url, frame_name, disposition,
additional_features, body);
api_web_contents->OnCreateWindow(target_url, referrer, frame_name,
disposition, additional_features, body);
}

return false;
Expand Down
5 changes: 3 additions & 2 deletions atom/browser/api/atom_api_web_contents.cc
Expand Up @@ -527,14 +527,15 @@ bool WebContents::DidAddMessageToConsole(content::WebContents* source,

void WebContents::OnCreateWindow(
const GURL& target_url,
const content::Referrer& referrer,
const std::string& frame_name,
WindowOpenDisposition disposition,
const std::vector<std::string>& features,
const scoped_refptr<content::ResourceRequestBody>& body) {
if (type_ == BROWSER_WINDOW || type_ == OFF_SCREEN)
Emit("-new-window", target_url, frame_name, disposition, features, body);
Emit("-new-window", target_url, referrer, frame_name, disposition, features, body);
else
Emit("new-window", target_url, frame_name, disposition, features);
Emit("new-window", target_url, referrer, frame_name, disposition, features);
}

void WebContents::WebContentsCreated(
Expand Down
1 change: 1 addition & 0 deletions atom/browser/api/atom_api_web_contents.h
Expand Up @@ -223,6 +223,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
// Create window with the given disposition.
void OnCreateWindow(
const GURL& target_url,
const content::Referrer& referrer,
const std::string& frame_name,
WindowOpenDisposition disposition,
const std::vector<std::string>& features,
Expand Down
10 changes: 10 additions & 0 deletions atom/common/native_mate_converters/content_converter.cc
Expand Up @@ -318,4 +318,14 @@ bool Converter<content::WebContents*>::FromV8(
return true;
}

// static
v8::Local<v8::Value> Converter<content::Referrer>::ToV8(
v8::Isolate* isolate, const content::Referrer& val) {
//return atom::api::WebContents::CreateFrom(isolate, val).ToV8();
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("url", ConvertToV8(isolate, val.url));
dict.Set("policy", ConvertToV8(isolate, (int)val.policy));
return mate::ConvertToV8(isolate, dict);
}

} // namespace mate
7 changes: 7 additions & 0 deletions atom/common/native_mate_converters/content_converter.h
Expand Up @@ -10,6 +10,7 @@
#include "content/public/browser/permission_type.h"
#include "content/public/common/menu_item.h"
#include "content/public/common/stop_find_action.h"
#include "content/public/common/referrer.h"
#include "native_mate/converter.h"
#include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h"

Expand Down Expand Up @@ -71,6 +72,12 @@ struct Converter<content::WebContents*> {
content::WebContents** out);
};

template<>
struct Converter<content::Referrer> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const content::Referrer& val);
};

} // namespace mate

#endif // ATOM_COMMON_NATIVE_MATE_CONVERTERS_CONTENT_CONVERTER_H_
7 changes: 4 additions & 3 deletions lib/browser/api/browser-window.js
Expand Up @@ -19,7 +19,7 @@ BrowserWindow.prototype._init = function () {
}

// 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, referrer, frameName,
disposition, additionalFeatures,
postData) => {
const options = {
Expand All @@ -28,7 +28,7 @@ BrowserWindow.prototype._init = function () {
height: 600
}
ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN',
event, url, frameName, disposition,
event, url, referrer, frameName, disposition,
options, additionalFeatures, postData)
})

Expand Down Expand Up @@ -59,8 +59,9 @@ BrowserWindow.prototype._init = function () {
height: height || 600,
webContents: webContents
}
const referrer = { url: '', policy: 2 }
ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN',
event, url, frameName, disposition, options)
event, url, referrer, frameName, disposition, options)
})

// window.resizeTo(...)
Expand Down
15 changes: 9 additions & 6 deletions lib/browser/guest-window-manager.js
Expand Up @@ -102,7 +102,7 @@ const setupGuest = function (embedder, frameName, guest, options) {
}

// Create a new guest created by |embedder| with |options|.
const createGuest = function (embedder, url, frameName, options, postData) {
const createGuest = function (embedder, url, referrer, frameName, options, postData) {
let guest = frameToGuest.get(frameName)
if (frameName && (guest != null)) {
guest.loadURL(url)
Expand Down Expand Up @@ -137,7 +137,9 @@ const createGuest = function (embedder, url, frameName, options, postData) {
//
// The above code would not work if a navigation to "about:blank" is done
// here, since the window would be cleared of all changes in the next tick.
const loadOptions = {}
const loadOptions = {
httpReferrer: referrer.url,
}
if (postData != null) {
loadOptions.postData = postData
loadOptions.extraHeaders = 'content-type: application/x-www-form-urlencoded'
Expand Down Expand Up @@ -242,13 +244,14 @@ ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, url, frameName,
}
}

const referrer = { url: '', policy: 2 }
ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', event,
url, frameName, disposition, options, additionalFeatures)
url, referrer, frameName, disposition, options, additionalFeatures)
})

// Routed window.open messages with fully parsed options
ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', function (event, url, frameName,
disposition, options,
ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', function (event, url, referrer,
frameName, disposition, options,
additionalFeatures, postData) {
options = mergeBrowserWindowOptions(event.sender, options)
event.sender.emit('new-window', event, url, frameName, disposition, options, additionalFeatures)
Expand All @@ -265,7 +268,7 @@ ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', function (event
event.returnValue = null
}
} else {
event.returnValue = createGuest(event.sender, url, frameName, options, postData)
event.returnValue = createGuest(event.sender, url, referrer, frameName, options, postData)
}
})

Expand Down

0 comments on commit 98ab903

Please sign in to comment.