<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[281612] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/281612">281612</a></dd>
<dt>Author</dt> <dd>akeerthi@apple.com</dd>
<dt>Date</dt> <dd>2021-08-25 20:08:42 -0700 (Wed, 25 Aug 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] Unable to select files when the accept attribute is set to "*/*"
https://bugs.webkit.org/show_bug.cgi?id=229456
rdar://82346315

Reviewed by Chris Dumez.

Source/WebKit:

"*/*" is a valid MIME type string representing all media types. However,
the UniformTypeIdentifiers framework (as well as the now deprecated
CoreServices type identifiers API) does not map wildcard MIME types.

In order to restrict `UIDocumentPickerViewController` to the types of
files specified in the accept attribute, all MIME type strings are
converted into `UTType`s. However, when attempting to retrieve a UTType
for "*/*", the system dynamically generates a type, since the string is
unregistered. Then, since no files conform to the dynamic type, all
files in the document picker are greyed out, and the user is unable
to access the "Photo Library" and "Take Photo or Video" items.

To fix, return an empty set of type identifiers whenever "*/*" is
present in the list of MIME types, ensuring there are no restrictions
on the types of files that can be selected.

Note that the same issue does not occur on macOS, since all MIME types
are mapped to a set of file extensions, rather than UTTypes. Furthermore,
on macOS, the embedding app, not WebKit, is responsible for displaying
the file picker.

* UIProcess/ios/forms/WKFileUploadPanel.mm:

LayoutTests:

Updated tests to verify that setting the accept attribute to "*/*" does
not impose any restrictions on the types of files that can be selected,
and gives the user access to all menu options.

* fast/forms/ios/file-upload-panel-accept-expected.txt:
* fast/forms/ios/file-upload-panel-accept.html:
* fast/forms/ios/file-upload-panel-expected.txt:
* fast/forms/ios/file-upload-panel.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfileuploadpanelacceptexpectedtxt">trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfileuploadpanelaccepthtml">trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept.html</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfileuploadpanelexpectedtxt">trunk/LayoutTests/fast/forms/ios/file-upload-panel-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastformsiosfileuploadpanelhtml">trunk/LayoutTests/fast/forms/ios/file-upload-panel.html</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitUIProcessiosformsWKFileUploadPanelmm">trunk/Source/WebKit/UIProcess/ios/forms/WKFileUploadPanel.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (281611 => 281612)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2021-08-26 03:07:24 UTC (rev 281611)
+++ trunk/LayoutTests/ChangeLog 2021-08-26 03:08:42 UTC (rev 281612)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2021-08-25  Aditya Keerthi  <akeerthi@apple.com>
+
+        [iOS] Unable to select files when the accept attribute is set to "*/*"
+        https://bugs.webkit.org/show_bug.cgi?id=229456
+        rdar://82346315
+
+        Reviewed by Chris Dumez.
+
+        Updated tests to verify that setting the accept attribute to "*/*" does
+        not impose any restrictions on the types of files that can be selected,
+        and gives the user access to all menu options.
+
+        * fast/forms/ios/file-upload-panel-accept-expected.txt:
+        * fast/forms/ios/file-upload-panel-accept.html:
+        * fast/forms/ios/file-upload-panel-expected.txt:
+        * fast/forms/ios/file-upload-panel.html:
+
</ins><span class="cx"> 2021-08-25  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r281516): [AppleSilicon WK2] fast/loader/reload-zero-byte-plugin.html is timing out
</span></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfileuploadpanelacceptexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept-expected.txt (281611 => 281612)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept-expected.txt   2021-08-26 03:07:24 UTC (rev 281611)
+++ trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept-expected.txt      2021-08-26 03:08:42 UTC (rev 281612)
</span><span class="lines">@@ -6,6 +6,9 @@
</span><span class="cx"> * accept =
</span><span class="cx"> PASS areArraysEqual(items, []) is true
</span><span class="cx"> 
</span><ins>+* accept = */*
+PASS areArraysEqual(items, []) is true
+
</ins><span class="cx"> * accept = image/*
</span><span class="cx"> PASS areArraysEqual(items, ["public.image"]) is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfileuploadpanelaccepthtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept.html (281611 => 281612)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept.html   2021-08-26 03:07:24 UTC (rev 281611)
+++ trunk/LayoutTests/fast/forms/ios/file-upload-panel-accept.html      2021-08-26 03:08:42 UTC (rev 281612)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx">     description("Tests that the accept attribute for file inputs is mapped to the correct set of type identifiers on iOS.");
</span><span class="cx"> 
</span><span class="cx">     await runTest("", '[]');
</span><ins>+    await runTest("*/*", '[]');
</ins><span class="cx">     await runTest("image/*", '["public.image"]');
</span><span class="cx">     await runTest("video/*", '["public.movie"]');
</span><span class="cx">     await runTest("image/*, video/*", '["public.image", "public.movie"]');
</span></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfileuploadpanelexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/ios/file-upload-panel-expected.txt (281611 => 281612)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/file-upload-panel-expected.txt  2021-08-26 03:07:24 UTC (rev 281611)
+++ trunk/LayoutTests/fast/forms/ios/file-upload-panel-expected.txt     2021-08-26 03:08:42 UTC (rev 281612)
</span><span class="lines">@@ -6,6 +6,9 @@
</span><span class="cx"> * accept =
</span><span class="cx"> PASS areArraysEqual(items, ["Photo Library", "Take Photo or Video", "Choose File"]) is true
</span><span class="cx"> 
</span><ins>+* accept = */*
+PASS areArraysEqual(items, ["Photo Library", "Take Photo or Video", "Choose File"]) is true
+
</ins><span class="cx"> * accept = image/*
</span><span class="cx"> PASS areArraysEqual(items, ["Photo Library", "Take Photo", "Choose File"]) is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastformsiosfileuploadpanelhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/forms/ios/file-upload-panel.html (281611 => 281612)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/forms/ios/file-upload-panel.html  2021-08-26 03:07:24 UTC (rev 281611)
+++ trunk/LayoutTests/fast/forms/ios/file-upload-panel.html     2021-08-26 03:08:42 UTC (rev 281612)
</span><span class="lines">@@ -62,6 +62,7 @@
</span><span class="cx">     document.getElementById("console").style = "display: none";
</span><span class="cx"> 
</span><span class="cx">     await runAcceptTest("", '["Photo Library", "Take Photo or Video", "Choose File"]');
</span><ins>+    await runAcceptTest("*/*", '["Photo Library", "Take Photo or Video", "Choose File"]');
</ins><span class="cx">     await runAcceptTest("image/*", '["Photo Library", "Take Photo", "Choose File"]');
</span><span class="cx">     await runAcceptTest("video/*", '["Photo Library", "Take Video", "Choose File"]');
</span><span class="cx">     await runAcceptTest("image/*, video/*", '["Photo Library", "Take Photo or Video", "Choose File"]');
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (281611 => 281612)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2021-08-26 03:07:24 UTC (rev 281611)
+++ trunk/Source/WebKit/ChangeLog       2021-08-26 03:08:42 UTC (rev 281612)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2021-08-25  Aditya Keerthi  <akeerthi@apple.com>
+
+        [iOS] Unable to select files when the accept attribute is set to "*/*"
+        https://bugs.webkit.org/show_bug.cgi?id=229456
+        rdar://82346315
+
+        Reviewed by Chris Dumez.
+
+        "*/*" is a valid MIME type string representing all media types. However,
+        the UniformTypeIdentifiers framework (as well as the now deprecated
+        CoreServices type identifiers API) does not map wildcard MIME types.
+
+        In order to restrict `UIDocumentPickerViewController` to the types of
+        files specified in the accept attribute, all MIME type strings are
+        converted into `UTType`s. However, when attempting to retrieve a UTType
+        for "*/*", the system dynamically generates a type, since the string is
+        unregistered. Then, since no files conform to the dynamic type, all
+        files in the document picker are greyed out, and the user is unable
+        to access the "Photo Library" and "Take Photo or Video" items.
+
+        To fix, return an empty set of type identifiers whenever "*/*" is
+        present in the list of MIME types, ensuring there are no restrictions
+        on the types of files that can be selected.
+
+        Note that the same issue does not occur on macOS, since all MIME types
+        are mapped to a set of file extensions, rather than UTTypes. Furthermore,
+        on macOS, the embedding app, not WebKit, is responsible for displaying
+        the file picker.
+
+        * UIProcess/ios/forms/WKFileUploadPanel.mm:
+
</ins><span class="cx"> 2021-08-25  Wenson Hsieh  <wenson_hsieh@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Remove some iOS-specific compile-time guards that are no longer needed
</span></span></pre></div>
<a id="trunkSourceWebKitUIProcessiosformsWKFileUploadPanelmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/UIProcess/ios/forms/WKFileUploadPanel.mm (281611 => 281612)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/UIProcess/ios/forms/WKFileUploadPanel.mm     2021-08-26 03:07:24 UTC (rev 281611)
+++ trunk/Source/WebKit/UIProcess/ios/forms/WKFileUploadPanel.mm        2021-08-26 03:08:42 UTC (rev 281612)
</span><span class="lines">@@ -355,6 +355,9 @@
</span><span class="cx"> {
</span><span class="cx">     NSMutableSet *mediaTypes = [NSMutableSet set];
</span><span class="cx">     for (NSString *mimeType in mimeTypes) {
</span><ins>+        if ([mimeType isEqualToString:@"*/*"])
+            return [NSSet set];
+
</ins><span class="cx">         if ([mimeType caseInsensitiveCompare:@"image/*"] == NSOrderedSame)
</span><span class="cx">             [mediaTypes addObject:UTTypeImage.identifier];
</span><span class="cx">         else if ([mimeType caseInsensitiveCompare:@"video/*"] == NSOrderedSame)
</span><span class="lines">@@ -368,7 +371,6 @@
</span><span class="cx">             if (uti)
</span><span class="cx">                 [mediaTypes addObject:uti.identifier];
</span><span class="cx">         }
</span><del>-
</del><span class="cx">     }
</span><span class="cx">     return mediaTypes;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>