mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
reading unminified scripts from disk
This commit is contained in:
parent
6a1cb940bf
commit
ee6906443f
6 changed files with 91 additions and 31 deletions
|
@ -210,6 +210,9 @@ pub struct Opts {
|
||||||
/// Unminify Javascript.
|
/// Unminify Javascript.
|
||||||
pub unminify_js: bool,
|
pub unminify_js: bool,
|
||||||
|
|
||||||
|
/// Directory path that was created with "unminify-js"
|
||||||
|
pub local_script_source: Option<String>,
|
||||||
|
|
||||||
/// Print Progressive Web Metrics to console.
|
/// Print Progressive Web Metrics to console.
|
||||||
pub print_pwm: bool,
|
pub print_pwm: bool,
|
||||||
}
|
}
|
||||||
|
@ -522,6 +525,7 @@ pub fn default_opts() -> Opts {
|
||||||
signpost: false,
|
signpost: false,
|
||||||
certificate_path: None,
|
certificate_path: None,
|
||||||
unminify_js: false,
|
unminify_js: false,
|
||||||
|
local_script_source: None,
|
||||||
print_pwm: false,
|
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.optopt("", "profiler-db-name", "Profiler database name", "");
|
||||||
opts.optflag("", "print-pwm", "Print Progressive Web Metrics");
|
opts.optflag("", "print-pwm", "Print Progressive Web Metrics");
|
||||||
opts.optopt("", "vslogger-level", "Visual Studio logger level", "Warn");
|
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) {
|
let opt_match = match opts.parse(args) {
|
||||||
Ok(m) => m,
|
Ok(m) => m,
|
||||||
|
@ -923,6 +933,7 @@ pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingR
|
||||||
signpost: debug_options.signpost,
|
signpost: debug_options.signpost,
|
||||||
certificate_path: opt_match.opt_str("certificate-path"),
|
certificate_path: opt_match.opt_str("certificate-path"),
|
||||||
unminify_js: opt_match.opt_present("unminify-js"),
|
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"),
|
print_pwm: opt_match.opt_present("print-pwm"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -584,6 +584,7 @@ impl UnprivilegedPipelineContent {
|
||||||
self.opts.exit_after_load ||
|
self.opts.exit_after_load ||
|
||||||
self.opts.webdriver_port.is_some(),
|
self.opts.webdriver_port.is_some(),
|
||||||
self.opts.unminify_js,
|
self.opts.unminify_js,
|
||||||
|
self.opts.local_script_source,
|
||||||
self.opts.userscripts,
|
self.opts.userscripts,
|
||||||
self.opts.headless,
|
self.opts.headless,
|
||||||
self.opts.replace_surrogates,
|
self.opts.replace_surrogates,
|
||||||
|
|
|
@ -45,7 +45,7 @@ use servo_atoms::Atom;
|
||||||
use servo_url::ImmutableOrigin;
|
use servo_url::ImmutableOrigin;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
use std::cell::Cell;
|
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::io::{Read, Seek, Write};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
@ -698,17 +698,34 @@ impl HTMLScriptElement {
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
let (base, has_name) = match script.url.as_str().ends_with("/") {
|
||||||
let path = if script.external {
|
true => (
|
||||||
// External script.
|
path.join(&script.url[url::Position::BeforeHost..])
|
||||||
let path_parts = script.url.path_segments().unwrap();
|
.as_path()
|
||||||
match path_parts.last() {
|
.to_owned(),
|
||||||
Some(script_name) => path.join(script_name),
|
false,
|
||||||
None => path.join(Uuid::new_v4().to_string()),
|
),
|
||||||
|
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.
|
||||||
|
path.join(&script.url[url::Position::BeforeHost..])
|
||||||
} else {
|
} else {
|
||||||
// Inline script.
|
// Inline script or url ends with '/'
|
||||||
path.join(Uuid::new_v4().to_string())
|
base.join(Uuid::new_v4().to_string())
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("script will be stored in {:?}", path);
|
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>
|
/// <https://html.spec.whatwg.org/multipage/#execute-the-script-block>
|
||||||
pub fn execute(&self, result: ScriptResult) {
|
pub fn execute(&self, result: ScriptResult) {
|
||||||
// Step 1.
|
// Step 1.
|
||||||
|
@ -740,6 +785,7 @@ impl HTMLScriptElement {
|
||||||
|
|
||||||
if script.type_ == ScriptType::Classic {
|
if script.type_ == ScriptType::Classic {
|
||||||
self.unminify_js(&mut script);
|
self.unminify_js(&mut script);
|
||||||
|
self.substitute_with_local_script(&mut script);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 3.
|
// Step 3.
|
||||||
|
|
|
@ -119,7 +119,7 @@ use script_traits::{
|
||||||
use script_traits::{TimerSchedulerMsg, WebrenderIpcSender, WindowSizeData, WindowSizeType};
|
use script_traits::{TimerSchedulerMsg, WebrenderIpcSender, WindowSizeData, WindowSizeType};
|
||||||
use selectors::attr::CaseSensitivity;
|
use selectors::attr::CaseSensitivity;
|
||||||
use servo_geometry::{f32_rect_to_au_rect, MaxRect};
|
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::Cow;
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
@ -127,7 +127,6 @@ use std::collections::hash_map::Entry;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs;
|
|
||||||
use std::io::{stderr, stdout, Write};
|
use std::io::{stderr, stdout, Write};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
@ -287,6 +286,9 @@ pub struct Window {
|
||||||
/// opt is enabled.
|
/// opt is enabled.
|
||||||
unminified_js_dir: DomRefCell<Option<String>>,
|
unminified_js_dir: DomRefCell<Option<String>>,
|
||||||
|
|
||||||
|
/// Directory with stored unminified scripts
|
||||||
|
local_script_source: Option<String>,
|
||||||
|
|
||||||
/// Worklets
|
/// Worklets
|
||||||
test_worklet: MutNullableDom<Worklet>,
|
test_worklet: MutNullableDom<Worklet>,
|
||||||
/// <https://drafts.css-houdini.org/css-paint-api-1/#paint-worklet>
|
/// <https://drafts.css-houdini.org/css-paint-api-1/#paint-worklet>
|
||||||
|
@ -1977,25 +1979,10 @@ impl Window {
|
||||||
if !self.unminify_js {
|
if !self.unminify_js {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Create a folder for the document host to store unminified scripts.
|
// Set a path 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();
|
let mut path = env::current_dir().unwrap();
|
||||||
path.push("unminified-js");
|
path.push("unminified-js");
|
||||||
path.push(host);
|
*self.unminified_js_dir.borrow_mut() = Some(path.into_os_string().into_string().unwrap());
|
||||||
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),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Commence a new URL load which will either replace this window or scroll to a fragment.
|
/// 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()
|
self.unminified_js_dir.borrow().clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn local_script_source(&self) -> &Option<String> {
|
||||||
|
&self.local_script_source
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_navigation_start(&self) {
|
pub fn set_navigation_start(&self) {
|
||||||
let current_time = time::get_time();
|
let current_time = time::get_time();
|
||||||
let now = (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64;
|
let now = (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64;
|
||||||
|
@ -2334,6 +2325,7 @@ impl Window {
|
||||||
relayout_event: bool,
|
relayout_event: bool,
|
||||||
prepare_for_screenshot: bool,
|
prepare_for_screenshot: bool,
|
||||||
unminify_js: bool,
|
unminify_js: bool,
|
||||||
|
local_script_source: Option<String>,
|
||||||
userscripts_path: Option<String>,
|
userscripts_path: Option<String>,
|
||||||
is_headless: bool,
|
is_headless: bool,
|
||||||
replace_surrogates: bool,
|
replace_surrogates: bool,
|
||||||
|
@ -2408,6 +2400,7 @@ impl Window {
|
||||||
webxr_registry,
|
webxr_registry,
|
||||||
pending_layout_images: Default::default(),
|
pending_layout_images: Default::default(),
|
||||||
unminified_js_dir: Default::default(),
|
unminified_js_dir: Default::default(),
|
||||||
|
local_script_source,
|
||||||
test_worklet: Default::default(),
|
test_worklet: Default::default(),
|
||||||
paint_worklet: Default::default(),
|
paint_worklet: Default::default(),
|
||||||
webrender_document,
|
webrender_document,
|
||||||
|
|
|
@ -649,6 +649,9 @@ pub struct ScriptThread {
|
||||||
/// Unminify Javascript.
|
/// Unminify Javascript.
|
||||||
unminify_js: bool,
|
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
|
/// 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
|
/// the resources/user-agent-js directory, and if the option isn't passed userscripts
|
||||||
/// won't be loaded
|
/// won't be loaded
|
||||||
|
@ -723,6 +726,7 @@ impl ScriptThreadFactory for ScriptThread {
|
||||||
relayout_event: bool,
|
relayout_event: bool,
|
||||||
prepare_for_screenshot: bool,
|
prepare_for_screenshot: bool,
|
||||||
unminify_js: bool,
|
unminify_js: bool,
|
||||||
|
local_script_source: Option<String>,
|
||||||
userscripts_path: Option<String>,
|
userscripts_path: Option<String>,
|
||||||
headless: bool,
|
headless: bool,
|
||||||
replace_surrogates: bool,
|
replace_surrogates: bool,
|
||||||
|
@ -758,6 +762,7 @@ impl ScriptThreadFactory for ScriptThread {
|
||||||
relayout_event,
|
relayout_event,
|
||||||
prepare_for_screenshot,
|
prepare_for_screenshot,
|
||||||
unminify_js,
|
unminify_js,
|
||||||
|
local_script_source,
|
||||||
userscripts_path,
|
userscripts_path,
|
||||||
headless,
|
headless,
|
||||||
replace_surrogates,
|
replace_surrogates,
|
||||||
|
@ -1209,6 +1214,7 @@ impl ScriptThread {
|
||||||
relayout_event: bool,
|
relayout_event: bool,
|
||||||
prepare_for_screenshot: bool,
|
prepare_for_screenshot: bool,
|
||||||
unminify_js: bool,
|
unminify_js: bool,
|
||||||
|
local_script_source: Option<String>,
|
||||||
userscripts_path: Option<String>,
|
userscripts_path: Option<String>,
|
||||||
headless: bool,
|
headless: bool,
|
||||||
replace_surrogates: bool,
|
replace_surrogates: bool,
|
||||||
|
@ -1322,6 +1328,7 @@ impl ScriptThread {
|
||||||
relayout_event,
|
relayout_event,
|
||||||
prepare_for_screenshot,
|
prepare_for_screenshot,
|
||||||
unminify_js,
|
unminify_js,
|
||||||
|
local_script_source,
|
||||||
|
|
||||||
userscripts_path,
|
userscripts_path,
|
||||||
headless,
|
headless,
|
||||||
|
@ -3161,6 +3168,7 @@ impl ScriptThread {
|
||||||
self.relayout_event,
|
self.relayout_event,
|
||||||
self.prepare_for_screenshot,
|
self.prepare_for_screenshot,
|
||||||
self.unminify_js,
|
self.unminify_js,
|
||||||
|
self.local_script_source.clone(),
|
||||||
self.userscripts_path.clone(),
|
self.userscripts_path.clone(),
|
||||||
self.headless,
|
self.headless,
|
||||||
self.replace_surrogates,
|
self.replace_surrogates,
|
||||||
|
|
|
@ -697,6 +697,7 @@ pub trait ScriptThreadFactory {
|
||||||
relayout_event: bool,
|
relayout_event: bool,
|
||||||
prepare_for_screenshot: bool,
|
prepare_for_screenshot: bool,
|
||||||
unminify_js: bool,
|
unminify_js: bool,
|
||||||
|
local_script_source: Option<String>,
|
||||||
userscripts_path: Option<String>,
|
userscripts_path: Option<String>,
|
||||||
headless: bool,
|
headless: bool,
|
||||||
replace_surrogates: bool,
|
replace_surrogates: bool,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue