diff --git a/files/ja/_redirects.txt b/files/ja/_redirects.txt index 426861d6f6d8f7..cf2dfe5d4a7321 100644 --- a/files/ja/_redirects.txt +++ b/files/ja/_redirects.txt @@ -3180,9 +3180,7 @@ /ja/docs/Web/API/CSSStyleSheet.insertRule /ja/docs/Web/API/CSSStyleSheet/insertRule /ja/docs/Web/API/CSS_Painting_API/ガイド /ja/docs/Web/API/CSS_Painting_API/Guide /ja/docs/Web/API/CSS_Typed_Object_Model_API /ja/docs/Web/API/CSS_Object_Model#CSS_Typed_Object_Model -/ja/docs/Web/API/CanvasRenderingContext2D.clearHitRegions /ja/docs/Web/API/CanvasRenderingContext2D/clearHitRegions /ja/docs/Web/API/CanvasRenderingContext2D.drawFocusIfNeeded /ja/docs/Web/API/CanvasRenderingContext2D/drawFocusIfNeeded -/ja/docs/Web/API/CanvasRenderingContext2D.removeHitRegion /ja/docs/Web/API/CanvasRenderingContext2D/removeHitRegion /ja/docs/Web/API/Canvas_API/Drawing_graphics_with_canvas /ja/docs/Web/API/Canvas_API/Tutorial /ja/docs/Web/API/CloseEvent/initCloseEvent /ja/docs/conflicting/Web/API/CloseEvent /ja/docs/Web/API/Console.error /ja/docs/Web/API/Console/error diff --git a/files/ja/web/api/animationevent/elapsedtime/index.html b/files/ja/web/api/animationevent/elapsedtime/index.html deleted file mode 100644 index 397c8652e8b9aa..00000000000000 --- a/files/ja/web/api/animationevent/elapsedtime/index.html +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: AnimationEvent.elapsedTime -slug: Web/API/AnimationEvent/elapsedTime -tags: - - API - - AnimationEvent - - CSSOM - - Experimental - - Property - - Reference - - Web Animations - - プロパティ -translation_of: Web/API/AnimationEvent/elapsedTime ---- -
AnimationEvent.elapsedTime
は読み取り専用のプロパティで、アニメーションが開始されてからの秒数を float
型で表します。このイベントが発生したとき、アニメーションが停止した場合を除いて常に設定されます。 {{domxref("HTMLElement/animationstart_event", "animationstart")}} イベントにおいては elapsedTime
は 0.0
になりますが、 {{cssxref("animation-delay")}} が負の値の場合は、このイベントは elapsedTime
が (-1 *
待ち時間)
であるときに発生します。.
time = AnimationEvent.elapsedTime- -
仕様書 | -状態 | -備考 | -
---|---|---|
{{ SpecName('CSS3 Animations', '#dom-animationevent-elapsedtime', 'AnimationEvent.elapsedTime') }} | -{{ Spec2('CSS3 Animations')}} | -初回定義 | -
{{Compat("api.AnimationEvent.elapsedTime")}}
- -AnimationEvent
インターフェイスは、アニメーションに関する情報を提供するイベントを表します。
{{InheritanceDiagram}}
- -AnimationEvent
イベントを生成します。親の {{domxref("Event")}} から継承されるプロパティもあります。
- -float
値で、アニメーションが実行された時間の長さを秒単位で表し、イベントが発生したときは、アニメーションが停止していた時間は除外されます。 animationstart
イベントでは、 elapsedTime
は、ふつう 0.0
となりますが、 {{cssxref("animation-delay")}} が負の値であった場合は例外で、この場合はイベントは elapsedTime
に (-1 * delay)
が入った状態でイベントが発生します。'::'
で始まり、アニメーションが実行される 疑似要素 の名前が入ります。このアニメーションが疑似要素ではなく要素で実行されている場合は、空文字列 ''
になります。親の {{domxref("Event")}} から継承されるメソッドもあります。
- -AnimationEvent
を初期化します。仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName("CSS3 Animations", "#interface-animationevent", "AnimationEvent")}} | -{{Spec2("CSS3 Animations")}} | -初回定義 | -
{{Compat("api.AnimationEvent")}}
- -ByteLengthQueuingStrategy()
コンストラクターは、ByteLengthQueuingStrategy
オブジェクトのインスタンスを作成して返します。
var byteLengthQueuingStrategy = new ByteLengthQueuingStrategy({highWaterMark});- -
highWaterMark
プロパティを含むオブジェクト。 これは、バックプレッシャーが適用される前に内部キューに含めることができるチャンクの総数を定義する負でない整数です。{{domxref("ByteLengthQueuingStrategy")}} オブジェクトのインスタンス。
- -なし。
- -const queuingStrategy = new ByteLengthQueuingStrategy({ highWaterMark: 1 });
-
-const readableStream = new ReadableStream({
- start(controller) {
- ...
- },
- pull(controller) {
- ...
- },
- cancel(err) {
- console.log("stream error:", err);
- }
-}, queuingStrategy);
-
-var size = queuingStrategy.size(chunk)
;
-
-仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName("Streams","#blqs-constructor","ByteLengthQueuingStrategy()")}} | -{{Spec2('Streams')}} | -初期定義 | -
{{Compat("api.ByteLengthQueuingStrategy.ByteLengthQueuingStrategy")}}
diff --git a/files/ja/web/api/bytelengthqueuingstrategy/bytelengthqueuingstrategy/index.md b/files/ja/web/api/bytelengthqueuingstrategy/bytelengthqueuingstrategy/index.md new file mode 100644 index 00000000000000..e8d33958715111 --- /dev/null +++ b/files/ja/web/api/bytelengthqueuingstrategy/bytelengthqueuingstrategy/index.md @@ -0,0 +1,64 @@ +--- +title: ByteLengthQueuingStrategy.ByteLengthQueuingStrategy() +slug: Web/API/ByteLengthQueuingStrategy/ByteLengthQueuingStrategy +tags: + - API + - ByteLengthQueuingStrategy + - Constructor + - Experimental + - Reference + - Streams +translation_of: Web/API/ByteLengthQueuingStrategy/ByteLengthQueuingStrategy +--- +{{SeeCompatTable}}{{APIRef("Streams")}} + +**`ByteLengthQueuingStrategy()`** コンストラクターは、`ByteLengthQueuingStrategy` オブジェクトのインスタンスを作成して返します。 + +## 構文 + +``` +var byteLengthQueuingStrategy = new ByteLengthQueuingStrategy({highWaterMark}); +``` + +### パラメーター + +- {highWaterMark} + - : `highWaterMark` プロパティを含むオブジェクト。 これは、バックプレッシャーが適用される前に内部キューに含めることができるチャンクの総数を定義する負でない整数です。 + +### 戻り値 + +{{domxref("ByteLengthQueuingStrategy")}} オブジェクトのインスタンス。 + +### 例外 + +なし。 + +## 例 + +```js +const queuingStrategy = new ByteLengthQueuingStrategy({ highWaterMark: 1 }); + +const readableStream = new ReadableStream({ + start(controller) { + ... + }, + pull(controller) { + ... + }, + cancel(err) { + console.log("stream error:", err); + } +}, queuingStrategy); + +var size = queuingStrategy.size(chunk); +``` + +## 仕様 + +| 仕様 | 状態 | コメント | +| ------------------------------------------------------------------------------------------------ | ---------------------------- | -------- | +| {{SpecName("Streams","#blqs-constructor","ByteLengthQueuingStrategy()")}} | {{Spec2('Streams')}} | 初期定義 | + +## ブラウザーの互換性 + +{{Compat("api.ByteLengthQueuingStrategy.ByteLengthQueuingStrategy")}} diff --git a/files/ja/web/api/bytelengthqueuingstrategy/index.html b/files/ja/web/api/bytelengthqueuingstrategy/index.html deleted file mode 100644 index 317571bb8b5a88..00000000000000 --- a/files/ja/web/api/bytelengthqueuingstrategy/index.html +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: ByteLengthQueuingStrategy -slug: Web/API/ByteLengthQueuingStrategy -tags: - - API - - ByteLengthQueuingStrategy - - Experimental - - Interface - - Reference - - Streams -translation_of: Web/API/ByteLengthQueuingStrategy ---- -{{SeeCompatTable}}{{APIRef("Streams")}}
- -Streams API の ByteLengthQueuingStrategy
インターフェイスは、ストリームを構築するときに使用できる組み込みのバイト長キューイング戦略を提供します。
ByteLengthQueuingStrategy
オブジェクトのインスタンスを作成します。なし。
- -byteLength
プロパティを返します。const queueingStrategy = new ByteLengthQueuingStrategy({ highWaterMark: 1 });
-
-const readableStream = new ReadableStream({
- start(controller) {
- ...
- },
- pull(controller) {
- ...
- },
- cancel(err) {
- console.log("stream error:", err);
- }
-}, queueingStrategy);
-
-var size = queueingStrategy.size(chunk)
;
-
-仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName('Streams','#blqs-class','ByteLengthQueuingStrategy')}} | -{{Spec2('Streams')}} | -初期定義 | -
{{Compat("api.ByteLengthQueuingStrategy")}}
-{{domxref("ByteLengthQueuingStrategy")}} インターフェイスの size()
メソッドは、所与のチャンクの byteLength
プロパティを返します。
var size =
byteLengthQueuingStrategy.size(chunk);
-
-所与のチャンクのバイト長を表す整数。
- -const queuingStrategy = new ByteLengthQueuingStrategy({ highWaterMark: 1 });
-
-const readableStream = new ReadableStream({
- start(controller) {
- ...
- },
- pull(controller) {
- ...
- },
- cancel(err) {
- console.log("stream error:", err);
- }
-}, queuingStrategy);
-
-var size = queueingStrategy.size(chunk)
;
-
-仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName("Streams","#blqs-size","size")}} | -{{Spec2('Streams')}} | -初期定義 | -
{{Compat("api.ByteLengthQueuingStrategy.size")}}
diff --git a/files/ja/web/api/bytelengthqueuingstrategy/size/index.md b/files/ja/web/api/bytelengthqueuingstrategy/size/index.md new file mode 100644 index 00000000000000..6701222fd50b4a --- /dev/null +++ b/files/ja/web/api/bytelengthqueuingstrategy/size/index.md @@ -0,0 +1,61 @@ +--- +title: ByteLengthQueuingStrategy.size() +slug: Web/API/ByteLengthQueuingStrategy/size +tags: + - API + - ByteLengthQueuingStrategy + - Experimental + - Method + - Reference + - Streams + - size +translation_of: Web/API/ByteLengthQueuingStrategy/size +--- +{{SeeCompatTable}}{{APIRef("Streams")}} + +{{domxref("ByteLengthQueuingStrategy")}} インターフェイスの **`size()`** メソッドは、所与のチャンクの `byteLength` プロパティを返します。 + +## 構文 + +``` +var size = byteLengthQueuingStrategy.size(chunk); +``` + +### パラメーター + +- chunk + - : ストリームを通過するデータのチャンク。 + +### 戻り値 + +所与のチャンクのバイト長を表す整数。 + +## 例 + +```js +const queuingStrategy = new ByteLengthQueuingStrategy({ highWaterMark: 1 }); + +const readableStream = new ReadableStream({ + start(controller) { + ... + }, + pull(controller) { + ... + }, + cancel(err) { + console.log("stream error:", err); + } +}, queuingStrategy); + +var size = queueingStrategy.size(chunk); +``` + +## 仕様 + +| 仕様 | 状態 | コメント | +| -------------------------------------------------------- | ---------------------------- | -------- | +| {{SpecName("Streams","#blqs-size","size")}} | {{Spec2('Streams')}} | 初期定義 | + +## ブラウザーの互換性 + +{{Compat("api.ByteLengthQueuingStrategy.size")}} diff --git a/files/ja/web/api/canvascapturemediastreamtrack/index.html b/files/ja/web/api/canvascapturemediastreamtrack/index.html deleted file mode 100644 index 1a09d91f517d63..00000000000000 --- a/files/ja/web/api/canvascapturemediastreamtrack/index.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: CanvasCaptureMediaStreamTrack -slug: Web/API/CanvasCaptureMediaStreamTrack -tags: - - CanvasCaptureMediaStreamTrack - - Experimental - - Frame Capture - - Interface - - Media - - Media Capture - - NeedsTranslation - - Reference - - TopicStub - - Web -translation_of: Web/API/CanvasCaptureMediaStreamTrack ---- -The CanvasCaptureMediaStreamTrack
interface represents the video track contained in a {{domxref("MediaStream")}} being generated from a {{HTMLElement("canvas")}} following a call to {{domxref("HTMLCanvasElement.captureStream()")}}.
Part of the Media Capture and Streams API.
- -This interface inherits the properties of its parent, {{domxref("MediaStreamTrack")}}.
- -This interface inherits the methods of its parent, {{domxref("MediaStreamTrack")}}.
- -frameRate
of 0 when calling {{domxref("HTMLCanvasElement.captureStream", "captureStream()")}}.Specification | -Status | -Comment | -
---|---|---|
{{SpecName('Media Capture DOM Elements', '#the-canvascapturemediastreamtrack', 'CanvasCaptureMediaStreamTrack')}} | -{{Spec2('Media Capture DOM Elements')}} | -Initial definition | -
{{Compat("api.CanvasCaptureMediaStreamTrack")}}
-{{domxref("CanvasCaptureMediaStreamTrack")}} のメソッド requestFrame()
はフレームをキャンバスから取り込んでストリームに送信することを依頼します。描画やフレームの取り込みのタイミングを慎重に制御する必要のあるアプリケーションは、フレームを取り込む時を直接指定するのに requestFrame()
を使用することができます。
フレームの自動取り込みを避け、フレームが requestFrame()
が呼ばれた時だけ取り込まれるようにするには、ストリームを生成する時に {{domxref("HTMLCanvasElement.captureStream", "captureStream()")}} メソッドに 0 の値を指定します。
stream.requestFrame(); -- -
undefined
今のところ、キャンバスのオリジンが明確でなくても例外を投げないことが、仕様でフラグ付けされた問題点です。将来は変わるでしょうが、事前に計画をし SecurityError
のような例外(投げられる特定のエラーが仕様書では言及されていませんが、これが有力な候補です) を監視することが賢明です。
// 取り込むキャンバス要素を探す -var canvasElt = document.getElementsByTagName("canvas")[0]; - -// ストリームを取得する -var stream = canvasElt.captureStream(25); // 25 FPS - -// キャンバスの現在の状態をフレームとしてストリームに送信する -stream.getVideoTracks()[0].requestFrame(); -- -
仕様書 | -ステータス | -コメント | -
---|---|---|
{{SpecName('Media Capture DOM Elements', '#dom-canvascapturemediastreamtrack-requestframe', 'CanvasCaptureMediaStream.requestFrame()')}} | -{{Spec2('Media Capture DOM Elements')}} | -初期定義 | -
{{Compat("api.CanvasCaptureMediaStreamTrack.requestFrame")}}
- -CanvasPattern
インターフェースは、{{domxref("CanvasRenderingContext2D.createPattern()")}} メソッドによって(画像、 canvas 要素、video 要素をもとに)生成される不透明なオブジェクトです。
不透明なオブジェクトを表し、公開されたプロパティはありません。
- -継承されたメソッドはありません。
- -仕様 | -ステータス | -コメント | -
---|---|---|
{{SpecName('HTML WHATWG', "the-canvas-element.html#canvaspattern", "CanvasPattern")}} | -{{Spec2('HTML WHATWG')}} | -v5 で setTransform() メソッドを追加。 |
-
{{Compat("api.CanvasPattern")}}
- -CanvasPattern
.setTransform()
メソッドは、パターンの変換マトリックスとして {{domxref("SVGMatrix")}} オブジェクトを使用し、パターンにこれを実行します。
void pattern.setTransform(matrix); -- -
matrix
setTransform
メソッドを使用するこれは setTransform
メソッドを使用して {{domxref("SVGMatrix")}} によるパターン変形を指定して {{domxref("CanvasPattern")}} を生成する簡単なコードスニペットです。たとえば、パターンが現在の {{domxref("CanvasRenderingContext2D.fillStyle", "fillStyle")}} として適用され、{{domxref("CanvasRenderingContext2D.fillRect", "fillRect()")}} メソッドを使用すると、 canvas に描画されます。
<canvas id="canvas"></canvas> -<svg id="svg1"></svg> -- -
var canvas = document.getElementById("canvas"); -var ctx = canvas.getContext("2d"); - -var svg1 = document.getElementById("svg1"); -var matrix = svg1.createSVGMatrix(); - -var img = new Image(); -img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png'; - -img.onload = function() { - var pattern = ctx.createPattern(img, 'repeat'); - pattern.setTransform(matrix.rotate(-45).scale(1.5)); - ctx.fillStyle = pattern; - ctx.fillRect(0,0,400,400); -}; -- -
以下のコードを編集して、canvas 上での変化を確認してください:
- -<canvas id="canvas" width="400" height="200" class="playable-canvas"></canvas> -<svg id="svg1" style="display:none"></svg> -<div class="playable-buttons"> - <input id="edit" type="button" value="Edit" /> - <input id="reset" type="button" value="Reset" /> -</div> -<textarea id="code" class="playable-code" style="height:120px"> -var img = new Image(); -img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png'; -img.onload = function() { - var pattern = ctx.createPattern(img, 'repeat'); - pattern.setTransform(matrix.rotate(-45).scale(1.5)); - ctx.fillStyle = pattern; - ctx.fillRect(0,0,400,400); -};</textarea> -- -
var canvas = document.getElementById("canvas"); -var ctx = canvas.getContext("2d"); -var textarea = document.getElementById("code"); -var reset = document.getElementById("reset"); -var edit = document.getElementById("edit"); -var code = textarea.value; - -var svg1 = document.getElementById("svg1"); -var matrix = svg1.createSVGMatrix(); - -function drawCanvas() { - ctx.clearRect(0, 0, canvas.width, canvas.height); - eval(textarea.value); -} - -reset.addEventListener("click", function() { - textarea.value = code; - drawCanvas(); -}); - -edit.addEventListener("click", function() { - textarea.focus(); -}) - -textarea.addEventListener("input", drawCanvas); -window.addEventListener("load", drawCanvas); --
{{ EmbedLiveSample('Playable_code', 700, 380) }}
- -仕様 | -ステータス | -コメント | -
---|---|---|
{{SpecName('HTML WHATWG', "scripting.html#dom-canvaspattern-settransform", "CanvasPattern.setTransform")}} | -{{Spec2('HTML WHATWG')}} | -- |
{{Compat("api.CanvasPattern.setTransform")}}
- -Canvas 2D APIのCanvasRenderingContext2D
.clearHitRegions()
メソッドはcanvasからすべてのヒット領域を削除します。
void ctx.clearHitRegions(); -- -
clearHitRegions
メソッドを使うこれは、clearHitRegions
メソッドを使った簡単なコードです。
<canvas id="canvas"></canvas> -- -
var canvas = document.getElementById("canvas"); -var ctx = canvas.getContext("2d"); - -// ヒット領域をいくつか指定 -ctx.addHitRegion({id: "eyes"}); -ctx.addHitRegion({id: "nose"}); -ctx.addHitRegion({id: "mouth"}); - -// canvasからすべて削除 -ctx.clearHitRegions(); -- -
仕様 | -策定状況 | -コメント | -
---|---|---|
{{SpecName('HTML WHATWG', "scripting.html#dom-context-2d-clearhitregions", "CanvasRenderingContext2D.clearHitRegions")}} | -{{Spec2('HTML WHATWG')}} | -- |
{{Compat("api.CanvasRenderingContext2D.clearHitRegions")}}
- -Canvas 2D APIのCanvasRenderingContext2D
.removeHitRegion()
メソッドは、canvasから与えられたヒット領域を削除します。
void ctx.removeHitRegion(id); -- -
id
をあらわす{{domxref("DOMString")}}。removeHitRegion
メソッドを使うこれは、removeHitRegion
を使った簡単なコードです。
<canvas id="canvas"></canvas> -- -
var canvas = document.getElementById("canvas"); -var ctx = canvas.getContext("2d"); - -// ヒット領域を指定 -ctx.addHitRegion({id: "eyes"}); - -// canvasからヒット領域を削除 -ctx.removeHitRegion("eyes"); -- -
仕様 | -策定状況 | -コメント | -
---|---|---|
{{SpecName('HTML WHATWG', "scripting.html#dom-context-2d-removehitregion", "CanvasRenderingContext2D.removeHitRegion")}} | -{{Spec2('HTML WHATWG')}} | -- |
{{Compat("api.CanvasRenderingContext2D.removeHitRegion")}}
- -CountQueuingStrategy()
コンストラクターは、CountQueuingStrategy
オブジェクトのインスタンスを作成して返します。
var countQueuingStrategy = new CountQueuingStrategy({highWaterMark});- -
highWaterMark
プロパティを含むオブジェクト。 これは、バックプレッシャーが適用される前に内部キューに含めることができるチャンクの総数を定義する負でない整数です。{{domxref("CountQueuingStrategy")}} オブジェクトのインスタンス。
- -なし。
- -const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
-
-const writableStream = new WritableStream({
- // シンクの実装
- write(chunk) {
- ...
- },
- close() {
- ...
- },
- abort(err) {
- console.log("Sink error:", err);
- }
-}, queuingStrategy);
-
-var size = queuingStrategy.size()
;
-
-仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName("Streams","#cqs-constructor","CountQueuingStrategy()")}} | -{{Spec2('Streams')}} | -初期定義 | -
{{Compat("api.CountQueuingStrategy.CountQueuingStrategy")}}
diff --git a/files/ja/web/api/countqueuingstrategy/countqueuingstrategy/index.md b/files/ja/web/api/countqueuingstrategy/countqueuingstrategy/index.md new file mode 100644 index 00000000000000..8738a1153ae473 --- /dev/null +++ b/files/ja/web/api/countqueuingstrategy/countqueuingstrategy/index.md @@ -0,0 +1,65 @@ +--- +title: CountQueuingStrategy.CountQueuingStrategy() +slug: Web/API/CountQueuingStrategy/CountQueuingStrategy +tags: + - API + - Constructor + - CountQueuingStrategy + - Experimental + - Reference + - Streams +translation_of: Web/API/CountQueuingStrategy/CountQueuingStrategy +--- +{{SeeCompatTable}}{{APIRef("Streams")}} + +**`CountQueuingStrategy()`** コンストラクターは、`CountQueuingStrategy` オブジェクトのインスタンスを作成して返します。 + +## 構文 + +``` +var countQueuingStrategy = new CountQueuingStrategy({highWaterMark}); +``` + +### パラメーター + +- {highWaterMark} + - : `highWaterMark` プロパティを含むオブジェクト。 これは、バックプレッシャーが適用される前に内部キューに含めることができるチャンクの総数を定義する負でない整数です。 + +### 戻り値 + +{{domxref("CountQueuingStrategy")}} オブジェクトのインスタンス。 + +### 例外 + +なし。 + +## 例 + +```js +const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 }); + +const writableStream = new WritableStream({ + // シンクの実装 + write(chunk) { + ... + }, + close() { + ... + }, + abort(err) { + console.log("Sink error:", err); + } +}, queuingStrategy); + +var size = queuingStrategy.size(); +``` + +## 仕様 + +| 仕様 | 状態 | コメント | +| ---------------------------------------------------------------------------------------- | ---------------------------- | -------- | +| {{SpecName("Streams","#cqs-constructor","CountQueuingStrategy()")}} | {{Spec2('Streams')}} | 初期定義 | + +## ブラウザーの互換性 + +{{Compat("api.CountQueuingStrategy.CountQueuingStrategy")}} diff --git a/files/ja/web/api/countqueuingstrategy/index.html b/files/ja/web/api/countqueuingstrategy/index.html deleted file mode 100644 index 9bd152f8bee48f..00000000000000 --- a/files/ja/web/api/countqueuingstrategy/index.html +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: CountQueuingStrategy -slug: Web/API/CountQueuingStrategy -tags: - - API - - CountQueuingStrategy - - Experimental - - Interface - - Reference - - Streams -translation_of: Web/API/CountQueuingStrategy ---- -{{SeeCompatTable}}{{APIRef("Streams")}}
- -Streams API の CountQueuingStrategy
インターフェイスは、ストリームの構築時に使用できる組み込みのチャンクカウントキューイング戦略を提供します。
CountQueuingStrategy
オブジェクトのインスタンスを作成します。なし。
- -1
を返します。const queueingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
-
-const writableStream = new WritableStream({
- // シンクの実装
- write(chunk) {
- ...
- },
- close() {
- ...
- },
- abort(err) {
- console.log("Sink error:", err);
- }
-}, queueingStrategy);
-
-var size = queueingStrategy.size()
;
-
-
-仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName('Streams','#cqs-class','CountQueuingStrategy')}} | -{{Spec2('Streams')}} | -初期定義 | -
{{Compat("api.CountQueuingStrategy")}}
-{{domxref("CountQueuingStrategy")}} インターフェイスの size()
メソッドは常に 1
を返すため、合計キューサイズはキュー内のチャンク数を数えたものになります。
var size =
countQueuingStrategy.size();
-
-なし。
- -1
。
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
-
-const writableStream = new WritableStream({
- // シンクの実装
- write(chunk) {
- ...
- },
- close() {
- ...
- },
- abort(err) {
- console.log("Sink error:", err);
- }
-}, queuingStrategy);
-
-var size = queuingStrategy.size()
;
-
-仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName("Streams","#cqs-size","size")}} | -{{Spec2('Streams')}} | -初期定義 | -
{{Compat("api.CountQueuingStrategy.size")}}
diff --git a/files/ja/web/api/countqueuingstrategy/size/index.md b/files/ja/web/api/countqueuingstrategy/size/index.md new file mode 100644 index 00000000000000..00751d7b546056 --- /dev/null +++ b/files/ja/web/api/countqueuingstrategy/size/index.md @@ -0,0 +1,61 @@ +--- +title: CountQueuingStrategy.size() +slug: Web/API/CountQueuingStrategy/size +tags: + - API + - CountQueuingStrategy + - Experimental + - Method + - Reference + - Streams + - size +translation_of: Web/API/CountQueuingStrategy/size +--- +{{SeeCompatTable}}{{APIRef("Streams")}} + +{{domxref("CountQueuingStrategy")}} インターフェイスの **`size()`** メソッドは常に `1` を返すため、合計キューサイズはキュー内のチャンク数を数えたものになります。 + +## 構文 + +``` +var size = countQueuingStrategy.size(); +``` + +### パラメーター + +なし。 + +### 戻り値 + +`1`。 + +## 例 + +```js +const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 }); + +const writableStream = new WritableStream({ + // シンクの実装 + write(chunk) { + ... + }, + close() { + ... + }, + abort(err) { + console.log("Sink error:", err); + } +}, queuingStrategy); + +var size = queuingStrategy.size(); +``` + +## 仕様 + +| 仕様 | 状態 | コメント | +| -------------------------------------------------------- | ---------------------------- | -------- | +| {{SpecName("Streams","#cqs-size","size")}} | {{Spec2('Streams')}} | 初期定義 | + +## ブラウザーの互換性 + +{{Compat("api.CountQueuingStrategy.size")}} diff --git a/files/ja/web/api/crypto/index.html b/files/ja/web/api/crypto/index.html deleted file mode 100644 index 7d89260966095f..00000000000000 --- a/files/ja/web/api/crypto/index.html +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Crypto -slug: Web/API/Crypto -tags: - - API - - Interface - - Reference - - Web Crypt API -translation_of: Web/API/Crypto ---- -{{APIRef("Web Crypto API")}}
- -Crypto
インターフェイスは、現在のコンテキストで利用できる基本的な暗号機能を表します。これは、暗号強度の強い乱数生成器と暗号プリミティブへのアクセスを許可します。
このインターフェイスを持つオブジェクトは、{{domxref("Window.crypto")}} プロパティを通じてウェブコンテキスト上で利用可能です。
- -このインターフェイスは、{{domxref("RandomSource")}} 上に定義されたプロパティを実装します。
- -このインターフェイスは、{{domxref("RandomSource")}} 上に定義されたメソッドを実装します。
- -仕様書 | -策定状況 | -備考 | -
---|---|---|
{{SpecName("Web Crypto API", "#crypto-interface", "Crypto")}} | -{{Spec2("Web Crypto API")}} | -初期定義 | -
{{Compat("api.Crypto")}}
-{{APIRef("Web Crypto API")}}
- -Crypto.subtle
読み取り専用プロパティは、暗号化操作ができる {{domxref("SubtleCrypto")}} オブジェクトを返します。
var crypto = crypto.subtle;- -
仕様書 | -策定状況 | -備考 | -
---|---|---|
{{ SpecName('Web Crypto API', '#dfn-Crypto', 'Crypto.subtle') }} | -{{ Spec2('Web Crypto API') }} | -初期定義。 | -
{{Compat("api.Crypto.subtle")}}
- -Document.childElementCount
は読み取り専用のプロパティで、 DocumentFragment
の子要素の数を返します。
特定の要素の子要素の数を取得する場合は、 {{domxref("Element.childElementCount")}} を参照してください。
- -fragment.childElementCount; -- -
-let fragment = new DocumentFragment() -fragment.childElementCount; // 0 - -let paragraph = document.createElement('p') -fragment.appendChild(paragraph) - -fragment.childElementCount; // 1 -- -
{{Compat}}
- -{{ APIRef("DOM") }}
- -DocumentFragment
インターフェイスは、親ノードを持たない最小限の文書オブジェクト (文書の断片) を表します。これは {{domxref("Document")}} の軽量版として使用され、標準の文書のようにノードで構成される文書構造の区間を格納します。重要な違いは、文書の断片はアクティブな文書ツリー構造の一部ではないため、断片に対して変更を行っても、文書に影響したり、{{Glossary("reflow", "再フロー")}}を起こしたり、変更が行われたときに性能上の影響を及ぼしたりすることがないことです。
DocumentFragment
の一般的な利用方法は、まず一つ作成し、その中に DOM のサブツリーを構成し、 {{domxref("Node")}} インターフェイスの {{domxref("Node.appendChild", "appendChild()")}} または {{domxref("Node.insertBefore", "insertBefore()")}} などのメソッドを利用して断片を DOM に追加または挿入することです。こうすると断片のノードは DOM に移動し、空の DocumentFragment
が残ります。すべてのノードが文書に一括で挿入されるため、それぞれのノードが別個に挿入されれば、その度に再フローや描画が起動する可能性があるところが、この場合は一度しか起動されません。
このインターフェイスはウェブコンポーネントでも大いに役に立っています。 {{HTMLElement("template")}} 要素はその {{domxref("HTMLTemplateElement.content")}} プロパティに DocumentFragment
を含みます。
空の DocumentFragment
は {{domxref("document.createDocumentFragment")}} メソッドやコンストラクターを使って作成できます。
{{InheritanceDiagram}}
- -このインターフェイスには固有のプロパティはありませんが、その親である {{domxref("Node")}} のプロパティを継承し、 {{domxref("ParentNode")}} インターフェイスのプロパティを実装しています。
- -DocumentFragment
オブジェクトの子である型 {{domxref("Element")}} のすべてのオブジェクトを含む、「生」の {{domxref("HTMLCollection")}} を返します。DocumentFragment
オブジェクトの最初の子である {{domxref("Element")}}、または無ければ null
を返します。DocumentFragment
オブジェクトの最後の子である {{domxref("Element")}}、または無ければ null
を返します。DocumentFragment
が持つ子の数を表す unsigned long
を返します。DocumentFragment
オブジェクトを返します。このインターフェイスはその親である {{domxref("Node")}} のメソッドを継承し、 {{domxref("ParentNode")}} インターフェイスのメソッドを実装しています。
- -DocumentFragment
の中で、文書の順序で見た場合に、指定されたセレクターに一致する最初の {{domxref("Element")}} ノードを返します。DocumentFragment
の中で、指定されたセレクターに一致するすべての {{domxref("Element")}} ノードの {{domxref("NodeList")}} を返します。DocumentFragment
の中で、文書の順序で見た場合に、指定された ID に一致する最初の {{domxref("Element")}} ノードを返します。仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName('DOM WHATWG', '#interface-documentfragment', 'DocumentFragment')}} | -{{Spec2('DOM WHATWG')}} | -コンストラクターと {{domxref("ParentNode")}} の実装を追加。 | -
{{SpecName('Selectors API Level 1', '#the-apis', 'DocumentFragment')}} | -{{Spec2('Selectors API Level 1')}} | -querySelector() と querySelectorAll() メソッドを追加。 |
-
{{SpecName('DOM3 Core', 'core.html#ID-B63ED1A3', 'DocumentFragment')}} | -{{Spec2('DOM3 Core')}} | -{{SpecName('DOM2 Core')}} より変更なし | -
{{SpecName('DOM2 Core', 'core.html#ID-B63ED1A3', 'DocumentFragment')}} | -{{Spec2('DOM2 Core')}} | -{{SpecName('DOM1')}} より変更なし | -
{{SpecName('DOM1', 'level-one-core.html#ID-B63ED1A3', 'DocumentFragment')}} | -{{Spec2('DOM1')}} | -初回定義 | -
{{Compat("api.DocumentFragment")}}
- -{{APIRef("DOM")}}
- -DOMException
インターフェイスは、Web API のメソッドの呼び出しやプロパティへのアクセスによって異常なイベント (例外と呼ばれます) が発生したことを表します。これは基本的に、Web API 内部のエラーの状態を示すものです。
それぞれの例外に名称があり、これはエラーまたは異常な状態を特定する "CamelCase" 形式の文字列です。
- -DOMException
オブジェクトを返します。0
を short
型の値で返します。このフィールドは歴史的な経緯で使用されており、新たな DOM 例外では使用しません。新たな例外の情報は {{domxref("DOMException.name")}} 属性に収めています。これは、一般的なエラー名の一覧です。独自にエラー名のセットを定義している API がありますので、これは必ずしも完全なリストではありません。
- -注記: 歴史的にエラーは、エラーの値を持つように定義した名前付き変数と、それに対応する値で識別されてきたため、一部の項目では過去に使用されたレガシーコードや定数名も記載します。
-IndexSizeError
1
、レガシー定数名: INDEX_SIZE_ERR
)HierarchyRequestError
3
、レガシー定数名: HIERARCHY_REQUEST_ERR
)WrongDocumentError
4
、レガシー定数名: WRONG_DOCUMENT_ERR
)InvalidCharacterError
5
、レガシー定数名: INVALID_CHARACTER_ERR
)NoModificationAllowedError
7
、レガシー定数名: NO_MODIFICATION_ALLOWED_ERR
)NotFoundError
8
、レガシー定数名: NOT_FOUND_ERR
)NotSupportedError
9
、レガシー定数名: NOT_SUPPORTED_ERR
)InvalidStateError
11
、レガシー定数名: INVALID_STATE_ERR
)SyntaxError
12
、レガシー定数名: SYNTAX_ERR
)InvalidModificationError
13
、レガシー定数名: INVALID_MODIFICATION_ERR
)NamespaceError
14
、レガシー定数名: NAMESPACE_ERR
)InvalidAccessError
15
、レガシー定数名: INVALID_ACCESS_ERR
)TypeMismatchError
{{deprecated_inline}}17
、レガシー定数名: TYPE_MISMATCH_ERR
) この値は非推奨であり、この値を持つ DOMException
に代わり JavaScript の {{jsxref("TypeError")}} 例外が発生します。SecurityError
18
、レガシー定数名: SECURITY_ERR
)NetworkError
{{experimental_inline}}19
、レガシー定数名: NETWORK_ERR
)AbortError
{{experimental_inline}}20
、レガシー定数名: ABORT_ERR
)URLMismatchError
{{experimental_inline}}21
、レガシー定数名: URL_MISMATCH_ERR
)QuotaExceededError
{{experimental_inline}}22
、レガシー定数名: QUOTA_EXCEEDED_ERR
)TimeoutError
23
、レガシー定数名: TIMEOUT_ERR
)InvalidNodeTypeError
{{experimental_inline}}24
、レガシー定数名: INVALID_NODE_TYPE_ERR
)DataCloneError
{{experimental_inline}}25
、レガシー定数名: DATA_CLONE_ERR
)EncodingError
{{experimental_inline}}NotReadableError
{{experimental_inline}}UnknownError
{{experimental_inline}}ConstraintError
{{experimental_inline}}DataError
{{experimental_inline}}TransactionInactiveError
{{experimental_inline}}ReadOnlyError
{{experimental_inline}}VersionError
{{experimental_inline}}OperationError
{{experimental_inline}}NotAllowedError
仕様書 | -策定状況 | -コメント | -
---|---|---|
{{SpecName('WebIDL', '#es-DOMException-call', 'constructor')}} | -{{Spec2('WebIDL')}} | -DOMException クラスのコンストラクターを追加。値 NotReadableError , UnknownError , ConstraintError , DataError , TransactionInactiveError , ReadOnlyError , VersionError , OperationError , NotAllowedError を追加。 |
-
{{SpecName('DOM4', '#exception-domexception', 'DOMException')}} | -{{Spec2('DOM4')}} | -SECURITY_ERR , NETWORK_ERR , ABORT_ERR , URL_MISMATCH_ERR , QUOTA_EXCEEDED_ERR , TIMEOUT_ERR , INVALID_NODE_TYPE_ERR , DATA_CLONE_ERR を追加。例外値のプロパティ code を非推奨に変更。値 EncodingError を追加。 |
-
{{SpecName('DOM3 Core', 'core.html#ID-17189187', 'DOMException')}} | -{{Spec2('DOM3 Core')}} | -VALIDATION_ERR および TYPE_MISMATCH_ERR を追加。 |
-
{{SpecName('DOM2 Core', 'core.html#ID-17189187', 'DOMException')}} | -{{Spec2('DOM2 Core')}} | -INVALID_STATE_ERR , SYNTAX_ERR , INVALID_MODIFICATION_ERR , NAMESPACE_ERR , INVALID_ACCESS_ERR を追加。 |
-
{{SpecName('DOM1', 'level-one-core.html#ID-17189187', 'DOMException')}} | -{{Spec2('DOM1')}} | -最初期の定義 | -
{{Compat("api.DOMException")}}
- -{{ APIRef("DOM") }}
- -name
は {{domxref("DOMException")}} インターフェイスの読取専用プロパティで、 エラー名に結びつけられた文字列のうちの一つを含む {{domxref("DOMString")}} を返します。
var domExceptionName = domExceptionInstance.name; -- -
{{domxref("DOMString")}} です。
- -仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName('WebIDL', '#dom-domexception-name', 'name')}} | -{{Spec2('WebIDL')}} | -- |
{{Compat("api.DOMException.name")}}
diff --git a/files/ja/web/api/domexception/name/index.md b/files/ja/web/api/domexception/name/index.md new file mode 100644 index 00000000000000..3f1baf8f82d517 --- /dev/null +++ b/files/ja/web/api/domexception/name/index.md @@ -0,0 +1,36 @@ +--- +title: DOMException.name +slug: Web/API/DOMException/name +tags: + - API + - DOM + - DOMException + - Property + - Reference + - name + - プロパティ +translation_of: Web/API/DOMException/name +--- +{{ APIRef("DOM") }} + +**`name`** は {{domxref("DOMException")}} インターフェイスの読取専用プロパティで、 [エラー名](/ja/docs/Web/API/DOMException#Error_names)に結びつけられた文字列のうちの一つを含む {{domxref("DOMString")}} を返します。 + +## 構文 + +``` +var domExceptionName = domExceptionInstance.name; +``` + +### 値 + +{{domxref("DOMString")}} です。 + +## 仕様書 + +| 仕様書 | 状態 | 備考 | +| ---------------------------------------------------------------------------- | ------------------------ | ---- | +| {{SpecName('WebIDL', '#dom-domexception-name', 'name')}} | {{Spec2('WebIDL')}} | | + +## ブラウザーの互換性 + +{{Compat("api.DOMException.name")}} diff --git a/files/ja/web/api/federatedcredential/index.html b/files/ja/web/api/federatedcredential/index.html deleted file mode 100644 index f92c29ccb98e86..00000000000000 --- a/files/ja/web/api/federatedcredential/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: FederatedCredential -slug: Web/API/FederatedCredential -tags: - - API - - Credential Management API - - FederatedCredential - - Interface - - Reference - - credential management - - インターフェイス -translation_of: Web/API/FederatedCredential ---- -FederatedCredential
は Credential Management API のインターフェイスで、連合アイデンティティのプロバイダーからの認証情報についての情報を提供します。連合アイデンティティのプロバイダーは、ウェブサイトが正しくユーザーを認証し、そのための API を提供する主体です。連合アイデンティティプロバイダーの一例として、 OpenID Connect があります。
対応しているブラウザーにおいては、このインターフェイスのインスタンスがグローバル {{domxref('fetch')}} の init
オブジェクトの credential
メンバーとして渡されることがあります。
FederatedCredential
オブジェクトを生成します。祖先である {{domxref("Credential")}} からプロパティを継承しています。
- -なし。
- -なし。
- -var cred = new FederatedCredential({ - id: id, - name: name, - provider: 'https://account.google.com', - iconURL: iconUrl -}); - -// 格納 -navigator.credentials.store(cred) - .then(function() { - // 他に何かをする -});- -
仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName('Credential Management')}} | -{{Spec2('Credential Management')}} | -初回定義 | -
{{Compat("api.FederatedCredential")}}
diff --git a/files/ja/web/api/federatedcredential/index.md b/files/ja/web/api/federatedcredential/index.md new file mode 100644 index 00000000000000..6aa8956f49eb61 --- /dev/null +++ b/files/ja/web/api/federatedcredential/index.md @@ -0,0 +1,67 @@ +--- +title: FederatedCredential +slug: Web/API/FederatedCredential +tags: + - API + - Credential Management API + - FederatedCredential + - Interface + - Reference + - credential management + - インターフェイス +translation_of: Web/API/FederatedCredential +--- +{{SeeCompatTable}}{{APIRef("Credential Management API")}} + +**`FederatedCredential`** は [Credential Management API](/ja/docs/Web/API/Credential_Management_API) のインターフェイスで、連合アイデンティティのプロバイダーからの認証情報についての情報を提供します。連合アイデンティティのプロバイダーは、ウェブサイトが正しくユーザーを認証し、そのための API を提供する主体です。連合アイデンティティプロバイダーの一例として、 [OpenID Connect](http://openid.net/developers/specs/) があります。 + +対応しているブラウザーにおいては、このインターフェイスのインスタンスがグローバル {{domxref('fetch')}} の `init` オブジェクトの `credential` メンバーとして渡されることがあります。 + +## コンストラクター + +- {{domxref("FederatedCredential.FederatedCredential()","FederatedCredential()")}} + - : 新しい `FederatedCredential` オブジェクトを生成します。 + +## プロパティ + +_祖先である {{domxref("Credential")}} からプロパティを継承しています。_ + +- {{domxref("FederatedCredential.provider")}} {{readonlyInline}} + - : 認証情報の連合アイデンティティプロバイダーを含む {{domxref("USVString")}} です。 +- {{domxref("FederatedCredential.protocol")}} {{readonlyInline}} + - : 認証情報の連合アイデンティティプロトコルを含む {{domxref("DOMString")}} です。 + +### イベントハンドラー + +なし。 + +## メソッド + +なし。 + +## 例 + +```js +var cred = new FederatedCredential({ + id: id, + name: name, + provider: 'https://account.google.com', + iconURL: iconUrl +}); + +// 格納 +navigator.credentials.store(cred) + .then(function() { + // 他に何かをする +}); +``` + +## 仕様書 + +| 仕様書 | 状態 | 備考 | +| ------------------------------------------------ | -------------------------------------------- | -------- | +| {{SpecName('Credential Management')}} | {{Spec2('Credential Management')}} | 初回定義 | + +## ブラウザーの対応 + +{{Compat("api.FederatedCredential")}} diff --git a/files/ja/web/api/federatedcredential/protocol/index.html b/files/ja/web/api/federatedcredential/protocol/index.html deleted file mode 100644 index 6579246621dca7..00000000000000 --- a/files/ja/web/api/federatedcredential/protocol/index.html +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: FederatedCredential.protocol -slug: Web/API/FederatedCredential/protocol -tags: - - API - - Credential Management API - - Experimental - - FederatedCredential - - NeedsExample - - Property - - Reference - - credential management - - プロパティ -translation_of: Web/API/FederatedCredential/protocol ---- -protocol
は {{domxref("FederatedCredential")}} インターフェイスのプロパティで、認証情報の連合アイデンティティプロトコルが入った読み取り専用の {{domxref("DOMString")}} を返します。このプロパティが {{jsxref("null")}} の場合、プロトコルは {{domxref("FederatedCredential.provider")}} プロパティから推測される可能性があります。
var protocol = FederatedCredential.protocol- -
認証情報の連合アイデンティティプロトコルが入った {{domxref("DOMString")}} です (例えば openidconnect
)。
// TBD- -
仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName('Credential Management','#dom-federatedcredential-protocol','protocol')}} | -{{Spec2('Credential Management')}} | -初回定義 | -
{{Compat("api.FederatedCredential.protocol")}}
diff --git a/files/ja/web/api/federatedcredential/protocol/index.md b/files/ja/web/api/federatedcredential/protocol/index.md new file mode 100644 index 00000000000000..579a917810bf33 --- /dev/null +++ b/files/ja/web/api/federatedcredential/protocol/index.md @@ -0,0 +1,44 @@ +--- +title: FederatedCredential.protocol +slug: Web/API/FederatedCredential/protocol +tags: + - API + - Credential Management API + - Experimental + - FederatedCredential + - NeedsExample + - Property + - Reference + - credential management + - プロパティ +translation_of: Web/API/FederatedCredential/protocol +--- +{{SeeCompatTable}}{{APIRef("")}}{{securecontext_header}} + +**`protocol`** は {{domxref("FederatedCredential")}} インターフェイスのプロパティで、認証情報の連合アイデンティティプロトコルが入った読み取り専用の {{domxref("DOMString")}} を返します。このプロパティが {{jsxref("null")}} の場合、プロトコルは {{domxref("FederatedCredential.provider")}} プロパティから推測される可能性があります。 + +## 構文 + +``` +var protocol = FederatedCredential.protocol +``` + +### 値 + +認証情報の連合アイデンティティプロトコルが入った {{domxref("DOMString")}} です (例えば `openidconnect`)。 + +## 例 + +```js +// TBD +``` + +## 仕様書 + +| 仕様書 | 状態 | 備考 | +| ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | -------- | +| {{SpecName('Credential Management','#dom-federatedcredential-protocol','protocol')}} | {{Spec2('Credential Management')}} | 初回定義 | + +## ブラウザーの対応 + +{{Compat("api.FederatedCredential.protocol")}} diff --git a/files/ja/web/api/frame_timing_api/index.html b/files/ja/web/api/frame_timing_api/index.html deleted file mode 100644 index abf14b743df11e..00000000000000 --- a/files/ja/web/api/frame_timing_api/index.html +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Frame Timing API -slug: Web/API/Frame_Timing_API -tags: - - Guide - - NeedsTranslation - - Overview - - TopicStub - - Web Performance -translation_of: Web/API/Frame_Timing_API ---- -The PerformanceFrameTiming
interface provides frame timing data about the browser's event loop. A frame represents the amount of work a browser does in one event loop iteration such as processing DOM events, resizing, scrolling, rendering, CSS animations, etc. A frame rate of 60 fps (frames per second) for a 60 Hz refresh rate is a common target for a good responsive user experience. This means the browser should process a frame in about 16.7 ms.
An application can register a {{domxref("PerformanceObserver")}} for "frame
" {{domxref("PerformanceEntry","performance entry types")}}. The observer (callback) will be notified when new "frame
" events are added to the browser's performance timeline and the frame's {{domxref("PerformanceEntry.duration","duration")}} (length of time) will be available. This data can be used to help identify areas that take too long to provide a good user experience.
Example code of the interfaces described in this document is included in Using the Frame Timing API.
- -frames
The {{domxref("PerformanceFrameTiming")}} interface extends the following {{domxref("PerformanceEntry")}} properties (for "frame
" {{domxref("PerformanceEntry.entryType","performance entry types")}}) by qualifying and constrainting the properties as follows:
frame
".startTime
s of two successive frames.This data, particularly the duration
timestamp, can be used to help identify performance problems.
{{experimental_inline}}The performance observer interfaces allow an application to register an observer for specific {{domxref("PerformanceEntry","performance event types")}}. When one of those event types is recorded in the browser's performance timeline, the application is notified of the event via the observer's callback function that was specified when the observer was created.
- -To observe "frame
" performance entry types, the application first creates a {{domxref("PerformanceObserver")}} object with a specific frame observer callback (function). Next, {{domxref("PerformanceObserver.observe()")}} is used to specify the set of performance events to observe - in this case, just the "frame
" event type. When the browser adds a new frame to the performance timeline, the specified observer callback will be invoked.
When a frame {{domxref("PerformanceObserver","observer")}} is invoked, frame {{domxref("PerformanceEntry","performance entries")}} can be retrieved by calling {{domxref("PerformanceObserverEntryList.getEntriesByType()")}} with an argument of "frame
". This method returns a list of "frame
" {{domxref("PerformanceEntry")}} objects. Each frame object's {{domxref("PerformanceEntry.duration","duration")}} property returns the timestamp of two consecutive frames. If this value is greater than the time needed to provide a good user experience, further analysis might be warranted.
{{experimental_inline}}As shown in the {{domxref("PerformanceFrameTiming")}} interface's Browser Compatibility table, this interface has no implementations.
- -The PerformanceFrameTiming
interface provides frame timing data about the browser's event loop. A frame represents the amount of work a browser does in one event loop iteration such as processing DOM events, resizing, scrolling, rendering, CSS animations, etc. A frame rate of 60 fps (frames per second) for a 60 Hz refresh rate is a common target for a good responsive user experience. This means the browser should process a frame in about 16.7ms.
An application can register a {{domxref("PerformanceObserver")}} for "frame
" {{domxref("PerformanceEntry","performance entry types")}} and the observer will have data about the duration of each frame event. This data can be used to help identify areas that take too long to provide a good user experience.
This document describes how to use the {{domxref("PerformanceFrameTiming")}} interfaces including example code. For an overview of these interfaces see Frame Timing API.
- -{{experimental_inline}}The performance observer interfaces allow an application to register an observer for specific {{domxref("PerformanceEntry","performance event types")}}. When one of those event types is added to the browser's performance timeline, the application is notified of the event via the observer's callback function that was specified when the observer was created.
- -To observe "frame
" performance entry types, the application first creates a {{domxref("PerformanceObserver")}} object with a specific frame observer callback. In the following example, two observers for the "frame
" {{domxref("PerformanceEntry.entryType","performance entry type")}} are created and the first observer constructor uses inline function syntax.
function create_frame_observer() { - if (window.PerformanceObserver === undefined) return; - - // Register the performance observer - var observe_frame = new PerformanceObserver(function(list) { - // Log the frame entries - var perfEntries = list.getEntriesByType("frame"); - for (var i=0; i < perfEntries.length; i++) { - console.log("OBS #1: [" + i + "] = " + perfEntries[i].name); - } - }); - // Only observe 'frame' events - observe_frame.observe({entryTypes: ['frame']}); -} - -function init () { - create_frame_observer(); - - var obs = new PerformanceObserver(frame_observer_2); - obs.observe({entryTypes: ['frame']}); -} - -function frame_observer_2(list) { - // Log the frame entries - var perfEntries = list.getEntriesByType("frame"); - for (var i=0; i < perfEntries.length; i++) { - console.log("OBS #2: [" + i + "] = " + perfEntries[i].name); - } -} - -<body onload="init(event)"> -- -
When the browser adds a new "frame
" entry to the performance timeline, both of the observer callbacks will be invoked.
After an observer is created, the next step is to use the {{domxref("PerformanceObserver.observe()")}} method to specify the set of performance events to observe. In the following example, the observer only registers for "frame
" {{domxref("PerformanceEntry.entryType","performance entry")}} notifications.
var observe_frame = new PerformanceObserver(function(list) { - // Process the frame ... - }); - // Only observe 'frame' events - observe_frame.observe({entryTypes: ['frame']}); -- -
In the following example, the observer registers to be notified when several different {{domxref("PerformanceEntry.entryType","performance entry types")}} are added to the performance timeline.
- -var observe_all = new PerformanceObserver(function(list) { - var perfEntries = list.getEntries(); - for (var i=0; i < perfEntries.length; i++) { - switch (perfEntries[i].entryType) { - case "frame": process_frame(perfEntries[i]); break; - case "mark": process_mark(perfEntries[i]); break; - case "measure": process_measure(perfEntries[i]); break; - case "resource": process_resource(perfEntries[i]); break; - default: console.log("Unexpected performance entry type: " + perfEntries[i].entryType); - } - } - }); - // Observe frame, mark, measure and resource events - observe_frame.observe({entryTypes: ['frame', 'mark', 'measure', 'resource']}); -- -
When a frame {{domxref("PerformanceObserver","observer")}} is invoked, the observer callback is given one argument that is a {{domxref("PerformanceObserverEntryList")}} object. This object has three methods to retrieve frame data:
- -In the following example, the observer only processes "frame
" entries.
var THRESHOLD = 1500; -var observe_frame = new PerformanceObserver(function(list) { - var perfEntries = list.getEntriesByType("frame"); - for (var i=0; i < perfEntries.length; i++) { - if (perfEntries[i].duration > THRESHOLD) { - console.log("Warning: frame '" + THRESHOLD + "' exceeded!"); - } - } -}); -observe_frame.observe({entryTypes: ['frame']}); -- -
First, perhaps using the tools will save you is a bit too strong but performance tools can certainly help identify code that is not conformant to some expected time threshold. This section briefly describes the web performance tools for the Firefox and Chrome/Canary browsers.
- -Firefox's performance tool allows the developer to record a piece of the user's interaction and the data obtained during the recording is used to create a profile of the browser's activity. The profile includes a waterfall of the activity such as event handling, layout, painting, scripting, etc.
- -Firefox's performance tool also includes a frame rate graph which provides timestamps for each frame including the average frame rate and the minimum and maximum rates (for a specific recording session). This data, along with the waterfall data, gives an indication of where a site might be having frame related performance problems (for example, by correlating the recording's minimum rates with their respective waterfall events).
- -The performance tool's flame chart and call tree tabs provide data to help analyze the site's JavaScript usage. The call tree shows where the application is spending most of its time, whereas the flame chart shows the state of the JavaScript stack for the code at every millisecond during the performance profile. This provides a way to know exactly which function was executing at any point during the recording, how long it ran, and where it was called from.
- -The Chrome (and Canary) browsers also have a performance tool with similar functions as Firefox. See Performance profiling with the Timeline for more information about this tool.
- -これは3ページ (first_page.php、second_page.php、third_page.php) で構成された AJAX Web サイトの例です。どのように動作するかを確認するには、以下のファイル (またはgit clone https://github.com/giabao/mdn-ajax-nav-example.git) を作成してください:
+これは 3 ページ (first_page.php、second_page.php、third_page.php) で構成された AJAX Web サイトの例です。どのように動作するかを確認するには、以下のファイル (または git clone [https://github.com/giabao/mdn-ajax-nav-example.git](https://github.com/giabao/mdn-ajax-nav-example "/en-US/docs/")) を作成してください: -first_page.php:
+**first_page.php**: -<?php +```php + + + + +" . $page_title . ""; +?> + -<body> + -<?php include "include/before_content.php"; ?> + -<p>This paragraph is shown only when the navigation starts from <strong>first_page.php</strong>.</p> +-This paragraph is shown only when the navigation starts from first_page.php.
-<div id="ajax-content"> -<?php } ?> ++ - <p>This is the content of <strong>first_page.php</strong>.</p> +-<p>This paragraph is shown only when the navigation starts from <strong>first_page.php</strong>.</p> +This is the content of first_page.php.
-<?php + $page_title, "content" => ob_get_clean())); } else { -?> -</div> +?> +This paragraph is shown only when the navigation starts from first_page.php.
-<?php +\n"; } -?> -
second_page.php:
+**second_page.php**: -<?php +```php + + + + +" . $page_title . ""; +?> + -<body> + -<?php include "include/before_content.php"; ?> + -<p>This paragraph is shown only when the navigation starts from <strong>second_page.php</strong>.</p> +-This paragraph is shown only when the navigation starts from second_page.php.
-<div id="ajax-content"> -<?php } ?> ++ - <p>This is the content of <strong>second_page.php</strong>.</p> +-<p>This paragraph is shown only when the navigation starts from <strong>second_page.php</strong>.</p> +This is the content of second_page.php.
-<?php + $page_title, "content" => ob_get_clean())); } else { -?> -</div> +?> +This paragraph is shown only when the navigation starts from second_page.php.
-<?php +\n"; } -?> -
third_page.php:
+**third_page.php**: -<?php +```php +This is the content of third_page.php. This content is stored into a php variable."; - if (isset($_GET["view_as"]) && $_GET["view_as"] == "json") { - echo json_encode(array("page" => $page_title, "content" => $page_content)); + if (isset($_GET["view_as"]) && $_GET["view_as"] == "json") { + echo json_encode(array("page" => $page_title, "content" => $page_content)); } else { -?> -<!doctype html> -<html> -<head> -<?php +?> + + + +" . $page_title . ""; +?> + -<body> + -<?php include "include/before_content.php"; ?> + -<p>This paragraph is shown only when the navigation starts from <strong>third_page.php</strong>.</p> +-This paragraph is shown only when the navigation starts from third_page.php.
-<div id="ajax-content"> -<?php echo $page_content; ?> -</div> ++ +-<p>This paragraph is shown only when the navigation starts from <strong>third_page.php</strong>.</p> +This paragraph is shown only when the navigation starts from third_page.php.
-<?php +\n"; } -?> -
css/style.css:
+**css/style.css**: -#ajax-loader { +```css +#ajax-loader { position: fixed; display: table; top: 0; @@ -156,7 +154,7 @@ height: 100%; } -#ajax-loader > div { +#ajax-loader > div { display: table-cell; width: 100%; height: 100%; @@ -165,40 +163,42 @@ background-color: #000000; opacity: 0.65; } -+``` -
include/after_content.php:
+**include/after_content.php**: -<p>This is the footer. It is shared between all ajax pages.</p> -+```php +
This is the footer. It is shared between all ajax pages.
+``` -include/before_content.php:
+**include/before_content.php**: -<p> -[ <a class="ajax-nav" href="first_page.php">First example</a> -| <a class="ajax-nav" href="second_page.php">Second example</a> -| <a class="ajax-nav" href="third_page.php">Third example</a> -| <a class="ajax-nav" href="unexisting.php">Unexisting page</a> ] -</p> +```php ++**include/header.php**: -+[ First example +| Second example +| Third example +| Unexisting page ] +
+``` -
include/header.php:
+```php + + + +``` -<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -<script type="text/javascript" src="js/ajax_nav.js"></script> -<link rel="stylesheet" href="css/style.css" /> -+**js/ajax_nav.js**: -
js/ajax_nav.js:
- -"use strict"; +```js +"use strict"; const ajaxRequest = new (function () { function closeReq () { - oLoadingBox.parentNode && document.body.removeChild(oLoadingBox); + oLoadingBox.parentNode && document.body.removeChild(oLoadingBox); bIsLoading = false; } @@ -258,7 +258,7 @@ } function filterURL (sURL, sViewMode) { - return sURL.replace(rSearch, "") + ("?" + sURL.replace(rHost, "&").replace(rView, sViewMode ? "&" + sViewKey + "=" + sViewMode : "").slice(1)).replace(rEndQstMark, ""); + return sURL.replace(rSearch, "") + ("?" + sURL.replace(rHost, "&").replace(rView, sViewMode ? "&" + sViewKey + "=" + sViewMode : "").slice(1)).replace(rEndQstMark, ""); } function getPage (sPage) { @@ -294,7 +294,7 @@ function init () { oPageInfo.title = document.title; history.replaceState(oPageInfo, oPageInfo.title, oPageInfo.url); - for (var oLink, nIdx = 0, nLen = document.links.length; nIdx < nLen; document.links[nIdx++].onclick = processLink); + for (var oLink, nIdx = 0, nLen = document.links.length; nIdx < nLen; document.links[nIdx++].onclick = processLink); } const @@ -303,7 +303,7 @@ sTargetId = "ajax-content", sViewKey = "view_as", sAjaxClass = "ajax-nav", /* not customizable constants */ - rSearch = /\?.*$/, rHost = /^[^\?]*\?*&*/, rView = new RegExp("&" + sViewKey + "\\=[^&]*|&*$", "i"), rEndQstMark = /\?$/, + rSearch = /\?.*$/, rHost = /^[^\?]*\?*&*/, rView = new RegExp("&" + sViewKey + "\\=[^&]*|&*$", "i"), rEndQstMark = /\?$/, oLoadingBox = document.createElement("div"), oCover = document.createElement("div"), oLoadingImg = new Image(), oPageInfo = { title: null, @@ -399,14 +399,11 @@ this.rebuildLinks = init; })(); --
詳細は、ブラウザの履歴を操作するを参照してください。
+詳細は、[ブラウザの履歴を操作する](/ja/docs/Web/API/History_API)を参照してください。 -DOM の {{DOMxRef("Window")}} オブジェクトは、ブラウザーのセッション履歴 (WebExtensions history と混同しないように) へのアクセスを {{DOMxRef("Window.history","history")}} オブジェクトを介して提供しています。このオブジェクトは、ユーザーの履歴の中を前のページや後のページへ移動したり、履歴スタックの中を操作したりするのに便利なメソッドやプロパティが提供されています。
- -ユーザーの履歴の中を前のページや次のページへ移動するには、 {{DOMxRef("History.back","back()")}}, {{DOMxRef("History.forward","forward()")}}, {{DOMxRef("History.go","go()")}} の各メソッドを使用します。
- -履歴を前に遡るには、次のようにします。
- -window.history.back() -- -
これは、ちょうどユーザーがブラウザーのツールバーの前のページへ戻るボタンをクリックしたときのような動作です。
- -同様に、次のようにして (ユーザーが次のページへ進むボタンをクリックしたときのように) 次のページへ進むこともできます。
- -window.history.forward() -- -
{{DOMxRef("History.go","go()")}} メソッドを使うと、セッション履歴において現在のページから相対的な位置を指定して特定のページを読み込むことができます。 (現在のページの相対位置は 0
となります。)
ひとつ前のページへと戻る例です ({{DOMxRef("History.back","back()")}} と同様の動き)。
- -window.history.go(-1) -- -
ページを進める例で、 {{DOMxRef("History.forward","forward()")}} を呼び出すのと同様です。
- -window.history.go(1) -- -
同様に、 2
を渡すことで2ページ分を進めることができます。
go()
メソッドの他の使い方として、 0
を渡すか、引数なしで呼び出すことで、現在のページを再読み込みすることができます。
// 以下の文は、 -// どちらもページを再読み込みする -// 効果があります。 -window.history.go(0) -window.history.go() -- -
length
プロパティの値を参照することにより、履歴スタック中のページの数を知ることができます。
let numberOfEntries = window.history.length -- -
以下の例では onpopstate
プロパティにリスナーを割り当てています。そして、 history オブジェクトのメソッドで現在のタブのブラウザー履歴の追加、置換、移動など、いくつかの操作を説明しています。
window.onpopstate = function(event) { - alert(`location: ${document.location}, state: ${JSON.stringify(event.state)}`) -} - -history.pushState({page: 1}, "title 1", "?page=1") -history.pushState({page: 2}, "title 2", "?page=2") -history.replaceState({page: 3}, "title 3", "?page=3") -history.back() // alerts "location: http://example.com/example.html?page=1, state: {"page":1}" -history.back() // alerts "location: http://example.com/example.html, state: null" -history.go(2) // alerts "location: http://example.com/example.html?page=3, state: {"page":3}"- -
仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName("HTML WHATWG", "browsers.html#history", "History")}} | -{{Spec2("HTML WHATWG")}} | -{{SpecName("HTML5 W3C")}} から変更なし | -
{{SpecName("HTML5 W3C", "browsers.html#history", "History")}} | -{{Spec2("HTML5 W3C")}} | -初回定義 | -
{{Compat("api.History")}}
- -{{APIRef("IndexedDB")}}
- -The IDBRequest
interface of the IndexedDB API provides access to results of asynchronous requests to databases and database objects using event handler attributes. Each reading and writing operation on a database is done using a request.
The request object does not initially contain any information about the result of the operation, but once information becomes available, an event is fired on the request, and the information becomes available through the properties of the IDBRequest
instance.
All asynchronous operations immediately return an {{domxref("IDBRequest")}} instance. Each request has a readyState
that is set to the 'pending'
state; this changes to 'done'
when the request is completed or fails. When the state is set to done
, every request returns a result
and an error
, and an event is fired on the request. When the state is still pending
, any attempt to access the result
or error
raises an InvalidStateError
exception.
In plain words, all asynchronous methods return a request object. If the request has been completed successfully, the result is made available through the result
property and an event indicating success is fired at the request ({{domxref("IDBRequest.onsuccess")}}). If an error occurs while performing the operation, the exception is made available through the result
property and an error event is fired ({{domxref("IDBRequest.onerror")}}).
The interface {{domxref("IDBOpenDBRequest")}} is derived from IDBRequest
.
{{AvailableInWorkers}}
- -{{InheritanceDiagram}}
- -Also inherits properties from {{domxref("EventTarget")}}.
- -Returns the result of the request. If the the request failed and the result is not available, an InvalidStateError exception is thrown.
-pending
state. The state changes to done
when the request completes successfully or when an error occurs.No methods, but inherits methods from {{domxref("EventTarget")}}.
- -Listen to these events using addEventListener()
or by assigning an event listener to the oneventname
property of this interface.
error
onerror
property.success
IDBRequest
succeeds.onsuccess
property.In the following code snippet, we open a database asynchronously and make a request; onerror
and onsuccess
functions are included to handle the success and error cases. For a full working example, see our To-do Notifications app (view example live.)
var db; - -// Let us open our database -var DBOpenRequest = window.indexedDB.open("toDoList", 4); - -// these two event handlers act on the database being -// opened successfully, or not -DBOpenRequest.onerror = function(event) { - note.innerHTML += '<li>Error loading database.</li>'; -}; - -DBOpenRequest.onsuccess = function(event) { - note.innerHTML += '<li>Database initialised.</li>'; - - // store the result of opening the database. - db = DBOpenRequest.result; -};- -
Specification | -Status | -Comment | -
---|---|---|
{{SpecName('IndexedDB', '#idl-def-IDBRequest', 'IDBRequest')}} | -{{Spec2('IndexedDB')}} | -Initial definition. | -
{{SpecName("IndexedDB 2", "#request-api", "IDBRequest")}} | -{{Spec2("IndexedDB 2")}} | -- |
{{Compat("api.IDBRequest")}}
-success
イベントはIDBRequest
が成功すると着火します。
Bubbles | -No | -
---|---|
Cancelable | -No | -
Interface | -{{domxref("Event")}} | -
Event handler property | -onsuccess |
-
Bubbles | +No | +
Cancelable | +No | +
Interface | +{{domxref("Event")}} | +
Event handler property | +
+ onsuccess
+ |
+
この例では、データベースをオープンします。そのsuccess
イベントをaddEventListener()
でリスンします。
// データベースをオープンする +```js +// データベースをオープンする const openRequest = window.indexedDB.open('toDoList', 4); -openRequest.onupgradeneeded = (event) => { +openRequest.onupgradeneeded = (event) => { const db = event.target.result; - db.onerror = () => { + db.onerror = () => { console.log('Error creating database'); }; @@ -53,21 +58,21 @@+下記は同じことを`onsuccess`イベントハンドラープロパティを使用した例です。 -例
objectStore.createIndex('year', 'year', { unique: false }); }; -openRequest.addEventListener('success', (event) => { +openRequest.addEventListener('success', (event) => { console.log('Database opened successfully!'); }); +``` -
下記は同じことをonsuccess
イベントハンドラープロパティを使用した例です。
// データベースをオープンする +```js +// データベースをオープンする const openRequest = window.indexedDB.open('toDoList', 4); -openRequest.onupgradeneeded = (event) => { +openRequest.onupgradeneeded = (event) => { const db = event.target.result; - db.onerror = () => { + db.onerror = () => { console.log('Error creating database'); }; @@ -82,20 +87,16 @@- -例
objectStore.createIndex('year', 'year', { unique: false }); }; -openRequest.onsuccess = (event) => { +openRequest.onsuccess = (event) => { console.log('Database opened successfully!'); }; -
{{Compat("api.IDBRequest.success_event")}}
+{{Compat("api.IDBRequest.success_event")}} -onsuccess
event handler property{{APIRef("DOM Events")}}
- -InputEvent
インターフェイスは、編集可能なコンテンツが変更されたことを通知するイベントを表します。
InputEvent
オブジェクトを作成します。このインターフェイスは、親インターフェイスである {{domxref("UIEvent")}}、{{domxref("Event")}} のプロパティを継承します。
- -このインターフェイスではメソッドが定義されていませんが、親インターフェイスである {{domxref("UIEvent")}}、{{domxref("Event")}} のメソッドを継承します。
- -仕様書 | -策定状況 | -コメント | -
---|---|---|
{{SpecName('DOM3 Events','#interface-InputEvent','InputEvent')}} | -{{Spec2('DOM3 Events')}} | -最初期の定義 | -
{{Compat("api.InputEvent")}}
- -inputType
は {{domxref("InputEvent")}} インターフェイスの読取専用プロパティで、編集可能なコンテンツの変更が行われた種別を返します。変更は例えば挿入、削除、テキスト整形などがあります。
var aString = inputEvent.inputType;- -
入力された入力種別を含む {{domxref("DOMString")}}。 insertText
, deleteContentBackward
, insertFromPaste
, formatBold
など、多くの値が考えられます。利用可能な入力種別の完全なリストは、Input Events Level 1 仕様の Attributes の章を参照してください。
この例は編集可能な {{htmlElement("div")}} の入力イベント の inputType
をログ出力します。
<p id="log">Input type: </p> -<div contenteditable="true" style="margin: 20px;padding: 20px;border:2px dashed red;"> - <p>Some sample text. Try inserting line breaks, or deleting text in different ways, or pasting different content in.</p> - <hr> - <ul> - <li>A sample</li> - <li>bulleted</li> - <li>list.</li> - </ul> - <p>Another paragraph.</p> -</div>- -
const log = document.getElementById('log'); -const editable = document.querySelector('div[contenteditable]'); -editable.addEventListener('input', logInputType); - -function logInputType(event) { - log.textContent = `Input type: ${event.inputType}`; -} -- -
Try editing the text inside the <div>
and see what happens.
{{EmbedLiveSample("Examples", '100%', 500)}}
- -注: もっと詳細な例として Masayuki Nakano's InputEvent test suite も参照してください。
-仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName('UI Events','#dom-inputevent-inputtype','inputType')}} | -{{Spec2('UI Events')}} | -- |
{{Compat("api.InputEvent.inputType")}}
diff --git a/files/ja/web/api/inputevent/inputtype/index.md b/files/ja/web/api/inputevent/inputtype/index.md new file mode 100644 index 00000000000000..8ecb62dbe3a892 --- /dev/null +++ b/files/ja/web/api/inputevent/inputtype/index.md @@ -0,0 +1,79 @@ +--- +title: InputEvent.inputType +slug: Web/API/InputEvent/inputType +tags: + - API + - DOM + - DOM Events + - Input + - InputEvent + - Property + - Reference + - events + - inputType + - プロパティ +translation_of: Web/API/InputEvent/inputType +--- +{{APIRef("DOM Events")}} + +**`inputType`** は {{domxref("InputEvent")}} インターフェイスの読取専用プロパティで、編集可能なコンテンツの変更が行われた種別を返します。変更は例えば挿入、削除、テキスト整形などがあります。 + +## 構文 + +``` +var aString = inputEvent.inputType; +``` + +### 値 + +入力された入力種別を含む {{domxref("DOMString")}}。 `insertText`, `deleteContentBackward`, `insertFromPaste`, `formatBold` など、多くの値が考えられます。利用可能な入力種別の完全なリストは、[Input Events Level 1 仕様の Attributes の章](https://rawgit.com/w3c/input-events/v1/index.html#interface-InputEvent-Attributes)を参照してください。 + +## 例 + +この例は編集可能な {{htmlElement("div")}} の[入力イベント](/ja/docs/Web/API/HTMLElement/input_event) の `inputType` をログ出力します。 + +### HTML + +```html +Input type:
+Some sample text. Try inserting line breaks, or deleting text in different ways, or pasting different content in.
+Another paragraph.
+歴史的に、Web API と密接に連携するウェブ用のスクリプトを作成することには、よく知られた課題がありました。 多くの場合、コードは、API が存在するかどうか、存在する場合は、それを実行している{{Glossary("user agent","ユーザーエージェント")}}の制限を知る必要があります。 これを理解するのは難しい場合が多く、通常、実行している{{Glossary("user agent","ユーザーエージェント")}}(またはブラウザー)とそのバージョンの組み合わせを調べ、特定のオブジェクトが存在するかどうかを確認したり、さまざまなものが機能するかどうかを確認したり、どのエラーが発生したかを判断したりする必要がありました。 その結果、非常に脆弱なコードが大量に発生するか、このような問題を解決するライブラリに依存したり、{{Glossary("polyfill", "ポリフィル")}}を実装して実装の穴にパッチを当てたりしました。
- -制約(constraints)と能力(capabilities)の双子の概念により、ブラウザーとウェブサイトまたはアプリは、ブラウザーの実装がサポートする制約可能なプロパティ(constrainable properties)と、それぞれに対してサポートする値に関する情報を交換できます。 この記事では、能力と制約およびメディアの設定について説明し、制約エクササイザー(Constraint Exerciser)と呼ばれる例を含みます。 制約エクササイザーを使用すると、コンピューターの A/V 入力デバイス(ウェブカメラやマイクなど)からの音声トラックと動画トラックに適用されるさまざまな制約セットの結果を試すことができます。
- -プロセスは次のように動作します(例として {{domxref("MediaStreamTrack")}} を使用)。
- -getCapabilities()
メソッドによって返されたオブジェクトを調べることにより、API とその実装の能力を確認できます。 このオブジェクトは、サポートしている各制約と、サポートしている値または値の範囲をリストします。applyConstraints()
メソッドを呼び出して、好みの制約可能なプロパティに使用する値または値の範囲を指定することにより、必要に応じて API を構成します。getConstraints()
メソッドは、applyConstraints()
の最新の呼び出しに渡された制約セットを返します。 これは、要求された値を調整する必要があるプロパティと、プラットフォームのデフォルト値が表されていないため、トラックの実際の現在の状態を表していない場合があります。 トラックの現在の構成を完全に表現するには、getSettings()
を使用します。Media Stream API では、{{domxref("MediaStream")}} と {{domxref("MediaStreamTrack")}} の両方に制約可能なプロパティがあります。
- -特定の制約をユーザーエージェントがサポートしているかどうかを知る必要がある場合は、次のように {{domxref("MediaDevices.getSupportedConstraints", "navigator.mediaDevices.getSupportedConstraints()")}} を呼び出して、ブラウザーが知っている制約可能なプロパティのリストを取得します。
- -let supported = navigator.mediaDevices.getSupportedConstraints(); - -document.getElementById("frameRateSlider").disabled = !supported["frameRate"];- -
この例では、サポートしている制約を取得し、frameRate
制約をサポートしていない場合、ユーザーがフレームレートを構成できるコントロールを無効にします。
単一の制約は、目的の値または値の範囲が指定されている制約可能なプロパティと名前が一致するオブジェクトです。 このオブジェクトには、0 個以上の個別の制約と、advanced
というオプションのサブオブジェクトが含まれます。 このサブオブジェクトには、ユーザーエージェントが可能な限り満たす必要がある 0 個以上の制約の別のセットが含まれます。 ユーザーエージェントは、制約セットで指定された順序で制約を満たすことを試みます。
理解すべき最も重要なことは、ほとんどの制約は必要条件ではないということです。 それよりむしろ、それらは要求です。 例外があり、すぐにそれらに到達します。
- -最も簡単には、各制約は、設定に必要な値を示す特定の値である場合があります。 例えば、次のようにです。
- -let constraints = { - width: 1920, - height: 1080, - aspectRatio: 1.777777778 -}; - -myTrack.applyConstraints(constraints);- -
この場合、制約は、ほぼすべてのプロパティで任意の値が適切であることを示しますが、標準の 16:9 アスペクト比で標準の高解像度(HD)動画サイズが望ましいことを示します。 結果のトラックがこれらのいずれかに一致するという保証はありませんが、ユーザーエージェントは可能な限り一致するように最善を尽くす必要があります。
- -プロパティの優先順位付けは簡単です。 2つのプロパティの要求値が相互に排他的である場合、制約セットの最初にリストされている値を使用します。 例として、上記のコードを実行しているブラウザーは 1920x1080 のトラックを提供できないが、1920x900 を提供できる場合、それを提供します。
- -単一の値を指定するこれらのような単純な制約は、常に必須でないものとして扱われます。 ユーザーエージェントは、あなたが要求したものを提供しようとしますが、あなたが得るものが一致することを保証しません。 しかしながら、{{domxref("MediaStreamTrack.applyConstraints()")}} を呼び出すときにプロパティに単純な値を使用すると、これらの値は必要条件ではなく要求と見なされるため、要求は常に成功します。
- -場合によっては、範囲内の任意の値がプロパティの値として受け入れられることがあります。 範囲は、最小値(min
)と最大値(max
)のいずれかまたは両方を指定でき、必要に応じて範囲内で理想的な値(ideal
)を最終結果として指定できます。 理想的な値を指定すると、ブラウザーは、指定された他の制約に応じて、その値にできるだけ一致するように近づけようとします。
let supports = navigator.mediaDevices.getSupportedConstraints(); - -if (!supports["width"] || !supports["height"] || !supports["frameRate"] || !supports["facingMode"]) { - // 必要なプロパティが不足しているため、そのエラーを処理します。 -} else { - let constraints = { - width: { min: 640, ideal: 1920, max: 1920 }, - height: { min: 400, ideal: 1080 }, - aspectRatio: 1.777777778, - frameRate: { max: 30 }, - facingMode: { exact: "user" } - }; - - myTrack.applyConstraints(constraints).then(function() => { - /* 制約が正常に適用されたら何かをする */ - }).catch(function(reason) { - /* 制約を適用できませんでした。 reason が理由 */ - }); -} -- -
ここでは、一致を見つける必要のある制約可能なプロパティ(width
、height
、frameRate
、facingMode
)がサポートされていることを確認した後、幅は 640 以上 1920 以下(できれば 1920)、高さは 400 以上(理想的には 1080)、アスペクト比は 16:9(1.777777778)、フレームレートは 30 フレーム/秒以下を要求する制約を設定します。 さらに、唯一の許容可能な入力デバイスは、ユーザーに面したカメラ(自撮りカメラ)です。 width
、height
、frameRate
、または facingMode
の制約が満たされない場合、applyConstraints()
によって返された promise は拒否されます。
max
、min
、exact
のいずれかまたはすべてを使用して指定された制約は、常に必須として扱われます。 applyConstraints()
を呼び出して、使用する制約を1つ以上を満たすことができない場合、promise は拒否されます。
advanced
プロパティを制約セットに追加すると、いわゆる高度な制約が作成されます。 このプロパティの値は、オプションと見なされる追加の制約セットの配列です。 この機能のユースケースはほとんどなく、仕様から取り除くことに関心があるため、ここでは説明しません。 詳細については、Media Capture and Streams 仕様のセクション 11、過去の例 2 を参照してください。
{{domxref("MediaStreamTrack.getCapabilities()")}} を呼び出して、サポートしているすべての能力と、そのそれぞれが現在のプラットフォームとユーザーエージェントで受け入れられる値または値の範囲のリストを取得できます。 この関数は、ブラウザーがサポートしている各制約可能なプロパティと、それらのプロパティのそれぞれがサポートしている値または値の範囲をリストする {{domxref("MediaTrackCapabilities")}} オブジェクトを返します。
- -注: getCapabilities()
は、まだすべての主要なブラウザーで実装されていません。 とりあえず、あなたは必要なものを手に入れようとする必要があり、もしそれができなければ、その時点で何をすべきかを決定します。 例えば、{{bug(1179084)}} を参照してください。
制約を使用する最初の最も一般的な方法は、次のように {{domxref("MediaDevices.getUserMedia", "getUserMedia()")}} を呼び出すときに制約を指定することです。
- -navigator.mediaDevices.getUserMedia({ - video: { - width: { min: 640, ideal: 1920 }, - height: { min: 400, ideal: 1080 }, - aspectRatio: { ideal: 1.7777777778 } - }, - audio: { - sampleSize: 16, - channelCount: 2 - } -}).then(stream => { - videoElement.srcObject = stream; -}).catch(handleError); -- -
この例では、getUserMedia()
の時点で制約が適用され、動画のためのフォールバックを備えた理想的なオプションのセットが要求されます。
1つ以上のメディア入力デバイス ID を指定して、入力ソースが許可される制限を設定できます。 利用可能なデバイスのリストを収集するには、{{domxref("MediaDevices.enumerateDevices", "navigator.mediaDevices.enumerateDevices()")}} を呼び出してから、目的の条件を満たす各デバイスに対して、その deviceId
を MediaConstraints
オブジェクトに追加して、最終的に getUserMedia()
に渡します。
次のようにトラックの {{domxref("MediaStreamTrack.applyConstraints", "applyConstraints()")}} メソッドを呼び出し、トラックに適用する制約を表すオブジェクトを渡すことで、既存の {{domxref("MediaStreamTrack")}} の制約を臨機応変に変更することもできます。
- -videoTrack.applyConstraints({ - width: 1920, - height: 1080 -}); -- -
このスニペットでは、videoTrack
が参照する動画トラックが更新され、その解像度が可能な限り 1920x1080 ピクセル(1080p 高解像度)に一致するようになります。
制約と設定(settings)の違いを覚えておくことは重要です。 制約は、({{domxref("MediaTrackConstraints")}} のドキュメントで説明されているように)さまざまな制約可能なプロパティに必要な値、希望する値、および受け入れる値を指定する方法です。 一方、設定は現在の各制約可能なプロパティの実際の値です。
- -現在メディアに適用されている制約セットを取得する必要がある場合は、次の例に示すように、{{domxref("MediaStreamTrack.getConstraints()")}} を呼び出すことでその情報を取得できます。
- -function switchCameras(track, camera) { - let constraints = track.getConstraints(); - constraints.facingMode = camera; - track.applyConstraints(constraints); -}- -
この関数は、{{domxref("MediaStreamTrack")}} と使用するカメラに面するモードを示す文字列を受け入れ、現在の制約を取得し、{{domxref("MediaTrackConstraints.facingMode")}} の値を指定された値に設定し、更新された制約セットを適用します。
- -厳密な制約(exact
)のみを使用しない限り(これは非常に制限的ですので、それの意味することを確認してください!)、制約が適用された後に実際に何が得られるかを保証するものではありません。 結果のメディアに実際に存在する制約可能なプロパティの値は、設定と呼ばれます。 メディアの実際の形式やその他のプロパティを知る必要がある場合は、{{domxref("MediaStreamTrack.getSettings()")}} を呼び出してこれらの設定を取得できます。 これは、ディクショナリ {{domxref("MediaTrackSettings")}} に基づくオブジェクトを返します。 例えば次のようにです。
function whichCamera(track) { - return track.getSettings().facingMode; -}- -
この関数は、getSettings()
を使用して、トラックの制約可能なプロパティの現在使用中の値を取得し、{{domxref("MediaTrackSettings.facingMode", "facingMode")}} の値を返します。
この例では、音声トラックと動画トラックの制約セットを記述するソースコードを編集して、メディアの制約を試すことができるエクササイザーを作成します。 その後、これらの変更を適用して、ストリームの外観や、新しい制約を適用した後の実際のメディア設定の両方を含む結果を確認できます。
- -この例の HTML と CSS は非常に単純であり、ここには示されていません。 {{LiveSampleLink("Example_Constraint_exerciser", "ここをクリックする")}}と、完全な例を見ることができます。
- -<p>メディアの制約を試してください! 左側の編集ボックスで動画トラックと音声トラックの制約セットを編集し、[制約の適用] ボタンをクリックして試してください。 ブラウザーが選択して使用している実際の設定は、右側のボックスに表示されます。 そのすべての下に、動画自体が表示されます。 -</p> -<p>[動画の開始] ボタンをクリックして開始します。</p> - -<h3>使用できる制約可能なプロパティ:</h3> -<ul id="supportedConstraints"> -</ul> -<div id="startButton" class="button"> - 動画の開始 -</div> -<div class="wrapper"> - <div class="leftside"> - <h3>要求した動画の制約:</h3> - <textarea id="videoConstraintEditor" cols=32 rows=8></textarea> - </div> - <div class="rightside"> - <h3>実際の動画の設定:</h3> - <textarea id="videoSettingsText" cols=32 rows=8 disabled></textarea> - </div> - <div class="leftside"> - <h3>要求した音声の制約:</h3> - <textarea id="audioConstraintEditor" cols=32 rows=8></textarea> - </div> - <div class="rightside"> - <h3>実際の音声の設定:</h3> - <textarea id="audioSettingsText" cols=32 rows=8 disabled></textarea> - </div> -</div> - -<div class="button" id="applyButton"> - 制約の適用 -</div> -<video id="video" autoplay></video> - -<div class="button" id="stopButton"> - 動画の停止 -</div> - -<div id="log"> -</div>- -
body { - font: 14px "Open Sans", "Arial", sans-serif; -} - -video { - margin-top: 20px; - border: 1px solid black; -} - -.button { - cursor: pointer; - width: 150px; - border: 1px solid black; - font-size: 16px; - text-align: center; - padding-top: 3px; - padding-bottom: 2px; - color: white; - background-color: darkgreen; -} - -.wrapper { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 10px; - gap: 10px; - max-width: min-content; - margin-bottom: 10px; -} - -textarea { - width : 270px; - padding: 8px; -} - -h3 { - margin-bottom: 3px; -} - -#supportedConstraints { - column-count: 2; - -moz-column-count: 2; -} - -#log { - padding-top: 10px; -}- -
Now let's take a look at the JavaScript code that makes everything work.
-最初に、文字列としてデフォルトの制約セットがあります。 これらの文字列は編集可能な {{HTMLElement("textarea")}} に表示されますが、これはストリームの初期構成です。
- -let videoDefaultConstraintString = '{\n "width": 320,\n "height": 240,\n "frameRate": 30\n}'; -let audioDefaultConstraintString = '{\n "sampleSize": 16,\n "channelCount": 2,\n "echoCancellation": false\n}'; -- -
これらのデフォルトは、かなり一般的なカメラ構成を要求しますが、特に重要なプロパティであることを主張しません。 ブラウザーは、これらの設定に一致するように最善を尽くす必要がありますが、近い一致と見なされるものなら何でもそれで解決します。
- -次に、動画トラックおよび音声トラックの {{domxref("MediaTrackConstraints")}} オブジェクトを保持する変数と、動画トラックおよび音声トラック自体への参照を保持する変数を null
に初期化します。
let videoConstraints = null; -let audioConstraints = null; - -let audioTrack = null; -let videoTrack = null; -- -
そして、アクセスする必要のあるすべての要素への参照を取得します。
- -let videoElement = document.getElementById("video"); -let logElement = document.getElementById("log"); -let supportedConstraintList = document.getElementById("supportedConstraints"); -let videoConstraintEditor = document.getElementById("videoConstraintEditor"); -let audioConstraintEditor = document.getElementById("audioConstraintEditor"); -let videoSettingsText = document.getElementById("videoSettingsText"); -let audioSettingsText = document.getElementById("audioSettingsText"); -- -
これらの要素は次のとおりです。
- -videoElement
logElement
supportedConstraintList
videoConstraintEditor
audioConstraintEditor
videoSettingsText
disabled
)。audioSettingsText
disabled
)。最後に、2つの制約セットエディター要素の現在の内容をデフォルトに設定します。
- -videoConstraintEditor.value = videoDefaultConstraintString; -audioConstraintEditor.value = audioDefaultConstraintString;- -
各制約セットエディターの右側には、トラックの構成可能なプロパティの現在の構成を表示するために使用する2番目のテキストボックスがあります。 この表示を関数 getCurrentSettings()
で更新します。 この関数は、音声トラックと動画トラックの現在の設定を取得し、{{htmlattrxref("value", "textarea")}} を設定することで対応するコードをトラックの設定表示ボックスに挿入します。
function getCurrentSettings() { - if (videoTrack) { - videoSettingsText.value = JSON.stringify(videoTrack.getSettings(), null, 2); - } - if (audioTrack) { - audioSettingsText.value = JSON.stringify(audioTrack.getSettings(), null, 2); - } -} -- -
これは、以下に示すように、更新した制約を適用するときだけでなく、ストリームの最初の起動後にも呼び出されます。
- -buildConstraints()
関数は、2つのトラックの制約セット編集ボックス内のコードを使用して、音声トラックと動画トラックの {{domxref("MediaTrackConstraints")}} オブジェクトを構築します。
function buildConstraints() { - try { - videoConstraints = JSON.parse(videoConstraintEditor.value); - audioConstraints = JSON.parse(audioConstraintEditor.value); - } catch(error) { - handleError(error); - } -} -- -
これは {{jsxref("JSON.parse()")}} を使用して、各エディター内のコードをオブジェクトに解析します。 JSON.parse()
の呼び出しのどちらかが例外をスローした場合、handleError()
が呼び出されてエラーメッセージがログに出力されます。
startVideo()
メソッドは、動画ストリームのセットアップと開始を処理します。
function startVideo() { - buildConstraints(); - navigator.mediaDevices.getUserMedia({ - video: videoConstraints, - audio: audioConstraints - }).then(function(stream) { - let audioTracks = stream.getAudioTracks(); - let videoTracks = stream.getVideoTracks(); - - videoElement.srcObject = stream; - if (audioTracks.length) { - audioTrack = audioTracks[0]; - } - if (videoTracks.length) { - videoTrack = videoTracks[0]; - } - }).then(function() { - new Promise(function(resolve) { - videoElement.onloadedmetadata = resolve; - }); - }).then(function() { - getCurrentSettings(); - }).catch(handleError); -} -- -
ここには、次のようないくつかの手順があります。
- -buildConstraints()
を呼び出して、編集ボックス内のコードから2つのトラックの {{domxref("MediaTrackConstraints")}} オブジェクトを作成します。audioTrack
と videoTrack
に取り込みます。getCurrentSettings()
関数(上記を参照)を呼び出して、制約とハードウェアの能力を考慮した後にブラウザーが決定した実際の設定を表示します。handleError()
メソッドを使用してログに記録します。また、[動画の開始] ボタンがクリックされるのを監視するイベントリスナーを設定する必要があります。
- -document.getElementById("startButton").addEventListener("click", function() { - startVideo(); -}, false); -- -
次に、[制約の適用] ボタンのイベントリスナーを設定します。 クリックされ、まだ使用中のメディアがない場合は、startVideo()
を呼び出し、指定された設定でストリームを開始する機能をその関数に処理させます。 それ以外の場合は、次の手順に従って、更新済みの制約を既にアクティブなストリームに適用します。
buildConstraints()
を、音声トラック(audioConstraints
)および動画トラック(videoConstraints
)の更新された {{domxref("MediaTrackConstraints")}} オブジェクトを構築するために呼び出します。videoConstraints
を適用するために動画トラック(存在する場合)で呼び出します。 これが成功したら、動画トラックの現在の設定ボックスの内容を、{{domxref("MediaStreamTrack.getSettings", "getSettings()")}} メソッドを呼び出した結果に基づいて更新します。applyConstraints()
を音声トラック(存在する場合)で呼び出します。 これが成功したら、音声トラックの現在の設定ボックスの内容を、{{domxref("MediaStreamTrack.getSettings", "getSettings()")}} メソッドを呼び出した結果に基づいて更新しす。handleError()
を使用してメッセージをログに出力します。document.getElementById("applyButton").addEventListener("click", function() { - if (!videoTrack && !audioTrack) { - startVideo(); - } else { - buildConstraints(); - if (videoTrack) { - videoTrack.applyConstraints(videoConstraints).then(function() { - videoSettingsText.value = JSON.stringify(videoTrack.getSettings(), null, 2); - }).catch(handleError); - } - - if (audioTrack) { - audioTrack.applyConstraints(audioConstraints).then(function() { - audioSettingsText.value = JSON.stringify(audioTrack.getSettings(), null, 2); - }).catch(handleError); - } - } -}, false); -- -
次に、[動画の停止] ボタンのハンドラーを設定します。
- -document.getElementById("stopButton").addEventListener("click", function() { - if (videoTrack) { - videoTrack.stop(); - } - if (audioTrack) { - audioTrack.stop(); - } - - videoTrack = audioTrack = null; - videoElement.srcObject = null; -}); -- -
これは単にアクティブなトラックを停止し、videoTrack
変数と audioTrack
変数を null
に設定してそれらがなくなったことがわかるようにし、{{domxref("HTMLMediaElement.srcObject")}} を null
に設定して {{HTMLElement("video")}} 要素からストリームを取り除きます。
このコードは、いずれかの制約編集ボックスがフォーカスされているときに tab キーで2つのスペース文字を挿入することにより、{{HTMLElement("textarea")}} 要素に tab の単純なサポートを追加します。
- -function keyDownHandler(event) { - if (event.key == "Tab") { - let elem = event.target; - let str = elem.value; - - let position = elem.selectionStart; - let newStr = str.substring(0, position) + " " + - str.substring(position, str.length); - elem.value = newStr; - elem.selectionStart = elem.selectionEnd = position + 2; - event.preventDefault(); - } -} - -videoConstraintEditor.addEventListener("keydown", keyDownHandler, false); -audioConstraintEditor.addEventListener("keydown", keyDownHandler, false); -- -
パズルの最後の重要な部分: ユーザーの参照用に、ブラウザーがサポートする制約可能なプロパティのリストを表示するコード。 各プロパティは、ユーザーの利便性のために MDN のドキュメントへのリンクです。 このコードの動作の詳細については、MediaDevices.getSupportedConstraints()
の例を参照してください。
もちろん、このリストには非標準のプロパティが含まれている場合があります。 その場合、ドキュメントのリンクはあまり役に立たないでしょう。
-let supportedConstraints = navigator.mediaDevices.getSupportedConstraints(); -for (let constraint in supportedConstraints) { - if (supportedConstraints.hasOwnProperty(constraint)) { - let elem = document.createElement("li"); - - elem.innerHTML = "<code><a href='https://developer.mozilla.org/docs/Web/API/MediaTrackSupportedConstraints/" - .concat(constraint) + "' target='_blank'>" + constraint + "</a></code>"; - supportedConstraintList.appendChild(elem); - } -} -- -
また、いくつかの簡単なエラー処理コードがあります。 handleError()
は失敗したプロミスを処理するために呼び出され、log()
関数は動画の下の特別なロギング {{HTMLElement("div")}} ボックスにエラーメッセージを追加します。
function log(msg) { - logElement.innerHTML += (msg + "<br>"); -} - -function handleError(reason) { - log("Error <code>" + reason.name + - "</code> in constraint <code>" + reason.constraint + - "</code>: " + reason.message); -}- -
ここで、実際の完全な例を見ることができます。
- -{{EmbedLiveSample("Example_Constraint_exerciser", 650, 800, "", "", "", "microphone; camera")}}
- -仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName('Media Capture', '#constrainable-interface', 'Constrainable pattern')}} | -{{Spec2('Media Capture')}} | -初期定義 | -
MediaDevices.getSupportedConstraints
{{Compat("api.MediaDevices.getSupportedConstraints")}}
-メディアの制約を試してください! 左側の編集ボックスで動画トラックと音声トラックの制約セットを編集し、[制約の適用] ボタンをクリックして試してください。 ブラウザーが選択して使用している実際の設定は、右側のボックスに表示されます。 そのすべての下に、動画自体が表示されます。 +
+[動画の開始] ボタンをクリックして開始します。
+ +" + constraint + "
";
+ supportedConstraintList.appendChild(elem);
+ }
+}
+```
+
+#### エラー処理
+
+また、いくつかの簡単なエラー処理コードがあります。 `handleError()` は失敗したプロミスを処理するために呼び出され、`log()` 関数は動画の下の特別なロギング {{HTMLElement("div")}} ボックスにエラーメッセージを追加します。
+
+```js
+function log(msg) {
+ logElement.innerHTML += (msg + "" + reason.name +
+ "
in constraint " + reason.constraint +
+ "
: " + reason.message);
+}
+```
+
+### 結果
+
+ここで、実際の完全な例を見ることができます。
+
+{{EmbedLiveSample("Example_Constraint_exerciser", 650, 800, "", "", "", "microphone; camera")}}
+
+## 仕様
+
+| 仕様 | 状態 | コメント |
+| ------------------------------------------------------------------------------------------------------------ | ------------------------------------ | -------- |
+| {{SpecName('Media Capture', '#constrainable-interface', 'Constrainable pattern')}} | {{Spec2('Media Capture')}} | 初期定義 |
+
+## ブラウザーの互換性
+
+### `MediaDevices.getSupportedConstraints`
+
+{{Compat("api.MediaDevices.getSupportedConstraints")}}
+
+## 関連情報
+
+- [Media Capture and Streams API](/ja/docs/Web/API/Media_Streams_API)
+- {{domxref("MediaTrackCapabilities")}}
+- {{domxref("MediaTrackConstraints")}}
+- {{domxref("MediaTrackSettings")}}
+- {{domxref("MediaDevices.getSupportedConstraints()")}}
+- {{domxref("MediaStreamTrack.applyConstraints()")}}
+- {{domxref("MediaStreamTrack.getSettings()")}}
diff --git a/files/ja/web/api/media_capture_and_streams_api/index.html b/files/ja/web/api/media_capture_and_streams_api/index.html
deleted file mode 100644
index b5e45366e107a9..00000000000000
--- a/files/ja/web/api/media_capture_and_streams_api/index.html
+++ /dev/null
@@ -1,75 +0,0 @@
----
-title: Media Capture and Streams API (Media Streams)
-slug: Web/API/Media_Capture_and_Streams_API
-tags:
- - API
- - Advanced
- - Audio
- - Guide
- - Introduction
- - Media
- - Media Capture and Streams API
- - Media Streams API
- - NeedsContent
- - Video
-translation_of: Web/API/Media_Streams_API
-original_slug: Web/API/Media_Streams_API
----
-Media Capture and Streams APIは一般的にMedia Stream APIやStream APIと呼ばれるWebRTCに関連したAPIです。このAPIでは、オーディオやビデオデータのストリーム、これらを操作するためのメソッド、データタイプに関連づけられた制約、データを非同期に利用する際の成功と失敗のコールバック、これらの処理を行なっている最中に発生するイベントなどをサポートします。
- -このAPIは、オーディオまたはビデオに関連づけられたデータの流れを表現するための{{domxref("MediaStream")}}オブジェクトの操作を基本としています。例としてGet the video(英語)をご覧ください。
- -MediaStream
は0個以上の{{domxref("MediaStreamTrack")}}によって構成されます。MediaStreamTrack
は様々なオーディオやビデオのトラックを表現します。それぞれのMediaStreamTrack
は、1つ以上のチャンネルを持ちます。このチャンネルはメディアストリームの最小の単位を表現します。例えば、ステレオのオーディオトラックのleftとrightのチャンネルのそれぞれのように、与えられたスピーカーに関連づけられたオーディオ信号です。
MediaStream
オブジェクトは、1つの入力と1つの出力を持ちます。MediaStream
オブジェクトは、ローカルで呼び出される{{domxref("MediaDevices.getUserMedia", "getUserMedia()")}}によって生成され、ユーザーのカメラやマイクの1つを入力ソースとして持ちます。ローカルでないMediaStream
は、{{HTMLElement("video")}}や{{HTMLElement("audio")}}などのメディア要素や、WebRTC {{domxref("RTCPeerConnection")}} APIによって取得できるネットワーク越しに生成されたストリーム、Web Audio API {{domxref("MediaStreamAudioSourceNode")}}によって作成されたストリームとして表現されます。MediaStream
オブジェクトの出力はコンシューマ(consumer)に接続されます。出力として{{HTMLElement("audio")}}や{{HTMLElement("video")}}などのメディア要素、WebRTC {{domxref("RTCPeerConnection")}} API、Web Audio API {{domxref("MediaStreamAudioDestinationNode")}}が使用できます。
- -
{{LandingPageListSubpages}}
- -{{Compat("api.MediaStream")}}
- -getUserMedia()
を用いたデモとチュートリアル{{DefaultAPISidebar("Media Source Extensions")}}
- -Media Source Extensions API(MSE、メディアソース拡張機能 API)は、プラグイン不要で Web ベースのストリーミングメディアを可能にする機能を提供します。 MSE を使用すると、メディアストリームを JavaScript で作成し、{{htmlelement("audio")}} 要素 や {{htmlelement("video")}} 要素で再生できます。
- -動画と音声の再生は、Web アプリにおいて、ここ数年間でプラグイン不要で利用可能になりましたが、提供される基本的な機能は、単一トラック全体を再生する場合にのみ有効でした。 例えば、配列バッファを結合/分割することはできません。 RTMP プロトコルを使用して動画ストリームを提供する Flash Media Server などの技術により、ストリーミングメディアは最近まで Flash の領分でした。
- -Media Source Extensions(MSE)により、これは変化しています。 MSE を使用すると、メディア要素に渡す通常の単一トラックの src
値を MediaSource
オブジェクトへの参照で置き換えることができます。 MediaSource
オブジェクトは、再生するメディアの準備状態などの情報のコンテナであり、ストリーム全体を構成するメディアの異なるチャンク(大きな塊)を表す複数の SourceBuffer
オブジェクトへの参照です。 MSE を使用すると、コンテンツを取得する量と頻度をよりきめ細かく制御でき、バッファを削除するタイミングなど、メモリ使用量の詳細をある程度制御できます。 拡張可能な API 上に構築される適応的ビットレートストリーミングクライアント(DASH や HLS を使用するクライアントなど)の基礎を築きます。
最新のブラウザーで MSE で動作するアセット(asset、静的コンテンツ)を作成するのは面倒なプロセスであり、かなりの時間、計算能力、エネルギーのすべてを必要とします。 コンテンツを適切な形式にもみほぐす外部ユーティリティの使用が必要です。 MSE を使用したさまざまなメディアコンテナのブラウザーサポートは不完全ですが、H.264 動画コーデック、AAC 音声コーデック、および MP4 コンテナ形式の使用が一般的なベースラインです。 MSE は、コンテナおよびコーデックのサポートの実行時検出用の API も提供します。
- -時間経過に伴う動画品質、コンテンツの取得速度、またはメモリの削除速度を明示的に制御する必要がない場合は、{{htmlelement("video")}} タグと {{htmlelement("source")}} タグが簡単で適切な解決策になる可能性があります。
- -Dynamic Adaptive Streaming over HTTP(DASH、HTTP を介した動的適応的ストリーミング)は、適応的コンテンツの取得方法を指定するためのプロトコルです。 これは、効率的に適応的ビットレートストリーミングクライアントを構築するために MSE の上に構築されたレイヤーです。 HTTP Live Streaming(HLS、HTTP ライブストリーミング)といった他のプロトコルを使用できますが、DASH はほとんどのプラットフォームをサポートしています。
- -DASH は、多くのロジックをネットワークプロトコルからクライアント側アプリのロジックに移動し、より単純な HTTP プロトコルを使用してファイルを取得します。 実際、単純な静的ファイルサーバーで DASH をサポートでき、{{glossary("CDN")}} にも最適です。 これは、独自で非標準のクライアント/サーバープロトコルの実装に高価なライセンスを必要とした従来のストリーミングの解決策とは正反対です。
- -DASH の2つの最も一般的な使用例では、コンテンツを「オンデマンド」または「ライブ」で視聴します。 オンデマンドでは、開発者が時間をかけてアセットをさまざまな品質の複数の解像度にトランスコード(transcoding)できます。
- -ライブプロファイルのコンテンツは、トランスコードとブロードキャストのために遅延を引き起こす可能性があるため、DASH は WebRTC のようなリアルタイム通信には適していません。 ただし、WebRTC よりもかなり多くのクライアント接続をサポートできます。
- -コンテンツをトランスコードし、DASH、DASH ファイルサーバー、および JavaScript で記述された DASH クライアントライブラリで使用する準備を行うための、無料でオープンソースのツールが多数あります。
- -MediaSource
オブジェクトを介して {{domxref("HTMLMediaElement")}} に渡されるメディアのチャンクを表します。SourceBuffer
オブジェクトの単純なコンテナリスト。TrackDefault
オブジェクトの単純なコンテナリスト。MediaSource
オブジェクトを指すオブジェクト URL を作成します。 このオブジェクトは、メディアストリームを再生する HTML メディア要素の src
値として指定できます。MediaSource
オブジェクトが HTML メディア要素によって再生されると、このプロパティは、ユーザーがシークできる時間範囲を含む {{domxref("TimeRanges")}} オブジェクトを返します。仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName('Media Source Extensions')}} | -{{Spec2('Media Source Extensions')}} | -初期定義 | -
{{Compat("api.MediaSource", 0)}}
-Media Source Extensions を使用する場合、アセットをストリーミングする前に調整する必要がある可能性があります。 この記事では、要件を説明し、アセットを適切にエンコードするために使用できるツールチェーンを示します。
- -以下では、これらのすべての手順を説明しますが、最初にこれをかなり簡単に行うために使用できるツールチェーンを見てみましょう。
- -ここにリストされている手順を実行したいが、実験するメディアがない場合は、Big Buck Bunny の予告編 [0] をここで入手できます。 Big Buck Bunny は、Creative Commons Attribution 3.0 ライセンスの下でライセンスされています。 このチュートリアル全体を通して、ダウンロードしたファイル名 trailer_1080p.mov
を参照します。
[0] (c) Copyright 2008, Blender Foundation / www.bigbuckbunny.org / https://peach.blender.org/about/
- -MSE を使用する場合、次のツールが必要です。
- -bin
ディレクトリの内容を ffmpeg と同じ場所に入れておきます。次のステップに進む前に、これらを正常にインストールしてください。
- -サンプルメディアは、Bento4 の utils
ディレクトリに入れておき、ここで作業します。
注: 構築済みの ffmpeg には、ライセンスの関係で libfdk_aac が組み込まれていません。 これを Bento4 がデフォルトで使うので、必要なら、ffmpeg をコンパイルする必要があります。 必要なければ、mp4-dash-encode.py
のコマンドラインに --audio-codec=aac
を追加してください。
MSE 仕様のセクション1.1: Goals で指定されているように、MSE は特定のメディア形式またはコーデックのサポートを必要としないように設計されています。 これは紙の上では事実ですが、ブラウザーのサポートは特定のコンテナ/コーデックの組み合わせによって異なります。
- -ブラウザーが特定のコンテナをサポートしているかどうかを確認するには、次のように MIME タイプの文字列を {{domxref("MediaSource.isTypeSupported")}} メソッドに渡します。
- -MediaSource.isTypeSupported('audio/mp3'); // false -MediaSource.isTypeSupported('video/mp4'); // true -MediaSource.isTypeSupported('video/mp4; codecs="avc1.4D4028, mp4a.40.2"'); // true- -
文字列はコンテナの MIME タイプであり、オプションでコーデックのリストが続きます。 MIME タイプは簡単に把握できますが、mp4info ユーティリティを使用してコーデック文字列を取得できます。
- -現在、H.264 動画コーデックと AAC 音声コーデックを備えた MP4 コンテナは、すべての最新ブラウザーでサポートされていますが、他のブラウザーではサポートされていません。
- -サンプルメディアを QuickTime MOV コンテナから MP4 コンテナに変換するには、ffmpeg を使用できます。 MOV コンテナの音声コーデックは既に AAC であり、動画コーデックは H.264 であるため、トランスコードを実行しないように ffmpeg に指示できます。 代わりに、トランスコードを実行せずに音声トラックと動画トラックをコピーするだけです。 これは、トランスコードするよりも比較的高速です。
- -$ ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy bunny.mp4 -$ ls -bunny.mp4 trailer_1080p.mov- -
MP4 を適切にストリーミングするには、アセットが ISO BMF 形式の MP4 である必要があります。 適切な断片化がなければ、特定の MP4 ファイルは MSE での動作が保証されません。 これは、コンテナ内にメタデータが分散され、まとめられていないことを意味します。
- -MP4 ファイルが適切な MP4 ストリームであるかどうかを確認するには、mp4info ユーティリティを再度使用して MP4 のアトムを一覧表示できます。
- -注: 断片化されたバージョンは、追加のメタデータがファイル全体に広がるため、元のバージョンよりわずかに大きくなります。 これは通常、ファイルサイズの 1% 以下の増加です。
-まだ MP4 ではないアセットがある場合、ffmpeg は次のように -movflags frag_keyframe+empty_moov
コマンドラインフラグを使用して、トランスコードプロセス中に適切に断片化された MP4 の発行を処理できます。
$ ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy -movflags frag_keyframe+empty_moov bunny_fragmented.mp4- -
すでに MP4 を持っているが、適切に断片化されていない場合は、ffmpeg を改めて使用できます。
- -$ ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4 -- -
どちらの場合でも、Chrome は次の追加のムービーフラグを設定する必要がある場合があります。
- --movflags frag_keyframe+empty_moov+default_base_moof- -
適切に断片化された MP4 ファイルを用意するだけで開始できます。 適応的ビットレートストリーミングを使用する場合は、複数の解像度でエンコードを作成する必要があります。 MSE は柔軟に実装できるほど柔軟性がありますが、DASH は明確に指定されたアプリケーションプロトコルであるため、既存の DASH クライアントを使用することを強くお勧めします。
- -$PATH を介して ffmpeg と Bento4 のユーティリティにアクセスできる場合、Bento4 の mp4-dash-encode.py
Python スクリプトを実行して、さまざまな解像度でコンテンツの複数のエンコーディングを生成できます。 Bento4 の mp4-dash.py
Python スクリプトを使用して、クライアントが必要とする対応する MPD ファイルを生成できます。
次のコマンドを実行します(サンプル出力付き)。
- -$ python mp4-dash-encode.py -b 5 -v bunny_fragmented.mp4 -Encoding 5 bitrates, min bitrate = 500.0 max bitrate = 2000.0 -Media Source: Video: resolution=640x360 -ENCODING bitrate: 500, resolution: 256x144 -ENCODING bitrate: 875, resolution: 384x216 -ENCODING bitrate: 1250, resolution: 480x270 -ENCODING bitrate: 1625, resolution: 560x316 -ENCODING bitrate: 2000, resolution: 640x360 - -$ python mp4-dash.py video_0* -Parsing media file 1: video_00500.mp4 -Parsing media file 2: video_00875.mp4 -Parsing media file 3: video_01250.mp4 -Parsing media file 4: video_01625.mp4 -Parsing media file 5: video_02000.mp4 -Splitting media file (audio) video_00500.mp4 -Splitting media file (video) video_00500.mp4 -Splitting media file (video) video_00875.mp4 -Splitting media file (video) video_01250.mp4 -Splitting media file (video) video_01625.mp4 -Splitting media file (video) video_02000.mp4 - -$ tree -L 2 output -output -├── audio -│ └── und -├── stream.mpd -└── video - ├── 1 - ├── 2 - ├── 3 - ├── 4 - └── 5 - -8 directories, 1 file- -
注: mp4-dash-encode.py
は、ffmpeg のエラーメッセージを表示しないようにしています。 -d
オプションを指定することで、それを見ることができます。
注: エラーメッセージとして "Invalid duration specification for force_key_frames: 'expr:eq(mod(n"
が表示されたら、mp4-dash-encode.py
を修正して "-force_key_frames 'expr:eq(mod(n,%d),0)'"
から "'"
を2つ取り除きます。
動画が適切にエンコードされ、適応的ビットレートメディアが生成されると、DASH と MSE を使用して Web で適応的ビットレートストリーミングを開始する準備が整いました。
diff --git a/files/ja/web/api/media_source_extensions_api/transcoding_assets_for_mse/index.md b/files/ja/web/api/media_source_extensions_api/transcoding_assets_for_mse/index.md new file mode 100644 index 00000000000000..c0e8885967f3f9 --- /dev/null +++ b/files/ja/web/api/media_source_extensions_api/transcoding_assets_for_mse/index.md @@ -0,0 +1,147 @@ +--- +title: Media Source Extensions のためのアセットのトランスコード +slug: Web/API/Media_Source_Extensions_API/Transcoding_assets_for_MSE +tags: + - DASH + - Dynamic Adaptive Streaming over HTTP + - Encoding + - MSE + - Media Source Extensions + - adaptive +translation_of: Web/API/Media_Source_Extensions_API/Transcoding_assets_for_MSE +--- +Media Source Extensions を使用する場合、アセットをストリーミングする前に調整する必要がある可能性があります。 この記事では、要件を説明し、アセットを適切にエンコードするために使用できるツールチェーンを示します。 + +## 入門 + +1. 最初で最も重要な手順は、ユーザーのブラウザーがサポートするコンテナとコーデックでファイルを構成することです。 +2. コーデックによっては、[ISO BMFF 仕様](https://www.w3.org/TR/mse-byte-stream-format-isobmff/)に準拠するためにファイルを断片化する必要がある場合があります。 +3. (オプション)Dynamic Adaptive Streaming over HTTP(DASH、HTTP を介した動的適応的ストリーミング)を使用した適応的ビットレートストリーミングを使用する場合、アセットを複数の解像度にトランスコードする必要があります。 ほとんどの DASH クライアントは、対応する Media Presentation Description(MPD)マニフェストファイルを期待しています。 これは通常、複数の解像度のアセットファイルを生成するときに生成されます。 + +以下では、これらのすべての手順を説明しますが、最初にこれをかなり簡単に行うために使用できるツールチェーンを見てみましょう。 + +### サンプルメディア + +ここにリストされている手順を実行したいが、実験するメディアがない場合は、Big Buck Bunny の予告編 \[0] を[ここ](http://wayback.archive.org/web/20161102172252id_/http://video.blendertestbuilds.de/download.php?file=download.blender.org/peach/trailer_1080p.mov)で入手できます。 Big Buck Bunny は、[Creative Commons Attribution 3.0](http://creativecommons.org/licenses/by/3.0/) ライセンスの下でライセンスされています。 このチュートリアル全体を通して、ダウンロードしたファイル名 `trailer_1080p.mov` を参照します。 + +\[0] (c) Copyright 2008, Blender Foundation / www\.bigbuckbunny.org / https\://peach.blender.org/about/ + +### 必要なツール + +MSE を使用する場合、次のツールが必要です。 + +1. [ffmpeg](http://ffmpeg.org/) — メディアを必要な形式にトランスコードするためのコマンドラインユーティリティ。 [Download FFmpeg のページ](http://ffmpeg.org/download.html)であなたのシステムのバージョンをダウンロードできます。 アーカイブファイルから実行可能ファイルを抽出し、その場所を PATH ステートメントに追加します。 OSX ユーザーは、[homebrew](http://brew.sh/) を使用して ffmpeg をインストールすることもできます。 +2. [Bento4](https://github.com/axiomatic-systems/Bento4) — アセットのメタデータを取得し、DASH のコンテンツを作成するための一連のコマンドラインユーティリティ。 インストールするには、OS と設定に応じて、提供されたプロジェクトファイル/ソースファイルからアプリを自分でビルド/コンパイルする必要があります。 詳細については、[構築手順](https://github.com/axiomatic-systems/Bento4#building)を参照してください。 構築済みファイルが[ここ](https://www.bento4.com/downloads/)にあります。 `bin` ディレクトリの内容を ffmpeg と同じ場所に入れておきます。 +3. python2 — Bento4 が使います。 + +次のステップに進む前に、これらを正常にインストールしてください。 + +サンプルメディアは、Bento4 の `utils` ディレクトリに入れておき、ここで作業します。 + +> **Note:** **注**: 構築済みの ffmpeg には、ライセンスの関係で libfdk_aac が組み込まれていません。 これを Bento4 がデフォルトで使うので、必要なら、ffmpeg をコンパイルする必要があります。 必要なければ、`mp4-dash-encode.py` のコマンドラインに `--audio-codec=aac` を追加してください。 + +### コンテナとコーデックのサポート + +[MSE 仕様のセクション 1.1: Goals](https://www.w3.org/TR/media-source/#goals) で指定されているように、MSE は特定のメディア形式またはコーデックのサポートを必要としないように設計されています。 これは紙の上では事実ですが、ブラウザーのサポートは特定のコンテナ/コーデックの組み合わせによって異なります。 + +ブラウザーが特定のコンテナをサポートしているかどうかを確認するには、次のように MIME タイプの文字列を {{domxref("MediaSource.isTypeSupported")}} メソッドに渡します。 + +```js +MediaSource.isTypeSupported('audio/mp3'); // false +MediaSource.isTypeSupported('video/mp4'); // true +MediaSource.isTypeSupported('video/mp4; codecs="avc1.4D4028, mp4a.40.2"'); // true +``` + +文字列はコンテナの MIME タイプであり、オプションでコーデックのリストが続きます。 MIME タイプは簡単に把握できますが、[mp4info](http://nickdesaulniers.github.io/mp4info/) ユーティリティを使用してコーデック文字列を取得できます。 + +現在、H.264 動画コーデックと AAC 音声コーデックを備えた MP4 コンテナは、すべての最新ブラウザーでサポートされていますが、他のブラウザーではサポートされていません。 + +サンプルメディアを QuickTime MOV コンテナから MP4 コンテナに変換するには、ffmpeg を使用できます。 MOV コンテナの音声コーデックは既に AAC であり、動画コーデックは H.264 であるため、トランスコードを実行しないように ffmpeg に指示できます。 代わりに、トランスコードを実行せずに音声トラックと動画トラックをコピーするだけです。 これは、トランスコードするよりも比較的高速です。 + +``` +$ ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy bunny.mp4 +$ ls +bunny.mp4 trailer_1080p.mov +``` + +### 断片化の確認 + +MP4 を適切にストリーミングするには、アセットが [ISO BMF](https://www.w3.org/TR/mse-byte-stream-format-isobmff/) 形式の MP4 である必要があります。 適切な断片化がなければ、特定の MP4 ファイルは MSE での動作が保証されません。 これは、コンテナ内にメタデータが分散され、まとめられていないことを意味します。 + +MP4 ファイルが適切な MP4 ストリームであるかどうかを確認するには、[mp4info](http://nickdesaulniers.github.io/mp4info/) ユーティリティを再度使用して MP4 のアトムを一覧表示できます。 + +> **Note:** **注**: 断片化されたバージョンは、追加のメタデータがファイル全体に広がるため、元のバージョンよりわずかに大きくなります。 これは通常、ファイルサイズの 1% 以下の増加です。 + +### 断片化 + +まだ MP4 ではないアセットがある場合、ffmpeg は次のように `-movflags frag_keyframe+empty_moov` コマンドラインフラグを使用して、トランスコードプロセス中に適切に断片化された MP4 の発行を処理できます。 + +```bash +$ ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy -movflags frag_keyframe+empty_moov bunny_fragmented.mp4 +``` + +すでに MP4 を持っているが、適切に断片化されていない場合は、ffmpeg を改めて使用できます。 + +``` +$ ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4 +``` + +どちらの場合でも、Chrome は次の追加のムービーフラグを設定する必要がある場合があります。 + +```bash +-movflags frag_keyframe+empty_moov+default_base_moof +``` + +適切に断片化された MP4 ファイルを用意するだけで開始できます。 適応的ビットレートストリーミングを使用する場合は、複数の解像度でエンコードを作成する必要があります。 MSE は柔軟に実装できるほど柔軟性がありますが、DASH は明確に指定されたアプリケーションプロトコルであるため、既存の DASH クライアントを使用することを強くお勧めします。 + +### DASH 用のコンテンツの作成 + +$PATH を介して ffmpeg と Bento4 のユーティリティにアクセスできる場合、Bento4 の `mp4-dash-encode.py` Python スクリプトを実行して、さまざまな解像度でコンテンツの複数のエンコーディングを生成できます。 Bento4 の `mp4-dash.py` Python スクリプトを使用して、クライアントが必要とする対応する MPD ファイルを生成できます。 + +次のコマンドを実行します(サンプル出力付き)。 + +```bash +$ python mp4-dash-encode.py -b 5 -v bunny_fragmented.mp4 +Encoding 5 bitrates, min bitrate = 500.0 max bitrate = 2000.0 +Media Source: Video: resolution=640x360 +ENCODING bitrate: 500, resolution: 256x144 +ENCODING bitrate: 875, resolution: 384x216 +ENCODING bitrate: 1250, resolution: 480x270 +ENCODING bitrate: 1625, resolution: 560x316 +ENCODING bitrate: 2000, resolution: 640x360 + +$ python mp4-dash.py video_0* +Parsing media file 1: video_00500.mp4 +Parsing media file 2: video_00875.mp4 +Parsing media file 3: video_01250.mp4 +Parsing media file 4: video_01625.mp4 +Parsing media file 5: video_02000.mp4 +Splitting media file (audio) video_00500.mp4 +Splitting media file (video) video_00500.mp4 +Splitting media file (video) video_00875.mp4 +Splitting media file (video) video_01250.mp4 +Splitting media file (video) video_01625.mp4 +Splitting media file (video) video_02000.mp4 + +$ tree -L 2 output +output +├── audio +│ └── und +├── stream.mpd +└── video + ├── 1 + ├── 2 + ├── 3 + ├── 4 + └── 5 + +8 directories, 1 file +``` + +> **Note:** **注**: `mp4-dash-encode.py` は、ffmpeg のエラーメッセージを表示しないようにしています。 `-d` オプションを指定することで、それを見ることができます。 + +> **Note:** **注**: エラーメッセージとして `"Invalid duration specification for force_key_frames: 'expr:eq(mod(n"` が表示されたら、`mp4-dash-encode.py` を修正して `"-force_key_frames 'expr:eq(mod(n,%d),0)'"` から `"'"` を 2 つ取り除きます。 + +## まとめ + +動画が適切にエンコードされ、適応的ビットレートメディアが生成されると、DASH と MSE を使用して Web で適応的ビットレートストリーミングを開始する準備が整いました。 diff --git a/files/ja/web/api/offscreencanvas/getcontext/index.html b/files/ja/web/api/offscreencanvas/getcontext/index.html deleted file mode 100644 index baff96595f287a..00000000000000 --- a/files/ja/web/api/offscreencanvas/getcontext/index.html +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: OffscreenCanvas.getContext() -slug: Web/API/OffscreenCanvas/getContext -translation_of: Web/API/OffscreenCanvas/getContext ---- -The OffscreenCanvas.getContext()
method returns a drawing context for an offscreen canvas, or {{jsxref("null")}} if the context identifier is not supported.
Note: This API is currently implemented for WebGL1 and WebGL2 contexts only. See {{bug(801176)}} for Canvas 2D API support from workers.
-構文
- - - -offscreen.getContext(contextType, contextAttributes); -- -
contextType
"2d"
creates a {{domxref("CanvasRenderingContext2D")}} object representing a two-dimensional rendering context."webgl"
creates a {{domxref("WebGLRenderingContext")}} object representing a three-dimensional rendering context. This context is only available on browsers that implement WebGL version 1 (OpenGL ES 2.0)."webgl2"
creates a {{domxref("WebGL2RenderingContext")}} object representing a three-dimensional rendering context. This context is only available on browsers that implement WebGL version 2 (OpenGL ES 3.0). {{experimental_inline}}"bitmaprenderer"
creates a {{domxref("ImageBitmapRenderingContext")}} which only provides functionality to replace the content of the canvas with a given {{domxref("ImageBitmap")}}.
Note: The identifiers "experimental-webgl"
or "experimental-webgl2"
are also used in implementations of WebGL. These implementations have not reached test suite conformance, or the graphic drivers situation on the platform is not yet stable. The Khronos Group certifies WebGL implementations under certain conformance rules.
contextAttributes
You can use several context attributes when creating your rendering context, for example:
- -offscreen.getContext("webgl", - { antialias: false, - depth: false });- 2d context attributes: - -
alpha
: Boolean that indicates if the canvas contains an alpha channel. If set to false
, the browser now knows that the backdrop is always opaque, which can speed up drawing of transparent content and images then.willReadFrequently
: Boolean that indicates whether or not a lot of read-back operations are planned. This will force the use of a software (instead of hardware accelerated) 2D canvas and can save memory when calling {{domxref("CanvasRenderingContext2D.getImageData", "getImageData()")}} frequently. This option is only available, if the flag gfx.canvas.willReadFrequently.enable
is set to true
(which, by default, is only the case for B2G/Firefox OS).storage
: String that indicates which storage is used ("persistent" by default).alpha
: Boolean that indicates if the canvas contains an alpha buffer.depth
: Boolean that indicates that the drawing buffer has a depth buffer of at least 16 bits.stencil
: Boolean that indicates that the drawing buffer has a stencil buffer of at least 8 bits.antialias
: Boolean that indicates whether or not to perform anti-aliasing.premultipliedAlpha
: Boolean that indicates that the page compositor will assume the drawing buffer contains colors with pre-multiplied alpha.preserveDrawingBuffer
: If the value is true the buffers will not be cleared and will preserve their values until cleared or overwritten by the author.failIfMajorPerformanceCaveat
: Boolean that indicates if a context will be created if the system performance is low.
A {{domxref("RenderingContext")}} which is either a
- -"2d"
,"webgl"
and "experimental-webgl"
,"webgl2"
and "experimental-webgl2"
{{experimental_inline}}, or"bitmaprenderer"
.If the contextType
doesn't match a possible drawing context, null
is returned.
var offscreen = new OffscreenCanvas(256, 256); -var gl = offscreen.getContext("webgl"); - -gl; // WebGLRenderingContext -gl.canvas; // OffscreenCanvas- -
Specification | -Status | -Comment | -
---|---|---|
{{SpecName('HTML WHATWG', "#dom-offscreencanvas-getcontext", "OffscreenCanvas.getContext()")}} | -{{Spec2('HTML WHATWG')}} | -- |
{{Compat("api.OffscreenCanvas.getContext")}}
-The OffscreenCanvas
interface provides a canvas that can be rendered off screen. It is available in both the window and worker contexts.
OffscreenCanvas
constructor. Creates a new OffscreenCanvas
object.OffscreenCanvas
.OffscreenCanvas
One way to use the OffscreenCanvas
API, is to use a {{domxref("RenderingContext")}} that has been obtained from an OffscreenCanvas
object to generate new frames. Once a new frame has finished rendering in this context, the {{domxref("OffscreenCanvas.transferToImageBitmap", "transferToImageBitmap()")}} method can be called to save the most recent rendered image. This method returns an {{domxref("ImageBitmap")}} object, which can be used in a variety of Web APIs and also in a second canvas without creating a transfer copy.
To display the ImageBitmap
, you can use a {{domxref("ImageBitmapRenderingContext")}} context, which can be created by calling canvas.getContext("bitmaprenderer")
on a (visible) canvas element. This context only provides functionality to replace the canvas's contents with the given ImageBitmap
. A call to {{domxref("ImageBitmapRenderingContext.transferFromImageBitmap()")}} with the previously rendered and saved ImageBitmap
from the OffscreenCanvas, will display the ImageBitmap
on the canvas and transfer its ownership to the canvas. A single OffscreenCanvas
may transfer frames into an arbitrary number of other ImageBitmapRenderingContext
objects.
Given these two {{HTMLElement("canvas")}} elements
- -<canvas id="one"></canvas> -<canvas id="two"></canvas>- -
the following code will provide the rendering using an OffscreenCanvas
as described above.
var one = document.getElementById("one").getContext("bitmaprenderer"); -var two = document.getElementById("two").getContext("bitmaprenderer"); - -var offscreen = new OffscreenCanvas(256, 256); -var gl = offscreen.getContext('webgl'); - -// ... some drawing for the first canvas using the gl context ... - -// Commit rendering to the first canvas -var bitmapOne = offscreen.transferToImageBitmap(); -one.transferFromImageBitmap(bitmapOne); - -// ... some more drawing for the second canvas using the gl context ... - -// Commit rendering to the second canvas -var bitmapTwo = offscreen.transferToImageBitmap(); -two.transferFromImageBitmap(bitmapTwo); -- -
OffscreenCanvas
Another way to use the OffscreenCanvas
API, is to call {{domxref("HTMLCanvasElement.transferControlToOffscreen", "transferControlToOffscreen()")}} on a {{HTMLElement("canvas")}} element, either on a worker or the main thread, which will return an OffscreenCanvas
object from an {{domxref("HTMLCanvasElement")}} object from the main thread. Calling {{domxref("OffscreenCanvas.getContext", "getContext()")}} will then obtain a RenderingContext
from that OffscreenCanvas
.
main.js (main thread code):
- -var htmlCanvas = document.getElementById("canvas"); -var offscreen = htmlCanvas.transferControlToOffscreen(); - -var worker = new Worker("offscreencanvas.js"); -worker.postMessage({canvas: offscreen}, [offscreen]); -- -
offscreencanvas.js (worker code):
- -onmessage = function(evt) { - var canvas = evt.data.canvas; - var gl = canvas.getContext("webgl"); - - // ... some drawing using the gl context ... -}; -- -
You can also use requestAnimationFrame in workers
- -onmessage = function(evt) { - const canvas = evt.data.canvas; - const gl = canvas.getContext("webgl"); - - function render(time) { - // ... some drawing using the gl context ... - requestAnimationFrame(render); - } - requestAnimationFrame(render); -};- -
{{Compat("api.OffscreenCanvas")}}
-Canvas 2D APIのPath2D
.addPath()
メソッドは、パスに対して引数でパスを追加します。
void path.addPath(path [, transform]); -- -
path
transform
{{optional_inline}}addPathメソッドを使用する
これはaddPathメソッドを使用する簡単なコードスニペットです。
var canvas = document.getElementById("canvas"); -var ctx = canvas.getContext("2d"); - -// rectで新しいパスを作成する -var p1 = new Path2D(); -p1.rect(0,0,100,100); - -// rectで別のパスを作成する -var p2 = new Path2D(); -p2.rect(0,0,100,100); - -// 右に縦300ポイント移動する変換マトリックスを作成する -var m = document.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGMatrix(); -m.a = 1; m.b = 0; -m.c = 0; m.d = 1; -m.e = 300; m.f = 0; - -// 2番目のパスを最初のパスに追加する -p1.addPath(p2, m); - -// 最後に、1番目のパスをキャンバスに描画する -ctx.fill(p1); -- -
以下のコードを編集して、その変更が canvas に反映されることを確かめてください(現在のブラウザーが実際にこのメソッドをサポートしているか、以下のブラウザー互換テーブルをチェックしてください)
- -{{ EmbedLiveSample('Playable_code', 700, 500) }}
- -Specification | -Status | -Comment | -
---|---|---|
{{SpecName('HTML WHATWG', "scripting.html#dom-path2d-addpath", "Path2D.addPath()")}} | -{{Spec2('HTML WHATWG')}} | -初期定義 | -
{{Compat("api.Path2D.addPath")}}
- -The Path2D
interface of the Canvas 2D API is used to declare paths that are then later used on {{domxref("CanvasRenderingContext2D")}} objects. The path methods of the CanvasRenderingContext2D
interface are present on this interface as well and are allowing you to create paths that you can retain and replay as required on a canvas.
Path2D
constructor. Creates a new Path2D
object.x, y
coordinates with a straight line.moveTo()
before creating the Bézier curve.Specification | -Status | -Comment | -
---|---|---|
{{SpecName('HTML WHATWG', "scripting.html#dom-path2d", "Path2D")}} | -{{Spec2('HTML WHATWG')}} | -- |
{{Compat("api.Path2D")}}
- -Path2D()
コンストラクターは、新たにインスタンス化した Path2D
オブジェクトを返します。他のパスを引数に渡すこともできます(複製がつくられます)。また、SVG パス からなるデータを文字列で渡すこともできます。
new Path2D(); -new Path2D(path); -new Path2D(d); -- -
path
{{optional_inline}}Path2D
オブジェクトを渡して呼び出すと、引数の path
が複製されます。d
{{optional_inline}}これは、Path2D
のパスを複製して作成する簡単なコードスニペットです。
<canvas id="canvas"></canvas>-
const canvas = document.getElementById('canvas'); -const ctx = canvas.getContext('2d'); - -let path1 = new Path2D(); -path1.rect(10, 10, 100,100); - -let path2 = new Path2D(path1); -path2.moveTo(220, 60); -path2.arc(170, 60, 50, 0, 2 * Math.PI); - -ctx.stroke(path2); -- -
{{ EmbedLiveSample('Creating_and_copying_paths', 700, 180) }}
- -これは、SVG パスデータ を使用して Path2D
のパスを作成する簡単なコードスニペットです。パスは点 (M10 10
) に移ってから、水平に 80 ポイント右に移動し (h 80
)、80 ポイント下がり (v 80
)、80ポイント左に移動し (h -80
)、開始点に戻ります (z
)。
<canvas id="canvas"></canvas>-
const canvas = document.getElementById('canvas'); -const ctx = canvas.getContext('2d'); - -let p = new Path2D('M10 10 h 80 v 80 h -80 Z'); -ctx.fill(p); -- -
{{ EmbedLiveSample('Using_SVG_paths', 700, 180) }}
- -Specification | -Status | -Comment | -
---|---|---|
{{SpecName('HTML WHATWG', '#dom-path2d', 'Path2D()')}} | -{{Spec2('HTML WHATWG')}} | -Initial definition. | -
{{Compat("api.Path2D")}}
-パフォーマンスタイムライン API は、{{domxref("Performance")}} インターフェイスへの拡張を定義して、アプリケーション内のクライアントサイドの待ち時間の測定をサポートします。 拡張機能は、特定のフィルタ基準に基づいて{{domxref("PerformanceEntry","performance entry metrics", '', 'true')}} を取得するためのインターフェイスを提供します。この規格には、特定のパフォーマンスイベントがブラウザのパフォーマンスタイムラインに追加されたときに通知される ', 'true コールバックをアプリケーションで定義できるインターフェイスも含まれます。
- -このドキュメントは規格のインターフェイスの概要を提供します。インターフェイスの詳細については、リファレンスページおよびパフォーマンスタイムラインの使用を参照してください。
- -パフォーマンスタイムライン API は、{{domxref("Performance")}} インターフェイスを、指定されたフィルター基準に応じて一連の {{domxref("PerformanceEntry","パフォーマンスレコード (メトリック)")}} を取得するためのさまざまなメカニズムを提供する3つのメソッドで拡張します。メソッドは以下のとおりです。
- -The {{domxref("PerformanceEntry")}} interface encapsulates a single performance entry — that is, a single data point or metric in the performance timeline. This interface has the following four properties, and these properties are extended (with additional constraints) by other interfaces (such as {{domxref("PerformanceMark")}}):
- -mark
").'0'
for such types.)This interface includes a {{domxref("PerformanceEntry.toJSON","toJSON()")}} method that returns the serialization of the {{domxref("PerformanceEntry")}} object. The serialization is specific to the performance entry's {{domxref("PerformanceEntry.entryType","type")}}.
- -{{SeeCompatTable}}
- -The performance observer interfaces allow an application to register an observer for specific performance event types, and when one of those event types is recorded, the application is notified of the event via the observer's callback function that was specified when the observer was created.
- -When the observer (callback) is invoked, the callback's parameters include a {{domxref("PerformanceObserverEntryList","performance observer entry list")}} that contains only observed {{domxref("PerformanceEntry","performance entries")}}. That is, the list contains entries only for the event types that were specified when the observer's {{domxref("PerformanceObserver.observe","observe()")}} method was invoked. The {{domxref("PerformanceObserverEntryList","performance observer entry list")}} interface has the same three getEntries*()
methods as the {{domxref("Performance")}} interface. However, note there is one key difference with these methods; the {{domxref("PerformanceObserverEntryList","performance observer entry list")}} versions are used to retrieve observed performance entries within the observer callback.
Besides the {{domxref("PerformanceObserver","PerformanceObserver's")}} interface's {{domxref("PerformanceObserver.observe","observe()")}} method (which is used to register the {{domxref("PerformanceEntry.entryType","entry types")}} to observe), the {{domxref("PerformanceObserver")}} interface also has a {{domxref("PerformanceObserver.disconnect","disconnect()")}} method that stops an observer from receiving further events.
- -Performance observers were added to the Level 2
version of the standard and were not widely implemented.
A summary of the interfaces' implementation status is provided below, including a link to more detailed information.
- -To test your browser's support for these interfaces, run the perf-api-support
application.
パフォーマンスタイムライン標準は、アプリケーション内でクライアント側の待ち時間の測定をサポートするための {{domxref("Performance")}} インターフェイスへの拡張を定義します。この規格には、特定のパフォーマンスイベントが発生したときにアプリケーションに通知することを可能にするインターフェイスも含まれています。同時に、これらのインターフェイスを使用してアプリケーションのパフォーマンスボトルネックを特定することができます。
- -Performance Timeline extends the {{domxref("Performance")}} object with three methods that provide different mechanisms to get a set of {{domxref("PerformanceEntry","performance records (metrics)")}}, depending on the specified filter criteria. The following example show the usage of these methods {{domxref("Performance.getEntries","getEntries()")}}, {{domxref("Performance.getEntriesByName","getEntriesByName()")}} and {{domxref("Performance.getEntriesByType","getEntriesByType()")}}.
- -function log(s) { - var o = document.getElementsByTagName("output")[0]; - o.innerHTML += s + " <br>"; -} -function do_work (n) { - for (var i=0 ; i < n; i++) { - var m = Math.random(); - } -} -function print_perf_entry(pe) { - log("..name: " + pe.name + - "; entryType: " + pe.entryType + - "; startTime: " + pe.startTime + - "; duration: " + pe.duration); -} -function print_PerformanceEntries() { - if (performance.mark === undefined) { - log("... performance.mark Not supported"); - return; - } - - // Create some performance entries via the mark() and measure() methods - performance.mark("Begin"); - do_work(50000); - performance.mark("End"); - do_work(50000); - performance.measure("Measure1", "Begin", "End"); - - // Use getEntries() to iterate all entries - var p = performance.getEntries(); - for (var i=0; i < p.length; i++) { - log("All Entry[" + i + "]"); - print_perf_entry(p[i]); - } - - // Use getEntries(name, entryType) to get specific entries - p = performance.getEntries({name : "Measure1", entryType: "measure"}); - for (var i=0; i < p.length; i++) { - log("Begin and Measure [" + i + "]"); - print_perf_entry(p[i]); - } - - // Use getEntriesByType() to get all "mark" entries - p = performance.getEntriesByType("mark"); - for (var i=0; i < p.length; i++) { - log ("Mark only [" + i + "]"); - print_perf_entry(p[i]); - } - - // Use getEntriesByName() to get all "mark" entries named "Begin" - p = performance.getEntriesByName("Begin", "mark"); - for (var i=0; i < p.length; i++) { - log ("Begin and Mark [" + i + "]"); - print_perf_entry(p[i]); - } -} -- -
The {{domxref("PerformanceEntry")}}
interface encapsulates a single performance entry i.e. a single performance metric. This interface has four properties and a JSON serializer ({{domxref("Performance.toJSON","toJSON()")}}. The following example shows the use of these properties.
function print_PerformanceEntry(ev) { - var properties = ["name", "entryType", "startTime", "duration"]; - - // Create a few performance entries - performance.mark("Start"); - do_work(50000); - performance.mark("Stop"); - performance.measure("measure-1"); - - var p = performance.getEntries(); - for (var i=0; i < p.length; i++) { - log("PerfEntry[" + i + "]"); - for (var j=0; j < properties.length; j++) { - // check each property in window.performance - var supported = properties[j] in p[i]; - if (supported) { - var pe = p[i]; - log("... " + properties[j] + " = " + pe[properties[j]]); - } else { - log("... " + properties[j] + " = Not supported"); - } - } - } -} -- -
This interface also includes a {{domxref("PerformanceEntry.toJSON","toJSON()")}} method that returns the serialization of the {{domxref("PerformanceEntry")}} object. The following examples show the use of this method.
- -function PerfEntry_toJSON() { - - // Create a few performance entries - performance.mark("mark-1"); - performance.mark("mark-2"); - performance.measure("meas-1", "mark-1", "mark-2"); - - var peList = performance.getEntries(); - var pe = peList[0]; - - if (pe.toJSON === undefined) { - log ("PerformanceEntry.toJSON() is NOT supported"); - return; - } - - // Print the PerformanceEntry object - var json = pe.toJSON(); - var s = JSON.stringify(json); - log("PerformanceEntry.toJSON = " + s); -} -- -
{{SeeCompatTable}}
- -The performance observer interfaces allow an application to register an observer for specific performance event types, and when one of those event types is recorded, the application is notified of the event via the observer's callback function that was specified at the time, the observer was created. When the observer (callback) is invoked the callback's parameters include a {{domxref("PerformanceObserverEntryList","performance observer entry list")}} that only contains observed {{domxref("PerformanceEntry","performance entries")}}. That is, the list only contains entries for the event types that were specified when the observer's {{domxref("PerformanceObserver.observe","observe()")}} method was invoked.
- -The following example shows how to register two observers: the first one registers for several event types and the second observer only registers for one event type.
- -function PerformanceObservers() { - // Create observer for all performance event types - var observe_all = new PerformanceObserver(function(list, obs) { - var perfEntries; - - // Print all entries - perfEntries = list.getEntries(); - for (var i=0; i < perfEntries.length; i++) { - print_perf_entry(perfEntries[i]); - } - - // Print entries named "Begin" with type "mark" - perfEntries = list.getEntriesByName("Begin", "mark"); - for (var i=0; i < perfEntries.length; i++) { - print_perf_entry(perfEntries[i]); - } - - // Print entries with type "mark" - perfEntries = list.getEntriesByType("mark"); - for (var i=0; i < perfEntries.length; i++) { - print_perf_entry(perfEntries[i]); - } - }); - // subscribe to all performance event types - observe_all.observe({entryTypes: ['frame', 'mark', 'measure', 'navigation', 'resource', 'server']}); - - // Create observer for just the "mark" event type - var observe_mark = new PerformanceObserver(function(list, obs) { - var perfEntries = list.getEntries(); - // Should only have 'mark' entries - for (var i=0; i < perfEntries.length; i++) { - print_perf_entry(perfEntries[i]); - } - }); - // subscribe to only the 'mark' event - observe_mark.observe({entryTypes: ['mark']}); -} -function print_perf_entry(pe) { - log("name: " + pe.name + - "; entryType: " + pe.entryType + - "; startTime: " + pe.startTime + - "; duration: " + pe.duration); -} -- -
The {{domxref("PerformanceObserverEntryList","performance observer entry list")}} interface has the same three getEntries*()
methods as the {{domxref("Performance")}} interface and these methods are used to retrieve observed performance entries within the observer callback. These methods have been used in the above stated example.
The interfaces described in this document are defined in the Performance Timeline standard which has two levels:
- -Permissions API は、現在のコンテキストに起因する API のパーミッションの状態を照会するための一貫したプログラム方法を提供します。 例えば、Permissions API を使用して、特定の API にアクセスするためのパーミッションが付与(granted)または拒否(denied)されているかどうかを確認できます。
-歴史的に異なる API は独自のパーミッションを一貫性のない方法で扱います。 例えば、Notifications API はパーミッションの状態の明示的なチェックとパーミッションの要求を許可しますが、Geolocation API はできません(ユーザーが最初のパーミッションの要求を拒否すると問題を引き起こします)。 Permissions API は、パーミッションに関する限り、開発者がより良いユーザーエクスペリエンスを実装できるようにするためのツールを提供します。
- -permissions
プロパティが {{domxref("Navigator")}} オブジェクトで利用可能になり、標準の閲覧コンテキストとワーカーコンテキスト({{domxref("WorkerNavigator")}} — したがって、ワーカー内でパーミッションの確認が可能)の両方で、Permissions API 機能へのアクセスを提供する {{domxref("Permissions")}} オブジェクトを返します。
このオブジェクトを取得した後は、{{domxref("Permissions.query()")}} メソッドを使用して特定の API の {{domxref("PermissionStatus")}} で解決される Promise を返すなど、パーミッション関連のタスクを実行できます。
- -Permissions API を使用してすべての API のパーミッションの状態を照会できるわけではありません。 Permissions に対応している注目すべき API は次のとおりです。
- -今後、より多くの API が Permissions API のサポートを取得する予定です。
- -Location Finder という簡単な例を用意しました。 例をライブで実行するか、Github でソースコードを見ることができます。
- -それがどのように機能するかについてもっと読むには Permissions API の使用を見てください。
- -仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName('Permissions API')}} | -{{Spec2('Permissions API')}} | -初期定義 | -
{{Compat("api.Permissions")}}
-{{DefaultAPISidebar("Permissions API")}}{{SeeCompatTable}}
- -この記事では、W3C の Permissions API を使用するための基本的なガイドを提供します。 これは、現在のコンテキストに起因する API のパーミッションの状態を照会するためのプログラムによる方法を提供します。
- -ウェブ上のパーミッションは必要悪であり、そしてそれらは開発者として対処するのはそれほど面白くありませんが、それに立ち向かいましょう。
- -歴史的には、異なる API は独自のパーミッションを一貫性のない方法で扱います。 例えば、Notifications API はパーミッションの状態の明示的なチェックとパーミッションの要求を許可しますが、Geolocation API はそうではありません(以下に示すように、ユーザーが最初のパーミッションの要求を拒否すると問題を引き起こします)。
- -Permissions API は、パーミッションに関する限り、開発者がより良いユーザーエクスペリエンスを実装できるようにするためのツールを提供します。 例えば、特定の API を使用するためのパーミッションが付与されているか拒否されているかを照会し、API を使用するためのパーミッションを具体的に要求することができます。
- -現時点では、API の実装は初期段階にあるため、ブラウザーでのサポートは次のようにかなりむらがあります。
- -時間が経つにつれて、より多くの機能が追加されます。
- -この記事では、Location Finder という簡単なデモをまとめました。 Geolocation を使用してユーザーの現在地を照会し、それをグーグルマップに表示します。
- - - -サンプルをライブで実行するか、Github でソースコードを見ることができます。 コードの大部分は単純で目立たないものです。 以下では Permissions API 関連のコードを見ていきますので、他の部分を調べたい場合はコードを自分で確認してください。
- -グローバルな {{domxref("Permissions")}} オブジェクトへのアクセスを許可するために、{{domxref("Navigator.permissions")}} プロパティがブラウザーに追加されました。 現在、このオブジェクトには {{domxref("Permissions.query()")}} しか含まれていませんが、最終的にはパーミッションの照会、要求、および取り消しのためのメソッドが含まれます。 下記参照。
- -この例では、Permissions 機能は handlePermission()
という1つの関数によって処理されます。 これは、{{domxref("Permissions.query()")}} を使用してパーミッションの状態を照会することから始まります。 Promise が解決されたときに返される {{domxref("PermissionStatus")}} オブジェクトの {{domxref("PermissionStatus.state", "state")}} プロパティの値に応じて、次のように反応は異なります。
"granted"
(付与)"prompt"
(プロンプト)revealPosition()
関数を実行し(地図を表示します)、パーミッションが拒否されている場合、positionDenied()
関数を実行します([Geolocation を有効にする] ボタンを表示します)。"denied"
(拒否)function handlePermission() { - navigator.permissions.query({name:'geolocation'}).then(function(result) { - if (result.state == 'granted') { - report(result.state); - geoBtn.style.display = 'none'; - } else if (result.state == 'prompt') { - report(result.state); - geoBtn.style.display = 'none'; - navigator.geolocation.getCurrentPosition(revealPosition,positionDenied,geoSettings); - } else if (result.state == 'denied') { - report(result.state); - geoBtn.style.display = 'inline'; - } - result.onchange = function() { - report(result.state); - } - }); -} - -function report(state) { - console.log('Permission ' + state); -} - -handlePermission();- -
{{domxref("Permissions.query()")}} メソッドはパラメータとして PermissionDescriptor
ディクショナリを取ります — これはあなたが興味を持っている API の名前を含みます。 いくつかの API は、デフォルトの PermissionDescriptor
から継承した、追加情報を含んだ、より複雑な PermissionDescriptor
を持っています。 例えば、PushPermissionDescriptor
には、userVisibleOnly
が true
か false
かを指定する Boolean も含める必要があります。
Firefox 47 以降、{{domxref("Permissions.revoke()")}} メソッドを使用して既存のパーミッションを取り消すことができるようになりました。 これは {{domxref("Permissions.query()")}} メソッドとまったく同じように機能しますが、Promise が正常に解決されると、既存のパーミッションがデフォルトの状態(通常は prompt
)に戻される点が異なります。 デモで次のコードを見てください。
var revokeBtn = document.querySelector('.revoke'); - - ... - -revokeBtn.onclick = function() { - revokePermission(); -} - - ... - -function revokePermission() { - navigator.permissions.revoke({name:'geolocation'}).then(function(result) { - report(result.state); - }); -}- -
Firefox 51 以降、Web Applications Security Working Group で設計が問題になっているため、revoke()
関数はデフォルトで無効になっています。 設定 dom.permissions.revoke.enable
を true
に設定することで再度有効にすることができます。
上記のコードには、{{domxref("PermissionStatus")}} オブジェクトにアタッチされた onchange
イベントハンドラがあることに気付くでしょう。 これにより、関心のある API のパーミッションの状態の変更に対応できるようになります。 現時点では、状態の変化を報告しているだけです。
現時点では、これは私たちがすでに持っていたもの以上のものを提供するものではありません。 パーミッションのプロンプトから位置を決して共有しないことを選択した場合(パーミッションを拒否した場合)、ブラウザーのメニューオプションを使用しないとパーミッションのプロンプトに戻ることはできません。
- -しかしながら、ブラウザー機能への将来の追加は request()
メソッドを提供するべきです、それは私たちが好きなときにいつでもプログラム的にパーミッションを要求することを可能にするでしょう。 うまくいけばこれらはすぐに利用可能になるはずです。
Resource Timing
インターフェイスは、アプリケーションのリソースのロードに関する詳細なネットワークタイミングデータの取得と分析を可能にします。アプリケーションはタイミングメトリックを使用して、たとえば、{{domxref("XMLHttpRequest")}}、{{SVGElement("SVG","SVG element")}}、画像、スクリプトなど特定のリソースをロードするのにかかる時間を決定できます。
インターフェイスのプロパティは、リダイレクトの開始時間と終了時間、DNS ルックアップの開始時間と終了時間、リクエストの開始時間、レスポンスの開始時間と終了時間などネットワークイベントに対して {{domxref("DOMHighResTimeStamp","high-resolution timestamps", "", 1)}} のリソースロードタイムラインを作成します。このインタフェースには、取得したリソースのサイズや取得を開始したリソースの種類に関するデータを提供するその他のプロパティも含まれています。
- -このドキュメントでは、Resource Timing
インターフェイスの概要を説明します。例を含むインターフェイスの詳細については、各インターフェイスのリファレンスページ、リソースタイミング API の使用、および あわせて参照 セクションの参照を参照してください。リソースタイミング処理モデルのグラフィック表示については、リソースタイミングフェーズの図を参照してください。
The PerformanceResourceTiming
interface extends the {{domxref("PerformanceEntry")}} for {{domxref("PerformanceEntry","performance entries", "", 1)}} which have an {{domxref("PerformanceEntry.entryType","entryType")}} of "resource
".
Several of the Resource Timing
properties return high-resolution timestamps. These timestamps have a {{domxref("DOMHighResTimeStamp")}}
type and as its name implies, they represent a high-resolution point in time. This type is a double
and its value is a discrete point in time or the difference in time between two discrete points in time.
The unit of DOMHighResTimeStamp
is milliseconds and should be accurate to 5 µs (microseconds). However, If the browser is unable to provide a time value accurate to 5 µs (because, for example, due to hardware or software constraints), the browser can represent a the value as a time in milliseconds accurate to a millisecond.
An application can get timestamps for the various stages used to load a resource. The first property in the processing model is {{domxref("PerformanceEntry.startTime","startTime")}} which returns the timestamp immediately before the resource loading process begins. The {{domxref("PerformanceResourceTiming.fetchStart","fetchStart")}} timestamps follows and redirect processing (if applicable) and preceeds DNS lookup. The next stages are {{domxref('PerformanceResourceTiming.connectStart','connectStart')}} and {{domxref('PerformanceResourceTiming.connectEnd','connectEnd')}} which are the timestamps immediately before and after connecting to the server, respectively. The last three timestamps are, in order: {{domxref('PerformanceResourceTiming.requestStart','requestStart')}} - the timestamp before the browser starts requesting the resource from the server; {{domxref('PerformanceResourceTiming.responseStart','responseStart')}} - the timestamp after the browser receives the first byte of the response from the server; and {{domxref('PerformanceResourceTiming.responseEnd','responseEnd')}} - the timestamp after the browser receives the last byte of the resource. If the resource is loaded via a secure connection a {{domxref('PerformanceResourceTiming.secureConnectionStart','secureConnectionStart')}} timestamp will be available between the connection start and end events.
- -When {{Glossary("CORS")}} is in effect, many of these values are returned as zero unless the server's access policy permits these values to be shared. This requires the server providing the resource to send the Timing-Allow-Origin
HTTP response header with a value specifying the origin or origins which are allowed to get the restricted timestamp values.
The properties which are returned as 0 by default when loading a resource from a domain other than the one of the web page itself: redirectStart
, redirectEnd
, domainLookupStart
, domainLookupEnd
, connectStart
, connectEnd
, secureConnectionStart
, requestStart
, and responseStart
.
The {{domxref("PerformanceResourceTiming")}}
interface also includes several network timing properties. The {{domxref("PerformanceResourceTiming.redirectStart","redirectStart")}} and {{domxref("PerformanceResourceTiming.redirectEnd","redirectEnd")}} properties return {{domxref("DOMHighResTimeStamp","timestamps")}} for redirect start and end times, respectively. Likewise, the The {{domxref("PerformanceResourceTiming.domainLookupStart","domainLookupStart")}} and {{domxref("PerformanceResourceTiming.domainLookupEnd","domainLookupEnd")}} properties return {{domxref("DOMHighResTimeStamp","timestamps")}} for DNS lookup start and end times, respectively.
This would be a nice place to have a diagram showing the relationships between these segments of the resource loading time.
- -The {{domxref("PerformanceResourceTiming")}} interface has three properties that can be used to obtain size data about a resource. The {{domxref('PerformanceResourceTiming.transferSize','transferSize')}} property returns the size (in octets) of the fetched resource including the response header fields plus the response payload body.
- -The {{domxref('PerformanceResourceTiming.encodedBodySize','encodedBodySize')}} property returns the size (in octets) received from the fetch (HTTP or cache), of the payload body, before removing any applied content-codings. {{domxref('PerformanceResourceTiming.decodedBodySize','decodedBodySize')}} returns the size (in octets) received from the fetch (HTTP or cache) of the message body, after removing any applied content-codings.
- -The {{domxref('PerformanceResourceTiming.nextHopProtocol','nextHopProtocol')}} property returns the network protocol used to fetch the resource.
- -The {{domxref('PerformanceResourceTiming.initiatorType','initiatorType')}} property returns the type of resource that initiated the performance entry such as "css
" for a CSS resource, "xmlhttprequest
" for an XMLHttpRequest and "img
" for an image (such as a JPEG).
If the current context is a {{domxref("Worker","worker")}}, the {{domxref('PerformanceResourceTiming.workerStart','workerStart')}} property can be used to obtain a {{domxref("DOMHighResTimeStamp")}} when the worker was started.
- -The Resource Timing API includes two methods that extend the {{domxref("Performance")}} interface. The {{domxref("Performance.clearResourceTimings","clearResourceTimings()")}} method removes all "resource
" type performance entries from the browser's resource performance entry buffer. The {{domxref("Performance.setResourceTimingBufferSize","setResourceTimingBufferSize()")}} method sets the resource performance entry buffer size to the specified number of resource {{domxref("PerformanceEntry","performance entries")}}.
The {{domxref("PerformanceResourceTiming")}} interface's {{domxref("PerformanceResourceTiming.toJSON","toJSON()")}} method returns a JSON serialization of a "resource
" type {{domxref("PerformanceEntry","performance entry")}}.
As shown in the {{domxref("PerformanceResourceTiming")}} interface's Browser Compatibility table, most of these interfaces are broadly implemented by desktop browsers. However, note that some properties have little to no implementation so see each property's "Browser compatibility" section for more specific interoperability data.
- -To test your browser's support for these interfaces, run the perf-api-support
application.
Resource Timing API は、アプリケーションのリソースのロードに関する詳細なネットワークタイミングデータを取得して分析する方法を提供します。アプリケーションはタイミングメトリックを使用して、たとえば、{{domxref("XMLHttpRequest")}}、{{SVGElement("SVG","SVG element")}}、画像、スクリプトなど特定のリソースを取得するのにかかる時間を判断できます。
- -The interface's properties create a resource loading timeline with {{domxref("DOMHighResTimeStamp","high-resolution timestamps")}} for network events such as redirect start and end times, fetch start, DNS lookup start and end times, response start and end times, etc. The interface also includes other properties that provide data about the size of the fetched resource as well as the type of resource that initiated the fetch.
- -This document shows the use of Resource Timing interfaces. For more details about the interfaces, including examples, see each interface's reference page and the references in the See also section.
- -A live version of the examples is available on Github, as is the source code. Pull requests and bug reports are welcome.
- -An application can get timestamps for the various phases of resource loading such as redirection, DNS lookup, and TCP connection setup. Those phases and their property names are illustrated in Figure 1.
- -
- Figure 1. Resource timing properties
An application developer can use the property values to calculate the length of time a phase takes and that information can help diagnose performance issues.
- -The following example illustrates using the resource timing properties to calculate the amount of time the following phases take: redirection ({{domxref("PerformanceResourceTiming.redirectStart","redirectStart")}} and {{domxref("PerformanceResourceTiming.redirectEnd","redirectEnd")}} ), DNS lookup ({{domxref("PerformanceResourceTiming.domainLookupStart","domainLookupStart")}} and {{domxref("PerformanceResourceTiming.domainLookupEnd","domainLookupEnd")}}), TCP handshake ({{domxref('PerformanceResourceTiming.connectStart','connectStart')}} and {{domxref('PerformanceResourceTiming.connectEnd','connectEnd')}}), and response ({{domxref('PerformanceResourceTiming.responseStart','responseStart')}} and {{domxref('PerformanceResourceTiming.responseEnd','responseEnd')}}). This example also calculates the time from the start of the fetch and request start phases ({{domxref("PerformanceResourceTiming.fetchStart","fetchStart")}} and {{domxref("PerformanceResourceTiming.requestStart","requestStart")}}, respectively), until the response has ended ({{domxref('PerformanceResourceTiming.responseEnd','responseEnd')}}). This timing data provides a detailed profile of the resource loading phases and this data can be used to help identify performance bottlenecks.
- -function calculate_load_times() { - // Check performance support - if (performance === undefined) { - console.log("= Calculate Load Times: performance NOT supported"); - return; - } - - // Get a list of "resource" performance entries - var resources = performance.getEntriesByType("resource"); - if (resources === undefined || resources.length <= 0) { - console.log("= Calculate Load Times: there are NO `resource` performance records"); - return; - } - - console.log("= Calculate Load Times"); - for (var i=0; i < resources.length; i++) { - console.log("== Resource[" + i + "] - " + resources[i].name); - // Redirect time - var t = resources[i].redirectEnd - resources[i].redirectStart; - console.log("... Redirect time = " + t); - - // DNS time - t = resources[i].domainLookupEnd - resources[i].domainLookupStart; - console.log("... DNS lookup time = " + t); - - // TCP handshake time - t = resources[i].connectEnd - resources[i].connectStart; - console.log("... TCP time = " + t); - - // Secure connection time - t = (resources[i].secureConnectionStart > 0) ? (resources[i].connectEnd - resources[i].secureConnectionStart) : "0"; - console.log("... Secure connection time = " + t); - - // Response time - t = resources[i].responseEnd - resources[i].responseStart; - console.log("... Response time = " + t); - - // Fetch until response end - t = (resources[i].fetchStart > 0) ? (resources[i].responseEnd - resources[i].fetchStart) : "0"; - console.log("... Fetch until response end time = " + t); - - // Request start until reponse end - t = (resources[i].requestStart > 0) ? (resources[i].responseEnd - resources[i].requestStart) : "0"; - console.log("... Request start until response end time = " + t); - - // Start until reponse end - t = (resources[i].startTime > 0) ? (resources[i].responseEnd - resources[i].startTime) : "0"; - console.log("... Start until response end time = " + t); - } -} -- -
アプリケーションのリソースのサイズはアプリケーションのパフォーマンスに影響を与える可能性があるため、リソースサイズに関する正確なデータを取得することが重要になる可能性があります(特に非ホストリソースの場合)。{{domxref("PerformanceResourceTiming")}} インターフェースには、リソースに関するサイズデータを取得するために使用できる3つのプロパティがあります。 {{domxref('PerformanceResourceTiming.transferSize','transferSize')}} プロパティは、レスポンスヘッダフィールドとレスポンスペイロードボディを含む、取得したリソースのサイズ(オクテット単位)を返します。{{domxref('PerformanceResourceTiming.encodedBodySize','encodedBodySize')}} プロパティは、適用されたコンテンツコーディングを削除する前に、フェッチ(HTTPまたはキャッシュ)から受け取ったサイズ(オクテット単位)を返します。{{domxref('PerformanceResourceTiming.decodedBodySize','decodedBodySize')}} は、適用されたコンテンツコーディングを削除した後、メッセージ本文のフェッチ(HTTPまたはキャッシュ)から受け取ったサイズ(オクテット単位)を返します。
- -次の例は、これら3つのプロパティの使い方を示しています。
- -function display_size_data(){ - // Check for support of the PerformanceResourceTiming.*size properties and print their values - // if supported. - if (performance === undefined) { - console.log("= Display Size Data: performance NOT supported"); - return; - } - - var list = performance.getEntriesByType("resource"); - if (list === undefined) { - console.log("= Display Size Data: performance.getEntriesByType() is NOT supported"); - return; - } - - // For each "resource", display its *Size property values - console.log("= Display Size Data"); - for (var i=0; i < list.length; i++) { - console.log("== Resource[" + i + "] - " + list[i].name); - if ("decodedBodySize" in list[i]) - console.log("... decodedBodySize[" + i + "] = " + list[i].decodedBodySize); - else - console.log("... decodedBodySize[" + i + "] = NOT supported"); - - if ("encodedBodySize" in list[i]) - console.log("... encodedBodySize[" + i + "] = " + list[i].encodedBodySize); - else - console.log("... encodedBodySize[" + i + "] = NOT supported"); - - if ("transferSize" in list[i]) - console.log("... transferSize[" + i + "] = " + list[i].transferSize); - else - console.log("... transferSize[" + i + "] = NOT supported"); - } -} -- -
ブラウザは、リソースタイミングバッファ内で少なくとも150のリソースタイミングパフォーマンスエントリをサポートする必要がありますが、アプリケーションによっては、その制限を超えるリソースを使用することがあります。開発者がバッファサイズを管理しやすくするために、Resource Timingは{{domxref("Performance")}}インターフェースを拡張する2つのメソッドを定義します。{{domxref("Performance.clearResourceTimings","clearResourceTimings()")}} メソッドは、ブラウザのリソースパフォーマンスエントリバッファからすべての "リソース"タイプのパフォーマンスエントリを削除します。 {{domxref("Performance.setResourceTimingBufferSize","setResourceTimingBufferSize()")}} メソッドは、リソースパフォーマンスエントリのバッファサイズを、指定された数のリソースに設定します{{domxref("PerformanceEntry","performance entries")}}.。
- - - -次の例は、これら2つの方法の使用方法を示しています。
- -function clear_resource_timings() { - if (performance === undefined) { - console.log("= performance.clearResourceTimings(): peformance NOT supported"); - return; - } - // Check if Performance.clearResourceTiming() is supported - console.log ("= Print performance.clearResourceTimings()"); - var supported = typeof performance.clearResourceTimings == "function"; - if (supported) { - console.log("... Performance.clearResourceTimings() = supported"); - performance.clearResourceTimings(); - } else { - console.log("... Performance.clearResourceTiming() = NOT supported"); - return; - } - // getEntries should now return zero - var p = performance.getEntriesByType("resource"); - if (p.length == 0) - console.log("... Performance data buffer cleared"); - else - console.log("... Performance data buffer NOT cleared (still have `" + p.length + "` items"); -} - -function set_resource_timing_buffer_size(n) { - if (performance === undefined) { - console.log("= performance.setResourceTimingBufferSize(): peformance NOT supported"); - return; - } - // Check if Performance.setResourceTimingBufferSize() is supported - console.log ("= performance.setResourceTimingBufferSize()"); - var supported = typeof performance.setResourceTimingBufferSize == "function"; - if (supported) { - console.log("... Performance.setResourceTimingBufferSize() = supported"); - performance.setResourceTimingBufferSize(n); - } else { - console.log("... Performance.setResourceTimingBufferSize() = NOT supported"); - } -} -- -
The {{domxref("Performance")}} interface has a {{domxref("Performance.onresourcetimingbufferfull","onresourcetimingbufferfull")}} event handler that gets called (with an {{domxref("Event")}} of type {{domxref("Event.type")}} of "{{event("resourcetimingbufferfull")}}") when the browser's resource performance entry buffer is full. The following code example sets a {{domxref("Performance.onresourcetimingbufferfull","onresourcetimingbufferfull")}} event callback in the init()
function.
function buffer_full(event) { - console.log("WARNING: Resource Timing Buffer is FULL!"); - set_resource_timing_buffer_size(200); -} - -function init() { - // load some image to trigger "resource" fetch events - var image1 = new Image(); - image1.src = "https://developer.mozilla.org/static/img/opengraph-logo.png"; - var image2 = new Image(); - image2.src = "http://mozorg.cdn.mozilla.net/media/img/firefox/firefox-256.e2c1fc556816.jpg" - - // Set a callback if the resource buffer becomes filled - performance.onresourcetimingbufferfull = buffer_full; -} -- -
When {{Glossary("CORS")}} is in effect, many of the timing properties' values are returned as zero unless the server's access policy permits these values to be shared. This requires the server providing the resource to send the {{httpheader("Timing-Allow-Origin")}} HTTP response header with a value specifying the origin or origins which are allowed to get the restricted timestamp values.
- -The properties which are returned as 0 by default when loading a resource from a domain other than the one of the web page itself: redirectStart
, redirectEnd
, domainLookupStart
, domainLookupEnd
, connectStart
, connectEnd
, secureConnectionStart
, requestStart
, and responseStart
.
SharedWorker
インターフェースは複数のブラウザコンテキストからアクセス可能な Worker を提供します。複数のブラウザコンテキストとは、複数のウィンドウや iframe、Worker などを指します。Dedicated Worker とは異なるインタフェースと、異なるグローバルスコープを持ちます。スコープに関しては {{domxref("SharedWorkerGlobalScope")}} を参照してください。
付記:同じオリジン、つまりプロトコル、ホスト名、ポートが全て同じ場合にのみ、SharedWorker は異なるブラウザコンテキスト間で共有されます。
-{{domxref("EventTarget")}} のプロパティを継承し、 {{domxref("AbstractWorker")}} で定義されるプロパティを実装しています。
- -error
である {{domxref("ErrorEvent")}} がバブリングした時に呼ばれる {{domxref("EventListener")}}{{domxref("EventTarget")}} のメソッドを継承し、 {{domxref("AbstractWorker")}} に定義されるメソッドを実装します。
- -SharedWorker の基本利用例 (ライブデモ) には 2 つの HTML ページがあり、それぞれでは JavaScript で単純な計算を行っています。それぞれのスクリプトは計算を行うために同じ JS ファイルを Worker に実行させています。2 つのページが別のウインドウで動作していたとしても、同じ Worker にアクセスできています。
- -SharedWorker
オブジェクトは {{domxref("SharedWorker.SharedWorker", "SharedWorker()")}} コンストラクタを利用して、次のように作成します:
var myWorker = new SharedWorker("worker.js"); -- -
それぞれのスクリプトは {{domxref("MessagePort")}} オブジェクトを通じて Worker にアクセスします。このオブジェクトは {{domxref("SharedWorker.port")}} プロパティから取得できます。addEventListener を読んで onmessage イベントのハンドラを登録したら、start()
メソッドを呼んでポートを手動で開始できます:
myWorker.port.start();- -
ポートが開始されたら、Worker に向けてメッセージを送ったり、送られたメッセージを受け取ったりできます。これらには port.postMessage()
と port.onmessage
を利用します:
first.onchange = function() { - myWorker.port.postMessage([first.value,second.value]); - console.log('Message posted to worker'); - } - - second.onchange = function() { - myWorker.port.postMessage([first.value,second.value]); - console.log('Message posted to worker'); - } - - myWorker.port.onmessage = function(e) { - result1.textContent = e.data; - console.log('Message received from worker'); - }- -
Worker の内部では {{domxref("SharedWorkerGlobalScope.onconnect")}} に対してハンドラを設定することで、上述したポートへの接続を処理できます。Worker に関連付けられたポートは {{event("connect")}} イベントの ports
属性で参照できます。{{domxref("MessagePort")}} の start()
メソッドによるポート開始後は、onmessage
ハンドラでメインスレッドからのメッセージを処理します。
onconnect = function(e) { - var port = e.ports[0]; - - port.addEventListener('message', function(e) { - var workerResult = 'Result: ' + (e.data[0] * e.data[1]); - port.postMessage(workerResult); - }); - - port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter. -}- -
仕様 | -状況 | -コメント | -
---|---|---|
{{SpecName('HTML WHATWG', "#sharedworker", "SharedWorker")}} | -{{Spec2('HTML WHATWG')}} | -{{SpecName("Web Workers")}} との差分なし | -
{{Compat("api.SharedWorker")}}
- -{{domxref("SharedWorker")}} インターフェースの port
プロパティは、shared worker を制御したり通信したりするために使用する {{domxref("MessagePort")}} オブジェクトを返します。
myWorker.port;- -
{{domxref("MessagePort")}} オブジェクト
- -次のコードスニペットでは、{{domxref("SharedWorker.SharedWorker", "SharedWorker()")}} コンストラクターを使用して SharedWorker
オブジェクトを生成しています。SharedWorker.port
プロパティ経由で {{domxref("MessagePort")}} オブジェクトを使用して、複数のスクリプトから worker にアクセスできます — port は start()
メソッドを使用して開始します:
var myWorker = new SharedWorker('worker.js'); -myWorker.port.start();- -
完全なサンプルについては、Basic shared worker example (run shared worker) を参照してください。
- -仕様 | -ステータス | -コメント | -
---|---|---|
{{SpecName('HTML WHATWG', "#dom-sharedworker-port", "AbstractWorker.onerror")}} | -{{Spec2('HTML WHATWG')}} | -- |
{{Compat("api.SharedWorker.port")}}
- -connect
イベントは、新しいクライアントが接続したときに共有ワーカーの {{domxref("SharedWorkerGlobalScope")}} に発生します。
バブリング | -なし | -
---|---|
キャンセル可能 | -いいえ | -
インターフェイス | -{{DOMxRef("MessageEvent")}} | -
イベントハンドラープロパティ | -{{domxref("SharedWorkerGlobalScope.onconnect")}} | -
この例は共有ワーカーファイルを示しています。メインスレッドから {{domxref("MessagePort")}} を通して Worker へのコネクションが発生したとき、 onconnect
イベントハンドラーが呼び出されます。イベントオブジェクトは {{domxref("MessageEvent")}} です。
接続しようとしているポート番号は、イベントオブジェクトの ports
引数で参照することができます。この参照にはポートを通じて来るメッセージを扱うために割り当てられた onmessage
ハンドラーがあり、その postMessage()
メソッドに Worker を使用してメインスレッドにメッセージを送り返すために使用することができます。
self.onconnect = function(e) { - var port = e.ports[0]; - - port.onmessage = function(e) { - var workerResult = 'Result: ' + (e.data[0] * e.data[1]); - port.postMessage(workerResult); - } - - port.start(); -}- -
実行している例を完成させるには、 Basic shared worker example (共有ワーカーを実行) をご覧ください。
- -{{domxref("EventTarget/addEventListener", "addEventListener()")}} メソッドを使用してイベントハンドラーを設定することもできます。
- -self.addEventListener('connect', function(e) { - var port = e.ports[0]; - - port.onmessage = function(e) { - var workerResult = 'Result: ' + (e.data[0] * e.data[1]); - port.postMessage(workerResult); - } - -});- -
仕様書 | -状態 | -
---|---|
{{SpecName('HTML WHATWG', "indices.html#event-workerglobalscope-connect", "connect event")}} | -{{Spec2('HTML WHATWG')}} | -
{{Compat("api.SharedWorkerGlobalScope.connect_event")}}
- -バブリング | +なし | +
---|---|
キャンセル可能 | +いいえ | +
インターフェイス | +{{DOMxRef("MessageEvent")}} | +
イベントハンドラープロパティ | +{{domxref("SharedWorkerGlobalScope.onconnect")}} | +
SharedWorkerGlobalScope
オブジェクト ( {{domxref("SharedWorker")}} グローバルスコープ) は、 {{domxref("window.self","self")}} キーワードでアクセスできます。一部の追加のグローバル関数、名前空間オブジェクト、コンストラクターは、通常はワーカーのグローバルスコープに関連付けられていませんが、利用することができ、 JavaScript リファレンスに列挙されています。ワーカーで利用できる機能の完全なリストを参照してください。
このインターフェイスは {{domxref("WorkerGlobalScope")}}、またその親の {{domxref("EventTarget")}} インターフェイスからプロパティを継承しており、したがって {{domxref("WindowTimers")}}, {{domxref("WindowBase64")}}, {{domxref("WindowEventHandlers")}} のプロパティを実装しています。
- -DedicatedWorkerGlobalScope
object itself.WorkerLocation
is a specific location object, mostly a subset of the {{domxref("Location")}} for browsing scopes, but adapted to workers.WorkerNavigator
is a specific navigator object, mostly a subset of the {{domxref("Navigator")}} for browsing scopes, but adapted to workers.This interface inherits event handlers from the {{domxref("WorkerGlobalScope")}} interface, and its parent {{domxref("EventTarget")}}, and therefore implements event handlers from {{domxref("WindowTimers")}}, {{domxref("WindowBase64")}}, and {{domxref("WindowEventHandlers")}}.
- -This interface inherits methods from the {{domxref("WorkerGlobalScope")}} interface, and its parent {{domxref("EventTarget")}}, and therefore implements methods from {{domxref("WindowTimers")}}, {{domxref("WindowBase64")}}, and {{domxref("WindowEventHandlers")}}.
- -SharedWorkerGlobalScope
's event loop, effectively closing this particular scope.WorkerGlobalScope
's event loop, effectively closing this particular scope. importScripts('foo.js', 'bar.js');
Listen to this event using addEventListener()
or by assigning an event listener to the oneventname
property of this interface.
connect
onconnect
property.仕様書 | -状態 | -備考 | -
---|---|---|
{{SpecName('HTML WHATWG', '#sharedworkerglobalscope', 'SharedWorkerGlobalScope')}} | -{{Spec2('HTML WHATWG')}} | -- |
{{Compat("api.SharedWorkerGlobalScope")}}
- -{{APIRef("Media Source Extensions")}}{{SeeCompatTable}}
- -SourceBufferList
インターフェイスは、複数の {{domxref("SourceBuffer")}} オブジェクトの単純なコンテナリストを表します。
特定の MediaSource
に追加された SourceBuffer
を含むソースバッファのリストは、{{domxref("MediaSource.sourceBuffers")}} プロパティを使用して取得できます。 個々のソースバッファは、配列演算子(つまり []
)または {{jsxref("Array.forEach", "forEach()")}} などの関数を使用してアクセスできます。
{{InheritanceDiagram}}
- -addsourcebuffer
イベントのイベントハンドラ。removesourcebuffer
イベントのイベントハンドラ。親インターフェイスである {{domxref("EventTarget")}} からメソッドを継承します。
- -SourceBufferList
: indexed property getterSourceBuffer
オブジェクトに配列演算子(つまり []
)でアクセスできます。未定
- -仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName('Media Source Extensions', '#sourcebufferlist', 'SourceBufferList')}} | -{{Spec2('Media Source Extensions')}} | -初期定義 | -
{{Compat("api.SourceBufferList")}}
-{{domxref("SourceBufferList")}} インターフェイスの length
読み取り専用プロパティは、リスト内の {{domxref("SourceBuffer")}} オブジェクトの数を返します。
var myListLength = sourceBufferList.length;- -
unsigned long 型の数。
- -未定
- -仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName('Media Source Extensions', '#idl-def-sourcebufferlist-length', 'length')}} | -{{Spec2('Media Source Extensions')}} | -初期定義 | -
{{Compat("api.SourceBufferList.length")}}
- -{{APIRef("Web Speech API")}}{{SeeCompatTable}}
- -Web Speech API の SpeechRecognitionAlternative
インターフェイスは、音声認識サービスにより認識されている一つの単語を表します。
このコードは、私たちの Speech color changer の例から抜粋しました。
- -recognition.onresult = function(event) { - // The SpeechRecognitionEvent results property returns a SpeechRecognitionResultList object - // The SpeechRecognitionResultList object contains SpeechRecognitionResult objects. - // It has a getter so it can be accessed like an array - // The first [0] returns the SpeechRecognitionResult at position 0. - // Each SpeechRecognitionResult object contains SpeechRecognitionAlternative objects that contain individual results. - // These also have getters so they can be accessed like arrays. - // The second [0] returns the SpeechRecognitionAlternative at position 0. - // We then return the transcript property of the SpeechRecognitionAlternative object - var color = event.results[0][0].transcript; - diagnostic.textContent = 'Result received: ' + color + '.'; - bg.style.backgroundColor = color; -}- - -
仕様書 | -策定状況 | -備考 | -
---|---|---|
{{SpecName('Web Speech API', '#speechreco-alternative', 'SpeechRecognitionAlternative')}} | -{{Spec2('Web Speech API')}} | -- |
{{Compat("api.SpeechRecognitionAlternative")}}
-アプリ内で音声認識を使用するには、manifest ファイルに次の許可設定を指定する必要があります:
- -"permissions": { - "audio-capture" : { - "description" : "Audio capture" - }, - "speech-recognition" : { - "description" : "Speech recognition" - } -}- -
特権アプリも必要なため、以下も同様に含める必要があります:
- -"type": "privileged"- -
{{APIRef("Web Speech API")}}{{ SeeCompatTable() }}
- -{{domxref("SpeechRecognitionResult")}} インターフェースの transcript
読み取り専用プロパティは、認識したワードの記録を含む文字列を返します。
連続認識において、連続した {{domxref("SpeechRecognitionResult")}} の連結がセッションの適切な記録を生成するように、必要に応じて先頭または末尾の空白が含まれます。
- -var myTranscript = speechRecognitionAlternativeInstance.transcript;- -
{{domxref("DOMString")}}。
- -このコードは、Speech color changer から抜き出しています。
- -recognition.onresult = function(event) { - // The SpeechRecognitionEvent results property returns a SpeechRecognitionResultList object - // The SpeechRecognitionResultList object contains SpeechRecognitionResult objects. - // It has a getter so it can be accessed like an array - // The first [0] returns the SpeechRecognitionResult at position 0. - // Each SpeechRecognitionResult object contains SpeechRecognitionAlternative objects that contain individual results. - // These also have getters so they can be accessed like arrays. - // The second [0] returns the SpeechRecognitionAlternative at position 0. - // We then return the transcript property of the SpeechRecognitionAlternative object - var color = event.results[0][0].transcript; - diagnostic.textContent = 'Result received: ' + color + '.'; - bg.style.backgroundColor = color; -}- -
仕様 | -ステータス | -コメント | -
---|---|---|
{{SpecName('Web Speech API', '#dfn-transcript', 'transcript')}} | -{{Spec2('Web Speech API')}} | -- |
{{Compat("api.SpeechRecognitionAlternative.transcript")}}
- -webkitSpeechRecognition
のようなプレフィックスが必要です; また、認識を動作させるには、Web サーバ上から提供する必要があります。media.webspeech.recognition.enable
フラグで有効にできますが、現在の音声認識はデスクトップ版の Firefox では機能しません - 必要な内部権限が整理されればすぐに適切に公開されます。アプリで音声認識を使用するには、manifest で次の許可が必要です:
- -"permissions": { - "audio-capture" : { - "description" : "Audio capture" - }, - "speech-recognition" : { - "description" : "Speech recognition" - } -}- -
特権アプリも必要なため、次のものも含める必要があります。
- -"type": "privileged"- -
{{APIRef("Web Speech API")}}{{SeeCompatTable}}
- -The SpeechRecognitionResult
interface of the Web Speech API represents a single recognition match, which may contain multiple {{domxref("SpeechRecognitionAlternative")}} objects.
This code is excerpted from our Speech color changer example.
- -recognition.onresult = function(event) { - // The SpeechRecognitionEvent results property returns a SpeechRecognitionResultList object - // The SpeechRecognitionResultList object contains SpeechRecognitionResult objects. - // It has a getter so it can be accessed like an array - // The first [0] returns the SpeechRecognitionResult at position 0. - // Each SpeechRecognitionResult object contains SpeechRecognitionAlternative objects that contain individual results. - // These also have getters so they can be accessed like arrays. - // The second [0] returns the SpeechRecognitionAlternative at position 0. - // We then return the transcript property of the SpeechRecognitionAlternative object - var color = event.results[0][0].transcript; - diagnostic.textContent = 'Result received: ' + color + '.'; - bg.style.backgroundColor = color; -}- -
Specification | -Status | -Comment | -
---|---|---|
{{SpecName('Web Speech API', '#speechreco-result', 'SpeechRecognitionResult')}} | -{{Spec2('Web Speech API')}} | -- |
{{Compat("api.SpeechRecognitionResult")}}
-To use speech recognition in an app, you need to specify the following permissions in your manifest:
- -"permissions": { - "audio-capture" : { - "description" : "Audio capture" - }, - "speech-recognition" : { - "description" : "Speech recognition" - } -}- -
You also need a privileged app, so you need to include this as well:
- -"type": "privileged"- -
{{APIRef("Web Speech API")}}{{ SeeCompatTable() }}
- -{{domxref("SpeechRecognitionResult")}}インターフェイスの isFinal
リードオンリーのプロパティは結果がファイナルかどうかの ({{domxref("Boolean")}} 型) のことです。true の場合は、これは結果を返す最終の時間です。false の場合は、暫定の結果を返し、後々それは更新されます。
var myIsFinal = speechRecognitionResultInstance.isFinal;- -
A {{domxref("Boolean")}}.
- -recognition.onresult = function(event) { - // The SpeechRecognitionEvent results property returns a SpeechRecognitionResultList object - // The SpeechRecognitionResultList object contains SpeechRecognitionResult objects. - // It has a getter so it can be accessed like an array - // The first [0] returns the SpeechRecognitionResult at position 0. - // Each SpeechRecognitionResult object contains SpeechRecognitionAlternative objects that contain individual results. - // These also have getters so they can be accessed like arrays. - // The second [0] returns the SpeechRecognitionAlternative at position 0. - // We then return the transcript property of the SpeechRecognitionAlternative object - var color = event.results[0][0].transcript; - diagnostic.textContent = 'Result received: ' + color + '.'; - bg.style.backgroundColor = color; - - console.log(event.results[0].isFinal); -}- -
仕様 | -状態 | -コメント | -
---|---|---|
{{SpecName('Web Speech API', '#dfn-isFinal', 'isFinal')}} | -{{Spec2('Web Speech API')}} | -- |
{{Compat("api.SpeechRecognitionResult.isFinal")}}
- -アプリで音声認識を利用する前に、下記の権限を manifest に追加する必要があります。
- -"permissions": { - "audio-capture" : { - "description" : "Audio capture" - }, - "speech-recognition" : { - "description" : "Speech recognition" - } -}- -
privileged アプリ権限も必要なので、下記も追加が必要です。
- -"type": "privileged"- -
{{APIRef("Web Speech API")}}{{SeeCompatTable}}
- -Web Speech API の SpeechSynthesisUtterance
インターフェイスは、発話リクエストを表します。これには、speech サービスが読み上げるコンテンツと、その読み上げ方についての情報 (言語、音の高低、音量) が含まれます。
SpeechSynthesisUtterance
オブジェクトのインスタンスを返します。SpeechSynthesisUtterance
は、その親インターフェイスである {{domxref("EventTarget")}} からのプロパティも継承します。
私たちの基本的な 音声合成のデモ では、最初に window.speechSynthesis
を使用して SpeechSynthesis コントローラーへの参照を取得します。必要な変数の定義後、 {{domxref("SpeechSynthesis.getVoices()")}} を使用して利用可能な音声のリストを取得し、それらの選択メニューを構成します。ユーザーは、そこから使用したい音声を選べます。
inputForm.onsubmit
ハンドラー内部では、preventDefault() でフォーム送信を停止し、テキスト {{htmlelement("input")}} に入力されたテキストを含む新しい {{domxref("SpeechSynthesisUtterance")}} インスタンスを作成します。その発声にユーザーが {{htmlelement("select")}} 要素で選択した音声を設定し、{{domxref("SpeechSynthesis.speak()")}} メソッドを通して発声の発話を開始します。
var synth = window.speechSynthesis; - -var inputForm = document.querySelector('form'); -var inputTxt = document.querySelector('input'); -var voiceSelect = document.querySelector('select'); - -var voices = synth.getVoices(); - -for(i = 0; i < voices.length ; i++) { - var option = document.createElement('option'); - option.textContent = voices[i].name + ' (' + voices[i].lang + ')'; - option.setAttribute('data-lang', voices[i].lang); - option.setAttribute('data-name', voices[i].name); - voiceSelect.appendChild(option); -} - -inputForm.onsubmit = function(event) { - event.preventDefault(); - - var utterThis = new SpeechSynthesisUtterance(inputTxt.value); - var selectedOption = voiceSelect.selectedOptions[0].getAttribute('data-name'); - for(i = 0; i < voices.length ; i++) { - if(voices[i].name === selectedOption) { - utterThis.voice = voices[i]; - } - } - synth.speak(utterThis); - inputTxt.blur(); -}- -
仕様書 | -策定状況 | -備考 | -
---|---|---|
{{SpecName('Web Speech API', '#utterance-attributes', 'SpeechSynthesisUtterance')}} | -{{Spec2('Web Speech API')}} | -- |
{{Compat("api.SpeechSynthesisUtterance")}}
-- -
If unset, the app's (i.e. the {{htmlelement("html")}} {{htmlattrxref("lang", "html")}} value) lang will be used, or the user-agent default if that is unset too.
- -var myLang = speechSynthesisUtteranceInstance.lang; -speechSynthesisUtteranceInstance.lang = 'en-US'; -- -
A {{domxref("DOMString")}} representing a BCP 47 language tag.
- -var synth = window.speechSynthesis;
-
-var inputForm = document.querySelector('form');
-var inputTxt = document.querySelector('input');
-var voiceSelect = document.querySelector('select');
-
-var voices = synth.getVoices();
-
- ...
-
-inputForm.onsubmit = function(event) {
- event.preventDefault();
-
- var utterThis = new SpeechSynthesisUtterance(inputTxt.value);
- var selectedOption = voiceSelect.selectedOptions[0].getAttribute('data-name');
- for(i = 0; i < voices.length ; i++) {
- if(voices[i].name === selectedOption) {
- utterThis.voice = voices[i];
- }
- }
- utterThis.lang = 'en-US';
- synth.speak(utterThis);
- inputTxt.blur();
-}
-
-Specification | -Status | -Comment | -
---|---|---|
{{SpecName('Web Speech API', '#dfn-utterancelang', 'lang')}} | -{{Spec2('Web Speech API')}} | -- |
{{Compat("api.SpeechSynthesisUtterance.lang")}}
- -Storage Access API(ストレージアクセス API)は、埋め込まれたクロスオリジンのコンテンツが、通常はファーストパーティのコンテキストでのみアクセスできるストレージ(これをオリジンのファーストパーティストレージと呼びます)に無制限にアクセスする方法を提供します。 API は、埋め込まれたリソースがファーストパーティストレージに現在アクセスできるかどうかを確認し、ユーザーエージェントからファーストパーティストレージへのアクセスを要求できるメソッドを提供します。
- -ほとんどのブラウザーは、埋め込まれたクロスオリジンリソースのクッキーおよびサイトデータへのアクセスを制限する多くのストレージアクセスポリシーを実装しています。 これらの制限は、各最上位オリジンの下に埋め込まれたリソースに一意のストレージスペースを与えることから、サードパーティのコンテキストでリソースが読み込まれたときのストレージアクセスの完全なブロックにまで及びます。
- -特にサードパーティのクッキーブロックポリシーに関する意味論はブラウザーごとに異なりますが、コア機能は似ています: サードパーティのコンテキストに埋め込まれたクロスオリジンリソースには、ファーストパーティのコンテキストで読み込まれたときにアクセスできるのと同じクッキーとサイトストレージへのアクセスが与えられません。
- -これらのクッキーブロックポリシーは、ファーストパーティストレージへのアクセスを必要とする埋め込まれたクロスオリジンコンテンツを中断することが知られています。 例として、フェデレーションログイン(federated login、複数組織にまたがったログイン)では、ファーストパーティストレージに保存されている認証クッキーへのアクセスが必要になることが多く、これらのクッキーが利用できない場合、ユーザーは各サイトに個別にサインインする(または完全に中断する)必要があります。 中断した場合、サイト所有者は、ユーザーにサイトを例外として追加するか、ポリシーを完全に無効にすることを推奨することがよくあります。 結果として、埋め込まれたコンテンツとのやり取りを継続することを希望するユーザーは、すべての埋め込まれたオリジンおよびおそらくすべてのウェブサイトから読み込まれたリソースのブロックポリシーを大幅に緩和する必要があります。
- -Storage Access API は、この問題を解決することを目的としています。 埋め込まれたクロスオリジンのコンテンツは、{{domxref("Document.requestStorageAccess()")}} メソッドを介してサイトごとにファーストパーティストレージへの無制限のアクセスを要求し、{{domxref("Document.hasStorageAccess()")}} メソッドを介して既にアクセス権があるかどうかを確認できます。
- -さらに、セキュリティ上の理由から、サンドボックス化した {{htmlelement("iframe")}} にはデフォルトでストレージアクセスを許可できません。 そのため、API は、allow-storage-access-by-user-activation
sandbox トークンも追加します。 次のように、埋め込まれたウェブサイトは、これを追加してストレージアクセス要求が成功することを許可するとともに、allow-scripts
と allow-same-origin
を使用して API の呼び出しを許可し、クッキーを持つことができるオリジンで実行します。
<iframe sandbox="allow-storage-access-by-user-activation - allow-scripts - allow-same-origin"> - ... -</iframe>- -
API は、潜在的なストレージの例外を、ユーザーがやり取りする意図を示したオリジンに制限するように設計されています。 これは、次の制約によって実施されます。
- -ブラウザーは、到来するストレージアクセス要求を許可するかどうかの決定にユーザーを関与させることを決定する場合があります。 ストレージ許可の存続期間とブラウザーがユーザーに通知することを決定する状況に関する詳細は現在作業中であり、準備ができ次第発表されます。
- -埋め込まれたクロスオリジンの文書によって requestStorageAccess()
が呼び出されると、ユーザーエージェントは、要求オリジンにストレージアクセスを許可するかどうかの決定にユーザーを関与させることを選択できます。 現在、プロンプトヒューリスティック(Prompting heuristics、プロンプトするべきかを決める発見的方法)は Storage Access API の2つの実装者によって異なります。 Safari は、以前にストレージアクセスを受け取っていないすべての埋め込まれた追跡コンテンツにプロンプトを表示します。 Firefox は、追跡オリジンがサイトのしきい値数を超えてストレージアクセスを要求した後にのみユーザーにプロンプトします。 詳細については、{{domxref("Document.requestStorageAccess()")}} を参照してください。
API の表面は同じですが、Storage Access API を使用するウェブサイトは、Firefox と Safari の間で受け取るストレージアクセスのレベルと範囲に違いがあることを予期する必要があります。 これは、2つのブラウザーに実装されているストレージアクセスポリシーの違いが原因です。 Firefox に固有の設計プロパティを以下に要約します。
- -tracker.example
が最上位オリジン foo.example
でファーストパーティストレージへのアクセスを既に取得しており、ユーザーが foo.example
からのページに埋め込まれた tracker.example
からのページに、30日以内に再度訪問した場合、埋め込まれたオリジンは、読み込まれるとすぐにストレージにアクセスできます。foo.example
のページに tracker.example
の複数の {{htmlelement("iframe")}} が埋め込まれ、それらの <iframe>
の1つが Storage Access API を使用してストレージアクセスを正常に取得した場合、foo.example
最上位オリジン上の tracker.example
からの他のすべての iframe は、requestStorageAccess() を個別に呼び出す必要なく、すぐにストレージアクセスを取得します。tracker.example
から埋め込まれたページが以前に最上位オリジン foo.example
でストレージアクセスを正常に取得していた場合、foo.example
上の tracker.example
からのすべての埋め込まれたサブリソース(スクリプト、画像、スタイルシートなど)がファーストパーティストレージにアクセスして読み込まれます。 つまり、Cookie ヘッダーを送って、到来する {{httpheader("Set-Cookie")}} ヘッダーを尊重する可能性があります。requestStorageAccess()
から返された Promise が解決されると、埋め込まれたページは、クッキーだけでなく、ファーストパーティストレージ全体にアクセスできます。 これには、Web Storage、IndexedDB、DOM Cache などの API へのアクセスが含まれます。追跡クッキーをブロックするための Firefox の新しいストレージアクセスポリシーの文書には、ストレージアクセス許可の範囲の詳細な説明が含まれています。
- -Storage Access API のメソッドは、{{domxref("Document")}} インターフェイスに実装されます。
- -注: ユーザーとのやり取りは、これらの両方のメソッドによって返される Promise に伝播し、呼び出し元は、ユーザーからの2回目のクリックを必要とせずに、ユーザーとのやり取りを必要とするアクションを実行できます。 例えば、呼び出し元は、Firefox のポップアップブロッカーをトリガーせずに、解決した Promise からポップアップウィンドウを開くことができます。
-{{htmlelement("iframe")}} 要素の sandbox
属性には新しいトークン allow-storage-access-by-user-activation
があり、サンドボックス化した <iframe>
は Storage Access API を使用してストレージアクセスを要求できます。
API は現在、提案段階にあり、標準化プロセスはまだ開始されていません。 現在、Apple の Introducing Storage Access API ブログ投稿、および WHATWG HTML issue 3338 — Proposal: Storage Access API で API の仕様の詳細を見つけることができます。
- -{{Compat("api.Document.hasStorageAccess")}}
- -{{Compat("api.Document.requestStorageAccess")}}
- -