From 6c518c89b969d1e9a96c3c5b9fe0da6cfc3637d1 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 2 May 2017 11:10:49 +0200 Subject: Upgrade to html5ever 0.16 --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index d6679c5168c..c77e7a46dfa 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -26,7 +26,7 @@ use dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use encoding::label::encoding_from_whatwg_label; use encoding::types::{DecoderTrap, EncodingRef}; -use html5ever_atoms::LocalName; +use html5ever::LocalName; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; -- cgit v1.2.3 From 875e422fe67f68bdf57bd3635279e224b0c90996 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Wed, 3 May 2017 10:17:42 -0500 Subject: Changed all prefixes from DOMString to the atomic Prefix from html5ever --- components/script/dom/htmlscriptelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index d6679c5168c..450c3e6c892 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -26,7 +26,7 @@ use dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use encoding::label::encoding_from_whatwg_label; use encoding::types::{DecoderTrap, EncodingRef}; -use html5ever_atoms::LocalName; +use html5ever_atoms::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; @@ -69,7 +69,7 @@ pub struct HTMLScriptElement { } impl HTMLScriptElement { - fn new_inherited(local_name: LocalName, prefix: Option, document: &Document, + fn new_inherited(local_name: LocalName, prefix: Option, document: &Document, creator: ElementCreator) -> HTMLScriptElement { HTMLScriptElement { htmlelement: @@ -83,7 +83,7 @@ impl HTMLScriptElement { } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, prefix: Option, document: &Document, + pub fn new(local_name: LocalName, prefix: Option, document: &Document, creator: ElementCreator) -> Root { Node::reflect_node(box HTMLScriptElement::new_inherited(local_name, prefix, document, creator), document, -- cgit v1.2.3 From 6032940fb8723d36c6f5089593d0a57f6a7efc93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fausto=20N=C3=BA=C3=B1ez=20Alberro?= Date: Wed, 26 Apr 2017 01:07:31 +0200 Subject: Change RequestInit origin type to ImmutableOrigin --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index a29490ff5f4..0a5e9b74a0d 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -253,7 +253,7 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, Some(CorsSettings::Anonymous) => CredentialsMode::CredentialsSameOrigin, _ => CredentialsMode::Include, }, - origin: doc.url(), + origin: doc.origin().immutable().clone(), pipeline_id: Some(script.global().pipeline_id()), referrer_url: Some(doc.url()), referrer_policy: doc.get_referrer_policy(), -- cgit v1.2.3 From 15ac245ae74e96757fa8514a6b14f9cb2dab65e5 Mon Sep 17 00:00:00 2001 From: Nikhil Shagrithaya Date: Mon, 24 Jul 2017 00:20:07 +0530 Subject: Update step annotations in script's prepare method --- components/script/dom/htmlscriptelement.rs | 52 ++++++++++++++++-------------- 1 file changed, 27 insertions(+), 25 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 0a5e9b74a0d..ea0cc4c25e8 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -342,9 +342,11 @@ impl HTMLScriptElement { return; } - // TODO(#4577): Step 11: CSP. + // TODO: Step 11: nomodule content attribute - // Step 12. + // TODO(#4577): Step 12: CSP. + + // Step 13. let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); match (for_attribute.r(), event_attribute.r()) { @@ -364,19 +366,19 @@ impl HTMLScriptElement { (_, _) => (), } - // Step 13. + // Step 14. let encoding = element.get_attribute(&ns!(), &local_name!("charset")) .and_then(|charset| encoding_from_whatwg_label(&charset.value())) .unwrap_or_else(|| doc.encoding()); - // Step 14. + // Step 15. let cors_setting = cors_setting_for_element(element); - // TODO: Step 15: Module script credentials mode. + // TODO: Step 16: Module script credentials mode. - // TODO: Step 16: Nonce. + // TODO: Step 17: Nonce. - // Step 17: Integrity metadata. + // Step 18: Integrity metadata. let im_attribute = element.get_attribute(&ns!(), &local_name!("integrity")); let integrity_val = im_attribute.r().map(|a| a.value()); let integrity_metadata = match integrity_val { @@ -384,26 +386,26 @@ impl HTMLScriptElement { None => "", }; - // TODO: Step 18: parser state. + // TODO: Step 19: parser state. - // TODO: Step 19: environment settings object. + // TODO: Step 20: environment settings object. let base_url = doc.base_url(); if let Some(src) = element.get_attribute(&ns!(), &local_name!("src")) { - // Step 20. + // Step 21. - // Step 20.1. + // Step 21.1. let src = src.value(); - // Step 20.2. + // Step 21.2. if src.is_empty() { self.queue_error_event(); return; } - // Step 20.3: The "from an external file"" flag is stored in ClassicScript. + // Step 21.3: The "from an external file"" flag is stored in ClassicScript. - // Step 20.4-20.5. + // Step 21.4-21.5. let url = match base_url.join(&src) { Ok(url) => url, Err(_) => { @@ -413,25 +415,25 @@ impl HTMLScriptElement { }, }; - // Preparation for step 22. + // Preparation for step 23. let kind = if element.has_attribute(&local_name!("defer")) && was_parser_inserted && !async { - // Step 22.a: classic, has src, has defer, was parser-inserted, is not async. + // Step 23.a: classic, has src, has defer, was parser-inserted, is not async. ExternalScriptKind::Deferred } else if was_parser_inserted && !async { - // Step 22.b: classic, has src, was parser-inserted, is not async. + // Step 23.c: classic, has src, was parser-inserted, is not async. ExternalScriptKind::ParsingBlocking } else if !async && !self.non_blocking.get() { - // Step 22.c: classic, has src, is not async, is not non-blocking. + // Step 23.d: classic, has src, is not async, is not non-blocking. ExternalScriptKind::AsapInOrder } else { - // Step 22.d: classic, has src. + // Step 23.f: classic, has src. ExternalScriptKind::Asap }; - // Step 20.6. + // Step 21.6. fetch_a_classic_script(self, kind, url, cors_setting, integrity_metadata.to_owned(), encoding); - // Step 22. + // Step 23. match kind { ExternalScriptKind::Deferred => doc.add_deferred_script(self), ExternalScriptKind::ParsingBlocking => doc.set_pending_parsing_blocking_script(self, None), @@ -439,18 +441,18 @@ impl HTMLScriptElement { ExternalScriptKind::Asap => doc.add_asap_script(self), } } else { - // Step 21. + // Step 22. assert!(!text.is_empty()); let result = Ok(ClassicScript::internal(text, base_url)); - // Step 22. + // Step 23. if was_parser_inserted && 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. + // Step 23.h: classic, has no src, was parser-inserted, is blocked on stylesheet. doc.set_pending_parsing_blocking_script(self, Some(result)); } else { - // Step 22.f: otherwise. + // Step 23.i: otherwise. self.execute(result); } } -- cgit v1.2.3 From 56117d31856be46d7df417e659a4406305b4e258 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 16 Sep 2017 02:09:26 +0200 Subject: Rename Runnable to Task The changes are: * `*Runnable` -> `*Task`; * `RunnableMsg` -> `Task`; * `RunnableWrapper` -> `TaskCanceller`; * `MainThreadRunnable` -> `MainThreadTask`; * `wrap_runnable` -> `wrap_task`; * `get_runnable_wrapper` -> `task_canceller`; * `handler` -> `run`; * `main_thread_handler` -> `run_with_script_thread`. --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index ea0cc4c25e8..a9a7869e33e 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -277,7 +277,7 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, let listener = NetworkListener { context: context, task_source: doc.window().networking_task_source(), - wrapper: Some(doc.window().get_runnable_wrapper()) + canceller: Some(doc.window().task_canceller()) }; ROUTER.add_route(action_receiver.to_opaque(), box move |message| { -- cgit v1.2.3 From 0e3c54c1911ba2c3bf305ee04f04fcd9bf2fc2fe Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 25 Sep 2017 23:30:24 +0200 Subject: Rename dom::bindings::js to dom::bindings::root --- components/script/dom/htmlscriptelement.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index a9a7869e33e..eea87ffe795 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -9,10 +9,9 @@ use dom::bindings::codegen::Bindings::HTMLScriptElementBinding; use dom::bindings::codegen::Bindings::HTMLScriptElementBinding::HTMLScriptElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::inheritance::Castable; -use dom::bindings::js::{JS, Root}; -use dom::bindings::js::RootedReference; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::DomObject; +use dom::bindings::root::{JS, Root, RootedReference}; use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element, ElementCreator}; -- cgit v1.2.3 From 7be32fb2371a14ba61b008a37e79761f66c073c7 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 25 Sep 2017 23:56:32 +0200 Subject: Rename JS to Dom --- components/script/dom/htmlscriptelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index eea87ffe795..c6c21329dbf 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -11,7 +11,7 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::inheritance::Castable; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::DomObject; -use dom::bindings::root::{JS, Root, RootedReference}; +use dom::bindings::root::{Dom, Root, RootedReference}; use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element, ElementCreator}; @@ -61,7 +61,7 @@ pub struct HTMLScriptElement { non_blocking: Cell, /// Document of the parser that created this element - parser_document: JS, + parser_document: Dom, /// Track line line_number line_number: u64, @@ -76,7 +76,7 @@ impl HTMLScriptElement { already_started: Cell::new(false), parser_inserted: Cell::new(creator.is_parser_created()), non_blocking: Cell::new(!creator.is_parser_created()), - parser_document: JS::from_ref(document), + parser_document: Dom::from_ref(document), line_number: creator.return_line_number(), } } -- cgit v1.2.3 From f87c2a8d7616112ca924e30292db2d244cf87eec Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 26 Sep 2017 01:53:40 +0200 Subject: Rename Root to DomRoot In a later PR, DomRoot will become a type alias of Root>, where Root will be able to handle all the things that need to be rooted that have a stable traceable address that doesn't move for the whole lifetime of the root. Stay tuned. --- components/script/dom/htmlscriptelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index c6c21329dbf..7cdebdbcba4 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -11,7 +11,7 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::inheritance::Castable; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::DomObject; -use dom::bindings::root::{Dom, Root, RootedReference}; +use dom::bindings::root::{Dom, DomRoot, RootedReference}; use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element, ElementCreator}; @@ -83,7 +83,7 @@ impl HTMLScriptElement { #[allow(unrooted_must_root)] pub fn new(local_name: LocalName, prefix: Option, document: &Document, - creator: ElementCreator) -> Root { + creator: ElementCreator) -> DomRoot { Node::reflect_node(box HTMLScriptElement::new_inherited(local_name, prefix, document, creator), document, HTMLScriptElementBinding::Wrap) -- cgit v1.2.3 From 605c679fee29302321878a74b88aa7165519b516 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 10 Oct 2017 16:14:40 +0200 Subject: Fix URL attributes URL attributes should always use AttrValue::Url, and the input should be resolved against the document's base URL at setting time always. --- components/script/dom/htmlscriptelement.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 7cdebdbcba4..5ad655ce659 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -42,6 +42,7 @@ use std::io::{Read, Write}; use std::path::PathBuf; use std::process::{Command, Stdio}; use std::sync::{Arc, Mutex}; +use style::attr::AttrValue; use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec}; use uuid::Uuid; @@ -653,6 +654,13 @@ impl VirtualMethods for HTMLScriptElement { Some(self.upcast::() as &VirtualMethods) } + fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue { + match name { + &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()), + _ => self.super_type().unwrap().parse_plain_attribute(name, value), + } + } + fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { self.super_type().unwrap().attribute_mutated(attr, mutation); match *attr.local_name() { @@ -702,8 +710,9 @@ impl VirtualMethods for HTMLScriptElement { impl HTMLScriptElementMethods for HTMLScriptElement { // https://html.spec.whatwg.org/multipage/#dom-script-src make_url_getter!(Src, "src"); + // https://html.spec.whatwg.org/multipage/#dom-script-src - make_setter!(SetSrc, "src"); + make_url_setter!(SetSrc, "src"); // https://html.spec.whatwg.org/multipage/#dom-script-type make_getter!(Type, "type"); -- cgit v1.2.3 From c7b1d3054f9e87cf7ae7b10df5fbf5a97f6448f4 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 15 Oct 2017 10:59:01 +0200 Subject: Change AttrValue::Url to AttrValue::ResolvedUrl There is actually only one attribute that can use that, the one for . --- components/script/dom/htmlscriptelement.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 5ad655ce659..5c85aa30899 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -42,7 +42,6 @@ use std::io::{Read, Write}; use std::path::PathBuf; use std::process::{Command, Stdio}; use std::sync::{Arc, Mutex}; -use style::attr::AttrValue; use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec}; use uuid::Uuid; @@ -654,13 +653,6 @@ impl VirtualMethods for HTMLScriptElement { Some(self.upcast::() as &VirtualMethods) } - fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue { - match name { - &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()), - _ => self.super_type().unwrap().parse_plain_attribute(name, value), - } - } - fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { self.super_type().unwrap().attribute_mutated(attr, mutation); match *attr.local_name() { @@ -712,7 +704,7 @@ impl HTMLScriptElementMethods for HTMLScriptElement { make_url_getter!(Src, "src"); // https://html.spec.whatwg.org/multipage/#dom-script-src - make_url_setter!(SetSrc, "src"); + make_setter!(SetSrc, "src"); // https://html.spec.whatwg.org/multipage/#dom-script-type make_getter!(Type, "type"); -- cgit v1.2.3 From aa15dc269f41503d81ad44cd7e85d69e6f4aeac7 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 16 Oct 2017 14:35:30 +0200 Subject: Remove use of unstable box syntax. http://www.robohornet.org gives a score of 101.36 on master, and 102.68 with this PR. The latter is slightly better, but probably within noise level. So it looks like this PR does not affect DOM performance. This is expected since `Box::new` is defined as: ```rust impl Box { #[inline(always)] pub fn new(x: T) -> Box { box x } } ``` With inlining, it should compile to the same as box syntax. --- components/script/dom/htmlscriptelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 5c85aa30899..1108f8438f8 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -84,7 +84,7 @@ impl HTMLScriptElement { #[allow(unrooted_must_root)] pub fn new(local_name: LocalName, prefix: Option, document: &Document, creator: ElementCreator) -> DomRoot { - Node::reflect_node(box HTMLScriptElement::new_inherited(local_name, prefix, document, creator), + Node::reflect_node(Box::new(HTMLScriptElement::new_inherited(local_name, prefix, document, creator)), document, HTMLScriptElementBinding::Wrap) } @@ -279,9 +279,9 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, canceller: Some(doc.window().task_canceller()) }; - ROUTER.add_route(action_receiver.to_opaque(), box move |message| { + ROUTER.add_route(action_receiver.to_opaque(), Box::new(move |message| { listener.notify_fetch(message.to().unwrap()); - }); + })); doc.fetch_async(LoadType::Script(url), request, action_sender); } -- cgit v1.2.3 From efc3683cc7ceff0cd8c8528a168a78d42fb1a0e8 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Tue, 17 Oct 2017 09:39:20 -0700 Subject: Fix commonmark Markdown warnings in docs, part 1 Fixes warnings from rust-lang/rust#44229 when `--enable-commonmark` is passed to rustdoc. This is mostly a global find-and-replace for bare URIs on lines by themselves in doc comments. --- components/script/dom/htmlscriptelement.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1108f8438f8..1a21ce28a1c 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -49,13 +49,13 @@ use uuid::Uuid; pub struct HTMLScriptElement { htmlelement: HTMLElement, - /// https://html.spec.whatwg.org/multipage/#already-started + /// already_started: Cell, - /// https://html.spec.whatwg.org/multipage/#parser-inserted + /// parser_inserted: Cell, - /// https://html.spec.whatwg.org/multipage/#non-blocking + /// /// /// (currently unused) non_blocking: Cell, @@ -190,7 +190,7 @@ impl FetchResponseListener for ScriptContext { } } - /// https://html.spec.whatwg.org/multipage/#fetch-a-classic-script + /// /// step 4-9 fn process_response_eof(&mut self, response: Result<(), NetworkError>) { // Step 5. @@ -226,7 +226,7 @@ impl FetchResponseListener for ScriptContext { 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, @@ -286,7 +286,7 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, } impl HTMLScriptElement { - /// https://html.spec.whatwg.org/multipage/#prepare-a-script + /// pub fn prepare(&self) { // Step 1. if self.already_started.get() { @@ -500,7 +500,7 @@ impl HTMLScriptElement { } } - /// https://html.spec.whatwg.org/multipage/#execute-the-script-block + /// pub fn execute(&self, result: Result) { // Step 1. let doc = document_from_node(self); -- cgit v1.2.3 From 4506f0d30cbbb02df32e9c16135ef288ad6b7e2e Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Wed, 18 Oct 2017 10:42:01 +1100 Subject: Replace all uses of the `heapsize` crate with `malloc_size_of`. Servo currently uses `heapsize`, but Stylo/Gecko use `malloc_size_of`. `malloc_size_of` is better -- it handles various cases that `heapsize` does not -- so this patch changes Servo to use `malloc_size_of`. This patch makes the following changes to the `malloc_size_of` crate. - Adds `MallocSizeOf` trait implementations for numerous types, some built-in (e.g. `VecDeque`), some external and Servo-only (e.g. `string_cache`). - Makes `enclosing_size_of_op` optional, because vanilla jemalloc doesn't support that operation. - For `HashSet`/`HashMap`, falls back to a computed estimate when `enclosing_size_of_op` isn't available. - Adds an extern "C" `malloc_size_of` function that does the actual heap measurement; this is based on the same functions from the `heapsize` crate. This patch makes the following changes elsewhere. - Converts all the uses of `heapsize` to instead use `malloc_size_of`. - Disables the "heapsize"/"heap_size" feature for the external crates that provide it. - Removes the `HeapSizeOf` implementation from `hashglobe`. - Adds `ignore` annotations to a few `Rc`/`Arc`, because `malloc_size_of` doesn't derive those types, unlike `heapsize`. --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1a21ce28a1c..31871104687 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -112,7 +112,7 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[ "text/x-javascript", ]; -#[derive(HeapSizeOf, JSTraceable)] +#[derive(JSTraceable, MallocSizeOf)] pub struct ClassicScript { text: DOMString, url: ServoUrl, -- cgit v1.2.3 From c6bb1cb9d553c13a20dace3e32b9643c433caa1e Mon Sep 17 00:00:00 2001 From: Keith Yeung Date: Sat, 21 Oct 2017 06:39:23 -0700 Subject: Merge request type and destination --- components/script/dom/htmlscriptelement.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 31871104687..8ff45372c88 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -30,7 +30,7 @@ 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}; use network_listener::{NetworkListener, PreInvoke}; use servo_atoms::Atom; use servo_config::opts; @@ -238,7 +238,6 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, // Step 1, 2. let request = RequestInit { url: url.clone(), - type_: RequestType::Script, destination: Destination::Script, // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request // Step 1 -- cgit v1.2.3 From a3971eb686503641a0e9cc64f4844a6abdd5cda1 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 31 Oct 2017 19:06:34 +0100 Subject: Replace rust-encoding with encoding-rs --- components/script/dom/htmlscriptelement.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8ff45372c88..b3c1fe76464 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -23,8 +23,7 @@ use dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; use dom::node::{document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; -use encoding::label::encoding_from_whatwg_label; -use encoding::types::{DecoderTrap, EncodingRef}; +use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; @@ -147,7 +146,7 @@ struct ScriptContext { kind: ExternalScriptKind, /// The (fallback) character encoding argument to the "fetch a classic /// script" algorithm. - character_encoding: EncodingRef, + character_encoding: &'static Encoding, /// The response body received to date. data: Vec, /// The response metadata received to date. @@ -199,11 +198,11 @@ impl FetchResponseListener for ScriptContext { // Step 6. let encoding = metadata.charset - .and_then(|encoding| encoding_from_whatwg_label(&encoding)) + .and_then(|encoding| Encoding::for_label(encoding.as_bytes())) .unwrap_or(self.character_encoding); // Step 7. - let source_text = encoding.decode(&self.data, DecoderTrap::Replace).unwrap(); + let (source_text, _, _) = encoding.decode(&self.data); ClassicScript::external(DOMString::from(source_text), metadata.final_url) }); @@ -232,7 +231,7 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, url: ServoUrl, cors_setting: Option, integrity_metadata: String, - character_encoding: EncodingRef) { + character_encoding: &'static Encoding) { let doc = document_from_node(script); // Step 1, 2. @@ -366,7 +365,7 @@ impl HTMLScriptElement { // Step 14. let encoding = element.get_attribute(&ns!(), &local_name!("charset")) - .and_then(|charset| encoding_from_whatwg_label(&charset.value())) + .and_then(|charset| Encoding::for_label(charset.value().as_bytes())) .unwrap_or_else(|| doc.encoding()); // Step 15. -- cgit v1.2.3 From 793bebfc0ef5e3dbfbff094ec459198f2bceeaff Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 6 Nov 2017 14:24:03 +0100 Subject: Upgrade to rustc 1.23.0-nightly (02004ef78 2017-11-08) --- components/script/dom/htmlscriptelement.rs | 1 - 1 file changed, 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index b3c1fe76464..ee42746c71f 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -34,7 +34,6 @@ use network_listener::{NetworkListener, PreInvoke}; use servo_atoms::Atom; use servo_config::opts; use servo_url::ServoUrl; -use std::ascii::AsciiExt; use std::cell::Cell; use std::fs::File; use std::io::{Read, Write}; -- cgit v1.2.3 From 671627e97e20ae4baf728ae6dda61ef6f857c193 Mon Sep 17 00:00:00 2001 From: Gregory Terzian Date: Thu, 5 Jul 2018 12:33:09 +0800 Subject: introduce "per task source" ignoring of tasks --- components/script/dom/htmlscriptelement.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index ee42746c71f..8f07f1e80c8 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -41,6 +41,7 @@ use std::path::PathBuf; use std::process::{Command, Stdio}; use std::sync::{Arc, Mutex}; use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec}; +use task_source::TaskSourceName; use uuid::Uuid; #[dom_struct] @@ -273,7 +274,7 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, let listener = NetworkListener { context: context, task_source: doc.window().networking_task_source(), - canceller: Some(doc.window().task_canceller()) + canceller: Some(doc.window().task_canceller(TaskSourceName::Networking)) }; ROUTER.add_route(action_receiver.to_opaque(), Box::new(move |message| { -- cgit v1.2.3 From c37a345dc9f4dda6ea29c42f96f6c7201c42cbac Mon Sep 17 00:00:00 2001 From: chansuke Date: Tue, 18 Sep 2018 23:24:15 +0900 Subject: Format script component --- components/script/dom/htmlscriptelement.rs | 225 +++++++++++++++++++---------- 1 file changed, 145 insertions(+), 80 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8f07f1e80c8..d78a04e93e0 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -67,11 +67,14 @@ pub struct HTMLScriptElement { } impl HTMLScriptElement { - fn new_inherited(local_name: LocalName, prefix: Option, document: &Document, - creator: ElementCreator) -> HTMLScriptElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + creator: ElementCreator, + ) -> HTMLScriptElement { HTMLScriptElement { - htmlelement: - HTMLElement::new_inherited(local_name, prefix, document), + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), already_started: Cell::new(false), parser_inserted: Cell::new(creator.is_parser_created()), non_blocking: Cell::new(!creator.is_parser_created()), @@ -81,15 +84,22 @@ impl HTMLScriptElement { } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, prefix: Option, document: &Document, - creator: ElementCreator) -> DomRoot { - Node::reflect_node(Box::new(HTMLScriptElement::new_inherited(local_name, prefix, document, creator)), - document, - HTMLScriptElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + creator: ElementCreator, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLScriptElement::new_inherited( + local_name, prefix, document, creator, + )), + document, + HTMLScriptElementBinding::Wrap, + ) } } - /// Supported script types as defined by /// . static SCRIPT_JS_MIMES: StaticStringVec = &[ @@ -154,7 +164,7 @@ struct ScriptContext { /// The initial URL requested. url: ServoUrl, /// Indicates whether the request failed, and why - status: Result<(), NetworkError> + status: Result<(), NetworkError>, } impl FetchResponseListener for ScriptContext { @@ -162,24 +172,29 @@ impl FetchResponseListener for ScriptContext { fn process_request_eof(&mut self) {} // TODO(KiChjang): Perhaps add custom steps to perform fetch here? - fn process_response(&mut self, - metadata: Result) { + fn process_response(&mut self, metadata: Result) { self.metadata = metadata.ok().map(|meta| match meta { FetchMetadata::Unfiltered(m) => m, - FetchMetadata::Filtered { unsafe_, .. } => unsafe_ + FetchMetadata::Filtered { unsafe_, .. } => unsafe_, }); - let status_code = self.metadata.as_ref().and_then(|m| { - match m.status { + let status_code = self + .metadata + .as_ref() + .and_then(|m| match m.status { Some((c, _)) => Some(c), _ => None, - } - }).unwrap_or(0); + }).unwrap_or(0); self.status = match status_code { - 0 => Err(NetworkError::Internal("No http status code received".to_owned())), + 0 => Err(NetworkError::Internal( + "No http status code received".to_owned(), + )), 200...299 => Ok(()), // HTTP ok status codes - _ => Err(NetworkError::Internal(format!("HTTP error code {}", status_code))) + _ => Err(NetworkError::Internal(format!( + "HTTP error code {}", + status_code + ))), }; } @@ -197,7 +212,8 @@ impl FetchResponseListener for ScriptContext { let metadata = self.metadata.take().unwrap(); // Step 6. - let encoding = metadata.charset + let encoding = metadata + .charset .and_then(|encoding| Encoding::for_label(encoding.as_bytes())) .unwrap_or(self.character_encoding); @@ -216,7 +232,9 @@ impl FetchResponseListener for ScriptContext { 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), + ExternalScriptKind::ParsingBlocking => { + document.pending_parsing_blocking_script_loaded(&elem, load) + }, } document.finish_load(LoadType::Script(self.url.clone())); @@ -226,12 +244,14 @@ impl FetchResponseListener for ScriptContext { impl PreInvoke for ScriptContext {} /// -fn fetch_a_classic_script(script: &HTMLScriptElement, - kind: ExternalScriptKind, - url: ServoUrl, - cors_setting: Option, - integrity_metadata: String, - character_encoding: &'static Encoding) { +fn fetch_a_classic_script( + script: &HTMLScriptElement, + kind: ExternalScriptKind, + url: ServoUrl, + cors_setting: Option, + integrity_metadata: String, + character_encoding: &'static Encoding, +) { let doc = document_from_node(script); // Step 1, 2. @@ -255,7 +275,7 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, referrer_url: Some(doc.url()), referrer_policy: doc.get_referrer_policy(), integrity_metadata: integrity_metadata, - .. RequestInit::default() + ..RequestInit::default() }; // TODO: Step 3, Add custom steps to perform fetch @@ -264,22 +284,25 @@ fn fetch_a_classic_script(script: &HTMLScriptElement, elem: Trusted::new(script), kind: kind, character_encoding: character_encoding, - data: vec!(), + data: vec![], metadata: None, url: url.clone(), - status: Ok(()) + status: Ok(()), })); let (action_sender, action_receiver) = ipc::channel().unwrap(); let listener = NetworkListener { context: context, task_source: doc.window().networking_task_source(), - canceller: Some(doc.window().task_canceller(TaskSourceName::Networking)) + canceller: Some(doc.window().task_canceller(TaskSourceName::Networking)), }; - ROUTER.add_route(action_receiver.to_opaque(), Box::new(move |message| { - listener.notify_fetch(message.to().unwrap()); - })); + ROUTER.add_route( + action_receiver.to_opaque(), + Box::new(move |message| { + listener.notify_fetch(message.to().unwrap()); + }), + ); doc.fetch_async(LoadType::Script(url), request, action_sender); } @@ -364,9 +387,10 @@ impl HTMLScriptElement { } // Step 14. - let encoding = element.get_attribute(&ns!(), &local_name!("charset")) - .and_then(|charset| Encoding::for_label(charset.value().as_bytes())) - .unwrap_or_else(|| doc.encoding()); + let encoding = element + .get_attribute(&ns!(), &local_name!("charset")) + .and_then(|charset| Encoding::for_label(charset.value().as_bytes())) + .unwrap_or_else(|| doc.encoding()); // Step 15. let cors_setting = cors_setting_for_element(element); @@ -413,27 +437,37 @@ impl HTMLScriptElement { }; // Preparation for step 23. - let kind = if element.has_attribute(&local_name!("defer")) && was_parser_inserted && !async { - // Step 23.a: classic, has src, has defer, was parser-inserted, is not async. - ExternalScriptKind::Deferred - } else if was_parser_inserted && !async { - // Step 23.c: classic, has src, was parser-inserted, is not async. - ExternalScriptKind::ParsingBlocking - } else if !async && !self.non_blocking.get() { - // Step 23.d: classic, has src, is not async, is not non-blocking. - ExternalScriptKind::AsapInOrder - } else { - // Step 23.f: classic, has src. - ExternalScriptKind::Asap - }; + let kind = + if element.has_attribute(&local_name!("defer")) && was_parser_inserted && !async { + // Step 23.a: classic, has src, has defer, was parser-inserted, is not async. + ExternalScriptKind::Deferred + } else if was_parser_inserted && !async { + // Step 23.c: classic, has src, was parser-inserted, is not async. + ExternalScriptKind::ParsingBlocking + } else if !async && !self.non_blocking.get() { + // Step 23.d: classic, has src, is not async, is not non-blocking. + ExternalScriptKind::AsapInOrder + } else { + // Step 23.f: classic, has src. + ExternalScriptKind::Asap + }; // Step 21.6. - fetch_a_classic_script(self, kind, url, cors_setting, integrity_metadata.to_owned(), encoding); + fetch_a_classic_script( + self, + kind, + url, + cors_setting, + integrity_metadata.to_owned(), + encoding, + ); // Step 23. match kind { ExternalScriptKind::Deferred => doc.add_deferred_script(self), - ExternalScriptKind::ParsingBlocking => doc.set_pending_parsing_blocking_script(self, None), + 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), } @@ -444,8 +478,10 @@ impl HTMLScriptElement { // Step 23. if was_parser_inserted && - doc.get_current_parser().map_or(false, |parser| parser.script_nesting_level() <= 1) && - doc.get_script_blocking_stylesheets_count() > 0 { + doc.get_current_parser() + .map_or(false, |parser| parser.script_nesting_level() <= 1) && + doc.get_script_blocking_stylesheets_count() > 0 + { // Step 23.h: classic, has no src, was parser-inserted, is blocked on stylesheet. doc.set_pending_parsing_blocking_script(self, Some(result)); } else { @@ -461,9 +497,10 @@ impl HTMLScriptElement { } match Command::new("js-beautify") - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() { + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + { Err(_) => { warn!("Failed to execute js-beautify. Will store unmodified script"); }, @@ -512,7 +549,7 @@ impl HTMLScriptElement { warn!("error loading script {:?}", e); self.dispatch_error_event(); return; - } + }, Ok(script) => script, }; @@ -564,28 +601,44 @@ impl HTMLScriptElement { // Steps 4-10 let window = window_from_node(self); - let line_number = if script.external { 1 } else { self.line_number as u32 }; + let line_number = if script.external { + 1 + } else { + self.line_number as u32 + }; rooted!(in(window.get_cx()) let mut rval = UndefinedValue()); let global = window.upcast::(); global.evaluate_script_on_global_with_result( - &script.text, script.url.as_str(), rval.handle_mut(), line_number); + &script.text, + script.url.as_str(), + rval.handle_mut(), + line_number, + ); } pub fn queue_error_event(&self) { let window = window_from_node(self); - window.dom_manipulation_task_source().queue_simple_event(self.upcast(), atom!("error"), &window); + window.dom_manipulation_task_source().queue_simple_event( + self.upcast(), + atom!("error"), + &window, + ); } pub fn dispatch_load_event(&self) { - self.dispatch_event(atom!("load"), - EventBubbles::DoesNotBubble, - EventCancelable::NotCancelable); + self.dispatch_event( + atom!("load"), + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable, + ); } pub fn dispatch_error_event(&self) { - self.dispatch_event(atom!("error"), - EventBubbles::DoesNotBubble, - EventCancelable::NotCancelable); + self.dispatch_event( + atom!("error"), + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable, + ); } pub fn is_javascript(&self) -> bool { @@ -599,7 +652,8 @@ impl HTMLScriptElement { }, Some(s) => { debug!("script type={}", &**s); - SCRIPT_JS_MIMES.contains(&s.to_ascii_lowercase().trim_matches(HTML_SPACE_CHARACTERS)) + SCRIPT_JS_MIMES + .contains(&s.to_ascii_lowercase().trim_matches(HTML_SPACE_CHARACTERS)) }, None => { debug!("no script type"); @@ -618,11 +672,11 @@ impl HTMLScriptElement { None => { debug!("no script type or language, inferring js"); true - } + }, }; // https://github.com/rust-lang/rust/issues/21114 is_js - } + }, }; // https://github.com/rust-lang/rust/issues/21114 is_js @@ -636,10 +690,12 @@ impl HTMLScriptElement { self.already_started.set(already_started); } - fn dispatch_event(&self, - type_: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable) -> EventStatus { + fn dispatch_event( + &self, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + ) -> EventStatus { let window = window_from_node(self); let event = Event::new(window.upcast(), type_, bubbles, cancelable); event.fire(self.upcast()) @@ -684,15 +740,21 @@ impl VirtualMethods for HTMLScriptElement { } } - fn cloning_steps(&self, copy: &Node, maybe_doc: Option<&Document>, - clone_children: CloneChildrenFlag) { + fn cloning_steps( + &self, + copy: &Node, + maybe_doc: Option<&Document>, + clone_children: CloneChildrenFlag, + ) { if let Some(ref s) = self.super_type() { s.cloning_steps(copy, maybe_doc, clone_children); } // https://html.spec.whatwg.org/multipage/#already-started if self.already_started.get() { - copy.downcast::().unwrap().set_already_started(true); + copy.downcast::() + .unwrap() + .set_already_started(true); } } } @@ -716,13 +778,16 @@ impl HTMLScriptElementMethods for HTMLScriptElement { // https://html.spec.whatwg.org/multipage/#dom-script-async fn Async(&self) -> bool { - self.non_blocking.get() || self.upcast::().has_attribute(&local_name!("async")) + self.non_blocking.get() || self + .upcast::() + .has_attribute(&local_name!("async")) } // https://html.spec.whatwg.org/multipage/#dom-script-async fn SetAsync(&self, value: bool) { self.non_blocking.set(false); - self.upcast::().set_bool_attribute(&local_name!("async"), value); + self.upcast::() + .set_bool_attribute(&local_name!("async"), value); } // https://html.spec.whatwg.org/multipage/#dom-script-defer -- cgit v1.2.3 From 45f7199eee82c66637ec68287eafa40a651001c4 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 1 Nov 2018 23:45:06 +0100 Subject: `cargo fix --edition` --- components/script/dom/htmlscriptelement.rs | 54 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index d78a04e93e0..10ecc1786c0 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -2,26 +2,26 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use document_loader::LoadType; -use dom::attr::Attr; -use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; -use dom::bindings::codegen::Bindings::HTMLScriptElementBinding; -use dom::bindings::codegen::Bindings::HTMLScriptElementBinding::HTMLScriptElementMethods; -use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::inheritance::Castable; -use dom::bindings::refcounted::Trusted; -use dom::bindings::reflector::DomObject; -use dom::bindings::root::{Dom, DomRoot, RootedReference}; -use dom::bindings::str::DOMString; -use dom::document::Document; -use dom::element::{AttributeMutation, Element, ElementCreator}; -use dom::element::{cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute}; -use dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; -use dom::globalscope::GlobalScope; -use dom::htmlelement::HTMLElement; -use dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; -use dom::node::{document_from_node, window_from_node}; -use dom::virtualmethods::VirtualMethods; +use crate::document_loader::LoadType; +use crate::dom::attr::Attr; +use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; +use crate::dom::bindings::codegen::Bindings::HTMLScriptElementBinding; +use crate::dom::bindings::codegen::Bindings::HTMLScriptElementBinding::HTMLScriptElementMethods; +use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::refcounted::Trusted; +use crate::dom::bindings::reflector::DomObject; +use crate::dom::bindings::root::{Dom, DomRoot, RootedReference}; +use crate::dom::bindings::str::DOMString; +use crate::dom::document::Document; +use crate::dom::element::{AttributeMutation, Element, ElementCreator}; +use crate::dom::element::{cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute}; +use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; +use crate::dom::globalscope::GlobalScope; +use crate::dom::htmlelement::HTMLElement; +use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; +use crate::dom::node::{document_from_node, window_from_node}; +use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; @@ -30,7 +30,7 @@ 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}; -use network_listener::{NetworkListener, PreInvoke}; +use crate::network_listener::{NetworkListener, PreInvoke}; use servo_atoms::Atom; use servo_config::opts; use servo_url::ServoUrl; @@ -41,7 +41,7 @@ use std::path::PathBuf; use std::process::{Command, Stdio}; use std::sync::{Arc, Mutex}; use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec}; -use task_source::TaskSourceName; +use crate::task_source::TaskSourceName; use uuid::Uuid; #[dom_struct] @@ -320,9 +320,9 @@ impl HTMLScriptElement { // Step 3. let element = self.upcast::(); - let async = element.has_attribute(&local_name!("async")); + let r#async = element.has_attribute(&local_name!("async")); // Note: confusingly, this is done if the element does *not* have an "async" attribute. - if was_parser_inserted && !async { + if was_parser_inserted && !r#async { self.non_blocking.set(true); } @@ -438,13 +438,13 @@ impl HTMLScriptElement { // Preparation for step 23. let kind = - if element.has_attribute(&local_name!("defer")) && was_parser_inserted && !async { + if element.has_attribute(&local_name!("defer")) && was_parser_inserted && !r#async { // Step 23.a: classic, has src, has defer, was parser-inserted, is not async. ExternalScriptKind::Deferred - } else if was_parser_inserted && !async { + } else if was_parser_inserted && !r#async { // Step 23.c: classic, has src, was parser-inserted, is not async. ExternalScriptKind::ParsingBlocking - } else if !async && !self.non_blocking.get() { + } else if !r#async && !self.non_blocking.get() { // Step 23.d: classic, has src, is not async, is not non-blocking. ExternalScriptKind::AsapInOrder } else { -- cgit v1.2.3 From 76e59a46d3aff701b2e8dfbaf047f6d5c3edcced Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 1 Nov 2018 17:23:56 +0100 Subject: Sort `use` statements --- components/script/dom/htmlscriptelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 10ecc1786c0..2b941b909dc 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -22,6 +22,8 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::node::{document_from_node, window_from_node}; use crate::dom::virtualmethods::VirtualMethods; +use crate::network_listener::{NetworkListener, PreInvoke}; +use crate::task_source::TaskSourceName; use dom_struct::dom_struct; use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; @@ -30,7 +32,6 @@ 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}; -use crate::network_listener::{NetworkListener, PreInvoke}; use servo_atoms::Atom; use servo_config::opts; use servo_url::ServoUrl; @@ -41,7 +42,6 @@ use std::path::PathBuf; use std::process::{Command, Stdio}; use std::sync::{Arc, Mutex}; use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec}; -use crate::task_source::TaskSourceName; use uuid::Uuid; #[dom_struct] -- cgit v1.2.3 From cb07debcb6f3d3561177ce536c320986720791b7 Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Tue, 6 Nov 2018 13:01:35 +0100 Subject: Format remaining files --- components/script/dom/htmlscriptelement.rs | 33 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 2b941b909dc..dca27b6b7cd 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -184,7 +184,8 @@ impl FetchResponseListener for ScriptContext { .and_then(|m| match m.status { Some((c, _)) => Some(c), _ => None, - }).unwrap_or(0); + }) + .unwrap_or(0); self.status = match status_code { 0 => Err(NetworkError::Internal( @@ -437,20 +438,22 @@ impl HTMLScriptElement { }; // Preparation for step 23. - let kind = - if element.has_attribute(&local_name!("defer")) && was_parser_inserted && !r#async { - // Step 23.a: classic, has src, has defer, was parser-inserted, is not async. - ExternalScriptKind::Deferred - } else if was_parser_inserted && !r#async { - // Step 23.c: classic, has src, was parser-inserted, is not async. - ExternalScriptKind::ParsingBlocking - } else if !r#async && !self.non_blocking.get() { - // Step 23.d: classic, has src, is not async, is not non-blocking. - ExternalScriptKind::AsapInOrder - } else { - // Step 23.f: classic, has src. - ExternalScriptKind::Asap - }; + let kind = if element.has_attribute(&local_name!("defer")) && + was_parser_inserted && + !r#async + { + // Step 23.a: classic, has src, has defer, was parser-inserted, is not async. + ExternalScriptKind::Deferred + } else if was_parser_inserted && !r#async { + // Step 23.c: classic, has src, was parser-inserted, is not async. + ExternalScriptKind::ParsingBlocking + } else if !r#async && !self.non_blocking.get() { + // Step 23.d: classic, has src, is not async, is not non-blocking. + ExternalScriptKind::AsapInOrder + } else { + // Step 23.f: classic, has src. + ExternalScriptKind::Asap + }; // Step 21.6. fetch_a_classic_script( -- cgit v1.2.3 From 9e92eb205a2a12fe0be883e42cb7f82deebc9031 Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Tue, 6 Nov 2018 20:38:02 +0100 Subject: Reorder imports --- components/script/dom/htmlscriptelement.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index dca27b6b7cd..1cc66221848 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -14,13 +14,15 @@ use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot, RootedReference}; use crate::dom::bindings::str::DOMString; use crate::dom::document::Document; +use crate::dom::element::{ + cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute, +}; use crate::dom::element::{AttributeMutation, Element, ElementCreator}; -use crate::dom::element::{cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute}; use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; -use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::node::{document_from_node, window_from_node}; +use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::virtualmethods::VirtualMethods; use crate::network_listener::{NetworkListener, PreInvoke}; use crate::task_source::TaskSourceName; @@ -30,8 +32,8 @@ use html5ever::{LocalName, Prefix}; 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}; +use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use servo_atoms::Atom; use servo_config::opts; use servo_url::ServoUrl; @@ -41,7 +43,7 @@ use std::io::{Read, Write}; use std::path::PathBuf; use std::process::{Command, Stdio}; use std::sync::{Arc, Mutex}; -use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec}; +use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; use uuid::Uuid; #[dom_struct] -- cgit v1.2.3 From 2012be4a8bd97f2fd69f986c8fffb1af1eec21dc Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 1 Nov 2018 21:43:04 +0100 Subject: `cargo fix --edition-idioms` --- components/script/dom/htmlscriptelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1cc66221848..47a4950b3d6 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -708,8 +708,8 @@ impl HTMLScriptElement { } impl VirtualMethods for HTMLScriptElement { - fn super_type(&self) -> Option<&VirtualMethods> { - Some(self.upcast::() as &VirtualMethods) + fn super_type(&self) -> Option<&dyn VirtualMethods> { + Some(self.upcast::() as &dyn VirtualMethods) } fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { -- cgit v1.2.3 From 75eb94afcaae2f868ecccba5b5dcea4066998d7a Mon Sep 17 00:00:00 2001 From: Agustin Chiappe Berrini Date: Mon, 24 Sep 2018 19:31:59 -0400 Subject: Unify the task source and task canceller API I moved away from the `Window` struct all the logic to handle task sources, into a new struct called `TaskManager`. In a happy world, I'd be able to just have there two functions, of the types: ```rust fn task_source(&self, name: TaskSourceName) -> Box fn task_source_with_canceller(&self, name: TaskSourceName) -> (Box, TaskSourceCanceller) ``` And not so much duplicated code. However, because TaskSource can't be a trait object (because it has generic type parameters), that's not possible. Instead, I decided to reduce duplicated logic through macros. For reasons[1], I have to pass both the name of the function with canceller and the name of the function without, as I'm not able to concatenate them in the macro itself. I could probably use `concat_idents` to create both types already defined and reduce the amount of arguments by one, but that macro is nightly only. At the same time, not being able to declare macros inside `impl` forces me to pass `self` as an argument. All this makes this solution more verbose than it would be ideally. It does reduce duplication, but it doesn't reduce the size of the file. [1](https://github.com/rust-lang/rust/issues/29599) --- components/script/dom/htmlscriptelement.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 47a4950b3d6..d93b5357e24 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -25,7 +25,6 @@ use crate::dom::node::{document_from_node, window_from_node}; use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::virtualmethods::VirtualMethods; use crate::network_listener::{NetworkListener, PreInvoke}; -use crate::task_source::TaskSourceName; use dom_struct::dom_struct; use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; @@ -294,10 +293,14 @@ fn fetch_a_classic_script( })); let (action_sender, action_receiver) = ipc::channel().unwrap(); + let (task_source, canceller) = doc + .window() + .task_manager() + .networking_task_source_with_canceller(); let listener = NetworkListener { - context: context, - task_source: doc.window().networking_task_source(), - canceller: Some(doc.window().task_canceller(TaskSourceName::Networking)), + context, + task_source, + canceller: Some(canceller), }; ROUTER.add_route( @@ -623,11 +626,10 @@ impl HTMLScriptElement { pub fn queue_error_event(&self) { let window = window_from_node(self); - window.dom_manipulation_task_source().queue_simple_event( - self.upcast(), - atom!("error"), - &window, - ); + window + .task_manager() + .dom_manipulation_task_source() + .queue_simple_event(self.upcast(), atom!("error"), &window); } pub fn dispatch_load_event(&self) { -- cgit v1.2.3 From a1a14459c141afc6ac6771b8a6c9ca374537edf2 Mon Sep 17 00:00:00 2001 From: Jan Andre Ikenmeyer Date: Mon, 19 Nov 2018 14:47:12 +0100 Subject: Update MPL license to https (part 3) --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index d93b5357e24..bc70965b1ab 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -1,6 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::document_loader::LoadType; use crate::dom::attr::Attr; -- cgit v1.2.3 From 26007fddd3f8aabfe026f06de64207d31edf5318 Mon Sep 17 00:00:00 2001 From: ddh Date: Mon, 12 Mar 2018 22:24:41 +0000 Subject: refactored performance timing to align with updated spec refactoring with ResourceFetchMetadata implemented deprecated window.timing functionality created ResourceTimingListener trait fixed w3c links in navigation timing updated include.ini to run resource timing tests on ci --- components/script/dom/htmlscriptelement.rs | 38 ++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index bc70965b1ab..a76f506f352 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -23,8 +23,9 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{document_from_node, window_from_node}; use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; +use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; -use crate::network_listener::{NetworkListener, PreInvoke}; +use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; use dom_struct::dom_struct; use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; @@ -33,6 +34,7 @@ use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode}; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; +use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_atoms::Atom; use servo_config::opts; use servo_url::ServoUrl; @@ -166,6 +168,8 @@ struct ScriptContext { url: ServoUrl, /// Indicates whether the request failed, and why status: Result<(), NetworkError>, + /// Timing object for this resource + resource_timing: ResourceFetchTiming, } impl FetchResponseListener for ScriptContext { @@ -208,7 +212,7 @@ impl FetchResponseListener for ScriptContext { /// /// step 4-9 - fn process_response_eof(&mut self, response: Result<(), NetworkError>) { + fn process_response_eof(&mut self, response: Result) { // Step 5. let load = response.and(self.status.clone()).map(|_| { let metadata = self.metadata.take().unwrap(); @@ -241,6 +245,35 @@ impl FetchResponseListener for ScriptContext { document.finish_load(LoadType::Script(self.url.clone())); } + + fn resource_timing_mut(&mut self) -> &mut ResourceFetchTiming { + &mut self.resource_timing + } + + fn resource_timing(&self) -> &ResourceFetchTiming { + &self.resource_timing + } + + fn submit_resource_timing(&mut self) { + network_listener::submit_timing(self) + } +} + +impl ResourceTimingListener for ScriptContext { + fn resource_timing_information(&self) -> (InitiatorType, ServoUrl) { + let initiator_type = InitiatorType::LocalName( + self.elem + .root() + .upcast::() + .local_name() + .to_string(), + ); + (initiator_type, self.url.clone()) + } + + fn resource_timing_global(&self) -> DomRoot { + (document_from_node(&*self.elem.root()).global()) + } } impl PreInvoke for ScriptContext {} @@ -290,6 +323,7 @@ fn fetch_a_classic_script( metadata: None, url: url.clone(), status: Ok(()), + resource_timing: ResourceFetchTiming::new(ResourceTimingType::Resource), })); let (action_sender, action_receiver) = ipc::channel().unwrap(); -- cgit v1.2.3 From fc2d810bce22d4432fd22f30ac4ee06944671612 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Sun, 9 Dec 2018 23:52:42 -0500 Subject: Delay iframe and script element processing until the DOM is stable. --- components/script/dom/htmlscriptelement.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index a76f506f352..5bbb5b45dc5 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -777,7 +777,10 @@ impl VirtualMethods for HTMLScriptElement { } if tree_in_doc && !self.parser_inserted.get() { - self.prepare(); + let script = Trusted::new(self); + document_from_node(self).add_delayed_task(task!(ScriptDelayedInitialize: move || { + script.root().prepare(); + })); } } -- cgit v1.2.3 From c46508e497e503c8fd42deb26aa536060334a9c9 Mon Sep 17 00:00:00 2001 From: Dan Robertson Date: Fri, 14 Dec 2018 03:59:03 +0000 Subject: Update src/href attributes to be a USVString The following IDLs have the src/href attributes typed as a DOMString while in the spec the attribute has been updated to be a USVString: - HTMLIFrameElement - HTMLImageElement - HTMLInputElement - HTMLLinkElement - HTMLMediaElement - HTMLScriptElement --- components/script/dom/htmlscriptelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index a76f506f352..c2db4c3958c 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -12,7 +12,7 @@ use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot, RootedReference}; -use crate::dom::bindings::str::DOMString; +use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::document::Document; use crate::dom::element::{ cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute, @@ -805,7 +805,7 @@ impl HTMLScriptElementMethods for HTMLScriptElement { make_url_getter!(Src, "src"); // https://html.spec.whatwg.org/multipage/#dom-script-src - make_setter!(SetSrc, "src"); + make_url_setter!(SetSrc, "src"); // https://html.spec.whatwg.org/multipage/#dom-script-type make_getter!(Type, "type"); -- cgit v1.2.3 From be69f9c3e6a6f5efb5ba1edd50955cb12c111bf8 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 14 Dec 2018 08:31:30 +0100 Subject: Rustfmt has changed its default style :/ --- components/script/dom/htmlscriptelement.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1e827331e53..8aa536c15eb 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -779,8 +779,8 @@ impl VirtualMethods for HTMLScriptElement { if tree_in_doc && !self.parser_inserted.get() { let script = Trusted::new(self); document_from_node(self).add_delayed_task(task!(ScriptDelayedInitialize: move || { - script.root().prepare(); - })); + script.root().prepare(); + })); } } @@ -822,9 +822,9 @@ impl HTMLScriptElementMethods for HTMLScriptElement { // https://html.spec.whatwg.org/multipage/#dom-script-async fn Async(&self) -> bool { - self.non_blocking.get() || self - .upcast::() - .has_attribute(&local_name!("async")) + self.non_blocking.get() || + self.upcast::() + .has_attribute(&local_name!("async")) } // https://html.spec.whatwg.org/multipage/#dom-script-async -- cgit v1.2.3 From 5fe5e5d6debef5adf234b650ee1b758e683a5230 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 10 Mar 2019 13:20:07 +0100 Subject: Remove most RootedReference uses We can replace all uses of RootedReference for Option by Option::deref calls. --- components/script/dom/htmlscriptelement.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8aa536c15eb..1aa2e6fa1f5 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -11,7 +11,7 @@ use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; -use crate::dom::bindings::root::{Dom, DomRoot, RootedReference}; +use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::document::Document; use crate::dom::element::{ @@ -409,8 +409,8 @@ impl HTMLScriptElement { // Step 13. let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); - match (for_attribute.r(), event_attribute.r()) { - (Some(for_attribute), Some(event_attribute)) => { + match (for_attribute, event_attribute) { + (Some(ref for_attribute), Some(ref event_attribute)) => { let for_value = for_attribute.value().to_ascii_lowercase(); let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS); if for_value != "window" { @@ -441,7 +441,7 @@ impl HTMLScriptElement { // Step 18: Integrity metadata. let im_attribute = element.get_attribute(&ns!(), &local_name!("integrity")); - let integrity_val = im_attribute.r().map(|a| a.value()); + let integrity_val = im_attribute.as_ref().map(|a| a.value()); let integrity_metadata = match integrity_val { Some(ref value) => &***value, None => "", @@ -619,7 +619,7 @@ impl HTMLScriptElement { self.run_a_classic_script(&script); // Step 6. - document.set_current_script(old_script.r()); + document.set_current_script(old_script.deref()); // Step 7. if let Some(doc) = neutralized_doc { -- cgit v1.2.3 From 6b2be9b31de1503e90a62cc7d597dc4bd467d998 Mon Sep 17 00:00:00 2001 From: Lucas Fantacuci Date: Fri, 21 Dec 2018 17:38:22 -0200 Subject: Implementing the builder pattern for RequestInit --- components/script/dom/htmlscriptelement.rs | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1aa2e6fa1f5..d1ab54afbc2 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -32,7 +32,9 @@ use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; -use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode}; +use net_traits::request::{ + CorsSettings, CredentialsMode, Destination, RequestBuilder, RequestMode, +}; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_atoms::Atom; @@ -290,28 +292,25 @@ fn fetch_a_classic_script( let doc = document_from_node(script); // Step 1, 2. - let request = RequestInit { - url: url.clone(), - destination: Destination::Script, + let request = RequestBuilder::new(url.clone()) + .destination(Destination::Script) // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request // Step 1 - mode: match cors_setting { + .mode(match cors_setting { 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 { + .credentials_mode(match cors_setting { Some(CorsSettings::Anonymous) => CredentialsMode::CredentialsSameOrigin, _ => CredentialsMode::Include, - }, - origin: doc.origin().immutable().clone(), - pipeline_id: Some(script.global().pipeline_id()), - referrer_url: Some(doc.url()), - referrer_policy: doc.get_referrer_policy(), - integrity_metadata: integrity_metadata, - ..RequestInit::default() - }; + }) + .origin(doc.origin().immutable().clone()) + .pipeline_id(Some(script.global().pipeline_id())) + .referrer_url(Some(doc.url())) + .referrer_policy(doc.get_referrer_policy()) + .integrity_metadata(integrity_metadata); // TODO: Step 3, Add custom steps to perform fetch -- cgit v1.2.3 From 458795d4859e16e407ab91d6d2f5b1a9be942db4 Mon Sep 17 00:00:00 2001 From: krk Date: Wed, 10 Apr 2019 22:10:59 +0200 Subject: Do not unwrap empty unminified_js_dir in HTMLScriptElement.unminify_js. --- components/script/dom/htmlscriptelement.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1aa2e6fa1f5..3ab9d7b4c0e 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -556,7 +556,15 @@ impl HTMLScriptElement { }, } - let path = PathBuf::from(window_from_node(self).unminified_js_dir().unwrap()); + let path; + match window_from_node(self).unminified_js_dir() { + Some(unminified_js_dir) => path = PathBuf::from(unminified_js_dir), + None => { + warn!("Could not store script directory not found"); + return; + }, + } + let path = if script.external { // External script. let path_parts = script.url.path_segments().unwrap(); -- cgit v1.2.3 From 73cb8b9ea6baba38c8a815b93c390c6f0df84c41 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 16 Apr 2019 11:17:53 -0400 Subject: Clarify warning. --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 3ab9d7b4c0e..9eb8c1751c2 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -560,7 +560,7 @@ impl HTMLScriptElement { match window_from_node(self).unminified_js_dir() { Some(unminified_js_dir) => path = PathBuf::from(unminified_js_dir), None => { - warn!("Could not store script directory not found"); + warn!("Unminified script directory not found"); return; }, } -- cgit v1.2.3 From 2440e0f98ade12cf595fe7c791a1065b29b53d74 Mon Sep 17 00:00:00 2001 From: Russell Cousineau Date: Sun, 24 Mar 2019 23:04:17 -0700 Subject: set referrer in window.load_url - this conforms to follow-hyperlinks spec step 13 - this conforms to window-open spec step 14.3 - replace uses of `referrer_url` with `referrer` - in Request class, change "no-referrer" to "" - set websocket fetch referrer to "no-referrer" --- components/script/dom/htmlscriptelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index bf6dbe5b30a..627cfc7e779 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -33,7 +33,7 @@ use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; use net_traits::request::{ - CorsSettings, CredentialsMode, Destination, RequestBuilder, RequestMode, + CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder, RequestMode, }; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; @@ -308,7 +308,7 @@ fn fetch_a_classic_script( }) .origin(doc.origin().immutable().clone()) .pipeline_id(Some(script.global().pipeline_id())) - .referrer_url(Some(doc.url())) + .referrer(Some(Referrer::ReferrerUrl(doc.url()))) .referrer_policy(doc.get_referrer_policy()) .integrity_metadata(integrity_metadata); -- cgit v1.2.3 From 640fc04743e38491e582a6ba30ded5bebb0a3ebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Fri, 25 Jan 2019 13:00:26 +0100 Subject: Implement shadow-including root, set node as in doc when connected. Makes JS work in shadow trees --- components/script/dom/htmlscriptelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 627cfc7e779..12399c3b58e 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -778,12 +778,12 @@ impl VirtualMethods for HTMLScriptElement { } } - fn bind_to_tree(&self, tree_in_doc: bool) { + fn bind_to_tree(&self, is_connected: bool) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_in_doc); + s.bind_to_tree(is_connected); } - if tree_in_doc && !self.parser_inserted.get() { + if is_connected && !self.parser_inserted.get() { let script = Trusted::new(self); document_from_node(self).add_delayed_task(task!(ScriptDelayedInitialize: move || { script.root().prepare(); -- cgit v1.2.3 From 441357b74e38b604a60206ff38e5cf3719a15e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Sun, 27 Jan 2019 17:11:11 +0100 Subject: Add is_connected flag to node and use it to replace most uses of is_in_doc --- components/script/dom/htmlscriptelement.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 12399c3b58e..299c66a04d8 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -372,7 +372,7 @@ impl HTMLScriptElement { } // Step 5. - if !self.upcast::().is_in_doc() { + if !self.upcast::().is_connected() { return; } @@ -760,7 +760,7 @@ impl VirtualMethods for HTMLScriptElement { match *attr.local_name() { local_name!("src") => { if let AttributeMutation::Set(_) = mutation { - if !self.parser_inserted.get() && self.upcast::().is_in_doc() { + if !self.parser_inserted.get() && self.upcast::().is_connected() { self.prepare(); } } @@ -773,7 +773,7 @@ impl VirtualMethods for HTMLScriptElement { if let Some(ref s) = self.super_type() { s.children_changed(mutation); } - if !self.parser_inserted.get() && self.upcast::().is_in_doc() { + if !self.parser_inserted.get() && self.upcast::().is_connected() { self.prepare(); } } -- cgit v1.2.3 From 813b242419d41505641b433c3b38b0d0542c559d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Tue, 5 Mar 2019 18:01:59 +0100 Subject: Introduce BindContext with in_doc and connected flags Fix some is_in_doc -> is_connected mistakes --- components/script/dom/htmlscriptelement.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 299c66a04d8..8d44c4b9ffd 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -22,7 +22,7 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{document_from_node, window_from_node}; -use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; +use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; @@ -778,12 +778,12 @@ impl VirtualMethods for HTMLScriptElement { } } - fn bind_to_tree(&self, is_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(is_connected); + s.bind_to_tree(context); } - if is_connected && !self.parser_inserted.get() { + if context.tree_connected && !self.parser_inserted.get() { let script = Trusted::new(self); document_from_node(self).add_delayed_task(task!(ScriptDelayedInitialize: move || { script.root().prepare(); -- cgit v1.2.3 From 1d38bc041967b88838ed7b006aab9908e2f24474 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 19 Jun 2019 16:07:13 +0200 Subject: Fix some new warnings --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8d44c4b9ffd..369f43b6019 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -198,7 +198,7 @@ impl FetchResponseListener for ScriptContext { 0 => Err(NetworkError::Internal( "No http status code received".to_owned(), )), - 200...299 => Ok(()), // HTTP ok status codes + 200..=299 => Ok(()), // HTTP ok status codes _ => Err(NetworkError::Internal(format!( "HTTP error code {}", status_code -- cgit v1.2.3 From 42569280e290e33eac678704c070a432fb5e5e70 Mon Sep 17 00:00:00 2001 From: oneturkmen <17970732+oneturkmen@users.noreply.github.com> Date: Fri, 7 Jun 2019 23:38:01 -0600 Subject: Script: removed a few opts::get() --- components/script/dom/htmlscriptelement.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 369f43b6019..4325add0212 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -38,7 +38,6 @@ use net_traits::request::{ use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_atoms::Atom; -use servo_config::opts; use servo_url::ServoUrl; use std::cell::Cell; use std::fs::File; @@ -533,7 +532,7 @@ impl HTMLScriptElement { } fn unminify_js(&self, script: &mut ClassicScript) { - if !opts::get().unminify_js { + if !self.parser_document.window().unminify_js() { return; } -- cgit v1.2.3 From 88cacfb0098e20be70c27bfde6b74cd3290f1fe4 Mon Sep 17 00:00:00 2001 From: marmeladema Date: Mon, 22 Jul 2019 22:14:11 +0100 Subject: Modify *::get_cx methods to return a safe JSContext instead of a raw one --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 4325add0212..1af49a42f79 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -654,7 +654,7 @@ impl HTMLScriptElement { } else { self.line_number as u32 }; - rooted!(in(window.get_cx()) let mut rval = UndefinedValue()); + rooted!(in(*window.get_cx()) let mut rval = UndefinedValue()); let global = window.upcast::(); global.evaluate_script_on_global_with_result( &script.text, -- cgit v1.2.3 From c38c964f1b1d2614f50863be0b896e1700b5fea8 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 31 Jul 2019 13:34:01 +0200 Subject: Upgrade to rustc 1.38.0-nightly (dddb7fca0 2019-07-30) --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1af49a42f79..dbfda59db02 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -625,7 +625,7 @@ impl HTMLScriptElement { self.run_a_classic_script(&script); // Step 6. - document.set_current_script(old_script.deref()); + document.set_current_script(old_script.as_deref()); // Step 7. if let Some(doc) = neutralized_doc { -- cgit v1.2.3 From 96ed5ac84da29e822309418427b52c2507bbf30e Mon Sep 17 00:00:00 2001 From: CYBAI Date: Sun, 12 May 2019 17:56:41 +0900 Subject: Update spec step number --- components/script/dom/htmlscriptelement.rs | 71 ++++++++++++++++-------------- 1 file changed, 39 insertions(+), 32 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index dbfda59db02..8b5a2b2e6ca 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -364,47 +364,47 @@ impl HTMLScriptElement { self.non_blocking.set(true); } - // Step 4. + // Step 4-5. let text = self.Text(); if text.is_empty() && !element.has_attribute(&local_name!("src")) { return; } - // Step 5. + // Step 6. if !self.upcast::().is_connected() { return; } - // Step 6. + // Step 7. if !self.is_javascript() { return; } - // Step 7. + // Step 8. if was_parser_inserted { self.parser_inserted.set(true); self.non_blocking.set(false); } - // Step 8. + // Step 9. self.already_started.set(true); - // Step 9. + // Step 10. let doc = document_from_node(self); if self.parser_inserted.get() && &*self.parser_document != &*doc { return; } - // Step 10. + // Step 11. if !doc.is_scripting_enabled() { return; } - // TODO: Step 11: nomodule content attribute + // TODO: Step 12: nomodule content attribute - // TODO(#4577): Step 12: CSP. + // TODO(#4577): Step 13: CSP. - // Step 13. + // Step 14. let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); match (for_attribute, event_attribute) { @@ -424,20 +424,20 @@ impl HTMLScriptElement { (_, _) => (), } - // Step 14. + // Step 15. let encoding = element .get_attribute(&ns!(), &local_name!("charset")) .and_then(|charset| Encoding::for_label(charset.value().as_bytes())) .unwrap_or_else(|| doc.encoding()); - // Step 15. + // Step 16. let cors_setting = cors_setting_for_element(element); - // TODO: Step 16: Module script credentials mode. + // TODO: Step 17: Module script credentials mode. - // TODO: Step 17: Nonce. + // TODO: Step 18: Nonce. - // Step 18: Integrity metadata. + // Step 19: Integrity metadata. let im_attribute = element.get_attribute(&ns!(), &local_name!("integrity")); let integrity_val = im_attribute.as_ref().map(|a| a.value()); let integrity_metadata = match integrity_val { @@ -445,26 +445,30 @@ impl HTMLScriptElement { None => "", }; - // TODO: Step 19: parser state. + // TODO: Step 20: referrer policy + + // TODO: Step 21: parser state. + + // TODO: Step 22: Fetch options - // TODO: Step 20: environment settings object. + // TODO: Step 23: environment settings object. let base_url = doc.base_url(); if let Some(src) = element.get_attribute(&ns!(), &local_name!("src")) { - // Step 21. + // Step 24. - // Step 21.1. + // Step 24.1. let src = src.value(); - // Step 21.2. + // Step 24.2. if src.is_empty() { self.queue_error_event(); return; } - // Step 21.3: The "from an external file"" flag is stored in ClassicScript. + // Step 24.3: The "from an external file"" flag is stored in ClassicScript. - // Step 21.4-21.5. + // Step 24.4-24.5. let url = match base_url.join(&src) { Ok(url) => url, Err(_) => { @@ -474,25 +478,25 @@ impl HTMLScriptElement { }, }; - // Preparation for step 23. + // Preparation for step 26. let kind = if element.has_attribute(&local_name!("defer")) && was_parser_inserted && !r#async { - // Step 23.a: classic, has src, has defer, was parser-inserted, is not async. + // Step 26.a: classic, has src, has defer, was parser-inserted, is not async. ExternalScriptKind::Deferred } else if was_parser_inserted && !r#async { - // Step 23.c: classic, has src, was parser-inserted, is not async. + // Step 26.c: classic, has src, was parser-inserted, is not async. ExternalScriptKind::ParsingBlocking } else if !r#async && !self.non_blocking.get() { - // Step 23.d: classic, has src, is not async, is not non-blocking. + // Step 26.d: classic, has src, is not async, is not non-blocking. ExternalScriptKind::AsapInOrder } else { - // Step 23.f: classic, has src. + // Step 26.f: classic, has src. ExternalScriptKind::Asap }; - // Step 21.6. + // Step 24.6. fetch_a_classic_script( self, kind, @@ -512,20 +516,23 @@ impl HTMLScriptElement { ExternalScriptKind::Asap => doc.add_asap_script(self), } } else { - // Step 22. + // Step 25. assert!(!text.is_empty()); + // Step 25-1. let result = Ok(ClassicScript::internal(text, base_url)); - // Step 23. + // TODO: Step 25-2. + + // Step 26. if was_parser_inserted && doc.get_current_parser() .map_or(false, |parser| parser.script_nesting_level() <= 1) && doc.get_script_blocking_stylesheets_count() > 0 { - // Step 23.h: classic, has no src, was parser-inserted, is blocked on stylesheet. + // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet. doc.set_pending_parsing_blocking_script(self, Some(result)); } else { - // Step 23.i: otherwise. + // Step 26.i: otherwise. self.execute(result); } } -- cgit v1.2.3 From 47d8c572ce2c40a45fe49e5e1bd36ea54c060ced Mon Sep 17 00:00:00 2001 From: CYBAI Date: Sun, 12 May 2019 21:33:38 +0900 Subject: Recognize `module` as script type --- components/script/dom/htmlscriptelement.rs | 88 ++++++++++++++++++------------ 1 file changed, 54 insertions(+), 34 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8b5a2b2e6ca..c7931bfdecc 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -125,6 +125,11 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[ "text/x-javascript", ]; +pub enum ScriptType { + Classic, + Module, +} + #[derive(JSTraceable, MallocSizeOf)] pub struct ClassicScript { text: DOMString, @@ -375,10 +380,12 @@ impl HTMLScriptElement { return; } - // Step 7. - if !self.is_javascript() { + let _script_type = if let Some(ty) = self.get_script_type() { + ty + } else { + // Step 7. return; - } + }; // Step 8. if was_parser_inserted { @@ -695,45 +702,58 @@ impl HTMLScriptElement { ); } - pub fn is_javascript(&self) -> bool { + // https://html.spec.whatwg.org/multipage/#prepare-a-script Step 7. + pub fn get_script_type(&self) -> Option { let element = self.upcast::(); + let type_attr = element.get_attribute(&ns!(), &local_name!("type")); - let is_js = match type_attr.as_ref().map(|s| s.value()) { - Some(ref s) if s.is_empty() => { - // type attr exists, but empty means js + let language_attr = element.get_attribute(&ns!(), &local_name!("language")); + + let script_type = match ( + type_attr.as_ref().map(|t| t.value()), + language_attr.as_ref().map(|l| l.value()), + ) { + (Some(ref ty), _) if ty.is_empty() => { + debug!("script type empty, inferring js"); + Some(ScriptType::Classic) + }, + (None, Some(ref lang)) if lang.is_empty() => { debug!("script type empty, inferring js"); - true + Some(ScriptType::Classic) }, - Some(s) => { - debug!("script type={}", &**s); - SCRIPT_JS_MIMES - .contains(&s.to_ascii_lowercase().trim_matches(HTML_SPACE_CHARACTERS)) + (None, None) => { + debug!("script type empty, inferring js"); + Some(ScriptType::Classic) }, - None => { - debug!("no script type"); - let language_attr = element.get_attribute(&ns!(), &local_name!("language")); - let is_js = match language_attr.as_ref().map(|s| s.value()) { - Some(ref s) if s.is_empty() => { - debug!("script language empty, inferring js"); - true - }, - Some(s) => { - debug!("script language={}", &**s); - let mut language = format!("text/{}", &**s); - language.make_ascii_lowercase(); - SCRIPT_JS_MIMES.contains(&&*language) - }, - None => { - debug!("no script type or language, inferring js"); - true - }, - }; - // https://github.com/rust-lang/rust/issues/21114 - is_js + (None, Some(ref lang)) => { + debug!("script language={}", &***lang); + let language = format!("text/{}", &***lang); + + if SCRIPT_JS_MIMES.contains(&language.to_ascii_lowercase().as_str()) { + Some(ScriptType::Classic) + } else { + None + } + }, + (Some(ref ty), _) => { + debug!("script type={}", &***ty); + + if &***ty == String::from("module") { + return Some(ScriptType::Module); + } + + if SCRIPT_JS_MIMES + .contains(&ty.to_ascii_lowercase().trim_matches(HTML_SPACE_CHARACTERS)) + { + Some(ScriptType::Classic) + } else { + None + } }, }; + // https://github.com/rust-lang/rust/issues/21114 - is_js + script_type } pub fn set_parser_inserted(&self, parser_inserted: bool) { -- cgit v1.2.3 From 608c44f1034713023af32b7a2bebc0158872299e Mon Sep 17 00:00:00 2001 From: CYBAI Date: Sun, 9 Jun 2019 01:19:51 +0900 Subject: Rename ScriptContext to ClassicContext --- components/script/dom/htmlscriptelement.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index c7931bfdecc..d47c3d7503c 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -158,7 +158,7 @@ impl ClassicScript { pub type ScriptResult = Result; /// The context required for asynchronously loading an external script source. -struct ScriptContext { +struct ClassicContext { /// The element that initiated the request. elem: Trusted, /// The kind of external script. @@ -178,7 +178,7 @@ struct ScriptContext { resource_timing: ResourceFetchTiming, } -impl FetchResponseListener for ScriptContext { +impl FetchResponseListener for ClassicContext { fn process_request_body(&mut self) {} // TODO(KiChjang): Perhaps add custom steps to perform fetch here? fn process_request_eof(&mut self) {} // TODO(KiChjang): Perhaps add custom steps to perform fetch here? @@ -265,7 +265,7 @@ impl FetchResponseListener for ScriptContext { } } -impl ResourceTimingListener for ScriptContext { +impl ResourceTimingListener for ClassicContext { fn resource_timing_information(&self) -> (InitiatorType, ServoUrl) { let initiator_type = InitiatorType::LocalName( self.elem @@ -282,7 +282,7 @@ impl ResourceTimingListener for ScriptContext { } } -impl PreInvoke for ScriptContext {} +impl PreInvoke for ClassicContext {} /// fn fetch_a_classic_script( @@ -318,7 +318,7 @@ fn fetch_a_classic_script( // TODO: Step 3, Add custom steps to perform fetch - let context = Arc::new(Mutex::new(ScriptContext { + let context = Arc::new(Mutex::new(ClassicContext { elem: Trusted::new(script), kind: kind, character_encoding: character_encoding, -- cgit v1.2.3 From 19eb2392f548d65e3879291ac2289f0e8dea94d4 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Sun, 9 Jun 2019 01:22:03 +0900 Subject: Rename ClassicScript to ScriptOrigin This is basically revert 965370c0bf. After introducing module script, we can reuse this struct and add field to see the type of script. --- components/script/dom/htmlscriptelement.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index d47c3d7503c..bc1e69b525f 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -131,23 +131,23 @@ pub enum ScriptType { } #[derive(JSTraceable, MallocSizeOf)] -pub struct ClassicScript { +pub struct ScriptOrigin { text: DOMString, url: ServoUrl, external: bool, } -impl ClassicScript { - fn internal(text: DOMString, url: ServoUrl) -> ClassicScript { - ClassicScript { +impl ScriptOrigin { + fn internal(text: DOMString, url: ServoUrl) -> ScriptOrigin { + ScriptOrigin { text: text, url: url, external: false, } } - fn external(text: DOMString, url: ServoUrl) -> ClassicScript { - ClassicScript { + fn external(text: DOMString, url: ServoUrl) -> ScriptOrigin { + ScriptOrigin { text: text, url: url, external: true, @@ -155,7 +155,7 @@ impl ClassicScript { } } -pub type ScriptResult = Result; +pub type ScriptResult = Result; /// The context required for asynchronously loading an external script source. struct ClassicContext { @@ -231,7 +231,7 @@ impl FetchResponseListener for ClassicContext { // Step 7. let (source_text, _, _) = encoding.decode(&self.data); - ClassicScript::external(DOMString::from(source_text), metadata.final_url) + ScriptOrigin::external(DOMString::from(source_text), metadata.final_url) }); // Step 9. @@ -473,7 +473,7 @@ impl HTMLScriptElement { return; } - // Step 24.3: The "from an external file"" flag is stored in ClassicScript. + // Step 24.3: The "from an external file"" flag is stored in ScriptOrigin. // Step 24.4-24.5. let url = match base_url.join(&src) { @@ -526,7 +526,7 @@ impl HTMLScriptElement { // Step 25. assert!(!text.is_empty()); // Step 25-1. - let result = Ok(ClassicScript::internal(text, base_url)); + let result = Ok(ScriptOrigin::internal(text, base_url)); // TODO: Step 25-2. @@ -545,7 +545,7 @@ impl HTMLScriptElement { } } - fn unminify_js(&self, script: &mut ClassicScript) { + fn unminify_js(&self, script: &mut ScriptOrigin) { if !self.parser_document.window().unminify_js() { return; } @@ -598,7 +598,7 @@ impl HTMLScriptElement { } /// - pub fn execute(&self, result: Result) { + pub fn execute(&self, result: Result) { // Step 1. let doc = document_from_node(self); if self.parser_inserted.get() && &*doc != &*self.parser_document { @@ -653,7 +653,7 @@ impl HTMLScriptElement { } // https://html.spec.whatwg.org/multipage/#run-a-classic-script - pub fn run_a_classic_script(&self, script: &ClassicScript) { + pub fn run_a_classic_script(&self, script: &ScriptOrigin) { // TODO use a settings object rather than this element's document/window // Step 2 let document = document_from_node(self); -- cgit v1.2.3 From 70c5cfdbdb9c4945a222503fe3873ff774537097 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Sun, 9 Jun 2019 02:02:56 +0900 Subject: Add `type_` for script origin to distinguish module or classic --- components/script/dom/htmlscriptelement.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index bc1e69b525f..fcbf4ebc330 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -125,6 +125,7 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[ "text/x-javascript", ]; +#[derive(JSTraceable, MallocSizeOf)] pub enum ScriptType { Classic, Module, @@ -135,22 +136,25 @@ pub struct ScriptOrigin { text: DOMString, url: ServoUrl, external: bool, + type_: ScriptType, } impl ScriptOrigin { - fn internal(text: DOMString, url: ServoUrl) -> ScriptOrigin { + fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, external: false, + type_, } } - fn external(text: DOMString, url: ServoUrl) -> ScriptOrigin { + fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, external: true, + type_, } } } @@ -231,7 +235,11 @@ impl FetchResponseListener for ClassicContext { // Step 7. let (source_text, _, _) = encoding.decode(&self.data); - ScriptOrigin::external(DOMString::from(source_text), metadata.final_url) + ScriptOrigin::external( + DOMString::from(source_text), + metadata.final_url, + ScriptType::Classic, + ) }); // Step 9. @@ -526,7 +534,7 @@ impl HTMLScriptElement { // Step 25. assert!(!text.is_empty()); // Step 25-1. - let result = Ok(ScriptOrigin::internal(text, base_url)); + let result = Ok(ScriptOrigin::internal(text, base_url, ScriptType::Classic)); // TODO: Step 25-2. -- cgit v1.2.3 From 95ddfb3930debb81653dffcade6c2ea15dd30d9b Mon Sep 17 00:00:00 2001 From: CYBAI Date: Thu, 5 Sep 2019 12:41:22 +0900 Subject: Show warning when the script is a module The warning can be removed in #23545. --- components/script/dom/htmlscriptelement.rs | 98 ++++++++++++++++++------------ 1 file changed, 60 insertions(+), 38 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index fcbf4ebc330..7c9e3ebd42d 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -125,7 +125,7 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[ "text/x-javascript", ]; -#[derive(JSTraceable, MallocSizeOf)] +#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)] pub enum ScriptType { Classic, Module, @@ -388,7 +388,7 @@ impl HTMLScriptElement { return; } - let _script_type = if let Some(ty) = self.get_script_type() { + let script_type = if let Some(ty) = self.get_script_type() { ty } else { // Step 7. @@ -493,50 +493,72 @@ impl HTMLScriptElement { }, }; - // Preparation for step 26. - let kind = if element.has_attribute(&local_name!("defer")) && - was_parser_inserted && - !r#async - { - // Step 26.a: classic, has src, has defer, was parser-inserted, is not async. - ExternalScriptKind::Deferred - } else if was_parser_inserted && !r#async { - // Step 26.c: classic, has src, was parser-inserted, is not async. - ExternalScriptKind::ParsingBlocking - } else if !r#async && !self.non_blocking.get() { - // Step 26.d: classic, has src, is not async, is not non-blocking. - ExternalScriptKind::AsapInOrder - } else { - // Step 26.f: classic, has src. - ExternalScriptKind::Asap - }; - - // Step 24.6. - fetch_a_classic_script( - self, - kind, - url, - cors_setting, - integrity_metadata.to_owned(), - encoding, - ); - - // Step 23. - match kind { - ExternalScriptKind::Deferred => doc.add_deferred_script(self), - ExternalScriptKind::ParsingBlocking => { - doc.set_pending_parsing_blocking_script(self, None) + match script_type { + ScriptType::Classic => { + // Preparation for step 26. + let kind = if element.has_attribute(&local_name!("defer")) && + was_parser_inserted && + !r#async + { + // Step 26.a: classic, has src, has defer, was parser-inserted, is not async. + ExternalScriptKind::Deferred + } else if was_parser_inserted && !r#async { + // Step 26.c: classic, has src, was parser-inserted, is not async. + ExternalScriptKind::ParsingBlocking + } else if !r#async && !self.non_blocking.get() { + // Step 26.d: classic, has src, is not async, is not non-blocking. + ExternalScriptKind::AsapInOrder + } else { + // Step 26.f: classic, has src. + ExternalScriptKind::Asap + }; + + // Step 24.6. + fetch_a_classic_script( + self, + kind, + url, + cors_setting, + integrity_metadata.to_owned(), + encoding, + ); + + // Step 23. + match kind { + ExternalScriptKind::Deferred => doc.add_deferred_script(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), + } + }, + ScriptType::Module => { + warn!( + "{} is a module script. It should be fixed after #23545 landed.", + url.clone() + ); }, - ExternalScriptKind::AsapInOrder => doc.push_asap_in_order_script(self), - ExternalScriptKind::Asap => doc.add_asap_script(self), } } else { // Step 25. assert!(!text.is_empty()); + // Step 25-1. - let result = Ok(ScriptOrigin::internal(text, base_url, ScriptType::Classic)); + let result = Ok(ScriptOrigin::internal( + text.clone(), + base_url.clone(), + script_type.clone(), + )); // TODO: Step 25-2. + if let ScriptType::Module = script_type { + warn!( + "{} is a module script. It should be fixed after #23545 landed.", + base_url.clone() + ); + return; + } // Step 26. if was_parser_inserted && -- cgit v1.2.3 From 1aeb97b2810606e7dd7768e9466b2857688c9b3a Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Thu, 5 Sep 2019 11:57:21 -0500 Subject: Prefetch img and scripts during parsing --- components/script/dom/htmlscriptelement.rs | 55 ++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 15 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 7c9e3ebd42d..4d2cf061804 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -32,12 +32,15 @@ use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; +use msg::constellation_msg::PipelineId; use net_traits::request::{ CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder, RequestMode, }; +use net_traits::ReferrerPolicy; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_atoms::Atom; +use servo_url::ImmutableOrigin; use servo_url::ServoUrl; use std::cell::Cell; use std::fs::File; @@ -292,19 +295,18 @@ impl ResourceTimingListener for ClassicContext { impl PreInvoke for ClassicContext {} -/// -fn fetch_a_classic_script( - script: &HTMLScriptElement, - kind: ExternalScriptKind, +/// Steps 1-2 of +// This function is also used to prefetch a script in `script::dom::servoparser::prefetch`. +pub(crate) fn script_fetch_request( url: ServoUrl, cors_setting: Option, + origin: ImmutableOrigin, + pipeline_id: PipelineId, + referrer: Referrer, + referrer_policy: Option, integrity_metadata: String, - character_encoding: &'static Encoding, -) { - let doc = document_from_node(script); - - // Step 1, 2. - let request = RequestBuilder::new(url.clone()) +) -> RequestBuilder { + RequestBuilder::new(url) .destination(Destination::Script) // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request // Step 1 @@ -318,11 +320,34 @@ fn fetch_a_classic_script( Some(CorsSettings::Anonymous) => CredentialsMode::CredentialsSameOrigin, _ => CredentialsMode::Include, }) - .origin(doc.origin().immutable().clone()) - .pipeline_id(Some(script.global().pipeline_id())) - .referrer(Some(Referrer::ReferrerUrl(doc.url()))) - .referrer_policy(doc.get_referrer_policy()) - .integrity_metadata(integrity_metadata); + .origin(origin) + .pipeline_id(Some(pipeline_id)) + .referrer(Some(referrer)) + .referrer_policy(referrer_policy) + .integrity_metadata(integrity_metadata) +} + +/// +fn fetch_a_classic_script( + script: &HTMLScriptElement, + kind: ExternalScriptKind, + url: ServoUrl, + cors_setting: Option, + integrity_metadata: String, + character_encoding: &'static Encoding, +) { + let doc = document_from_node(script); + + // Step 1, 2. + let request = script_fetch_request( + url.clone(), + cors_setting, + doc.origin().immutable().clone(), + script.global().pipeline_id(), + Referrer::ReferrerUrl(doc.url()), + doc.get_referrer_policy(), + integrity_metadata, + ); // TODO: Step 3, Add custom steps to perform fetch -- cgit v1.2.3 From 1df8d57dc6adcf56c22b45053b3d2eca904d17d3 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 3 Oct 2019 17:36:02 -0400 Subject: Support CORS attributes for image elements. --- components/script/dom/htmlscriptelement.rs | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 4d2cf061804..1bd0101c03d 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -25,6 +25,7 @@ use crate::dom::node::{document_from_node, window_from_node}; use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; +use crate::fetch::create_a_potential_CORS_request; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; use dom_struct::dom_struct; use encoding_rs::Encoding; @@ -33,9 +34,7 @@ use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; use msg::constellation_msg::PipelineId; -use net_traits::request::{ - CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder, RequestMode, -}; +use net_traits::request::{CorsSettings, Destination, Referrer, RequestBuilder}; use net_traits::ReferrerPolicy; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; @@ -306,20 +305,7 @@ pub(crate) fn script_fetch_request( referrer_policy: Option, integrity_metadata: String, ) -> RequestBuilder { - RequestBuilder::new(url) - .destination(Destination::Script) - // https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request - // Step 1 - .mode(match cors_setting { - 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, - _ => CredentialsMode::Include, - }) + create_a_potential_CORS_request(url, Destination::Script, cors_setting, None) .origin(origin) .pipeline_id(Some(pipeline_id)) .referrer(Some(referrer)) -- cgit v1.2.3 From b8f3e8bb2e9bed269a06134c902a139cfa42eb1c Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Sat, 28 Sep 2019 19:42:40 +0000 Subject: Add simple implementation of content-security-policy on scripts / styles This needs a lot more hooks before it'll actually be a good implementation, but for a start it can help get some feedback on if this is the right way to go about it. Part of servo/servo#4577 --- components/script/dom/htmlscriptelement.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1bd0101c03d..dfac55a6f66 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -27,6 +27,7 @@ use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; use crate::fetch::create_a_potential_CORS_request; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; +use content_security_policy as csp; use dom_struct::dom_struct; use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; @@ -428,7 +429,16 @@ impl HTMLScriptElement { // TODO: Step 12: nomodule content attribute - // TODO(#4577): Step 13: CSP. + // Step 13. + if !element.has_attribute(&local_name!("src")) && + doc.should_elements_inline_type_behavior_be_blocked( + &element, + csp::InlineCheckType::Script, + &text, + ) == csp::CheckResult::Blocked + { + return; + } // Step 14. let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); -- cgit v1.2.3 From 55eb34b8a92a5618ab1bfe4d4cb7f53d872a48b5 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 12 Dec 2019 10:19:10 -0500 Subject: Issue warning to devtools when module scripts in use. --- components/script/dom/htmlscriptelement.rs | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index dfac55a6f66..fdeca285e30 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -559,6 +559,10 @@ impl HTMLScriptElement { "{} is a module script. It should be fixed after #23545 landed.", url.clone() ); + self.global().issue_page_warning(&format!( + "Module scripts are not supported; {} will not be executed.", + url.clone() + )); }, } } else { @@ -578,6 +582,9 @@ impl HTMLScriptElement { "{} is a module script. It should be fixed after #23545 landed.", base_url.clone() ); + self.global().issue_page_warning( + "Module scripts are not supported; ignoring inline module script.", + ); return; } -- cgit v1.2.3 From f2007751dd12016bc01fdbe2788322be2eae0d84 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Wed, 5 Jun 2019 22:20:10 +0900 Subject: Scaffold module script --- components/script/dom/htmlscriptelement.rs | 242 +++++++++++++++++++++-------- 1 file changed, 180 insertions(+), 62 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index fdeca285e30..b594660a835 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -12,6 +12,7 @@ use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::settings_stack::AutoEntryScript; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::document::Document; use crate::dom::element::{ @@ -27,6 +28,8 @@ use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; use crate::fetch::create_a_potential_CORS_request; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; +use crate::script_module::fetch_inline_module_script; +use crate::script_module::{fetch_external_module_script, ModuleOwner}; use content_security_policy as csp; use dom_struct::dom_struct; use encoding_rs::Encoding; @@ -51,6 +54,10 @@ use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; use uuid::Uuid; +/// An unique id for script element. +#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, PartialEq)] +pub struct ScriptId(Uuid); + #[dom_struct] pub struct HTMLScriptElement { htmlelement: HTMLElement, @@ -71,6 +78,10 @@ pub struct HTMLScriptElement { /// Track line line_number line_number: u64, + + /// Unique id for each script element + #[ignore_malloc_size_of = "Defined in uuid"] + id: ScriptId, } impl HTMLScriptElement { @@ -81,6 +92,7 @@ impl HTMLScriptElement { creator: ElementCreator, ) -> HTMLScriptElement { HTMLScriptElement { + id: ScriptId(Uuid::new_v4()), htmlelement: HTMLElement::new_inherited(local_name, prefix, document), already_started: Cell::new(false), parser_inserted: Cell::new(creator.is_parser_created()), @@ -105,11 +117,15 @@ impl HTMLScriptElement { HTMLScriptElementBinding::Wrap, ) } + + pub fn get_script_id(&self) -> ScriptId { + self.id.clone() + } } /// Supported script types as defined by /// . -static SCRIPT_JS_MIMES: StaticStringVec = &[ +pub static SCRIPT_JS_MIMES: StaticStringVec = &[ "application/ecmascript", "application/javascript", "application/x-ecmascript", @@ -143,7 +159,7 @@ pub struct ScriptOrigin { } impl ScriptOrigin { - fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -152,7 +168,7 @@ impl ScriptOrigin { } } - fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -160,6 +176,10 @@ impl ScriptOrigin { type_, } } + + pub fn text(&self) -> DOMString { + self.text.clone() + } } pub type ScriptResult = Result; @@ -441,23 +461,25 @@ impl HTMLScriptElement { } // Step 14. - let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); - let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); - match (for_attribute, event_attribute) { - (Some(ref for_attribute), Some(ref event_attribute)) => { - let for_value = for_attribute.value().to_ascii_lowercase(); - let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS); - if for_value != "window" { - return; - } + if script_type == ScriptType::Classic { + let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); + let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); + match (for_attribute, event_attribute) { + (Some(ref for_attribute), Some(ref event_attribute)) => { + let for_value = for_attribute.value().to_ascii_lowercase(); + let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS); + if for_value != "window" { + return; + } - 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; - } - }, - (_, _) => (), + 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; + } + }, + (_, _) => (), + } } // Step 15. @@ -514,6 +536,7 @@ impl HTMLScriptElement { }, }; + // Step 24.6. match script_type { ScriptType::Classic => { // Preparation for step 26. @@ -555,50 +578,66 @@ impl HTMLScriptElement { } }, ScriptType::Module => { - warn!( - "{} is a module script. It should be fixed after #23545 landed.", - url.clone() + fetch_external_module_script( + ModuleOwner::Window(Trusted::new(self)), + url.clone(), + Destination::Script, ); - self.global().issue_page_warning(&format!( - "Module scripts are not supported; {} will not be executed.", - url.clone() - )); + + if !r#async && was_parser_inserted { + doc.add_deferred_script(self); + } else if !r#async && !self.non_blocking.get() { + doc.push_asap_in_order_script(self); + } else { + doc.add_asap_script(self); + }; }, } } else { // Step 25. assert!(!text.is_empty()); - // Step 25-1. + // Step 25-1. & 25-2. let result = Ok(ScriptOrigin::internal( text.clone(), base_url.clone(), script_type.clone(), )); - // TODO: Step 25-2. - if let ScriptType::Module = script_type { - warn!( - "{} is a module script. It should be fixed after #23545 landed.", - base_url.clone() - ); - self.global().issue_page_warning( - "Module scripts are not supported; ignoring inline module script.", - ); - return; - } + // Step 25-2. + match script_type { + ScriptType::Classic => { + if was_parser_inserted && + doc.get_current_parser() + .map_or(false, |parser| parser.script_nesting_level() <= 1) && + doc.get_script_blocking_stylesheets_count() > 0 + { + // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet. + doc.set_pending_parsing_blocking_script(self, Some(result)); + } else { + // Step 26.i: otherwise. + self.execute(result); + } + }, + ScriptType::Module => { + // We should add inline module script elements + // into those vectors in case that there's no + // descendants in the inline module script. + if !r#async && was_parser_inserted { + doc.add_deferred_script(self); + } else if !r#async && !self.non_blocking.get() { + doc.push_asap_in_order_script(self); + } else { + doc.add_asap_script(self); + }; - // Step 26. - if was_parser_inserted && - doc.get_current_parser() - .map_or(false, |parser| parser.script_nesting_level() <= 1) && - doc.get_script_blocking_stylesheets_count() > 0 - { - // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet. - doc.set_pending_parsing_blocking_script(self, Some(result)); - } else { - // Step 26.i: otherwise. - self.execute(result); + fetch_inline_module_script( + ModuleOwner::Window(Trusted::new(self)), + text.clone(), + base_url.clone(), + self.id.clone(), + ); + }, } } } @@ -656,7 +695,7 @@ impl HTMLScriptElement { } /// - pub fn execute(&self, result: Result) { + pub fn execute(&self, result: ScriptResult) { // Step 1. let doc = document_from_node(self); if self.parser_inserted.get() && &*doc != &*self.parser_document { @@ -674,10 +713,12 @@ impl HTMLScriptElement { Ok(script) => script, }; - self.unminify_js(&mut script); + if script.type_ == ScriptType::Classic { + self.unminify_js(&mut script); + } // Step 3. - let neutralized_doc = if script.external { + let neutralized_doc = if script.external || script.type_ == ScriptType::Module { debug!("loading external script, url = {}", script.url); let doc = document_from_node(self); doc.incr_ignore_destructive_writes_counter(); @@ -690,21 +731,24 @@ impl HTMLScriptElement { let document = document_from_node(self); let old_script = document.GetCurrentScript(); - // Step 5.a.1. - document.set_current_script(Some(self)); - - // Step 5.a.2. - self.run_a_classic_script(&script); - - // Step 6. - document.set_current_script(old_script.as_deref()); + match script.type_ { + ScriptType::Classic => { + document.set_current_script(Some(self)); + self.run_a_classic_script(&script); + document.set_current_script(old_script.as_deref()); + }, + ScriptType::Module => { + assert!(old_script.is_none()); + self.run_a_module_script(&script, false); + }, + } - // Step 7. + // Step 5. if let Some(doc) = neutralized_doc { doc.decr_ignore_destructive_writes_counter(); } - // Step 8. + // Step 6. if script.external { self.dispatch_load_event(); } @@ -736,6 +780,72 @@ impl HTMLScriptElement { ); } + #[allow(unsafe_code)] + /// https://html.spec.whatwg.org/multipage/#run-a-module-script + pub fn run_a_module_script(&self, script: &ScriptOrigin, _rethrow_errors: bool) { + // TODO use a settings object rather than this element's document/window + // Step 2 + let document = document_from_node(self); + if !document.is_fully_active() || !document.is_scripting_enabled() { + return; + } + + // Step 4 + let window = window_from_node(self); + let global = window.upcast::(); + let _aes = AutoEntryScript::new(&global); + + if script.external { + let module_map = global.get_module_map().borrow(); + + if let Some(module_tree) = module_map.get(&script.url) { + // Step 6. + { + let module_error = module_tree.get_error().borrow(); + if module_error.is_some() { + module_tree.report_error(&global); + return; + } + } + + let module_record = module_tree.get_record().borrow(); + if let Some(record) = &*module_record { + let evaluated = module_tree.execute_module(global, record.handle()); + + if let Err(exception) = evaluated { + module_tree.set_error(Some(exception.clone())); + module_tree.report_error(&global); + return; + } + } + } + } else { + let inline_module_map = global.get_inline_module_map().borrow(); + + if let Some(module_tree) = inline_module_map.get(&self.id.clone()) { + // Step 6. + { + let module_error = module_tree.get_error().borrow(); + if module_error.is_some() { + module_tree.report_error(&global); + return; + } + } + + let module_record = module_tree.get_record().borrow(); + if let Some(record) = &*module_record { + let evaluated = module_tree.execute_module(global, record.handle()); + + if let Err(exception) = evaluated { + module_tree.set_error(Some(exception.clone())); + module_tree.report_error(&global); + return; + } + } + } + } + } + pub fn queue_error_event(&self) { let window = window_from_node(self); window @@ -818,10 +928,18 @@ impl HTMLScriptElement { self.parser_inserted.set(parser_inserted); } + pub fn get_parser_inserted(&self) -> bool { + self.parser_inserted.get() + } + pub fn set_already_started(&self, already_started: bool) { self.already_started.set(already_started); } + pub fn get_non_blocking(&self) -> bool { + self.non_blocking.get() + } + fn dispatch_event( &self, type_: Atom, -- cgit v1.2.3 From cfad32cffdaa86c1ff2f57bb25c3947202f75e94 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Thu, 12 Dec 2019 00:48:14 +0900 Subject: Support `integrity` for module script --- components/script/dom/htmlscriptelement.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index b594660a835..66e70da48e8 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -582,6 +582,7 @@ impl HTMLScriptElement { ModuleOwner::Window(Trusted::new(self)), url.clone(), Destination::Script, + integrity_metadata.to_owned(), ); if !r#async && was_parser_inserted { -- cgit v1.2.3 From 5c9536acdc8aed056fa91e0e3cffd3e3e0b0ad03 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Mon, 16 Dec 2019 10:25:33 +0900 Subject: Support module script credentials mode --- components/script/dom/htmlscriptelement.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 66e70da48e8..8285b26605d 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -38,7 +38,7 @@ use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; use msg::constellation_msg::PipelineId; -use net_traits::request::{CorsSettings, Destination, Referrer, RequestBuilder}; +use net_traits::request::{CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder}; use net_traits::ReferrerPolicy; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; @@ -491,7 +491,18 @@ impl HTMLScriptElement { // Step 16. let cors_setting = cors_setting_for_element(element); - // TODO: Step 17: Module script credentials mode. + // Step 17. + let credentials_mode = match script_type { + ScriptType::Classic => None, + ScriptType::Module => Some(reflect_cross_origin_attribute(element).map_or( + CredentialsMode::CredentialsSameOrigin, + |attr| match &*attr { + "use-credentials" => CredentialsMode::Include, + "anonymous" => CredentialsMode::CredentialsSameOrigin, + _ => CredentialsMode::CredentialsSameOrigin, + }, + )), + }; // TODO: Step 18: Nonce. @@ -583,6 +594,7 @@ impl HTMLScriptElement { url.clone(), Destination::Script, integrity_metadata.to_owned(), + credentials_mode.unwrap(), ); if !r#async && was_parser_inserted { @@ -637,6 +649,7 @@ impl HTMLScriptElement { text.clone(), base_url.clone(), self.id.clone(), + credentials_mode.unwrap(), ); }, } -- cgit v1.2.3 From 1cc6435cfcf8ae2234fd7343491f3d943fdf4eeb Mon Sep 17 00:00:00 2001 From: CYBAI Date: Fri, 29 Nov 2019 12:21:55 +0900 Subject: Implement nomodule attribute --- components/script/dom/htmlscriptelement.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8285b26605d..3a55590c81d 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -447,7 +447,10 @@ impl HTMLScriptElement { return; } - // TODO: Step 12: nomodule content attribute + // Step 12 + if element.has_attribute(&local_name!("nomodule")) && script_type == ScriptType::Classic { + return; + } // Step 13. if !element.has_attribute(&local_name!("src")) && @@ -1062,6 +1065,11 @@ impl HTMLScriptElementMethods for HTMLScriptElement { // https://html.spec.whatwg.org/multipage/#dom-script-defer make_bool_setter!(SetDefer, "defer"); + // https://html.spec.whatwg.org/multipage/#dom-script-nomodule + make_bool_getter!(NoModule, "nomodule"); + // https://html.spec.whatwg.org/multipage/#dom-script-nomodule + make_bool_setter!(SetNoModule, "nomodule"); + // https://html.spec.whatwg.org/multipage/#dom-script-integrity make_getter!(Integrity, "integrity"); // https://html.spec.whatwg.org/multipage/#dom-script-integrity -- cgit v1.2.3 From f7db4b7f8011239f01c3ba2e5e402c866fbe68fb Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 18 Jan 2020 01:29:26 +0530 Subject: Modify `script` to prevent further violations of snake_case --- components/script/dom/htmlscriptelement.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 3a55590c81d..74773bad36b 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -26,7 +26,7 @@ use crate::dom::node::{document_from_node, window_from_node}; use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; -use crate::fetch::create_a_potential_CORS_request; +use crate::fetch::create_a_potential_cors_request; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; use crate::script_module::fetch_inline_module_script; use crate::script_module::{fetch_external_module_script, ModuleOwner}; @@ -326,7 +326,7 @@ pub(crate) fn script_fetch_request( referrer_policy: Option, integrity_metadata: String, ) -> RequestBuilder { - create_a_potential_CORS_request(url, Destination::Script, cors_setting, None) + create_a_potential_cors_request(url, Destination::Script, cors_setting, None) .origin(origin) .pipeline_id(Some(pipeline_id)) .referrer(Some(referrer)) -- cgit v1.2.3 From 708d3737df79e41dbd4d1e172526c32c775e46bc Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 14 Feb 2020 10:58:04 +0100 Subject: Upgrade to rustc 1.43.0-nightly (5d04ce67f 2020-02-13) --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 74773bad36b..66a2cddc777 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -309,7 +309,7 @@ impl ResourceTimingListener for ClassicContext { } fn resource_timing_global(&self) -> DomRoot { - (document_from_node(&*self.elem.root()).global()) + document_from_node(&*self.elem.root()).global() } } -- cgit v1.2.3 From 3ea6d87bcc37167464e856949a4b9b77d0e9318a Mon Sep 17 00:00:00 2001 From: YUAN LYU Date: Fri, 20 Mar 2020 22:14:18 -0400 Subject: Add trait DomObjectWrap to provide WRAP function --- components/script/dom/htmlscriptelement.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 66a2cddc777..38279b5222f 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -5,7 +5,6 @@ use crate::document_loader::LoadType; use crate::dom::attr::Attr; use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; -use crate::dom::bindings::codegen::Bindings::HTMLScriptElementBinding; use crate::dom::bindings::codegen::Bindings::HTMLScriptElementBinding::HTMLScriptElementMethods; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::inheritance::Castable; @@ -114,7 +113,6 @@ impl HTMLScriptElement { local_name, prefix, document, creator, )), document, - HTMLScriptElementBinding::Wrap, ) } -- cgit v1.2.3 From 19216627d3fff66f11b8cfac94eb80c1049027fb Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 20 Mar 2020 15:40:55 -0400 Subject: Update content-security-policy. --- components/script/dom/htmlscriptelement.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 66a2cddc777..919886e6b88 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -460,6 +460,7 @@ impl HTMLScriptElement { &text, ) == csp::CheckResult::Blocked { + warn!("Blocking inline script due to CSP"); return; } -- cgit v1.2.3 From 8f4cb28a6d86b7f22dbcc70654d67b57d451fbf4 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 22 May 2020 14:38:59 -0400 Subject: Use temporary files instead of pipes for JS unminification. --- components/script/dom/htmlscriptelement.rs | 45 ++++++++++++++++++------------ 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 03bb0d73a07..f7311ddaca4 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -46,9 +46,9 @@ use servo_url::ImmutableOrigin; use servo_url::ServoUrl; use std::cell::Cell; use std::fs::File; -use std::io::{Read, Write}; +use std::io::{Read, Seek, Write}; use std::path::PathBuf; -use std::process::{Command, Stdio}; +use std::process::Command; use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; use uuid::Uuid; @@ -663,22 +663,31 @@ impl HTMLScriptElement { return; } - match Command::new("js-beautify") - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() - { - Err(_) => { - warn!("Failed to execute js-beautify. Will store unmodified script"); - }, - Ok(process) => { - let mut script_content = String::from(script.text.clone()); - let _ = process.stdin.unwrap().write_all(script_content.as_bytes()); - script_content.clear(); - let _ = process.stdout.unwrap().read_to_string(&mut script_content); - - script.text = DOMString::from(script_content); - }, + // Write the minified code to a temporary file and pass its path as an argument + // to js-beautify to read from. Meanwhile, redirect the process' stdout into + // another temporary file and read that into a string. This avoids some hangs + // observed on macOS when using direct input/output pipes with very large + // unminified content. + let (input, output) = (tempfile::NamedTempFile::new(), tempfile::tempfile()); + if let (Ok(mut input), Ok(mut output)) = (input, output) { + input.write_all(script.text.as_bytes()).unwrap(); + match Command::new("js-beautify") + .arg(input.path()) + .stdout(output.try_clone().unwrap()) + .status() + { + Ok(status) if status.success() => { + let mut script_content = String::new(); + output.seek(std::io::SeekFrom::Start(0)).unwrap(); + output.read_to_string(&mut script_content).unwrap(); + script.text = DOMString::from(script_content); + }, + _ => { + warn!("Failed to execute js-beautify. Will store unmodified script"); + }, + } + } else { + warn!("Error creating input and output files for unminify"); } let path; -- cgit v1.2.3 From a0df94bddcc71e03961fea76f2bf7569eaeb3a53 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Wed, 27 May 2020 11:22:04 +0900 Subject: Set `currentScript` to `null` for module scripts I misunderstood the test case when I worked on #23545. That test case is actually not related to dynamic import; instead, the reason why it crashes is, `currentScript` should be updated to `null`. --- components/script/dom/htmlscriptelement.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index f7311ddaca4..8d0d9f219c1 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -756,14 +756,18 @@ impl HTMLScriptElement { let document = document_from_node(self); let old_script = document.GetCurrentScript(); + match script.type_ { + ScriptType::Classic => document.set_current_script(Some(self)), + ScriptType::Module => document.set_current_script(None), + } + match script.type_ { ScriptType::Classic => { - document.set_current_script(Some(self)); self.run_a_classic_script(&script); document.set_current_script(old_script.as_deref()); }, ScriptType::Module => { - assert!(old_script.is_none()); + assert!(document.GetCurrentScript().is_none()); self.run_a_module_script(&script, false); }, } -- cgit v1.2.3 From ee6906443f9c60c60e38e6f6daaeb585fa886540 Mon Sep 17 00:00:00 2001 From: skrzyp1 Date: Tue, 2 Jun 2020 19:32:52 +0200 Subject: reading unminified scripts from disk --- components/script/dom/htmlscriptelement.rs | 66 +++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 10 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 8d0d9f219c1..f98e7df100a 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -45,7 +45,7 @@ use servo_atoms::Atom; use servo_url::ImmutableOrigin; use servo_url::ServoUrl; use std::cell::Cell; -use std::fs::File; +use std::fs::{create_dir_all, read_to_string, File}; use std::io::{Read, Seek, Write}; use std::path::PathBuf; use std::process::Command; @@ -698,17 +698,34 @@ impl HTMLScriptElement { return; }, } - - let path = if script.external { + let (base, has_name) = match script.url.as_str().ends_with("/") { + true => ( + path.join(&script.url[url::Position::BeforeHost..]) + .as_path() + .to_owned(), + false, + ), + false => ( + path.join(&script.url[url::Position::BeforeHost..]) + .parent() + .unwrap() + .to_owned(), + true, + ), + }; + match create_dir_all(base.clone()) { + Ok(()) => debug!("Created base dir: {:?}", base), + Err(e) => { + debug!("Failed to create base dir: {:?}, {:?}", base, e); + return; + }, + } + let path = if script.external && has_name { // External script. - let path_parts = script.url.path_segments().unwrap(); - match path_parts.last() { - Some(script_name) => path.join(script_name), - None => path.join(Uuid::new_v4().to_string()), - } + path.join(&script.url[url::Position::BeforeHost..]) } else { - // Inline script. - path.join(Uuid::new_v4().to_string()) + // Inline script or url ends with '/' + base.join(Uuid::new_v4().to_string()) }; debug!("script will be stored in {:?}", path); @@ -719,6 +736,34 @@ impl HTMLScriptElement { } } + fn substitute_with_local_script(&self, script: &mut ScriptOrigin) { + if self + .parser_document + .window() + .local_script_source() + .is_none() || + !script.external + { + return; + } + let mut path = PathBuf::from( + self.parser_document + .window() + .local_script_source() + .clone() + .unwrap(), + ); + path = path.join(&script.url[url::Position::BeforeHost..]); + debug!("Attempting to read script stored at: {:?}", path); + match read_to_string(path.clone()) { + Ok(local_script) => { + debug!("Found script stored at: {:?}", path); + script.text = DOMString::from(local_script); + }, + Err(why) => warn!("Could not restore script from file {:?}", why), + } + } + /// pub fn execute(&self, result: ScriptResult) { // Step 1. @@ -740,6 +785,7 @@ impl HTMLScriptElement { if script.type_ == ScriptType::Classic { self.unminify_js(&mut script); + self.substitute_with_local_script(&mut script); } // Step 3. -- cgit v1.2.3 From dc2c2c8dfb0e56dd6714c19f14c822825360ffac Mon Sep 17 00:00:00 2001 From: CYBAI Date: Sun, 3 May 2020 01:34:33 +0900 Subject: Move away from Promise.all way and check if we need to finish manually In the previous Promise.all way, we registered a promise for every module script which means we will need to do many complex checkings like "is this top level?" and it will make us much more difficult to understand how the module script algorithm works. In the new manual checking way, we will only register promises for top level modules to notify its owner (e.g. the script element) to finish the load. So, we can understand it much more easily and would be more spec-aligned. Also, I think the `Ready` and `FetchFailed` status are quite confusing and we actually don't need them so they're removed in this patch. Then, we will always go to `Finished` instead. It would basically be following steps: +-----------------+ | Failed to fetch | ----------+ +--------------+ +----------+ / +-----------------+ | | Fetch module | ----> | Fetching | ---+ v +--------------+ +----------+ \ +---------+ +---------------------+ | Fetched | | Advance to Finished | +---------+ +---------------------+ | ^ v | +-------------------+ | | Fetch descendants | ----- if no descendants +-------------------+ | V +----------------------+ | Fetching Descendants | +----------------------+ In `Advance to Finished`, it means that module script is about to finished so it will 1. Notify all of its `ready` and `not finished` parents to finish 2. Link (instantiate) the module 3. Resolve its promise to notify owner(s) to finish --- components/script/dom/htmlscriptelement.rs | 68 ++++++++++++------------------ 1 file changed, 28 insertions(+), 40 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index f98e7df100a..bf3de043ff5 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -870,52 +870,40 @@ impl HTMLScriptElement { let global = window.upcast::(); let _aes = AutoEntryScript::new(&global); - if script.external { - let module_map = global.get_module_map().borrow(); - - if let Some(module_tree) = module_map.get(&script.url) { - // Step 6. - { - let module_error = module_tree.get_error().borrow(); - if module_error.is_some() { - module_tree.report_error(&global); - return; - } - } - - let module_record = module_tree.get_record().borrow(); - if let Some(record) = &*module_record { - let evaluated = module_tree.execute_module(global, record.handle()); + let tree = if script.external { + global.get_module_map().borrow().get(&script.url).cloned() + } else { + global + .get_inline_module_map() + .borrow() + .get(&self.id.clone()) + .cloned() + }; - if let Err(exception) = evaluated { - module_tree.set_error(Some(exception.clone())); - module_tree.report_error(&global); - return; - } + if let Some(module_tree) = tree { + // Step 6. + { + let module_error = module_tree.get_rethrow_error().borrow(); + let network_error = module_tree.get_network_error().borrow(); + if module_error.is_some() && network_error.is_none() { + module_tree.report_error(&global); + return; } } - } else { - let inline_module_map = global.get_inline_module_map().borrow(); - if let Some(module_tree) = inline_module_map.get(&self.id.clone()) { - // Step 6. - { - let module_error = module_tree.get_error().borrow(); - if module_error.is_some() { - module_tree.report_error(&global); - return; - } - } + let record = module_tree + .get_record() + .borrow() + .as_ref() + .map(|record| record.handle()); - let module_record = module_tree.get_record().borrow(); - if let Some(record) = &*module_record { - let evaluated = module_tree.execute_module(global, record.handle()); + if let Some(record) = record { + let evaluated = module_tree.execute_module(global, record); - if let Err(exception) = evaluated { - module_tree.set_error(Some(exception.clone())); - module_tree.report_error(&global); - return; - } + if let Err(exception) = evaluated { + module_tree.set_rethrow_error(exception); + module_tree.report_error(&global); + return; } } } -- cgit v1.2.3 From fa18cf620f1c271bee8808026ab40ffbaa11aee6 Mon Sep 17 00:00:00 2001 From: Matthias Deiml Date: Mon, 15 Jun 2020 18:44:59 +0200 Subject: Make url for "client" referrer mandatory --- components/script/dom/htmlscriptelement.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index bf3de043ff5..9b9bbb619f7 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -324,10 +324,9 @@ pub(crate) fn script_fetch_request( referrer_policy: Option, integrity_metadata: String, ) -> RequestBuilder { - create_a_potential_cors_request(url, Destination::Script, cors_setting, None) + create_a_potential_cors_request(url, Destination::Script, cors_setting, None, referrer) .origin(origin) .pipeline_id(Some(pipeline_id)) - .referrer(Some(referrer)) .referrer_policy(referrer_policy) .integrity_metadata(integrity_metadata) } -- cgit v1.2.3 From 47355766ed72b7b4855f1119a1a42f4b5e5d68ce Mon Sep 17 00:00:00 2001 From: Matthias Deiml Date: Tue, 16 Jun 2020 00:35:46 +0200 Subject: Fix invalid use of ReferrerUrl --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 9b9bbb619f7..fb5bca5fb2c 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -348,7 +348,7 @@ fn fetch_a_classic_script( cors_setting, doc.origin().immutable().clone(), script.global().pipeline_id(), - Referrer::ReferrerUrl(doc.url()), + script.global().get_referrer(), doc.get_referrer_policy(), integrity_metadata, ); -- cgit v1.2.3 From 69881e8b062f55b40ee0bb587b7478e46fc18674 Mon Sep 17 00:00:00 2001 From: Camelid Date: Tue, 14 Jul 2020 20:32:37 -0700 Subject: Use `Rc` instead of cloning the `DOMString` Specifically, I changed the `text` field of `ScriptOrigin` from a `DOMString` to an `Rc`. Then I updated all the related code to work with an `Rc`. This is just a first pass to get the code to compile. There are probably more things I can do that will improve the code and further reduce cloning. --- components/script/dom/htmlscriptelement.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index fb5bca5fb2c..ce6120b5b0e 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -49,6 +49,7 @@ use std::fs::{create_dir_all, read_to_string, File}; use std::io::{Read, Seek, Write}; use std::path::PathBuf; use std::process::Command; +use std::rc::Rc; use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; use uuid::Uuid; @@ -150,14 +151,15 @@ pub enum ScriptType { #[derive(JSTraceable, MallocSizeOf)] pub struct ScriptOrigin { - text: DOMString, + #[ignore_malloc_size_of = "Rc is hard"] + text: Rc, url: ServoUrl, external: bool, type_: ScriptType, } impl ScriptOrigin { - pub fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn internal(text: Rc, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -166,7 +168,7 @@ impl ScriptOrigin { } } - pub fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn external(text: Rc, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -175,8 +177,8 @@ impl ScriptOrigin { } } - pub fn text(&self) -> DOMString { - self.text.clone() + pub fn text(&self) -> Rc { + Rc::clone(&self.text) } } @@ -257,7 +259,7 @@ impl FetchResponseListener for ClassicContext { // Step 7. let (source_text, _, _) = encoding.decode(&self.data); ScriptOrigin::external( - DOMString::from(source_text), + Rc::new(DOMString::from(source_text)), metadata.final_url, ScriptType::Classic, ) @@ -613,7 +615,7 @@ impl HTMLScriptElement { // Step 25-1. & 25-2. let result = Ok(ScriptOrigin::internal( - text.clone(), + Rc::new(text.clone()), base_url.clone(), script_type.clone(), )); @@ -647,7 +649,7 @@ impl HTMLScriptElement { fetch_inline_module_script( ModuleOwner::Window(Trusted::new(self)), - text.clone(), + Rc::new(text.clone()), base_url.clone(), self.id.clone(), credentials_mode.unwrap(), @@ -679,7 +681,7 @@ impl HTMLScriptElement { let mut script_content = String::new(); output.seek(std::io::SeekFrom::Start(0)).unwrap(); output.read_to_string(&mut script_content).unwrap(); - script.text = DOMString::from(script_content); + script.text = Rc::new(DOMString::from(script_content)); }, _ => { warn!("Failed to execute js-beautify. Will store unmodified script"); @@ -757,7 +759,7 @@ impl HTMLScriptElement { match read_to_string(path.clone()) { Ok(local_script) => { debug!("Found script stored at: {:?}", path); - script.text = DOMString::from(local_script); + script.text = Rc::new(DOMString::from(local_script)); }, Err(why) => warn!("Could not restore script from file {:?}", why), } -- cgit v1.2.3 From 3f440bd6dc7352e447a2f7b352e01c782e746655 Mon Sep 17 00:00:00 2001 From: Camelid Date: Thu, 16 Jul 2020 19:29:57 -0700 Subject: Fewer clones --- components/script/dom/htmlscriptelement.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index ce6120b5b0e..4f6c663502f 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -613,9 +613,11 @@ impl HTMLScriptElement { // Step 25. assert!(!text.is_empty()); + let text_rc = Rc::new(text); + // Step 25-1. & 25-2. let result = Ok(ScriptOrigin::internal( - Rc::new(text.clone()), + Rc::clone(&text_rc), base_url.clone(), script_type.clone(), )); @@ -649,7 +651,7 @@ impl HTMLScriptElement { fetch_inline_module_script( ModuleOwner::Window(Trusted::new(self)), - Rc::new(text.clone()), + Rc::clone(&text_rc), base_url.clone(), self.id.clone(), credentials_mode.unwrap(), -- cgit v1.2.3 From cdfd4d9075f31a80377f26315cd122e7e85e932b Mon Sep 17 00:00:00 2001 From: Camelid Date: Thu, 16 Jul 2020 19:32:42 -0700 Subject: One fewer `Rc::clone()` --- components/script/dom/htmlscriptelement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 4f6c663502f..922a9ad2939 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -651,7 +651,7 @@ impl HTMLScriptElement { fetch_inline_module_script( ModuleOwner::Window(Trusted::new(self)), - Rc::clone(&text_rc), + text_rc, base_url.clone(), self.id.clone(), credentials_mode.unwrap(), -- cgit v1.2.3 From a62a30ef83ef3925874fe9e8f484b2c4e0dccc54 Mon Sep 17 00:00:00 2001 From: Camelid Date: Thu, 16 Jul 2020 20:45:24 -0700 Subject: Use `asynch` instead of `r#async` This is a vestige of the transition from 2015 to 2018 edition Rust. `async` was added as a keyword in 2018 edition Rust, so `cargo fix` changed the variable name here to `r#async`. --- components/script/dom/htmlscriptelement.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index fb5bca5fb2c..285612afdec 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -400,9 +400,9 @@ impl HTMLScriptElement { // Step 3. let element = self.upcast::(); - let r#async = element.has_attribute(&local_name!("async")); + let asynch = element.has_attribute(&local_name!("async")); // Note: confusingly, this is done if the element does *not* have an "async" attribute. - if was_parser_inserted && !r#async { + if was_parser_inserted && !asynch { self.non_blocking.set(true); } @@ -554,14 +554,14 @@ impl HTMLScriptElement { // Preparation for step 26. let kind = if element.has_attribute(&local_name!("defer")) && was_parser_inserted && - !r#async + !asynch { // Step 26.a: classic, has src, has defer, was parser-inserted, is not async. ExternalScriptKind::Deferred - } else if was_parser_inserted && !r#async { + } else if was_parser_inserted && !asynch { // Step 26.c: classic, has src, was parser-inserted, is not async. ExternalScriptKind::ParsingBlocking - } else if !r#async && !self.non_blocking.get() { + } else if !asynch && !self.non_blocking.get() { // Step 26.d: classic, has src, is not async, is not non-blocking. ExternalScriptKind::AsapInOrder } else { @@ -598,9 +598,9 @@ impl HTMLScriptElement { credentials_mode.unwrap(), ); - if !r#async && was_parser_inserted { + if !asynch && was_parser_inserted { doc.add_deferred_script(self); - } else if !r#async && !self.non_blocking.get() { + } else if !asynch && !self.non_blocking.get() { doc.push_asap_in_order_script(self); } else { doc.add_asap_script(self); @@ -637,9 +637,9 @@ impl HTMLScriptElement { // We should add inline module script elements // into those vectors in case that there's no // descendants in the inline module script. - if !r#async && was_parser_inserted { + if !asynch && was_parser_inserted { doc.add_deferred_script(self); - } else if !r#async && !self.non_blocking.get() { + } else if !asynch && !self.non_blocking.get() { doc.push_asap_in_order_script(self); } else { doc.add_asap_script(self); -- cgit v1.2.3 From 1aef31bb2fe22c4afb3b3cf2fab1a4d8b24056d4 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Mon, 25 May 2020 13:15:19 -0400 Subject: checkpoint - dynamic load inside of a module and classic script works. --- components/script/dom/htmlscriptelement.rs | 127 ++++++++++++++++------------- 1 file changed, 69 insertions(+), 58 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 922a9ad2939..44fe52a51d6 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -28,7 +28,7 @@ use crate::dom::virtualmethods::VirtualMethods; use crate::fetch::create_a_potential_cors_request; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; use crate::script_module::fetch_inline_module_script; -use crate::script_module::{fetch_external_module_script, ModuleOwner}; +use crate::script_module::{fetch_external_module_script, ModuleOwner, ScriptFetchOptions}; use content_security_policy as csp; use dom_struct::dom_struct; use encoding_rs::Encoding; @@ -37,8 +37,9 @@ use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; use msg::constellation_msg::PipelineId; -use net_traits::request::{CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder}; -use net_traits::ReferrerPolicy; +use net_traits::request::{ + CorsSettings, CredentialsMode, Destination, ParserMetadata, RequestBuilder, +}; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_atoms::Atom; @@ -322,15 +323,22 @@ pub(crate) fn script_fetch_request( cors_setting: Option, origin: ImmutableOrigin, pipeline_id: PipelineId, - referrer: Referrer, - referrer_policy: Option, - integrity_metadata: String, + options: ScriptFetchOptions, ) -> RequestBuilder { - create_a_potential_cors_request(url, Destination::Script, cors_setting, None, referrer) - .origin(origin) - .pipeline_id(Some(pipeline_id)) - .referrer_policy(referrer_policy) - .integrity_metadata(integrity_metadata) + // We intentionally ignore options' credentials_mode member for classic scripts. + // The mode is initialized by create_a_potential_cors_request. + create_a_potential_cors_request( + url, + Destination::Script, + cors_setting, + None, + options.referrer, + ) + .origin(origin) + .pipeline_id(Some(pipeline_id)) + .parser_metadata(options.parser_metadata) + .integrity_metadata(options.integrity_metadata.clone()) + .referrer_policy(options.referrer_policy) } /// @@ -339,7 +347,7 @@ fn fetch_a_classic_script( kind: ExternalScriptKind, url: ServoUrl, cors_setting: Option, - integrity_metadata: String, + options: ScriptFetchOptions, character_encoding: &'static Encoding, ) { let doc = document_from_node(script); @@ -350,9 +358,7 @@ fn fetch_a_classic_script( cors_setting, doc.origin().immutable().clone(), script.global().pipeline_id(), - script.global().get_referrer(), - doc.get_referrer_policy(), - integrity_metadata, + options, ); // TODO: Step 3, Add custom steps to perform fetch @@ -400,7 +406,7 @@ impl HTMLScriptElement { let was_parser_inserted = self.parser_inserted.get(); self.parser_inserted.set(false); - // Step 3. + // Step 4. let element = self.upcast::(); let r#async = element.has_attribute(&local_name!("async")); // Note: confusingly, this is done if the element does *not* have an "async" attribute. @@ -408,13 +414,13 @@ impl HTMLScriptElement { self.non_blocking.set(true); } - // Step 4-5. + // Step 5-6. let text = self.Text(); if text.is_empty() && !element.has_attribute(&local_name!("src")) { return; } - // Step 6. + // Step 7. if !self.upcast::().is_connected() { return; } @@ -432,26 +438,26 @@ impl HTMLScriptElement { self.non_blocking.set(false); } - // Step 9. + // Step 10. self.already_started.set(true); - // Step 10. + // Step 12. let doc = document_from_node(self); if self.parser_inserted.get() && &*self.parser_document != &*doc { return; } - // Step 11. + // Step 13. if !doc.is_scripting_enabled() { return; } - // Step 12 + // Step 14 if element.has_attribute(&local_name!("nomodule")) && script_type == ScriptType::Classic { return; } - // Step 13. + // Step 15. if !element.has_attribute(&local_name!("src")) && doc.should_elements_inline_type_behavior_be_blocked( &element, @@ -463,7 +469,7 @@ impl HTMLScriptElement { return; } - // Step 14. + // Step 16. if script_type == ScriptType::Classic { let for_attribute = element.get_attribute(&ns!(), &local_name!("for")); let event_attribute = element.get_attribute(&ns!(), &local_name!("event")); @@ -485,31 +491,31 @@ impl HTMLScriptElement { } } - // Step 15. + // Step 17. let encoding = element .get_attribute(&ns!(), &local_name!("charset")) .and_then(|charset| Encoding::for_label(charset.value().as_bytes())) .unwrap_or_else(|| doc.encoding()); - // Step 16. + // Step 18. let cors_setting = cors_setting_for_element(element); - // Step 17. - let credentials_mode = match script_type { - ScriptType::Classic => None, - ScriptType::Module => Some(reflect_cross_origin_attribute(element).map_or( + // Step 19. + let module_credentials_mode = match script_type { + ScriptType::Classic => CredentialsMode::CredentialsSameOrigin, + ScriptType::Module => reflect_cross_origin_attribute(element).map_or( CredentialsMode::CredentialsSameOrigin, |attr| match &*attr { "use-credentials" => CredentialsMode::Include, "anonymous" => CredentialsMode::CredentialsSameOrigin, _ => CredentialsMode::CredentialsSameOrigin, }, - )), + ), }; - // TODO: Step 18: Nonce. + // TODO: Step 20: Nonce. - // Step 19: Integrity metadata. + // Step 21: Integrity metadata. let im_attribute = element.get_attribute(&ns!(), &local_name!("integrity")); let integrity_val = im_attribute.as_ref().map(|a| a.value()); let integrity_metadata = match integrity_val { @@ -517,30 +523,43 @@ impl HTMLScriptElement { None => "", }; - // TODO: Step 20: referrer policy + // TODO: Step 22: referrer policy - // TODO: Step 21: parser state. + // Step 23 + let parser_metadata = if self.parser_inserted.get() { + ParserMetadata::ParserInserted + } else { + ParserMetadata::NotParserInserted + }; - // TODO: Step 22: Fetch options + // Step 24. + let options = ScriptFetchOptions { + cryptographic_nonce: "".into(), + integrity_metadata: integrity_metadata.to_owned(), + parser_metadata, + referrer: self.global().get_referrer(), + referrer_policy: doc.get_referrer_policy(), + credentials_mode: module_credentials_mode, + }; // TODO: Step 23: environment settings object. let base_url = doc.base_url(); if let Some(src) = element.get_attribute(&ns!(), &local_name!("src")) { - // Step 24. + // Step 26. - // Step 24.1. + // Step 26.1. let src = src.value(); - // Step 24.2. + // Step 26.2. if src.is_empty() { self.queue_error_event(); return; } - // Step 24.3: The "from an external file"" flag is stored in ScriptOrigin. + // Step 26.3: The "from an external file"" flag is stored in ScriptOrigin. - // Step 24.4-24.5. + // Step 26.4-26.5. let url = match base_url.join(&src) { Ok(url) => url, Err(_) => { @@ -550,7 +569,7 @@ impl HTMLScriptElement { }, }; - // Step 24.6. + // Step 26.6. match script_type { ScriptType::Classic => { // Preparation for step 26. @@ -572,14 +591,7 @@ impl HTMLScriptElement { }; // Step 24.6. - fetch_a_classic_script( - self, - kind, - url, - cors_setting, - integrity_metadata.to_owned(), - encoding, - ); + fetch_a_classic_script(self, kind, url, cors_setting, options, encoding); // Step 23. match kind { @@ -596,8 +608,7 @@ impl HTMLScriptElement { ModuleOwner::Window(Trusted::new(self)), url.clone(), Destination::Script, - integrity_metadata.to_owned(), - credentials_mode.unwrap(), + options, ); if !r#async && was_parser_inserted { @@ -610,19 +621,19 @@ impl HTMLScriptElement { }, } } else { - // Step 25. + // Step 27. assert!(!text.is_empty()); let text_rc = Rc::new(text); - // Step 25-1. & 25-2. + // Step 27-1. & 27-2. let result = Ok(ScriptOrigin::internal( Rc::clone(&text_rc), base_url.clone(), script_type.clone(), )); - // Step 25-2. + // Step 27-2. match script_type { ScriptType::Classic => { if was_parser_inserted && @@ -630,10 +641,10 @@ impl HTMLScriptElement { .map_or(false, |parser| parser.script_nesting_level() <= 1) && doc.get_script_blocking_stylesheets_count() > 0 { - // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet. + // Step 27.h: classic, has no src, was parser-inserted, is blocked on stylesheet. doc.set_pending_parsing_blocking_script(self, Some(result)); } else { - // Step 26.i: otherwise. + // Step 27.i: otherwise. self.execute(result); } }, @@ -654,7 +665,7 @@ impl HTMLScriptElement { text_rc, base_url.clone(), self.id.clone(), - credentials_mode.unwrap(), + options, ); }, } -- cgit v1.2.3 From d1715918f058649b3a637a53c2cd920740b2eb37 Mon Sep 17 00:00:00 2001 From: CYBAI Date: Sat, 11 Jul 2020 22:44:21 +0900 Subject: Set private reference for classic script Web developers can use `Dynamic Import` in a classic script; thus, we need to save the script's private reference so that we can reuse it when we're going to fetch a dynamic import module for a classic script. Besides, because it's possible to use different executing context for a dynamic import module (like `dynamic-import/string-compilation-other-document.html` WPT test), we can't initialize a module owner at the timing of `SetScriptPrivate`; thus, if the private module script doesn't hold an owner, we'll use a DynamicImport owner for it. --- components/script/dom/htmlscriptelement.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 44fe52a51d6..6a2b5e53acc 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -156,24 +156,37 @@ pub struct ScriptOrigin { text: Rc, url: ServoUrl, external: bool, + fetch_options: ScriptFetchOptions, type_: ScriptType, } impl ScriptOrigin { - pub fn internal(text: Rc, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn internal( + text: Rc, + url: ServoUrl, + fetch_options: ScriptFetchOptions, + type_: ScriptType, + ) -> ScriptOrigin { ScriptOrigin { text: text, url: url, external: false, + fetch_options, type_, } } - pub fn external(text: Rc, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn external( + text: Rc, + url: ServoUrl, + fetch_options: ScriptFetchOptions, + type_: ScriptType, + ) -> ScriptOrigin { ScriptOrigin { text: text, url: url, external: true, + fetch_options, type_, } } @@ -202,6 +215,8 @@ struct ClassicContext { url: ServoUrl, /// Indicates whether the request failed, and why status: Result<(), NetworkError>, + /// The fetch options of the script + fetch_options: ScriptFetchOptions, /// Timing object for this resource resource_timing: ResourceFetchTiming, } @@ -262,6 +277,7 @@ impl FetchResponseListener for ClassicContext { ScriptOrigin::external( Rc::new(DOMString::from(source_text)), metadata.final_url, + self.fetch_options.clone(), ScriptType::Classic, ) }); @@ -358,7 +374,7 @@ fn fetch_a_classic_script( cors_setting, doc.origin().immutable().clone(), script.global().pipeline_id(), - options, + options.clone(), ); // TODO: Step 3, Add custom steps to perform fetch @@ -371,6 +387,7 @@ fn fetch_a_classic_script( metadata: None, url: url.clone(), status: Ok(()), + fetch_options: options, resource_timing: ResourceFetchTiming::new(ResourceTimingType::Resource), })); @@ -630,6 +647,7 @@ impl HTMLScriptElement { let result = Ok(ScriptOrigin::internal( Rc::clone(&text_rc), base_url.clone(), + options.clone(), script_type.clone(), )); @@ -866,6 +884,8 @@ impl HTMLScriptElement { script.url.as_str(), rval.handle_mut(), line_number, + script.fetch_options.clone(), + script.url.clone(), ); } -- cgit v1.2.3 From 1119dd119ed335b6d6e448290b56e0eeab6de25f Mon Sep 17 00:00:00 2001 From: AbhishekSharma102 <20724848+AbhishekSharma102@users.noreply.github.com> Date: Mon, 13 Jul 2020 06:04:00 +0000 Subject: Added off thread compilation Co-authored-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com> Co-authored-by: Abhishek Sharma <20724848+AbhishekSharma102@users.noreply.github.com> --- components/script/dom/htmlscriptelement.rs | 261 ++++++++++++++++++++++++----- 1 file changed, 221 insertions(+), 40 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 2ad7444f7f4..baa22d4dfe6 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -13,6 +13,7 @@ use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::settings_stack::AutoEntryScript; use crate::dom::bindings::str::{DOMString, USVString}; +use crate::dom::bindings::trace::RootedTraceableBox; use crate::dom::document::Document; use crate::dom::element::{ cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute, @@ -27,15 +28,25 @@ use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; use crate::fetch::create_a_potential_cors_request; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; +use crate::realms::enter_realm; use crate::script_module::fetch_inline_module_script; use crate::script_module::{fetch_external_module_script, ModuleOwner, ScriptFetchOptions}; +use crate::task::TaskCanceller; +use crate::task_source::dom_manipulation::DOMManipulationTaskSource; +use crate::task_source::TaskSource; +use crate::task_source::TaskSourceName; use content_security_policy as csp; +use core::ffi::c_void; use dom_struct::dom_struct; use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; +use js::jsapi::{ + CanCompileOffThread, CompileOffThread, FinishOffThreadScript, Heap, JSScript, OffThreadToken, +}; use js::jsval::UndefinedValue; +use js::rust::{transform_u16_to_source_text, CompileOptionsWrapper}; use msg::constellation_msg::PipelineId; use net_traits::request::{ CorsSettings, CredentialsMode, Destination, ParserMetadata, RequestBuilder, @@ -43,11 +54,13 @@ use net_traits::request::{ use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_atoms::Atom; +use servo_config::pref; use servo_url::ImmutableOrigin; use servo_url::ServoUrl; use std::cell::Cell; use std::fs::{create_dir_all, read_to_string, File}; use std::io::{Read, Seek, Write}; +use std::mem::replace; use std::path::PathBuf; use std::process::Command; use std::rc::Rc; @@ -55,6 +68,82 @@ use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; use uuid::Uuid; +pub struct OffThreadCompilationContext { + script_element: Trusted, + script_kind: ExternalScriptKind, + final_url: ServoUrl, + url: ServoUrl, + task_source: DOMManipulationTaskSource, + canceller: TaskCanceller, + script_text: String, + utf16_chars: Vec, + fetch_options: ScriptFetchOptions, +} + +/// A wrapper to mark OffThreadToken as Send, +/// which should be safe according to +/// mozjs/js/public/OffThreadScriptCompilation.h +struct OffThreadCompilationToken(*mut OffThreadToken); + +#[allow(unsafe_code)] +unsafe impl Send for OffThreadCompilationToken {} + +#[allow(unsafe_code)] +unsafe extern "C" fn off_thread_compilation_callback( + token: *mut OffThreadToken, + callback_data: *mut c_void, +) { + let mut context = Box::from_raw(callback_data as *mut OffThreadCompilationContext); + let token = OffThreadCompilationToken(token); + + let url = context.url.clone(); + let final_url = context.final_url.clone(); + let script_element = context.script_element.clone(); + let script_kind = context.script_kind.clone(); + let script = replace(&mut context.script_text, String::new()); + let fetch_options = context.fetch_options.clone(); + + // Continue with + let _ = context.task_source.queue_with_canceller( + task!(off_thread_compile_continue: move || { + let elem = script_element.root(); + let global = elem.global(); + let cx = global.get_cx(); + let _ar = enter_realm(&*global); + + rooted!(in(*cx) + let compiled_script = FinishOffThreadScript(*cx, token.0) + ); + + let load = if compiled_script.get().is_null() { + Err(NetworkError::Internal( + "Off-thread compilation failed.".into(), + )) + } else { + let script_text = DOMString::from(script); + let heap = Heap::default(); + let source_code = RootedTraceableBox::new(heap); + source_code.set(compiled_script.get()); + let code = SourceCode::Compiled(CompiledSourceCode { + source_code: source_code, + original_text: Rc::new(script_text), + }); + + Ok(ScriptOrigin { + code, + url: final_url, + external: true, + fetch_options: fetch_options, + type_: ScriptType::Classic, + }) + }; + + finish_fetching_a_classic_script(&*elem, script_kind, url, load); + }), + &context.canceller, + ); +} + /// An unique id for script element. #[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, PartialEq)] pub struct ScriptId(Uuid); @@ -150,10 +239,24 @@ pub enum ScriptType { Module, } +#[derive(JSTraceable, MallocSizeOf)] +pub struct CompiledSourceCode { + #[ignore_malloc_size_of = "SM handles JS values"] + pub source_code: RootedTraceableBox>, + #[ignore_malloc_size_of = "Rc is hard"] + pub original_text: Rc, +} + +#[derive(JSTraceable)] +pub enum SourceCode { + Text(Rc), + Compiled(CompiledSourceCode), +} + #[derive(JSTraceable, MallocSizeOf)] pub struct ScriptOrigin { #[ignore_malloc_size_of = "Rc is hard"] - text: Rc, + code: SourceCode, url: ServoUrl, external: bool, fetch_options: ScriptFetchOptions, @@ -168,7 +271,7 @@ impl ScriptOrigin { type_: ScriptType, ) -> ScriptOrigin { ScriptOrigin { - text: text, + code: SourceCode::Text(text), url: url, external: false, fetch_options, @@ -183,7 +286,7 @@ impl ScriptOrigin { type_: ScriptType, ) -> ScriptOrigin { ScriptOrigin { - text: text, + code: SourceCode::Text(text), url: url, external: true, fetch_options, @@ -192,10 +295,37 @@ impl ScriptOrigin { } pub fn text(&self) -> Rc { - Rc::clone(&self.text) + match &self.code { + SourceCode::Text(text) => Rc::clone(&text), + SourceCode::Compiled(compiled_script) => Rc::clone(&compiled_script.original_text), + } } } +/// Final steps of +fn finish_fetching_a_classic_script( + elem: &HTMLScriptElement, + script_kind: ExternalScriptKind, + url: ServoUrl, + load: ScriptResult, +) { + // Step 11, Asynchronously complete this algorithm with script, + // which refers to step 26.6 "When the chosen algorithm asynchronously completes", + // of https://html.spec.whatwg.org/multipage/#prepare-a-script + let document = document_from_node(&*elem); + + match script_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(url)); +} + pub type ScriptResult = Result; /// The context required for asynchronously loading an external script source. @@ -261,43 +391,79 @@ impl FetchResponseListener for ClassicContext { /// /// step 4-9 + #[allow(unsafe_code)] fn process_response_eof(&mut self, response: Result) { - // Step 5. - let load = response.and(self.status.clone()).map(|_| { - let metadata = self.metadata.take().unwrap(); - - // Step 6. - let encoding = metadata - .charset - .and_then(|encoding| Encoding::for_label(encoding.as_bytes())) - .unwrap_or(self.character_encoding); + let (source_text, final_url) = match (response.as_ref(), self.status.as_ref()) { + (Err(err), _) | (_, Err(err)) => { + // Step 6, response is an error. + finish_fetching_a_classic_script( + &*self.elem.root(), + self.kind.clone(), + self.url.clone(), + Err(err.clone()), + ); + return; + }, + (Ok(_), Ok(_)) => { + let metadata = self.metadata.take().unwrap(); + + // Step 7. + let encoding = metadata + .charset + .and_then(|encoding| Encoding::for_label(encoding.as_bytes())) + .unwrap_or(self.character_encoding); + + // Step 8. + let (source_text, _, _) = encoding.decode(&self.data); + (source_text, metadata.final_url) + }, + }; - // Step 7. - let (source_text, _, _) = encoding.decode(&self.data); - ScriptOrigin::external( + let elem = self.elem.root(); + let global = elem.global(); + let cx = global.get_cx(); + let _ar = enter_realm(&*global); + + let options = + unsafe { CompileOptionsWrapper::new(*cx, final_url.as_str().as_ptr() as *const i8, 1) }; + + let can_compile_off_thread = pref!(dom.script.asynch) && + unsafe { CanCompileOffThread(*cx, options.ptr as *const _, source_text.len()) }; + + if can_compile_off_thread { + let source_string = source_text.to_string(); + let source_text: Vec = source_text.encode_utf16().collect(); + + let context = Box::new(OffThreadCompilationContext { + script_element: self.elem.clone(), + script_kind: self.kind.clone(), + final_url, + url: self.url.clone(), + task_source: global.dom_manipulation_task_source(), + canceller: global.task_canceller(TaskSourceName::DOMManipulation), + script_text: source_string, + utf16_chars: source_text, + fetch_options: self.fetch_options.clone(), + }); + + unsafe { + assert!(CompileOffThread( + *cx, + options.ptr as *const _, + &mut transform_u16_to_source_text(&context.utf16_chars) as *mut _, + Some(off_thread_compilation_callback), + Box::into_raw(context) as *mut c_void, + )); + } + } else { + let load = ScriptOrigin::external( Rc::new(DOMString::from(source_text)), - metadata.final_url, + final_url.clone(), self.fetch_options.clone(), ScriptType::Classic, - ) - }); - - // 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(); - 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) - }, + ); + finish_fetching_a_classic_script(&*elem, self.kind.clone(), self.url.clone(), Ok(load)); } - - document.finish_load(LoadType::Script(self.url.clone())); } fn resource_timing_mut(&mut self) -> &mut ResourceFetchTiming { @@ -702,7 +868,16 @@ impl HTMLScriptElement { // unminified content. let (input, output) = (tempfile::NamedTempFile::new(), tempfile::tempfile()); if let (Ok(mut input), Ok(mut output)) = (input, output) { - input.write_all(script.text.as_bytes()).unwrap(); + match &script.code { + SourceCode::Text(text) => { + input.write_all(text.as_bytes()).unwrap(); + }, + SourceCode::Compiled(compiled_source_code) => { + input + .write_all(compiled_source_code.original_text.as_bytes()) + .unwrap(); + }, + } match Command::new("js-beautify") .arg(input.path()) .stdout(output.try_clone().unwrap()) @@ -712,7 +887,7 @@ impl HTMLScriptElement { let mut script_content = String::new(); output.seek(std::io::SeekFrom::Start(0)).unwrap(); output.read_to_string(&mut script_content).unwrap(); - script.text = Rc::new(DOMString::from(script_content)); + script.code = SourceCode::Text(Rc::new(DOMString::from(script_content))); }, _ => { warn!("Failed to execute js-beautify. Will store unmodified script"); @@ -763,7 +938,13 @@ impl HTMLScriptElement { debug!("script will be stored in {:?}", path); match File::create(&path) { - Ok(mut file) => file.write_all(script.text.as_bytes()).unwrap(), + Ok(mut file) => match &script.code { + SourceCode::Text(text) => file.write_all(text.as_bytes()).unwrap(), + SourceCode::Compiled(compiled_source_code) => { + file.write_all(compiled_source_code.original_text.as_bytes()) + .unwrap(); + }, + }, Err(why) => warn!("Could not store script {:?}", why), } } @@ -790,7 +971,7 @@ impl HTMLScriptElement { match read_to_string(path.clone()) { Ok(local_script) => { debug!("Found script stored at: {:?}", path); - script.text = Rc::new(DOMString::from(local_script)); + script.code = SourceCode::Text(Rc::new(DOMString::from(local_script))); }, Err(why) => warn!("Could not restore script from file {:?}", why), } @@ -880,7 +1061,7 @@ impl HTMLScriptElement { rooted!(in(*window.get_cx()) let mut rval = UndefinedValue()); let global = window.upcast::(); global.evaluate_script_on_global_with_result( - &script.text, + &script.code, script.url.as_str(), rval.handle_mut(), line_number, -- cgit v1.2.3 From a271ed91503d9adb9f26e6e9b683501a8f1a247b Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 22 Jul 2020 12:28:55 -0400 Subject: Pass C string pointer to CompileOptionsWrapper. --- components/script/dom/htmlscriptelement.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index baa22d4dfe6..39f8b912de9 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -58,6 +58,7 @@ use servo_config::pref; use servo_url::ImmutableOrigin; use servo_url::ServoUrl; use std::cell::Cell; +use std::ffi::CString; use std::fs::{create_dir_all, read_to_string, File}; use std::io::{Read, Seek, Write}; use std::mem::replace; @@ -424,8 +425,8 @@ impl FetchResponseListener for ClassicContext { let cx = global.get_cx(); let _ar = enter_realm(&*global); - let options = - unsafe { CompileOptionsWrapper::new(*cx, final_url.as_str().as_ptr() as *const i8, 1) }; + let final_url_c_str = CString::new(final_url.as_str()).unwrap(); + let options = unsafe { CompileOptionsWrapper::new(*cx, final_url_c_str.as_ptr(), 1) }; let can_compile_off_thread = pref!(dom.script.asynch) && unsafe { CanCompileOffThread(*cx, options.ptr as *const _, source_text.len()) }; -- cgit v1.2.3 From 60147105388fe7f5f95e019436d8027061330a47 Mon Sep 17 00:00:00 2001 From: Arjun Ramachandrula Date: Mon, 27 Jul 2020 21:45:20 -0400 Subject: Removed unnecessary conversion from UTF-8 to UTF-16 --- components/script/dom/htmlscriptelement.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 39f8b912de9..b6e89d4027e 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -43,10 +43,10 @@ use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsapi::{ - CanCompileOffThread, CompileOffThread, FinishOffThreadScript, Heap, JSScript, OffThreadToken, + CanCompileOffThread, CompileOffThread1, FinishOffThreadScript, Heap, JSScript, OffThreadToken, }; use js::jsval::UndefinedValue; -use js::rust::{transform_u16_to_source_text, CompileOptionsWrapper}; +use js::rust::{transform_str_to_source_text, CompileOptionsWrapper}; use msg::constellation_msg::PipelineId; use net_traits::request::{ CorsSettings, CredentialsMode, Destination, ParserMetadata, RequestBuilder, @@ -77,7 +77,6 @@ pub struct OffThreadCompilationContext { task_source: DOMManipulationTaskSource, canceller: TaskCanceller, script_text: String, - utf16_chars: Vec, fetch_options: ScriptFetchOptions, } @@ -433,7 +432,6 @@ impl FetchResponseListener for ClassicContext { if can_compile_off_thread { let source_string = source_text.to_string(); - let source_text: Vec = source_text.encode_utf16().collect(); let context = Box::new(OffThreadCompilationContext { script_element: self.elem.clone(), @@ -443,15 +441,14 @@ impl FetchResponseListener for ClassicContext { task_source: global.dom_manipulation_task_source(), canceller: global.task_canceller(TaskSourceName::DOMManipulation), script_text: source_string, - utf16_chars: source_text, fetch_options: self.fetch_options.clone(), }); unsafe { - assert!(CompileOffThread( + assert!(CompileOffThread1( *cx, options.ptr as *const _, - &mut transform_u16_to_source_text(&context.utf16_chars) as *mut _, + &mut transform_str_to_source_text(&context.script_text) as *mut _, Some(off_thread_compilation_callback), Box::into_raw(context) as *mut c_void, )); -- cgit v1.2.3 From f8c9ee4eff1ae7a72037e16f2aa97ad6bb69da4e Mon Sep 17 00:00:00 2001 From: Sudarsan Date: Fri, 28 Aug 2020 20:54:18 +0800 Subject: Update mozjs to 0.14.1 This update pulls in improvements on mozjs that now removes the need to pass pointers to CompileOptionsWraper::new(), allows NewProxyObject to now accept a Singleton bool and JSClass and removes an unsafe Handle::new usage. --- components/script/dom/htmlscriptelement.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index b6e89d4027e..de22b9787c4 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -58,7 +58,6 @@ use servo_config::pref; use servo_url::ImmutableOrigin; use servo_url::ServoUrl; use std::cell::Cell; -use std::ffi::CString; use std::fs::{create_dir_all, read_to_string, File}; use std::io::{Read, Seek, Write}; use std::mem::replace; @@ -424,8 +423,7 @@ impl FetchResponseListener for ClassicContext { let cx = global.get_cx(); let _ar = enter_realm(&*global); - let final_url_c_str = CString::new(final_url.as_str()).unwrap(); - let options = unsafe { CompileOptionsWrapper::new(*cx, final_url_c_str.as_ptr(), 1) }; + let options = unsafe { CompileOptionsWrapper::new(*cx, final_url.as_str(), 1) }; let can_compile_off_thread = pref!(dom.script.asynch) && unsafe { CanCompileOffThread(*cx, options.ptr as *const _, source_text.len()) }; -- cgit v1.2.3 From a999850b24bf731522b739e25fd5d62122537aa1 Mon Sep 17 00:00:00 2001 From: YUAN LYU Date: Tue, 1 Dec 2020 00:37:16 -0500 Subject: Implement referrerPolicy for HTMLLinkElement and HTMLScriptElement --- components/script/dom/htmlscriptelement.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index de22b9787c4..515cdb898f0 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -16,7 +16,8 @@ use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::bindings::trace::RootedTraceableBox; use crate::dom::document::Document; use crate::dom::element::{ - cors_setting_for_element, reflect_cross_origin_attribute, set_cross_origin_attribute, + cors_setting_for_element, referrer_policy_for_element, reflect_cross_origin_attribute, + reflect_referrer_policy_attribute, set_cross_origin_attribute, }; use crate::dom::element::{AttributeMutation, Element, ElementCreator}; use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; @@ -51,8 +52,10 @@ use msg::constellation_msg::PipelineId; use net_traits::request::{ CorsSettings, CredentialsMode, Destination, ParserMetadata, RequestBuilder, }; -use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; -use net_traits::{ResourceFetchTiming, ResourceTimingType}; +use net_traits::{ + FetchMetadata, FetchResponseListener, Metadata, NetworkError, ResourceFetchTiming, + ResourceTimingType, +}; use servo_atoms::Atom; use servo_config::pref; use servo_url::ImmutableOrigin; @@ -717,7 +720,7 @@ impl HTMLScriptElement { integrity_metadata: integrity_metadata.to_owned(), parser_metadata, referrer: self.global().get_referrer(), - referrer_policy: doc.get_referrer_policy(), + referrer_policy: referrer_policy_for_element(self.upcast::()), credentials_mode: module_credentials_mode, }; @@ -1352,6 +1355,14 @@ impl HTMLScriptElementMethods for HTMLScriptElement { set_cross_origin_attribute(self.upcast::(), value); } + // https://html.spec.whatwg.org/multipage/#dom-script-referrerpolicy + fn ReferrerPolicy(&self) -> DOMString { + reflect_referrer_policy_attribute(self.upcast::()) + } + + // https://html.spec.whatwg.org/multipage/#dom-script-referrerpolicy + make_setter!(SetReferrerPolicy, "referrerpolicy"); + // https://html.spec.whatwg.org/multipage/#dom-script-text fn Text(&self) -> DOMString { self.upcast::().child_text_content() -- cgit v1.2.3 From 5c4939599e2793154569b19db87be8cc05ca9269 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Sun, 24 Jan 2021 14:07:10 -0500 Subject: Update mozjs. --- components/script/dom/htmlscriptelement.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 515cdb898f0..0db6ca8cba2 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -66,6 +66,7 @@ use std::io::{Read, Seek, Write}; use std::mem::replace; use std::path::PathBuf; use std::process::Command; +use std::ptr; use std::rc::Rc; use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; @@ -445,6 +446,7 @@ impl FetchResponseListener for ClassicContext { fetch_options: self.fetch_options.clone(), }); + let mut token = ptr::null_mut(); unsafe { assert!(CompileOffThread1( *cx, @@ -452,6 +454,7 @@ impl FetchResponseListener for ClassicContext { &mut transform_str_to_source_text(&context.script_text) as *mut _, Some(off_thread_compilation_callback), Box::into_raw(context) as *mut c_void, + &mut token, )); } } else { -- cgit v1.2.3 From 425057c4323fe9bf3857e2c99912dc10b79166b7 Mon Sep 17 00:00:00 2001 From: sagudev Date: Fri, 12 Mar 2021 16:26:27 +0100 Subject: Fix errors --- components/script/dom/htmlscriptelement.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 0db6ca8cba2..aedb2b719c3 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -66,7 +66,6 @@ use std::io::{Read, Seek, Write}; use std::mem::replace; use std::path::PathBuf; use std::process::Command; -use std::ptr; use std::rc::Rc; use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; @@ -446,16 +445,14 @@ impl FetchResponseListener for ClassicContext { fetch_options: self.fetch_options.clone(), }); - let mut token = ptr::null_mut(); unsafe { - assert!(CompileOffThread1( + assert!(!CompileOffThread1( *cx, options.ptr as *const _, &mut transform_str_to_source_text(&context.script_text) as *mut _, Some(off_thread_compilation_callback), Box::into_raw(context) as *mut c_void, - &mut token, - )); + ).is_null()); } } else { let load = ScriptOrigin::external( -- cgit v1.2.3 From a265a2a7e6c53eda558aa61712646382bbe129af Mon Sep 17 00:00:00 2001 From: sagudev Date: Fri, 12 Mar 2021 18:30:13 +0100 Subject: Formating --- components/script/dom/htmlscriptelement.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'components/script/dom/htmlscriptelement.rs') diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index aedb2b719c3..d27fee98fb5 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -452,7 +452,8 @@ impl FetchResponseListener for ClassicContext { &mut transform_str_to_source_text(&context.script_text) as *mut _, Some(off_thread_compilation_callback), Box::into_raw(context) as *mut c_void, - ).is_null()); + ) + .is_null()); } } else { let load = ScriptOrigin::external( -- cgit v1.2.3