aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servohtmlparser.rs
diff options
context:
space:
mode:
authorTill Schneidereit <till@tillschneidereit.net>2015-10-12 16:03:42 +0200
committerTill Schneidereit <till@tillschneidereit.net>2015-10-26 21:35:09 +0100
commita0c5d47910556c1df9a6947b2049a94a562c571c (patch)
tree21ca1484b754bdc0720d9b6752828b5f2da93c6c /components/script/dom/servohtmlparser.rs
parent6b95c3957b32db1f7a25738229381e046e9be6e7 (diff)
downloadservo-a0c5d47910556c1df9a6947b2049a94a562c571c.tar.gz
servo-a0c5d47910556c1df9a6947b2049a94a562c571c.zip
Improve spec-compliance of script loading and execution during document startup
Including proper support for async and deferred scripts.
Diffstat (limited to 'components/script/dom/servohtmlparser.rs')
-rw-r--r--components/script/dom/servohtmlparser.rs34
1 files changed, 19 insertions, 15 deletions
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs
index 4999d600a20..3a4a59ba3af 100644
--- a/components/script/dom/servohtmlparser.rs
+++ b/components/script/dom/servohtmlparser.rs
@@ -159,7 +159,9 @@ impl AsyncResponseListener for ParserContext {
}
parser.r().last_chunk_received.set(true);
- parser.r().parse_sync();
+ if !parser.r().is_suspended() {
+ parser.r().parse_sync();
+ }
}
}
@@ -188,7 +190,9 @@ impl<'a> Parser for &'a ServoHTMLParser {
fn parse_chunk(self, input: String) {
self.document.set_current_parser(Some(self));
self.pending_input.borrow_mut().push(input);
- self.parse_sync();
+ if !self.is_suspended() {
+ self.parse_sync();
+ }
}
fn finish(self) {
@@ -282,21 +286,10 @@ impl ServoHTMLParser {
impl ServoHTMLParser {
fn parse_sync(&self) {
- let mut first = true;
-
// This parser will continue to parse while there is either pending input or
// the parser remains unsuspended.
loop {
- if self.suspended.get() {
- return;
- }
-
- if self.pending_input.borrow().is_empty() && !first {
- break;
- }
-
- self.document.reflow_if_reflow_timer_expired();
-
+ self.document.reflow_if_reflow_timer_expired();
let mut pending_input = self.pending_input.borrow_mut();
if !pending_input.is_empty() {
let chunk = pending_input.remove(0);
@@ -305,7 +298,14 @@ impl ServoHTMLParser {
self.tokenizer.borrow_mut().run();
}
- first = false;
+ // Document parsing is blocked on an external resource.
+ if self.suspended.get() {
+ return;
+ }
+
+ if pending_input.is_empty() {
+ break;
+ }
}
if self.last_chunk_received.get() {
@@ -330,6 +330,10 @@ impl ServoHTMLParser {
self.suspended.set(false);
self.parse_sync();
}
+
+ pub fn is_suspended(&self) -> bool {
+ self.suspended.get()
+ }
}
struct Tracer {