Add support for setting http referrer

- Add url option to specify the http referrer
- Add httpReferrer attribute to webview

NOTE: This is still not complete. Some love has to be done to
guest-view-manager.coffee and very likely the function calls called
createGuest and to the code that uses them.
This commit is contained in:
Frank Hale 2014-11-06 14:29:41 -05:00
parent fea5559fbc
commit f56d1ea7b4
6 changed files with 61 additions and 16 deletions

View file

@ -286,8 +286,14 @@ bool WebContents::IsAlive() const {
return web_contents() != NULL; return web_contents() != NULL;
} }
void WebContents::LoadURL(const GURL& url) { void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) {
content::NavigationController::LoadURLParams params(url); content::NavigationController::LoadURLParams params(url);
base::string16 http_referrer_;
if(options.Get("httpReferrer", &http_referrer_))
params.referrer = content::Referrer(GURL(http_referrer_).GetAsReferrer(), blink::WebReferrerPolicyDefault);
params.transition_type = content::PAGE_TRANSITION_TYPED; params.transition_type = content::PAGE_TRANSITION_TYPED;
params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE; params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE;
web_contents()->GetController().LoadURLWithParams(params); web_contents()->GetController().LoadURLWithParams(params);
@ -313,15 +319,15 @@ void WebContents::Stop() {
web_contents()->Stop(); web_contents()->Stop();
} }
void WebContents::Reload() { void WebContents::Reload(const mate::Dictionary& options) {
// Navigating to a URL would always restart the renderer process, we want this // Navigating to a URL would always restart the renderer process, we want this
// because normal reloading will break our node integration. // because normal reloading will break our node integration.
// This is done by AtomBrowserClient::ShouldSwapProcessesForNavigation. // This is done by AtomBrowserClient::ShouldSwapProcessesForNavigation.
LoadURL(GetURL()); LoadURL(GetURL(), options);
} }
void WebContents::ReloadIgnoringCache() { void WebContents::ReloadIgnoringCache(const mate::Dictionary& options) {
Reload(); Reload(options);
} }
bool WebContents::CanGoBack() const { bool WebContents::CanGoBack() const {

View file

@ -41,14 +41,14 @@ class WebContents : public mate::EventEmitter,
void Destroy(); void Destroy();
bool IsAlive() const; bool IsAlive() const;
void LoadURL(const GURL& url); void LoadURL(const GURL& url, const mate::Dictionary& options);
GURL GetURL() const; GURL GetURL() const;
base::string16 GetTitle() const; base::string16 GetTitle() const;
bool IsLoading() const; bool IsLoading() const;
bool IsWaitingForResponse() const; bool IsWaitingForResponse() const;
void Stop(); void Stop();
void Reload(); void Reload(const mate::Dictionary& options);
void ReloadIgnoringCache(); void ReloadIgnoringCache(const mate::Dictionary& options);
bool CanGoBack() const; bool CanGoBack() const;
bool CanGoForward() const; bool CanGoForward() const;
bool CanGoToOffset(int offset) const; bool CanGoToOffset(int offset) const;

View file

@ -11,6 +11,8 @@ BrowserWindow::__proto__ = EventEmitter.prototype
BrowserWindow.windows = new IDWeakMap BrowserWindow.windows = new IDWeakMap
BrowserWindow::_init = -> BrowserWindow::_init = ->
@urlOptions = {}
# Simulate the application menu on platforms other than OS X. # Simulate the application menu on platforms other than OS X.
if process.platform isnt 'darwin' if process.platform isnt 'darwin'
menu = app.getApplicationMenu() menu = app.getApplicationMenu()
@ -84,14 +86,23 @@ BrowserWindow.fromId = (id) ->
BrowserWindow.windows.get id BrowserWindow.windows.get id
# Helpers. # Helpers.
BrowserWindow::loadUrl = -> @webContents.loadUrl.apply @webContents, arguments BrowserWindow::loadUrl = ->
args = [].slice.call arguments
unless args.length > 1
args.push @urlOptions
#TODO: This needs fixing!
@urlOptions = args[1]
@webContents.loadUrl.apply @webContents, args
BrowserWindow::send = -> @webContents.send.apply @webContents, arguments BrowserWindow::send = -> @webContents.send.apply @webContents, arguments
# Be compatible with old API. # Be compatible with old API.
BrowserWindow::restart = -> @webContents.reload() BrowserWindow::restart = -> @webContents.reload()
BrowserWindow::getUrl = -> @webContents.getUrl() BrowserWindow::getUrl = -> @webContents.getUrl()
BrowserWindow::reload = -> @webContents.reload() BrowserWindow::reload = -> @webContents.reload(@urlOptions)
BrowserWindow::reloadIgnoringCache = -> @webContents.reloadIgnoringCache() BrowserWindow::reloadIgnoringCache = -> @webContents.reloadIgnoringCache(@urlOptions)
BrowserWindow::getPageTitle = -> @webContents.getTitle() BrowserWindow::getPageTitle = -> @webContents.getTitle()
BrowserWindow::isLoading = -> @webContents.isLoading() BrowserWindow::isLoading = -> @webContents.isLoading()
BrowserWindow::isWaitingForResponse = -> @webContents.isWaitingForResponse() BrowserWindow::isWaitingForResponse = -> @webContents.isWaitingForResponse()

View file

@ -47,7 +47,7 @@ createGuest = (embedder, params) ->
max = width: params.maxwidth, height: params.maxheight max = width: params.maxwidth, height: params.maxheight
@setAutoSize params.autosize, min, max @setAutoSize params.autosize, min, max
if params.src if params.src
@loadUrl params.src @loadUrl params.src, params.urlOptions
if params.allowtransparency? if params.allowtransparency?
@setAllowTransparency params.allowtransparency @setAllowTransparency params.allowtransparency

View file

@ -7,11 +7,11 @@ frameToGuest = {}
createGuest = (embedder, url, frameName, options) -> createGuest = (embedder, url, frameName, options) ->
guest = frameToGuest[frameName] guest = frameToGuest[frameName]
if frameName and guest? if frameName and guest?
guest.loadUrl url guest.loadUrl url {}
return guest.id return guest.id
guest = new BrowserWindow(options) guest = new BrowserWindow(options)
guest.loadUrl url guest.loadUrl url {}
# When |embedder| is destroyed we should also destroy attached guest, and if # When |embedder| is destroyed we should also destroy attached guest, and if
# guest is closed by user then we should prevent |embedder| from double # guest is closed by user then we should prevent |embedder| from double

View file

@ -94,6 +94,8 @@ class WebView
# on* Event handlers. # on* Event handlers.
@on = {} @on = {}
@urlOptions = {}
@browserPluginNode = @createBrowserPluginNode() @browserPluginNode = @createBrowserPluginNode()
shadowRoot = @webviewNode.createShadowRoot() shadowRoot = @webviewNode.createShadowRoot()
@partition = new Partition() @partition = new Partition()
@ -197,6 +199,12 @@ class WebView
# No setter. # No setter.
enumerable: true enumerable: true
@httpReferrer = @webviewNode.getAttribute 'httpReferrer'
Object.defineProperty @webviewNode, 'httpReferrer',
get: => @httpReferrer
set: (value) => @webviewNode.setAttribute 'httpReferrer', value
enumerable: true
# The purpose of this mutation observer is to catch assignment to the src # The purpose of this mutation observer is to catch assignment to the src
# attribute without any changes to its value. This is useful in the case # attribute without any changes to its value. This is useful in the case
# where the webview guest has crashed and navigating to the same address # where the webview guest has crashed and navigating to the same address
@ -211,7 +219,7 @@ class WebView
params = params =
attributes: true, attributes: true,
attributeOldValue: true, attributeOldValue: true,
attributeFilter: ['src', 'partition'] attributeFilter: ['src', 'partition', 'httpReferrer']
@srcAndPartitionObserver.observe @webviewNode, params @srcAndPartitionObserver.observe @webviewNode, params
# This observer monitors mutations to attributes of the <webview> and # This observer monitors mutations to attributes of the <webview> and
@ -245,6 +253,22 @@ class WebView
return unless @guestInstanceId return unless @guestInstanceId
guestViewInternal.setAllowTransparency @guestInstanceId, @allowtransparency guestViewInternal.setAllowTransparency @guestInstanceId, @allowtransparency
else if name is 'httpReferrer'
oldValue ?= ''
newValue ?= ''
if newValue == '' and oldValue != ''
@webviewNode.setAttribute 'httpReferrer', oldValue
@httpReferrer = newValue
result = {}
# I think the right thing to do if you change your referrer is to reload
# the src since I've bundled the referrer in with the parseSrcAttribute.
# I think it makes sense to do that.
@parseSrcAttribute result
throw result.error if result.error?
else if name is 'src' else if name is 'src'
# We treat null attribute (attribute removed) and the empty string as # We treat null attribute (attribute removed) and the empty string as
# one case. # one case.
@ -363,8 +387,11 @@ class WebView
@createGuest() @createGuest()
return return
if @httpReferrer
@urlOptions = { "httpReferrer": @httpReferrer }
# Navigate to |this.src|. # Navigate to |this.src|.
remote.getGuestWebContents(@guestInstanceId).loadUrl @src remote.getGuestWebContents(@guestInstanceId).loadUrl @src, @urlOptions
parseAttributes: -> parseAttributes: ->
return unless @elementAttached return unless @elementAttached
@ -447,6 +474,7 @@ class WebView
# set via this.onAttach(). # set via this.onAttach().
storagePartitionId: @partition.toAttribute() storagePartitionId: @partition.toAttribute()
userAgentOverride: @userAgentOverride userAgentOverride: @userAgentOverride
urlOptions: @urlOptions
attachWindow: (guestInstanceId, isNewWindow) -> attachWindow: (guestInstanceId, isNewWindow) ->
@guestInstanceId = guestInstanceId @guestInstanceId = guestInstanceId