зеркало из https://github.com/mozilla/gecko-dev.git
Bug 826176 - Part 1 - File extension support for accept attribute. r=smaug
This commit is contained in:
Родитель
d741102951
Коммит
1329907ab6
|
@ -7287,7 +7287,8 @@ HTMLInputElement::SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker)
|
||||||
nsTArray<nsFilePickerFilter> filters;
|
nsTArray<nsFilePickerFilter> filters;
|
||||||
nsString allExtensionsList;
|
nsString allExtensionsList;
|
||||||
|
|
||||||
bool allFiltersAreValid = true;
|
bool allMimeTypeFiltersAreValid = true;
|
||||||
|
bool atLeastOneFileExtensionFilter = false;
|
||||||
|
|
||||||
// Retrieve all filters
|
// Retrieve all filters
|
||||||
while (tokenizer.hasMoreTokens()) {
|
while (tokenizer.hasMoreTokens()) {
|
||||||
|
@ -7314,6 +7315,10 @@ HTMLInputElement::SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker)
|
||||||
filterMask = nsIFilePicker::filterVideo;
|
filterMask = nsIFilePicker::filterVideo;
|
||||||
filterBundle->GetStringFromName(MOZ_UTF16("videoFilter"),
|
filterBundle->GetStringFromName(MOZ_UTF16("videoFilter"),
|
||||||
getter_Copies(extensionListStr));
|
getter_Copies(extensionListStr));
|
||||||
|
} else if (token.First() == '.') {
|
||||||
|
extensionListStr = NS_LITERAL_STRING("*") + token;
|
||||||
|
filterName = extensionListStr + NS_LITERAL_STRING("; ");
|
||||||
|
atLeastOneFileExtensionFilter = true;
|
||||||
} else {
|
} else {
|
||||||
//... if no image/audio/video filter is found, check mime types filters
|
//... if no image/audio/video filter is found, check mime types filters
|
||||||
nsCOMPtr<nsIMIMEInfo> mimeInfo;
|
nsCOMPtr<nsIMIMEInfo> mimeInfo;
|
||||||
|
@ -7322,7 +7327,7 @@ HTMLInputElement::SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker)
|
||||||
EmptyCString(), // No extension
|
EmptyCString(), // No extension
|
||||||
getter_AddRefs(mimeInfo))) ||
|
getter_AddRefs(mimeInfo))) ||
|
||||||
!mimeInfo) {
|
!mimeInfo) {
|
||||||
allFiltersAreValid = false;
|
allMimeTypeFiltersAreValid = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7355,7 +7360,7 @@ HTMLInputElement::SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker)
|
||||||
|
|
||||||
if (!filterMask && (extensionListStr.IsEmpty() || filterName.IsEmpty())) {
|
if (!filterMask && (extensionListStr.IsEmpty() || filterName.IsEmpty())) {
|
||||||
// No valid filter found
|
// No valid filter found
|
||||||
allFiltersAreValid = false;
|
allMimeTypeFiltersAreValid = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7395,9 +7400,8 @@ HTMLInputElement::SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If all filters are known/valid, select the first filter as default;
|
if (filters.Length() >= 1 &&
|
||||||
// otherwise filterAll will remain the default filter
|
(allMimeTypeFiltersAreValid || atLeastOneFileExtensionFilter)) {
|
||||||
if (filters.Length() >= 1 && allFiltersAreValid) {
|
|
||||||
// |filterAll| will always use index=0 so we need to set index=1 as the
|
// |filterAll| will always use index=0 so we need to set index=1 as the
|
||||||
// current filter.
|
// current filter.
|
||||||
filePicker->SetFilterIndex(1);
|
filePicker->SetFilterIndex(1);
|
||||||
|
|
|
@ -320,12 +320,18 @@ public:
|
||||||
*
|
*
|
||||||
* @note You should not call this function if the element has no @accept.
|
* @note You should not call this function if the element has no @accept.
|
||||||
* @note "All Files" filter is always set, no matter if there is a valid
|
* @note "All Files" filter is always set, no matter if there is a valid
|
||||||
* filter specifed or not.
|
* filter specified or not.
|
||||||
* @note If there is only one valid filter that is audio or video or image,
|
|
||||||
* it will be selected as the default filter. Otherwise "All files" remains
|
|
||||||
* the default filter.
|
|
||||||
* @note If more than one valid filter is found, the "All Supported Types"
|
* @note If more than one valid filter is found, the "All Supported Types"
|
||||||
* filter is added, which is the concatenation of all valid filters.
|
* filter is added, which is the concatenation of all valid filters.
|
||||||
|
* @note "All Files" filter will be selected by default if unknown mime types
|
||||||
|
* have been specified and no file extension filter has been specified.
|
||||||
|
* Otherwise, specified filter or "All Supported Types" filter will be
|
||||||
|
* selected by default.
|
||||||
|
* The logic behind is that having unknown mime type means we might restrict
|
||||||
|
* user's input too much, as some filters will be missing.
|
||||||
|
* However, if author has also specified some file extension filters, it's
|
||||||
|
* likely those are fallback for the unusual mime type we haven't been able
|
||||||
|
* to resolve; so it's better to select author specified filters in that case.
|
||||||
*/
|
*/
|
||||||
void SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker);
|
void SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker);
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
<input id='l' type="file" accept="image/*,image/gif,image/png">
|
<input id='l' type="file" accept="image/*,image/gif,image/png">
|
||||||
<input id='m' type="file" accept="image/gif,image/gif">
|
<input id='m' type="file" accept="image/gif,image/gif">
|
||||||
<input id='n' type="file" accept="">
|
<input id='n' type="file" accept="">
|
||||||
|
<input id='o' type="file" accept=".test">
|
||||||
|
<input id='p' type="file" accept="image/gif,.csv">
|
||||||
<input id='z' type='file' accept="i/am,a,pathological,;,,,,test/case">
|
<input id='z' type='file' accept="i/am,a,pathological,;,,,,test/case">
|
||||||
<input id='hidden' hidden type='file'>
|
<input id='hidden' hidden type='file'>
|
||||||
<input id='untrusted-click' type='file'>
|
<input id='untrusted-click' type='file'>
|
||||||
|
@ -82,6 +84,8 @@ var testData = [["a", 1, MockFilePicker.filterImages, 1],
|
||||||
["l", 4, imageExtensionList + "; " + "*.gif; *.png", 1],
|
["l", 4, imageExtensionList + "; " + "*.gif; *.png", 1],
|
||||||
["m", 1, "*.gif", 1],
|
["m", 1, "*.gif", 1],
|
||||||
["n", 0, undefined, 0],
|
["n", 0, undefined, 0],
|
||||||
|
["o", 1, "*.test", 1],
|
||||||
|
["p", 3, "*.gif; *.csv", 1],
|
||||||
["z", 0, undefined, 0],
|
["z", 0, undefined, 0],
|
||||||
["hidden", 0, undefined, 0],
|
["hidden", 0, undefined, 0],
|
||||||
["untrusted-click", 0, undefined, 0],
|
["untrusted-click", 0, undefined, 0],
|
||||||
|
|
Загрузка…
Ссылка в новой задаче