tdf#148453 Fix crash by turning off optimization for Objective-C selector

The default attributes sequence sometimes crashes when it is released but
only when compiler optimization is enabled, so disable optimization for the
+[AquaA11yTextAttributesWrapper createAttributedStringForElement] selector.

Also, disabling optimization by itself is apparently not enough to stop
the crashing. Acquiring the solar mutex during native accessibility calls
is also needed. Native accessibility calls are called from native input
sources in [NSApp nextEventMatchingMask:untilDate:inMode:dequeue:]. Since
AquaSalInstance::DoYield() releases the solar mutex before calling
[NSApp nextEventMatchingMask:untilDate:inMode:dequeue:], we need to
always acquire the solar mutex during all NSAccessibility selectors (both
the old informal protocol and the newer formal protocol) that we implement.

Change-Id: I9b715e17e9c5a32b7ce28815e288b2af236c3cc6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145742
Tested-by: Jenkins
Reviewed-by: Patrick Luby <plubius@neooffice.org>
(cherry picked from commit de1d75a0cd25f239cdc751dec75c9019fbcabd8e)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145812
diff --git a/vcl/osx/a11ytextattributeswrapper.mm b/vcl/osx/a11ytextattributeswrapper.mm
index 84a9b27..9db1ba91 100644
--- a/vcl/osx/a11ytextattributeswrapper.mm
+++ b/vcl/osx/a11ytextattributeswrapper.mm
@@ -300,7 +300,11 @@ using namespace ::com::sun::star::uno;
    [AquaA11yTextAttributesWrapper addMarkup:markup withType:css::text::TextMarkupType::SPELLCHECK toString:string inRange:range];
}

+(NSMutableAttributedString *)createAttributedStringForElement:(AquaA11yWrapper *)wrapper inOrigRange:(id)origRange {
// tdf#148453 Fix crash by turning off optimization for Objective-C selector
// The default attributes sequence sometimes crashes when it is released but
// only when compiler optimization is enabled, so disable optimization for the
// +[AquaA11yTextAttributesWrapper createAttributedStringForElement] selector.
+(NSMutableAttributedString *)createAttributedStringForElement:(AquaA11yWrapper *)wrapper inOrigRange:(id)origRange __attribute__((optnone)) {
    static const Sequence < OUString > emptySequence;
    // vars
    NSMutableAttributedString * string = nil;
diff --git a/vcl/osx/a11ywrapper.mm b/vcl/osx/a11ywrapper.mm
index beb40f8..73abb60 100644
--- a/vcl/osx/a11ywrapper.mm
+++ b/vcl/osx/a11ywrapper.mm
@@ -682,6 +682,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
#pragma mark Accessibility Protocol

-(id)accessibilityAttributeValue:(NSString *)attribute {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityAttributeValue:" << attribute << "]");
    // #i90575# guard NSAccessibility protocol against unwanted access
    if ( isPopupMenuOpen ) {
@@ -712,6 +715,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(BOOL)accessibilityIsIgnored {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityIsIgnored]");
    // #i90575# guard NSAccessibility protocol against unwanted access
    if ( isPopupMenuOpen ) {
@@ -736,6 +742,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityAttributeNames]");
    // #i90575# guard NSAccessibility protocol against unwanted access
    if ( isPopupMenuOpen ) {
@@ -817,6 +826,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(BOOL)accessibilityIsAttributeSettable:(NSString *)attribute {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityAttributeIsSettable:" << attribute << "]");
    bool isSettable = false;
    if ( [ self accessibleText ] ) {
@@ -835,6 +847,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(NSArray *)accessibilityParameterizedAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityParameterizedAttributeNames]");
    NSMutableArray * attributeNames = [ [ NSMutableArray alloc ] init ];
    // Special Attributes depending on interface
@@ -845,6 +860,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(id)accessibilityAttributeValue:(NSString *)attribute forParameter:(id)parameter {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityAttributeValue:" << attribute << " forParameter:" << (static_cast<NSObject*>(parameter)) << "]");
    SEL methodSelector = [ self selectorForAttribute: attribute asGetter: YES withGetterParameter: YES ];
    if ( [ self respondsToSelector: methodSelector ] ) {
@@ -860,6 +878,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilitySetValue:" << (static_cast<NSObject*>(value)) << " forAttribute:" << attribute << "]");
    SEL methodSelector = [ self selectorForAttribute: attribute asGetter: NO withGetterParameter: NO ];
    if ( [ AquaA11yComponentWrapper respondsToSelector: methodSelector ] ) {
@@ -877,6 +898,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(id)accessibilityFocusedUIElement {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityFocusedUIElement]");
    // #i90575# guard NSAccessibility protocol against unwanted access
    if ( isPopupMenuOpen ) {
@@ -937,6 +961,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(void)accessibilityPerformAction:(NSString *)action {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityPerformAction:" << action << "]");
    AquaA11yWrapper * actionResponder = [ self actionResponder ];
    if ( actionResponder ) {
@@ -945,6 +972,9 @@ static std::ostream &operator<<(std::ostream &s, NSObject *obj) {
}

-(NSArray *)accessibilityActionNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityActionNames]");
    NSArray * actionNames = nil;
    AquaA11yWrapper * actionResponder = [ self actionResponder ];
@@ -1030,6 +1060,9 @@ static Reference < XAccessibleContext > hitTestRunner ( css::awt::Point point,
}

-(id)accessibilityHitTest:(NSPoint)point {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    SAL_INFO("vcl.a11y", "[" << self << " accessibilityHitTest:" << point << "]");
    static id wrapper = nil;
    if ( nil != wrapper ) {
diff --git a/vcl/osx/a11ywrapperbutton.mm b/vcl/osx/a11ywrapperbutton.mm
index ca5f16a..a2c0d03 100644
--- a/vcl/osx/a11ywrapperbutton.mm
+++ b/vcl/osx/a11ywrapperbutton.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>

#include "a11ywrapperbutton.h"
@@ -36,6 +37,9 @@
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrappercheckbox.mm b/vcl/osx/a11ywrappercheckbox.mm
index d67c5b6..9e0f221 100644
--- a/vcl/osx/a11ywrappercheckbox.mm
+++ b/vcl/osx/a11ywrappercheckbox.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>

#include "a11ywrappercheckbox.h"
@@ -36,6 +37,9 @@
}

-(BOOL)accessibilityIsAttributeSettable:(NSString *)attribute {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    if ( [ attribute isEqualToString: NSAccessibilityValueAttribute ] ) {
        return NO;
    }
@@ -43,6 +47,9 @@
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Remove text-specific attributes
diff --git a/vcl/osx/a11ywrappercombobox.mm b/vcl/osx/a11ywrappercombobox.mm
index 962a669..bfcef72 100644
--- a/vcl/osx/a11ywrappercombobox.mm
+++ b/vcl/osx/a11ywrappercombobox.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>

#include "a11ywrappercombobox.h"
@@ -110,6 +111,9 @@ using namespace ::com::sun::star::uno;
#pragma mark Accessibility Protocol

-(BOOL)accessibilityIsAttributeSettable:(NSString *)attribute {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    if ( [ self textArea ] != nil && (
         [ attribute isEqualToString: NSAccessibilitySelectedTextAttribute ]
      || [ attribute isEqualToString: NSAccessibilitySelectedTextRangeAttribute ]
@@ -120,6 +124,9 @@ using namespace ::com::sun::star::uno;
}

-(void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    if ( [ self textArea ] != nil && (
         [ attribute isEqualToString: NSAccessibilitySelectedTextAttribute ]
      || [ attribute isEqualToString: NSAccessibilitySelectedTextRangeAttribute ]
@@ -130,6 +137,9 @@ using namespace ::com::sun::star::uno;
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrappergroup.mm b/vcl/osx/a11ywrappergroup.mm
index 39cbd9a..7ed70d4 100644
--- a/vcl/osx/a11ywrappergroup.mm
+++ b/vcl/osx/a11ywrappergroup.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrappergroup.h"

@@ -30,6 +31,9 @@
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrapperlist.mm b/vcl/osx/a11ywrapperlist.mm
index 9b0bac7..25b3fa3 100644
--- a/vcl/osx/a11ywrapperlist.mm
+++ b/vcl/osx/a11ywrapperlist.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrapperlist.h"

@@ -28,6 +29,9 @@ using namespace ::com::sun::star::accessibility;
@implementation AquaA11yWrapperList : AquaA11yWrapper

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrapperradiobutton.mm b/vcl/osx/a11ywrapperradiobutton.mm
index 21fd952..5022cc1 100644
--- a/vcl/osx/a11ywrapperradiobutton.mm
+++ b/vcl/osx/a11ywrapperradiobutton.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrapperradiobutton.h"
#include "a11ytextwrapper.h"
@@ -35,6 +36,9 @@
}

-(BOOL)accessibilityIsAttributeSettable:(NSString *)attribute {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    if ( [ attribute isEqualToString: NSAccessibilityValueAttribute ] ) {
        return NO;
    }
@@ -42,6 +46,9 @@
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrapperradiogroup.mm b/vcl/osx/a11ywrapperradiogroup.mm
index 557e0b1..9768dbb 100644
--- a/vcl/osx/a11ywrapperradiogroup.mm
+++ b/vcl/osx/a11ywrapperradiogroup.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrapperradiogroup.h"
#include "a11ytextwrapper.h"
@@ -27,6 +28,9 @@
@implementation AquaA11yWrapperRadioGroup : AquaA11yWrapper

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrapperrow.mm b/vcl/osx/a11ywrapperrow.mm
index 1b7ee56..0c140c8 100644
--- a/vcl/osx/a11ywrapperrow.mm
+++ b/vcl/osx/a11ywrapperrow.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>

#include "a11ywrapperrow.h"
@@ -33,6 +34,9 @@
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrapperscrollarea.mm b/vcl/osx/a11ywrapperscrollarea.mm
index b0b963a..2203722 100644
--- a/vcl/osx/a11ywrapperscrollarea.mm
+++ b/vcl/osx/a11ywrapperscrollarea.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>

#include "a11ywrapperscrollarea.h"
@@ -59,6 +60,9 @@
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrapperscrollbar.mm b/vcl/osx/a11ywrapperscrollbar.mm
index a4b7a246..4a4612d 100644
--- a/vcl/osx/a11ywrapperscrollbar.mm
+++ b/vcl/osx/a11ywrapperscrollbar.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>

#include "a11ywrapperscrollbar.h"
@@ -31,6 +32,9 @@ using namespace ::com::sun::star::accessibility;
@implementation AquaA11yWrapperScrollBar : AquaA11yWrapper

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrappersplitter.mm b/vcl/osx/a11ywrappersplitter.mm
index b43928b..39ec496 100644
--- a/vcl/osx/a11ywrappersplitter.mm
+++ b/vcl/osx/a11ywrappersplitter.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrappersplitter.h"

@@ -28,6 +29,9 @@ using namespace ::com::sun::star::accessibility;
@implementation AquaA11yWrapperSplitter : AquaA11yWrapper

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrapperstatictext.mm b/vcl/osx/a11ywrapperstatictext.mm
index cd47285..114c417 100644
--- a/vcl/osx/a11ywrapperstatictext.mm
+++ b/vcl/osx/a11ywrapperstatictext.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrapperstatictext.h"

@@ -34,6 +35,9 @@
}

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrappertabgroup.mm b/vcl/osx/a11ywrappertabgroup.mm
index ad59718..3d32ccc 100644
--- a/vcl/osx/a11ywrappertabgroup.mm
+++ b/vcl/osx/a11ywrappertabgroup.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrappertabgroup.h"

@@ -26,6 +27,9 @@
@implementation AquaA11yWrapperTabGroup : AquaA11yWrapper

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrappertextarea.mm b/vcl/osx/a11ywrappertextarea.mm
index 3f51f35..354030f 100644
--- a/vcl/osx/a11ywrappertextarea.mm
+++ b/vcl/osx/a11ywrappertextarea.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrappertextarea.h"

@@ -26,6 +27,9 @@
@implementation AquaA11yWrapperTextArea : AquaA11yWrapper

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role
diff --git a/vcl/osx/a11ywrappertoolbar.mm b/vcl/osx/a11ywrappertoolbar.mm
index 05e9b30..28b5d01 100644
--- a/vcl/osx/a11ywrappertoolbar.mm
+++ b/vcl/osx/a11ywrappertoolbar.mm
@@ -18,6 +18,7 @@
 */


#include <vcl/svapp.hxx>
#include <osx/salinst.h>
#include "a11ywrappertoolbar.h"

@@ -26,6 +27,9 @@
@implementation AquaA11yWrapperToolbar : AquaA11yWrapper

-(NSArray *)accessibilityAttributeNames {
    // Related: tdf#148453 Acquire solar mutex during native accessibility calls
    SolarMutexGuard aGuard;

    // Default Attributes
    NSMutableArray * attributeNames = [ NSMutableArray arrayWithArray: [ super accessibilityAttributeNames ] ];
    // Special Attributes and removing unwanted attributes depending on role