aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/Cargo.toml2
-rw-r--r--components/script/dom/htmlscriptelement.rs45
-rw-r--r--components/script/dom/request.rs12
-rw-r--r--components/script/dom/servoparser/html.rs10
-rw-r--r--components/script/dom/servoparser/mod.rs11
-rw-r--r--components/script/dom/servoparser/xml.rs5
-rw-r--r--components/script/dom/xmlhttprequest.rs2
7 files changed, 43 insertions, 44 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml
index 81bf9bde314..e096dae1347 100644
--- a/components/script/Cargo.toml
+++ b/components/script/Cargo.toml
@@ -37,7 +37,7 @@ fnv = "1.0"
gfx_traits = {path = "../gfx_traits"}
heapsize = "0.3.6"
heapsize_derive = "0.1"
-html5ever = {version = "0.9.0", features = ["heap_size", "unstable"]}
+html5ever = {version = "0.10.1", features = ["heap_size", "unstable"]}
html5ever-atoms = {version = "0.1", features = ["heap_size"]}
hyper = "0.9.9"
hyper_serde = "0.1.4"
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index 3b2057e4338..86e0987b666 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -27,13 +27,12 @@ use dom::node::{document_from_node, window_from_node};
use dom::virtualmethods::VirtualMethods;
use encoding::label::encoding_from_whatwg_label;
use encoding::types::{DecoderTrap, EncodingRef};
-use html5ever::tree_builder::NextParserState;
use html5ever_atoms::LocalName;
use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
use js::jsval::UndefinedValue;
use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError};
-use net_traits::request::{CORSSettings, CredentialsMode, Destination, RequestInit, RequestMode, Type as RequestType};
+use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode, Type as RequestType};
use network_listener::{NetworkListener, PreInvoke};
use servo_atoms::Atom;
use std::ascii::AsciiExt;
@@ -221,7 +220,7 @@ impl PreInvoke for ScriptContext {}
/// https://html.spec.whatwg.org/multipage/#fetch-a-classic-script
fn fetch_a_classic_script(script: &HTMLScriptElement,
url: Url,
- cors_setting: Option<CORSSettings>,
+ cors_setting: Option<CorsSettings>,
character_encoding: EncodingRef) {
let doc = document_from_node(script);
@@ -233,13 +232,13 @@ fn fetch_a_classic_script(script: &HTMLScriptElement,
// https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request
// Step 1
mode: match cors_setting {
- Some(_) => RequestMode::CORSMode,
- None => RequestMode::NoCORS,
+ Some(_) => RequestMode::CorsMode,
+ None => RequestMode::NoCors,
},
// https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request
// Step 3-4
credentials_mode: match cors_setting {
- Some(CORSSettings::Anonymous) => CredentialsMode::CredentialsSameOrigin,
+ Some(CorsSettings::Anonymous) => CredentialsMode::CredentialsSameOrigin,
_ => CredentialsMode::Include,
},
origin: doc.url().clone(),
@@ -275,10 +274,12 @@ fn fetch_a_classic_script(script: &HTMLScriptElement,
impl HTMLScriptElement {
/// https://html.spec.whatwg.org/multipage/#prepare-a-script
- pub fn prepare(&self) -> NextParserState {
+ ///
+ /// Returns true if tokenization should continue, false otherwise.
+ pub fn prepare(&self) -> bool {
// Step 1.
if self.already_started.get() {
- return NextParserState::Continue;
+ return true;
}
// Step 2.
@@ -296,17 +297,17 @@ impl HTMLScriptElement {
// Step 4.
let text = self.Text();
if text.is_empty() && !element.has_attribute(&local_name!("src")) {
- return NextParserState::Continue;
+ return true;
}
// Step 5.
if !self.upcast::<Node>().is_in_doc() {
- return NextParserState::Continue;
+ return true;
}
// Step 6.
if !self.is_javascript() {
- return NextParserState::Continue;
+ return true;
}
// Step 7.
@@ -321,12 +322,12 @@ impl HTMLScriptElement {
// Step 9.
let doc = document_from_node(self);
if self.parser_inserted.get() && &*self.parser_document != &*doc {
- return NextParserState::Continue;
+ return true;
}
// Step 10.
if !doc.is_scripting_enabled() {
- return NextParserState::Continue;
+ return true;
}
// TODO(#4577): Step 11: CSP.
@@ -339,13 +340,13 @@ impl HTMLScriptElement {
let for_value = for_attribute.value().to_ascii_lowercase();
let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS);
if for_value != "window" {
- return NextParserState::Continue;
+ return true;
}
let event_value = event_attribute.value().to_ascii_lowercase();
let event_value = event_value.trim_matches(HTML_SPACE_CHARACTERS);
if event_value != "onload" && event_value != "onload()" {
- return NextParserState::Continue;
+ return true;
}
},
(_, _) => (),
@@ -358,8 +359,8 @@ impl HTMLScriptElement {
// Step 14.
let cors_setting = match self.GetCrossOrigin() {
- Some(ref s) if *s == "anonymous" => Some(CORSSettings::Anonymous),
- Some(ref s) if *s == "use-credentials" => Some(CORSSettings::UseCredentials),
+ Some(ref s) if *s == "anonymous" => Some(CorsSettings::Anonymous),
+ Some(ref s) if *s == "use-credentials" => Some(CorsSettings::UseCredentials),
None => None,
_ => unreachable!()
};
@@ -380,7 +381,7 @@ impl HTMLScriptElement {
// Step 18.2.
if src.is_empty() {
self.queue_error_event();
- return NextParserState::Continue;
+ return true;
}
// Step 18.4-18.5.
@@ -388,7 +389,7 @@ impl HTMLScriptElement {
Err(_) => {
warn!("error parsing URL for script {}", &**src);
self.queue_error_event();
- return NextParserState::Continue;
+ return true;
}
Ok(url) => url,
};
@@ -411,7 +412,7 @@ impl HTMLScriptElement {
!async {
doc.add_deferred_script(self);
// Second part implemented in Document::process_deferred_scripts.
- return NextParserState::Continue;
+ return true;
// Step 20.b: classic, has src, was parser-inserted, is not async.
} else if is_external &&
was_parser_inserted &&
@@ -442,7 +443,7 @@ impl HTMLScriptElement {
self.ready_to_be_parser_executed.set(true);
*self.load.borrow_mut() = Some(Ok(ScriptOrigin::internal(text, base_url)));
self.execute();
- return NextParserState::Continue;
+ return true;
}
// TODO: make this suspension happen automatically.
@@ -451,7 +452,7 @@ impl HTMLScriptElement {
parser.suspend();
}
}
- NextParserState::Suspend
+ false
}
pub fn is_ready_to_be_executed(&self) -> bool {
diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs
index fa649702259..614c51398e8 100644
--- a/components/script/dom/request.rs
+++ b/components/script/dom/request.rs
@@ -114,7 +114,7 @@ impl Request {
url,
false);
// Step 5.5
- fallback_mode = Some(NetTraitsRequestMode::CORSMode);
+ fallback_mode = Some(NetTraitsRequestMode::CorsMode);
// Step 5.6
fallback_credentials = Some(NetTraitsRequestCredentials::Omit);
}
@@ -335,7 +335,7 @@ impl Request {
// deep copied headers in Step 27.
// Step 30
- if r.request.borrow().mode == NetTraitsRequestMode::NoCORS {
+ if r.request.borrow().mode == NetTraitsRequestMode::NoCors {
let borrowed_request = r.request.borrow();
// Step 30.1
if !is_cors_safelisted_method(&borrowed_request.method.borrow()) {
@@ -814,8 +814,8 @@ impl Into<NetTraitsRequestMode> for RequestMode {
match self {
RequestMode::Navigate => NetTraitsRequestMode::Navigate,
RequestMode::Same_origin => NetTraitsRequestMode::SameOrigin,
- RequestMode::No_cors => NetTraitsRequestMode::NoCORS,
- RequestMode::Cors => NetTraitsRequestMode::CORSMode,
+ RequestMode::No_cors => NetTraitsRequestMode::NoCors,
+ RequestMode::Cors => NetTraitsRequestMode::CorsMode,
}
}
}
@@ -825,8 +825,8 @@ impl Into<RequestMode> for NetTraitsRequestMode {
match self {
NetTraitsRequestMode::Navigate => RequestMode::Navigate,
NetTraitsRequestMode::SameOrigin => RequestMode::Same_origin,
- NetTraitsRequestMode::NoCORS => RequestMode::No_cors,
- NetTraitsRequestMode::CORSMode => RequestMode::Cors,
+ NetTraitsRequestMode::NoCors => RequestMode::No_cors,
+ NetTraitsRequestMode::CorsMode => RequestMode::Cors,
}
}
}
diff --git a/components/script/dom/servoparser/html.rs b/components/script/dom/servoparser/html.rs
index fd4a5a923b9..0401342a5db 100644
--- a/components/script/dom/servoparser/html.rs
+++ b/components/script/dom/servoparser/html.rs
@@ -30,7 +30,7 @@ use html5ever::serialize::TraversalScope;
use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
use html5ever::tendril::StrTendril;
use html5ever::tokenizer::{Tokenizer as H5ETokenizer, TokenizerOpts};
-use html5ever::tree_builder::{NextParserState, NodeOrText, QuirksMode};
+use html5ever::tree_builder::{NodeOrText, QuirksMode};
use html5ever::tree_builder::{TreeBuilder, TreeBuilderOpts, TreeSink};
use html5ever_atoms::QualName;
use msg::constellation_msg::PipelineId;
@@ -153,14 +153,6 @@ impl<'a> TreeSink for Sink {
script.map(|script| script.set_already_started(true));
}
- fn complete_script(&mut self, node: JS<Node>) -> NextParserState {
- let script = node.downcast::<HTMLScriptElement>();
- if let Some(script) = script {
- return script.prepare();
- }
- NextParserState::Continue
- }
-
fn reparent_children(&mut self, node: JS<Node>, new_parent: JS<Node>) {
while let Some(ref child) = node.GetFirstChild() {
new_parent.AppendChild(&child).unwrap();
diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs
index 4df82a457a7..474c8f036f0 100644
--- a/components/script/dom/servoparser/mod.rs
+++ b/components/script/dom/servoparser/mod.rs
@@ -17,10 +17,11 @@ use dom::bindings::trace::JSTraceable;
use dom::document::Document;
use dom::globalscope::GlobalScope;
use dom::htmlimageelement::HTMLImageElement;
+use dom::htmlscriptelement::HTMLScriptElement;
use dom::node::Node;
use encoding::all::UTF_8;
use encoding::types::{DecoderTrap, Encoding};
-use html5ever::tokenizer::Tokenizer as H5ETokenizer;
+use html5ever::tokenizer::{Tokenizer as H5ETokenizer, TokenizerResult};
use html5ever::tokenizer::buffer_queue::BufferQueue;
use html5ever::tree_builder::Tracer as HtmlTracer;
use html5ever::tree_builder::TreeBuilder as HtmlTreeBuilder;
@@ -247,8 +248,14 @@ impl HtmlTokenizer {
self.run();
}
+ #[allow(unrooted_must_root)]
fn run(&mut self) {
- self.inner.feed(&mut self.input_buffer);
+ while let TokenizerResult::Script(script) = self.inner.feed(&mut self.input_buffer) {
+ let script = Root::from_ref(script.downcast::<HTMLScriptElement>().unwrap());
+ if !script.prepare() {
+ break;
+ }
+ }
}
fn end(&mut self) {
diff --git a/components/script/dom/servoparser/xml.rs b/components/script/dom/servoparser/xml.rs
index 879bb9320d6..8c1e9490df1 100644
--- a/components/script/dom/servoparser/xml.rs
+++ b/components/script/dom/servoparser/xml.rs
@@ -16,7 +16,6 @@ use dom::htmlscriptelement::HTMLScriptElement;
use dom::node::Node;
use dom::processinginstruction::ProcessingInstruction;
use dom::text::Text;
-use html5ever;
use html5ever_atoms::{Prefix, QualName};
use msg::constellation_msg::PipelineId;
use std::borrow::Cow;
@@ -113,8 +112,8 @@ impl<'a> TreeSink for Sink {
let script = node.downcast::<HTMLScriptElement>();
if let Some(script) = script {
return match script.prepare() {
- html5ever::tree_builder::NextParserState::Continue => NextParserState::Continue,
- html5ever::tree_builder::NextParserState::Suspend => NextParserState::Suspend
+ true => NextParserState::Continue,
+ false => NextParserState::Suspend,
};
}
NextParserState::Continue
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index c404c482308..ab603f5c444 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -590,7 +590,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
// https://github.com/whatwg/xhr/issues/71
destination: Destination::None,
synchronous: self.sync.get(),
- mode: RequestMode::CORSMode,
+ mode: RequestMode::CorsMode,
use_cors_preflight: has_handlers,
credentials_mode: credentials_mode,
use_url_credentials: use_url_credentials,