aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-01-20 13:41:32 -0800
committerGitHub <noreply@github.com>2017-01-20 13:41:32 -0800
commit830fe189adfa93a09af5e4018a110a718a8a95cd (patch)
tree057d7276c394d8db6e79b3eaa5b8a4572153155d /components/script/dom
parentf9505c7fafcbabd24cfa613493ecacd3e29d273e (diff)
parente9feb2077579b8f8c3bcafb9f4d301175f0fc805 (diff)
downloadservo-830fe189adfa93a09af5e4018a110a718a8a95cd.tar.gz
servo-830fe189adfa93a09af5e4018a110a718a8a95cd.zip
Auto merge of #15128 - nox:load-fixes, r=Ms2ger
Simplify how we handle script scheduling and delaying the load event <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15128) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/document.rs82
-rw-r--r--components/script/dom/servoparser/mod.rs3
2 files changed, 41 insertions, 44 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 65f106192bd..c1f4d056894 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -229,7 +229,7 @@ pub struct Document {
/// https://html.spec.whatwg.org/multipage/#list-of-scripts-that-will-execute-in-order-as-soon-as-possible
asap_in_order_scripts_list: PendingInOrderScriptVec,
/// https://html.spec.whatwg.org/multipage/#set-of-scripts-that-will-execute-as-soon-as-possible
- asap_scripts_set: DOMRefCell<VecDeque<PendingScript>>,
+ asap_scripts_set: DOMRefCell<Vec<JS<HTMLScriptElement>>>,
/// https://html.spec.whatwg.org/multipage/#concept-n-noscript
/// True if scripting is enabled for all scripts in this document
scripting_enabled: Cell<bool>,
@@ -1547,29 +1547,15 @@ impl Document {
loader.finish_load(&load);
}
- if let LoadType::Script(_) = load {
- self.process_deferred_scripts();
- self.process_asap_scripts();
- }
-
- if let Some(parser) = self.get_current_parser() {
- let ready_to_be_executed = match self.pending_parsing_blocking_script.borrow_mut().as_mut() {
- Some(pending) => {
- if self.script_blocking_stylesheets_count.get() > 0 {
- return;
- }
- if let Some(pair) = pending.take_result() {
- Some(pair)
- } else {
- return;
- }
- },
- None => None,
- };
- if let Some((element, result)) = ready_to_be_executed {
- *self.pending_parsing_blocking_script.borrow_mut() = None;
- parser.resume_with_pending_parsing_blocking_script(&element, result);
- }
+ match load {
+ LoadType::Stylesheet(_) => {
+ self.process_deferred_scripts();
+ self.process_pending_parsing_blocking_script();
+ },
+ LoadType::PageSource(_) => {
+ self.process_deferred_scripts();
+ },
+ _ => {},
}
if !self.loader.borrow().is_blocked() && !self.loader.borrow().events_inhibited() {
@@ -1594,23 +1580,42 @@ impl Document {
/// https://html.spec.whatwg.org/multipage/#prepare-a-script step 22.d.
pub fn pending_parsing_blocking_script_loaded(&self, element: &HTMLScriptElement, result: ScriptResult) {
- let mut blocking_script = self.pending_parsing_blocking_script.borrow_mut();
- let entry = blocking_script.as_mut().unwrap();
- assert!(&*entry.element == element);
- entry.loaded(result);
+ {
+ let mut blocking_script = self.pending_parsing_blocking_script.borrow_mut();
+ let entry = blocking_script.as_mut().unwrap();
+ assert!(&*entry.element == element);
+ entry.loaded(result);
+ }
+ self.process_pending_parsing_blocking_script();
+ }
+
+ fn process_pending_parsing_blocking_script(&self) {
+ if self.script_blocking_stylesheets_count.get() > 0 {
+ return;
+ }
+ let pair = self.pending_parsing_blocking_script
+ .borrow_mut()
+ .as_mut()
+ .and_then(PendingScript::take_result);
+ if let Some((element, result)) = pair {
+ *self.pending_parsing_blocking_script.borrow_mut() = None;
+ self.get_current_parser().unwrap().resume_with_pending_parsing_blocking_script(&element, result);
+ }
}
pub fn add_asap_script(&self, script: &HTMLScriptElement) {
- self.asap_scripts_set.borrow_mut().push_back(PendingScript::new(script));
+ self.asap_scripts_set.borrow_mut().push(JS::from_ref(script));
}
/// https://html.spec.whatwg.org/multipage/#the-end step 3.
/// https://html.spec.whatwg.org/multipage/#prepare-a-script step 22.d.
pub fn asap_script_loaded(&self, element: &HTMLScriptElement, result: ScriptResult) {
- let mut scripts = self.asap_scripts_set.borrow_mut();
- let idx = scripts.iter().position(|entry| &*entry.element == element).unwrap();
- scripts.swap(0, idx);
- scripts[0].loaded(result);
+ {
+ let mut scripts = self.asap_scripts_set.borrow_mut();
+ let idx = scripts.iter().position(|entry| &**entry == element).unwrap();
+ scripts.swap_remove(idx);
+ }
+ element.execute(result);
}
pub fn push_asap_in_order_script(&self, script: &HTMLScriptElement) {
@@ -1623,14 +1628,6 @@ impl Document {
element: &HTMLScriptElement,
result: ScriptResult) {
self.asap_in_order_scripts_list.loaded(element, result);
- }
-
- fn process_asap_scripts(&self) {
- let pair = self.asap_scripts_set.borrow_mut().front_mut().and_then(PendingScript::take_result);
- if let Some((element, result)) = pair {
- self.asap_scripts_set.borrow_mut().pop_front();
- element.execute(result);
- }
while let Some((element, result)) = self.asap_in_order_scripts_list.take_next_ready_to_be_executed() {
element.execute(result);
}
@@ -1643,10 +1640,11 @@ impl Document {
/// https://html.spec.whatwg.org/multipage/#prepare-a-script step 22.d.
pub fn deferred_script_loaded(&self, element: &HTMLScriptElement, result: ScriptResult) {
self.deferred_scripts.loaded(element, result);
+ self.process_deferred_scripts();
}
/// https://html.spec.whatwg.org/multipage/#the-end step 3.
- pub fn process_deferred_scripts(&self) {
+ fn process_deferred_scripts(&self) {
if self.ready_state.get() != DocumentReadyState::Interactive {
return;
}
diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs
index 30a5c5948a2..b75fd7352c5 100644
--- a/components/script/dom/servoparser/mod.rs
+++ b/components/script/dom/servoparser/mod.rs
@@ -359,9 +359,8 @@ impl ServoParser {
window.reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, ReflowReason::FirstLoad);
}
- // Steps 3-12 are in other castles, namely process_deferred_scripts and finish_load.
+ // Steps 3-12 are in another castle, namely finish_load.
let url = self.tokenizer.borrow().url().clone();
- self.document.process_deferred_scripts();
self.document.finish_load(LoadType::PageSource(url));
}
}