alert ã®ä½ç½®ãç¥ã
- dom/src/base/nsGlobalWindow.cpp 4035 è¡ç®
- nsGlobalWindow::Alert
JavaScript ãæ¸ã
alert(0); var img = document.createElement('img'); img.onload = function() { alert(1) }; alert(2); img.src = 'http://www.hatena.ne.jp/images/top/h1.gif'; alert(3); document.body.appendChild(img); alert(4);
Firefox ã§éã
0 -> 2 -> 3 -> 1 -> 4
gdb èµ·åï¼Firefox ã®ãã«ããå¿ è¦ï¼
$ gdb MinefieldDebug.app/Contents/MacOS/firefox-bin (gdb) b nsGlobalWindow::Alert (gdb) r
alert(1) ã®ã¨ããã ãè¦ã
var img = document.createElement('img'); img.onload = function() { alert(1) }; img.src = 'http://www.hatena.ne.jp/images/top/h1.gif'; document.body.appendChild(img);
ããã¯ãã¬ã¼ã¹
#0 nsGlobalWindow::Alert (this=0x1c97f420, aString=@0x18cc38d0) at /Users/amachang/mozilla/dom/src/base/nsGlobalWindow.cpp:4035 ï¼ ï¼ #16 0x1314fcf1 in nsImageLoadingContent::Event::Run (this=0x17f93040) at /Users/amachang/mozilla/content/base/src/nsImageLoadingContent.cpp:833 ï¼ ï¼
nsImageLoadingContent::Event::Run ã®ã³ã¼ããè¦ã¦ã¿ã
(gdb) b nsImageLoadingContent::Event::Run (gdb) c Breakpoint 2, nsImageLoadingContent::Event::Run (this=0x17e55150) at /Users/amachang/mozilla/content/base/src/nsImageLoadingContent.cpp:823 823 if (mMessage.EqualsLiteral("load")) { (gdb) l 818 NS_IMETHODIMP 819 nsImageLoadingContent::Event::Run() 820 { 821 PRUint32 eventMsg; 822 823 if (mMessage.EqualsLiteral("load")) { 824 eventMsg = NS_LOAD; 825 } else { 826 eventMsg = NS_LOAD_ERROR; 827 } (gdb) l 828 829 nsCOMPtr<nsIContent> ourContent = do_QueryInterface(mContent); 830 831 nsEvent event(PR_TRUE, eventMsg); 832 event.flags |= NS_EVENT_FLAG_CANT_BUBBLE; 833 nsEventDispatcher::Dispatch(ourContent, mPresContext, &event); 834 835 return NS_OK; 836 } 837 (gdb)
ãã¼ããéä¿¡ãã¦ãã¨ãããè¦ãã
(gdb) reverse-search "load" 823 if (mMessage.EqualsLiteral("load")) { (gdb) reverse-search "load" 249 FireEvent(NS_LITERAL_STRING("load"));
ãã£ãï¼
249 è¡ç®ã§æ¢ãã¦ã¿ã
(gdb) b nsImageLoadingContent.cpp:249 (gdb) c Breakpoint 4, nsImageLoadingContent::OnStopDecode (this=0x1c6dd39c, aRequest=0x1c6dbf80, aStatus=5505024, aStatusArg=0x0) at /Users/amachang/mozilla/content/base/src/nsImageLoadingContent.cpp:249 249 FireEvent(NS_LITERAL_STRING("load")); (gdb)
ããã¯ãã¬ã¼ã¹
Breakpoint 4, nsImageLoadingContent::OnStopDecode (this=0x1c6dd39c, aRequest=0x1c6dbf80, aStatus=5505024, aStatusArg=0x0) at /Users/amachang/mozilla/content/base/src/nsImageLoadingContent.cpp:249 249 FireEvent(NS_LITERAL_STRING("load")); (gdb) bt #0 nsImageLoadingContent::OnStopDecode (this=0x1c6dd39c, aRequest=0x1c6dbf80, aStatus=5505024, aStatusArg=0x0) at /Users/amachang/mozilla/content/base/src/nsImageLoadingContent.cpp:249 ï¼ ï¼ #10 0x13227d41 in nsHTMLImageElement::SetSrc (this=0x1c6dd380, aValue=@0xbfff99a4) at /Users/amachang/mozilla/content/html/content/src/nsHTMLImageElement.cpp:219 #11 0x11223f98 in nsIDOMHTMLImageElement_SetSrc (cx=0xb67000, obj=0x1cc65340, id=441507292, vp=0xbfffa5f8) at dom_quickstubs.cpp:6846 ï¼ ï¼ #64 0x000026e3 in main (argc=1, argv=0xbffff8e8) at /Users/amachang/mozilla/browser/app/nsBrowserApp.cpp:156
ãªãããªã¼
ãã¼ãè¦ãã¨
nsHTMLImageElement::SetSrc ãã load ã¤ãã³ããçºç«ããã¦ãããã¨ãåãã
ã§ã
alert(0); var img = document.createElement('img'); img.onload = function() { alert(1) }; alert(2); img.src = 'http://www.hatena.ne.jp/images/top/h1.gif'; // ããã§çºç«ãããã®ã« alert(3); // ããã alert(1) ããå ã«èµ·ããã®ã¯ä½æ ï¼ document.body.appendChild(img); alert(4);
alert(3) ã§æ¢ãã¦ããã¯ãã¬ã¼ã¹ãè¦ã
Breakpoint 1, nsGlobalWindow::Alert (this=0x1c97f420, aString=@0x1e75d860) at /Users/amachang/mozilla/dom/src/base/nsGlobalWindow.cpp:4035 4035 FORWARD_TO_OUTER(Alert, (aString), NS_ERROR_NOT_INITIALIZED); (gdb) p aString $7 = (const nsAString_internal &) @0x1e75d860: { mData = 0x1e66a898, mLength = 1, mFlags = 5 } (gdb) p aString->mData $8 = (PRUnichar *) 0x1e66a898 (gdb) p (char*)aString->mData $9 = 0x1e66a898 "3" (gdb) bt #0 nsGlobalWindow::Alert (this=0x1c97f420, aString=@0x1e75d860) at /Users/amachang/mozilla/dom/src/base/nsGlobalWindow.cpp:4035 #1 0x0049e1c1 in NS_InvokeByIndex_P (that=0x1c97f420, methodIndex=65, paramCount=1, params=0xbfff84e4) at /Users/amachang/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_unixish_x86.cpp:179 ï¼ ï¼
ãã¼ãã
å¥ã¹ã¬ãããªã®ããªï¼
å ¨ã¹ã¬ããããã¯ãã¬ã¼ã¹
(gdb) thread apply all bt
ã§ãã alert(1) ã alert(2) ã main ããç¹ãã£ã¦ãããããã¶ãåãã¹ã¬ããã ã¨æããã ãã©ãªã¼
ããã£ã
ã¤ãã³ãã¯çºç«ããã¦ãããã«ã¯å®è¡ãããªãã¦ããããã¹ãã¿ã¤ãã³ã°ã§ã¤ãã³ãã®ãã¥ã¼ãè¦ã«è¡ãã®ãã
ãã®ã¿ã¤ãã³ã°ã£ã¦ã©ãã
ãã£ãã nsImageLoadingContent::Event::Run ã§æ¢ãã¦ã¿ã
Event::Run ã®ããã¯ã¨ã¬ã¼ã¹ãè¦ã¦ã¿ã㨠alert(3) ã® nsGlobalWindow::Alert ããå¼ã°ãã¦ãããã¨ãåãã£ã
#0 nsImageLoadingContent::Event::Run (this=0x1d67fe50) at /Users/amachang/mozilla/content/base/src/nsImageLoadingContent.cpp:823 #1 0x004833c0 in nsThread::ProcessNextEvent (this=0x719030, mayWait=1, result=0xbfffadfc) at /Users/amachang/mozilla/xpcom/threads/nsThread.cpp:510 #2 0x0040d198 in NS_ProcessNextEvent_P (thread=0x719030, mayWait=1) at nsThreadUtils.cpp:227 #3 0x1298c2da in nsXULWindow::ShowModal (this=0x16991bc0) at /Users/amachang/mozilla/xpfe/appshell/src/nsXULWindow.cpp:396 ï¼ ï¼ #10 0x133b6904 in nsGlobalWindow::Alert (this=0x1c53aa10, aString=@0x1d69f080) at /Users/amachang/mozilla/dom/src/base/nsGlobalWindow.cpp:4064
ã§ãããªãã§ XULWindow::showModal ã NS_ProcessNextEvent_P ãå¼ã³åºãããåãããªã
NS_ProcessNextEvent_P ï¼ãã¯ãå NS_ProcessNextEventï¼ãå¼ã³åºãã¦ãã¨ããã grep ãã¦ã¿ãã¨ãããããããã¨ã«æ°ãã¤ãã
ãããã®ã¿ã¤ãã³ã°ã§ã¤ãã³ãã¯å¦çãããã®ãã
- alert ãããã¨ã
- window.open ããã¨ã
- HTML ã®ãã¼ã¹ãçµãã£ãã¨ã
ãªã©ãªã©
ã¤ã¾ãã
var img = document.createElement('img'); img.onload = function() { alert(1) }; img.src = 'http://www.hatena.ne.jp/images/top/h1.gif'; // ãã®æç¹ã§ç»åã®ãã¼ããçµãã£ã¦ã㦠alert(3); // ãã® alert ã«èªçºãã㦠onload ã¤ãã³ããã³ãã©ãèµ·åãã document.body.appendChild(img);
ã£ã¦ãã¨ã
ãããã Firefox ã®ç»åã£ã¦éåæã«ãã¼ãããã¦ã訳ãããªãã®ããªï¼
試ãã«ã以ä¸ã®ãã㪠CGI ãä½ã£ã¦ã¿ã
#! /usr/bin/perl print "Content-Type: image/gif\n\n"; # 10 ç§åæ¢ sleep(10); open IMG, "hogehogehogehoge.gif"; binmode IMG; binmode STDIO; while (my $bin = <IMG>) { print STDOUT $bin; } close IMG;
ã§ã以ä¸ã®ãã㪠JavaScript ãããã® image.cgi ãèµ·å
var start = new Date; var img = document.createElement('img'); img.onload = function() { alert(1) }; img.src = 'image.cgi'; document.body.appendChild(img); alert(4);
ããã¡ããã¨éåæã«ãªã£ã¦ããªã¼
ã¨ãããã
仿¥ã¯ãã®è¾ºã§ãçµå±ãªãã§ Firefox ã® img.src ã®è¨å®ãé ããã¯åãããªãã£ã