ASSERTION FAILED: hasParserBlockingScript() seen with js/dom/modules/module-will...
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Dec 2016 06:22:13 +0000 (06:22 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 Dec 2016 06:22:13 +0000 (06:22 +0000)
https://bugs.webkit.org/show_bug.cgi?id=164883

Reviewed by Ryosuke Niwa.

Source/WebCore:

This is *attempt to fix* patch since I cannot reproduce the crash reported in this issue.
One possible scenario of this crash is the following.

1. There is pending deferred scripts, that is not fetched yet.
2. Then, we start watching on the script. And stop document parser.
3. The document parser is stopped/detached by calling finishJSTest in beforeload.
4. At this critical timing, (2)'s script is fetched, and notifyFinished is called since it is watched.

In this patch, we ignore the script execution if the document parser is stopped / detached.
Previously, it goes into the wrong path. And it causes assertion failure.

* html/parser/HTMLDocumentParser.cpp:
(WebCore::HTMLDocumentParser::notifyFinished):

LayoutTests:

* platform/mac-wk2/TestExpectations:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@209791 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/platform/mac-wk2/TestExpectations
Source/WebCore/ChangeLog
Source/WebCore/html/parser/HTMLDocumentParser.cpp

index bbbbb70..a2ed6dc 100644 (file)
@@ -1,3 +1,12 @@
+2016-12-13  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        ASSERTION FAILED: hasParserBlockingScript() seen with js/dom/modules/module-will-fire-beforeload.html
+        https://bugs.webkit.org/show_bug.cgi?id=164883
+
+        Reviewed by Ryosuke Niwa.
+
+        * platform/mac-wk2/TestExpectations:
+
 2016-12-13  Daniel Bates  <dabates@apple.com>
 
         CSP: ws: and wss: blocked with connect-src *
index ca811d7..4ad6389 100644 (file)
@@ -604,8 +604,6 @@ webkit.org/b/163702 platform/mac-wk2/plugins/muted-state.html [ Failure ]
 
 webkit.org/b/164870 [ Debug ] imported/w3c/web-platform-tests/IndexedDB/idbcursor_iterating.htm [ Pass Failure ]
 
-webkit.org/b/164884 [ Debug ] js/dom/modules/module-will-fire-beforeload.html [ Skip ]
-
 webkit.org/b/165352 fast/dom/Window/window-resize-contents.html [ Pass Timeout ]
 
 webkit.org/b/165392 [ ElCapitan Release ] imported/mathml-in-html5/mathml/presentation-markup/fractions/frac-parameters-1.html [ Pass Failure ]
index bb88526..0a17f2b 100644 (file)
@@ -1,3 +1,24 @@
+2016-12-13  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        ASSERTION FAILED: hasParserBlockingScript() seen with js/dom/modules/module-will-fire-beforeload.html
+        https://bugs.webkit.org/show_bug.cgi?id=164883
+
+        Reviewed by Ryosuke Niwa.
+
+        This is *attempt to fix* patch since I cannot reproduce the crash reported in this issue.
+        One possible scenario of this crash is the following.
+
+        1. There is pending deferred scripts, that is not fetched yet.
+        2. Then, we start watching on the script. And stop document parser.
+        3. The document parser is stopped/detached by calling finishJSTest in beforeload.
+        4. At this critical timing, (2)'s script is fetched, and notifyFinished is called since it is watched.
+
+        In this patch, we ignore the script execution if the document parser is stopped / detached.
+        Previously, it goes into the wrong path. And it causes assertion failure.
+
+        * html/parser/HTMLDocumentParser.cpp:
+        (WebCore::HTMLDocumentParser::notifyFinished):
+
 2016-12-13  Keith Rollin  <krollin@apple.com>
 
         Memory warning logging appears to capture resident footprint, missing compress/swap.
index 06a41e9..acea0aa 100644 (file)
@@ -521,6 +521,10 @@ void HTMLDocumentParser::notifyFinished(PendingScript& pendingScript)
     // but we need to ensure it isn't deleted yet.
     Ref<HTMLDocumentParser> protectedThis(*this);
 
+    // After Document parser is stopped or detached, the parser-inserted deferred script execution should be ignored.
+    if (isStopped())
+        return;
+
     ASSERT(m_scriptRunner);
     ASSERT(!isExecutingScript());
     if (isStopping()) {