同事回報測試網站的ModalDialog在按下<input type="submit">時會另開新視窗。

這本來是條老梗,在Modal Dialog Mini FAQ一文的Q4中已明白揭示: 只要加上<base target="_self" />就可以藥到病除。

BUT!!

射茶包最恨的就是這個BUT!!

該網頁原本就已加了<base target="_self" />,且起初在主機A測試無誤,直到showModalDialog網頁改成內嵌在主機B Portal網頁的Frame中才發生問題,這就很GY了有點意思了! 更過分的是,發現這個問題只會發生在Windows 7 + IE8的組合上,試過Windows XP + IE8, Windows 2003 + IE8, Vista + IE8, Windows 7 + IE9, Windows 2008 R2 + IE9... 測試Postback均未發生異常。

分析一下,原先內嵌於同一Web的Frame時沒問題,Portal與內嵌網頁分據不同主機時才出錯(Cross-Site Issue?)。而連線主機B Portal頁面時,使用的是機器名稱(安全區域會被判定成內部網路,Local Intranet),Frame所使用的URL則是用IP(會被判定成網際網路安全區域),因此初步推估在這種混合不同安全區域的條件,也有可能是Cross-Site安全原則作祟。很幸運地,發現只要將A主機IP也指定成Local Intranet後,問題就排除了。

對觸發問題的條件還有些模糊,整理出驗證案例於Windows 7 + IE8進行測試:

Home.htm ==> 使用showModalDialog開啟ModalDialog.htm

<html><head><script type="text/javascript">
window.setTimeout(function() {
    var url = "http://172.28.1.1/IE8Issue/ModalDialog.htm?r=" + Math.random();
    var rv = 
window.showModalDialog(url,window,"dialogHeight=100px;dialogWidth=100px;help=no;");
}, 500);
</script></head><body></body></html>

ModalDialog.htm ==> 提供<input type="submit">以模擬Postback過程

<html>
<head><base target="_self" /></head>
<body>
<form action="ModalDialog.htm">
    <input type="submit" value="Submit" />
</form>
</body></html>

【測試1】 Home.htm在Local Intranet(即URL使用機器名稱),ModalDialog.htm在Internet(URL使用IP),每次按下Submit都會另開新視窗

【測試2】使用IP方式開啟Home.htm,會先有Pop-up Blocked警告,允許後,Postback是正常的。

(Postback結果正常,但有FAQ一文說的Q5 5) Body Margin位移問題)

【測試3】將172.28.1.1加入Local Intranet(留意下方狀態顯示已改成Local Intranet)後,Postback不會另開視窗。

使用非Windows 7 + IE8的組合,並不會發生測試1的問題。所以,"Windows 7 + IE8 + 由Local Intranet安全區域showModalDialog來自Internet安全區域的網頁"是我試出來重現問題的關鍵。

另外,測試過程還留意到另一點有趣差異,過去曾注意到有時ModalDialog有地址列(見測試2的圖),有時候沒有(見測試3的圖),以前不知其所以然,這回也意外理解到此與Security安全設定有關(如下圖)。在古早年代,ModalDialog可以沒有地址列,沒有狀態列,看起來完全不像網頁,於是有些惡意網頁便拿它來做壞事, 偽裝成Windows登入對話框騙使用者輸入AD密碼之類的。後來,基於安全考量,瀏覽器開始對ModalDialog的呈現風格設限(就像規定玩具槍槍口要塗橘色一樣),但對於Local Intranet倒是放寬許多。知道了這點,我決定把ModalDialog的地址列永遠加回來,這樣子以後Debug時要查ModalDialog URL時就不必再靠額外的工具囉!

PS: 昨天還發現慘案一椿,這才知道IE9把Security Zone、Cookie禁用、Protected Mode等顯示都從狀態列移除了,只留了顯示比例調整,變成雞肋一根,難怪預設狀態列是藏起來的,這對常用IE射茶包的人是一大打擊啊! IE Team,快把完整的狀態列還給我!! (補聲暗)


Comments

Be the first to post a comment

Post a comment