зеркало из https://github.com/electron/electron.git
fix: backport upstream fixes for color chooser dialogs (#17227)
* fix: backport upstream fixes for color chooser dialogs * chore: fix patches, Windows bad, linux good * Update color_chooser_mac.patch * Update color_chooser_win.patch
This commit is contained in:
Родитель
2733697819
Коммит
5422fd9941
|
@ -60,7 +60,6 @@ content_browser_main_loop.patch
|
||||||
dump_syms.patch
|
dump_syms.patch
|
||||||
command-ismediakey.patch
|
command-ismediakey.patch
|
||||||
tts.patch
|
tts.patch
|
||||||
color_chooser.patch
|
|
||||||
printing.patch
|
printing.patch
|
||||||
verbose_generate_breakpad_symbols.patch
|
verbose_generate_breakpad_symbols.patch
|
||||||
cross_site_document_resource_handler.patch
|
cross_site_document_resource_handler.patch
|
||||||
|
@ -71,3 +70,5 @@ disable_time_ticks_dcheck.patch
|
||||||
autofill_size_calculation.patch
|
autofill_size_calculation.patch
|
||||||
revert_build_swiftshader_for_arm32.patch
|
revert_build_swiftshader_for_arm32.patch
|
||||||
fix_backup_includes_for_ptrace_get_thread_area_on_arm_arm64.patch
|
fix_backup_includes_for_ptrace_get_thread_area_on_arm_arm64.patch
|
||||||
|
color_chooser_mac.patch
|
||||||
|
color_chooser_win.patch
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Heilig Benedek <benecene@gmail.com>
|
|
||||||
Date: Thu, 18 Oct 2018 17:08:13 -0700
|
|
||||||
Subject: color_chooser.patch
|
|
||||||
|
|
||||||
Disables a DCHECK that crashes the ColorChooser on Windows,
|
|
||||||
that DCHECK most likely is an artifact that remained in chromium from a
|
|
||||||
long time ago (last update of that part of the code was around 2012-2013,
|
|
||||||
and this is purely UI, I don't think they have automated tests for it).
|
|
||||||
|
|
||||||
diff --git a/chrome/browser/ui/views/color_chooser_win.cc b/chrome/browser/ui/views/color_chooser_win.cc
|
|
||||||
index 434842ba0f81206a43fb26874930bf7309782890..93b4152003eaea05f0e16cd049687fbcbc672fb0 100644
|
|
||||||
--- a/chrome/browser/ui/views/color_chooser_win.cc
|
|
||||||
+++ b/chrome/browser/ui/views/color_chooser_win.cc
|
|
||||||
@@ -91,7 +91,7 @@ void ColorChooserWin::OnColorChooserDialogClosed() {
|
|
||||||
color_chooser_dialog_->ListenerDestroyed();
|
|
||||||
color_chooser_dialog_ = NULL;
|
|
||||||
}
|
|
||||||
- DCHECK(current_color_chooser_ == this);
|
|
||||||
+ // DCHECK(current_color_chooser_ == this);
|
|
||||||
current_color_chooser_ = NULL;
|
|
||||||
if (web_contents_)
|
|
||||||
web_contents_->DidEndColorChooser();
|
|
|
@ -0,0 +1,186 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benedek Heilig <benecene@gmail.com>
|
||||||
|
Date: Thu, 21 Feb 2019 17:04:30 +0000
|
||||||
|
Subject: fix a crash when using color chooser on macos
|
||||||
|
|
||||||
|
Backports an upstream fix I made to the color chooser dialog on macos.
|
||||||
|
This can be removed once that fix lands in a chromium version we use.
|
||||||
|
Below is the original commit message:
|
||||||
|
|
||||||
|
Fix crash when closing color chooser dialog on macos
|
||||||
|
|
||||||
|
For some reason, closing the color chooser dialog caused a crash on
|
||||||
|
macos. By using NSNotificationCenter instead of providing a delegate
|
||||||
|
the crash goes away. I got the idea for this from the comment about the
|
||||||
|
__target method already in the code.
|
||||||
|
|
||||||
|
Change-Id: Ide35a455ff12decc9dd83b30c80b584ab376242b
|
||||||
|
|
||||||
|
diff --git a/AUTHORS b/AUTHORS
|
||||||
|
index 374b1a177f30d0c4b415d5c9c0fc4e4673414d39..436be8a093831020453285f0c476dcf9bd42fe8d 100644
|
||||||
|
--- a/AUTHORS
|
||||||
|
+++ b/AUTHORS
|
||||||
|
@@ -114,6 +114,7 @@ Ben Coe <bencoe@gmail.com>
|
||||||
|
Ben Fiola <benfiola@gmail.com>
|
||||||
|
Ben Karel <eschew@gmail.com>
|
||||||
|
Ben Noordhuis <ben@strongloop.com>
|
||||||
|
+Benedek Heilig <benecene@gmail.com>
|
||||||
|
Benjamin Dupont <bedupont@cisco.com>
|
||||||
|
Benjamin Jemlich <pcgod99@gmail.com>
|
||||||
|
Bernard Cafarelli <voyageur@gentoo.org>
|
||||||
|
diff --git a/chrome/browser/ui/cocoa/color_chooser_mac.h b/chrome/browser/ui/cocoa/color_chooser_mac.h
|
||||||
|
index 511000dc7855938ceab31694149ddf9e2125e0e4..9dbcc9fe41786555f0fb16ac47c71ee8851c8dd5 100644
|
||||||
|
--- a/chrome/browser/ui/cocoa/color_chooser_mac.h
|
||||||
|
+++ b/chrome/browser/ui/cocoa/color_chooser_mac.h
|
||||||
|
@@ -15,7 +15,7 @@ class ColorChooserMac;
|
||||||
|
|
||||||
|
// A Listener class to act as a event target for NSColorPanel and send
|
||||||
|
// the results to the C++ class, ColorChooserMac.
|
||||||
|
-@interface ColorPanelCocoa : NSObject<NSWindowDelegate> {
|
||||||
|
+@interface ColorPanelCocoa : NSObject {
|
||||||
|
@protected
|
||||||
|
// We don't call DidChooseColor if the change wasn't caused by the user
|
||||||
|
// interacting with the panel.
|
||||||
|
@@ -26,6 +26,8 @@ class ColorChooserMac;
|
||||||
|
|
||||||
|
- (id)initWithChooser:(ColorChooserMac*)chooser;
|
||||||
|
|
||||||
|
+- (void)windowWillClose:(NSNotification*)notification;
|
||||||
|
+
|
||||||
|
// Called from NSColorPanel.
|
||||||
|
- (void)didChooseColor:(NSColorPanel*)panel;
|
||||||
|
|
||||||
|
@@ -45,7 +47,7 @@ class ColorChooserMac : public content::ColorChooser {
|
||||||
|
|
||||||
|
// Called from ColorPanelCocoa.
|
||||||
|
void DidChooseColorInColorPanel(SkColor color);
|
||||||
|
- void DidCloseColorPabel();
|
||||||
|
+ void DidCloseColorPanel();
|
||||||
|
|
||||||
|
// Set the color programmatically.
|
||||||
|
void SetSelectedColor(SkColor color) override;
|
||||||
|
diff --git a/chrome/browser/ui/cocoa/color_chooser_mac.mm b/chrome/browser/ui/cocoa/color_chooser_mac.mm
|
||||||
|
index bf47154f0a880f1c6143065e5c6d060f1df73765..e7cdab7a23d96345cc6e8ec578a8616d132b7d51 100644
|
||||||
|
--- a/chrome/browser/ui/cocoa/color_chooser_mac.mm
|
||||||
|
+++ b/chrome/browser/ui/cocoa/color_chooser_mac.mm
|
||||||
|
@@ -39,16 +39,18 @@ void ColorChooserMac::DidChooseColorInColorPanel(SkColor color) {
|
||||||
|
web_contents_->DidChooseColorInColorChooser(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
-void ColorChooserMac::DidCloseColorPabel() {
|
||||||
|
+void ColorChooserMac::DidCloseColorPanel() {
|
||||||
|
End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorChooserMac::End() {
|
||||||
|
- panel_.reset();
|
||||||
|
- DCHECK(current_color_chooser_ == this);
|
||||||
|
- current_color_chooser_ = NULL;
|
||||||
|
- if (web_contents_)
|
||||||
|
+ if (panel_) {
|
||||||
|
+ panel_.reset();
|
||||||
|
+ DCHECK(current_color_chooser_ == this);
|
||||||
|
+ current_color_chooser_ = NULL;
|
||||||
|
+ if (web_contents_)
|
||||||
|
web_contents_->DidEndColorChooser();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorChooserMac::SetSelectedColor(SkColor color) {
|
||||||
|
@@ -67,9 +69,14 @@ void ColorChooserMac::SetSelectedColor(SkColor color) {
|
||||||
|
chooser_ = chooser;
|
||||||
|
NSColorPanel* panel = [NSColorPanel sharedColorPanel];
|
||||||
|
[panel setShowsAlpha:NO];
|
||||||
|
- [panel setDelegate:self];
|
||||||
|
[panel setTarget:self];
|
||||||
|
[panel setAction:@selector(didChooseColor:)];
|
||||||
|
+
|
||||||
|
+ [[NSNotificationCenter defaultCenter]
|
||||||
|
+ addObserver:self
|
||||||
|
+ selector:@selector(windowWillClose:)
|
||||||
|
+ name:NSWindowWillCloseNotification
|
||||||
|
+ object:panel];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
@@ -82,19 +89,21 @@ void ColorChooserMac::SetSelectedColor(SkColor color) {
|
||||||
|
// the ColorPanelCocoa is still the target.
|
||||||
|
BOOL respondsToPrivateTargetMethod =
|
||||||
|
[panel respondsToSelector:@selector(__target)];
|
||||||
|
-
|
||||||
|
- if ([panel delegate] == self ||
|
||||||
|
- (respondsToPrivateTargetMethod && [panel __target] == self)) {
|
||||||
|
- [panel setDelegate:nil];
|
||||||
|
+ if (respondsToPrivateTargetMethod && [panel __target] == self) {
|
||||||
|
[panel setTarget:nil];
|
||||||
|
[panel setAction:nullptr];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ [[NSNotificationCenter defaultCenter]
|
||||||
|
+ removeObserver:self
|
||||||
|
+ name:NSWindowWillCloseNotification
|
||||||
|
+ object:panel];
|
||||||
|
+
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowWillClose:(NSNotification*)notification {
|
||||||
|
- chooser_->DidCloseColorPabel();
|
||||||
|
+ chooser_->DidCloseColorPanel();
|
||||||
|
nonUserChange_ = NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/chrome/browser/ui/cocoa/color_panel_cocoa_unittest.mm b/chrome/browser/ui/cocoa/color_panel_cocoa_unittest.mm
|
||||||
|
index 83185ceb9bbd29bf38fce7f72c23f3a5b15ba6c8..823365fdfc0bceceeed6f5edc00b3462715a4751 100644
|
||||||
|
--- a/chrome/browser/ui/cocoa/color_panel_cocoa_unittest.mm
|
||||||
|
+++ b/chrome/browser/ui/cocoa/color_panel_cocoa_unittest.mm
|
||||||
|
@@ -28,28 +28,6 @@ class ColorPanelCocoaTest : public CocoaTest {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
-TEST_F(ColorPanelCocoaTest, ClearTargetAndDelegateOnEnd) {
|
||||||
|
- NSColorPanel* nscolor_panel = [NSColorPanel sharedColorPanel];
|
||||||
|
- @autoreleasepool {
|
||||||
|
- EXPECT_TRUE([nscolor_panel respondsToSelector:@selector(__target)]);
|
||||||
|
-
|
||||||
|
- // Create a ColorPanelCocoa.
|
||||||
|
- ColorChooserMac* color_chooser_mac =
|
||||||
|
- ColorChooserMac::Open(nullptr, SK_ColorBLACK);
|
||||||
|
-
|
||||||
|
- // Confirm the NSColorPanel's configuration by the ColorChooserMac's
|
||||||
|
- // ColorPanelCocoa.
|
||||||
|
- EXPECT_TRUE([nscolor_panel delegate]);
|
||||||
|
- EXPECT_TRUE([nscolor_panel __target]);
|
||||||
|
-
|
||||||
|
- // Release the ColorPanelCocoa and confirm it's no longer the NSColorPanel's
|
||||||
|
- // target or delegate.
|
||||||
|
- color_chooser_mac->End();
|
||||||
|
- }
|
||||||
|
- EXPECT_EQ([nscolor_panel delegate], nil);
|
||||||
|
- EXPECT_EQ([nscolor_panel __target], nil);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
TEST_F(ColorPanelCocoaTest, ClearTargetOnEnd) {
|
||||||
|
NSColorPanel* nscolor_panel = [NSColorPanel sharedColorPanel];
|
||||||
|
@autoreleasepool {
|
||||||
|
@@ -61,19 +39,12 @@ TEST_F(ColorPanelCocoaTest, ClearTargetOnEnd) {
|
||||||
|
|
||||||
|
// Confirm the NSColorPanel's configuration by the ColorChooserMac's
|
||||||
|
// ColorPanelCocoa.
|
||||||
|
- EXPECT_TRUE([nscolor_panel delegate]);
|
||||||
|
EXPECT_TRUE([nscolor_panel __target]);
|
||||||
|
|
||||||
|
- // Clear the delegate and release the ColorPanelCocoa.
|
||||||
|
- [nscolor_panel setDelegate:nil];
|
||||||
|
-
|
||||||
|
// Release the ColorPanelCocoa.
|
||||||
|
color_chooser_mac->End();
|
||||||
|
}
|
||||||
|
- // Confirm the ColorPanelCocoa is no longer the NSColorPanel's target or
|
||||||
|
- // delegate. Previously the ColorPanelCocoa would not clear the target if
|
||||||
|
- // the delegate had already been cleared.
|
||||||
|
- EXPECT_EQ([nscolor_panel delegate], nil);
|
||||||
|
+ // Confirm the ColorPanelCocoa is no longer the NSColorPanel's target
|
||||||
|
EXPECT_EQ([nscolor_panel __target], nil);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benedek Heilig <benecene@gmail.com>
|
||||||
|
Date: Thu, 21 Feb 2019 17:16:33 +0000
|
||||||
|
Subject: fix some DCHECKs on Windows when using color chooser dialog
|
||||||
|
|
||||||
|
Backports an upstream fix I made to the color chooser dialog on
|
||||||
|
Windows. This can be removed once that fix lands in a chromium version we
|
||||||
|
use. Below is the original commit message:
|
||||||
|
|
||||||
|
Fix DCHECKs being triggered while using color chooser dialog on Windows
|
||||||
|
|
||||||
|
This fixes two DHCECKs being triggered on Windows when using the
|
||||||
|
dialog in a debug build. The main source of these triggered DCHECKs was
|
||||||
|
that when the user closes the dialog, OnColorChooserDialog is called,
|
||||||
|
which calls WebContentsImpl::DidEndColorChooser, which calls End on the
|
||||||
|
dialog, which calls OnColorChooserDialog again. This also happened on
|
||||||
|
macos. The other DCHECK was the receiver->HasAtLeastOneRef() one,
|
||||||
|
because ColorChooserDialog had a PostTask in it's constructor.
|
||||||
|
|
||||||
|
Change-Id: I45ec32083a5850e006034073bc29d7ec4bb63189
|
||||||
|
|
||||||
|
diff --git a/chrome/browser/ui/views/color_chooser_dialog.cc b/chrome/browser/ui/views/color_chooser_dialog.cc
|
||||||
|
index c26be855120fcef78ce995d09fb3965f796746a9..1f568a2657250c5f21ab01da88950eedc6d4e177 100644
|
||||||
|
--- a/chrome/browser/ui/views/color_chooser_dialog.cc
|
||||||
|
+++ b/chrome/browser/ui/views/color_chooser_dialog.cc
|
||||||
|
@@ -24,12 +24,14 @@ using content::BrowserThread;
|
||||||
|
// static
|
||||||
|
COLORREF ColorChooserDialog::g_custom_colors[16];
|
||||||
|
|
||||||
|
-ColorChooserDialog::ColorChooserDialog(views::ColorChooserListener* listener,
|
||||||
|
- SkColor initial_color,
|
||||||
|
- gfx::NativeWindow owning_window)
|
||||||
|
+ColorChooserDialog::ColorChooserDialog(views::ColorChooserListener* listener)
|
||||||
|
: listener_(listener) {
|
||||||
|
DCHECK(listener_);
|
||||||
|
CopyCustomColors(g_custom_colors, custom_colors_);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void ColorChooserDialog::Open(SkColor initial_color,
|
||||||
|
+ gfx::NativeWindow owning_window) {
|
||||||
|
HWND owning_hwnd = views::HWNDForNativeWindow(owning_window);
|
||||||
|
|
||||||
|
std::unique_ptr<RunState> run_state = BeginRun(owning_hwnd);
|
||||||
|
diff --git a/chrome/browser/ui/views/color_chooser_dialog.h b/chrome/browser/ui/views/color_chooser_dialog.h
|
||||||
|
index 838e22dcd1a707714a098320d5bf8174fa60a2ea..b2558ce2a226ccde0f20de9712bf33051b21799c 100644
|
||||||
|
--- a/chrome/browser/ui/views/color_chooser_dialog.h
|
||||||
|
+++ b/chrome/browser/ui/views/color_chooser_dialog.h
|
||||||
|
@@ -23,9 +23,9 @@ class ColorChooserDialog
|
||||||
|
public ui::BaseShellDialog,
|
||||||
|
public ui::BaseShellDialogImpl {
|
||||||
|
public:
|
||||||
|
- ColorChooserDialog(views::ColorChooserListener* listener,
|
||||||
|
- SkColor initial_color,
|
||||||
|
- gfx::NativeWindow owning_window);
|
||||||
|
+ explicit ColorChooserDialog(views::ColorChooserListener* listener);
|
||||||
|
+
|
||||||
|
+ void Open(SkColor initial_color, gfx::NativeWindow owning_window);
|
||||||
|
|
||||||
|
// BaseShellDialog:
|
||||||
|
bool IsRunning(gfx::NativeWindow owning_window) const override;
|
||||||
|
diff --git a/chrome/browser/ui/views/color_chooser_win.cc b/chrome/browser/ui/views/color_chooser_win.cc
|
||||||
|
index 434842ba0f81206a43fb26874930bf7309782890..ffc58eec78dc36e21c2c04aa0b0cd9097541d2f0 100644
|
||||||
|
--- a/chrome/browser/ui/views/color_chooser_win.cc
|
||||||
|
+++ b/chrome/browser/ui/views/color_chooser_win.cc
|
||||||
|
@@ -61,9 +61,8 @@ ColorChooserWin::ColorChooserWin(content::WebContents* web_contents,
|
||||||
|
->GetWidget()
|
||||||
|
->GetView()
|
||||||
|
->GetNativeView());
|
||||||
|
- color_chooser_dialog_ = new ColorChooserDialog(this,
|
||||||
|
- initial_color,
|
||||||
|
- owning_window);
|
||||||
|
+ color_chooser_dialog_ = new ColorChooserDialog(this);
|
||||||
|
+ color_chooser_dialog_->Open(initial_color, owning_window);
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorChooserWin::~ColorChooserWin() {
|
||||||
|
@@ -90,11 +89,11 @@ void ColorChooserWin::OnColorChooserDialogClosed() {
|
||||||
|
if (color_chooser_dialog_.get()) {
|
||||||
|
color_chooser_dialog_->ListenerDestroyed();
|
||||||
|
color_chooser_dialog_ = NULL;
|
||||||
|
+ DCHECK(current_color_chooser_ == this);
|
||||||
|
+ current_color_chooser_ = NULL;
|
||||||
|
+ if (web_contents_)
|
||||||
|
+ web_contents_->DidEndColorChooser();
|
||||||
|
}
|
||||||
|
- DCHECK(current_color_chooser_ == this);
|
||||||
|
- current_color_chooser_ = NULL;
|
||||||
|
- if (web_contents_)
|
||||||
|
- web_contents_->DidEndColorChooser();
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace chrome {
|
Загрузка…
Ссылка в новой задаче