mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Make chrome: URLs have a "host".
This commit is contained in:
parent
7375e2cedd
commit
374679852c
4 changed files with 20 additions and 10 deletions
|
@ -8,14 +8,18 @@ use net_traits::{LoadConsumer, LoadData, NetworkError};
|
|||
use resource_thread::{CancellationListener, send_error};
|
||||
use std::sync::Arc;
|
||||
use url::Url;
|
||||
use url::percent_encoding::percent_decode;
|
||||
use util::resource_files::resources_dir_path;
|
||||
|
||||
pub fn resolve_chrome_url(url: &Url) -> Result<Url, ()> {
|
||||
assert_eq!(url.scheme(), "chrome");
|
||||
if url.host_str() != Some("resources") {
|
||||
return Err(())
|
||||
}
|
||||
let resources = resources_dir_path();
|
||||
let mut path = resources.clone();
|
||||
for segment in url.path_segments().unwrap() {
|
||||
path.push(segment)
|
||||
path.push(&*try!(percent_decode(segment.as_bytes()).decode_utf8().map_err(|_| ())))
|
||||
}
|
||||
// Don't allow chrome URLs access to files outside of the resources directory.
|
||||
if !(path.starts_with(resources) && path.exists()) {
|
||||
|
|
|
@ -42,7 +42,7 @@ lazy_static! {
|
|||
Ok(res) => {
|
||||
let ua_stylesheet = Stylesheet::from_bytes(
|
||||
&res,
|
||||
Url::parse(&format!("chrome:///{:?}", filename)).unwrap(),
|
||||
Url::parse(&format!("chrome://resources/{:?}", filename)).unwrap(),
|
||||
None,
|
||||
None,
|
||||
Origin::UserAgent,
|
||||
|
@ -69,7 +69,7 @@ lazy_static! {
|
|||
Ok(res) => {
|
||||
Stylesheet::from_bytes(
|
||||
&res,
|
||||
Url::parse("chrome:///quirks-mode.css").unwrap(),
|
||||
Url::parse("chrome://resources/quirks-mode.css").unwrap(),
|
||||
None,
|
||||
None,
|
||||
Origin::UserAgent,
|
||||
|
|
|
@ -3,6 +3,6 @@
|
|||
<title>Certificate error</title>
|
||||
</head>
|
||||
<body>
|
||||
<img src="chrome:/badcert.jpg">
|
||||
<img src="chrome://resources/badcert.jpg">
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -7,40 +7,46 @@ use url::Url;
|
|||
|
||||
#[test]
|
||||
fn test_relative() {
|
||||
let url = Url::parse("chrome:/../something").unwrap();
|
||||
let url = Url::parse("chrome://resources/../something").unwrap();
|
||||
assert!(resolve_chrome_url(&url).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_relative_2() {
|
||||
let url = Url::parse("chrome:/subdir/../something").unwrap();
|
||||
let url = Url::parse("chrome://resources/subdir/../something").unwrap();
|
||||
assert!(resolve_chrome_url(&url).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
fn test_absolute() {
|
||||
let url = Url::parse("chrome:/etc/passwd").unwrap();
|
||||
let url = Url::parse("chrome://resources/etc/passwd").unwrap();
|
||||
assert!(resolve_chrome_url(&url).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(target_os = "windows")]
|
||||
fn test_absolute_2() {
|
||||
let url = Url::parse("chrome:/C:\\Windows").unwrap();
|
||||
let url = Url::parse("chrome://resources/C:\\Windows").unwrap();
|
||||
assert!(resolve_chrome_url(&url).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(target_os = "windows")]
|
||||
fn test_absolute_3() {
|
||||
let url = Url::parse("chrome:/\\\\server/C$").unwrap();
|
||||
let url = Url::parse("chrome://resources/\\\\server/C$").unwrap();
|
||||
assert!(resolve_chrome_url(&url).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_valid() {
|
||||
let url = Url::parse("chrome:/badcert.jpg").unwrap();
|
||||
let url = Url::parse("chrome://resources/badcert.jpg").unwrap();
|
||||
let resolved = resolve_chrome_url(&url).unwrap();
|
||||
assert_eq!(resolved.scheme(), "file");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_incorrect_host() {
|
||||
let url = Url::parse("chrome://not-resources/badcert.jpg").unwrap();
|
||||
assert!(resolve_chrome_url(&url).is_err());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue