From 54559f99a0eb19629229dab2208bf2760468090d Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Sat, 21 Jan 2017 14:56:58 +0530 Subject: [PATCH 1/4] Fix dereferencing nullptr RenderWidgetHostView might not be available when the navigator fails to load a url. --- atom/browser/api/atom_api_web_contents.cc | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index c4762c10b9..dca69a8ce7 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -900,14 +900,16 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) { // We have to call it right after LoadURL because the RenderViewHost is only // created after loading a page. const auto view = web_contents()->GetRenderWidgetHostView(); - WebContentsPreferences* web_preferences = - WebContentsPreferences::FromWebContents(web_contents()); - std::string color_name; - if (web_preferences->web_preferences()->GetString(options::kBackgroundColor, - &color_name)) { - view->SetBackgroundColor(ParseHexColor(color_name)); - } else { - view->SetBackgroundColor(SK_ColorTRANSPARENT); + if (view) { + WebContentsPreferences* web_preferences = + WebContentsPreferences::FromWebContents(web_contents()); + std::string color_name; + if (web_preferences->web_preferences()->GetString(options::kBackgroundColor, + &color_name)) { + view->SetBackgroundColor(ParseHexColor(color_name)); + } else { + view->SetBackgroundColor(SK_ColorTRANSPARENT); + } } } From f9dc08baf6c85d4c2fdcdeaa5cd41c21b3593f9b Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Sat, 21 Jan 2017 14:59:20 +0530 Subject: [PATCH 2/4] emit did-fail-load event when the url char length exceeds limit --- atom/browser/api/atom_api_web_contents.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index dca69a8ce7..afb6f4ce9d 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -861,7 +861,7 @@ bool WebContents::Equal(const WebContents* web_contents) const { } void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) { - if (!url.is_valid()) { + if (!url.is_valid() || url.spec().size() > url::kMaxURLChars) { Emit("did-fail-load", static_cast(net::ERR_INVALID_URL), net::ErrorToShortString(net::ERR_INVALID_URL), From 593a3de8509eb50432079f826c68ae6e476f7cab Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Mon, 23 Jan 2017 19:57:47 +0530 Subject: [PATCH 3/4] add spec --- spec/api-browser-window-spec.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index a07f301c8b..3dc786876a 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -218,6 +218,17 @@ describe('BrowserWindow module', function () { w.loadURL('http://127.0.0.1:11111') }) + it('should emit did-fail-load event for URL exceeding character limit', function (done) { + w.webContents.on('did-fail-load', function (event, code, desc, url, isMainFrame) { + assert.equal(desc, 'ERR_INVALID_URL') + assert.equal(code, -300) + assert.equal(isMainFrame, true) + done() + }) + let data = new Buffer(2 * 1024 * 1024).toString('base64') + w.loadURL('data:image/png;base64,' + data) + }) + describe('POST navigations', function () { afterEach(() => { w.webContents.session.webRequest.onBeforeSendHeaders(null) From d8a16a8ffb37cfce8aa0aff780be1799fedc9898 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Wed, 25 Jan 2017 14:20:33 +0530 Subject: [PATCH 4/4] fix spec --- spec/api-browser-window-spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 3dc786876a..f796973475 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -225,8 +225,8 @@ describe('BrowserWindow module', function () { assert.equal(isMainFrame, true) done() }) - let data = new Buffer(2 * 1024 * 1024).toString('base64') - w.loadURL('data:image/png;base64,' + data) + const data = new Buffer(2 * 1024 * 1024).toString('base64') + w.loadURL(`data:image/png;base64,${data}`) }) describe('POST navigations', function () {