Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a `-Z replace-surrogates` command-line option. #6614

Merged
merged 3 commits into from Jul 14, 2015
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Next

Add a `-Z replace-surrogates` command-line option.

See #6564.
  • Loading branch information
SimonSapin committed Jul 13, 2015
commit 90dbd86ed721aeeb071ff1c9a4b13dc94e029c34
@@ -352,10 +352,33 @@ pub fn jsstring_to_str(cx: *mut JSContext, s: *mut JSString) -> DOMString {
JS_GetTwoByteStringCharsAndLength(cx, ptr::null(), s, &mut length)
};
assert!(!chars.is_null());
let char_vec = unsafe {
let potentially_ill_formed_utf16 = unsafe {
slice::from_raw_parts(chars as *const u16, length as usize)
};
String::from_utf16(char_vec).unwrap()
let mut s = String::with_capacity(length as usize);
for item in ::rustc_unicode::str::utf16_items(potentially_ill_formed_utf16) {
use ::rustc_unicode::str::Utf16Item::*;
match item {
ScalarValue(c) => s.push(c),
LoneSurrogate(_) => {
// FIXME: Add more info like document URL in the message?
macro_rules! message {
() => {
"Found an unpaired surrogate in a DOM string. \
If you see this in real web content, \
please comment on https://github.com/servo/servo/issues/6564"
}
}
if ::util::opts::get().replace_surrogates {
warn!(message!());
s.push('\u{FFFD}');
} else {
panic!(message!());
}
}
}
}
s
}
}

@@ -21,6 +21,7 @@
#![feature(rc_unique)]
#![feature(slice_chars)]
#![feature(str_utf16)]
#![feature(unicode)]
#![feature(vec_push_all)]

#![deny(unsafe_code)]
@@ -49,6 +50,7 @@ extern crate msg;
extern crate net_traits;
extern crate num;
extern crate rustc_serialize;
extern crate rustc_unicode;
extern crate time;
extern crate canvas;
extern crate canvas_traits;
@@ -69,6 +69,11 @@ pub struct Opts {
pub userscripts: Option<String>,

pub output_file: Option<String>,

/// Replace unpaires surrogates in DOM strings with U+FFFD.
/// See https://github.com/servo/servo/issues/6564
pub replace_surrogates: bool,

pub headless: bool,
pub hard_fail: bool,

@@ -187,6 +192,8 @@ pub fn print_debug_usage(app: &str) -> ! {
print_option("disable-share-style-cache",
"Disable the style sharing cache.");
print_option("parallel-display-list-building", "Build display lists in parallel.");
print_option("replace-surrogates", "Replace unpaires surrogates in DOM strings with U+FFFD. \
See https://github.com/servo/servo/issues/6564");

println!("");

@@ -223,6 +230,7 @@ pub fn default_opts() -> Opts {
nossl: false,
userscripts: None,
output_file: None,
replace_surrogates: false,
headless: true,
hard_fail: true,
bubble_inline_sizes_separately: false,
@@ -397,6 +405,7 @@ pub fn from_cmdline_args(args: &[String]) {
nossl: nossl,
userscripts: opt_match.opt_default("userscripts", ""),
output_file: opt_match.opt_str("o"),
replace_surrogates: debug_options.contains(&"replace-surrogates"),
headless: opt_match.opt_present("z"),
hard_fail: opt_match.opt_present("f"),
bubble_inline_sizes_separately: bubble_inline_sizes_separately,
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.