114
114
< p >
115
115
The < a data-link-for ="ShareTarget "> params</ a > keys correspond to the
116
116
key names in < a data-cite ="WebShare#dom-sharedata "> ShareData</ a > from
117
- [[! WebShare]], while the values are arbitrary names that will be used
118
- as query parameters when the target is launched.
117
+ [[WebShare]], while the values are arbitrary names that will be used as
118
+ query parameters when the target is launched.
119
119
</ p >
120
120
< p >
121
121
When a share takes place, if the user selects this share target, the
@@ -208,6 +208,44 @@ <h2>
208
208
})());
209
209
});
210
210
</ pre >
211
+ < p >
212
+ A < a data-link-for ="ShareTargetParams "> files</ a > entry in params is
213
+ used to declare that files are accepted by the share target:
214
+ </ p >
215
+ < pre class ="example json " title ="manifest.webmanifest ">
216
+ {
217
+ "name": "Aggregator",
218
+ "share_target": {
219
+ "action": "/cgi-bin/aggregate",
220
+ "method": "POST",
221
+ "enctype": "multipart/form-data",
222
+ "params": {
223
+ "title": "name",
224
+ "text": "description",
225
+ "url": "link",
226
+ "files": [
227
+ {
228
+ "name": "records",
229
+ "accept": ["text/csv", ".csv"]
230
+ },
231
+ {
232
+ "name": "graphs",
233
+ "accept": "image/svg+xml"
234
+ }
235
+ ]
236
+ }
237
+ }
238
+ }
239
+ </ pre >
240
+ < p >
241
+ The target will be < a > invoked</ a > with a
242
+ < code > multipart/form-data</ code > POST request, with field names as
243
+ specified in params. Each shared file is assigned to the first files
244
+ entry that accepts its MIME type. (The < code > "POST"</ code >
245
+ < code > method</ code > and < code > "multipart/form-data"</ code >
246
+ < code > enctype</ code > are necessary when file sharing, as with HTML
247
+ forms.)
248
+ </ p >
211
249
< p >
212
250
How the handler deals with the shared data is at the handler's
213
251
discretion, and will generally depend on the type of app. Here are some
@@ -216,14 +254,16 @@ <h2>
216
254
< ul >
217
255
< li > An email client might draft a new email, using < code > title</ code >
218
256
as the subject of an email, with < code > text</ code > and < code > url</ code >
219
- concatenated together as the body.
257
+ concatenated together as the body, and < code > files</ code > as
258
+ attachments.
220
259
</ li >
221
260
< li > A social networking app might draft a new post, ignoring
222
261
< code > title</ code > , using < code > text</ code > as the body of the message
223
- and adding < code > url</ code > as a link. If < code > text</ code > is missing,
224
- it might use < code > url</ code > in the body as well. If < code > url</ code >
225
- is missing, it might scan < code > text</ code > looking for a URL and add
226
- that as a link.
262
+ and adding < code > url</ code > as a link. Image < code > files</ code > would
263
+ be accepted by MIME type or file extension, and attached to the post.
264
+ If < code > text</ code > is missing, it might use < code > url</ code > in the
265
+ body as well. If < code > url</ code > is missing, it might scan
266
+ < code > text</ code > looking for a URL and add that as a link.
227
267
</ li >
228
268
< li > A text messaging app might draft a new message, ignoring
229
269
< code > title</ code > and using < code > text</ code > and < code > url</ code >
@@ -241,10 +281,16 @@ <h2>
241
281
"!appmanifest#dom-webappmanifest "> WebAppManifest</ dfn > dictionary.
242
282
</ p >
243
283
< pre class ="idl ">
284
+ dictionary ShareTargetFiles {
285
+ required USVString name;
286
+ (USVString or sequence<USVString>) accept = [];
287
+ };
288
+
244
289
dictionary ShareTargetParams {
245
290
USVString title;
246
291
USVString text;
247
292
USVString url;
293
+ (ShareTargetFiles or sequence<ShareTargetFiles>) files;
248
294
};
249
295
250
296
dictionary ShareTarget {
@@ -322,6 +368,70 @@ <h3>
322
368
warning</ a > that the enctype is not supported, and return
323
369
< code > undefined</ code > .
324
370
</ li >
371
+ < li > If < var > share target</ var > ["< a data-link-for =
372
+ "ShareTarget "> params</ a > "]["< a data-link-for =
373
+ "ShareTargetParams "> files</ a > "] is a < a > ShareTargetFiles</ a >
374
+ dictionary, < var > bucket</ var > , set < var > share
375
+ target</ var > ["< a data-link-for =
376
+ "ShareTarget "> params</ a > "]["< a data-link-for =
377
+ "ShareTargetParams "> files</ a > "] to [< var > bucket</ var > ].
378
+ </ li >
379
+ < li > If < var > share target</ var > ["< a data-link-for =
380
+ "ShareTarget "> params</ a > "]["< a data-link-for =
381
+ "ShareTargetParams "> files</ a > "] contains one or more
382
+ < a > ShareTargetFiles</ a > dictionaries, and < var > share
383
+ target</ var > ["< a data-link-for ="ShareTarget "> method</ a > "] is not an
384
+ < a data-cite ="!INFRA#ascii-case-insensitive "> ASCII
385
+ case-insensitive</ a > match for the string < code > "POST"</ code > , or
386
+ < var > share target</ var > ["< a data-link-for ="ShareTarget "> enctype</ a > "]
387
+ is not an < a data-cite ="!INFRA#ascii-case-insensitive "> ASCII
388
+ case-insensitive</ a > match for the string
389
+ < code > "multipart/form-data"</ code > , < a data-cite =
390
+ "!appmanifest#dfn-issue-a-developer-warning "> issue a developer
391
+ warning</ a > that files are only supported with multipart/form-data
392
+ POST, and return < code > undefined</ code > .
393
+ </ li >
394
+ < li > For each < var > bucket</ var > in < var > share
395
+ target</ var > ["< a data-link-for =
396
+ "ShareTarget "> params</ a > "]["< a data-link-for =
397
+ "ShareTargetParams "> files</ a > "]:
398
+ < ol >
399
+ < li > If < var > bucket</ var > ["< a data-link-for =
400
+ "ShareTargetFiles "> name</ a > "] is an empty string, < a data-cite =
401
+ "!appmanifest#dfn-issue-a-developer-warning "> issue a developer
402
+ warning</ a > and return < code > undefined</ code > .
403
+ </ li >
404
+ < li > If < var > bucket</ var > ["< a data-link-for =
405
+ "ShareTargetFiles "> accept</ a > "] is a < a data-cite =
406
+ "!WEBIDL#idl-USVString "> USVString</ a > , < var > accept</ var > , set
407
+ < var > bucket</ var > ["< a data-link-for =
408
+ "ShareTargetFiles "> accept</ a > "] to [< var > accept</ var > ].
409
+ </ li >
410
+ < li > If < var > bucket</ var > ["< a data-link-for =
411
+ "ShareTargetFiles "> accept</ a > "] contains a string that does not
412
+ match any of the following, < a data-cite =
413
+ "!appmanifest#dfn-issue-a-developer-warning "> issue a developer
414
+ warning</ a > and return < code > undefined</ code > .
415
+ < ul >
416
+ < li > a string whose first character is a U+002E FULL STOP
417
+ character (.)
418
+ </ li >
419
+ < li >
420
+ < var > type</ var > < code > /</ code > < var > subtype</ var > (where
421
+ < var > type</ var > and < var > subtype</ var > are < a data-cite =
422
+ "!RFC7230#section-3.2.6 "> RFC7230 tokens</ a > )
423
+ </ li >
424
+ < li >
425
+ < var > type</ var > < code > /*</ code > (where < var > type</ var > is a
426
+ < a data-cite ="!RFC7230#section-3.2.6 "> RFC7230 token</ a > )
427
+ </ li >
428
+ < li >
429
+ < code > */*</ code >
430
+ </ li >
431
+ </ ul >
432
+ </ li >
433
+ </ ol >
434
+ </ li >
325
435
< li > Let < var > action</ var > be the result of < a data-cite =
326
436
"!URL#concept-url-parser "> parsing</ a > the < a data-cite =
327
437
"!URL#concept-url "> URL</ a > < var > share
@@ -408,6 +518,30 @@ <h3>
408
518
The < dfn > url</ dfn > member specifies the name of the query parameter
409
519
used for the URL string referring to a resource being shared.
410
520
</ p >
521
+ < p >
522
+ The < dfn > files</ dfn > member contains zero or more
523
+ < a > ShareTargetFiles</ a > dictionaries.
524
+ </ p >
525
+ </ section >
526
+ < section data-dfn-for ="ShareTargetFiles " data-link-for =
527
+ "ShareTargetFiles ">
528
+ < h3 >
529
+ < code > ShareTargetFiles</ code > and its members
530
+ </ h3 >
531
+ < p >
532
+ The < dfn > ShareTargetFiles</ dfn > dictionary contains the following
533
+ members.
534
+ </ p >
535
+ < p >
536
+ The < dfn > name</ dfn > member specifies the name of the form field used
537
+ to share the files.
538
+ </ p >
539
+ < p >
540
+ The < dfn > accept</ dfn > member specifies a sequence of accepted MIME
541
+ type(s) or file extension(s), the latter expressed as strings
542
+ starting with U+002E FULL STOP (.). An empty sequence indicates that
543
+ all files are accepted.
544
+ </ p >
411
545
</ section >
412
546
</ section >
413
547
< section >
@@ -456,6 +590,25 @@ <h2>
456
590
visited or explicitly registered.
457
591
</ p >
458
592
< div class ="issue " data-number ="26 "> </ div >
593
+ < p >
594
+ An implementation supports < dfn > filtering on MIME types</ dfn > if it
595
+ takes into account the MIME types of the files being shared when
596
+ presenting the user with a choice of share targets.
597
+ </ p >
598
+ < p >
599
+ An implementation supports < dfn > filtering on file extensions</ dfn > if
600
+ it takes into account the extensions in the names of the files being
601
+ shared when presenting the user with a choice of share targets.
602
+ </ p >
603
+ < p >
604
+ An implementation MUST support < a > filtering on MIME types</ a > or
605
+ < a > filtering on file extensions</ a > , or both.
606
+ </ p >
607
+ < p >
608
+ If a file being shared is not < a > accepted</ a > by any of a share
609
+ target's < a data-link-for ="ShareTargetParams "> files</ a > entries, the
610
+ user MUST NOT be presented with that web share target as an option.
611
+ </ p >
459
612
</ section >
460
613
< section >
461
614
< h2 >
538
691
"ShareTarget "> action</ a > "].
539
692
</ li >
540
693
< li > Let < var > entry list</ var > be a new empty list of name-value
541
- tuples.
694
+ tuples. Each value can be either a < a data-cite =
695
+ "!WEBIDL#idl-USVString "> USVString</ a > or a < a data-cite =
696
+ "!FILE-API#file-section "> File</ a > list.
542
697
</ li >
543
698
< li > For each < var > member</ var > in the sequence «
544
699
< code > "title"</ code > , < code > "text"</ code > , < code > "url"</ code > »,
@@ -561,6 +716,56 @@ <h3>
561
716
</ li >
562
717
</ ol >
563
718
</ li >
719
+ < li > Let < var > accepted</ var > be an empty map of
720
+ name/< code > < a data-cite ="!FILE-API#file-section "> File</ a > </ code > list
721
+ pairs.
722
+ </ li >
723
+ < li > For each < var > bucket</ var > in the sequence
724
+ < var > manifest</ var > ["< a > share_target</ a > "]["< a data-link-for =
725
+ "ShareTarget "> params</ a > "]["< a data-link-for =
726
+ "ShareTargetParams "> files</ a > "],
727
+ < ol >
728
+ < li > Set
729
+ < var > accepted</ var > [< var > bucket</ var > ["< a data-link-for ="ShareTargetFiles "> name</ a > "]]
730
+ to a new empty < code > < a data-cite =
731
+ "!FILE-API#file-section "> File</ a > </ code > list.
732
+ </ li >
733
+ </ ol >
734
+ </ li >
735
+ < li > For each < var > shared file</ var > in the sequence
736
+ < var > data</ var > [< code > "files"</ code > ],
737
+ < ol >
738
+ < li > Find the first < var > bucket</ var > in the sequence
739
+ < var > manifest</ var > ["< a > share_target</ a > "]["< a data-link-for =
740
+ "ShareTarget "> params</ a > "]["< a data-link-for =
741
+ "ShareTargetParams "> files</ a > "] that < a > accepts</ a > < var > shared
742
+ file</ var > .
743
+ </ li >
744
+ < li > Append < var > shared file</ var > to
745
+ < var > accepted</ var > [< var > bucket</ var > ["< a data-link-for =
746
+ "ShareTargetFiles "> name</ a > "]].
747
+ </ li >
748
+ </ ol >
749
+ </ li >
750
+ < li > For each < var > bucket</ var > in the sequence
751
+ < var > manifest</ var > ["< a > share_target</ a > "]["< a data-link-for =
752
+ "ShareTarget "> params</ a > "]["< a data-link-for =
753
+ "ShareTargetParams "> files</ a > "],
754
+ < ol >
755
+ < li > Let < var > name</ var > be the value of
756
+ < var > bucket</ var > ["< a data-link-for =
757
+ "ShareTargetFiles "> name</ a > "].
758
+ </ li >
759
+ < li > Let < var > value</ var > be the value of
760
+ < var > accepted</ var > [< var > name</ var > ], a (possibly empty)
761
+ < code > < a data-cite ="!FILE-API#file-section "> File</ a > </ code > list.
762
+ </ li >
763
+ < li >
764
+ < a data-cite ="!INFRA#list-append "> Append</ a > to < var > entry
765
+ list</ var > a tuple with < var > name</ var > and < var > value</ var > .
766
+ </ li >
767
+ </ ol >
768
+ </ li >
564
769
< li > Let < var > header list</ var > be a new empty < a data-cite =
565
770
"!FETCH/#concept-header-list "> header list</ a > .
566
771
</ li >
@@ -648,6 +853,52 @@ <h3>
648
853
run on it and still has a < a > share_target</ a > afterwards.
649
854
</ p >
650
855
</ section >
856
+ < section >
857
+ < h3 >
858
+ Determining if a file is accepted
859
+ </ h3 >
860
+ < p >
861
+ The algorithm for determining if a < a > ShareTargetFiles</ a >
862
+ < var > bucket</ var > < dfn data-lt ="accepted "> accepts</ dfn > a
863
+ < a data-cite ="!FILE-API#file-section "> File</ a > < var > shared file</ var >
864
+ is as follows:-
865
+ </ p >
866
+ < ol >
867
+ < li > If < var > bucket</ var > ["< a data-link-for =
868
+ "ShareTargetFiles "> accept</ a > "] is empty, return < code > true</ code > .
869
+ </ li >
870
+ < li > For each < var > criterion</ var > in
871
+ < var > bucket</ var > ["< a data-link-for ="ShareTargetFiles "> accept</ a > "]:
872
+ < ol >
873
+ < li > If the first character of < var > criterion</ var > is a U+002E
874
+ FULL STOP character (.) and < var > shared
875
+ file</ var > [< code > "name"</ code > ] ends with < var > criterion</ var > ,
876
+ and the implementation supports < a > filtering on file
877
+ extensions</ a > , return < code > true</ code > .
878
+ </ li >
879
+ < li > If < var > criterion</ var > is
880
+ < var > type</ var > < code > /</ code > < var > subtype</ var > (where
881
+ < var > type</ var > and < var > subtype</ var > are < a data-cite =
882
+ "!RFC7230#section-3.2.6 "> RFC7230 tokens</ a > ) and matches the MIME
883
+ type of < var > shared file</ var > , and the implementation supports
884
+ < a > filtering on MIME types</ a > , return < code > true</ code > .
885
+ </ li >
886
+ < li > If < var > criterion</ var > is < var > type</ var > < code > /*</ code >
887
+ (where < var > type</ var > is a < a data-cite =
888
+ "!RFC7230#section-3.2.6 "> RFC7230 token</ a > ) and the MIME type of
889
+ < var > shared file</ var > is a subtype of < code > type</ code > , and the
890
+ implementation supports < a > filtering on MIME types</ a > , return
891
+ < code > true</ code > .
892
+ </ li >
893
+ < li > If < var > criterion</ var > is < code > */*</ code > , return
894
+ < code > true</ code > .
895
+ </ li >
896
+ </ ol >
897
+ </ li >
898
+ < li > Return < code > false</ code > .
899
+ </ li >
900
+ </ ol >
901
+ </ section >
651
902
</ section >
652
903
< section class ="informative ">
653
904
< h2 >
0 commit comments