diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 5045efae2a..8bb6a35816 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -286,8 +286,15 @@ bool WebContents::IsAlive() const { 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); + + 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.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE; web_contents()->GetController().LoadURLWithParams(params); @@ -313,15 +320,15 @@ void WebContents::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 // because normal reloading will break our node integration. // This is done by AtomBrowserClient::ShouldSwapProcessesForNavigation. - LoadURL(GetURL()); + LoadURL(GetURL(), options); } -void WebContents::ReloadIgnoringCache() { - Reload(); +void WebContents::ReloadIgnoringCache(const mate::Dictionary& options) { + Reload(options); } bool WebContents::CanGoBack() const { diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index c29221008c..7f6a697190 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -41,14 +41,14 @@ class WebContents : public mate::EventEmitter, void Destroy(); bool IsAlive() const; - void LoadURL(const GURL& url); + void LoadURL(const GURL& url, const mate::Dictionary& options); GURL GetURL() const; base::string16 GetTitle() const; bool IsLoading() const; bool IsWaitingForResponse() const; void Stop(); - void Reload(); - void ReloadIgnoringCache(); + void Reload(const mate::Dictionary& options); + void ReloadIgnoringCache(const mate::Dictionary& options); bool CanGoBack() const; bool CanGoForward() const; bool CanGoToOffset(int offset) const; diff --git a/atom/browser/api/lib/browser-window.coffee b/atom/browser/api/lib/browser-window.coffee index e855a93524..243ad1ac3c 100644 --- a/atom/browser/api/lib/browser-window.coffee +++ b/atom/browser/api/lib/browser-window.coffee @@ -84,14 +84,15 @@ BrowserWindow.fromId = (id) -> BrowserWindow.windows.get id # Helpers. -BrowserWindow::loadUrl = -> @webContents.loadUrl.apply @webContents, arguments +BrowserWindow::loadUrl = (url, urlOptions={}) -> @webContents.loadUrl url, urlOptions + BrowserWindow::send = -> @webContents.send.apply @webContents, arguments # Be compatible with old API. BrowserWindow::restart = -> @webContents.reload() BrowserWindow::getUrl = -> @webContents.getUrl() -BrowserWindow::reload = -> @webContents.reload() -BrowserWindow::reloadIgnoringCache = -> @webContents.reloadIgnoringCache() +BrowserWindow::reload = (urlOptions={}) -> @webContents.reload(urlOptions) +BrowserWindow::reloadIgnoringCache = (urlOptions={}) -> @webContents.reloadIgnoringCache(urlOptions) BrowserWindow::getPageTitle = -> @webContents.getTitle() BrowserWindow::isLoading = -> @webContents.isLoading() BrowserWindow::isWaitingForResponse = -> @webContents.isWaitingForResponse() diff --git a/atom/browser/api/lib/web-contents.coffee b/atom/browser/api/lib/web-contents.coffee index e22d5e01c2..a0c8a00e7c 100644 --- a/atom/browser/api/lib/web-contents.coffee +++ b/atom/browser/api/lib/web-contents.coffee @@ -26,6 +26,13 @@ module.exports.wrap = (webContents) -> webContents.getId = -> "#{@getProcessId()}-#{@getRoutingId()}" webContents.equal = (other) -> @getId() is other.getId() + # Provide a default parameter for urlOptions to be compatible with the old + # API. + webContents::loadUrl = (url, urlOptions={}) -> loadUrl url, urlOptions + webContents::reload = (urlOptions={}) -> reload(urlOptions) + webContents::reloadIgnoringCache = (urlOptions={}) -> + reloadIgnoringCache(urlOptions) + # Translate |disposition| to string for 'new-window' event. webContents.on '-new-window', (args..., disposition) -> disposition = diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index a5c5d021f4..5b6377847a 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -47,7 +47,7 @@ createGuest = (embedder, params) -> max = width: params.maxwidth, height: params.maxheight @setAutoSize params.autosize, min, max if params.src - @loadUrl params.src + @loadUrl params.src, params.urlOptions if params.allowtransparency? @setAllowTransparency params.allowtransparency diff --git a/atom/renderer/lib/web-view.coffee b/atom/renderer/lib/web-view.coffee index ee11683d9a..96abb48657 100644 --- a/atom/renderer/lib/web-view.coffee +++ b/atom/renderer/lib/web-view.coffee @@ -94,6 +94,8 @@ class WebView # on* Event handlers. @on = {} + @urlOptions = {} + @browserPluginNode = @createBrowserPluginNode() shadowRoot = @webviewNode.createShadowRoot() @partition = new Partition() @@ -197,6 +199,12 @@ class WebView # No setter. 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 # 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 @@ -211,7 +219,7 @@ class WebView params = attributes: true, attributeOldValue: true, - attributeFilter: ['src', 'partition'] + attributeFilter: ['src', 'partition', 'httpreferrer'] @srcAndPartitionObserver.observe @webviewNode, params # This observer monitors mutations to attributes of the and @@ -245,6 +253,21 @@ class WebView return unless @guestInstanceId guestViewInternal.setAllowTransparency @guestInstanceId, @allowtransparency + else if name is 'httpreferrer' + oldValue ?= '' + newValue ?= '' + + if newValue == '' and oldValue != '' + @webviewNode.setAttribute 'httpreferrer', oldValue + + @httpReferrer = newValue + + result = {} + # If the httpreferrer changes treat it as though the src changes and reload + # the page with the new httpreferrer. + @parseSrcAttribute result + + throw result.error if result.error? else if name is 'src' # We treat null attribute (attribute removed) and the empty string as # one case. @@ -363,8 +386,11 @@ class WebView @createGuest() return + if @httpReferrer + @urlOptions = { "httpreferrer": @httpReferrer } + # Navigate to |this.src|. - remote.getGuestWebContents(@guestInstanceId).loadUrl @src + remote.getGuestWebContents(@guestInstanceId).loadUrl @src, @urlOptions parseAttributes: -> return unless @elementAttached @@ -447,6 +473,7 @@ class WebView # set via this.onAttach(). storagePartitionId: @partition.toAttribute() userAgentOverride: @userAgentOverride + urlOptions: @urlOptions attachWindow: (guestInstanceId, isNewWindow) -> @guestInstanceId = guestInstanceId