concept-bc-script

スクリプトの有効と無効 (Web)

[2] スクリプトが有効 (scripting is enabled) スクリプトが無効 (scripting is disabled) とは、 スクリプトの実行の可否を指します。またHTML構文解析器にはスクリプトフラグ (scripting flag) があります。

仕様書

閲覧文脈と節点のスクリプト有効性

[3] 閲覧文脈については、次の条件がすべて満たされた時スクリプトが有効となり、 そうでないときスクリプトが無効となります >>1

[16] XHRnew DocumentcreateDocument で作った文書閲覧文脈を持たないので、 従ってスクリプトが無効な状態となります。
[20] template 要素の中身は雛形内容に属しますが、 雛形内容節点文書は外側の文書とは別の閲覧文脈に属さない文書なので、 スクリプトが無効となります。
[21] contenteditabledesignModeスクリプトが有効か否かとは無関係です。

[7] 節点については、節点文書が関連付けられた閲覧文脈を持ち、 その閲覧文脈についてスクリプトが有効であるならスクリプトが有効であり、 そのような閲覧文脈がないか、閲覧文脈スクリプトが無効なら、スクリプトが無効です >>1

[13] スクリプトの有効性は次の場面に影響します。

[18] スクリプトが定義された時とコールバックとして実行される時の両方にチェックが入っているので、 定義と実行の間にスクリプトが無効に変化してもスクリプトは実行されません。

[23] スクリプトの実行中にスクリプトが無効にされた時は、 スクリプトは直ちに終端されるべきです >>22

[46] 設定群オブジェクトに関するスクリプトを実行できるか検査 (check if we can run script) は、 次のようにしなければなりません >>37

  1. [48] 設定群オブジェクト大域オブジェクトWindow であって、その Document完全に活性ないなら、
    1. [49]実行しない (do not run) 」を返します。
  2. [50] それ以外で、 設定群オブジェクト有責閲覧文脈スクリプト無効なら、
    1. [51]実行しない (do not run) 」を返します。
  3. [52] それ以外なら、
    1. [53]実行する (run) 」を返します。

[56] この検査は、古典スクリプトの実行モジュールスクリプトの実行や、 EnqueueJob から呼び出されます。

[54] この検査はかつてはコールバックを走らせる準備の一部として定義されていました。

構文解析器のスクリプトフラグ

[9] HTML構文解析器が作られた時点において構文解析器と関連付けられた文書節点スクリプトが有効なら、 構文解析器スクリプトフラグが「有効」に設定されます。そうでなければ「無効」に設定されます。 >>8

[37] XML構文解析器にはXMLスクリプト対応有効 (XML scripting support enabled) またはXMLスクリプト対応無効 (XML scripting support disabled) のフラグがあります。既定値は有効です。 >>41

[11] 閲覧文脈節点のスクリプトの有効性は動的に変更されることがありますが、 構文解析器スクリプトフラグは一度設定されたら変更されません。 ですから、noscript 要素の中身が構文解析された文書スクリプトが実行されることもあり得ます。 構文解析してから直列化するまでにスクリプトが有効かどうかが変化すると、 noscript 要素の中身が元の状態に戻らない (再度構文解析したら違う DOM になる) 可能性もあります。
[12] このフラグは HTML構文解析器には存在しますが、 XML構文解析器には存在しません。 スクリプトの実行自体は閲覧文脈スクリプトが有効かどうかにより制御されます。

[15] スクリプトフラグは次の場面に影響します。

[17] noscript 要素の中身は、有効なら終了タグまですべてテキストとみなされ、 無効なら通常の要素内容として解釈されます。

[43] スクリプトフラグスクリプト無効節点について構文解析器を作った場合の他、次の場合に無効に設定されます。

XXX

利用者インターフェイス

[26] 古くからWebブラウザーの設定画面にはスクリプトを無効にするオプションが用意されていました。

[24] スクリプトにより (alert など) またはスクリプトの動作により (実行時間制限を超えた場合など) 利用者が反応を求められる時には、 利用者エージェント利用者スクリプトを無効にできるようにすることがすすめられています (encouraged) >>22

[27] このような仕組みは Opera が古くから実装していました。最近はどの Webブラウザーも実装しています。

[25] 利用者エージェントは、閲覧文脈を閉じるためだけのためにスクリプトを無効にする方法 (例えば unload を実行しないで閲覧文脈を閉じるなど) を提供して構いません >>22

[28] Webブラウザーによっては、タブごと、起源ごとなどの単位でスクリプトを無効にするメニュー項目などが用意されています。

スクリプトの有効・無効と Web 互換性

[30] 利用者エージェントスクリプトを実装することが義務付けられていません。

[31] 著者は、スクリプトが実装されない可能性があること、 実装されていても無効化されている可能性があることを認識し、 できるだけスクリプトが動作しなくても利用可能であるように配慮するべきです。

[32] とはいえ現在 Web 上の相当大多数の文書は、スクリプトが実行されることを想定しています。 そのほとんどすべては JavaScript が実行されることを要求しています。 利用者エージェントWeb互換であるためには、 あまり古くない版の JavaScript を実装し、既定の状態で有効としなければなりません。

[33] スクリプトを実装しない利用者エージェントスクリプトが無効な状態で動作するのが好ましいと考えられますが、 0種類のスクリプト言語を実装しているとの認識のもと、スクリプトが有効な状態で動作するものもあるかもしれません。

[34] スクリプトを実装する (1つ以上のスクリプト言語を実装する) 利用者エージェントであっても、スクリプトが有効な場合の処理とスクリプトが無効な場合の処理の両方を実装する必要があります。

有効と無効は利用者が切り替える場合の他に、 iframe 要素CSPsandbox によって著者が切り替える場合があります。
[35] スクリプトに対応しつつも sandbox に対応しないような実装は、 もはやWeb互換ではありません。

[57] Webサイトによっては、著者の自己本位なスクリプトが実行されることにより、 利用者の閲覧操作が妨害されるケースがあります。利用者エージェントは、 利用者の体験を向上させるため、 Webサイトないし起源、 あるいはWebページ単位でスクリプトが無効に固定する機能を提供するべきかもしれません。

実際幾つかの Webブラウザーにはそのような機能があります。

[58] 例えば特定の画面の大きさを想定したスクロールの挙動をスクリプトで実装しているために、 著者と異なる画面サイズの端末で表示するとすべての内容を表示できないかもしれません。

[59] 例えば悪意のある著者Webブラウザー文脈メニューが表示されないように右クリック等を妨害するスクリプトを記述していることがあります。

歴史

関連

[14] innerHTMLXSLTProcessor や、一旦実行された script 要素ではスクリプトが実行されませんが、これは "already-started" flag によって処理されるので、スクリプトが有効か否かとは別です。

[29] Clarify settings object, realm, and global relationships · whatwg/html@0866f1b ( 版) <https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[60] Editorial: clean up "scripting is disabled" usage (Ms2ger著, ) <https://github.com/whatwg/html/commit/56d66456a2103fe2ade93b9ca5a305d19dfbfae8>