[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