aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script
diff options
context:
space:
mode:
authorSean McArthur <sean.monstar@gmail.com>2014-08-20 09:51:45 -0700
committerSean McArthur <sean.monstar@gmail.com>2014-08-21 10:34:12 -0700
commitbc129fee347c47474e11586dc28da5a8ff8b6dd4 (patch)
tree055729f47a1c987413811f030841466c974649ed /src/components/script
parent80c001b2f00fa5982ec896d4a19fd6311a3ece97 (diff)
downloadservo-bc129fee347c47474e11586dc28da5a8ff8b6dd4.tar.gz
servo-bc129fee347c47474e11586dc28da5a8ff8b6dd4.zip
check the type/language of script elements
Diffstat (limited to 'src/components/script')
-rw-r--r--src/components/script/html/hubbub_html_parser.rs58
1 files changed, 57 insertions, 1 deletions
diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs
index 63c65bc9fd8..ea34398e39e 100644
--- a/src/components/script/html/hubbub_html_parser.rs
+++ b/src/components/script/html/hubbub_html_parser.rs
@@ -23,7 +23,7 @@ use servo_net::resource_task::{Load, LoadData, Payload, Done, ResourceTask, load
use servo_util::atom::Atom;
use servo_util::namespace;
use servo_util::namespace::{Namespace, Null};
-use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS};
+use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec};
use servo_util::task::spawn_named;
use std::ascii::StrAsciiExt;
use std::mem;
@@ -291,6 +291,57 @@ pub fn build_element_from_tag(tag: DOMString, ns: Namespace, document: &JSRef<Do
return ElementCast::from_temporary(HTMLUnknownElement::new(tag, document));
}
+// List found at http://whatwg.org/html#support-the-scripting-language
+static SCRIPT_JS_MIMES: StaticStringVec = &[
+ "application/ecmascript",
+ "application/javascript",
+ "application/x-ecmascript",
+ "application/x-javascript",
+ "text/ecmascript",
+ "text/javascript",
+ "text/javascript1.0",
+ "text/javascript1.1",
+ "text/javascript1.2",
+ "text/javascript1.3",
+ "text/javascript1.4",
+ "text/javascript1.5",
+ "text/jscript",
+ "text/livescript",
+ "text/x-ecmascript",
+ "text/x-javascript",
+];
+
+fn is_javascript(script: &JSRef<Element>) -> bool {
+ match script.get_attribute(Null, "type").root().map(|s| s.Value()) {
+ Some(ref s) if s.is_empty() => {
+ // type attr exists, but empty means js
+ debug!("script type empty, inferring js");
+ true
+ },
+ Some(ref s) => {
+ debug!("script type={:s}", *s);
+ SCRIPT_JS_MIMES.contains(&s.as_slice().trim_chars(HTML_SPACE_CHARACTERS))
+ },
+ None => {
+ debug!("no script type");
+ match script.get_attribute(Null, "language").root().map(|s| s.Value()) {
+ Some(ref s) if s.is_empty() => {
+ debug!("script language empty, inferring js");
+ true
+ },
+ Some(ref s) => {
+ debug!("script language={:s}", *s);
+ SCRIPT_JS_MIMES.contains(&"text/".to_string().append(s.as_slice()).as_slice())
+ },
+ None => {
+ debug!("no script type or language, inferring js");
+ true
+ }
+ }
+ }
+ }
+}
+
pub fn parse_html(page: &Page,
document: &JSRef<Document>,
url: Url,
@@ -494,6 +545,11 @@ pub fn parse_html(page: &Page,
complete_script: |script| {
unsafe {
let script: &JSRef<Element> = &*from_hubbub_node(script).root();
+
+ if !is_javascript(script) {
+ return;
+ }
+
match script.get_attribute(Null, "src").root() {
Some(src) => {
debug!("found script: {:s}", src.deref().Value());