aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorskrzyp1 <skrzyp2@gmail.com>2020-06-02 19:32:52 +0200
committerskrzyp1 <skrzyp2@gmail.com>2020-06-02 21:23:45 +0200
commitee6906443f9c60c60e38e6f6daaeb585fa886540 (patch)
tree9b6195a7f49f137d1c5bb6c14cb585429f565e26
parent6a1cb940bf3b21c694b026755e78dbc9d02d7539 (diff)
downloadservo-ee6906443f9c60c60e38e6f6daaeb585fa886540.tar.gz
servo-ee6906443f9c60c60e38e6f6daaeb585fa886540.zip
reading unminified scripts from disk
-rw-r--r--components/config/opts.rs11
-rw-r--r--components/constellation/pipeline.rs1
-rw-r--r--components/script/dom/htmlscriptelement.rs66
-rw-r--r--components/script/dom/window.rs35
-rw-r--r--components/script/script_thread.rs8
-rw-r--r--components/script_traits/lib.rs1
6 files changed, 91 insertions, 31 deletions
diff --git a/components/config/opts.rs b/components/config/opts.rs
index 66a626d390f..12fe53389af 100644
--- a/components/config/opts.rs
+++ b/components/config/opts.rs
@@ -210,6 +210,9 @@ pub struct Opts {
/// Unminify Javascript.
pub unminify_js: bool,
+ /// Directory path that was created with "unminify-js"
+ pub local_script_source: Option<String>,
+
/// Print Progressive Web Metrics to console.
pub print_pwm: bool,
}
@@ -522,6 +525,7 @@ pub fn default_opts() -> Opts {
signpost: false,
certificate_path: None,
unminify_js: false,
+ local_script_source: None,
print_pwm: false,
}
}
@@ -676,6 +680,12 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
opts.optopt("", "profiler-db-name", "Profiler database name", "");
opts.optflag("", "print-pwm", "Print Progressive Web Metrics");
opts.optopt("", "vslogger-level", "Visual Studio logger level", "Warn");
+ opts.optopt(
+ "",
+ "local-script-source",
+ "Directory root with unminified scripts",
+ "",
+ );
let opt_match = match opts.parse(args) {
Ok(m) => m,
@@ -923,6 +933,7 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
signpost: debug_options.signpost,
certificate_path: opt_match.opt_str("certificate-path"),
unminify_js: opt_match.opt_present("unminify-js"),
+ local_script_source: opt_match.opt_str("local-script-source"),
print_pwm: opt_match.opt_present("print-pwm"),
};
diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs
index 54397dd4c01..f4c2aefdc73 100644
--- a/components/constellation/pipeline.rs
+++ b/components/constellation/pipeline.rs
@@ -584,6 +584,7 @@ impl UnprivilegedPipelineContent {
self.opts.exit_after_load ||
self.opts.webdriver_port.is_some(),
self.opts.unminify_js,
+ self.opts.local_script_source,
self.opts.userscripts,
self.opts.headless,
self.opts.replace_surrogates,
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),
+ }
+ }
+
/// <https://html.spec.whatwg.org/multipage/#execute-the-script-block>
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.
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 16126dcf1b9..d76cd6dc24d 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -119,7 +119,7 @@ use script_traits::{
use script_traits::{TimerSchedulerMsg, WebrenderIpcSender, WindowSizeData, WindowSizeType};
use selectors::attr::CaseSensitivity;
use servo_geometry::{f32_rect_to_au_rect, MaxRect};
-use servo_url::{Host, ImmutableOrigin, MutableOrigin, ServoUrl};
+use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl};
use std::borrow::Cow;
use std::borrow::ToOwned;
use std::cell::Cell;
@@ -127,7 +127,6 @@ use std::collections::hash_map::Entry;
use std::collections::{HashMap, HashSet};
use std::default::Default;
use std::env;
-use std::fs;
use std::io::{stderr, stdout, Write};
use std::mem;
use std::rc::Rc;
@@ -287,6 +286,9 @@ pub struct Window {
/// opt is enabled.
unminified_js_dir: DomRefCell<Option<String>>,
+ /// Directory with stored unminified scripts
+ local_script_source: Option<String>,
+
/// Worklets
test_worklet: MutNullableDom<Worklet>,
/// <https://drafts.css-houdini.org/css-paint-api-1/#paint-worklet>
@@ -1977,25 +1979,10 @@ impl Window {
if !self.unminify_js {
return;
}
- // Create a folder for the document host to store unminified scripts.
- if let Some(&Host::Domain(ref host)) = document.url().origin().host() {
- let mut path = env::current_dir().unwrap();
- path.push("unminified-js");
- path.push(host);
- let _ = fs::remove_dir_all(&path);
- match fs::create_dir_all(&path) {
- Ok(_) => {
- *self.unminified_js_dir.borrow_mut() =
- Some(path.into_os_string().into_string().unwrap());
- debug!(
- "Created folder for {:?} unminified scripts {:?}",
- host,
- self.unminified_js_dir.borrow()
- );
- },
- Err(_) => warn!("Could not create unminified dir for {:?}", host),
- }
- }
+ // Set a path for the document host to store unminified scripts.
+ let mut path = env::current_dir().unwrap();
+ path.push("unminified-js");
+ *self.unminified_js_dir.borrow_mut() = Some(path.into_os_string().into_string().unwrap());
}
/// Commence a new URL load which will either replace this window or scroll to a fragment.
@@ -2271,6 +2258,10 @@ impl Window {
self.unminified_js_dir.borrow().clone()
}
+ pub fn local_script_source(&self) -> &Option<String> {
+ &self.local_script_source
+ }
+
pub fn set_navigation_start(&self) {
let current_time = time::get_time();
let now = (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64;
@@ -2334,6 +2325,7 @@ impl Window {
relayout_event: bool,
prepare_for_screenshot: bool,
unminify_js: bool,
+ local_script_source: Option<String>,
userscripts_path: Option<String>,
is_headless: bool,
replace_surrogates: bool,
@@ -2408,6 +2400,7 @@ impl Window {
webxr_registry,
pending_layout_images: Default::default(),
unminified_js_dir: Default::default(),
+ local_script_source,
test_worklet: Default::default(),
paint_worklet: Default::default(),
webrender_document,
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index b7c7da8ced1..729fe1595bc 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -649,6 +649,9 @@ pub struct ScriptThread {
/// Unminify Javascript.
unminify_js: bool,
+ /// Directory with stored unminified scripts
+ local_script_source: Option<String>,
+
/// Where to load userscripts from, if any. An empty string will load from
/// the resources/user-agent-js directory, and if the option isn't passed userscripts
/// won't be loaded
@@ -723,6 +726,7 @@ impl ScriptThreadFactory for ScriptThread {
relayout_event: bool,
prepare_for_screenshot: bool,
unminify_js: bool,
+ local_script_source: Option<String>,
userscripts_path: Option<String>,
headless: bool,
replace_surrogates: bool,
@@ -758,6 +762,7 @@ impl ScriptThreadFactory for ScriptThread {
relayout_event,
prepare_for_screenshot,
unminify_js,
+ local_script_source,
userscripts_path,
headless,
replace_surrogates,
@@ -1209,6 +1214,7 @@ impl ScriptThread {
relayout_event: bool,
prepare_for_screenshot: bool,
unminify_js: bool,
+ local_script_source: Option<String>,
userscripts_path: Option<String>,
headless: bool,
replace_surrogates: bool,
@@ -1322,6 +1328,7 @@ impl ScriptThread {
relayout_event,
prepare_for_screenshot,
unminify_js,
+ local_script_source,
userscripts_path,
headless,
@@ -3161,6 +3168,7 @@ impl ScriptThread {
self.relayout_event,
self.prepare_for_screenshot,
self.unminify_js,
+ self.local_script_source.clone(),
self.userscripts_path.clone(),
self.headless,
self.replace_surrogates,
diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs
index 60dbca3cdea..84314244f87 100644
--- a/components/script_traits/lib.rs
+++ b/components/script_traits/lib.rs
@@ -697,6 +697,7 @@ pub trait ScriptThreadFactory {
relayout_event: bool,
prepare_for_screenshot: bool,
unminify_js: bool,
+ local_script_source: Option<String>,
userscripts_path: Option<String>,
headless: bool,
replace_surrogates: bool,