aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlscriptelement.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-01-11 09:37:23 -0800
committerGitHub <noreply@github.com>2017-01-11 09:37:23 -0800
commitd1bc1a4f1b66ab9f63fa37f649eaf79035e12f8e (patch)
treec08456ddc75306ba152727d5e7fb680bc8d8c7ae /components/script/dom/htmlscriptelement.rs
parente440a016051703632cac1de6b88ff9e0c94e9017 (diff)
parent30f0553ac744789705a3cf67ffce91f2ed5beb3e (diff)
downloadservo-d1bc1a4f1b66ab9f63fa37f649eaf79035e12f8e.tar.gz
servo-d1bc1a4f1b66ab9f63fa37f649eaf79035e12f8e.zip
Auto merge of #14959 - nox:pending-script, r=Ms2ger
Introduce PendingScript <!-- 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/14959) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/htmlscriptelement.rs')
-rw-r--r--components/script/dom/htmlscriptelement.rs52
1 files changed, 29 insertions, 23 deletions
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index f2eb73123fd..8273aab31f0 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -4,7 +4,6 @@
use document_loader::LoadType;
use dom::attr::Attr;
-use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods;
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::codegen::Bindings::HTMLScriptElementBinding;
@@ -61,9 +60,6 @@ pub struct HTMLScriptElement {
/// Document of the parser that created this element
parser_document: JS<Document>,
-
- /// The source this script was loaded from
- load: DOMRefCell<Option<Result<ScriptOrigin, NetworkError>>>,
}
impl HTMLScriptElement {
@@ -77,7 +73,6 @@ impl HTMLScriptElement {
non_blocking: Cell::new(creator != ElementCreator::ParserCreated),
ready_to_be_parser_executed: Cell::new(false),
parser_document: JS::from_ref(document),
- load: DOMRefCell::new(None),
}
}
@@ -113,23 +108,23 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[
];
#[derive(HeapSizeOf, JSTraceable)]
-pub struct ScriptOrigin {
+pub struct ClassicScript {
text: DOMString,
url: ServoUrl,
external: bool,
}
-impl ScriptOrigin {
- fn internal(text: DOMString, url: ServoUrl) -> ScriptOrigin {
- ScriptOrigin {
+impl ClassicScript {
+ fn internal(text: DOMString, url: ServoUrl) -> ClassicScript {
+ ClassicScript {
text: text,
url: url,
external: false,
}
}
- fn external(text: DOMString, url: ServoUrl) -> ScriptOrigin {
- ScriptOrigin {
+ fn external(text: DOMString, url: ServoUrl) -> ClassicScript {
+ ClassicScript {
text: text,
url: url,
external: true,
@@ -137,10 +132,14 @@ impl ScriptOrigin {
}
}
+pub type ScriptResult = Result<ClassicScript, NetworkError>;
+
/// The context required for asynchronously loading an external script source.
struct ScriptContext {
/// The element that initiated the request.
elem: Trusted<HTMLScriptElement>,
+ /// The kind of external script.
+ kind: ExternalScriptKind,
/// The (fallback) character encoding argument to the "fetch a classic
/// script" algorithm.
character_encoding: EncodingRef,
@@ -200,17 +199,23 @@ impl FetchResponseListener for ScriptContext {
// Step 7.
let source_text = encoding.decode(&self.data, DecoderTrap::Replace).unwrap();
- ScriptOrigin::external(DOMString::from(source_text), metadata.final_url)
+ ClassicScript::external(DOMString::from(source_text), metadata.final_url)
});
// Step 9.
// https://html.spec.whatwg.org/multipage/#prepare-a-script
// Step 18.6 (When the chosen algorithm asynchronously completes).
let elem = self.elem.root();
- *elem.load.borrow_mut() = Some(load);
elem.ready_to_be_parser_executed.set(true);
-
let document = document_from_node(&*elem);
+
+ match self.kind {
+ ExternalScriptKind::Asap => document.asap_script_loaded(&elem, load),
+ ExternalScriptKind::AsapInOrder => document.asap_in_order_script_loaded(&elem, load),
+ ExternalScriptKind::Deferred => document.deferred_script_loaded(&elem, load),
+ ExternalScriptKind::ParsingBlocking => document.pending_parsing_blocking_script_loaded(&elem, load),
+ }
+
document.finish_load(LoadType::Script(self.url.clone()));
}
}
@@ -219,6 +224,7 @@ impl PreInvoke for ScriptContext {}
/// https://html.spec.whatwg.org/multipage/#fetch-a-classic-script
fn fetch_a_classic_script(script: &HTMLScriptElement,
+ kind: ExternalScriptKind,
url: ServoUrl,
cors_setting: Option<CorsSettings>,
integrity_metadata: String,
@@ -254,6 +260,7 @@ fn fetch_a_classic_script(script: &HTMLScriptElement,
let context = Arc::new(Mutex::new(ScriptContext {
elem: Trusted::new(script),
+ kind: kind,
character_encoding: character_encoding,
data: vec!(),
metadata: None,
@@ -394,7 +401,7 @@ impl HTMLScriptElement {
return;
}
- // Step 20.3: The "from an external file"" flag is stored in ScriptOrigin.
+ // Step 20.3: The "from an external file"" flag is stored in ClassicScript.
// Step 20.4-20.5.
let url = match base_url.join(&src) {
@@ -422,19 +429,19 @@ impl HTMLScriptElement {
};
// Step 20.6.
- fetch_a_classic_script(self, url, cors_setting, integrity_metadata.to_owned(), encoding);
+ fetch_a_classic_script(self, kind, url, cors_setting, integrity_metadata.to_owned(), encoding);
// Step 22.
match kind {
ExternalScriptKind::Deferred => doc.add_deferred_script(self),
- ExternalScriptKind::ParsingBlocking => doc.set_pending_parsing_blocking_script(Some(self)),
+ ExternalScriptKind::ParsingBlocking => doc.set_pending_parsing_blocking_script(self, None),
ExternalScriptKind::AsapInOrder => doc.push_asap_in_order_script(self),
ExternalScriptKind::Asap => doc.add_asap_script(self),
}
} else {
// Step 21.
assert!(!text.is_empty());
- *self.load.borrow_mut() = Some(Ok(ScriptOrigin::internal(text, base_url)));
+ let result = Ok(ClassicScript::internal(text, base_url));
self.ready_to_be_parser_executed.set(true);
// Step 22.
@@ -442,10 +449,10 @@ impl HTMLScriptElement {
doc.get_current_parser().map_or(false, |parser| parser.script_nesting_level() <= 1) &&
doc.get_script_blocking_stylesheets_count() > 0 {
// Step 22.e: classic, has no src, was parser-inserted, is blocked on stylesheet.
- doc.set_pending_parsing_blocking_script(Some(self));
+ doc.set_pending_parsing_blocking_script(self, Some(result));
} else {
// Step 22.f: otherwise.
- self.execute();
+ self.execute(result);
}
}
}
@@ -455,7 +462,7 @@ impl HTMLScriptElement {
}
/// https://html.spec.whatwg.org/multipage/#execute-the-script-block
- pub fn execute(&self) {
+ pub fn execute(&self, result: Result<ClassicScript, NetworkError>) {
assert!(self.ready_to_be_parser_executed.get());
// Step 1.
@@ -464,8 +471,7 @@ impl HTMLScriptElement {
return;
}
- let load = self.load.borrow_mut().take().unwrap();
- let script = match load {
+ let script = match result {
// Step 2.
Err(e) => {
warn!("error loading script {:?}", e);