From 85d65c37ccd929c0e2ef26ddf76bebb8081c1527 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 13 Apr 2018 01:56:10 +0200 Subject: Fix crash when trying to print on 10.13.4 (#3025) --- Source/SPBundleHTMLOutputController.m | 6 +++--- Source/SPDatabaseDocument.m | 28 +++++++++++++++++++--------- Source/SPTableContent.m | 2 ++ 3 files changed, 24 insertions(+), 12 deletions(-) (limited to 'Source') diff --git a/Source/SPBundleHTMLOutputController.m b/Source/SPBundleHTMLOutputController.m index 6d9f70be..e6e5980e 100644 --- a/Source/SPBundleHTMLOutputController.m +++ b/Source/SPBundleHTMLOutputController.m @@ -197,7 +197,7 @@ static NSString *SPSaveDocumentAction = @"SPSaveDocument"; - (IBAction)printDocument:(id)sender { - +#warning duplicate code with -[SPDatabaseDocument webView:didFinishLoadForFrame:] NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo]; NSSize paperSize = [printInfo paperSize]; @@ -225,8 +225,8 @@ static NSString *SPSaveDocumentAction = @"SPSaveDocument"; NSPrintOperation *op = [NSPrintOperation printOperationWithView:[[[webView mainFrame] frameView] documentView] printInfo:printInfo]; - // Perform the print operation on a background thread - [op setCanSpawnSeparateThread:YES]; + // do not try to use webkit from a background thread! + [op setCanSpawnSeparateThread:NO]; // Add the ability to select the orientation to print panel NSPrintPanel *printPanel = [op printPanel]; diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m index 41f4e078..b67728c2 100644 --- a/Source/SPDatabaseDocument.m +++ b/Source/SPDatabaseDocument.m @@ -79,9 +79,7 @@ #import "SPBundleHTMLOutputController.h" #endif #import "SPTableTriggers.h" -#ifdef SP_CODA /* headers */ #import "SPTableStructure.h" -#endif #import "SPPrintAccessory.h" #import "MGTemplateEngine.h" #import "ICUTemplateMatcher.h" @@ -7279,8 +7277,8 @@ static int64_t SPDatabaseDocumentInstanceCounter = 0; NSPrintOperation *op = [NSPrintOperation printOperationWithView:[[[printWebView mainFrame] frameView] documentView] printInfo:printInfo]; - // Perform the print operation on a background thread - [op setCanSpawnSeparateThread:YES]; + // do not try to use webkit from a background thread! + [op setCanSpawnSeparateThread:NO]; // Add the ability to select the orientation to print panel NSPrintPanel *printPanel = [op printPanel]; @@ -7297,12 +7295,22 @@ static int64_t SPDatabaseDocumentInstanceCounter = 0; [op setPrintPanel:printPanel]; - [op runOperationModalForWindow:[self parentWindow] - delegate:self - didRunSelector:nil - contextInfo:nil]; - + /* -endTask has to be called first, since the toolbar caches the item enabled state before starting a sheet, + * disables all items and restores the cached state after the sheet ends. Because the database chooser is disabled + * during tasks, launching the sheet before calling -endTask first would result in the following flow: + * - toolbar item caches database chooser state as disabled (because of the active task) + * - sheet is shown + * - endTask reenables database chooser (has no effect because of the open sheet) + * - user dismisses sheet after some time + * - toolbar item restores cached state and disables database chooser again + * => Inconsistent UI: database chooser disabled when it should actually be enabled + */ if ([self isWorking]) [self endTask]; + + [op runOperationModalForWindow:[self parentWindow] + delegate:self + didRunSelector:nil + contextInfo:nil]; } /** @@ -7590,6 +7598,8 @@ static int64_t SPDatabaseDocumentInstanceCounter = 0; /** * Returns an array of columns for whichever view is being printed. + * + * MUST BE CALLED ON THE UI THREAD! */ - (NSArray *)columnNames { diff --git a/Source/SPTableContent.m b/Source/SPTableContent.m index 16f5ac99..72bdb8e1 100644 --- a/Source/SPTableContent.m +++ b/Source/SPTableContent.m @@ -2373,6 +2373,8 @@ static NSString *SPTableFilterSetDefaultOperator = @"SPTableFilterSetDefaultOper /** * Returns the current result (as shown in table content view) as array, the first object containing the field * names as array, the following objects containing the rows as array. + * + * MUST BE CALLED ON THE UI THREAD! */ - (NSArray *)currentDataResultWithNULLs:(BOOL)includeNULLs hideBLOBs:(BOOL)hide { -- cgit v1.2.3