Title: [120410] trunk/Source
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];
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to