diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-01-20 13:41:32 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-20 13:41:32 -0800 |
commit | 830fe189adfa93a09af5e4018a110a718a8a95cd (patch) | |
tree | 057d7276c394d8db6e79b3eaa5b8a4572153155d /components/script/dom | |
parent | f9505c7fafcbabd24cfa613493ecacd3e29d273e (diff) | |
parent | e9feb2077579b8f8c3bcafb9f4d301175f0fc805 (diff) | |
download | servo-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.rs | 82 | ||||
-rw-r--r-- | components/script/dom/servoparser/mod.rs | 3 |
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)); } } |