18
18
#import < Application/ApplicationDelegate.h>
19
19
#import < UI/Event.h>
20
20
#import < UI/LadybirdWebView.h>
21
+ #import < UniformTypeIdentifiers/UniformTypeIdentifiers.h>
21
22
#import < Utilities/Conversions.h>
22
23
23
24
#if !__has_feature(objc_arc)
@@ -626,7 +627,7 @@ - (void)setWebViewCallbacks
626
627
[panel makeKeyAndOrderFront: nil ];
627
628
};
628
629
629
- m_web_view_bridge->on_request_file_picker = [self ](auto const &, auto allow_multiple_files) {
630
+ m_web_view_bridge->on_request_file_picker = [self ](auto const & accepted_file_types , auto allow_multiple_files) {
630
631
auto * panel = [NSOpenPanel openPanel ];
631
632
[panel setCanChooseFiles: YES ];
632
633
[panel setCanChooseDirectories: NO ];
@@ -639,6 +640,43 @@ - (void)setWebViewCallbacks
639
640
[panel setMessage: @" Select file" ];
640
641
}
641
642
643
+ NSMutableArray <UTType*>* accepted_file_filters = [NSMutableArray array ];
644
+
645
+ for (auto const & filter : accepted_file_types.filters ) {
646
+ filter.visit (
647
+ [&](Web::HTML::FileFilter::FileType type) {
648
+ switch (type) {
649
+ case Web::HTML::FileFilter::FileType::Audio:
650
+ [accepted_file_filters addObject: UTTypeAudio];
651
+ break ;
652
+ case Web::HTML::FileFilter::FileType::Image:
653
+ [accepted_file_filters addObject: UTTypeImage];
654
+ break ;
655
+ case Web::HTML::FileFilter::FileType::Video:
656
+ [accepted_file_filters addObject: UTTypeVideo];
657
+ break ;
658
+ }
659
+ },
660
+ [&](Web::HTML::FileFilter::MimeType const & filter) {
661
+ auto * ns_mime_type = Ladybird::string_to_ns_string (filter.value );
662
+
663
+ if (auto * ut_type = [UTType typeWithMIMEType: ns_mime_type]) {
664
+ [accepted_file_filters addObject: ut_type];
665
+ }
666
+ },
667
+ [&](Web::HTML::FileFilter::Extension const & filter) {
668
+ auto * ns_extension = Ladybird::string_to_ns_string (filter.value );
669
+
670
+ if (auto * ut_type = [UTType typeWithFilenameExtension: ns_extension]) {
671
+ [accepted_file_filters addObject: ut_type];
672
+ }
673
+ });
674
+ }
675
+
676
+ // FIXME: Create an accessory view to allow selecting the active file filter.
677
+ [panel setAllowedContentTypes: accepted_file_filters];
678
+ [panel setAllowsOtherFileTypes: YES ];
679
+
642
680
[panel beginSheetModalForWindow: [self window ]
643
681
completionHandler: ^(NSInteger result) {
644
682
Vector<Web::HTML::SelectedFile> selected_files;
0 commit comments