Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 9e167af

Browse files
committed
[[ Bug 18955 ]] Fix crash when using file dialogs from browser widget
This patch fixes a crash when using the HTML file dialog from within a browser widget or revbrowser. The crash was caused by releasing an auto-released object, rather than ensuring it the object was created in an auto-release pool. The direct category addition to NSObject in revbrowser for the WebUIDelegate methods have been removed and placed in the adapter class in revbrowser instead and the necessary code has been replicated in MCWebUIDelegate for the Mac browser implementation in libbrowser ensuring the two can work separately.
1 parent 683c44a commit 9e167af

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

docs/notes/bugfix-18955.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Fix crash when using HTML file input dialog in browser widget

libbrowser/src/libbrowser_osx_webview.mm

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,11 @@ @interface MCWebUIDelegate : NSObject
378378
- (NSUInteger)webView:(WebView *)webView dragDestinationActionMaskForDraggingInfo:(id<NSDraggingInfo>)draggingInfo;
379379
- (NSUInteger)webView:(WebView *)webView dragSourceActionMaskForPoint:(NSPoint)point;
380380

381+
- (void)webView:(WebView *)webView runJavaScriptAlertPanelWithMessage:(NSString*)message initiatedByFrame:(WebFrame*)frame;
382+
- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame;
383+
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener;
384+
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles;
385+
381386
@end
382387

383388
////////////////////////////////////////////////////////////////////////////////
@@ -1172,6 +1177,64 @@ - (NSUInteger)webView:(WebView *)webView dragSourceActionMaskForPoint:(NSPoint)p
11721177
return WebDragSourceActionNone;
11731178
}
11741179

1180+
- (void)webView:(WebView *)webView runJavaScriptAlertPanelWithMessage:(NSString*)message initiatedByFrame:(WebFrame*)frame
1181+
{
1182+
NSAutoreleasePool* t_pool = [[NSAutoreleasePool alloc] init];
1183+
NSAlert* t_alert = [[[NSAlert alloc] init] autorelease];
1184+
[t_alert setMessageText:message];
1185+
[t_alert runModal];
1186+
[t_pool release];
1187+
}
1188+
1189+
- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
1190+
{
1191+
NSAutoreleasePool* t_pool = [[NSAutoreleasePool alloc] init];
1192+
NSAlert* t_alert = [[[NSAlert alloc] init] autorelease];
1193+
NSInteger t_response;
1194+
[t_alert setMessageText:message];
1195+
[t_alert addButtonWithTitle:@"Cancel"];
1196+
t_response = [t_alert runModal];
1197+
[t_pool release];
1198+
return (t_response == NSAlertFirstButtonReturn);
1199+
}
1200+
1201+
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener
1202+
{
1203+
[self webView: sender runOpenPanelForFileButtonWithResultListener: resultListener allowMultipleFiles: NO];
1204+
}
1205+
1206+
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles
1207+
{
1208+
NSAutoreleasePool* t_pool = [[NSAutoreleasePool alloc] init];
1209+
1210+
// Create an open-file panel that allows a single file to be chosen
1211+
NSOpenPanel* t_dialog = [NSOpenPanel openPanel];
1212+
[t_dialog setCanChooseDirectories:NO];
1213+
[t_dialog setCanChooseFiles:YES];
1214+
[t_dialog setAllowsMultipleSelection:allowMultipleFiles];
1215+
1216+
// Run the dialogue
1217+
NSInteger t_result = [t_dialog runModal];
1218+
1219+
// If the user didn't cancel it, get the selection
1220+
if (t_result == NSFileHandlingPanelOKButton)
1221+
{
1222+
NSMutableArray *t_paths = [[[NSMutableArray alloc] init] autorelease];
1223+
for(NSURL *t_url in [t_dialog URLs])
1224+
{
1225+
[t_paths addObject: [[t_url filePathURL] path]];
1226+
}
1227+
[resultListener chooseFilenames: t_paths];
1228+
}
1229+
else
1230+
{
1231+
// The dialogue was cancelled and no selection was made
1232+
[resultListener cancel];
1233+
}
1234+
1235+
[t_pool release];
1236+
}
1237+
11751238
@end
11761239

11771240
////////////////////////////////////////////////////////////////////////////////

revbrowser/src/osxbrowser.mm

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,6 @@ - (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elemen
270270
}
271271
}
272272

273-
@end
274-
@implementation NSObject (WebUIDelegate)
275-
276273
- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message
277274
{
278275
// Create and display an alert panel
@@ -298,6 +295,8 @@ - (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString
298295

299296
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener
300297
{
298+
NSAutoreleasePool* t_pool = [[NSAutoreleasePool alloc] init];
299+
301300
// Create an open-file panel that allows a single file to be chosen
302301
NSOpenPanel* t_dialog = [NSOpenPanel openPanel];
303302
[t_dialog setCanChooseDirectories:NO];
@@ -323,7 +322,7 @@ - (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(i
323322
[resultListener cancel];
324323
}
325324

326-
[t_dialog release];
325+
[t_pool release];
327326
}
328327

329328
@end

0 commit comments

Comments
 (0)