From 56dfef8d0d5da95f9189412dc4d8770b4d0f5770 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 14 Jul 2015 11:38:30 -0700 Subject: [PATCH 1/5] spec: Test user agent in websocket --- spec/chromium-spec.coffee | 23 +++++++++++++++++++++++ spec/package.json | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spec/chromium-spec.coffee b/spec/chromium-spec.coffee index 88a3487cc9d2..8ca7e9800fe5 100644 --- a/spec/chromium-spec.coffee +++ b/spec/chromium-spec.coffee @@ -2,6 +2,7 @@ assert = require 'assert' http = require 'http' https = require 'https' path = require 'path' +ws = require 'ws' describe 'chromium feature', -> fixtures = path.resolve __dirname, 'fixtures' @@ -88,3 +89,25 @@ describe 'chromium feature', -> navigator.webkitPersistentStorage.requestQuota 1024 * 1024, (grantedBytes) -> assert.equal grantedBytes, 1048576 done() + + describe 'websockets', -> + wss = null + server = null + WebSocketServer = ws.Server + + afterEach -> + wss.close() + server.close() + + it 'has user agent', (done) -> + server = http.createServer() + server.listen 0, '127.0.0.1', -> + port = server.address().port + wss = new WebSocketServer(server: server) + wss.on 'error', done + wss.on 'connection', (ws) -> + if ws.upgradeReq.headers['user-agent'] + done() + else + done('user agent is empty') + websocket = new WebSocket("ws://127.0.0.1:#{port}") diff --git a/spec/package.json b/spec/package.json index 6e9489e601d8..6343832dcc8e 100644 --- a/spec/package.json +++ b/spec/package.json @@ -11,6 +11,7 @@ "q": "0.9.7", "runas": "2.x", "temp": "0.8.1", - "walkdir": "0.0.7" + "walkdir": "0.0.7", + "ws": "0.7.2" } } From 940db1d1ddcd15030b25399de6ae63c50b2a14d4 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 14 Jul 2015 11:40:07 -0700 Subject: [PATCH 2/5] Provide default user agent in BrowserContext --- atom/browser/api/atom_api_web_contents.cc | 25 ----------------------- atom/browser/atom_browser_context.cc | 24 ++++++++++++++++++++++ atom/browser/atom_browser_context.h | 1 + vendor/brightray | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index c84ace171af6..5490b505860a 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -6,15 +6,12 @@ #include -#include "atom/browser/browser.h" #include "atom/browser/api/atom_api_session.h" #include "atom/browser/atom_browser_client.h" #include "atom/browser/atom_browser_context.h" #include "atom/browser/atom_browser_main_parts.h" #include "atom/browser/native_window.h" #include "atom/browser/web_view_guest_delegate.h" -#include "atom/common/atom_version.h" -#include "atom/common/chrome_version.h" #include "atom/common/api/api_messages.h" #include "atom/common/event_emitter_caller.h" #include "atom/common/native_mate_converters/gfx_converter.h" @@ -23,7 +20,6 @@ #include "atom/common/native_mate_converters/string16_converter.h" #include "atom/common/native_mate_converters/value_converter.h" #include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "brightray/browser/inspectable_web_contents.h" #include "chrome/browser/printing/print_view_manager_basic.h" @@ -40,7 +36,6 @@ #include "content/public/browser/storage_partition.h" #include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" -#include "content/public/common/user_agent.h" #include "native_mate/callback.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" @@ -57,14 +52,6 @@ struct PrintSettings { bool print_background; }; -std::string RemoveWhitespace(const std::string& str) { - std::string trimmed; - if (base::RemoveChars(str, " ", &trimmed)) - return trimmed; - else - return str; -} - void SetUserAgentInIO(scoped_refptr getter, std::string user_agent) { getter->GetURLRequestContext()->set_http_user_agent_settings( @@ -187,7 +174,6 @@ WebContents::WebContents(const mate::Dictionary& options) { Observe(web_contents); AttachAsUserData(web_contents); InitWithWebContents(web_contents); - SetUserAgent(std::string()); if (is_guest) { guest_delegate_->Initialize(this); @@ -567,17 +553,6 @@ bool WebContents::IsCrashed() const { } void WebContents::SetUserAgent(const std::string& user_agent) { - if (user_agent.empty()) { - // Default User Agent. - Browser* browser = Browser::Get(); - std::string product_name = base::StringPrintf( - "%s/%s Chrome/%s " ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING, - RemoveWhitespace(browser->GetName()).c_str(), - browser->GetVersion().c_str(), - CHROME_VERSION_STRING); - const_cast(user_agent) = - content::BuildUserAgentFromProduct(product_name); - } web_contents()->SetUserAgentOverride(user_agent); scoped_refptr getter = web_contents()->GetBrowserContext()->GetRequestContext(); diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc index 66f1b4444a95..d7c8b8dbbcc3 100644 --- a/atom/browser/atom_browser_context.cc +++ b/atom/browser/atom_browser_context.cc @@ -6,16 +6,22 @@ #include "atom/browser/atom_browser_main_parts.h" #include "atom/browser/atom_download_manager_delegate.h" +#include "atom/browser/browser.h" #include "atom/browser/net/atom_url_request_job_factory.h" #include "atom/browser/net/asar/asar_protocol_handler.h" #include "atom/browser/net/http_protocol_handler.h" #include "atom/browser/web_view_manager.h" +#include "atom/common/atom_version.h" +#include "atom/common/chrome_version.h" #include "atom/common/options_switches.h" #include "base/command_line.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "base/threading/sequenced_worker_pool.h" #include "base/threading/worker_pool.h" #include "content/public/browser/browser_thread.h" #include "content/public/common/url_constants.h" +#include "content/public/common/user_agent.h" #include "net/ftp/ftp_network_layer.h" #include "net/url_request/data_protocol_handler.h" #include "net/url_request/ftp_protocol_handler.h" @@ -37,6 +43,14 @@ class NoCacheBackend : public net::HttpCache::BackendFactory { } }; +std::string RemoveWhitespace(const std::string& str) { + std::string trimmed; + if (base::RemoveChars(str, " ", &trimmed)) + return trimmed; + else + return str; +} + } // namespace AtomBrowserContext::AtomBrowserContext() @@ -46,6 +60,16 @@ AtomBrowserContext::AtomBrowserContext() AtomBrowserContext::~AtomBrowserContext() { } +std::string AtomBrowserContext::GetUserAgent() { + Browser* browser = Browser::Get(); + std::string user_agent = base::StringPrintf( + "%s/%s Chrome/%s " ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING, + RemoveWhitespace(browser->GetName()).c_str(), + browser->GetVersion().c_str(), + CHROME_VERSION_STRING); + return content::BuildUserAgentFromProduct(user_agent); +} + net::URLRequestJobFactory* AtomBrowserContext::CreateURLRequestJobFactory( content::ProtocolHandlerMap* handlers, content::URLRequestInterceptorScopedVector* interceptors) { diff --git a/atom/browser/atom_browser_context.h b/atom/browser/atom_browser_context.h index 4202ba970496..dd01c42dd7ef 100644 --- a/atom/browser/atom_browser_context.h +++ b/atom/browser/atom_browser_context.h @@ -19,6 +19,7 @@ class AtomBrowserContext : public brightray::BrowserContext { virtual ~AtomBrowserContext(); // brightray::URLRequestContextGetter::Delegate: + std::string GetUserAgent() override; net::URLRequestJobFactory* CreateURLRequestJobFactory( content::ProtocolHandlerMap* handlers, content::URLRequestInterceptorScopedVector* interceptors) override; diff --git a/vendor/brightray b/vendor/brightray index 6a38d97aa8f4..6328c6104131 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 6a38d97aa8f4e1ab1842416f632a2a45adfbc738 +Subproject commit 6328c6104131e623da87f479ea305b83169099b8 From 1615c97ce882b607dca37a499369418fa64c1d77 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 14 Jul 2015 12:12:55 -0700 Subject: [PATCH 3/5] Don't set two "Electron"s in user agent --- atom/browser/atom_browser_context.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc index d7c8b8dbbcc3..1874d5b03b19 100644 --- a/atom/browser/atom_browser_context.cc +++ b/atom/browser/atom_browser_context.cc @@ -62,11 +62,18 @@ AtomBrowserContext::~AtomBrowserContext() { std::string AtomBrowserContext::GetUserAgent() { Browser* browser = Browser::Get(); - std::string user_agent = base::StringPrintf( - "%s/%s Chrome/%s " ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING, - RemoveWhitespace(browser->GetName()).c_str(), - browser->GetVersion().c_str(), - CHROME_VERSION_STRING); + std::string name = RemoveWhitespace(browser->GetName()); + std::string user_agent; + if (name == ATOM_PRODUCT_NAME) { + user_agent = "Chrome/" CHROME_VERSION_STRING " " + ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING; + } else { + user_agent = base::StringPrintf( + "%s/%s Chrome/%s " ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING, + name.c_str(), + browser->GetVersion().c_str(), + CHROME_VERSION_STRING); + } return content::BuildUserAgentFromProduct(user_agent); } From 053594eae838af2cfe51f12ccc60fc0c088a7409 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 14 Jul 2015 12:13:25 -0700 Subject: [PATCH 4/5] Set default user agent for WebContents --- atom/browser/api/atom_api_web_contents.cc | 11 ++++++++--- atom/browser/api/atom_api_web_contents.h | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 5490b505860a..6311e1eaf9a4 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -149,6 +149,7 @@ WebContents::WebContents(content::WebContents* web_contents) : content::WebContentsObserver(web_contents), type_(REMOTE) { AttachAsUserData(web_contents); + web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent()); } WebContents::WebContents(const mate::Dictionary& options) { @@ -175,6 +176,8 @@ WebContents::WebContents(const mate::Dictionary& options) { AttachAsUserData(web_contents); InitWithWebContents(web_contents); + web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent()); + if (is_guest) { guest_delegate_->Initialize(this); @@ -630,9 +633,7 @@ void WebContents::InspectServiceWorker() { v8::Local WebContents::Session(v8::Isolate* isolate) { if (session_.IsEmpty()) { - mate::Handle handle = Session::CreateFrom( - isolate, - static_cast(web_contents()->GetBrowserContext())); + auto handle = Session::CreateFrom(isolate, GetBrowserContext()); session_.Reset(isolate, handle.ToV8()); } return v8::Local::New(isolate, session_); @@ -807,6 +808,10 @@ bool WebContents::IsDestroyed() const { return !IsAlive(); } +AtomBrowserContext* WebContents::GetBrowserContext() const { + return static_cast(web_contents()->GetBrowserContext()); +} + void WebContents::OnRendererMessage(const base::string16& channel, const base::ListValue& args) { // webContents.emit(channel, new Event(), args...); diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 085f82e3dd64..bb6b22ac84e2 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -27,6 +27,7 @@ class Dictionary; namespace atom { struct SetSizeParams; +class AtomBrowserContext; class WebViewGuestDelegate; namespace api { @@ -191,6 +192,8 @@ class WebContents : public mate::TrackableObject, REMOTE, // Thin wrap around an existing WebContents. }; + AtomBrowserContext* GetBrowserContext() const; + // Called when received a message from renderer. void OnRendererMessage(const base::string16& channel, const base::ListValue& args); From c6f870d4e4866c7c1cd0aef1443df03c8abe6762 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 14 Jul 2015 12:16:13 -0700 Subject: [PATCH 5/5] Fix cpplint warnings --- atom/browser/atom_browser_context.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/atom/browser/atom_browser_context.h b/atom/browser/atom_browser_context.h index dd01c42dd7ef..513cc86bca68 100644 --- a/atom/browser/atom_browser_context.h +++ b/atom/browser/atom_browser_context.h @@ -5,6 +5,8 @@ #ifndef ATOM_BROWSER_ATOM_BROWSER_CONTEXT_H_ #define ATOM_BROWSER_ATOM_BROWSER_CONTEXT_H_ +#include + #include "brightray/browser/browser_context.h" namespace atom {