[2] [DFN[[RUBYB[[[スクリプトが有効]]]@en[scripting is enabled]]]]、[DFN[[RUBYB[[[スクリプトが無効]]]@en[scripting is disabled]]]]とは、
[[スクリプト]]の実行の可否を指します。また[[HTML構文解析器]]には[DFN[[RUBYB[[[スクリプトフラグ]]]@en[scripting flag]]]]があります。

* 仕様書

[REFS[
- [1] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2013-12-19 00:10:55 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#enabling-and-disabling-scripting>'''
- [8] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2013-12-19 00:10:55 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#scripting-flag>
- [47] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-01-29 19:08:57 +09:00]] 版) <https://html.spec.whatwg.org/#check-if-we-can-run-script>
- [22] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#killing-scripts>
- [41] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-09-08 22:53:16 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#xml-scripting-support-enabled>
]REFS]

* 閲覧文脈と節点のスクリプト有効性

[3] [[閲覧文脈]]については、次の条件がすべて満たされた時[[スクリプトが有効]]となり、
そうでないとき[[スクリプトが無効]]となります [SRC[>>1]]。
[FIG(list)[
- [4] [[利用者エージェント]]が[[スクリプト]]に対応している
- [5] [[利用者]]がその時点で当該[[閲覧文脈]]について[[スクリプト]]を無効にしていない
- [6] [[閲覧文脈]]の[[活性文書]]の[[活性砂箱化フラグ集合]]において[[砂箱化スクリプト閲覧文脈フラグ]]が設定されていない
]FIG]

;; [10] [[砂箱化スクリプト閲覧文脈フラグ]]は [CODE(HTMLe)@en[[[iframe]]]] [[要素]]の [CODE(HTMLa)@en[[[sandbox]]]]
[[属性]]や [[CSP]] の [CODE(HTTP)@en[[[sandbox]]]] [[指令]]によって設定できます。

;; [16] [[XHR]] や [CODE(JS)@en[[[new]] [[Document]]]] や [CODE(DOMm)@en[[[createDocument]]]] で作った[[文書]]は[[閲覧文脈]]を持たないので、
従って[[スクリプトが無効]]な状態となります。

;; [20] [CODE(HTMLe)@en[[[template]]]] [[要素]]の中身は[[雛形内容]]に属しますが、
[[雛形内容]]の[[節点文書]]は外側の[[文書]]とは別の[[閲覧文脈]]に属さない[[文書]]なので、
[[スクリプトが無効]]となります。

;; [21] [CODE(HTMLa)@en[[[contenteditable]]]] や [CODE(DOMa)@en[[[designMode]]]] は[[スクリプトが有効]]か否かとは無関係です。

[7] [[節点]]については、[[節点文書]]が関連付けられた[[閲覧文脈]]を持ち、
その[[閲覧文脈]]について[[スクリプトが有効]]であるなら[[スクリプトが有効]]であり、
そのような[[閲覧文脈]]がないか、[[閲覧文脈]]で[[スクリプトが無効]]なら、[[スクリプトが無効]]です [SRC[>>1]]。

[13] スクリプトの有効性は次の場面に影響します。
[FIG(list)[
- [44] [[スクリプト]]の作成
-- 無効なら、[[スクリプトの準備]]が中断されます。
-- 有効なら、[[古典スクリプトの作成]]や[[モジュールスクリプトの作成]]で[[スクリプト]]が実行されます
-- 有効なら、[[イベントハンドラー内容属性]]が設定された時に実際に[[イベントハンドラー]]として設定されます
- [45] [[スクリプト]]の実行
-- 有効なら、[[スクリプトを実行できるか検査]]で実行と判断されます。
- [[fetch]]
-- [CODE(HTMLe)@en[[[img]]]] [[要素]]の [CODE(HTMLa)@en[[[src]]]] [[属性]]が設定された時、有効なら直ちに画像の取得が開始されますが、無効なら必要になるまで遅延できます
- [[レンダリング]]
-- 有効なら [CODE(HTMLe)@en[[[noscript]]]] はなにも[[表現]]せず、無効なら[[子供]]を[[表現]]します
-- 有効なら [CODE(HTMLe)@en[[[noscript]]]] [[要素]]は [CODE(CSS)@en[[[display]]: [[none]]]] となります
-- [CODE(HTMLe)@en[[[canvas]]]] [[要素]]が[[埋め込み内容]]を[[表現]]するか[[フォールバック内容]]を[[表現]]するかの決定に関与します
-- 無効なら、[[媒体要素]]に [CODE(HTMLa)@en[[[controls]]]] [[属性]]がなくても[[利用者に利用者インターフェイスを晒す]]べきです
- [[構文解析]]と[[直列化]]
-- [[スクリプトフラグ]] (>>9) に影響します
-- [CODE(HTMLe)@en[[[noscript]]]] [[要素]]の[[直列化]]の方法に影響します
- [[適合性]]
-- [CODE(HTMLe)@en[[[noscript]]]] の[[内容モデル]]は有効か否かにより変更します
]FIG]

;; [18] [[スクリプト]]が定義された時と[[コールバック]]として実行される時の両方にチェックが入っているので、
定義と実行の間に[[スクリプトが無効]]に変化しても[[スクリプト]]は実行されません。
[REFS[
- [19] [CITE@en[Bug 20578 – Need to define the interaction of "scripting is disabled/enabled" with script execution in various cases]] ([TIME[2014-01-02 12:10:44 +09:00]] 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=20578>
]REFS]

[23] [[スクリプト]]の実行中に[[スクリプト]]が無効にされた時は、
[[スクリプト]]は直ちに終端される[['''べきです''']] [SRC[>>22]]。

;; [[走っているスクリプトの実行中断]]も参照。

[46] [VAR[設定群オブジェクト]]に関する[DFN[[RUBYB[スクリプトを実行できるか検査]@en[check if we can run script]]]]は、
次のようにしなければ[['''なりません''']] [SRC[>>37]]。
[FIG(steps)[
= [48] [VAR[設定群オブジェクト]]の[F[[[大域オブジェクト]]]]が [CODE(DOMi)@en[[[Window]]]]
であって、その [F[[CODE(DOMi)@en[[[Document]]]]]] が[F[[[完全に活性]]]]で''ない''なら、
== [49] 「[RUBYB[実行しない]@en[do not run]]」を返します。
= [50] それ以外で、 [VAR[設定群オブジェクト]]の[F[[[有責閲覧文脈]]]]が[F[[[スクリプト無効]]]]なら、
== [51] 「[RUBYB[実行しない]@en[do not run]]」を返します。
= [52] それ以外なら、
== [53] 「[RUBYB[実行する]@en[run]]」を返します。
]FIG]

;; [56] この検査は、[[古典スクリプトの実行]]や[[モジュールスクリプトの実行]]や、
[CODE[[[EnqueueJob]]]] から呼び出されます。

[HISTORY[
[54] この検査はかつては[[コールバックを走らせる準備]]の一部として定義されていました。
]HISTORY]

* 構文解析器のスクリプトフラグ

[9] [[HTML構文解析器]]が作られた時点において[[構文解析器]]と関連付けられた[[文書節点]]の[[スクリプトが有効]]なら、
[[構文解析器]]の[[スクリプトフラグ]]が「有効」に設定されます。そうでなければ「無効」に設定されます。 [SRC[>>8]]

[37] [[XML構文解析器]]には[DFN[[RUBYB[XMLスクリプト対応有効]@en[XML scripting support enabled]]]]または[DFN[[RUBYB[XMLスクリプト対応無効]@en[XML scripting support disabled]]]]のフラグがあります。既定値は有効です。 [SRC[>>41]]

;; [11] [[閲覧文脈]]や[[節点]]のスクリプトの有効性は動的に変更されることがありますが、
[[構文解析器]]の[[スクリプトフラグ]]は一度設定されたら変更されません。
ですから、[CODE(HTMLe)@en[[[noscript]]]] [[要素]]の中身が構文解析された[[文書]]で[[スクリプト]]が実行されることもあり得ます。
構文解析してから直列化するまでに[[スクリプトが有効]]かどうかが変化すると、 [CODE(HTMLe)@en[[[noscript]]]]
[[要素]]の中身が元の状態に戻らない (再度[[構文解析]]したら違う [[DOM]] になる) 可能性もあります。

;; [12] このフラグは [[HTML構文解析器]]には存在しますが、 [[XML構文解析器]]には存在しません。
[[スクリプト]]の実行自体は[[閲覧文脈]]の[[スクリプトが有効]]かどうかにより制御されます。

[15] [[スクリプトフラグ]]は次の場面に影響します。
[FIG(list)[
- [38] [[HTML文書]]の構文解析における [CODE(HTMLe)@en[[[noscript]]]] [[開始タグ]]、[[終了タグ]]の処理
- [39] [[XML文書]]の構文解析における [CODE(HTMLe)@en[[[script]]]] [[要素]]作成時の処理 [SRC[>>41]]
- [40] [CODE(HTMLe)@en[[[noscript]]]] [[要素]]を[[文脈]]とした[[HTML素片構文解析アルゴリズム]]の処理
]FIG]

;; [17] [CODE(HTMLe)@en[[[noscript]]]] [[要素]]の中身は、有効なら[[終了タグ]]まですべて[[テキスト]]とみなされ、
無効なら通常の[[要素]]の[[内容]]として解釈されます。

[43] [[スクリプトフラグ]]は[[スクリプト無効]]の[[節点]]について[[構文解析器]]を作った場合の他、次の場合に無効に設定されます。
[FIG(list)[
- [[XHR]] で[[XML文書]]を構文解析する場合

@@ XXX
]FIG]

* 利用者インターフェイス

[26] 古くから[[Webブラウザー]]の設定画面には[[スクリプト]]を無効にするオプションが用意されていました。

[24] [[スクリプト]]により ([CODE(JS)@en[[[alert]]]] など) または[[スクリプト]]の動作により
(実行時間制限を超えた場合など) [[利用者]]が反応を求められる時には、
[[利用者エージェント]]は[[利用者]]が[[スクリプト]]を無効にできるようにすることが[RUBYB[すすめられています]@en[[[encouraged]]]]
[SRC[>>22]]。

;; [27] このような仕組みは [[Opera]] が古くから実装していました。最近はどの [[Webブラウザー]]も実装しています。

[25] [[利用者エージェント]]は、[[閲覧文脈]]を閉じるためだけのために[[スクリプト]]を無効にする方法
(例えば [CODE(DOMe)@en[[[unload]]]] を実行しないで[[閲覧文脈]]を閉じるなど) を提供して[['''構いません''']]
[SRC[>>22]]。

[28] [[Webブラウザー]]によっては、[[タブ]]ごと、[[起源]]ごとなどの単位で[[スクリプト]]を無効にするメニュー項目などが用意されています。

* スクリプトの有効・無効と Web 互換性

[30] [[利用者エージェント]]は[[スクリプト]]を実装することが義務付けられていません。

[31] [[著者]]は、[[スクリプト]]が実装されない可能性があること、
実装されていても無効化されている可能性があることを認識し、
できるだけ[[スクリプト]]が動作しなくても利用可能であるように配慮するべきです。

[32] とはいえ現在 [[Web]] 上の相当大多数の[[文書]]は、[[スクリプト]]が実行されることを想定しています。
そのほとんどすべては [[JavaScript]] が実行されることを要求しています。
[[利用者エージェント]]が[[Web互換]]であるためには、
あまり古くない版の [[JavaScript]] を実装し、既定の状態で有効としなければなりません。

[33] [[スクリプト]]を実装しない[[利用者エージェント]]は[[スクリプトが無効]]な状態で動作するのが好ましいと考えられますが、
0種類の[[スクリプト言語]]を実装しているとの認識のもと、[[スクリプトが有効]]な状態で動作するものもあるかもしれません。

[34] [[スクリプト]]を実装する (1つ以上の[[スクリプト言語]]を実装する)
[[利用者エージェント]]であっても、[[スクリプトが有効]]な場合の処理と[[スクリプトが無効]]な場合の処理の両方を実装する必要があります。

;; 有効と無効は[[利用者]]が切り替える場合の他に、 [CODE(HTMLe)@en[[[iframe]]]] [[要素]]や
[[CSP]] の [CODE(HTMLa)@en[[[sandbox]]]] によって[[著者]]が切り替える場合があります。

;; [35] [[スクリプト]]に対応しつつも [CODE(HTMLa)@en[[[sandbox]]]] に対応しないような実装は、
もはや[[Web互換]]ではありません。

[57] [[Webサイト]]によっては、[[著者]]の自己本位な[[スクリプト]]が実行されることにより、
[[利用者]]の閲覧操作が妨害されるケースがあります。[[利用者エージェント]]は、
[[利用者]]の体験を向上させるため、 [[Webサイト]]ないし[[起源]]、
あるいは[[Webページ]]単位で[[スクリプトが無効]]に固定する機能を提供するべきかもしれません。

;; 実際幾つかの [[Webブラウザー]]にはそのような機能があります。

[EG[
[58] 例えば特定の画面の大きさを想定した[[スクロール]]の挙動を[[スクリプト]]で実装しているために、
[[著者]]と異なる画面サイズの端末で表示するとすべての内容を表示できないかもしれません。
]EG]

[EG[
[59] 例えば悪意のある[[著者]]は[[Webブラウザー]]の[[文脈メニュー]]が表示されないように[[右クリック]]等を妨害する[[スクリプト]]を記述していることがあります。
]EG]

* 歴史

[REFS[
- [36] [CITE@en[Web Applications 1.0 r8728 Provide a way for other specs to invoke the XML parser without scripting enabled]] ([TIME[2014-08-29 08:38:00 +09:00]] 版) <http://html5.org/r/8728>
- [42] [CITE@en[Use XML parser hooks from HTML · c837ac6 · whatwg/xhr]] ([TIME[2014-09-09 13:23:57 +09:00]] 版) <https://github.com/whatwg/xhr/commit/c837ac6d6e89dc0ab0cc4c8f628264ebd4d5df6a>
- [55] [CITE@en[Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb]] ([TIME[2016-01-29 22:15:53 +09:00]] 版) <https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>
]REFS]

* 関連

[14] [CODE(DOMa)@en[[[innerHTML]]]] や [CODE(DOMi)@en[[[XSLTProcessor]]]] や、一旦実行された
[CODE(HTMLe)@en[[[script]]]] [[要素]]では[[スクリプト]]が実行されませんが、これは
[["already-started" flag]] によって処理されるので、[[スクリプトが有効]]か否かとは別です。

[29] [CITE@en[Clarify settings object, realm, and global relationships · whatwg/html@0866f1b]]
([TIME[2016-03-28 00:06:26 +09:00]] 版)
<https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[60] [CITE@en[Editorial: clean up "scripting is disabled" usage]]
([[Ms2ger]]著, [TIME[2016-09-24 06:54:33 +09:00]])
<https://github.com/whatwg/html/commit/56d66456a2103fe2ade93b9ca5a305d19dfbfae8>