Changeset 75066 in webkit


Ignore:
Timestamp:
Jan 5, 2011 7:51:37 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

2011-01-05 Yong Li <yoli@rim.com>

Reviewed by Adam Barth.

Suspend HTMLParserScheduler when page load is deferred to
avoid potential JS re-entrancy. Otherwise, when JS execution is triggered
from an external script or by events, and is blocked by a modal dialog,
WebKit can parse more HTML source and also start another JS execution.

https://bugs.webkit.org/show_bug.cgi?id=48077

Test case: WebCore/manual-tests/bugzilla-48077.html.

  • dom/DocumentParser.cpp: (WebCore::DocumentParser::suspendScheduledTasks): (WebCore::DocumentParser::resumeScheduledTasks):
  • dom/DocumentParser.h:
  • html/parser/HTMLDocumentParser.cpp: (WebCore::HTMLDocumentParser::suspendScheduledTasks): (WebCore::HTMLDocumentParser::resumeScheduledTasks):
  • html/parser/HTMLParserScheduler.cpp: (WebCore::HTMLParserScheduler::HTMLParserScheduler): (WebCore::HTMLParserScheduler::suspend): (WebCore::HTMLParserScheduler::resume):
  • html/parser/HTMLParserScheduler.h: (WebCore::HTMLParserScheduler::isScheduledForResume):
  • page/PageGroupLoadDeferrer.cpp: (WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer): (WebCore::PageGroupLoadDeferrer::~PageGroupLoadDeferrer):
Location:
trunk/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r75065 r75066  
     12011-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
    1312011-01-05  Simon Hausmann  <simon.hausmann@nokia.com>
    232
  • trunk/WebCore/dom/DocumentParser.cpp

    r75048 r75066  
    6969}
    7070
     71void DocumentParser::suspendScheduledTasks()
     72{
     73}
     74
     75void DocumentParser::resumeScheduledTasks()
     76{
     77}
     78
    7179};
    7280
  • trunk/WebCore/dom/DocumentParser.h

    r75048 r75066  
    9292    bool documentWasLoadedAsPartOfNavigation() const { return m_documentWasLoadedAsPartOfNavigation; }
    9393
     94    // FIXME: The names are not very accurate :(
     95    virtual void suspendScheduledTasks();
     96    virtual void resumeScheduledTasks();
     97
    9498protected:
    9599    DocumentParser(Document*);
  • trunk/WebCore/html/parser/HTMLDocumentParser.cpp

    r75048 r75066  
    521521}
    522522
    523 }
     523void HTMLDocumentParser::suspendScheduledTasks()
     524{
     525    if (m_parserScheduler)
     526        m_parserScheduler->suspend();
     527}
     528
     529void HTMLDocumentParser::resumeScheduledTasks()
     530{
     531    if (m_parserScheduler)
     532        m_parserScheduler->resume();
     533}
     534
     535}
  • trunk/WebCore/html/parser/HTMLDocumentParser.h

    r75048 r75066  
    7373
    7474    virtual TextPosition0 textPosition() const;
     75    virtual void suspendScheduledTasks();
     76    virtual void resumeScheduledTasks();
    7577
    7678protected:
  • trunk/WebCore/html/parser/HTMLParserScheduler.cpp

    r75048 r75066  
    6666    , m_parserChunkSize(parserChunkSize(m_parser->document()->page()))
    6767    , m_continueNextChunkTimer(this, &HTMLParserScheduler::continueNextChunkTimerFired)
     68    , m_isSuspendedWithActiveTimer(false)
    6869{
    6970}
     
    9394}
    9495
     96void HTMLParserScheduler::suspend()
     97{
     98    ASSERT(!m_isSuspendedWithActiveTimer);
     99    if (!m_continueNextChunkTimer.isActive())
     100        return;
     101    m_isSuspendedWithActiveTimer = true;
     102    m_continueNextChunkTimer.stop();
    95103}
     104
     105void 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  
    7272    }
    7373
    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();
    7578
    7679private:
     
    8487    int m_parserChunkSize;
    8588    Timer<HTMLParserScheduler> m_continueNextChunkTimer;
     89    bool m_isSuspendedWithActiveTimer;
    8690};
    8791
  • trunk/WebCore/page/PageGroupLoadDeferrer.cpp

    r75048 r75066  
    2323
    2424#include "AsyncScriptRunner.h"
     25#include "DocumentParser.h"
    2526#include "Frame.h"
    2627#include "Page.h"
     
    5051                    frame->document()->suspendActiveDOMObjects(ActiveDOMObject::WillShowDialog);
    5152                    frame->document()->asyncScriptRunner()->suspend();
     53                    if (DocumentParser* parser = frame->document()->parser())
     54                        parser->suspendScheduledTasks();
    5255                }
    5356            }
     
    7073                frame->document()->resumeActiveDOMObjects();
    7174                frame->document()->asyncScriptRunner()->resume();
     75                if (DocumentParser* parser = frame->document()->parser())
     76                    parser->resumeScheduledTasks();
    7277            }
    7378        }
Note: See TracChangeset for help on using the changeset viewer.