From 3993161a635a59517741da6f219f404088673ad3 Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 5 May 2015 16:24:20 -0700 Subject: [PATCH 1/9] Define a new useragent attribute on WebView tag --- atom/renderer/lib/web-view/web-view-attributes.coffee | 1 + atom/renderer/lib/web-view/web-view-constants.coffee | 1 + 2 files changed, 2 insertions(+) diff --git a/atom/renderer/lib/web-view/web-view-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index 05bd6141203f..de370e124952 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -190,6 +190,7 @@ WebViewImpl::setupWebViewAttributes = -> @attributes[webViewConstants.ATTRIBUTE_PARTITION] = new PartitionAttribute(this) @attributes[webViewConstants.ATTRIBUTE_SRC] = new SrcAttribute(this) @attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER] = new HttpReferrerAttribute(this) + @attributes[webViewConstants.ATTRIBUTE_USERAGENT] = new UserAgentAttribute(this) @attributes[webViewConstants.ATTRIBUTE_NODEINTEGRATION] = new BooleanAttribute(webViewConstants.ATTRIBUTE_NODEINTEGRATION, this) @attributes[webViewConstants.ATTRIBUTE_PLUGINS] = new BooleanAttribute(webViewConstants.ATTRIBUTE_PLUGINS, this) @attributes[webViewConstants.ATTRIBUTE_DISABLEWEBSECURITY] = new BooleanAttribute(webViewConstants.ATTRIBUTE_DISABLEWEBSECURITY, this) diff --git a/atom/renderer/lib/web-view/web-view-constants.coffee b/atom/renderer/lib/web-view/web-view-constants.coffee index cda715423dd4..deb678e6a1e8 100644 --- a/atom/renderer/lib/web-view/web-view-constants.coffee +++ b/atom/renderer/lib/web-view/web-view-constants.coffee @@ -14,6 +14,7 @@ module.exports = ATTRIBUTE_PLUGINS: 'plugins' ATTRIBUTE_DISABLEWEBSECURITY: 'disablewebsecurity' ATTRIBUTE_PRELOAD: 'preload' + ATTRIBUTE_USERAGENT: 'useragent' # Internal attribute. ATTRIBUTE_INTERNALINSTANCEID: 'internalinstanceid' From 3a81a5224d74c2fbd7715ddde2ec81fab105910e Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 5 May 2015 16:25:05 -0700 Subject: [PATCH 2/9] Set up a class for it in web-view-attributes --- atom/renderer/lib/web-view/web-view-attributes.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/atom/renderer/lib/web-view/web-view-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index de370e124952..34304103ebbb 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -167,6 +167,11 @@ class HttpReferrerAttribute extends WebViewAttribute constructor: (webViewImpl) -> super webViewConstants.ATTRIBUTE_HTTPREFERRER, webViewImpl +# Attribute specifies HTTP referrer. +class UserAgentAttribute extends WebViewAttribute + constructor: (webViewImpl) -> + super webViewConstants.ATTRIBUTE_HTTPREFERRER, webViewImpl + # Attribute that set preload script. class PreloadAttribute extends WebViewAttribute constructor: (webViewImpl) -> From 4a8d7c18194570d29d0bcece3f9cdf0269986a7d Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 5 May 2015 16:25:16 -0700 Subject: [PATCH 3/9] Right before navigate, set the user agent --- atom/renderer/lib/web-view/web-view-attributes.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/atom/renderer/lib/web-view/web-view-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index 34304103ebbb..080300d02bf8 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -160,7 +160,12 @@ class SrcAttribute extends WebViewAttribute # Navigate to |this.src|. httpreferrer = @webViewImpl.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER].getValue() urlOptions = if httpreferrer then {httpreferrer} else {} - remote.getGuestWebContents(@webViewImpl.guestInstanceId).loadUrl @getValue(), urlOptions + + useragent = @webViewImpl.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER].getValue() + + guestContents = remote.getGuestWebContents(@webViewImpl.guestInstanceId) + guestContents.setUserAgent(guestContents) if guestContents + guestContents.loadUrl @getValue(), urlOptions # Attribute specifies HTTP referrer. class HttpReferrerAttribute extends WebViewAttribute From e4d90f747f83c69d3c31608eab9c5e4054ebdfd7 Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 5 May 2015 21:01:41 -0700 Subject: [PATCH 4/9] Pass user agent along like http referrer and set user agent in C++ --- atom/browser/api/atom_api_web_contents.cc | 4 ++++ atom/browser/lib/guest-view-manager.coffee | 7 +++++-- atom/renderer/lib/web-view/web-view-attributes.coffee | 9 +++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index e228a064f413..8814057b9b99 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -418,6 +418,10 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) { params.referrer = content::Referrer(http_referrer.GetAsReferrer(), blink::WebReferrerPolicyDefault); + std::string user_agent; + if (options.Get("useragent", &user_agent)) + this->SetUserAgent(user_agent); + params.transition_type = ui::PAGE_TRANSITION_TYPED; params.should_clear_history_list = true; params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE; diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index 43f4d7c98c5f..a8c930278db6 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -58,8 +58,11 @@ createGuest = (embedder, params) -> max = width: params.maxwidth, height: params.maxheight @setAutoSize params.autosize, min, max if params.src - if params.httpreferrer - @loadUrl params.src, {httpreferrer: params.httpreferrer} + opts = {} + opts.httpreferrer = params.httpreferrer if params.httpreferrer + opts.useragent = params.useragent if params.useragent + if params.httpreferrer or params.useragent + @loadUrl params.src, opts else @loadUrl params.src if params.allowtransparency? diff --git a/atom/renderer/lib/web-view/web-view-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index 080300d02bf8..bd00dc5322e9 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -158,13 +158,14 @@ class SrcAttribute extends WebViewAttribute return # Navigate to |this.src|. + opts = {} httpreferrer = @webViewImpl.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER].getValue() - urlOptions = if httpreferrer then {httpreferrer} else {} + if httpreferrer then opts.httpreferrer = httpreferrer - useragent = @webViewImpl.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER].getValue() + useragent = @webViewImpl.attributes[webViewConstants.ATTRIBUTE_USERAGENT].getValue() + if useragent then opts.useragent = useragent guestContents = remote.getGuestWebContents(@webViewImpl.guestInstanceId) - guestContents.setUserAgent(guestContents) if guestContents guestContents.loadUrl @getValue(), urlOptions # Attribute specifies HTTP referrer. @@ -175,7 +176,7 @@ class HttpReferrerAttribute extends WebViewAttribute # Attribute specifies HTTP referrer. class UserAgentAttribute extends WebViewAttribute constructor: (webViewImpl) -> - super webViewConstants.ATTRIBUTE_HTTPREFERRER, webViewImpl + super webViewConstants.ATTRIBUTE_USERAGENT, webViewImpl # Attribute that set preload script. class PreloadAttribute extends WebViewAttribute From 22f51372f58b1796266fd038f6e7ee22239a7412 Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 5 May 2015 21:18:08 -0700 Subject: [PATCH 5/9] Fix typo --- atom/renderer/lib/web-view/web-view-attributes.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/renderer/lib/web-view/web-view-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index bd00dc5322e9..9fd8e5151a78 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -166,7 +166,7 @@ class SrcAttribute extends WebViewAttribute if useragent then opts.useragent = useragent guestContents = remote.getGuestWebContents(@webViewImpl.guestInstanceId) - guestContents.loadUrl @getValue(), urlOptions + guestContents.loadUrl @getValue(), opts # Attribute specifies HTTP referrer. class HttpReferrerAttribute extends WebViewAttribute From 50c913fe92a703027ff2829026d19b4432804cc3 Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 5 May 2015 22:06:15 -0700 Subject: [PATCH 6/9] Add a test for the user agent --- spec/fixtures/pages/useragent.html | 7 +++++++ spec/webview-spec.coffee | 12 ++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 spec/fixtures/pages/useragent.html diff --git a/spec/fixtures/pages/useragent.html b/spec/fixtures/pages/useragent.html new file mode 100644 index 000000000000..4e19f5b8276a --- /dev/null +++ b/spec/fixtures/pages/useragent.html @@ -0,0 +1,7 @@ + + + + + diff --git a/spec/webview-spec.coffee b/spec/webview-spec.coffee index 54bc2e78817f..6d624eb9d81b 100644 --- a/spec/webview-spec.coffee +++ b/spec/webview-spec.coffee @@ -99,6 +99,18 @@ describe ' tag', -> webview.src = "file://#{fixtures}/pages/referrer.html" document.body.appendChild webview + describe 'useragent attribute', -> + it 'sets the user agent', (done) -> + referrer = 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko' + listener = (e) -> + assert.equal e.message, referrer + webview.removeEventListener 'console-message', listener + done() + webview.addEventListener 'console-message', listener + webview.setAttribute 'useragent', referrer + webview.src = "file://#{fixtures}/pages/useragent.html" + document.body.appendChild webview + describe 'disablewebsecurity attribute', -> it 'does not disable web security when not set', (done) -> src = " From ca63ea0882c00d3482750a57db15cbac088c728e Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 5 May 2015 22:08:39 -0700 Subject: [PATCH 7/9] Add documentation --- docs/api/web-view-tag.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index 89ae678b3c46..3e008a5db258 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -112,6 +112,14 @@ after this script has done execution. Sets the referrer URL for the guest page. +### useragent + +```html + +``` + +Sets the user agent for the guest page before the page is navigated to. Once the page is loaded, use the `setUserAgent` method to change the user agent. + ### disablewebsecurity ```html From 5ee0ff9ee909943213c8fcc49d965fa81c31ab55 Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Wed, 6 May 2015 14:21:43 -0700 Subject: [PATCH 8/9] Fixup code review items --- atom/browser/api/atom_api_web_contents.cc | 2 +- atom/renderer/lib/web-view/web-view-attributes.coffee | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 8814057b9b99..9894241f74ee 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -420,7 +420,7 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) { std::string user_agent; if (options.Get("useragent", &user_agent)) - this->SetUserAgent(user_agent); + SetUserAgent(user_agent); params.transition_type = ui::PAGE_TRANSITION_TYPED; params.should_clear_history_list = true; diff --git a/atom/renderer/lib/web-view/web-view-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index 9fd8e5151a78..51dd2475a4e0 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -173,7 +173,7 @@ class HttpReferrerAttribute extends WebViewAttribute constructor: (webViewImpl) -> super webViewConstants.ATTRIBUTE_HTTPREFERRER, webViewImpl -# Attribute specifies HTTP referrer. +# Attribute specifies user agent class UserAgentAttribute extends WebViewAttribute constructor: (webViewImpl) -> super webViewConstants.ATTRIBUTE_USERAGENT, webViewImpl From 975978b414f473fadc49fa2f7ad7b150965b6a72 Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Mon, 11 May 2015 10:00:41 -0700 Subject: [PATCH 9/9] Don't be so paranoid about empty opts --- atom/browser/lib/guest-view-manager.coffee | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index a8c930278db6..a02a1676e8e6 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -57,14 +57,13 @@ createGuest = (embedder, params) -> min = width: params.minwidth, height: params.minheight max = width: params.maxwidth, height: params.maxheight @setAutoSize params.autosize, min, max + if params.src opts = {} opts.httpreferrer = params.httpreferrer if params.httpreferrer opts.useragent = params.useragent if params.useragent - if params.httpreferrer or params.useragent - @loadUrl params.src, opts - else - @loadUrl params.src + @loadUrl params.src, opts + if params.allowtransparency? @setAllowTransparency params.allowtransparency