summarylogtreecommitdiffstats
path: root/0001-fix-don-t-throw-on-bad-icons-in-BrowserWindow-constr.patch
diff options
context:
space:
mode:
Diffstat (limited to '0001-fix-don-t-throw-on-bad-icons-in-BrowserWindow-constr.patch')
-rw-r--r--0001-fix-don-t-throw-on-bad-icons-in-BrowserWindow-constr.patch160
1 files changed, 160 insertions, 0 deletions
diff --git a/0001-fix-don-t-throw-on-bad-icons-in-BrowserWindow-constr.patch b/0001-fix-don-t-throw-on-bad-icons-in-BrowserWindow-constr.patch
new file mode 100644
index 000000000000..e9ca24af1e86
--- /dev/null
+++ b/0001-fix-don-t-throw-on-bad-icons-in-BrowserWindow-constr.patch
@@ -0,0 +1,160 @@
+From 47640eaa9a5cd3d4ed53f841f34f30c49f89cff9 Mon Sep 17 00:00:00 2001
+From: Charles Kerr <charles@charleskerr.com>
+Date: Mon, 25 Jan 2021 14:44:04 -0600
+Subject: [PATCH] fix: don't throw on bad icons in BrowserWindow constructor
+ (#27441) (#27478)
+
+---
+ shell/browser/api/electron_api_base_window.cc | 11 ++++++--
+ shell/browser/api/electron_api_base_window.h | 3 ++
+ shell/common/api/electron_api_native_image.cc | 28 ++++++++++++++-----
+ shell/common/api/electron_api_native_image.h | 10 +++++--
+ spec-main/api-browser-window-spec.ts | 9 ++++++
+ 5 files changed, 49 insertions(+), 12 deletions(-)
+
+diff --git a/shell/browser/api/electron_api_base_window.cc b/shell/browser/api/electron_api_base_window.cc
+index 4995db43e..d053ed6e8 100644
+--- a/shell/browser/api/electron_api_base_window.cc
++++ b/shell/browser/api/electron_api_base_window.cc
+@@ -101,7 +101,7 @@ BaseWindow::BaseWindow(v8::Isolate* isolate,
+ #if defined(TOOLKIT_VIEWS)
+ v8::Local<v8::Value> icon;
+ if (options.Get(options::kIcon, &icon)) {
+- SetIcon(isolate, icon);
++ SetIconImpl(isolate, icon, NativeImage::OnConvertError::kWarn);
+ }
+ #endif
+ }
+@@ -999,8 +999,15 @@ bool BaseWindow::SetThumbarButtons(gin_helper::Arguments* args) {
+
+ #if defined(TOOLKIT_VIEWS)
+ void BaseWindow::SetIcon(v8::Isolate* isolate, v8::Local<v8::Value> icon) {
++ SetIconImpl(isolate, icon, NativeImage::OnConvertError::kThrow);
++}
++
++void BaseWindow::SetIconImpl(v8::Isolate* isolate,
++ v8::Local<v8::Value> icon,
++ NativeImage::OnConvertError on_error) {
+ NativeImage* native_image = nullptr;
+- if (!NativeImage::TryConvertNativeImage(isolate, icon, &native_image))
++ if (!NativeImage::TryConvertNativeImage(isolate, icon, &native_image,
++ on_error))
+ return;
+
+ #if defined(OS_WIN)
+diff --git a/shell/browser/api/electron_api_base_window.h b/shell/browser/api/electron_api_base_window.h
+index 912c2306f..2276e83b5 100644
+--- a/shell/browser/api/electron_api_base_window.h
++++ b/shell/browser/api/electron_api_base_window.h
+@@ -222,6 +222,9 @@ class BaseWindow : public gin_helper::TrackableObject<BaseWindow>,
+ bool SetThumbarButtons(gin_helper::Arguments* args);
+ #if defined(TOOLKIT_VIEWS)
+ void SetIcon(v8::Isolate* isolate, v8::Local<v8::Value> icon);
++ void SetIconImpl(v8::Isolate* isolate,
++ v8::Local<v8::Value> icon,
++ NativeImage::OnConvertError on_error);
+ #endif
+ #if defined(OS_WIN)
+ typedef base::RepeatingCallback<void(v8::Local<v8::Value>,
+diff --git a/shell/common/api/electron_api_native_image.cc b/shell/common/api/electron_api_native_image.cc
+index c786d0eb8..2c087a313 100644
+--- a/shell/common/api/electron_api_native_image.cc
++++ b/shell/common/api/electron_api_native_image.cc
+@@ -10,6 +10,7 @@
+ #include <vector>
+
+ #include "base/files/file_util.h"
++#include "base/logging.h"
+ #include "base/strings/pattern.h"
+ #include "base/strings/string_util.h"
+ #include "base/strings/utf_string_conversions.h"
+@@ -140,7 +141,10 @@ NativeImage::~NativeImage() {
+ // static
+ bool NativeImage::TryConvertNativeImage(v8::Isolate* isolate,
+ v8::Local<v8::Value> image,
+- NativeImage** native_image) {
++ NativeImage** native_image,
++ OnConvertError on_error) {
++ std::string error_message;
++
+ base::FilePath icon_path;
+ if (gin::ConvertFromV8(isolate, image, &icon_path)) {
+ *native_image = NativeImage::CreateFromPath(isolate, icon_path).get();
+@@ -150,17 +154,27 @@ bool NativeImage::TryConvertNativeImage(v8::Isolate* isolate,
+ #else
+ const auto img_path = icon_path.value();
+ #endif
+- isolate->ThrowException(v8::Exception::Error(gin::StringToV8(
+- isolate, "Failed to load image from path '" + img_path + "'")));
+- return false;
++ error_message = "Failed to load image from path '" + img_path + "'";
+ }
+ } else {
+ if (!gin::ConvertFromV8(isolate, image, native_image)) {
+- isolate->ThrowException(v8::Exception::Error(gin::StringToV8(
+- isolate, "Argument must be a file path or a NativeImage")));
+- return false;
++ error_message = "Argument must be a file path or a NativeImage";
+ }
+ }
++
++ if (!error_message.empty()) {
++ switch (on_error) {
++ case OnConvertError::kThrow:
++ isolate->ThrowException(
++ v8::Exception::Error(gin::StringToV8(isolate, error_message)));
++ break;
++ case OnConvertError::kWarn:
++ LOG(WARNING) << error_message;
++ break;
++ }
++ return false;
++ }
++
+ return true;
+ }
+
+diff --git a/shell/common/api/electron_api_native_image.h b/shell/common/api/electron_api_native_image.h
+index 1c89fcdfa..f0ecb35cc 100644
+--- a/shell/common/api/electron_api_native_image.h
++++ b/shell/common/api/electron_api_native_image.h
+@@ -77,9 +77,13 @@ class NativeImage : public gin::Wrappable<NativeImage> {
+
+ static v8::Local<v8::FunctionTemplate> GetConstructor(v8::Isolate* isolate);
+
+- static bool TryConvertNativeImage(v8::Isolate* isolate,
+- v8::Local<v8::Value> image,
+- NativeImage** native_image);
++ enum class OnConvertError { kThrow, kWarn };
++
++ static bool TryConvertNativeImage(
++ v8::Isolate* isolate,
++ v8::Local<v8::Value> image,
++ NativeImage** native_image,
++ OnConvertError on_error = OnConvertError::kThrow);
+
+ // gin::Wrappable
+ static gin::WrapperInfo kWrapperInfo;
+diff --git a/spec-main/api-browser-window-spec.ts b/spec-main/api-browser-window-spec.ts
+index 379cdff04..7e490427c 100644
+--- a/spec-main/api-browser-window-spec.ts
++++ b/spec-main/api-browser-window-spec.ts
+@@ -62,6 +62,15 @@ describe('BrowserWindow module', () => {
+ const appProcess = childProcess.spawn(process.execPath, [appPath]);
+ await new Promise((resolve) => { appProcess.once('exit', resolve); });
+ });
++
++ it('does not crash or throw when passed an invalid icon', async () => {
++ expect(() => {
++ const w = new BrowserWindow({
++ icon: undefined
++ } as any);
++ w.destroy();
++ }).not.to.throw();
++ });
+ });
+
+ describe('garbage collection', () => {
+--
+2.30.0
+