- Revision
- 120410
- Author
- [email protected]
- Date
- 2012-06-14 23:38:25 -0700 (Thu, 14 Jun 2012)
Log Message
Support file extensions in HTMLInputElement::accept
https://bugs.webkit.org/show_bug.cgi?id=88298
Reviewed by Hajime Morita.
Source/WebCore:
The WHATWG specification added file extensions supoprt for
HTMLInputElement::accept recently.
In the WebCore FileChooser interface, we rejected invalid MIME type
strings in HTMLInputElement::acceptMIMETypes(), and platform file
choosers don't expect that it containts file extensions. So, this patch
introduces additional member "acceptFileExtensions" to
FileChooserSettings, and it contains only file extensions specified by
an accept attribute.
* html/FileInputType.cpp:
Sets HTMLInputElement::acceptFileExtensions() to
FileChooserSettings::acceptFileExtensions.
(WebCore::FileInputType::handleDOMActivateEvent):
(WebCore::FileInputType::receiveDropForDirectoryUpload):
* html/HTMLInputElement.cpp:
(WebCore::isValidFileExtension): Added.
(WebCore::parseAcceptAttribute):
Common part for acceptMIMETyps() and acceptFileExtensions().
(WebCore::HTMLInputElement::acceptMIMETypes):
Uses parseAcceptAttribute() with isValidMIMEType().
(WebCore::HTMLInputElement::acceptFileExtensions):
Added. Uses parseAcceptAttribute() with isValidFileExtension().
* html/HTMLInputElement.h:
(HTMLInputElement): Add acceptFileExtensions().
* platform/FileChooser.h:
(FileChooserSettings): Add acceptFileExtensions and acceptTypes().
* platform/FileChooser.cpp:
(WebCore::FileChooserSettings::acceptTypes): Added.
Source/WebKit/chromium:
* src/ChromeClientImpl.cpp:
(WebKit::ChromeClientImpl::runOpenPanel):
Use FileChooserSettings::acceptTypes() to get both of MIME types and file extensions.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (120409 => 120410)
--- trunk/Source/WebCore/ChangeLog 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebCore/ChangeLog 2012-06-15 06:38:25 UTC (rev 120410)
@@ -1,3 +1,40 @@
+2012-06-14 Kent Tamura <[email protected]>
+
+ Support file extensions in HTMLInputElement::accept
+ https://bugs.webkit.org/show_bug.cgi?id=88298
+
+ Reviewed by Hajime Morita.
+
+ The WHATWG specification added file extensions supoprt for
+ HTMLInputElement::accept recently.
+
+ In the WebCore FileChooser interface, we rejected invalid MIME type
+ strings in HTMLInputElement::acceptMIMETypes(), and platform file
+ choosers don't expect that it containts file extensions. So, this patch
+ introduces additional member "acceptFileExtensions" to
+ FileChooserSettings, and it contains only file extensions specified by
+ an accept attribute.
+
+ * html/FileInputType.cpp:
+ Sets HTMLInputElement::acceptFileExtensions() to
+ FileChooserSettings::acceptFileExtensions.
+ (WebCore::FileInputType::handleDOMActivateEvent):
+ (WebCore::FileInputType::receiveDropForDirectoryUpload):
+ * html/HTMLInputElement.cpp:
+ (WebCore::isValidFileExtension): Added.
+ (WebCore::parseAcceptAttribute):
+ Common part for acceptMIMETyps() and acceptFileExtensions().
+ (WebCore::HTMLInputElement::acceptMIMETypes):
+ Uses parseAcceptAttribute() with isValidMIMEType().
+ (WebCore::HTMLInputElement::acceptFileExtensions):
+ Added. Uses parseAcceptAttribute() with isValidFileExtension().
+ * html/HTMLInputElement.h:
+ (HTMLInputElement): Add acceptFileExtensions().
+ * platform/FileChooser.h:
+ (FileChooserSettings): Add acceptFileExtensions and acceptTypes().
+ * platform/FileChooser.cpp:
+ (WebCore::FileChooserSettings::acceptTypes): Added.
+
2012-06-14 James Robinson <[email protected]>
[chromium] Remove unused CanvasLayerChromium.h/cpp from the tree
Modified: trunk/Source/WebCore/html/FileInputType.cpp (120409 => 120410)
--- trunk/Source/WebCore/html/FileInputType.cpp 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebCore/html/FileInputType.cpp 2012-06-15 06:38:25 UTC (rev 120410)
@@ -188,6 +188,7 @@
settings.allowsMultipleFiles = input->fastHasAttribute(multipleAttr);
#endif
settings.acceptMIMETypes = input->acceptMIMETypes();
+ settings.acceptFileExtensions = input->acceptFileExtensions();
settings.selectedFiles = m_fileList->paths();
#if ENABLE(MEDIA_CAPTURE)
settings.capture = input->capture();
@@ -375,6 +376,7 @@
settings.allowsMultipleFiles = true;
settings.selectedFiles.append(paths[0]);
settings.acceptMIMETypes = input->acceptMIMETypes();
+ settings.acceptFileExtensions = input->acceptFileExtensions();
chrome->enumerateChosenDirectory(newFileChooser(settings));
}
}
Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (120409 => 120410)
--- trunk/Source/WebCore/html/HTMLInputElement.cpp 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp 2012-06-15 06:38:25 UTC (rev 120410)
@@ -1135,7 +1135,7 @@
return isASCII(ch) && ch > ' ' && ch != '"' && ch != '(' && ch != ')' && ch != ',' && ch != '/' && (ch < ':' || ch > '@') && (ch < '[' || ch > ']') && ch != '{' && ch != '}' && ch != 0x7f;
}
-static inline bool isValidMIMEType(const String& type)
+static bool isValidMIMEType(const String& type)
{
size_t slashPosition = type.find('/');
if (slashPosition == notFound || !slashPosition || slashPosition == type.length() - 1)
@@ -1147,28 +1147,43 @@
return true;
}
-Vector<String> HTMLInputElement::acceptMIMETypes()
+static bool isValidFileExtension(const String& type)
{
- Vector<String> mimeTypes;
+ if (type.length() < 2)
+ return false;
+ return type[0] == '.';
+}
- String acceptString = accept();
+static Vector<String> parseAcceptAttribute(const String& acceptString, bool (*predicate)(const String&))
+{
+ Vector<String> types;
if (acceptString.isEmpty())
- return mimeTypes;
+ return types;
Vector<String> splitTypes;
acceptString.split(',', false, splitTypes);
for (size_t i = 0; i < splitTypes.size(); ++i) {
- String trimmedMimeType = stripLeadingAndTrailingHTMLSpaces(splitTypes[i]);
- if (trimmedMimeType.isEmpty())
+ String trimmedType = stripLeadingAndTrailingHTMLSpaces(splitTypes[i]);
+ if (trimmedType.isEmpty())
continue;
- if (!isValidMIMEType(trimmedMimeType))
+ if (!predicate(trimmedType))
continue;
- mimeTypes.append(trimmedMimeType.lower());
+ types.append(trimmedType.lower());
}
- return mimeTypes;
+ return types;
}
+Vector<String> HTMLInputElement::acceptMIMETypes()
+{
+ return parseAcceptAttribute(fastGetAttribute(acceptAttr), isValidMIMEType);
+}
+
+Vector<String> HTMLInputElement::acceptFileExtensions()
+{
+ return parseAcceptAttribute(fastGetAttribute(acceptAttr), isValidFileExtension);
+}
+
String HTMLInputElement::accept() const
{
return fastGetAttribute(acceptAttr);
Modified: trunk/Source/WebCore/html/HTMLInputElement.h (120409 => 120410)
--- trunk/Source/WebCore/html/HTMLInputElement.h 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebCore/html/HTMLInputElement.h 2012-06-15 06:38:25 UTC (rev 120410)
@@ -197,6 +197,7 @@
void setDefaultValue(const String&);
Vector<String> acceptMIMETypes();
+ Vector<String> acceptFileExtensions();
String accept() const;
String alt() const;
Modified: trunk/Source/WebCore/platform/FileChooser.cpp (120409 => 120410)
--- trunk/Source/WebCore/platform/FileChooser.cpp 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebCore/platform/FileChooser.cpp 2012-06-15 06:38:25 UTC (rev 120410)
@@ -99,4 +99,13 @@
m_client->filesChosen(files);
}
+Vector<String> FileChooserSettings::acceptTypes() const
+{
+ Vector<String> acceptTypes;
+ acceptTypes.reserveCapacity(acceptMIMETypes.size() + acceptFileExtensions.size());
+ acceptTypes.append(acceptMIMETypes);
+ acceptTypes.append(acceptFileExtensions);
+ return acceptTypes;
}
+
+}
Modified: trunk/Source/WebCore/platform/FileChooser.h (120409 => 120410)
--- trunk/Source/WebCore/platform/FileChooser.h 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebCore/platform/FileChooser.h 2012-06-15 06:38:25 UTC (rev 120410)
@@ -55,10 +55,14 @@
bool allowsDirectoryUpload;
#endif
Vector<String> acceptMIMETypes;
+ Vector<String> acceptFileExtensions;
Vector<String> selectedFiles;
#if ENABLE(MEDIA_CAPTURE)
String capture;
#endif
+
+ // Returns a combined vector of acceptMIMETypes and acceptFileExtensions.
+ Vector<String> acceptTypes() const;
};
class FileChooserClient {
Modified: trunk/Source/WebKit/chromium/ChangeLog (120409 => 120410)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-06-15 06:38:25 UTC (rev 120410)
@@ -1,3 +1,14 @@
+2012-06-14 Kent Tamura <[email protected]>
+
+ Support file extensions in HTMLInputElement::accept
+ https://bugs.webkit.org/show_bug.cgi?id=88298
+
+ Reviewed by Hajime Morita.
+
+ * src/ChromeClientImpl.cpp:
+ (WebKit::ChromeClientImpl::runOpenPanel):
+ Use FileChooserSettings::acceptTypes() to get both of MIME types and file extensions.
+
2012-06-14 Kaustubh Atrawalkar <[email protected]>
Remove support for counterValueForElementById from chromium port
Modified: trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp (120409 => 120410)
--- trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp 2012-06-15 06:35:42 UTC (rev 120409)
+++ trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp 2012-06-15 06:38:25 UTC (rev 120410)
@@ -718,7 +718,7 @@
#else
params.directory = false;
#endif
- params.acceptTypes = fileChooser->settings().acceptMIMETypes;
+ params.acceptTypes = fileChooser->settings().acceptTypes();
params.selectedFiles = fileChooser->settings().selectedFiles;
if (params.selectedFiles.size() > 0)
params.initialValue = params.selectedFiles[0];