object 要素

4.7.4 object 要素

カテゴリー:
フロー・コンテント
フレージング・コンテント
エンベッディッド・コンテント
この要素が usemap 属性を持つ場合: インタラクティブ・コンテント
リスト対象で、サブミット可能で、再関連付け可能フォーム関連要素
パルパブル・コンテント
この要素を使うことができるコンテキスト:
エンベッディッド・コンテントが期待される場所
コンテントモデル:
0 個以上の param 要素だが、そのときはトランスペアレント
コンテント属性:
グローバル属性
data - リソースのアドレス
type - 組込リソースのタイプ
typemustmatch - type 属性と Content-Type 値が、リソースが使われるべきかに関して、一致する必要があるかどうか
name - ネストされたブラウジングコンテキストの名前
usemap - イメージマップの名前
form - form 要素にコントロールを関連付ける
width - 水平方向の寸法
height - 垂直方向の寸法
text/html におけるタグの省略:
どちらのタグも省略できません。
指定可能な ARIA role 属性 の値:
application, document または img または presentation
指定可能な ARIA ステートとプロパティ属性:
グローバル aria-* 属性
許可ロールに該当する aria-* 属性
DOM インタフェース:
interface HTMLObjectElement : HTMLElement {
           attribute DOMString data;
           attribute DOMString type;
           attribute boolean typeMustMatch;
           attribute DOMString name;
           attribute DOMString useMap;
  readonly attribute HTMLFormElement? form;
           attribute DOMString width;
           attribute DOMString height;
  readonly attribute Document? contentDocument;
  readonly attribute WindowProxy? contentWindow;

  readonly attribute boolean willValidate;
  readonly attribute ValidityState validity;
  readonly attribute DOMString validationMessage;
  boolean checkValidity();
  void setCustomValidity(DOMString error);

  legacycaller any (any... arguments);
};

Depending on the type of content instantiated by the object element, the node also supports other interfaces.

object 要素は外部リソースを表すことができます。それは、リソースのタイプによりますが、イメージ、ネストされたブラウジングコンテキストプラグインによって処理される外部リソース、のいずれかとして扱われます。

data 属性は、存在すれば、リソースのアドレスを指定します。存在すれば、この属性は、 潜在的にスペースで囲まれた空でない妥当な URL でなければいけません。

ウェブ制作者は、他の信頼できないオリジンからのリソースを参照するなら、以下で定義する typemustmatch 属性を使うよう、強く求められます。この属性がないと、リモート・ホスト上の攻撃者がプラグインのメカニズムを使って任意のスクリプトを実行できてしまう場合が考えられます。たとえ、ウェブ制作者が Flash の "allowScriptAccess" パラメーターのような機能を使ったとしてもです。

type 属性は、存在すれば、リソースのタイプを指定します。存在すれば、この属性は、妥当な MIME タイプでなければいけません。

data 属性か type 属性のうち少なくとも一つは存在していなければいけません。

typemustmatch 属性は論理属性で、存在すれば、data 属性で指定されたリソースは type 属性の値と前述のリソースの Content-Type が一致しているときにだけ使えることを表します。

typemustmatch 属性は、data 属性と type 属性の両方が存在しない限り、指定してはいけません。

name 属性は、存在すれば、妥当なブラウジングコンテキスト名でなければいけません。指定された値は、適用可能であれば、ネストされたブラウジングコンテキストの名前付けに使われます。

次に挙げる状況が発生した場合には:

このとき、ユーザーエージェントは、object 要素が何を表すのかを (再) 決定するために、次の手順を実行するタスクをキューイングしなければいけません。このタスクに対するタスクソースは、DOM 操作タスクソースです。キューイングまたはアクティブに実行されるこのタスクは、この要素のドキュメントの load イベントを遅延させなければいけません。

  1. ユーザーが、この object 要素の通常のビヘイビアの代わりに、この要素のフォールバック・コンテントを表示する設定をしているなら、fallback とラベル付けされた後述の手順へジャンプします。

    たとえば、この要素のフォールバック・コンテントのほうがユーザーにとってアクセスしやすい形式を使っているのであれば、ユーザーは、そのコンテンツを表示するよう求めることがあるでしょう。

  2. この要素の祖先にメディア要素がある、または、祖先にフォールバック・コンテントを表示していない object 要素がいる、または、この要素がブラウジングコンテキストを持つ Document の中にない、または、この要素の Document完全にアクティブでない、または、この要素がまだ HTML パーサー、または、XML パーサー開始要素のスタックにある、または、この要素がレンダリングされていないなら、fallback とラベル付けされた後述の手順へジャンプします。

  3. classid 属性が存在し、それが空文字列でない値を持つ場合: ユーザーエージェントが classid 属性の値に応じて適切なプラグインを見つけることができ、かつ、プラグインがサンドボックス化されていないか、プラグイン安全に実行できる、のいずれかであれば、そのプラグイン使われるべきです。そして、data 属性があれば、その値はそのプラグインに引き渡されるべきです。適切なプラグインが見つけることができない、または、そのプラグインがエラーを報告するなら、fallback とラベル付けされた後述の手順へジャンプします。

  4. data 属性が存在し、その値が空文字列でない場合:

    1. type 属性が存在し、かつ、その値が、ユーザーエージェントがサポートしているタイプではない、そして、ユーザーエージェントがプラグインを見つけることができるタイプでないなら、ユーザーエージェントは、コンテンツをフェッチして本当のタイプを確かめることなしに、fallback とラベル付けされた後述の手順へジャンプすることができます。

    2. data 属性によって指定された URL を、その要素に対して、解決します。

    3. それが失敗したら、その要素で error という名前のtシンプルなイベントを発出し、fallback とラベル付けされた後述の手順へジャンプします。

    4. その要素がブラウジングコンテキスト・スコープ・オリジンを持っていれば、そこから結果として得られた絶対 URLフェッチします。

      リソースのフェッチは、ひとたびリソースがフェッチされたら (次に定義します)、ネットワーキング・タスクソースによってキューイングされるタスクが実行されるまで、その要素のドキュメントの load イベントを遅らせなければいけません。

      アプリケーションキャッシュのネットワーキング・モデルの目的に対しては、このフェッチ処理は、子ブラウジングコンテキストのためではありません (とはいえ、後述のとおり、これは、結局のところは、それのために使われていることになります)。

    5. リソースがまだ利用できないなら (リソースがキャッシュから手に入らなかったため、リソースのローディングでネットワーク越しのリクエストを作る必要があったなどの理由で)、fallback とラベル付けされた後述の手順へジャンプします。ひとたびリソースが手に入って、ネットワーキング・タスクソースによってキューイングされるタスクは、この手順のこのアルゴリズムを再び開始しなければいけません。リソースは徐々にロードすることができます。つまり、ユーザーエージェントは、リソースの処理を開始するのに十分なデータが入手できたら、リソースを "利用可能" だと見なすことにできます。

    6. ロードが失敗したら (たとえば、HTTP 404 エラーや DNS エラーがあったなど)、この要素で error という名前のシンプルなイベントを発出し、fallback とラベル付けされた後述の手順へジャンプします。

    7. 次のとおり、resource type を決定します:

      1. resource type を unknown とします。

      2. object 要素が type 属性と typemustmatch 属性を持ち、リソースが関連 Content-Type メタデータを持ち、リソースの Content-Type メタデータに指定されたタイプが大文字と小文字を区別せずに要素の type 属性の値に一致すれば、resource type をそのタイプとして、handler とラベル付けされた後述の手順へジャンプします。

      3. object 要素が typemustmatch 属性を持っていれば、handler とラベル付けされた後述の手順へジャンプします。

      4. ユーザーエージェントがこのリソースに対して Content-Type ハンドラに厳密に従うように設定されており、そのリソースが関連 Content-Type メタデータを持つなら、resource type を、そのリソースの Content-Type メタデータに指定されたタイプとして、handler とラベル付けされた後述の手順へジャンプします。

        これによって脆弱性を招く可能性があります。それは、サイトが特定のプラグインを使うリソースを組み込もうとしているものの、そのリモートのサイトは、ザーエージェントに、それを無効にして違うセキュリティー特性を持つ違うプラグインを呼び起こすリソースを提供するような場合です。

      5. type 属性が object 要素に存在し、その属性値がユーザーエージェントがサポートしているタイプでないけれども、それがプラグインがサポートしているタイプであるなら、resource type を、その type 属性に指定されているタイプとして、handler とラベル付けされた後述の手順へジャンプします。

      6. 次のリストのうち、適切な手順のセットを実行します:

        If the resource has associated Content-Type metadata
        1. Let binary be false.

        2. If the type specified in the resource's Content-Type metadata is "text/plain", and the result of applying the rules for distinguishing if a resource is text or binary to the resource is that the resource is not text/plain, then set binary to true.

        3. If the type specified in the resource's Content-Type metadata is "application/octet-stream", then set binary to true.

        4. If binary is false, then let the resource type be the type specified in the resource's Content-Type metadata, and jump to the step below labeled handler.

        5. If there is a type attribute present on the object element, and its value is not application/octet-stream, then run the following steps:

          1. If the attribute's value is a type that a plugin supports, or the attribute's value is a type that starts with "image/" that is not also an XML MIME type, then let the resource type be the type specified in that type attribute.

          2. Jump to the step below labeled handler.

        Otherwise, if the resource does not have associated Content-Type metadata
        1. If there is a type attribute present on the object element, then let the tentative type be the type specified in that type attribute.

          Otherwise, let tentative type be the sniffed type of the resource.

        2. If tentative type is not application/octet-stream, then let resource type be tentative type and jump to the step below labeled handler.

      7. 指定されたリソース (リダイレクト後) の URL に URL パーサーアルゴリズムを適用した結果が、パスコンポーネントがプラグインがサポートするパターンに一致するパース済み URL になったなら、resource type を、そのプラグインが扱うことができるタイプとします。

        たとえば、プラグインは、4 つの文字の列 ".swf" で終わるパスコンポーネントを持つリソースを扱うことができると言うのかもしれません。

      It is possible for this step to finish, or for one of the substeps above to jump straight to the next step, with resource type still being unknown. In both cases, the next step will trigger fallback.

    8. Handler: Handle the content as given by the first of the following cases that matches:

      If the resource type is not a type that the user agent supports, but it is a type that a plugin supports

      If plugins are being sandboxed and the plugin that supports resource type cannot be secured, jump to the step below labeled fallback.

      Otherwise, the user agent should use the plugin that supports resource type and pass the content of the resource to that plugin. If the plugin reports an error, then jump to the step below labeled fallback.

      If the resource type is an XML MIME type, or if the resource type does not start with "image/"

      The object element must be associated with a newly created nested browsing context, if it does not already have one.

      If the URL of the given resource is not about:blank, the element's nested browsing context must then be navigated to that resource, with replacement enabled, and with the object element's document's browsing context as the source browsing context. (The data attribute of the object element doesn't get updated if the browsing context gets further navigated to other locations.)

      If the URL of the given resource is about:blank, then, instead, the user agent must queue a task to fire a simple event named load at the object element. No load event is fired at the about:blank document itself.

      The object element represents the nested browsing context.

      If the name attribute is present, the browsing context name must be set to the value of this attribute; otherwise, the browsing context name must be set to the empty string.

      In certain situations, e.g. if the resource was fetched from an application cache but it is an HTML file with a manifest attribute that points to a different application cache manifest, the navigation of the browsing context will be restarted so as to load the resource afresh from the network or a different application cache. Even if the resource is then found to have a different type, it is still used as part of a nested browsing context: only the navigate algorithm is restarted, not this object algorithm.

      If the resource type starts with "image/", and support for images has not been disabled

      Apply the image sniffing rules to determine the type of the image.

      The object element represents the specified image. The image is not a nested browsing context.

      If the image cannot be rendered, e.g. because it is malformed or in an unsupported format, jump to the step below labeled fallback.

      Otherwise

      The given resource type is not supported. Jump to the step below labeled fallback.

      If the previous step ended with the resource type being unknown, this is the case that is triggered.

    9. この要素のコンテンツは、object 要素が表すものではありません。

    10. リソースが完全にロードされたら、この要素で load という名前のシンプルなイベントを発出するタスクをキューイングします。

      このタスクに対するタスクソースは、DOM 操作タスクソースです。

  5. data 属性は無いが type 属性がある、かつ、ユーザーエージェントが type 属性の値に応じて適切なプラグインを見つけることができる、かつ、プラグインがサンドボックス化されていないか、そのプラグイン安全に実行できる、のいずれかなら、そのプラグイン使われるべきです。これらの条件を満たすことができない、または、そのプラグインがエラーを報告するなら、fallback とラベル付けされた後述の手順へジャンプします。

  6. Fallback: この object 要素は、この要素の子を表します。ただし、最初の param 要素となる子は除きます。これは、その要素のフォールバック・コンテントです。その要素がインスタンス化されたプラグインを持つなら、それをアンロードします。

上記のアルゴリズムがプラグインをインスタンス化するとき、ユーザーエージェントは採用されたプラグインに、その要素にあるすべての属性の名前と値を引き渡すべきです。引き渡しの順番は、それらが要素に追加された順です。パーサーによって追加された属性も伴いますが、それはソース順に並べられます。後ろに "PARAM" という名前のパラメータが続きますが、その値は null です。そして、object 要素の子となる param 要素によって与えられたすべてのパラメーターの名前と値がツリー順で続きます。プラグインがスクリプト可能なインタフェースをサポートするなら、その要素を表す HTMLObjectElement オブジェクトのインタフェースを利用できるようにするべきです。この object 要素はプラグインを表します。そのプラグインは、ネストされたブラウジングコンテキストではありません。

プラグインは、object 要素の Documentアクティブ・サンドボックス・フラグセットサンドボックス化プラグイン・ブラウジングコンテキスト・フラグがセットされているなら、object 要素の目的においては、サンドボックス化されます。

上記のアルゴリズムによって、object 要素のコンテンツはフォールバック・コンテントとして動作します。これは、参照リソースが表示できないときにだけ使われます(たとえば、404 エラーを返したといった理由で)。これによって、複数の object 要素はお互いにネストすることができ、複数のユーザーエージェントに異なる機能を提供することができます。ユーザーエージェントは、自身がサポートしている機能のうち最初のものを採用します。

name 属性がセットされたとき、その object 要素がネストされたブラウジングコンテキストを持つなら、その名前は新たな値に変更されなければいけません。この属性が削除され、その object 要素がブラウジングコンテキストを持つなら、そのブラウジングコンテキスト名は空文字列にセットされなければいけません。

usemap 属性は、object 要素がイメージを表した上で存在すれば、イメージマップが関連づけられることを表すことができます。この属性は、object 要素がイメージを表していないならば、無視されなければいけません。

form 属性は、object 要素をそのフォームオーナーに明示的に関連づけるために使います。

制約バリデーション: object 要素は常に制約バリデーションから除外されます。

object 要素はディメンジョン属性をサポートします。

IDL 属性 data, type, name は、それぞれ同じ名前のコンテント属性を反映しなければいけません。typeMustMatch IDL 属性は、typemustmatch コンテンツ属性を反映しなければいけません。useMap IDL 属性は、usemap コンテンツ属性を反映しなければいけません。

contentDocument IDL 属性は、object 要素のネストされたブラウジングコンテキストアクティブドキュメントが存在し、その実効スクリプトオリジンが、現設定オブジェクトによって指定された実効スクリプトオリジン同じオリジンならば、その Document を返さなければいけません。なければ、null を返さなければいけません。

contentWindow IDL 属性は、object 要素のネストされたブラウジングコンテキストがあれば、その WindowProxy を返さなければいけません。なければ、null を返さなければいけません。

willValidate, validity, validationMessage 属性と、checkValidity(), setCustomValidity() メソッドは、制約バリデーション API の一部です。form IDL 属性は、この要素の forms API の一部です。

すべての object 要素は legacy caller operation を持ちます。object 要素が インスタンス化済みのプラグインを持ち、それが legacy caller operation を定義するスクリプト可能なインタフェースをサポートするなら、それは、その object の legacy caller operation のビヘイビアでなければいけません。そうでなければ、その object の legacy caller operation は、NotSupportedError 例外を投げなければいけません。

次の例では、Java アプレットが object 要素を使ってページに組み込まれています。(一般的にいえば、このようなアプレットの利用を避け、代わりに、ネイティブの JavaScript と HTML を機能提供のために使う方が良いでしょう。こうすることで、サードパーティのプラグインを要求せずとも、すべてのブラウザでこのアプリケーションが動作するでしょう。多くのデバイス、とりわけ組込デバイスは、Java といったサードパーティ製テクノロジーをサポートしていません。)

<figure>
 <object type="application/x-java-applet">
  <param name="code" value="MyJavaClass">
  <p>Java が利用できないか無効にされています。</p>
 </object>
 <figcaption>わたしの Java 時計</figcaption>
</figure>

この例では、object 要素を使って、一方の HTML ページが、もう一方のページに組み込まれています。

<figure>
 <object data="clock.html"></object>
 <figcaption>わたしの HTML 時計</figcaption>
</figure>

次の例は、どのようにして プラグインを HTML の中で使うことができるのかを示しています(ここでは、ビデオファイルを見せるために、Flash プラグインを使います)。Flash を組み込んでいないユーザーには、フォールバックを提供しています。ここでは、video 要素をサポートしているユーザーエージェントを使っているユーザーに対しては video 要素を使ってビデオを見せるようにしています。そして、最後に、Flash にも video にも対応していないブラウザーを使っているユーザーに対しては、ビデオへのリンクを提供しています。

<p>わたしのビデオをご覧ください:
 <object type="application/x-shockwave-flash">
  <param name=movie value="http://video.example.com/library/watch.swf">
  <param name=allowfullscreen value=true>
  <param name=flashvars value="http://video.example.com/vids/315981">
  <video controls src="http://video.example.com/vids/315981">
   <a href="http://video.example.com/vids/315981">ビデオを見る</a>.
  </video>
 </object>
</p>

※ 原文:http://www.w3.org/TR/2014/REC-html5-20141028/embedded-content-0.html#the-object-element