diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-04-01 13:15:46 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-04-01 13:15:46 -0600 |
commit | afbc51a746af79f3daf14d77002a47967ef3d38e (patch) | |
tree | 5ab198b157098962dcf29aab4700fd3c0c5173f4 /components/script/dom/userscripts.rs | |
parent | dd3a58b92427bfd6e33903042272b372b49e9193 (diff) | |
parent | f41acb589a3ccaa908608478889f6f58b6b3e36b (diff) | |
download | servo-afbc51a746af79f3daf14d77002a47967ef3d38e.tar.gz servo-afbc51a746af79f3daf14d77002a47967ef3d38e.zip |
auto merge of #5430 : Manishearth/servo/userscript_path, r=kmcallister
r? @kmcallister
Diffstat (limited to 'components/script/dom/userscripts.rs')
-rw-r--r-- | components/script/dom/userscripts.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/components/script/dom/userscripts.rs b/components/script/dom/userscripts.rs new file mode 100644 index 00000000000..08ed1836aaf --- /dev/null +++ b/components/script/dom/userscripts.rs @@ -0,0 +1,52 @@ +/* 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/. */ + +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; +use dom::bindings::codegen::InheritTypes::NodeCast; +use dom::bindings::js::{JSRef, OptionalRootable, RootedReference}; +use dom::element::AttributeHandlers; +use dom::htmlheadelement::HTMLHeadElement; +use dom::node::{Node, NodeHelpers}; +use util::opts; +use util::resource_files::resources_dir_path; +use std::borrow::ToOwned; +use std::fs::read_dir; +use std::path::PathBuf; + + +pub fn load_script(head: JSRef<HTMLHeadElement>) { + if let Some(ref path_str) = opts::get().userscripts { + let node: &JSRef<Node> = NodeCast::from_borrowed_ref(&head); + let first_child = node.GetFirstChild().root(); + let doc = node.owner_doc().root(); + let doc = doc.r(); + + let path = if &**path_str == "" { + let mut p = resources_dir_path(); + p.push("user-agent-js"); + p + } else { + PathBuf::new(path_str) + }; + + let mut files = read_dir(&path).ok().expect("Bad path passed to --userscripts") + .filter_map(|e| e.ok()) + .map(|e| e.path()).collect::<Vec<_>>(); + + files.sort(); + + for file in files { + let name = match file.into_os_string().into_string() { + Ok(ref s) if s.ends_with(".js") => "file://".to_owned() + &s[..], + _ => continue + }; + let new_script = doc.CreateElement("script".to_owned()).unwrap().root(); + let new_script = new_script.r(); + new_script.set_string_attribute(&atom!("src"), name); + let new_script_node: &JSRef<Node> = NodeCast::from_borrowed_ref(&new_script); + node.InsertBefore(*new_script_node, first_child.r()).unwrap(); + } + } +} |