DOCTYPE sniffing

DOCTYPE スイッチ (HTML)

[56] DOCTYPEスイッチ (DOCTYPE switch) は、 DOCTYPE の記述によって文書compatMode を変更するものです。90年代末から00年代初頭の Webブラウザーの実装と標準仕様の規定との乖離を解消することを目的に導入されましたが、 現在では間違いだったと考えられています。

[9] 文書には、無奇癖モード (標準モード)、 限定奇癖モード (ほぼ標準モード)、 奇癖モード (互換モード) が存在します。 DOCTYPEスイッチは、 このいずれかを決定するものです。

[55] Opera (Presto) はこの他に WML 2.0 モードも実装していました。

[67] この区別はHTML文書に関するものです。XML文書には存在しません。 (XML を第4のモードと考えることもできます。)

仕様書

DOCTYPE スイッチと適合性

[121] 現在 DOCTYPE として正式に認められているのは、

<!DOCTYPE HTML>
... だけです。

[122] それ以外にも無奇癖モードとなる DOCTYPE は存在しますが、 限られた状況下でDOCTYPE遺物文字列廃止認められているDOCTYPE が使える以外は、すべて認められていません。

[123] 限定奇癖モード奇癖モードとなる DOCTYPE は、すべて認められていません。

[124] DOCTYPEスイッチは過去のHTML文書との互換性のために存在する機能ですから、 新しい文書では <!DOCTYPE HTML> 以外を使ってはいけませんし、その必要もないはずです。

DOCTYPE スイッチの公開識別子とシステム識別子

[109] DOCTYPEスイッチに関わる公開識別子システム識別子は、次のように分類されます。

[116] この他にDOCTYPE遺物文字列廃止認められているDOCTYPE公開識別子システム識別子もあります。 (それぞれの項を参照してください。)

[117] 奇癖モード無奇癖モード公開識別子システム識別子と、 DOCTYPE遺物文字列システム識別子と、 廃止認められているDOCTYPE公開識別子システム識別子の3種類は、 互いに素集合となっています。

[119] これらの公開識別子システム識別子のリストは、 >>118JSON 形式で含まれています。

モードの決定

[63] 文書の初期状態は、無奇癖モードです >>62

[64] clone はモードも複製します >>62

[68] HTML構文解析器においては、 字句化器"initial" insertion mode によってモードが設定されます。注釈空白を除く最初の字句によって、 次のように決定されます。

  1. [69] DOCTYPE字句以外なら、
    1. [70] iframe srcdoc文書以外なら、
      1. [71] 構文解析誤りとします。
      2. [74] 奇癖モードとします。
  2. [72] 字句の名前が html 以外なら、
    1. [95] 構文解析誤りとします。
    2. [96] iframe srcdoc文書以外なら、 奇癖モードとします。
  3. [73] それ以外で字句公開識別子があれば、
    1. [80] 廃止認められているDOCTYPE公開識別子なら (完全一致)、
      1. [82] 字句システム識別子がなければ、
        1. [81] 廃止認められているDOCTYPEシステム識別子の省略が認められていなければ、構文解析誤りとします。
      2. [83] 字句システム識別子があれば、
        1. [84] 廃止認められているDOCTYPEシステム識別子と一致 (完全一致) しなければ、
          1. [128] 構文解析誤りとします。
          2. [129] iframe srcdoc文書以外なら、
            1. [130] 字句システム識別子があり、 奇癖モードになるシステム識別子 (ASCII大文字・小文字不区別) なら、奇癖モードとします。
    2. [79] それ以外なら、
      1. [108] 構文解析誤りとします。
      2. [97] iframe srcdoc文書以外なら、
        1. [98] 奇癖モード公開識別子 (ASCII大文字・小文字不区別) なら、奇癖モードとします。
        2. [99] それ以外で、奇癖モードになる公開識別子接頭辞ではじまる (ASCII大文字・小文字不区別) なら、 奇癖モードとします。
        3. [100] それ以外で、字句システム識別子があり、 奇癖モードになるシステム識別子 (ASCII大文字・小文字不区別) なら、奇癖モードとします。
        4. [101] それ以外で、限定奇癖モードになる公開識別子接頭辞ではじまる (ASCII大文字・小文字不区別) なら、 限定奇癖モードとします。
        5. [102] それ以外で、奇癖モード限定奇癖モードになる公開識別子 (ASCII大文字・小文字不区別) なら、
          1. [103] システム識別子があれば、限定奇癖モードとします。
          2. [104] なければ、奇癖モードとします。
  4. [75] それ以外で字句システム識別子があれば、
    1. [76] about:legacy-compat なら、何もしません。
    2. [77] それ以外なら、
      1. [105] 構文解析誤りとします。
      2. [106] iframe srcdoc文書以外なら、
        1. [100] 奇癖モードになるシステム識別子 (ASCII大文字・小文字不区別) なら、奇癖モードとします。
  5. [93] いずれにせよ、 iframe srcdoc文書以外なら、 字句force-quirks flag が設定されていれば、奇癖モードとします。
[78] DOCTYPE字句の名前は、字句化器ASCII小文字に正規化されますから、 >>72大文字で書かれていた場合も含まれます。
[107] 不存在と空文字列は区別されています。

document.open

[120] 仕様上は document.open はモードを変更するとはされていませんから、 最初にDOCTYPEスイッチするような字句が現れる前や、 本来無奇癖モードになる DOCTYPE が存在する時に、 document.open 前のモードが引き継がれることとなります。

[58] document.open() すると、 Firefox 2、WinIE 7Opera 9.27 では compatModeBackCompat になり、その後は文書型宣言の有無によって CSS1Compat になるか、そのまま変わりません。Safari 3.1.1 はずっと CSS1Compat のままで、 文書型宣言によっても変化しません。

[57] >>58 Firefox 3 は (試してないけどたぶん Firefox 2 も) compatModeopen のときにリセットされ、 その後の文書型宣言の有無で値を変えているだけみたいです。 WinIE 7Opera 9.61 は openBackCompat に設定しているようです。

document.compatMode

[59] Document インターフェイスcompatMode IDL属性は、 奇癖モードの時 BackCompat を返し、 それ以外の時 CSS1Compat を返します >>60

[61] 無奇癖モード限定奇癖モードを直接区別する方法はありません。

モードによる挙動の変化

[65] モードによるスクリプトAPI の挙動やレンダリングの変化に関しては、 奇癖モード限定奇癖モード無奇癖モードの項を参照してください。

[87] 適合性検査器は、DOCTYPE字句の名前、公開識別子システム識別子の値や存在・不存在に基づき検査モードを (例えば HTML4 モードに) 変更しても構いません >>13

[88] ただし HTML4 以前や XHTML1 の仕様は Webブラウザーの実装と乖離した内容が規定されていますから、 そのようなモードの切り替えに (学術的興味以外に) 意味は無いかもしれません。

[89] そのような切り替えが認められているのは、適合性検査器だけです。 それ以外の実装は、奇癖モード限定奇癖モード無奇癖モードのいずれかの (最新の HTML Standard その他関連仕様の) 規定に従わなければなりません。

安定性

[125] HTML Standard により DOCTYPEスイッチの動作が厳密に規定され、 すべての Webブラウザーがそれに従う形で動作が統一されたことで、 今後 DOCTYPEスイッチによるモードの決定方法が変更される (奇癖モードとなる公開識別子が追加されるなどする) 可能性はほとんどありません。

[126] 遠い将来、DOCTYPEスイッチが廃止されてすべて無奇癖モードに統一される可能性は否定できませんが、 今後十数年以内には起こらないのではないでしょうか。
[127] iframe srcdoc文書が新設された時に、 iframe srcdoc文書は常に無奇癖モードとすることとされました。 このように新しい文脈においてはDOCTYPEスイッチを適用しない例が今後もあるかもしれません。

関連

MIME sniffing, HTML/XML sniffing, @media

[66] IE は独自に documentMode という似て異なる動作モードを (DOCTYPEスイッチに加えて) 実装しています。

歴史

[90] Gecko にモードを実装することが提案されました >>86

[43] Gecko にモードが実装されたのが1999年 (リリース版としては Mozilla 0.6、 Netscape 6)。

[44] MacIE に実装されたのは 5.0 (2000年3月) から。

[45] >>44 3月は正式版で、β版で実装されていたかは不明。

[46] WinIE に実装されたのは 6.0 から。 Public Preview は2001年3月、正式版は9月。いつから実装されていたのかは不明。

[94] Proposed doctype handling, , https://web.archive.org/web/20010620132000/http://www.people.fas.harvard.edu/~dbaron/mozilla/doctypes

実装者による情報

[1] The Opera 7 and 8 DOCTYPE Switches http://www.opera.com/docs/specs/doctype/

[2] Welcome to the MSDN Library http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnie60/html/cssenhancements.asp

[3] Mozilla's DOCTYPE sniffing http://www.mozilla.org/docs/web-developer/quirks/doctypes.html

[7] Mozilla's DOCTYPE sniffing - MDC http://developer.mozilla.org/en/docs/Mozilla%27s_DOCTYPE_sniffing

[12] Mozilla's Quirks Mode - MDC http://developer.mozilla.org/en/docs/Mozilla%27s_Quirks_Mode

[14] Mozilla Quirks Mode Behavior - MDC http://developer.mozilla.org/en/docs/Mozilla_Quirks_Mode_Behavior (名無しさん)

[15] Mozilla's DOCTYPE sniffing - MDC http://developer.mozilla.org/en/docs/Mozilla%27s_DOCTYPE_sniffing (名無しさん)

[16] mozilla/parser/htmlparser/src/nsParser.cpp http://lxr.mozilla.org/mozilla/source/parser/htmlparser/src/nsParser.cpp#833 (名無しさん)

[25] IEBlog : The <?xml> prolog, strict mode, and XHTML in IE http://blogs.msdn.com/ie/archive/2005/09/15/467901.aspx (名無しさん)

[28] /trunk/WebCore/css/quirks.css - WebKit - Trac http://trac.webkit.org/projects/webkit/browser/trunk/WebCore/css/quirks.css (名無しさん)

[29] /trunk/WebCore/html/HTMLDocument.cpp - WebKit - Trac http://trac.webkit.org/projects/webkit/browser/trunk/WebCore/html/HTMLDocument.cpp#L240 (名無しさん)

[30] /trunk/WebCore/html/DocTypeStrings.gperf - WebKit - Trac http://trac.webkit.org/projects/webkit/browser/trunk/WebCore/html/DocTypeStrings.gperf (名無しさん)

[31] !DOCTYPE (2007-02-18 01:19:07 +09:00 版) http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/doctype.asp (名無しさん)

[32] !DOCTYPE (2007-02-18 01:19:07 +09:00 版) http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/doctype.asp (名無しさん)

[35] Bug 1312 &#8211; "Standard" compatibility mode needs to be hooked to DOCTYPE (2007-04-21 18:33:57 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1312 (名無しさん)

[38] Bug 31933 &#8211; NavQuirks mode triggered for Transitional documents when not desired (2007-04-21 18:51:15 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=31933 (名無しさん)

[42] Bug 153032 &#8211; Implement almost-standards rendering mode (2007-04-21 19:29:50 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=153032

モード判定

[5] 文書型宣言中の空白は無視されているらしい。 http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/4961 (名無しさん 2005-11-12 13:38:17 +00:00)

[8] Activating the Right Layout Mode Using the Doctype Declaration http://hsivonen.iki.fi/doctype/

[11] hxxk.jp - DOCTYPE スイッチについての検証とまとめと一覧表 http://hxxk.jp/2006/12/19/2100 (名無しさん 2006-12-19 23:21:07 +00:00)

[10] crisp’s blog &#187; Blog Archive &#187; Having fun with IE - part 3: doctype switching http://therealcrisp.xs4all.nl/blog/2006/12/01/having-fun-with-ie-part-3/ (名無しさん 2006-12-18 11:53:30 +00:00)

[17] mozilla dtd test http://www.ash.ne.jp/~mal/mozilla/mozdtd/ (名無しさん)

[18] DOCTYPE 宣言による「解釈モード」の切り替え http://www.remus.dti.ne.jp/~a-satomi/bunsyorou/Doctype-Switch_situation.html (名無しさん)

[20] !DOCTYPE スイッチ http://www.seo-equation.com/www/cat25/doctype_switching (名無しさん)

[23] M$IE6の文書型宣言判別 (dinosaur's square) http://www.geocities.co.jp/Technopolis-Mars/2989/misc/ie-doctype.html (名無しさん)

[24] DOCTYPEによる判別 http://www.noelnet.org/noel/tech/doctype/ (名無しさん)

[26] DOCTYPEs and their Respective Layout Modes - The Web Standards Project http://www.webstandards.org/learn/reference/charts/doctype-switch/ (名無しさん)

[27] IE7 (beta 2) Doctype Testing - AlastairC.ac http://alastairc.ac/testing/IE7_Doctypes/ (名無しさん)

[41] Bug 55264 &#8211; [DOCTYPE] Documents with unknown DOCTYPE should be displayed in strict mode (2007-04-21 19:28:57 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=55264 (名無しさん)

[50] Approximate IE6 quirks detection logic ( 版) http://philip.html5.org/docs/quirks.txt

レンダリングへの影響

[19] 「DOCTYPE スイッチ」 CSS 解釈実例編 http://www.remus.dti.ne.jp/~a-satomi/bunsyorou/Doctype-Switch_example.html (名無しさん)

[22] 各UAのDOCTYPEスイッチについて - CSS Dencitie http://www6.plala.or.jp/go_west/nextcss/tip/doctype.htm (名無しさん)

[39] Bug 1044 &#8211; inheritance problems in tables (2007-04-21 19:00:44 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1044 (名無しさん)

[40] Bug 5821 &#8211; {compat} Nav4 vs CSS2 line box model (2007-04-21 19:03:04 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=5821

HTML 構文解析への影響

[4] Doctype switching for SGML comments http://www.howtocreate.co.uk/sgml/doctypeSGML.html (名無しさん 2005-11-07 00:28:23 +00:00)

[36] Bug 2749 &#8211; Comments are incorrectly parsed: <!-- -- --> inside comment! <!-- -- --> (2007-04-21 18:36:58 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=2749 (名無しさん)

[37] Bug 31933 &#8211; NavQuirks mode triggered for Transitional documents when not desired (2007-04-21 18:46:36 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=31933

メモ

[6] DOCTYPE Switch - uncolored dinosaurs http://foobar.parfe.jp/apteryx.cgi?p=DOCTYPE_Switch (名無しさん 2005-12-07 11:38:55 +00:00)

[21] Mozillaには複数のレンダリングモードがあります - Web標準普及プロジェクト http://www.mozilla.gr.jp/standards/webtips0014.html (名無しさん)

[33] >>31 にはこんなことが書いてあるぞ:

Note In standards-compliant mode, compatibility with other versions of Internet Explorer is not guaranteed. When standards-compliant mode is switched on, the rendering behavior of documents may be different in later versions of Internet Explorer. You should not use this mode for content that is fixed in nature, such as content that is burned on a CD.

(名無しさん 2007-02-17 16:23:24 +00:00)

[34] scroll="no"をCSSで (2006-12-17 15:08:56 +09:00 版) http://chaichan.web.infoseek.co.jp/qa1000/qa1375.htm

あいこ [WriteDate : Thu Jun 14 05:36:59 2001]

やっぱりネスケ6のテーブルバグは DOCTYPE宣言の後半の "http://www.w3.org/〜〜〜〜 を入れていたのが原因だったみたいです。 なんか格好良かったのでついつい入れてしまったのが災いしたようです(汗) あまり分からない事するものじゃないですね!

[47] 各表示モードによる CSS 解釈の違いをまとめたドキュメントを共有 - 2xup.org (Taichi Kaminogoya 著, 2007-07-27 21:41:05 +09:00 版) http://2xup.org/log/2007/07/27-2111 (名無しさん 2007-07-27 14:02:57 +00:00)

[48] 文書型宣言(DOCTYPE)により、ブラウザのレンダリングが変わってしまう (2007-08-11 00:43:12 +09:00 版) http://dev.xperl.jp/Okulab/archives/3 (名無しさん 2007-08-10 15:45:07 +00:00)

[49] M$IE6の文書型宣言判別 (dinosaur's square) (MOCHIZUKI Sunao 著, 2007-10-16 16:18:04 +09:00 版) http://www.geocities.co.jp/Technopolis-Mars/2989/misc/ie-doctype.html

[51] hxxk.jp - DOCTYPE スイッチについてのまとめと一覧表 (HTML 5 や IE 8 Beta 2 のモードスイッチなどの情報も含んだ 2008 年版 ) (真琴 著, 版) http://hxxk.jp/2008/09/29/0118

[52] gsnedders / The Need For A Switch in IE8 ( 版) http://gsnedders.com/the-need-for-a-switch-in-ie8

[53] IRC logs: freenode / #whatwg / 20110624 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20110624#l-77

[54] Web Applications 1.0 r8642 Reorder the list of DOCTYPEs to have the exact comparisons before the prefix comparisons, and remove commented-out values since there's very little chance of us having to change this again now that we have multiple deployed implementations. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=8641&to=8642

[91] Document open steps and quirks mode · Issue #3831 · whatwg/html () https://github.com/whatwg/html/issues/3831

[92] Make document.open() set the document to no-quirks by TimothyGu · Pull Request #3966 · whatwg/html () https://github.com/whatwg/html/pull/3966

[131] HTML要素概説
注釈
  • DOCTYPEスイッチ (DOCTYPE switch) 文書型宣言CSS 等の動作モードを切り替える機構。 CSS の初期案や不具合等に由来し事実上の標準となっていた Internet Explorer の挙動と当時の正式な CSS 仕様との不整合の調整のため21世紀初頭に成立し、 後に WHATWG により標準化された。