Changeset 75066 in webkit
- Timestamp:
- Jan 5, 2011 7:51:37 AM (13 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r75065 r75066 1 2011-01-05 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::suspendScheduledTasks): 16 (WebCore::DocumentParser::resumeScheduledTasks): 17 * dom/DocumentParser.h: 18 * html/parser/HTMLDocumentParser.cpp: 19 (WebCore::HTMLDocumentParser::suspendScheduledTasks): 20 (WebCore::HTMLDocumentParser::resumeScheduledTasks): 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 2011-01-05 Simon Hausmann <simon.hausmann@nokia.com> 2 32 -
trunk/WebCore/dom/DocumentParser.cpp
r75048 r75066 69 69 } 70 70 71 void DocumentParser::suspendScheduledTasks() 72 { 73 } 74 75 void DocumentParser::resumeScheduledTasks() 76 { 77 } 78 71 79 }; 72 80 -
trunk/WebCore/dom/DocumentParser.h
r75048 r75066 92 92 bool documentWasLoadedAsPartOfNavigation() const { return m_documentWasLoadedAsPartOfNavigation; } 93 93 94 // FIXME: The names are not very accurate :( 95 virtual void suspendScheduledTasks(); 96 virtual void resumeScheduledTasks(); 97 94 98 protected: 95 99 DocumentParser(Document*); -
trunk/WebCore/html/parser/HTMLDocumentParser.cpp
r75048 r75066 521 521 } 522 522 523 } 523 void HTMLDocumentParser::suspendScheduledTasks() 524 { 525 if (m_parserScheduler) 526 m_parserScheduler->suspend(); 527 } 528 529 void HTMLDocumentParser::resumeScheduledTasks() 530 { 531 if (m_parserScheduler) 532 m_parserScheduler->resume(); 533 } 534 535 } -
trunk/WebCore/html/parser/HTMLDocumentParser.h
r75048 r75066 73 73 74 74 virtual TextPosition0 textPosition() const; 75 virtual void suspendScheduledTasks(); 76 virtual void resumeScheduledTasks(); 75 77 76 78 protected: -
trunk/WebCore/html/parser/HTMLParserScheduler.cpp
r75048 r75066 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
r75048 r75066 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
r75048 r75066 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->suspendScheduledTasks(); 52 55 } 53 56 } … … 70 73 frame->document()->resumeActiveDOMObjects(); 71 74 frame->document()->asyncScriptRunner()->resume(); 75 if (DocumentParser* parser = frame->document()->parser()) 76 parser->resumeScheduledTasks(); 72 77 } 73 78 }
Note: See TracChangeset
for help on using the changeset viewer.