きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

Windows 7用IE11、RTW

本日、朝起きたらWindows 7IE11の正式版がリリースされていた模様です。

 

ダウンロードサイトはこちら:
ダウンロード - Internet Explorer
(※Win7でアクセスしないとダウンロードのリンクは出てきません)

 

IE Teamによるアナウンスはこちら:
IE11 for Windows 7 Globally Available for Consumers and Businesses

 

UserAgentから"MSIE"の文字が無くなっていたりインターネットゾーンではCSS ExpressionやDirext-X Filterが完全に無効になっていたりします*1ので過去のIE限定サイトでの挙動では注意が必要な部分もありますが、Web標準への準拠やスピードでは相当な改善がなされています。

*1:metaで互換指定しても効かない

【追記・訂正あり】IE11の互換モードの現在の挙動が仕様だとセキュリティ的によろしくないかもしれない件

※追記というか、色々書き直しました。前のバージョンはこちら → http://megalodon.jp/2013-0913-0031-50/d.hatena.ne.jp/kiyokura/20130911/p1

最近、IE11で既存サイトに問題が無いか検証しています

Windows 8.1のRTMが公開されてから、IE11の互換性の確認を少しずつ試しています。


RTM版のIE11は概ね動作も良好で、Web標準への準拠やHTML関連APIへの対応具合など、なかなか素晴らしいと思っています。


ただそんな中で、少し不具合ではないかと思われる挙動をいくつか検出しています。条件などを絞り込んでみたところ、共通して下記に該当するケースが多いことがわかりました。

  • ドキュメントモードが過去の互換モード
    • IE5 QuirksやIE7モードなど。
    • x-ua-compatibleヘッダ等により明示してる場合など
  • 対象のサイトが"インターネットゾーン"に該当

具体的にはMS Connect*1のフィードバックでこのあたりが上記の挙動に当てはまります(私自身が投稿したものも含めて)。

他にも私が保守しているアプリケーションなどでレンダリングがこちらが想定する過去バージョンのIEと互換の無い物なるなども見つけています(が、再現するミニマムコードを作る暇がなかったりしてConnectには投稿できてなかったり)。

これは仕様か?不具合か?

このあたりの際限手順などを調査・確認しながら、ふとこんな風に呟きました。



すると@さんからこんなお返事をいただきました。



早速その『IE11 Preview における互換性の変更点』を確認してみました。すると、確かに、例えばこんな一文もあります。

IE11 Preview 以降では、一時的な使用を除き、ドキュメント モードは使用されなくなります。 従来の機能とドキュメント モードに依存しているサイトは、最新の標準を反映するように更新する必要があります。

IE11 Preview における互換性の変更点


うーん、マジか…と思ったものの、すぐ近くにはこんな記述も書かれています。

現在、x-ua-compatible ヘッダーを使って、従来のドキュメント モードをターゲットにしている場合、IE11 Preview で得られる最高のエクスペリエンスがサイトに反映されない可能性があります。 詳しくは、modern.ie をご覧ください。

IE11 Preview における互換性の変更点

また、その他全体を読むと…仕様として互換モードが無くなる訳でも無さそうですが、正直良くわかりません。



そんなこんなで、その時はこんな風に思ってしまいました。



実は上記のconnectにあるものの他、私がいくつか確認している非互換の挙動も下記の条件であれば再現しません*2。今まで通り、互換を保った状態で表示・実行されます

  • 対象のサイトが"イントラネットゾーン"もしくは"信頼済みサイト"にある
  • もしくは"インターネットゾーン"でセキュリティレベルを下げる


なので、下記のような仕様なのかもしれない、と納得しかけてしまいました。【※後述しますが、多分違います。仕様ではないと思います。

  • インターネットゾーンではドキュメントモードを指定しても過去と互換性のない挙動となる
  • イントラネットゾーンや信頼済みゾーンでは互換モードが今まで通り有効である


この互換モードの主戦場と思われる社内用Webアプリなんかでは特に問題にならなさそうですし。

いや、でもやっぱり、それはまずくないか

しかし、少し考えてみると、これは不味いのではということに思い当たりました。

例えば『SSLの警告が出ても"続行"して使ってください』なアナウンスをするサイトと同様に、安易に『IE11で当サイトを正常に表示する場合は当サイトを"信頼済みサイト"に追加してください』とかアナウンスするサイトが出てこないといえるでしょうか*3


このようなリスクを考えると、本当にこのような仕様なのだとしたらそれは問題だと思います*4

【2013.09.12追記】やはりこの挙動は仕様ではなさそうです

そうこうしていると、Build Insiderにこのような記事がアップされました。
Web制作者は注意! Internet Explorer 11で変更された「互換性」
恐らくベースにされているのは主に前述のドキュメントだと思うのですが、この説明だと全体的に整合性があいますので私としては非常に腑に落ちました。


とするならば、やはり最初に書いた挙動は仕様では無く不具合であるとしたほうが自然ですし、理にもかなっています。

【2013.09.12追記】検証して、不具合があればConnectに投稿しよう!

しかし、今現在は現実の挙動として、Windows 8.1 RTM版同梱のIEでこのような挙動となっています。一般への配布は10/18の予定だそうですが、それを過ぎても現象が終息していなかった場合、結局同じことになります。


もし、同様にIE11のRTMやPreviewで互換性の面で問題のある挙動を確認したら、ぜひ、Connectに投稿してみましょう*5
https://connect.microsoft.com/IE



そして関係者の方におかれましては、ぜひ、一刻も早く対処していただきたいと切にお願いします。

*1:マイクロソフトが運営している、製品のバグレポートや要望などのフィードバックを受け付けるサイト。英語のサイトですが、日本語で投稿しても多分、読んでくれる(ハズ)

*2:私が試したかぎりでは

*3:ちゃんとしてる社内システムなんかだと問題ないと思いますが、SSLもない不特定多数向けのパブリックなサイトとかだと…

*4:『セキュリティーゾーンを問わずドキュメントモードによる互換性を一切考慮しない』のほうがましかもしれません。もしくはAD必須とかならまだ。

*5:事前にPreview版が提供されたり、MSDN等で早期にRTM版が提供されるのには、こういった一般ユーザへの配布前の事前チェックとフィードバックのタイミングを作るという意味もあります。

IE10の後方互換性関係の機能についてのメモ(その1)

Internet Explorer 10の互換性の調査と対応をしていて調べでまとめたことを忘れないうちにメモ。
駆け足で調査した部分も多いので、間違っているところなどに突っ込みをいただけると大変ありがたいです。

IE10のドキュメントモード

ドキュメントモードとは、HTMLの解釈が利用できる機能(JavaScriptCSSの属性含む)のモードのこと。IE10では以下のドキュメントモードを内蔵している。

  • IE5 Quirks:互換モード(IE5に準じた解釈を行う)
  • IE7 Standards:IE7標準モード(IE7が『標準』として解釈していたモードを再現する)
  • IE8 Standards:IE8標準モード(IE8が『標準』として解釈していたモードを再現する)
  • IE9 Standards:IE9標準モード(IE9が『標準』として解釈していたモードを再現する)
  • Standards:標準モード(IE10としての標準モード)

『(IExx)Standards』は、それぞれのバージョンとして実装されている(いた)標準準拠にのっとった解釈を行います。基本的にバージョンが上がるごとに、いわゆる『web標準』に対する準拠具合が上がっていると考えて良い(と思う)。

ドキュメントモードの指定

IEでは過去のバージョンと互換性を再現するために、コンテンツ提供者が『どのように解釈してほしいか』を指定する手段が提供されている。

指定できる種類

以下のいずれかを指定することで、解釈するドキュメントモードを強制することができる。

意味
5 IE5 Quirksにすることを強制する
7 IE7 Standardsでの解釈を強制する
8 IE8 Standardsでの解釈を強制する
9 IE9 Standardsでの解釈を強制する
10 IE10 Standardsでの解釈を強制する
EmulateIE7 IE7と同様の判定を行った上で、IE7 StandardsもしくはIE5 Quirksで解釈を行う
EmulateIE8 IE8と同様の判定を行った上で、IE8 StandardsもしくはIE5 Quirksで解釈を行う
EmulateIE9 IE9と同様の判定を行った上で、IE9 StandardsもしくはIE5 Quirksで解釈を行う
EmulateIE10 IE10と同様の判定を行った上で、IE10 StandardsもしくはIE5 Quirksで解釈を行う
edge 常に最新のIEが持つStandardsで解釈する
EmulateIExxの解釈について

EmulateIExxが指定された場合、実際のそのバージョンと同じロジックで互換モードが標準モードかの判定を行い、その判定に従って表示するモードが決定される。
判定ロジックは大まかには以下の流れとなっている。詳細はそれぞれのバージョンのIEの資料などを参照すること。

  • !DOCTYPEが指定されていない場合、Quirks
  • !DOCTYPEがHTML4.0未満の場合、Quirks
  • !DOCTYPEが指定されていて、かつ、Strictの場合、それぞれのStandardsで解釈される
  • !DOCTYPEが指定されていて、かつ、Strictでない場合やdtdのURLが無い場合など

※詳細は別途、パターンを確認する予定。

指定の具体的な方法

上記のドキュメントモードの指定具体的に行う方法には、大まかに二通りの方法がある。

  1. HTMLドキュメント内でmeta要素で指定
  2. HTTPレスポンスヘッダにて、カスタムヘッダで指定

それぞれの具体的な指定方法は以下の通り。

1.HTMLドキュメント内でmeta要素で指定
meta要素にて、http-equiv属性X-UA-Compatibleで指定する。
IE7 Standardsでの解釈を強制する例>

<meta http-equiv="X-UA-Compatible" content="IE=7" />


2.HTTPレスポンスヘッダにて、カスタムヘッダで指定
任意の方法で以下の形のカスタムヘッダとしてHTTPレスポンスヘッダを返す。

  • フィールド:X-UA-Compatible
  • 値:IE=xxx(上記の指定の値)

なお、IISの場合はアプリケーションのコード中から出力するほかに、以下の方法などで指定可能。
1.web.configで設定する

<configuration>
   <system.webServer>
      <httpProtocol>
         <customHeaders>
            <clear />
            <add name="X-UA-Compatible" value="IE=EmulateIE7" />
         </customHeaders>
      </httpProtocol>
   </system.webServer>
</configuration>

※ただし、私が試したところ、IIS6/ASP.NET 2.0のWebアプリケーションでうまく設定が有効にならなかった。原因は不明で現在調査中。

2.IISの管理コンソールなどから設定する
IISの管理コンソールのカスタムヘッダー設定欄から設定する。サイト単位、仮想ディレクトリ単位、アプリケーション単位などで指定可能。

UserAgentの値についての注意

IEではUserAgentはその取得方法によっては、実行されたドキュメントモードによって取得できる値が変化する場合がある。以下のような挙動がとられる。

  • 最終的に解釈されたドキュメントモードにより、JavaScriptのnavigator.userAgentが変化する
  • ただし、サーバに対して通知されるUserAgentは解釈されたドキュメントモードに依存しない


つまり、ブラウザ『IE9』上で、metaによりIE=7が指定されたドキュメントを表示する場合、以下のようになる。

  • サーバサイドに送出されたUserAgent:MSIE 9.0
  • JavaScriptにてnavigator.userAgentで取得した値:MSIE 7.0
ドキュメントモード指定についてのその他のトピックス

その他、気になったことのメモ

  • "Internet Explorer 8で閲覧している際に『9』が指定された場合"のように、見ているブラウザが知らないバージョンの指定については、ブラウザから無視される。
  • 最終的にどのドキュメントモードで解釈されたのかは、JavaScriptにて以下のプロパティで確認できる:document.documentMode
  • コンテンツ作成者によるこれらの方法で指定されたドキュメントモードは、後述する『ユーザ側ブラウザでの互換表示設定』をオーバーライドする
  • ただし、F12開発者ツールでドキュメントモードを指定された場合は、そちらが優先される
  • IE11が無い現時点で状態で『IE=EmulateIE10』を指定する意味があるかないかといわれると*1、現状は無いがIE11が出た時点でIE10互換の動作をすることが一応期待できる…と思う。

IEの互換表示機能

IEにはユーザがブラウザで設定を行うことなどにより、互換表示を行うことができる。
互換表示設定は以下の方法などで設定を行うことができる

  • アドレスバー横のアイコン
  • ツールメニューによる設定(メニューバーを表示していない場合は、altキー押下により行う)

これらの設定はそのページ単位で行うだけでなく、サイト単位で行うことも可能。またマイクロソフトにより配布される互換表示リストにも従う。

意識しておくと良いこと

原則として、この互換表示設定を行うと、ブラウザは以下の挙動をとるので、意識しておくと良いと思われる。

  • サーバ側にUserAgentとしてMSIE 7.0を返す
  • ドキュメントモードはEmulateIE7を指定した場合と同等となる(追記:IE7 Standardsかも。確認します。)
  • metaまたはレスポンスヘッダによりX-UA-Compatibleが指定されている場合、X-UA-Compatibleで指定されている値が優先される
  • metaまたはレスポンスヘッダによりX-UA-Compatibleが指定されている場合、ユーザ側で設定を変更することが出来ない(アドレスバーのボタンも非表示となる)

*1:これはすなわちIEが10までしかない現時点においては『あなたがIE10以上なら、IE10でX-UA-Compatible未指定の場合と同じ解釈をしてね』という意味でしかないので

ModalDialogでポストバックしてファイルをダウンロードさせるTIPS

とりあえずIEで検証。Firefox3とかSafariは未検証なのであしからず。

一般的かどうかに自信は無いですが、ASP.NETにて、ポストバックしたあとにサーバ側でファイルを読み込み、それをダウンロードさせるときは以下のようなコードを書くと思います。

using System;
using System.IO;

namespace DownloadTest
{
    public partial class DialogWindow : System.Web.UI.Page
    {

        /// <summary>
        /// Excelファイルを読み込んでダウンロードさせる
        /// </summary>
        protected void btnDonwload_Click(object sender, EventArgs e)
        {
            byte[] bin=null;
            using (FileStream fs = new FileStream(Server.MapPath("Data/Data.xlsx"), FileMode.Open))
            {
                using (BinaryReader binReader = new BinaryReader(fs))
                {
                    bin = binReader.ReadBytes((Int32)fs.Length);
                }
            }
            Response.Clear();
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", " attachment;filename=Data.xlsx");
            Response.BinaryWrite(bin);
            Response.End();
        }
    }
}

通常はこうすることで、ファイルの保存確認ダイアログをブラウザに表示することが出来るのですが、showModalDialogで表示させたモーダルダイアログで同じ事をやろうとすると、以下の現象が発生します。

  • IE7
    ファイル確認ダイアログが表示されると共にIEの別ウィンドウが表示される。
    ファイル確認ダイアログでの操作が終了すると、開いたウィンドウは自動的に閉じる。
  • IE6
    ファイル確認ダイアログが表示されると共にIEの別ウィンドウが表示される。
    ファイル確認ダイアログでの操作が終了しても、開いたウィンドウは自動的に閉じない

IE7での動作については、まあ許容範囲かなとも思えるのですが、IE6の場合は場合によってはNGをいただく場合もあります。

なんでこんな感じになるかというと、modalDialogの場合にポスト(およびリンク)のtargetが規定で別ウィンドウになっているからだ、と推測されます。その為、ModalDialogでポストバックを行う場合には、base要素でtarget属性を_selfに指定するのが暗黙の前提になっていると思います*1

では、このケースでもtargetを_selfに指定してみるとどうなるかというと……。動きません(ToT)。サーバ側にリクエストは飛び、レスポンスも返しているのですが、dialog側で読み捨てているような感じです。


で、これをどうにか解決しようと思って考えてみたのが以下の方法。

  1. frameを一つだけ持ったframesetのページ一つ用意する
  2. 本来dialog内に表示したいページを上記のframeのソースに指定する

……以上。
dialog内でもframeは表示可能で、かつ、frame内ではdialogの動きの縛りから解放されて普通のwindowと同じように動くので、それを利用したという感じです。
実際のソースは以下。

・[DialogWindow.aspx] 本来dialog内に表示したいページ

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DialogWindow.aspx.cs" Inherits="DownloadTest.DialogWindow" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>無題のページ</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="btnDonwload" runat="server" Text="Download" OnClick="btnDonwload_Click" />
        <input type="button" value="閉じる" onclick="javascript:parent.returnValue=0;parent.close();" />
    </div>
    </form>
</body>
</html>

・[DialogFrame.aspx] 今回の小細工(^^;の為に用意した、framesetのページ

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DialogFrame.aspx.cs" Inherits="DownloadTest.DialogFrame" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>無題のページ</title>
    <script type="text/javascript">
        retValue = null; // 戻値の初期化。ダイアログの×ボタンで閉じられた時用。
    </script>
</head>
<frameset cols="1">
    <frame src="DialogWindow.aspx" />
</frameset>
</html>

・[Default.aspx] dialogを呼び出すページ

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DownloadTest._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>無題のページ</title>
    <script type="text/javascript">
    function OpenDialog(){
        var ret = showModalDialog('DialogFrame.aspx');
        alert(ret);
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input type="button" value="Open Dialog" onclick="javascript:OpenDialog();" />
    </div>
    </form>
</body>
</html>

ちなみに、最初に提示したcsファイルは、今回の場合はDialogWindow.aspxのコードビハインドファイルですね。また、上記サンプルではshowModalDialogの戻り値もframe内のページから操作出来ることを確認するために、DialogWindow.aspxからparentの(DialogFrame.aspxの)retValueに値を設定、戻った後のDefault.aspxで表示してみています*2

framesetのaspxファイルは本当にガワだけなので、Visual Studioのデザイナで扱うときもストレス無く作業出来ると思います。

……ので、どうしてもshowModalDialogを使う必要があって、どうしてもそこからファイルをダウンロードさせないといけないときは、使える手では無いかと思います。

*1:これは言い過ぎかもしれませんが

*2:と言うことで、戻り値操作やスクリプトからのダイアログのクローズも問題無く可能

VistaのIE7でsans-serifがGulimになる

2008/02/21追記
最近、検索で飛んでくる方も結構おられるので追記。
Gulimではなくて、たぶん、中国語の繁体字か何かだと思います。
Gulimは削除しても変わりませんでした。
一応、TechNetフォーラムにも投げているので、リンクを張っておきます。
http://forums.microsoft.com/TechNet-JA/ShowPost.aspx?PostID=2677941&SiteID=36
(2008/02/21現在、返答なしですが(^^;)

自宅マシンをVistaに入れ替え、本運用を開始してから2週間くらいたつわけなのだけれど、今日たまたまとあるサイトを表示したときに???な事態に。
どうもフォントのレンダリングがカクカクでオカシイ。というか、フォントが変。通常のものと明らかに違う字形で表示されている漢字がある。

「styleで何かそういうフォントが指定されているのかな?」とも一瞬考えたのだけれど、このVista環境で開いたのこそ初めてとはいえ、入れ替え前のXP環境では普通に表示されていた筈だし、職場(これもXP環境)からは先週中も普通に閲覧していた。
そもそもそのサイトでそういう奇特な(?)フォントを指定しているとか非常に考えにくい*1

色々と腑に落ちないので、とりあえず該当サイトのstyleをチェックしたところ、(当然のように)別に変なフォントなどは指定されておらず、問題の文字列が影響を受けている範囲ではシンプルにsans-serifが指定されているだけにしか見えない。


一層腑に落ちない事態になって来たので、とりあえず手元でミニマムコードで検証してみたところ、少なくとも以下のことがわかった。

  • 該当文字列の表示スタイルを決定するfont-familyとしてsans-serifだけが指定されている*2
  • Shift_JISもしくはeuc-jpなページである*3
  • 以上二点を満たすと、IE7 on Vistaでは、(標準ではおそらく)MS Pゴシックで表示されることが期待される筈の文字がGulimで表示される

……orz。


ちなみにfont-familyがsans-serifであっても、utf-8なページだと普通にMS Pゴシックで表示された。


とりあえず読めるので問題無い……と見せかけて、いくつかは明らかに字形が違うし、文字のバランスが変だし(Gulimに無い奴が他から持って来られてる?)、円記号がウォン記号になるし(これは当たり前だけど少し笑った)で、とりあえず私の精神的にはとても良くないのでどうしたものかと思案中。



……しかし。これはIE7 on Vistaのバグなんではないの……か?

*1:そのサイトとは、小飼さんの404 Blog Not Found

*2:sans-serifだけが有効になる状態というべきか

*3:実はShift_JISeuc-jpとutf-8しか試していないけど、まあ一般的に日本語のサイトならこれくらいだろう、ということで