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), } diff --git a/components/script/script_module.rs b/components/script/script_module.rs index 045c6225337..ad3d0720331 100644 --- a/components/script/script_module.rs +++ b/components/script/script_module.rs @@ -143,7 +143,7 @@ impl ModuleIdentity { #[derive(JSTraceable)] pub struct ModuleTree { url: ServoUrl, - text: DomRefCell, + text: DomRefCell>, record: DomRefCell>, status: DomRefCell, // The spec maintains load order for descendants, so we use an indexset for descendants and @@ -171,7 +171,7 @@ impl ModuleTree { pub fn new(url: ServoUrl, external: bool, visited_urls: HashSet) -> Self { ModuleTree { url, - text: DomRefCell::new(DOMString::new()), + text: DomRefCell::new(Rc::new(DOMString::new())), record: DomRefCell::new(None), status: DomRefCell::new(ModuleStatus::Initial), parent_identities: DomRefCell::new(IndexSet::new()), @@ -217,11 +217,11 @@ impl ModuleTree { *self.network_error.borrow_mut() = Some(network_error); } - pub fn get_text(&self) -> &DomRefCell { + pub fn get_text(&self) -> &DomRefCell> { &self.text } - pub fn set_text(&self, module_text: DOMString) { + pub fn set_text(&self, module_text: Rc) { *self.text.borrow_mut() = module_text; } @@ -351,7 +351,7 @@ impl ModuleTree { fn compile_module_script( &self, global: &GlobalScope, - module_script_text: DOMString, + module_script_text: Rc, url: ServoUrl, ) -> Result { let module: Vec = module_script_text.encode_utf16().collect(); @@ -852,12 +852,12 @@ impl ModuleOwner { Some(network_error) => Err(network_error.clone()), None => match module_identity { ModuleIdentity::ModuleUrl(script_src) => Ok(ScriptOrigin::external( - module_tree.get_text().borrow().clone(), + Rc::clone(&module_tree.get_text().borrow()), script_src.clone(), ScriptType::Module, )), ModuleIdentity::ScriptId(_) => Ok(ScriptOrigin::internal( - module_tree.get_text().borrow().clone(), + Rc::clone(&module_tree.get_text().borrow()), document.base_url().clone(), ScriptType::Module, )), @@ -980,7 +980,7 @@ impl FetchResponseListener for ModuleContext { // Step 10. let (source_text, _, _) = UTF_8.decode(&self.data); Ok(ScriptOrigin::external( - DOMString::from(source_text), + Rc::new(DOMString::from(source_text)), meta.final_url, ScriptType::Module, )) @@ -1302,7 +1302,7 @@ pub fn fetch_single_module_script( /// https://html.spec.whatwg.org/multipage/#fetch-an-inline-module-script-graph pub fn fetch_inline_module_script( owner: ModuleOwner, - module_script_text: DOMString, + module_script_text: Rc, url: ServoUrl, script_id: ScriptId, credentials_mode: CredentialsMode,