[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

tonyg at chromium.org tonyg at chromium.org
Wed Dec 22 11:42:54 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit a7e0f73283ee2424e7b2f93d1322251f59320a50
Author: tonyg at chromium.org <tonyg at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Aug 4 20:39:24 2010 +0000

    2010-08-04  Tony Gentilcore  <tonyg at chromium.org>
    
            Reviewed by Eric Seidel.
    
            LayoutTests for <script defer> as specified by HTML5
            https://bugs.webkit.org/show_bug.cgi?id=40934
    
            * fast/dom/HTMLScriptElement/defer-double-defer-write-expected.txt: Added.
            * fast/dom/HTMLScriptElement/defer-double-defer-write.html: Added. Tests for tricky ordering and reentrancy by doing a double write of defered scripts.
            * fast/dom/HTMLScriptElement/defer-double-write-expected.txt: Copied from LayoutTests/fast/tokenizer/write-before-load-expected.txt.
            * fast/dom/HTMLScriptElement/defer-double-write.html: Added. Tests for tricky ordering and reentrancy by doing a double write of inline scripts.
            * fast/dom/HTMLScriptElement/defer-inline-script-expected.txt: Added.
            * fast/dom/HTMLScriptElement/defer-inline-script.html: Added. Tests that the defer attribute is ignored on inline script blocks.
            * fast/dom/HTMLScriptElement/defer-onbeforeload-expected.txt: Added.
            * fast/dom/HTMLScriptElement/defer-onbeforeload.html: Added. Tests that onbeforeload fires immediately when a deferred script is encounted. Also tests that it can be cancelled.
            * fast/dom/HTMLScriptElement/defer-script-invalid-url-expected.txt: Added.
            * fast/dom/HTMLScriptElement/defer-script-invalid-url.html: Added. Tests that invalid URLs are ignored and subsequent scripts are still executed.
            * fast/dom/HTMLScriptElement/resources/defer.js: Added.
            * fast/dom/HTMLScriptElement/resources/external.js: Added.
            * fast/dom/HTMLScriptElement/resources/shouldnotexecute.js: Added.
            * http/tests/misc/resources/defer-script.js: Added.
            * http/tests/misc/resources/external-script.js: Added.
            * http/tests/misc/resources/script-debug-body-background.js: Added.
            * http/tests/misc/resources/script-write-slow-stylesheet.js: Added.
            * http/tests/misc/resources/slow-defer-script.cgi: Added.
            * http/tests/misc/resources/slow-stylesheet.cgi: Added.
            * http/tests/misc/script-defer-after-slow-stylesheet-expected.txt: Added.
            * http/tests/misc/script-defer-after-slow-stylesheet.html: Added. Tests stylesheet blocking behavior.
            * http/tests/misc/script-defer-expected.txt: Added.
            * http/tests/misc/script-defer-write-slow-stylesheet-expected.txt: Added.
            * http/tests/misc/script-defer-write-slow-stylesheet.html: Added. Tests stylesheet blocking behavior with a slow stylesheet.
            * http/tests/misc/script-defer.html: Added. Tests basic functionality and ordering.
    2010-08-04  Tony Gentilcore  <tonyg at chromium.org>
    
            Reviewed by Eric Seidel.
    
            Support <script defer> as specified by HTML5
            https://bugs.webkit.org/show_bug.cgi?id=40934
    
            See: http://dev.w3.org/html5/spec/Overview.html#the-end
    
            Tests: fast/dom/HTMLScriptElement/defer-double-defer-write.html
                   fast/dom/HTMLScriptElement/defer-double-write.html
                   fast/dom/HTMLScriptElement/defer-inline-script.html
                   fast/dom/HTMLScriptElement/defer-onbeforeload.html
                   fast/dom/HTMLScriptElement/defer-script-invalid-url.html
                   http/tests/misc/script-defer-after-slow-stylesheet.html
                   http/tests/misc/script-defer-write-slow-stylesheet.html
                   http/tests/misc/script-defer.html
    
            * html/HTMLDocumentParser.cpp:
            (WebCore::HTMLDocumentParser::attemptToEnd):
            (WebCore::HTMLDocumentParser::endIfDelayed):
            (WebCore::HTMLDocumentParser::executeScriptsWaitingForParsingAndEnd):
            * html/HTMLDocumentParser.h:
            * html/HTMLScriptRunner.cpp:
            (WebCore::HTMLScriptRunner::executeScriptsWaitingForParsing):
            (WebCore::HTMLScriptRunner::requestScript):
            (WebCore::HTMLScriptRunner::requestParsingBlockingScript):
            (WebCore::HTMLScriptRunner::requestDeferredScript):
            (WebCore::HTMLScriptRunner::runScript):
            * html/HTMLScriptRunner.h:
            (WebCore::HTMLScriptRunner::PendingScript::PendingScript):
            (WebCore::HTMLScriptRunner::PendingScript::operator=):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64674 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 2c993a4..c8abdc2 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,36 @@
+2010-08-04  Tony Gentilcore  <tonyg at chromium.org>
+
+        Reviewed by Eric Seidel.
+
+        LayoutTests for <script defer> as specified by HTML5
+        https://bugs.webkit.org/show_bug.cgi?id=40934
+
+        * fast/dom/HTMLScriptElement/defer-double-defer-write-expected.txt: Added.
+        * fast/dom/HTMLScriptElement/defer-double-defer-write.html: Added. Tests for tricky ordering and reentrancy by doing a double write of defered scripts.
+        * fast/dom/HTMLScriptElement/defer-double-write-expected.txt: Copied from LayoutTests/fast/tokenizer/write-before-load-expected.txt.
+        * fast/dom/HTMLScriptElement/defer-double-write.html: Added. Tests for tricky ordering and reentrancy by doing a double write of inline scripts.
+        * fast/dom/HTMLScriptElement/defer-inline-script-expected.txt: Added.
+        * fast/dom/HTMLScriptElement/defer-inline-script.html: Added. Tests that the defer attribute is ignored on inline script blocks.
+        * fast/dom/HTMLScriptElement/defer-onbeforeload-expected.txt: Added.
+        * fast/dom/HTMLScriptElement/defer-onbeforeload.html: Added. Tests that onbeforeload fires immediately when a deferred script is encounted. Also tests that it can be cancelled.
+        * fast/dom/HTMLScriptElement/defer-script-invalid-url-expected.txt: Added.
+        * fast/dom/HTMLScriptElement/defer-script-invalid-url.html: Added. Tests that invalid URLs are ignored and subsequent scripts are still executed.
+        * fast/dom/HTMLScriptElement/resources/defer.js: Added.
+        * fast/dom/HTMLScriptElement/resources/external.js: Added.
+        * fast/dom/HTMLScriptElement/resources/shouldnotexecute.js: Added.
+        * http/tests/misc/resources/defer-script.js: Added.
+        * http/tests/misc/resources/external-script.js: Added.
+        * http/tests/misc/resources/script-debug-body-background.js: Added.
+        * http/tests/misc/resources/script-write-slow-stylesheet.js: Added.
+        * http/tests/misc/resources/slow-defer-script.cgi: Added.
+        * http/tests/misc/resources/slow-stylesheet.cgi: Added.
+        * http/tests/misc/script-defer-after-slow-stylesheet-expected.txt: Added.
+        * http/tests/misc/script-defer-after-slow-stylesheet.html: Added. Tests stylesheet blocking behavior.
+        * http/tests/misc/script-defer-expected.txt: Added.
+        * http/tests/misc/script-defer-write-slow-stylesheet-expected.txt: Added.
+        * http/tests/misc/script-defer-write-slow-stylesheet.html: Added. Tests stylesheet blocking behavior with a slow stylesheet.
+        * http/tests/misc/script-defer.html: Added. Tests basic functionality and ordering.
+
 2010-08-04  François Sausset  <sausset at gmail.com>
 
         Reviewed by Kenneth Rohde Christiansen.
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-double-defer-write-expected.txt b/LayoutTests/fast/dom/HTMLScriptElement/defer-double-defer-write-expected.txt
new file mode 100755
index 0000000..1513b28
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-double-defer-write-expected.txt
@@ -0,0 +1 @@
+1 2 3 4 56 78
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-double-defer-write.html b/LayoutTests/fast/dom/HTMLScriptElement/defer-double-defer-write.html
new file mode 100644
index 0000000..4074e01
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-double-defer-write.html
@@ -0,0 +1,18 @@
+1
+<script>
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function doubleWrite(number)
+{
+    document.write("<script src='data:text/javascript,document.write(" + number + ")' defer></scr" +
+                   "ipt> <script src='data:text/javascript,document.write(" + (number + 1) + ")' defer></scr" + "ipt> ")
+}
+</script>
+2
+<script
+    onbeforeload="document.write(3);doubleWrite(5)"
+    src="data:text/javascript,doubleWrite(7)"
+    defer>
+</script>
+4
diff --git a/LayoutTests/fast/tokenizer/write-before-load-expected.txt b/LayoutTests/fast/dom/HTMLScriptElement/defer-double-write-expected.txt
old mode 100644
new mode 100755
similarity index 100%
copy from LayoutTests/fast/tokenizer/write-before-load-expected.txt
copy to LayoutTests/fast/dom/HTMLScriptElement/defer-double-write-expected.txt
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-double-write.html b/LayoutTests/fast/dom/HTMLScriptElement/defer-double-write.html
new file mode 100644
index 0000000..c858993
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-double-write.html
@@ -0,0 +1,18 @@
+1
+<script>
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+function doubleWrite(number)
+{
+    document.write("<script>document.write(" + number + ")</scr" +
+                   "ipt> <script>document.write(" + (number + 1) + ")</scr" + "ipt> ")
+}
+</script>
+2
+<script
+    onbeforeload="doubleWrite(3)"
+    src="data:text/javascript,doubleWrite(6)"
+    defer>
+</script>
+5
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script-expected.txt b/LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script-expected.txt
new file mode 100755
index 0000000..8d04f96
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script-expected.txt
@@ -0,0 +1 @@
+1 2
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script.html b/LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script.html
new file mode 100644
index 0000000..aa31aa2
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script.html
@@ -0,0 +1,8 @@
+<script>
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+</script>
+<script src="data:text/javascript,document.write('2')" defer></script>
+<script defer>
+  document.write('1');
+</script>
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload-expected.txt b/LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload-expected.txt
new file mode 100755
index 0000000..2eb56c9
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload-expected.txt
@@ -0,0 +1,7 @@
+Checks that deferred scripts fire onbeforeload immediately and that it is cancellable.
+cancelled onbeforeload defer
+onbeforeload defer
+onbeforeload external
+external
+defer
+
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload.html b/LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload.html
new file mode 100644
index 0000000..422616c
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload.html
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+Checks that deferred scripts fire onbeforeload immediately and that it is cancellable.
+<div id="console"></div>
+<script src="resources/shouldnotexecute.js" onbeforeload="debug('cancelled onbeforeload defer');return false;" defer></script>
+<script src="resources/defer.js" onbeforeload="debug('onbeforeload defer');return true;" defer></script>
+<script src="resources/external.js" onbeforeload="debug('onbeforeload external');return true;"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url-expected.txt b/LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url-expected.txt
new file mode 100644
index 0000000..830cc67
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url-expected.txt
@@ -0,0 +1,3 @@
+Checks that deferred scripts with invalid URLs are ignored and subsequent deferred scripts are executed.
+defer
+
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url.html b/LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url.html
new file mode 100644
index 0000000..aaf26fd
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+Checks that deferred scripts with invalid URLs are ignored and subsequent deferred scripts are executed.
+<div id="console"></div>
+<script src="http://localhost:999999/" defer></script>
+<script src="resources/defer.js" defer></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/resources/defer.js b/LayoutTests/fast/dom/HTMLScriptElement/resources/defer.js
new file mode 100644
index 0000000..fc67db4
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/resources/defer.js
@@ -0,0 +1 @@
+debug("defer");
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/resources/external.js b/LayoutTests/fast/dom/HTMLScriptElement/resources/external.js
new file mode 100644
index 0000000..fbad465
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/resources/external.js
@@ -0,0 +1 @@
+debug("external");
diff --git a/LayoutTests/fast/dom/HTMLScriptElement/resources/shouldnotexecute.js b/LayoutTests/fast/dom/HTMLScriptElement/resources/shouldnotexecute.js
new file mode 100644
index 0000000..c0d6954
--- /dev/null
+++ b/LayoutTests/fast/dom/HTMLScriptElement/resources/shouldnotexecute.js
@@ -0,0 +1 @@
+debug("FAIL");
diff --git a/LayoutTests/http/tests/misc/resources/defer-script.js b/LayoutTests/http/tests/misc/resources/defer-script.js
new file mode 100644
index 0000000..fc67db4
--- /dev/null
+++ b/LayoutTests/http/tests/misc/resources/defer-script.js
@@ -0,0 +1 @@
+debug("defer");
diff --git a/LayoutTests/http/tests/misc/resources/external-script.js b/LayoutTests/http/tests/misc/resources/external-script.js
new file mode 100644
index 0000000..fbad465
--- /dev/null
+++ b/LayoutTests/http/tests/misc/resources/external-script.js
@@ -0,0 +1 @@
+debug("external");
diff --git a/LayoutTests/http/tests/misc/resources/script-debug-body-background.js b/LayoutTests/http/tests/misc/resources/script-debug-body-background.js
new file mode 100644
index 0000000..6fbe7a1
--- /dev/null
+++ b/LayoutTests/http/tests/misc/resources/script-debug-body-background.js
@@ -0,0 +1 @@
+shouldBeEqualToString("getComputedStyle(document.body)['background-color']", "rgb(255, 0, 0)");
diff --git a/LayoutTests/http/tests/misc/resources/script-write-slow-stylesheet.js b/LayoutTests/http/tests/misc/resources/script-write-slow-stylesheet.js
new file mode 100644
index 0000000..ed11eb5
--- /dev/null
+++ b/LayoutTests/http/tests/misc/resources/script-write-slow-stylesheet.js
@@ -0,0 +1 @@
+document.write('<link rel="stylesheet" href="http://127.0.0.1:8000/misc/resources/slow-stylesheet.cgi">');
diff --git a/LayoutTests/http/tests/misc/resources/slow-defer-script.cgi b/LayoutTests/http/tests/misc/resources/slow-defer-script.cgi
new file mode 100755
index 0000000..a98d3d5
--- /dev/null
+++ b/LayoutTests/http/tests/misc/resources/slow-defer-script.cgi
@@ -0,0 +1,5 @@
+#!/usr/bin/perl -w
+
+print "Content-type: text/javascript\n\n";
+sleep(0.5);
+print "debug('slowDefer');\n";
diff --git a/LayoutTests/http/tests/misc/resources/slow-stylesheet.cgi b/LayoutTests/http/tests/misc/resources/slow-stylesheet.cgi
new file mode 100755
index 0000000..fcddca4
--- /dev/null
+++ b/LayoutTests/http/tests/misc/resources/slow-stylesheet.cgi
@@ -0,0 +1,5 @@
+#!/usr/bin/perl -w
+
+print "Content-type: text/css\n\n";
+sleep(0.5);
+print "body { background-color: #FF0000 }\n";
diff --git a/LayoutTests/http/tests/misc/script-defer-after-slow-stylesheet-expected.txt b/LayoutTests/http/tests/misc/script-defer-after-slow-stylesheet-expected.txt
new file mode 100755
index 0000000..5245763
--- /dev/null
+++ b/LayoutTests/http/tests/misc/script-defer-after-slow-stylesheet-expected.txt
@@ -0,0 +1,10 @@
+This tests that an inline slow stylesheet executes before deferred scripts.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS getComputedStyle(document.body)['background-color'] is "rgb(255, 0, 0)"
+DOMContentLoaded
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/http/tests/misc/script-defer-after-slow-stylesheet.html b/LayoutTests/http/tests/misc/script-defer-after-slow-stylesheet.html
new file mode 100644
index 0000000..e056121
--- /dev/null
+++ b/LayoutTests/http/tests/misc/script-defer-after-slow-stylesheet.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" href="../../js-test-resources/js-test-style.css">
+<script src="../../js-test-resources/js-test-pre.js"></script>
+</head>
+<body>
+<dvi id="description"></div>
+<div id="console"></div>
+<script type="text/javascript">
+description('This tests that an inline slow stylesheet executes before deferred scripts.');
+
+var jsTestIsAsync = true;
+
+document.addEventListener("DOMContentLoaded", function() {
+  debug('DOMContentLoaded');
+
+  finishJSTest();
+}, false);
+</script>
+
+<script src="http://127.0.0.1:8000/misc/resources/script-debug-body-background.js" defer="defer"></script>
+<link rel="stylesheet" href="http://127.0.0.1:8000/misc/resources/slow-stylesheet.cgi">
+<script>
+var successfullyParsed = true;
+</script>
+<script src="../../js-test-resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/http/tests/misc/script-defer-expected.txt b/LayoutTests/http/tests/misc/script-defer-expected.txt
new file mode 100755
index 0000000..bfcaa6e
--- /dev/null
+++ b/LayoutTests/http/tests/misc/script-defer-expected.txt
@@ -0,0 +1,8 @@
+This tests for proper execution order of scripts with the defer attribute https://bugs.webkit.org/show_bug.cgi?id=20710.
+external
+inline
+slowDefer
+defer
+DOMContentLoaded
+load
+
diff --git a/LayoutTests/http/tests/misc/script-defer-write-slow-stylesheet-expected.txt b/LayoutTests/http/tests/misc/script-defer-write-slow-stylesheet-expected.txt
new file mode 100755
index 0000000..f20497d
--- /dev/null
+++ b/LayoutTests/http/tests/misc/script-defer-write-slow-stylesheet-expected.txt
@@ -0,0 +1,10 @@
+This tests that a slow stylesheet written by a deferred script delays DOMContentLoaded.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS getComputedStyle(document.body)['background-color'] is "rgb(255, 0, 0)"
+DOMContentLoaded
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/http/tests/misc/script-defer-write-slow-stylesheet.html b/LayoutTests/http/tests/misc/script-defer-write-slow-stylesheet.html
new file mode 100644
index 0000000..23889d3
--- /dev/null
+++ b/LayoutTests/http/tests/misc/script-defer-write-slow-stylesheet.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" href="../../js-test-resources/js-test-style.css">
+<script src="../../js-test-resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script type="text/javascript">
+var jsTestIsAsync = true;
+
+description('This tests that a slow stylesheet written by a deferred script delays DOMContentLoaded.');
+
+document.addEventListener("DOMContentLoaded", function() {
+  debug('DOMContentLoaded');
+
+  finishJSTest();
+}, false);
+</script>
+<script src="http://127.0.0.1:8000/misc/resources/script-write-slow-stylesheet.js" defer="defer"></script>
+<script src="http://127.0.0.1:8000/misc/resources/script-debug-body-background.js" defer="defer"></script>
+<script>
+var successfullyParsed = true;
+</script>
+<script src="../../js-test-resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/http/tests/misc/script-defer.html b/LayoutTests/http/tests/misc/script-defer.html
new file mode 100644
index 0000000..95cf8b3
--- /dev/null
+++ b/LayoutTests/http/tests/misc/script-defer.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" href="../../js-test-resources/js-test-style.css">
+<script src="../../js-test-resources/js-test-pre.js"></script>
+</head>
+<body onload="debug('load')">
+This tests for proper execution order of scripts with the defer attribute <a href="https://bugs.webkit.org/show_bug.cgi?id=20710">https://bugs.webkit.org/show_bug.cgi?id=20710</a>.
+<div id="console"></div>
+
+<script type="text/javascript">
+document.addEventListener("DOMContentLoaded", function() {
+  debug('DOMContentLoaded');
+}, false);
+</script>
+<script src="http://127.0.0.1:8000/misc/resources/slow-defer-script.cgi" defer="DEFER"></script>
+<script src="http://127.0.0.1:8000/misc/resources/defer-script.js" defer="DEFER"></script>
+<script src="http://127.0.0.1:8000/misc/resources/external-script.js"></script>
+<script>
+debug("inline");
+</script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 10338af..e922d24 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,36 @@
+2010-08-04  Tony Gentilcore  <tonyg at chromium.org>
+
+        Reviewed by Eric Seidel.
+
+        Support <script defer> as specified by HTML5
+        https://bugs.webkit.org/show_bug.cgi?id=40934
+
+        See: http://dev.w3.org/html5/spec/Overview.html#the-end
+
+        Tests: fast/dom/HTMLScriptElement/defer-double-defer-write.html
+               fast/dom/HTMLScriptElement/defer-double-write.html
+               fast/dom/HTMLScriptElement/defer-inline-script.html
+               fast/dom/HTMLScriptElement/defer-onbeforeload.html
+               fast/dom/HTMLScriptElement/defer-script-invalid-url.html
+               http/tests/misc/script-defer-after-slow-stylesheet.html
+               http/tests/misc/script-defer-write-slow-stylesheet.html
+               http/tests/misc/script-defer.html
+
+        * html/HTMLDocumentParser.cpp:
+        (WebCore::HTMLDocumentParser::attemptToEnd):
+        (WebCore::HTMLDocumentParser::endIfDelayed):
+        (WebCore::HTMLDocumentParser::executeScriptsWaitingForParsingAndEnd):
+        * html/HTMLDocumentParser.h:
+        * html/HTMLScriptRunner.cpp:
+        (WebCore::HTMLScriptRunner::executeScriptsWaitingForParsing):
+        (WebCore::HTMLScriptRunner::requestScript):
+        (WebCore::HTMLScriptRunner::requestParsingBlockingScript):
+        (WebCore::HTMLScriptRunner::requestDeferredScript):
+        (WebCore::HTMLScriptRunner::runScript):
+        * html/HTMLScriptRunner.h:
+        (WebCore::HTMLScriptRunner::PendingScript::PendingScript):
+        (WebCore::HTMLScriptRunner::PendingScript::operator=):
+
 2010-08-04  Kevin Ollivier  <kevino at theolliviers.com>
 
         [wx] Build fix for gcc not importing all symbols from convenience libraries.
diff --git a/WebCore/html/HTMLDocumentParser.cpp b/WebCore/html/HTMLDocumentParser.cpp
index 354e7ed..4bb5e4c 100644
--- a/WebCore/html/HTMLDocumentParser.cpp
+++ b/WebCore/html/HTMLDocumentParser.cpp
@@ -281,7 +281,7 @@ void HTMLDocumentParser::attemptToEnd()
         m_endWasDelayed = true;
         return;
     }
-    end();
+    executeScriptsWaitingForParsingAndEnd();
 }
 
 void HTMLDocumentParser::endIfDelayed()
@@ -290,6 +290,19 @@ void HTMLDocumentParser::endIfDelayed()
         return;
 
     m_endWasDelayed = false;
+    executeScriptsWaitingForParsingAndEnd();
+}
+
+void HTMLDocumentParser::executeScriptsWaitingForParsingAndEnd()
+{
+    if (m_scriptRunner) {
+        bool continueParsing = m_scriptRunner->executeScriptsWaitingForParsing();
+        if (!continueParsing) {
+            m_treeBuilder->setPaused(true);
+            m_endWasDelayed = true;
+            return;
+        }
+    }
     end();
 }
 
diff --git a/WebCore/html/HTMLDocumentParser.h b/WebCore/html/HTMLDocumentParser.h
index cc46d31..df64915 100644
--- a/WebCore/html/HTMLDocumentParser.h
+++ b/WebCore/html/HTMLDocumentParser.h
@@ -105,6 +105,7 @@ private:
     void begin();
     void attemptToEnd();
     void endIfDelayed();
+    void executeScriptsWaitingForParsingAndEnd();
     void end();
 
     bool isScheduledForResume() const;
diff --git a/WebCore/html/HTMLScriptRunner.cpp b/WebCore/html/HTMLScriptRunner.cpp
index f4b7013..0d1845f 100644
--- a/WebCore/html/HTMLScriptRunner.cpp
+++ b/WebCore/html/HTMLScriptRunner.cpp
@@ -228,25 +228,50 @@ bool HTMLScriptRunner::executeScriptsWaitingForStylesheets()
     return executeParsingBlockingScripts();
 }
 
-void HTMLScriptRunner::requestScript(Element* script)
+bool HTMLScriptRunner::executeScriptsWaitingForParsing()
 {
-    ASSERT(!m_parsingBlockingScript.element);
-    AtomicString srcValue = script->getAttribute(srcAttr);
-    // Allow the host to disllow script loads (using the XSSAuditor, etc.)
+    while (!m_scriptsToExecuteAfterParsing.isEmpty()) {
+        ASSERT(!haveParsingBlockingScript());
+        m_parsingBlockingScript = m_scriptsToExecuteAfterParsing.takeFirst();
+        ASSERT(m_parsingBlockingScript.cachedScript());
+        if (!m_parsingBlockingScript.cachedScript()->isLoaded()) {
+            watchForLoad(m_parsingBlockingScript);
+            return false;
+        }
+        if (!executeParsingBlockingScripts())
+            return false;
+    }
+
+    return m_scriptsToExecuteAfterParsing.isEmpty();
+}
+
+bool HTMLScriptRunner::requestScript(PendingScript& pendingScript, Element* scriptElement)
+{
+    ASSERT(!pendingScript.element);
+    const AtomicString& srcValue = scriptElement->getAttribute(srcAttr);
     if (!m_host->shouldLoadExternalScriptFromSrc(srcValue))
-        return;
+        return false;
     // FIXME: We need to resolve the url relative to the element.
-    if (!script->dispatchBeforeLoadEvent(srcValue))
-        return;
-    m_parsingBlockingScript.element = script;
+    if (!scriptElement->dispatchBeforeLoadEvent(srcValue))
+        return false;
+    pendingScript.element = scriptElement;
     // This should correctly return 0 for empty or invalid srcValues.
-    CachedScript* cachedScript = m_document->docLoader()->requestScript(srcValue, toScriptElement(script)->scriptCharset());
+    CachedScript* cachedScript = m_document->docLoader()->requestScript(srcValue, toScriptElement(scriptElement)->scriptCharset());
     if (!cachedScript) {
         notImplemented(); // Dispatch error event.
-        return;
+        return false;
     }
 
-    m_parsingBlockingScript.setCachedScript(cachedScript);
+    pendingScript.setCachedScript(cachedScript);
+    return true;
+}
+
+void HTMLScriptRunner::requestParsingBlockingScript(Element* scriptElement)
+{
+    if (!requestScript(m_parsingBlockingScript, scriptElement))
+        return;
+
+    ASSERT(m_parsingBlockingScript.cachedScript());
 
     // We only care about a load callback if cachedScript is not already
     // in the cache.  Callers will attempt to run the m_parsingBlockingScript
@@ -255,6 +280,16 @@ void HTMLScriptRunner::requestScript(Element* script)
         watchForLoad(m_parsingBlockingScript);
 }
 
+void HTMLScriptRunner::requestDeferredScript(Element* scriptElement)
+{
+    PendingScript pendingScript;
+    if (!requestScript(pendingScript, scriptElement))
+        return;
+
+    ASSERT(pendingScript.cachedScript());
+    m_scriptsToExecuteAfterParsing.append(pendingScript);
+}
+
 // This method is meant to match the HTML5 definition of "running a script"
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#running-a-script
 void HTMLScriptRunner::runScript(Element* script, int startingLineNumber)
@@ -267,8 +302,11 @@ void HTMLScriptRunner::runScript(Element* script, int startingLineNumber)
         notImplemented(); // event for support
 
         if (script->hasAttribute(srcAttr)) {
-            // FIXME: Handle defer and async
-            requestScript(script);
+            // FIXME: Handle async
+            if (script->hasAttribute(deferAttr))
+                requestDeferredScript(script);
+            else
+                requestParsingBlockingScript(script);
         } else {
             // FIXME: We do not block inline <script> tags on stylesheets to match the
             // old parser for now.  See https://bugs.webkit.org/show_bug.cgi?id=40047
diff --git a/WebCore/html/HTMLScriptRunner.h b/WebCore/html/HTMLScriptRunner.h
index cc69443..bbac7cf 100644
--- a/WebCore/html/HTMLScriptRunner.h
+++ b/WebCore/html/HTMLScriptRunner.h
@@ -28,6 +28,7 @@
 
 #include "CachedResourceClient.h"
 #include "CachedResourceHandle.h"
+#include <wtf/Deque.h>
 #include <wtf/Noncopyable.h>
 #include <wtf/PassRefPtr.h>
 
@@ -52,6 +53,7 @@ public:
     bool executeScriptsWaitingForLoad(CachedResource*);
     bool hasScriptsWaitingForStylesheets() const { return m_hasScriptsWaitingForStylesheets; }
     bool executeScriptsWaitingForStylesheets();
+    bool executeScriptsWaitingForParsing();
 
     bool isExecutingScript() { return !!m_scriptNestingLevel; }
 
@@ -63,7 +65,7 @@ private:
     // lifetime in order to guarantee that the data buffer will not be purged.
     //
     // FIXME: Finish turning this into a proper class.
-    class PendingScript : public CachedResourceClient, Noncopyable {
+    class PendingScript : public CachedResourceClient {
     public:
         PendingScript()
             : startingLineNumber(0)
@@ -71,6 +73,28 @@ private:
         {
         }
 
+        PendingScript(const PendingScript& other)
+            : CachedResourceClient(other)
+            , element(other.element)
+            , startingLineNumber(other.startingLineNumber)
+            , m_watchingForLoad(other.m_watchingForLoad)
+        {
+            setCachedScript(other.cachedScript());
+        }
+
+        PendingScript& operator=(const PendingScript& other)
+        {
+            if (this == &other)
+                return *this;
+
+            element = other.element;
+            startingLineNumber = other.startingLineNumber;
+            m_watchingForLoad = other.m_watchingForLoad;
+            setCachedScript(other.cachedScript());
+
+            return *this;
+        }
+
         ~PendingScript();
 
         PassRefPtr<Element> releaseElementAndClear();
@@ -101,7 +125,9 @@ private:
     bool executeParsingBlockingScripts();
     void executePendingScript();
 
-    void requestScript(Element*);
+    bool requestScript(PendingScript&, Element*);
+    void requestParsingBlockingScript(Element*);
+    void requestDeferredScript(Element*);
     void runScript(Element*, int startingLineNumber);
 
     // Helpers for dealing with HTMLScriptRunnerHost
@@ -115,6 +141,7 @@ private:
     Document* m_document;
     HTMLScriptRunnerHost* m_host;
     PendingScript m_parsingBlockingScript;
+    Deque<PendingScript> m_scriptsToExecuteAfterParsing;
     unsigned m_scriptNestingLevel;
 
     // We only want stylesheet loads to trigger script execution if script

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list