Changeset 62774 in webkit


Ignore:
Timestamp:
Jul 8, 2010 2:37:32 AM (14 years ago)
Author:
apavlov@chromium.org
Message:

2010-07-07 Alexander Pavlov <apavlov@chromium.org>

Reviewed by Darin Fisher.

[Chromium] Crash when re-entering message loop

Allow re-entrancy of the message loop by tracking all suspended pages
through a PageGroupLoadDeferrer stack.
https://bugs.webkit.org/show_bug.cgi?id=41697

WebCore:

  • page/PageGroupLoadDeferrer.cpp: (WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer):
  • page/PageGroupLoadDeferrer.h: (WebCore::PageGroupLoadDeferrer::nextDeferrer):

WebKit/chromium:

  • src/WebViewImpl.cpp: (WebKit::WebView::willEnterModalLoop): (WebKit::WebView::didExitModalLoop):
  • src/js/Tests.js: (.TestSuite.prototype.evaluateInConsole_): (.TestSuite.prototype.testCompletionOnPause): (.TestSuite.prototype.testMessageLoopReentrant.this):
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r62772 r62774  
     12010-07-07  Alexander Pavlov  <apavlov@chromium.org>
     2
     3        Reviewed by Darin Fisher.
     4
     5        [Chromium] Crash when re-entering message loop
     6        https://bugs.webkit.org/show_bug.cgi?id=41697
     7
     8        A Chromium-specific test case will be submitted into Chromium shortly.
     9
     10        * page/PageGroupLoadDeferrer.cpp:
     11        (WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer):
     12        * page/PageGroupLoadDeferrer.h:
     13        (WebCore::PageGroupLoadDeferrer::nextDeferrer):
     14
    1152010-07-07  Yury Semikhatsky  <yurys@chromium.org>
    216
  • trunk/WebCore/page/PageGroupLoadDeferrer.cpp

    r61126 r62774  
    3131using namespace std;
    3232
    33 PageGroupLoadDeferrer::PageGroupLoadDeferrer(Page* page, bool deferSelf)
     33PageGroupLoadDeferrer::PageGroupLoadDeferrer(Page* page, bool deferSelf, PageGroupLoadDeferrer* nextDeferrer)
     34    : m_nextDeferrer(nextDeferrer)
    3435{
    3536    const HashSet<Page*>& pages = page->group().pages();
  • trunk/WebCore/page/PageGroupLoadDeferrer.h

    r45891 r62774  
    3131    class PageGroupLoadDeferrer : public Noncopyable {
    3232    public:
    33         PageGroupLoadDeferrer(Page*, bool deferSelf);
     33        PageGroupLoadDeferrer(Page*, bool deferSelf, PageGroupLoadDeferrer* nextDeferrer = 0);
    3434        ~PageGroupLoadDeferrer();
     35        PageGroupLoadDeferrer* nextDeferrer() { return m_nextDeferrer; }
    3536
    3637    private:
    3738        Vector<RefPtr<Frame>, 16> m_deferredFrames;
     39        PageGroupLoadDeferrer* m_nextDeferrer;
    3840    };
    3941}
  • trunk/WebKit/chromium/ChangeLog

    r62770 r62774  
     12010-07-07  Alexander Pavlov  <apavlov@chromium.org>
     2
     3        Reviewed by Darin Fisher.
     4
     5        [Chromium] Crash when re-entering message loop
     6
     7        Allow re-entrancy of the message loop by tracking all suspended pages
     8        through a PageGroupLoadDeferrer stack.
     9        https://bugs.webkit.org/show_bug.cgi?id=41697
     10
     11        * src/WebViewImpl.cpp:
     12        (WebKit::WebView::willEnterModalLoop):
     13        (WebKit::WebView::didExitModalLoop):
     14        * src/js/Tests.js:
     15        (.TestSuite.prototype.evaluateInConsole_):
     16        (.TestSuite.prototype.testCompletionOnPause):
     17        (.TestSuite.prototype.testMessageLoopReentrant.this):
     18
    1192010-07-08  David Holloway  <dhollowa@chromium.org>
    220
  • trunk/WebKit/chromium/src/WebViewImpl.cpp

    r62743 r62774  
    186186void WebView::willEnterModalLoop()
    187187{
    188     // It is not valid to nest more than once.
    189     ASSERT(!pageGroupLoadDeferrer);
    190 
    191188    PageGroup* pageGroup = PageGroup::pageGroup(pageGroupName);
    192189    ASSERT(pageGroup);
     
    196193
    197194    // Pick any page in the page group since we are deferring all pages.
    198     pageGroupLoadDeferrer = new PageGroupLoadDeferrer(*pageGroup->pages().begin(), true);
     195    pageGroupLoadDeferrer = new PageGroupLoadDeferrer(*pageGroup->pages().begin(), true, pageGroupLoadDeferrer);
    199196}
    200197
    201198void WebView::didExitModalLoop()
    202199{
     200    ASSERT(pageGroupLoadDeferrer);
     201    PageGroupLoadDeferrer* nextDeferrer = pageGroupLoadDeferrer->nextDeferrer();
     202
    203203    delete pageGroupLoadDeferrer;
    204     pageGroupLoadDeferrer = 0;
     204    pageGroupLoadDeferrer = nextDeferrer;
    205205}
    206206
  • trunk/WebKit/chromium/src/js/Tests.js

    r62000 r62774  
    853853TestSuite.prototype.evaluateInConsole_ = function(code, callback)
    854854{
    855     WebInspector.console.visible = true;
     855    WebInspector.showConsole();
    856856    WebInspector.console.prompt.text = code;
    857857    WebInspector.console.promptElement.dispatchEvent( TestSuite.createKeyEvent("Enter"));
     
    953953
    954954    function showConsole() {
    955         test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion);
    956         WebInspector.showConsole();
     955        if (WebInspector.currentFocusElement === WebInspector.console.promptElement)
     956            testLocalsCompletion();
     957        else {
     958            test.addSniffer(WebInspector.console, "afterShow", testLocalsCompletion);
     959            WebInspector.showConsole();
     960        }
    957961    }
    958962
     
    17761780TestSuite.prototype.testConsoleLog = function()
    17771781{
    1778     WebInspector.console.visible = true;
     1782    WebInspector.showConsole();
    17791783    var messages = WebInspector.console.messages;
    17801784    var index = 0;
     
    18181822TestSuite.prototype.testEvalGlobal = function()
    18191823{
    1820     WebInspector.console.visible = true;
     1824    WebInspector.showConsole();
    18211825
    18221826    var inputs = ["foo", "foobar"];
     
    18511855
    18521856/**
     1857 * Tests the message loop re-entrancy.
     1858 */
     1859TestSuite.prototype.testMessageLoopReentrant = function()
     1860{
     1861    var test = this;
     1862    this.showPanel("scripts");
     1863
     1864    var breakpointLine = 16;
     1865
     1866    WebInspector.showConsole();
     1867
     1868    this._waitUntilScriptsAreParsed(["debugger_test_page.html"],
     1869        function() {
     1870          test.showMainPageScriptSource_(
     1871              "debugger_test_page.html",
     1872              function(view, url) {
     1873                view._addBreakpoint(breakpointLine);
     1874
     1875                test.evaluateInConsole_(
     1876                    'setTimeout("calculate()", 0)',
     1877                    function(resultText) {
     1878                      test.assertTrue(!isNaN(resultText), "Failed to get timer id: " + resultText);
     1879                    });
     1880
     1881              });
     1882        });
     1883
     1884    // Wait until script is paused.
     1885    this.addSniffer(
     1886        WebInspector,
     1887        "pausedScript",
     1888        function(callFrames) {
     1889            test.evaluateInConsole_(
     1890                'document.cookie',
     1891                test.releaseControl.bind(test)); // This callback will be invoked only if the test succeeds (i.e. no crash).
     1892        });
     1893
     1894    this.takeControl();
     1895};
     1896
     1897
     1898/**
    18531899 * Tests that Storage panel can be open and that local DOM storage is added
    18541900 * to the panel.
Note: See TracChangeset for help on using the changeset viewer.