diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2015-11-07 04:03:35 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2015-11-07 04:03:35 +0530 |
commit | 33bbed7dc1d3e4f26fbf87e02d2f821015590743 (patch) | |
tree | 25b95a0a91a34b95389e58ac9d3fa024e8814924 /components/script/script_task.rs | |
parent | a0221b91268307b1c2690241a4d24816471c915e (diff) | |
parent | 066867eb86d93dcb79ec85e0e5788015abd52dbf (diff) | |
download | servo-33bbed7dc1d3e4f26fbf87e02d2f821015590743.tar.gz servo-33bbed7dc1d3e4f26fbf87e02d2f821015590743.zip |
Auto merge of #8359 - ben0x539:js-url-query-fragment, r=eefriedman
Append query string + fragment to javascript: url.
When loading a URL whose scheme is javascript, we should do what
https://html.spec.whatwg.org/multipage/browsers.html#javascript-protocol
says and append the URL's query and fragment components to the scheme
data, as well as percent- and utf-8-decode the whole thing, before
evaluating it as javascript.
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8359)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/script_task.rs')
-rw-r--r-- | components/script/script_task.rs | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/components/script/script_task.rs b/components/script/script_task.rs index dda6faaa85b..773d43448c4 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -1671,10 +1671,32 @@ impl ScriptTask { let is_javascript = incomplete.url.scheme == "javascript"; let parse_input = if is_javascript { + use url::percent_encoding::percent_decode_to; + + // Turn javascript: URL into JS code to eval, according to the steps in + // https://html.spec.whatwg.org/multipage/#javascript-protocol let _ar = JSAutoRequest::new(self.get_cx()); - let evalstr = incomplete.url.non_relative_scheme_data().unwrap(); + let mut script_source_bytes = Vec::new(); + // Start with the scheme data of the parsed URL (5.), while percent-decoding (8.) + percent_decode_to(incomplete.url.non_relative_scheme_data().unwrap().as_bytes(), + &mut script_source_bytes); + // Append question mark and query component, if any (6.), while percent-decoding (8.) + if let Some(ref query) = incomplete.url.query { + script_source_bytes.push(b'?'); + percent_decode_to(query.as_bytes(), &mut script_source_bytes); + } + // Append number sign and fragment component if any (7.), while percent-decoding (8.) + if let Some(ref fragment) = incomplete.url.fragment { + script_source_bytes.push(b'#'); + percent_decode_to(fragment.as_bytes(), &mut script_source_bytes); + } + + // UTF-8 decode (9.) + let script_source = String::from_utf8_lossy(&script_source_bytes); + + // Script source is ready to be evaluated (11.) let mut jsval = RootedValue::new(self.get_cx(), UndefinedValue()); - window.evaluate_js_on_global_with_result(evalstr, jsval.handle_mut()); + window.evaluate_js_on_global_with_result(&script_source, jsval.handle_mut()); let strval = DOMString::from_jsval(self.get_cx(), jsval.handle(), StringificationBehavior::Empty); strval.unwrap_or(DOMString::new()) |