◎要約
この仕様は、
`~Web共有n^cite( `Web Share^en )~API
— [
~text, ~link, その他の内容
]を利用者が選んだ任意な行先にて共有するための~API —
を定義する。
◎
This specification defines an API for sharing text, links and other content to an arbitrary destination of the user's choice.
可用な共有n~targetは、
ここでは指定されない
— それらは、
~UAにより供される
— 例えば,様々な[
~app/~web~site/連絡先
]にもなり得る。
◎
The available share targets are not specified here; they are provided by the user agent. They could, for example, be apps, websites or contacts.
1. 用法~例
◎非規範的
1.1. ~textと~linkの共有
この例は、
基本的な共有n演算を示す。
次の~JS~codeは、
~button~clickに呼応して,現在の~pageの~URLを共有する。
◎
This example shows a basic share operation. In response to a button click, this JavaScript code shares the current page's URL.
~textと~URLを共有する例:
◎
Example 1: Sharing text and URL
shareButton.addEventListener("click", async () => {
try {
await navigator.share({ title: "Example Page", url: "" });
console.log("~dataは成功裡に共有されました");
} catch (%err) {
console.error("共有nに失敗しました:", %err.message);
}
});
`url$mb に与えた空~文字列は、
現在の~page~URLを指すことに注意
— それが,ある~link内にあったかのように
【 `a^e 要素の `href^a 属性に指定されたときと同じく】。
他の[
絶対/相対
]~URLも利用できる。
◎
Note that a url of '' refers to the current page URL, just as it would in a link. Any other absolute or relative URL can also be used.
上の~code内の `share()$m の~callに呼応して、
~UAは,[
ある選択用~dialogを表示する
]ことにより[
所与の~titleと~page~URLを共有する~target
]を選定することを利用者に許容することになる。
◎
In response to this call to share(), the user agent would display a picker or chooser dialog, allowing the user to select a target to share this title and the page URL to.
1.2. ~fileの共有-法
この例は、
~fileを共有する方法を示す。
`files$mb ~memberは配列であり,
複数~fileの共有を許容することに注意。
◎
This example shows how to share a file. Note that the files member is an array, allowing for multiple files to be shared.
~fileを共有する例:
◎
Example 2: Sharing a file
shareButton.addEventListener("click", async () => {
const file = new File(%data, "some.png", { type: "image/png" });
try {
await navigator.share({
title: "Example File",
files: [%file]
});
} catch (%err) {
console.error("共有nに失敗しました:", %err.message);
}
});
1.3. 共有nの検証-法
`共有n~dataを検証する$ためには、
それを与える `ShareData$I 辞書を伴わせて,
`canShare()$m ~methodを~callする。
`share()$m と違って,これは`一過な作動化を有して$いない下でも~callできる。
◎
Calling canShare() method with a ShareData dictionary validates the shared data. Unlike share(), it can be called without transient activation.
共有nを検証する例
◎
Example 3
const %file = new File([], "some.png", { type: "image/png" });
/* */
if (navigator【!navigates】.canShare({files: [%file]})) {
/* */
}
/* */
if (navigator【!navigates】.canShare({ url: %someURL })) {
/* */
}
1.4. 各~member用の~support有無の検査-法
`share()$m に渡された `ShareData$I 辞書を成す~memberのうち,~UAに未知なものは、
~Web~IDLに則って無視される。
これは、[
複数の~memberを共有しているが,
~UAが いずれかの~memberに対し共有を~supportしないとき
]に問題になり得る。
~UAが渡された~memberすべてを~supportするかどうか確かめたいなら、
各~memberを個別に `canShare()$m に渡すことにより,
~supportされるか否か検査できる。
◎
Because of how WebIDL dictionaries work, members passed to share() that are unknown to the user agent are ignored. This can be a problem when sharing multiple members, but the user agent doesn't support sharing one of those members. To be sure that every member being passed is supported by the user agent, you can pass them to canShare() individually to check if they are supported.
`future-proofing^en な共有nの例:
◎
Example 4: Future-proofing shares
const %data = {
title: "Example Page",
url: "https://example.com",
text: "This is a text to share",
someFutureThing: "some future thing",
};
const %allSupported = Object.entries(%data).every(([%key, %value]) => {
return navigator.canShare({ [%key]: %value });
});
if (%allSupported) {
await navigator.share(%data);
}
代替として、
~supportされない~member用の~UI成分は示さないよう,~appの~UIを調整できる。
◎
Alternatively, you can adjust application's UI to not show UI components for unsupported members.
~supportされない~memberを~filterして外す例
◎
Example 5: Filtering out unsupported members
const %data = {
title: "Example Page",
url: "https://example.com",
text: "This is a text to share",
someFutureThing: "some future thing",
};
/* */
const %unsupported = Object.entries(%data).filter(([%key, %value]) => {
return !navigator.canShare({ [%key]: %value });
});
1.5. 第三者-主体~文脈における~APIの可能化-法
`~Web共有n^cite ~API用の`既定の許容list$は `'self'$l である
— したがって、
可用になる文脈は,既定では当事者-主体に限られる。
◎
The default allowlist of 'self' makes Web Share API available by default only in first-party contexts.
第三者-主体における この~APIの利用は、
`iframe$e の `allow$a 属性を介して許容できる:
◎
Third-party can be allowed to use this API via an iframe's allow attribute:
第三者-主体~文脈において,
`~Web共有n^cite ~APIを可能化する例:
◎
Example 6: Enabling the web-share API in a third-party context
<iframe
src="https://third-party.example"
allow="web-share">
</iframe>
代替として,~HTTP応答~headerを指定することにより、
当事者-主体~文脈においても~APIを不能化できる:
◎
Alternatively, the API can be disabled in a first-party context by specifying an HTTP response header:
~HTTP越しに `Permissions-Policy$h を利用して,
`~Web共有n^cite ~APIを不能化する例:
【!Web Share over API → Web Share API over】
◎
Example 7: Disabling Web Share over API HTTP using Permissions Policy
Permissions-Policy: web-share=()
各 生成元 別に許可~施策を制御する方法についての詳細は、
`許可~施策$cite 仕様を見よ。
◎
See the Permissions Policy specification for more details and for how to control the permission policies on a per-origin basis.
2. ~API定義
2.1. `Navigator^I ~interfaceに対する拡張
partial interface `Navigator$I {
[`SecureContext$] `Promise$<`undefined$> `share$m(optional `ShareData$I data = {});
[`SecureContext$] `boolean$ `canShare$m(optional `ShareData$I data = {});
};
2.1.1. 内部~slot
この~APIは、
`Navigator$I ~interfaceに
`sharePromise@sl
内部~slotを追加する。
それは、[
~NULL/~promise
]をとり,初期~時は ~NULL とする。
この~promiseは、[
何らかの~dataを`共有n~target$と共有する
]ことに関する利用者の現在の意図を表現する。
◎
This API adds the following internal slot to the Navigator interface.
◎
Promise? [[sharePromise]]
• The this.[[sharePromise]] is a promise that represents a user's current intent to share some data with a share target. It is initialized to null.
2.1.2. `share()^m ~method
`share()$m ~methodが~callされたときは、
以下に挙げる~security含意も考慮に入れて,その手続きを走らすこと。
◎
When the share() method is called with argument data, run the listed steps listed below while taking into consideration the following security implications.
`~Web共有n^cite は、
~dataが~web~siteから`共有n~target$へ送信されることを可能化する
— ~native~appも,共有n~targetになり得る。
`~Web共有n^cite に限ったことではないが、
この能には,いくつか潜在的な~security~riskがついて来る
— ~riskの深刻さは、
下層の~platformに依存して変わり得る。
◎
Web Share enables data to be sent from websites to a share target, which can be a native applications. While this ability is not unique to Web Share, it does come with a number of potential security risks that can vary in severity (depending on the underlying platform).
`share()$m に渡された~dataは、
共有nを受信する`共有n~target$における~remote~code実行の脆弱性
— ~buffer~overflowなど —
を悪用するために利用されるかもしれない。
これに抗して防護する一般的な仕方は無いが、
実装者には,
(特に~fileを共有するときには)
そのアリ性を自覚することが求まれる。
◎
The data passed to share() might be used to exploit buffer overflow or other remote code execution vulnerabilities in the share target that receive shares. There is no general way to guard against this, but implementors will want to be aware that it is a possibility (particularly when sharing files).
`共有n~target$が共有される~URLを `dereference^en して
【~URLが参照している内容を取得して】,
その情報を回送する場合、
他では機密的かもしれない情報を不作為に回送するかもしれない。
これは、
共有nが次に挙げるいずれかを参照する場合に,
期待されない情報~漏洩eに至らせ得る
⇒#
当の~appに限り~access可能な内容/
当の~appを走らせている~host/
~networkにおける当の~appの所在
◎
Share targets that dereference a shared URL and forward that information on might inadvertently forward information that might be otherwise confidential. This can lead to unexpected information leakage if shares reference content that is only accessible by that application, the host on which it runs, or its network location.
悪意的な~siteは、
最終的に局所~資源に解決される~URLを供することにより,
情報を漏洩する共有n~targetを悪用するかもしれない
— 例として[
"`file:^sc" ~URL, 他では~access不能かもしれない局所~service
]が挙げられるが,それらに限られない。
この~APIは,共有される~URL【!URLS】を`共有-可能な~scheme$に制限するが、[
他の~URLへの~redirectが利用される/
~URL内の~host用の~DNS~recordが弄られる
]ことにより,~appに内容を獲得させられるかもしれない。
◎
Malicious sites might exploit share targets that leak information by providing URLs that ultimately resolve to local resources, including, but not limited to, "file:" URLs or local services that might otherwise be inaccessible. Even though this API limits shared URLS to a restricted set of sharable schemes, use of redirects to other URLs or tweaks to DNS records for hosts in those URLs might be used to cause applications to acquire content.
これらの攻撃に利用されるのを避けるため、
共有n~targetは,[
~URLを消費して,内容を検索取得して,その情報を処理した結果
]を共有しないこともできる。
一例として、
ある写真~編集用~appは, `it^en 【?】と “共有された” 画像を検索取得するかもしれない。
共有n~targetはまた、
参照された内容をまったく~fetchすることなく,~URLを共有できる。
◎
To avoid being used in these attacks, share targets can consume the URL, retrieve the content, and process that information without sharing it. For instance, a photo editing application might retrieve an image that is "shared" with it. A share target can also share the URL without fetching any of the referenced content.
共有n~targetが[
~previewを提供する目的で/内容を共有するために
]内容を~fetchする場合、
情報~漏洩eの~riskがある。
内容は、
利用者により[
~previewされ,承認された
]場合には,回送しても安全かもしれない
— しかしながら,[
ある個人にとって,情報が機密的かどうか識別すること
]は常にアリとは限らないので、
内容を回送することには~riskがある。
特に, `title$mb は、
攻撃者により[
内容の資質を利用者が誤解釈するよう騙す
]ために利用されるかもしれない
( `§ ~accessibilityの考慮点@#a11y$も見よ)。
◎
Share targets that fetch content for the purposes of offering a preview or for sharing content risk information leakage. Content that is previewed and authorized by a user might be safe to forward, however it is not always possible for a person to identify when information should be confidential, so forwarding any content presents a risk. In particular, the title might be used by an attacker to trick a user into misinterpreting the nature of the content (see also 5. Accessibility considerations).
他の `DOMException$I の利用【!利用者】と同じく、
実装者は,[
`share()$m が却下されるとき,
~error~message内に情報として何が露呈されるか
]を注意深く考慮する必要がある。
[
可用な`共有n~target$が無い事例, 利用者が取消した事例
]が判別されるようにしただけでも、[
利用者の機器に どの共有n~targetが~installされたか
]についての情報が露呈され得る。
◎
As with any user of DOMException, implementors need to carefully consider what information is revealed in the error message when share() is rejected. Even distinguishing between the case where no share targets are available and user cancellation could reveal information about which share targets are installed on the user's device.
`share()@m
~method手続きは:
◎
-
%大域~obj ~LET コレに`関連な大域~obj$
◎
Let global be this's relevant global object.
-
%文書 ~LET %大域~obj に`結付けられた文書$
◎
Let document be global's associated Document.
-
~IF[
%文書 は`全部的に作動中$でない
]
⇒
~RET `却下される~promise$( `InvalidStateError$E 例外 )
◎
If document is not fully active, return a promise rejected with an "InvalidStateError" DOMException.
-
~IF[
%文書 には `web-share$l の`利用は許容されて$いない
]
⇒
~RET `却下される~promise$( `NotAllowedError$E 例外 )
◎
If document is not allowed to use "web-share", return a promise rejected with a "NotAllowedError" DOMException.
-
~IF[
コレ.`sharePromise$sl ~NEQ ~NULL
]
⇒
~RET `却下される~promise$( `InvalidStateError$E 例外 )
◎
If this.[[sharePromise]] is not null, return a promise rejected with an "InvalidStateError" DOMException.
-
~IF[
%大域~obj は`一過な作動化を有して$いない
]
⇒
~RET `却下される~promise$( `NotAllowedError$E 例外 )
◎
If global does not have transient activation, return a promise rejected with a "NotAllowedError" DOMException.
-
%大域~obj の`利用者-作動化を消費する$
◎
Consume user activation of global.
-
%基底 ~LET コレに`関連な設定群~obj$の`~API用~基底~URL$enV
◎
Let base be this's relevant settings object's API base URL.
-
~IF[
`共有n~dataを検証する$( %~data, %基底 ) ~EQ ~F
]
⇒
~RET `却下される~promise$( `TypeError$E 例外 )
◎
If validate share data with data and base returns false, then return a promise rejected with a TypeError.
-
%url ~LET %~data[ "`url$mb" ]
◎
↓
-
~IF[
%url ~NEQ ε
]:
◎
If data's url member is present:
-
%~URL ~LET `~URL構文解析する$( %url, %基底 )
◎
Let url be the result of running the URL parser on data's url with base.
-
~Assert:
%~URL ~NEQ `失敗^i 【!`URL$I である】
◎
Assert: url is URL.
-
%~data ~SET %~data の複製
◎
Set data to a copy of data,\
-
%~data[ "`url$mb" ] ~SET `~URLを直列化する$( %~URL )
◎
with its url member set to the result of running the URL serializer on url.
-
%files ~LET %~data[ "`files$mb" ]
◎
↓
-
~IF[
【%files ~NEQ ε】
]~AND[
【 %files を成す】ある~fileの型は、
~securityの考慮点に因り阻止されている
]
⇒
~RET `却下される~promise$( `NotAllowedError$E 例外 )
◎
If a file type is being blocked due to security considerations, return a promise rejected with a "NotAllowedError" DOMException.
-
%~promise ~SET `新たな~promise$
◎
↓
-
コレ.`sharePromise$sl ~SET %~promise
【
この段は、
以下で並列的に遂行される手続きが完了する前に,この~methodが~callされ再び遂行されるのを防止する。
】
◎
Set this.[[sharePromise]] to be a new promise.
-
この段は`並列的$に遂行する:
◎
Return this.[[sharePromise]] and in parallel:
-
~IF[
可用な`共有n~target$は無い
]:
◎
If there are no share targets available,\
-
`大域~taskを~queueする$( `利用者~対話~task~source$, %大域~obj, 次の手続き )
◎
queue a global task on the user interaction task source using global to:
手続きは:
◎
-
`~promiseを却下する$( %~promise, `AbortError$E 例外 )
◎
Reject this.[[sharePromise]] with an "AbortError" DOMException.
-
コレ.`sharePromise$sl ~SET ~NULL
◎
Set this.[[sharePromise]] to null.
-
~RET
◎
Terminate this algorithm.
-
[
`共有n~target$たち,
この演算を中止する能
]を伴う~UIを利用者に呈示して、
利用者が何か選ぶまで待機する。
この~UIは、[
~web~siteが~dataを~native~appへ黙って送信し得ない
]ことを確保するための,~security用の確認として~serveする。
~UAは、[
~OS~levelの~UIがこの機能性を供さない場合
]には[
共有される内容を利用者が検証yできるようにする中間的な~UI
]を示すベキである。
◎
Present the user with a choice of one more share targets and the ability abort the operation. This UI surface serves as a security confirmation, ensuring that websites cannot silently send data to native applications. The user agent SHOULD show intermediary UI through which the user can verify the shared content (if the OS-level UI does not provide this functionality).
◎
Wait for the user's choice.
-
~IF[
利用者は共有n演算を中止することを選んだ
]:
◎
If the user chose to abort the share operation,\
-
`大域~taskを~queueする$( `利用者~対話~task~source$, %大域~obj, 次の手続き )
◎
queue a global task on the user interaction task source using global to:
手続きは:
◎
-
`~promiseを却下する$( %~promise, `AbortError$E 例外 )
◎
Reject this.[[sharePromise]] with an "AbortError" DOMException,
-
コレ.`sharePromise$sl ~SET ~NULL
◎
Set this.[[sharePromise]] to null.
-
~RET
◎
Terminate this algorithm.
-
%~target ~LET 選ばれた`共有n~target$
◎
↓
-
%~target を作動化して,
%~data を %~target が`摂取するに相応しい形式に変換する$
— その結果を %~target へ伝送する
◎
Activate the chosen share target, convert data to a format suitable for ingestion into the target, and transmit the converted data to the target.
[
%~target を開始するとき/当の~dataを伝送するとき
]に~errorが生じたときは
]:
◎
If an error occurs starting the target or transmitting the data,\
-
`大域~taskを~queueする$( `利用者~対話~task~source$, %大域~obj, 次の手続き )
◎
queue a global task on the user interaction task source using global to:
手続きは:
◎
-
`~promiseを却下する$( %~promise, `DataError$E 例外 )
◎
Reject this.[[sharePromise]] with an "DataError" DOMException.
-
コレ.`sharePromise$sl ~SET ~NULL
◎
Set this.[[sharePromise]] to null.
-
~RET
◎
Terminate this algorithm.
-
当の~dataが %~target
— あるいは、
%~target への伝送を確認できない場合は~OS —
へ成功裡に伝送されたときは
]
⇒
`大域~taskを~queueする$( `利用者~対話~task~source$, %大域~obj, 次の手続き )
◎
Once the data has either been successfully transmitted to the share target, or successfully transmitted to the OS (if the transmission to the share target cannot be confirmed), queue a global task on the user interaction task source using global to:
注記:
%~target に~payloadを与えた時点で、
当の共有nは,成功裡と見なされる。
それ【どれ?(~UA?作者?)】は、[
%~target が~dataを受容-可能でないと見なした場合は,上品に回復できる/
~errorが生じた場合は,末端-利用者に~error~messageを示せる
]
— それは、
送信者が~errorを取扱うことには依拠し得ない。
言い換えれば、
`share()$m ~methodは “発火したなら忘れる”
— すなわち、
~targetが~payloadを[
認可する/却下する
]まで待機することはない。
◎
Note
Once a share target has been given the payload, the share is considered successful. If the target considers the data unacceptable or an error occurs, it can either recover gracefully, or show an error message to the end-user; it cannot rely on the sender to handle errors. In other words, the share() method is "fire and forget"; it does not wait for the target to approve or reject the payload.
手続きは:
◎
-
`~promiseを解決する$( %~promise )
◎
Resolve this.[[sharePromise]] with undefined.
-
コレ.`sharePromise$sl ~SET ~NULL
◎
Set this.[[sharePromise]] to null.
-
~RET %~promise
◎
↑↑
2.1.3. `canShare(data)^m ~method
`canShare(data)@m
~method手続きは:
◎
When the canShare() method is called with argument ShareData data, run the following steps:
-
%文書 ~LET コレに`関連な大域~obj$に`結付けられた文書$
◎
Let document be the this's relevant global object's associated Document.
-
~IF[
%文書 は`全部的に作動中$でない
]
⇒
~RET ~F
◎
If document is not fully active, return false.
-
~IF[
%文書 には `web-share$l の`利用は許容されて$いない
]
⇒
~RET ~F
◎
If document is not allowed to use "web-share", return false.
-
~RET `共有n~dataを検証する$( %~data, コレに`関連な設定群~obj$の`~API用~基底~URL$enV )
◎
Return the result of validate share data with data and this's relevant settings object's API base URL.
注記( `canShare()^m は未来~互換でない):
◎
Note: canShare() is not future compatible
この~method【!canShare() method of the Web Share API】は、[
`ShareData^I 辞書~内に定義されてない~memberを包含する~obj
]と伴に利用された場合に,
~F を返すべき所で ~T を返し得る。
~browserは,
~Web~IDLに則って,入力~objから未知な~memberを落とすので、
それらの~memberは~testされない。
この挙動は、
未来~互換でない。
◎
The canShare() method of the Web Share API may return false positive results when used with objects that contain members not defined in the ShareData dictionary. Because of how WebIDL works, browsers drop unknown members from the input object and will return true when testing the remaining members. This behavior is not future-compatible.
開発者は,共有n能を依拠-可能に~testすることを確保するためには、
入力~objを `ShareData$I 辞書~用に定義された~memberのみを利用して構築して、
追加的な~memberは,個別に~testするよう別な入力~objとして構築するべきである。
◎
To ensure reliable testing of shareability, developers can construct the input object using only members defined in the ShareData dictionary. If an object contains additional members, it should be destructured to only test the defined members individually.
これは,今日の どの実装にも影響しないが、
当~WGは,仕様の将来の改訂において この課題に向けて取組むよう作業することになる
— とりわけ、
`ShareData$I 辞書に対し何らかの改正を為した場合に。
この課題に取組む方法に関して案があるなら、
`課題 #108@https://github.com/w3c/web-share/issues/108$
を見よ。
◎
Although this doesn't affect any implementations today, the Working Group will work towards addressing this issue in a future revision of the specification - especially if we make any amendments to the ShareData dictionary. To contribute ideas for how to address this issue, see issue #108 on GitHub.
2.1.4. 共有n~dataを検証する
次に挙げる`~scheme$urlが
`共有-可能な~scheme@
であるとされる:
◎
A sharable scheme is any of the following URL schemes:
-
`http^sc
◎
http
-
`https^sc
◎
https
-
`安全とされる~scheme$のうち,~UAが共有の目的で~supportするもの
◎
Any safelisted scheme that the user agent supports for the purpose of sharing.
`共有n~dataを検証する@
ときは、
所与の
( %~data, %基底 )
に対し,
次の手続きを走らす:
◎
To validate share data with data and base, run the following steps:
-
%title ~LET %~data[ "`title$mb" ]
◎
↓
-
%text ~LET %~data[ "`text$mb" ]
◎
↓
-
%url ~LET %~data[ "`url$mb" ]
◎
↓
-
%files ~LET %~data[ "`files$mb" ]
◎
↓
-
~IF[
%title ~EQ ε
]~AND[
%text ~EQ ε
]~AND[
%url ~EQ ε
]
⇒
~IF[
%files ~EQ ε
]~OR[
%files は空である
]
⇒
~RET ~F
注記:
この段は、
%~data として `{ files: [] }^c が渡された場合に,
空な辞書と同じに扱うようにする。
`{text: "text", files: []}^c の様な辞書が渡された場合、
`files$mb は,無視されるだけになる。
◎
If none of data's members title, text, or url or files are present, return false.
◎
Let titleTextOrUrl be true if any of title, or text, or url is present.
◎
If data's files member is present:
• If titleTextOrUrl is false and data's files member is empty, return false.
◎
• Note
• This causes a { files: [] } dictionary to be treated as an empty dictionary. However, passing a dictionary like {text: "text", files: []} is fine, as files is just ignored.
-
~IF[
%files ~NEQ ε
]:
◎
↑
-
~IF[
実装は、
~file共有を~supportしない
]
⇒
~RET ~F
◎
If the implementation does not support file sharing, return false.
-
~IF[
~UAは、
%files を成す ある~fileを共有すると敵対的な共有nになり得ると予見する
(すなわち、
~fileの特性
— 内容, ~sizeなど —
が何らかの仕方で悪意的であるものと決定した)
]
⇒
~RET ~F
◎
If the user agent believes sharing any of the files in files would result in a potentially hostile share (i.e., the user agent determines a file is malicious in some way, because of its contents, size, or other characteristic), return false.
-
~IF[
%url ~NEQ ε
]:
◎
If data's url member is present:
-
%~URL ~LET `~URL構文解析する$( %url, %基底 )
◎
Let url be the result of running the URL parser on data's url member, with base, and no encoding override.
-
~IF[
%~URL ~EQ `失敗^i
]
⇒
~RET ~F
◎
If url is failure, return false.
-
~IF [
%~URL の`~scheme$urlは ~OR↓ を満たす
]…
-
`局所~scheme$である
-
次に挙げるいずれかである
⇒#
`file^sc,
`javascript^sc,
`ws^sc,
`wss^sc
-
`共有-可能な~scheme$でない
…ならば
⇒
~RET ~F
【
1, 2 個目の条件は、
実質的には不要
— そこに挙げられた~schemeは、
`共有-可能な~scheme$でないので。
】
◎
If the url's scheme is a local scheme, or file, or javascript, or ws, or wss, return false.
◎
If url's scheme is not a sharable scheme, return false.
-
~RET ~T
◎
Return true.
2.2. `ShareData^I 辞書
dictionary `ShareData@I {
`sequence$<`File$I> `files$mb;
`USVString$ `title$mb;
`USVString$ `text$mb;
`USVString$ `url$mb;
};
`ShareData$I 辞書は、
次に挙げる省略可能な~memberからなる:
◎
The ShareData dictionary consists of several optional members:
-
`files@mb
⇒
共有されることになる~fileたち。
◎
files member
• Files to be shared.
-
`text@mb
⇒
共有されている~messageの本体を形成する任意な~text。
◎
text member
• Arbitrary text that forms the body of the message being shared.
-
`title@mb
⇒
共有されている文書の~title
— ~targetにより無視され得る。
◎
title member
• The title of the document being shared. May be ignored by the target.
-
`url@mb
⇒
共有されている資源を指している~URL文字列。
◎
url member
• A URL string referring to a resource being shared.
注記:
これらの~memberが,
( `DOMString^c ではなく) `USVString^c をとるのは、
`~surrogate$を包含することは許容されないからである。
このことは特に、
~UAは,[
~dataの変化(欠損や置換~文字の生成など)を伴わずに,
~Unicode符号化法(`~UTF-8$など)に直列化できる
]ことを意味する。
◎
Note
These members are USVString (as opposed to DOMString) because they are not allowed to contain surrogate code points. Among other things, this means that the user agent can serialize them into any Unicode encoding, such as UTF-8, without change or loss of data or the generation of replacement characters.
3. 共有n~target
`共有n~target@
は、[
~UAが共有n~dataを伝送する行先
]を成す抽象-概念である。
共有n~targetが何からなるかは、
~UAの裁量に委ねられる。
◎
A share target is the abstract concept of a destination that the user agent will transmit the share data to. What constitutes a share target is at the discretion of the user agent.
`共有n~target$は、
`ShareData$I を直に受容-可能でないかもしれない
(例:この~APIを念頭に書かれていないことに因り)。
しかしながら,[
`ShareData$I にて公開される概念のうち,少なくとも一部には合致する~data
]を受信する能を備えるモノトスル。
~UAは,~dataを~targetが
`摂取するに相応しい形式に変換する@
ときは、[
`ShareData$I を成す各~memberを~targetにおける等価な概念に対応付ける
]ベキであり,必要yなら[
~memberを破棄しても結合しても
]ヨイ。
伝送される~payloadを成す各~memberの意味は、
共有n~targetの裁量に委ねられる。
◎
A share target might not be directly able to accept a ShareData (due to not having been written with this API in mind). However, it MUST have the ability to receive data that matches some or all of the concepts exposed in ShareData. To convert data to a format suitable for ingestion into the target, the user agent SHOULD map the members of ShareData onto equivalent concepts in the target. It MAY discard or combine members if necessary. The meaning of each member of the payload is at the discretion of the share target.
注記:
`ShareData$I を[
共有n~target (または~OS)に~nativeな形式
]へ対応付けることは、
込み入ったものにもなり得る
— 一部の~platformは、
~memberたちと等価な集合を有さないので。
例えば,当の~targetは "text" ~memberを有するが "URL" ~memberは有さない場合
(該当する事例として Android がある)、
解決策として,
`ShareData$I の[
`text$mb, `url$mb
]両~memberを連結した結果を~targetの "text" ~memberに渡すことが挙げられる。
◎
Note
Mapping the ShareData to the share target's (or operating system's) native format can be tricky as some platforms will not have an equivalent set of members. For example, if the target has a "text" member but not a "URL" member (as is the case on Android), one solution is to concatenate both the text and url members of ShareData and pass the result in the "text" member of the target.
~UAは、
各~共有n~targetに対し,[
`share()$m ~methodに送達された `ShareData$I ~payload
]に依存して条件付きで可用にしてもヨイ。
【例:共有n~target用の形式に対応付けれる~dataが含まれていない場合は可用にしないなど。】
◎
Each share target MAY be made conditionally available depending on the ShareData payload delivered to the share() method.
3.1. 共有n~targetの例
◎非規範的
共有n~targetたちが成す~listは、
様々な~sourceから拡充され得る
— それらは、
~UAや~host~OSに依存する。
例えば:
◎
The list of share targets can be populated from a variety of sources, depending on the user agent and host operating system. For example:
-
組込みの~service
(例: ~clipboardへ “~copyする” )
◎
Built-in service (e.g., "copy to clipboard").
-
~host~OS用に書かれた~nativeな~app
◎
Native applications written for the host operating system.
-
連絡先
(例:~UAは、
特定の~appを利用して,
利用者の~address帳~内のある個人を直に共有する)。
◎
Contacts (e.g., the user agent directly shares to a person from the user's address book, using a specific app).
-
~web~site
(例:~UAは、
ある~template~URLを `ShareData$I を成す~memberたちで埋めて,
新たな閲覧~文脈~内でその~URLへ~navigateする)。
◎
Websites (e.g., the user agent fills in a template URL with the members of the ShareData, then navigates to that URL in a new browsing context).
注記:
上に挙げた最後の利用事例~用には、
共有n~dataの受信-先になる~web~siteの登録を標準~化する試みがある
— `~Web共有n~target@https://github.com/w3c/web-share-target$cite
( `Web Share Target^en )
を見よ。
◎
Note
There is an attempt to standardize the registration of websites to receive share data for that final use case; see Web Share Target.
一部の事例では、
~host~OSが, `~Web共有n^cite に類似な[
共有/意図
]~systemを供する。
そのような事例では、
~UAは,単純に
— すなわち,~native~appとは直にやりとりしないで —
~OSへ共有n~dataを回送できる。
◎
In some cases, the host operating system will provide a sharing or intent system similar to Web Share. In these cases, the user agent can simply forward the share data to the operating system and not talk directly to native applications.
4. 許可~施策との統合
この仕様は、
文字列
`web-share@l
で識別される`施策により制御される特能$【!policy-controlled permission】を定義する。
その`既定の許容list$は、
`'self'$l
とする
(すなわち、
第三者-主体~文脈においては,既定では この~APIの`利用は許容され$ない)。
◎
This specification defines a policy-controlled permission identified by the string "web-share". Its default allowlist is 'self', which means third-party contexts are not allowed to use the API by default.
~UAが `許可~施策$cite の `Permissions-Policy$h ~HTTP~headerを~supportするかどうかは、
任意選択である。
◎
It is OPTIONAL for user agents to support Permissions Policy's Permissions-Policy HTTP header.
開発者は、
`許可~施策$cite 仕様に用意された手段を利用して,
第三者-主体~文脈において[
この~APIの`利用は許容され$るかどうか,いつ許容されるか
]を制御できる。
◎
Developers can use the means afforded by the Permissions Policy specification to control if and when a third-party context is allowed to use this API.
注記
( `許可~施策$cite の実装~状態s):
◎
Note: Permissions Policy Implementation Status
各~UAは,一致して[
第三者-主体~文脈において `~Web共有n^cite ~APIが利用されること
]を防止しているが、
この仕様を公表した時点では,[
`許可~施策$cite に依拠して,第三者-主体~文脈において~APIを可能化すること
]に関して相互運用能の課題がある。
特に、
`allow$a 属性は広く~supportされているが,
それ用に更新された構文はまだである。
類似に、
`Permissions-Policy$h ~headerは,
まだ広く~supportされていない。
開発者には、[
`許可~施策$cite に依拠して,
第三者-主体~文脈において `~Web共有n^cite ~APIを可能化する
]前に[
`許可~施策$cite 仕様の実装~状態sを検査する
]ことを勧める。
◎
Although user agents are unified in preventing the Web Share API from being used in third-party context, at the time of publication there are interoperability issues with relying on the Permissions Policy to enable the API in third-party contexts. In particular, although theallow attribute is widely supported, the updated syntax for the allow attribute is not. Similarly, the Permissions-Policy: HTTP header is not yet widely supported. Developers are advised to check the implementation status of the Permissions Policy specification before relying on it to enable the Web Share API in third-party contexts.
`Permissions-Policy$h ~headerが,もっと広く~supportされるようになったときは、
当~WGは,この~header用の~supportを要求するよう この仕様を改訂するものと期待される。
◎
When the Permissions-Policy HTTP header is more widely supported, the Working Group expects to revise this specification to require support for the header.
5. ~accessibilityの考慮点
◎非規範的
この仕様が~UI内に情報を呈示するために利用されるときは、
実装者は[
当の~platform用の~OS~levelの~accessibility指針
]に従うことが求まれる。
さらには、
共有は
— `share()$m ~methodの一部にて要旨されたとおり —
末端-利用者にとって潜在的な~securityの含意を伴い得るので、
共有n~UIは
— 当の~platformの~UI用の~security指針も考慮に入れながら —
~access可能な方式で呈示される必要がある。
~~主要な考慮点として,次が挙げられる:
◎
When this specification is used to present information in the user interface, implementors will want to follow the OS level accessibility guidelines for the platform. Further, as sharing can have potential security implications for end-users, as outlined as part of the share() method, the share UI needs to be presented in an accessible manner, while also taking into consideration a platform's security guidelines for user interfaces. Some key considerations are to:
-
画像など,~textな内容でない内容~用には、
代替~textを供すること
— 視覚的に障害有りな利用者が共有される内容の[
型/資質
]を理解できることを確保するため。
◎
Provide alternative text for images and other non-textual content to ensure that users who are visually impaired can understand the type and/or nature of the content being shared.
-
利用者が[
~keyboardのみによる制御を利用して,
~previewされる内容の各所へ~navigateできる
]ことを確保することに加え、
その~keyboard~focusを明瞭に可視にすること。
◎
Ensure that users can navigate through the previewed content using keyboard-only controls, and that the keyboard focus is clearly visible.
-
~previewされる内容が[
支援技術を利用している利用者からも理解できる
]ことを確保するため,[
見出しや~labelを利用して,適正に構造化される
]ようにすること。
◎
Use headings and labels to ensure that the previewed content is properly structured and can be understood by users using assistive technology.
-
色~contrastや~font~sizeに不足がないことを確保すること。
共有n~UI内で利用する[
~font, ~icon, 画像
]は、[
広く認識され,容易に理解されるもの
]にすること。
◎
Ensure sufficient color contrast and font size, and use fonts, icons, and images that are widely recognised and easily understood, in the share UI.
これらを組み合わせれば、
様々な視覚運動認知~障害を抱える利用者が[
~web~pageにより共有される内容の資質
]をより良く理解する助けになり得る。
◎
Together, these elements can help users with a range of visual, motor or cognitive disabilities to better understand the nature of the content being shared by a web page.
6. ~privacyの考慮点
-
設計により、
~web~siteは,この~APIを利用しても[
どの`共有n~target$が可用か/
利用者は `share()$m から どの共有n~targetを選んだか
]を学習し得ない。
このことは、[
指紋収集~用にも利用され得る情報/
利用者の機器や利用者が選好した共有n~targetについて詳細
]が漏洩することを防止する。
◎
By design, the API cannot be used by a website to learn which share targets are available, or which share target the user chose from share(). This is to prevent leaking information that could be used for fingerprinting, as well as leaking details about the user's device or user's preferred share targets.
-
`私的~閲覧~mode@https://en.wikipedia.org/wiki/Privacy_mode$からの `share()$m の利用は、
私的~dataを[
利用者の~privacy設定を尊重しない第三者-主体~app
]へ漏洩するかもしれない。
~UAは、
私的~閲覧~modeにおいては[
追加的な警告を呈示することもできる/
当の特能をまるごと不能化してもヨイ
]が,これは義務付けられてはいない
— 選択用~UIが,それに足る警告を成すとも見なせるので。
◎
Use of share() from a private browsing mode might leak private data to a third-party application that does not respect the user's privacy setting. User agents could present additional warnings or MAY disable the feature entirely when in a private browsing mode, but this is not mandated as the chooser UI could be considered sufficient warning.
9. 変更~log
◎非規範的
変更点を成す完全な~listは、
`~commit~log@https://github.com/w3c/web-share/commits/main$
を見られたし。
◎
↓
【
以下に挙げられる変更点は、
~commitの~titleそのものなので,訳さないことにする。
】
`勧告候補@~TR/2022/PR-web-share-20221215/$からの規範的な変更点:
◎
The following normative changes were made to the specification during the Proposed Recommendation phase.\
↑ Please see the commit log for a complete list of changes.
-
Make Permissions-Policy HTTP header OPTIONAL (`d0ea0fe$commit, `275$pull)
`最初の公な作業草案@~TR/2019/WD-web-share-20191217/$として公表されてから勧告候補までの規範的な変更点:
◎
The following normative changes were made to the specification since it was published as a First Public Working Draft to Candidate Recommendation.
\
↑ Please see the commit log for a complete list of changes.
- Move Priv/Sec into spec (`238ff25$commit, `245$pull)
- Define sharable scheme + check (`d3890d1$commit, `244$pull)
- Handle non-fully-active documents (`94e7883$commit, `219$pull)
- Add canShare() method (`68494b7$commit, `177$pull)
- Add "validate share data" algorithm (`230ec6a$commit, `185$pull)
- Resolve promise after OS hand-off (`52437a5$commit, `209$pull)
- Check transient activation after sharePromise (`151b35e$commit, `183$pull)
- Reject non-http URLs for url member (`9322cbe$commit, `174$pull)
- Use a sequence for files (`aeb208c$commit, `170$pull)
- Introduce "web-share" feature policy (`2ef967a$commit, `166$pull)
- BREAKING CHANGE: make share() consume user activation (`f62dc29$commit, `137$pull)
- Add the ability to share files (`f615649$commit, `133$pull)
- Accessibility considerations (`5f837a9$commit, `146$pull)
謝辞
次に挙げる~W3C~groupの方々は、
この仕様を大きく改善した貴重な~feedbackを寄せていただいた
⇒#
`Accessible Platform Architectures Working Group@https://www.w3.org/WAI/APA/$en,
`Internationalization Working Group@https://www.w3.org/International/i18n-activity/i18n-wg/$en,
`Privacy Interest Group@https://www.w3.org/Privacy/IG/$en,
`Technical Architecture Group@https://tag.w3.org$en
◎
The editors would like to thank the following W3C groups for their invaluable feedback, which greatly improved this specification: Accessible Platform Architectures Working Group, the Internationalization Working Group, the Privacy Interest Group, and the Technical Architecture Group.
`Web Intents@~TR/web-intents$en の方々は、
~web~app 相互運用能 利用事例 用に下地作業を行っていただいた。
特に `Paul Kinlan@https://paul.kinlan.me/$en 氏は、
早期から, `~Web共有n^cite 用にたくさんの `advocacy^en を行っていただいた。
◎
Thanks to the Web Intents team, who laid the groundwork for the web app interoperability use cases. In particular, Paul Kinlan, who did a lot of early advocacy for Web Share.