Skip to content

Commit 3a8bde9

Browse files
trflynn89awesomekling
authored andcommitted
Ladybird/AppKit: Implement <input type=file> file type filtering
1 parent a0e6c74 commit 3a8bde9

File tree

3 files changed

+44
-3
lines changed

3 files changed

+44
-3
lines changed

Ladybird/AppKit/UI/LadybirdWebView.mm

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#import <Application/ApplicationDelegate.h>
1919
#import <UI/Event.h>
2020
#import <UI/LadybirdWebView.h>
21+
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
2122
#import <Utilities/Conversions.h>
2223

2324
#if !__has_feature(objc_arc)
@@ -626,7 +627,7 @@ - (void)setWebViewCallbacks
626627
[panel makeKeyAndOrderFront:nil];
627628
};
628629

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) {
630631
auto* panel = [NSOpenPanel openPanel];
631632
[panel setCanChooseFiles:YES];
632633
[panel setCanChooseDirectories:NO];
@@ -639,6 +640,43 @@ - (void)setWebViewCallbacks
639640
[panel setMessage:@"Select file"];
640641
}
641642

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+
642680
[panel beginSheetModalForWindow:[self window]
643681
completionHandler:^(NSInteger result) {
644682
Vector<Web::HTML::SelectedFile> selected_files;

Ladybird/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ elseif (APPLE)
149149
AppKit/Utilities/Conversions.mm
150150
)
151151
target_include_directories(ladybird PRIVATE AppKit)
152-
target_link_libraries(ladybird PRIVATE "-framework Cocoa" LibUnicode)
152+
target_link_libraries(ladybird PRIVATE "-framework Cocoa -framework UniformTypeIdentifiers" LibUnicode)
153153
target_compile_options(ladybird PRIVATE
154154
-fobjc-arc
155155
-Wno-deprecated-anon-enum-enum-conversion # Required for CGImageCreate

Meta/gn/secondary/Ladybird/BUILD.gn

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,10 @@ executable("ladybird_executable") {
134134
"//Userland",
135135
]
136136

137-
frameworks = [ "Cocoa.framework" ]
137+
frameworks = [
138+
"Cocoa.framework",
139+
"UniformTypeIdentifiers.framework",
140+
]
138141
}
139142

140143
if (current_os != "mac") {

0 commit comments

Comments
 (0)