|
@@ -0,0 +1,89 @@
|
|
|
+
|
|
|
+# HG changeset patch
|
|
|
+# User Stephen A Pohl <spohl.mozilla.bugs@gmail.com>
|
|
|
+# Date 1538283728 14400
|
|
|
+# Node ID 3920c858319dff66ebbc9263f6aa8d24f16071f8
|
|
|
+# Parent 9d3d8065392270b38d98f8684040fe72818ef83e
|
|
|
+Bug 1489785: Remove a workaround for gcc, introduced in bug 678607, that is no longer needed and that causes hangs in modal dialogs on macOS 10.14. r=mstange
|
|
|
+
|
|
|
+diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm
|
|
|
+--- a/widget/cocoa/nsChildView.mm
|
|
|
++++ b/widget/cocoa/nsChildView.mm
|
|
|
+@@ -423,23 +423,16 @@ nsChildView::Create(nsIWidget* aParent,
|
|
|
+ // we need to provide an autorelease pool to avoid leaking cocoa objects
|
|
|
+ // (see bug 559075).
|
|
|
+ nsAutoreleasePool localPool;
|
|
|
+
|
|
|
+ // See NSView (MethodSwizzling) below.
|
|
|
+ if (!gChildViewMethodsSwizzled) {
|
|
|
+ nsToolkit::SwizzleMethods([NSView class], @selector(mouseDownCanMoveWindow),
|
|
|
+ @selector(nsChildView_NSView_mouseDownCanMoveWindow));
|
|
|
+-#ifdef __LP64__
|
|
|
+- nsToolkit::SwizzleMethods([NSEvent class], @selector(addLocalMonitorForEventsMatchingMask:handler:),
|
|
|
+- @selector(nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:handler:),
|
|
|
+- true);
|
|
|
+- nsToolkit::SwizzleMethods([NSEvent class], @selector(removeMonitor:),
|
|
|
+- @selector(nsChildView_NSEvent_removeMonitor:), true);
|
|
|
+-#endif
|
|
|
+ gChildViewMethodsSwizzled = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ mBounds = aRect;
|
|
|
+
|
|
|
+ // Ensure that the toolkit is created.
|
|
|
+ nsToolkit::GetToolkit();
|
|
|
+
|
|
|
+@@ -6528,53 +6521,8 @@ static const CGEventField kCGWindowNumbe
|
|
|
+ NSWindow *ourWindow = [self window];
|
|
|
+ NSView *contentView = [ourWindow contentView];
|
|
|
+ if ([ourWindow isKindOfClass:[ToolbarWindow class]] && (self == contentView))
|
|
|
+ return [ourWindow isMovableByWindowBackground];
|
|
|
+ return [self nsChildView_NSView_mouseDownCanMoveWindow];
|
|
|
+ }
|
|
|
+
|
|
|
+ @end
|
|
|
+-
|
|
|
+-#ifdef __LP64__
|
|
|
+-// When using blocks, at least on OS X 10.7, the OS sometimes calls
|
|
|
+-// +[NSEvent removeMonitor:] more than once on a single event monitor, which
|
|
|
+-// causes crashes. See bug 678607. We hook these methods to work around
|
|
|
+-// the problem.
|
|
|
+-@interface NSEvent (MethodSwizzling)
|
|
|
+-+ (id)nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:(unsigned long long)mask handler:(id)block;
|
|
|
+-+ (void)nsChildView_NSEvent_removeMonitor:(id)eventMonitor;
|
|
|
+-@end
|
|
|
+-
|
|
|
+-// This is a local copy of the AppKit frameworks sEventObservers hashtable.
|
|
|
+-// It only stores "local monitors". We use it to ensure that +[NSEvent
|
|
|
+-// removeMonitor:] is never called more than once on the same local monitor.
|
|
|
+-static NSHashTable *sLocalEventObservers = nil;
|
|
|
+-
|
|
|
+-@implementation NSEvent (MethodSwizzling)
|
|
|
+-
|
|
|
+-+ (id)nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:(unsigned long long)mask handler:(id)block
|
|
|
+-{
|
|
|
+- if (!sLocalEventObservers) {
|
|
|
+- sLocalEventObservers = [[NSHashTable hashTableWithOptions:
|
|
|
+- NSHashTableStrongMemory | NSHashTableObjectPointerPersonality] retain];
|
|
|
+- }
|
|
|
+- id retval =
|
|
|
+- [self nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:mask handler:block];
|
|
|
+- if (sLocalEventObservers && retval && ![sLocalEventObservers containsObject:retval]) {
|
|
|
+- [sLocalEventObservers addObject:retval];
|
|
|
+- }
|
|
|
+- return retval;
|
|
|
+-}
|
|
|
+-
|
|
|
+-+ (void)nsChildView_NSEvent_removeMonitor:(id)eventMonitor
|
|
|
+-{
|
|
|
+- if (sLocalEventObservers && [eventMonitor isKindOfClass: ::NSClassFromString(@"_NSLocalEventObserver")]) {
|
|
|
+- if (![sLocalEventObservers containsObject:eventMonitor]) {
|
|
|
+- return;
|
|
|
+- }
|
|
|
+- [sLocalEventObservers removeObject:eventMonitor];
|
|
|
+- }
|
|
|
+- [self nsChildView_NSEvent_removeMonitor:eventMonitor];
|
|
|
+-}
|
|
|
+-
|
|
|
+-@end
|
|
|
+-#endif // #ifdef __LP64__
|