Changeset 74420 in webkit
- Timestamp:
- Dec 21, 2010 11:24:08 AM (13 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r74418 r74420 1 2010-12-21 Yong Li <yoli@rim.com> 2 3 Reviewed by Adam Barth. 4 5 Suspend HTMLParserScheduler when page load is deferred to 6 avoid potential JS re-entrancy. Otherwise, when JS execution is triggered 7 from an external script or by events, and is blocked by a modal dialog, 8 WebKit can parse more HTML source and also start another JS execution. 9 10 https://bugs.webkit.org/show_bug.cgi?id=48077 11 12 Test case: WebCore/manual-tests/bugzilla-48077.html. 13 14 * dom/DocumentParser.cpp: 15 (WebCore::DocumentParser::suspendParsing): 16 (WebCore::DocumentParser::resumeParsing): 17 * dom/DocumentParser.h: 18 * html/parser/HTMLDocumentParser.cpp: 19 (WebCore::HTMLDocumentParser::suspendParsing): 20 (WebCore::HTMLDocumentParser::resumeParsing): 21 * html/parser/HTMLParserScheduler.cpp: 22 (WebCore::HTMLParserScheduler::HTMLParserScheduler): 23 (WebCore::HTMLParserScheduler::suspend): 24 (WebCore::HTMLParserScheduler::resume): 25 * html/parser/HTMLParserScheduler.h: 26 (WebCore::HTMLParserScheduler::isScheduledForResume): 27 * page/PageGroupLoadDeferrer.cpp: 28 (WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer): 29 (WebCore::PageGroupLoadDeferrer::~PageGroupLoadDeferrer): 30 1 31 2010-12-21 Anders Carlsson <andersca@apple.com> 2 32 -
trunk/WebCore/dom/DocumentParser.cpp
r69026 r74420 69 69 } 70 70 71 void DocumentParser::suspendParsing() 72 { 73 } 74 75 void DocumentParser::resumeParsing() 76 { 77 } 78 71 79 }; 72 80 -
trunk/WebCore/dom/DocumentParser.h
r69026 r74420 92 92 bool documentWasLoadedAsPartOfNavigation() const { return m_documentWasLoadedAsPartOfNavigation; } 93 93 94 // FIXME: The names are not very accurate :( 95 virtual void suspendParsing(); 96 virtual void resumeParsing(); 97 94 98 protected: 95 99 DocumentParser(Document*); -
trunk/WebCore/html/parser/HTMLDocumentParser.cpp
r73817 r74420 520 520 } 521 521 522 } 522 void HTMLDocumentParser::suspendParsing() 523 { 524 m_parserScheduler->suspend(); 525 } 526 527 void HTMLDocumentParser::resumeParsing() 528 { 529 m_parserScheduler->resume(); 530 } 531 532 } -
trunk/WebCore/html/parser/HTMLDocumentParser.h
r71735 r74420 94 94 virtual int lineNumber() const; 95 95 virtual TextPosition0 textPosition() const; 96 virtual void suspendParsing(); 97 virtual void resumeParsing(); 96 98 97 99 // HTMLScriptRunnerHost -
trunk/WebCore/html/parser/HTMLParserScheduler.cpp
r66277 r74420 66 66 , m_parserChunkSize(parserChunkSize(m_parser->document()->page())) 67 67 , m_continueNextChunkTimer(this, &HTMLParserScheduler::continueNextChunkTimerFired) 68 , m_isSuspendedWithActiveTimer(false) 68 69 { 69 70 } … … 93 94 } 94 95 96 void HTMLParserScheduler::suspend() 97 { 98 ASSERT(!m_isSuspendedWithActiveTimer); 99 if (!m_continueNextChunkTimer.isActive()) 100 return; 101 m_isSuspendedWithActiveTimer = true; 102 m_continueNextChunkTimer.stop(); 95 103 } 104 105 void HTMLParserScheduler::resume() 106 { 107 ASSERT(!m_continueNextChunkTimer.isActive()); 108 if (!m_isSuspendedWithActiveTimer) 109 return; 110 m_isSuspendedWithActiveTimer = false; 111 m_continueNextChunkTimer.startOneShot(0); 112 } 113 114 } -
trunk/WebCore/html/parser/HTMLParserScheduler.h
r66277 r74420 72 72 } 73 73 74 bool isScheduledForResume() const { return m_continueNextChunkTimer.isActive(); } 74 bool isScheduledForResume() const { return m_isSuspendedWithActiveTimer || m_continueNextChunkTimer.isActive(); } 75 76 void suspend(); 77 void resume(); 75 78 76 79 private: … … 84 87 int m_parserChunkSize; 85 88 Timer<HTMLParserScheduler> m_continueNextChunkTimer; 89 bool m_isSuspendedWithActiveTimer; 86 90 }; 87 91 -
trunk/WebCore/page/PageGroupLoadDeferrer.cpp
r67432 r74420 23 23 24 24 #include "AsyncScriptRunner.h" 25 #include "DocumentParser.h" 25 26 #include "Frame.h" 26 27 #include "Page.h" … … 50 51 frame->document()->suspendActiveDOMObjects(ActiveDOMObject::WillShowDialog); 51 52 frame->document()->asyncScriptRunner()->suspend(); 53 if (DocumentParser* parser = frame->document()->parser()) 54 parser->suspendParsing(); 52 55 } 53 56 } … … 70 73 frame->document()->resumeActiveDOMObjects(); 71 74 frame->document()->asyncScriptRunner()->resume(); 75 if (DocumentParser* parser = frame->document()->parser()) 76 parser->resumeParsing(); 72 77 } 73 78 }
Note: See TracChangeset
for help on using the changeset viewer.