Bug 1674428 - Part 2. Add method to collect files that is selected WebKitDirectory. r=dom-core,sefeng

When using Android 13 or later, there is no permission to enumerate
directories if on user storage. So `GetFilesHelper` and etc won't work on
Android.

We have to use content resolver APIs to enumerate files in directory.
So I have to add a method to collect files in FilePicker and return
DOM Files.

Differential Revision: https://phabricator.services.mozilla.com/D228761
This commit is contained in:
Makoto Kato
2025-03-07 12:44:07 +00:00
parent 3a1ce7ffd2
commit b441849346
10 changed files with 166 additions and 10 deletions

View File

@@ -576,6 +576,36 @@ HTMLInputElement::nsFilePickerShownCallback::Done(
if (StaticPrefs::dom_webkitBlink_dirPicker_enabled() &&
mInput->HasAttr(nsGkAtoms::webkitdirectory)) {
#ifdef MOZ_WIDGET_ANDROID
// Android 13 or later cannot enumerate files into user directory due to
// no permission. So we store file list into file picker.
FallibleTArray<RefPtr<BlobImpl>> filesInWebKitDirectory;
nsCOMPtr<nsISimpleEnumerator> iter;
if (NS_SUCCEEDED(
mFilePicker->GetDomFilesInWebKitDirectory(getter_AddRefs(iter))) &&
iter) {
nsCOMPtr<nsISupports> supports;
bool loop = true;
while (NS_SUCCEEDED(iter->HasMoreElements(&loop)) && loop) {
iter->GetNext(getter_AddRefs(supports));
if (supports) {
RefPtr<BlobImpl> file = static_cast<File*>(supports.get())->Impl();
MOZ_ASSERT(file);
if (!filesInWebKitDirectory.AppendElement(file, fallible)) {
return nsresult::NS_ERROR_OUT_OF_MEMORY;
}
}
}
}
if (!filesInWebKitDirectory.IsEmpty()) {
dispatchChangeEventCallback->Callback(NS_OK, filesInWebKitDirectory);
return NS_OK;
}
#endif
ErrorResult error;
GetFilesHelper* helper = mInput->GetOrCreateGetFilesHelper(true, error);
if (NS_WARN_IF(error.Failed())) {