IE モードにおけるサイトリスト 互換判定フロー (スキーマ 2.0 向け)

本記事は、[Microsoft Azure Tech Advent Calendar 2023](https://qiita.com/advent-calendar/2023/microsoft-azure-tech) 12/22 分の記事となります。

# 修正履歴
2024/05/16 : "親フレームの互換モードがIE9 以降である" の No 時の遷移先フローについて、 "IE 8 以下" という誤った記載があったものを修正。これに付随して遷移先ボックスを新設。

# これは何？
Microsoft Edge (以下 Edge) には周知のとおり、 Internet Explorer (以下 IE) との互換性を残すための IE モードという動作モードがあります。
そして、 IE にもまた、過去の IE との描画や動作についての互換性を残すための互換表示という機能があります。
この結果 "Microsoft Edge IE モード (IE5 互換)" みたいなややこしい描画モードが生まれてしまいました。

IE11 及び Edge において、互換モード指定は原則 "サイトリスト" と呼ばれる xml ファイルを基に、どのバージョンの IE レンダリングを行うかを指定することになります。
しかし、このサイトリストの形式にもスキーマ種別が [v1](https://learn.microsoft.com/ja-jp/internet-explorer/ie11-deploy-guide/enterprise-mode-schema-version-1-guidance) / [v2](https://learn.microsoft.com/ja-jp/internet-explorer/ie11-deploy-guide/enterprise-mode-schema-version-2-guidance) とあり、
[旧式であるスキーマ v1 の互換性判定フロー](https://learn.microsoft.com/ja-jp/previous-versions/windows/internet-explorer/ie-developer/compatibility/dn384051(v=vs.85))のみが公式公開されている状態で、
現行で利用を推奨しているサイトリスト スキーマ v2 のフローのドキュメントは存在していません。

本記事はサイトリスト スキーマ v2 の IE モードにおいて動作する "互換モードの判定フロー" を改めて取りまとめたものとなります。

なお、 IE モードは最短で 2029 年に EOS を迎えるため、一時的な回避策として用意されている機能であること、
Microsoft としての推奨はあくまでモダンブラウザへの移行であることを改めてご認識の上、本資料を活用いただければ幸いです。

# フロー図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/49ac6304-0024-819e-92fa-2cc30750b34e.png)

横軸の移動が判定結果 Yes、縦軸への遷移が 判定結果 No の場合で統一しています。
なお、各種分岐が色分けしていますが、下記のような内訳となっています。
・青 : 通常の分岐判定
・紫 : Html に DOCTYPE が指定されていない正規フォーマットに準拠していない HTML であるかの判定
・黄 : 特殊な判定

原則、紫の判定はクライアント サイドで制御することはできませんので、制御にはコンテンツの変更が必要になります。

# 各分岐の詳細な説明
## 共通. Html に "!DOCTYPE" tag が設定されている
HTML 先頭に <!DOCTYPE> という形式でタグが指定 (正確には宣言) されているかを判定します。
このタグは W3C で定義された HTML の仕様として必要なものですが、未定義の場合でも動くように IE は作られています。
ただし、未定義の場合はどのような HTML なのかを判定できないため、推測互換モード = Quarks Mode (以下 QM) というモードで動作します。
さらにこの "Quarks mode をエミュレートする" という QME という動作モードもあります。

一般互換モードと QM 及び QME の動作の違いは IE のサポートが終了していることもあり、残念ながら非公開となります。
元からイリーガルな HTML を補完する動作となりますので、QM / QME で問題が発生する場合はコンテンツ側の修正を頂くようお願い致します。

## 1.ツールにて互換モードを直接している
IE11 での F12 ツールおよび、それに相当する IEChooser にて、直接互換モードを指定しているかを判定します。
指定されている場合、その指定値での互換モードで動作します。
本番環境に置いて考慮する必要はない分岐です。

IEChooser については下記を参照ください。
[DevTools を Internet Explorer モード (IE モード) で使用する](https://learn.microsoft.com/ja-jp/microsoft-edge/devtools-guide-chromium/ie-mode/)

## 2.サイトリストに登録されている URL である
Edge でアクセスを行ったがサイトリストに登録されているかを判定します。
具体的にはサイトリスト内の <site> タグに存在するかを確認しています。

存在が確認された場合、原則 <compat-mode> タグに指定される互換モードで動作しますが、状況によって QM / QME で動作する可能性もあります。

## 3. Response Header またが html で X-UA-Compatible が指定されている
Http Response Header 内または、 Html 上に meta タグにて "X-UA-Compatible" が指定されているかを判定します。

・Http Response Header の画像例 (Fiddler での確認)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/35317d3c-6d66-b064-cb8a-336809733e73.png)


・ HTML の画像例 (Dev ツールでの確認)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/f54bd747-03eb-d758-66cb-93cdb6bc47b5.png)

なお、ここでの "IE=Edge" の Edge は "最先端の" を意味するもので IE11 を指します。
(Browser の "Microsoft Edge" は無関係です)

### 3-1. iframe 内のコンテンツである
対象 URL のコンテンツが iframe コンテンツであるかを判定します。

### 3-2. 親フレームの互換モードが IE 9 以降である
3-1 で iframe コンテンツであると判断された場合、更に親フレームのページのドキュメントモードが IE9 以降 (IE8は含まれない) であるかを判定します。

### 3-3. X-UA-Compatible の指定が IE 5である
3-2 で親フレームが IE 9 以降で動作しているかを判定します。

## 4. Microsoft 提供の互換モードに登録された URL である
Microsoft が独自に互換表示すべきと判断したサイトの一覧に登録されているサイトであるかを判定します。
元々は IE の設定から呼び出せる下記ダイアログでの設定切り替えが可能でしたが、
このリスト自体はもうメンテナンスされるわけでもないこと、そもそも日本のサイト登録がほとんどないことから、基本的に気にしなくてよい項目となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/71609d71-1357-fbba-77f7-a96b361f5919.png)

## 5. 互換指定グループ ポリシーで指定されている URL である
互換指定用グループ ポリシーにて登録されている URL であるかを判定します。
このポリシーには IE 5 互換用 / IE 7 互換用の 2種のポリシーが存在します。
双方を登録した場合の動作は保証されません。

・ IE 5 互換用ポリシー : Quirks モード サイトのポリシー一覧を使用 ([admx.help](https://admx.help/?Category=InternetExplorer&Policy=Microsoft.Policies.InternetExplorer::CompatView_UseQuirksPolicyList&Language=ja-jp))
・ IE 7 互換用ポリシー : Internet Explorer 7 サイトのポリシー一覧を使用 ([admx.help](https://admx.help/?Category=Windows_10_2016&Policy=Microsoft.Policies.InternetExplorer::CompatView_UsePolicyList&Language=ja-jp))

## 6. IE 用ローカル サイトリストに登録した URL である
IE のローカル サイトリストに登録されているかを判定します。
なお、Edge にも同名の "ローカル サイトリスト" の記載がありますが別物で、これについては
後述します。
内容としては下記画像で設定するものでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/4bd90375-83ff-d212-08eb-121b273db480.png)

"4. Microsoft 提供の互換モードに登録された URL である" と同様、現在はこのダイアログを開く術がないため、
本機能も基本的には特に意識する必要はありません。

## 7.イントラネットの URL である
イントラ ネットであるかを判定します。
が、本項目は単純にインターネットオプションのゾーン判定にイントラネットとして登録済かを判定するわけではなく、
アクセス先 URL のドメイン構成や Proxy 利用状況、 UNC の利用など複合的な要因で判断されています。
このため、状況によっては後述の 7-1 がチェック済み状態の場合に "信頼済みサイトにが互換表示となる" 等の意図せぬ事象が発生する場合があります。

詳細な分岐条件をご利用になりたい場合は弊社カスタマーサービスまでお問い合わせください。

### 7.1 "イントラ ネット サイトを互換表示" が未チェックである
IE での互換表示を設定するダイアログにて設定できた掲題項目が未チェックであるかを判定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/965a9b24-9757-502f-f6d4-4496828c4444.png)

が、今現在 Windows 11 等では GUI を操作するサポートされた手段は (たぶん) 存在しません。
変更をご希望の場合は、当該レジストリを直接編集して頂くことになるかと思います。

パス : HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\BrowserEmulation
キー名 : IntranetCompatibilityMode (REG_DWORD)
値 : 0 (無効) / 1 (有効)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/4d264b85-6bc5-1619-fadc-7dbd87195448.png)

## 番外) Edge 用 ローカルサイトリストの判定について
Edge 用ローカルサイトリストは、IE 用ローカルサイトリストのダイアログを開くことができなくなったため追加された機能です。
このフロー図より上位の "Edge のマネジメントプロセスによる互換性判定" タイミングで行われます。

"サイトリスト"という名称ではありますが、実体として XML ファイルが存在するものではなく、GUI 操作で互換指定したモードがローカルに保存されるものです。
詳しくは[Internet Explorer（IE）モードのローカルサイト リストを構成する](https://learn.microsoft.com/ja-jp/deployedge/edge-ie-mode-local-site-list) を参照ください。

なお、デフォルトではローカルサイトリストは 30日で消失することにご注意ください。
恒久的な保持はできませんが、[InternetExplorerIntegrationLocalSiteListExpirationDays](https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies#internetexplorerintegrationlocalsitelistexpirationdays)ポリシーで
保持期間を最大 90日まで延長することが可能です。


## 補足
全チェックに合致しない場合、Microsoft Edge Native として Blink エンジンでの描画がなされます。

# よくある事例として
ドメインは同一にも拘らず、"ページによって IE 5 互換 / IE 7 互換が切り替わってしまう" という事象については、DOCTYPE 宣言がコンテンツに登録 / 非登録で統一されていない場合に
7.1 の判定を Yes で通過した場合に起こり得ます。

この場合の確実な対処は、DOCTYPE を適切に宣言するようコンテンツ側を修正して頂くこととなりますが、
サイトリストに互換モードを指定することでも回避することが可能になります。

# 終わりに
今日は部門のリージョンでの忘年会でした、Y さんいつも幹事ありがとうございます。
終了後、この記事の投稿に着手し、一番最初にこのセクションを書き始めていますが現在 12/21 22:32 です。
来年こそは早めに記事を書きましょうね、2024 年の私へ、 2023 年の私より。