diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp
index 65aaa222f281..2b8f0f1671cd 100644
--- a/dom/html/HTMLInputElement.cpp
+++ b/dom/html/HTMLInputElement.cpp
@@ -7382,6 +7382,28 @@ HTMLInputElement::SetFilePickerFiltersFromAccept(nsIFilePicker* filePicker)
}
}
+ // Remove similar filters
+ // Iterate over a copy, as we might modify the original filters list
+ nsTArray filtersCopy;
+ filtersCopy = filters;
+ for (uint32_t i = 0; i < filtersCopy.Length(); ++i) {
+ const nsFilePickerFilter& filterToCheck = filtersCopy[i];
+ if (filterToCheck.mFilterMask) {
+ continue;
+ }
+ for (uint32_t j = 0; j < filtersCopy.Length(); ++j) {
+ if (i == j) {
+ continue;
+ }
+ if (FindInReadable(filterToCheck.mFilter, filtersCopy[j].mFilter)) {
+ // We already have a similar, less restrictive filter (i.e.
+ // filterToCheck extensionList is just a subset of another filter
+ // extension list): remove this one
+ filters.RemoveElement(filterToCheck);
+ }
+ }
+ }
+
// Add "All Supported Types" filter
if (filters.Length() > 1) {
nsXPIDLString title;
diff --git a/dom/html/HTMLInputElement.h b/dom/html/HTMLInputElement.h
index 4ab26e452668..74e51ce101ee 100644
--- a/dom/html/HTMLInputElement.h
+++ b/dom/html/HTMLInputElement.h
@@ -323,6 +323,8 @@ public:
* filter specified or not.
* @note If more than one valid filter is found, the "All Supported Types"
* filter is added, which is the concatenation of all valid filters.
+ * @note Duplicate filters and similar filters (i.e. filters whose file
+ * extensions already exist in another filter) are ignored.
* @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
diff --git a/dom/html/test/forms/test_input_file_picker.html b/dom/html/test/forms/test_input_file_picker.html
index 62ef5baa31bb..ec7f29ffdfad 100644
--- a/dom/html/test/forms/test_input_file_picker.html
+++ b/dom/html/test/forms/test_input_file_picker.html
@@ -11,6 +11,7 @@
Mozilla Bug 377624Mozilla Bug 565274Mozilla Bug 701353
+Mozilla Bug 826176
@@ -29,7 +30,10 @@
+
+
+
@@ -86,7 +90,11 @@ var testData = [["a", 1, MockFilePicker.filterImages, 1],
["n", 0, undefined, 0],
["o", 1, "*.test", 1],
["p", 3, "*.gif; *.csv", 1],
+ ["q", 1, "*.gif", 1],
["z", 0, undefined, 0],
+ // Note: mix and mix-ref tests extension lists are checked differently: see SimpleTest.executeSoon below
+ ["mix-ref", undefined, undefined, undefined],
+ ["mix", 1, undefined, 1],
["hidden", 0, undefined, 0],
["untrusted-click", 0, undefined, 0],
["prevent-default", 0, undefined, 0, true],
@@ -109,6 +117,7 @@ var currentTest = 0;
var filterAllAdded;
var filters;
var filterIndex;
+var mixRefExtensionList;
// disable popups to make sure that the popup blocker does not interfere
// with manually opened file pickers.
@@ -196,12 +205,31 @@ function runTests() {
"File picker show method should have been called (" + testName + ")");
ok(filterAllAdded,
"filterAll is missing (" + testName + ")");
- is(filters.length, testData[currentTest][1],
- "appendFilters not called as often as expected (" + testName + ")");
- is(filters[0], testData[currentTest][2],
- "Correct filters should have been added (" + testName + ")");
- is(filterIndex, testData[currentTest][3],
- "File picker should show the correct filter index (" + testName + ")");
+ if (testName == "mix-ref") {
+ // Used only for reference for next test: nothing to be tested here
+ mixRefExtensionList = filters[0];
+ if (mixRefExtensionList == undefined) {
+ mixRefExtensionList = "";
+ }
+ } else {
+ if (testName == "mix") {
+ // Mixing mime type and file extension filters ("image/jpeg" and
+ // ".jpg" here) shouldn't restrict the list but only extend it, if file
+ // extension filter isn't a duplicate
+ ok(filters[0].contains(mixRefExtensionList),
+ "Mixing mime types and file extension filters shouldn't restrict extension list: " +
+ mixRefExtensionList + " | " + filters[0]);
+ ok(filters[0].contains("*.jpg"),
+ "Filter should contain '.jpg' extension", filters[0]);
+ } else {
+ is(filters[0], testData[currentTest][2],
+ "Correct filters should have been added (" + testName + ")");
+ is(filters.length, testData[currentTest][1],
+ "appendFilters not called as often as expected (" + testName + ")");
+ }
+ is(filterIndex, testData[currentTest][3],
+ "File picker should show the correct filter index (" + testName + ")");
+ }
if (++currentTest == testData.length) {
MockFilePicker.cleanup();