1. 程式人生 > >iOS7 中 Safari 的一個離奇 Bug

iOS7 中 Safari 的一個離奇 Bug

文章目錄

提醒:本文最後更新於 1920 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

這個 Bug 是我由同事發現並確認的,一開始我還不相信 Apple 會犯這麼低階的錯誤。截止到目前,所有版本的 iOS7(包括最新的 7.0.2),無論是執行在 iPhone、iPad 上,還是 iPod touch 都有問題。簡而言之,這個 Bug 是「某種情況下,Safari 中的 alert、confirm 和 prompt 方法都壞掉。而且重啟 Safari 之前,即使重新整理或新建 Tab,這個 Bug 始終存在」。至於是什麼情況下,會壞成什麼樣,請繼續往下看。

觸發條件

經過分析,以下程式碼會觸發 iOS7 自帶 Safari 的這個 Bug:

var iframe = document.createElement("iframe");
iframe.src = "xxx:yyy";
document.body.insertBefore(iframe, document.body.childNodes[0]);

confirm('?');

也就是說,iOS7 中,在頁面插入 iframe 時使用了 Safari 不認識的協議;緊接著呼叫 window.confirm 方法,就會觸發這個 Bug。

現象

上面的程式碼,會幾乎同時彈出兩個系統浮層:一個是「無法開啟頁面」提示,一個是 confirm 對話方塊。正常情況下,confirm 會停止執行後續程式碼,等待使用者選擇 Cancel/OK,並返回使用者選擇的布林值:

confirm(普通的 confirm。連結

但在觸發了 Bug 的程式碼中,confirm 會直接返回 false,並繼續執行後續程式碼。雖然也顯示對話方塊,但無論選哪個選項都一樣——程式碼早就執行過了:

broken confirm(壞掉的 confirm。連結

更為嚴重的是:只要激活了這個 Bug,即使新建 Tab 訪問其它正常頁面,confirm、alert 或 prompt 仍然不停止執行程式碼,仍然得不到 confirm 和 prompt 的正確返回值(它倆返回值始終是 false 和 null)。

broken confirm 2

雙擊 Home 鍵殺死 Safari,重新開啟 Safari 訪問正常頁面,confirm 等方法才會正常。

結論

我把這個 Bug 彙報給了 Apple,到目前為止沒有收到任何回覆。目前我們能做的不外乎兩點:1)避免使用「

觸發條件」這一小節提到的程式碼;2)由於這個 Bug 影響的是整個 Safari,所以儘量不要使用原生 alert、confirm 和 prompt,自己實現具有這些功能的浮層。

update @ 2013.10.24,在更新到 iOS 7.0.3(11B511) 的 iPhone 4s 上測試,本文描述的問題仍未修復。

update @ 2013.11.15,在更新到 iOS 7.0.4(11B554a) 的 iPhone 4s 上測試,本文描述的問題仍未修復。

--EOF--

提醒:本文最後更新於 1920 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

相關推薦

iOS7 Safari一個離奇 Bug

文章目錄 觸發條件 現象 結論 提醒:本文最後更新於 1920 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 這個 Bug 是我由同事發現並確認的,一開始我還不相信 Apple 會犯這麼低階的錯誤。截止到目前,所有版本的 iOS7(包括最新的 7.0.2),無論

記IOS8碰到的一個JS bug

brush script ava 語法 bsp 。。 兼容 javascrip ios8 IOS8的JS版本過低導致 var id = "123"; var temp1 = {id, "left": "200"}; // error in IOS8 var t

yarn client一個BUG的修復

org.apache.spark.deploy.yarn.Client.scala中的monitorApplication方法: /** * Report the state of an application until it has exited, either successfully

C++ windows已在xxx.exe觸發一個斷點,其原因可能是堆被損壞,這說明xx.exe或它所載入的任何DLLbug

windows已在xxx.exe中觸發一個斷點,其原因可能是堆被損壞,這說明xx.exe中或它所載入的任何DLL中有bug。  原因也可能是使用者在xx.exe具有焦點時按下了F12。  輸出視窗可能提供了更多診斷資訊 。  我出現類似錯誤的情況是: 建立一個連

面試官問:說一個你工作有價值的bug

表面看這是一個非常簡單的一個問題,做測試辣麼久,發現的bug無數,隨便從中挑選一個比較“特別”的一個bug說說就可以了啊! 但其實,越是從習以為常的事情中找“特別”越困難,比如,我每天中午都是樓下隨便找一家快餐店吃飯,如果有人問我:說說你印象深刻的一次吃快餐的經歷。除非我哪天吃出了蒼蠅,否則怎麼

在mysqlRIGHT JOIN與group by一起使用引起的一個bug

本來按理說這個小問題不值得寫一個部落格的,不過正是這個小問題造成了一個大bug。 本來每月對資料都好好的,但是這一兩天突然發現許多資料明顯不對,這一塊的程式碼和sql有些不是我寫的,不過出現了bug,還是要迎難而上,我就從資料來源頭查起,發現數據源好像也沒有問題。 地毯式搜尋,中間的sql,邏輯一個一個對

在latex使用數學花體的一個bug

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

一個bug:calloc出現的segment fault

其實也就雞毛蒜皮的小事,本來不想記錄在部落格上的,不過這個bug背後隱藏的東西確實比較有記錄的價值,如果說解bug就像是解初高中數學題,那麼有的bug就像一道出得很漂亮的題,短小精幹但背後隱藏的資訊量卻很大,一下子就讓你記住了背後的那些定理概念。 事情是這樣的,segment

C++ windows已在xxx.exe觸發一個斷點,其原因可能是堆被損壞,這說明xx.exe或它所載入的任何DLLbug

windows已在xxx.exe中觸發一個斷點,其原因可能是堆被損壞,這說明xx.exe中或它所載入的任何DLL中有bug。  原因也可能是使用者在xx.exe具有焦點時按下了F12。  輸出視窗可能提供了更多診斷資訊 。  我出現類似錯誤的情況是: 建立一個連結串列,在

百度天工雲mqtt測試一個BUG

一、環境 win7    python2.7.13    二、報錯 Traceback (most recent call last):   File "E:/project/test/mqtt/mqtt_test.py", line 35, in <module&

處理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模塊列表一個錯誤模塊“ManagedPipelineHandler”

images 打開 ext framework ros windows log asp gii IIS上部署MVC網站,打開後ExtensionlessUrlHandler-Integrated-4.0解決方法 IIS上部署MVC網站,打開後500錯誤:處理程序&ldqu

dropzone拖動文件上傳在thinkphp5應用一個實例

php dropzone參考:Dropzone的使用方法點擊查看dropzone中文文檔後臺用的INSPINIA框架的模板,裏面有,dropzone.jsdropzone是一個可以拖文件上傳的js.拖進去,就上傳了。我在頁面上,寫了一個保存已經上傳的文件的image3,image4.這就需要改寫一下dropz

IOS7動態計算UILable的高度

content tof 送別 lds %d bre 內心 大學生活 hsi .h文件 #import <UIKit/UIKit.h> @interface UILabel (ContentSize) - (CGSize)contentSize;

C語言一個*和[]優先級問題

pre 執行 return ges spa 技術 分享 malloc bsp 最近寫著玩了這麽一段代碼 1 int Init(int **T, int v1, int v2, int v3) 2 { 3 4 if (!(*T=(int*) malloc(3*

JavaScript替換字符串最後一個字符

nbsp jsb [0 鍵盤 sof 擴展 call cti += 1、問題背景 在一個輸入框中,限制字符串長度為12位。利用鍵盤輸入一個數字,會將字符串中最後一位替換,比方:111111111111。再輸入一個3,會顯示1111111111132、詳細實現&l

Linux實現一個簡單的進度條【轉】

做的 會有 發現 文件 rsquo 實時 時間 改進 常見 轉自:http://blog.csdn.net/yuehailin/article/details/53999288 說起進度條,其實大家常常見到,比如說你在下載視頻或文件的時候,提示你當前下載進度的就是我們今天

Java循環刪除一個列表元素

代碼 each 列表 導致 拷貝 move expec 處理 ati 本文主要想講述一下我對之前看到一篇文章的說法。假設跟你的想法有出入,歡迎留言。一起討論。 #3. 在循環中刪除一個列表元素   考慮以下的代碼。叠代過程中刪除元素: ArrayL

在應用程序一個控制臺

tle 設置 ini 控制 instance itl title stc std 在CTestConsoleApp類中重載InitInstance()並在該函數中輸入: AllocConsole(); // 開辟控制臺SetConsoleTitle(_T("Debug Ou

Mybatisupdate一個實體的動態sql

trim myba type 包含 刪掉 logs ear err ref <update id="updateOne" parameterType="com.inspur.search.data.EntityRelation"> UPDATE ENTIT

iOS開發之使用UICollectionView實現美團App的分類功能【偶現大眾點評App的一個bug

sso leg 一個 borde spa line 註意 oba alt 郝萌主傾心貢獻,尊重作者的勞動成果,請勿轉載。假設文章對您有所幫助,歡迎給作者捐贈,支持郝萌主,捐贈數額任意,重在心意^_^ 我要捐贈: 點擊捐贈Cocos2d-X源代碼下載:點我傳送遊戲官方下載