diff options
author | bors-servo <release+servo@mozilla.com> | 2013-10-17 16:34:30 -0700 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2013-10-17 16:34:30 -0700 |
commit | ebe1c1353ca0ffe1f0e195f4ed66abb982f303ee (patch) | |
tree | 9bcc0c8adaf11c7272fb5cd096fe01e69c9af731 | |
parent | 79f4d9a47fd9a79687df22940b6d5044f9b2cd2e (diff) | |
parent | ff24707771d28c9c58398fef310ff2b456034a4a (diff) | |
download | servo-ebe1c1353ca0ffe1f0e195f4ed66abb982f303ee.tar.gz servo-ebe1c1353ca0ffe1f0e195f4ed66abb982f303ee.zip |
auto merge of #1077 : kmcallister/servo/jsstr, r=jdm
This doesn't resolve the big questions of how Servo will represent strings; it's just about doing the conversion correctly for our existing types.
-rw-r--r-- | src/components/script/dom/bindings/utils.rs | 32 | ||||
-rw-r--r-- | src/components/script/html/hubbub_html_parser.rs | 7 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 3 | ||||
m--------- | src/support/spidermonkey/rust-mozjs | 0 | ||||
-rw-r--r-- | src/test/html/content/test_collections.html | 13 |
5 files changed, 31 insertions, 24 deletions
diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 21c1c2b750a..f9d6367f5e5 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -14,17 +14,17 @@ use std::libc; use std::ptr; use std::ptr::{null, to_unsafe_ptr}; use std::str; +use std::vec; use std::unstable::raw::Box; use js::glue::*; use js::glue::{DefineFunctionWithReserved, GetObjectJSClass, RUST_OBJECT_TO_JSVAL}; use js::glue::{js_IsObjectProxyClass, js_IsFunctionProxyClass, IsProxyHandlerFamily}; use js::jsapi::{JS_AlreadyHasOwnProperty, JS_NewObject, JS_NewFunction, JS_GetGlobalObject}; use js::jsapi::{JS_DefineProperties, JS_WrapValue, JS_ForwardGetPropertyTo}; -use js::jsapi::{JS_EncodeString, JS_free, JS_GetStringCharsAndLength}; -use js::jsapi::{JS_GetClass, JS_LinkConstructorAndPrototype}; +use js::jsapi::{JS_GetClass, JS_LinkConstructorAndPrototype, JS_GetStringCharsAndLength}; use js::jsapi::{JS_GetFunctionPrototype, JS_InternString, JS_GetFunctionObject}; use js::jsapi::{JS_HasPropertyById, JS_GetPrototype, JS_GetGlobalForObject}; -use js::jsapi::{JS_NewStringCopyN, JS_DefineFunctions, JS_DefineProperty}; +use js::jsapi::{JS_NewUCStringCopyN, JS_DefineFunctions, JS_DefineProperty}; use js::jsapi::{JS_ValueToString, JS_GetReservedSlot, JS_SetReservedSlot}; use js::jsapi::{JSContext, JSObject, JSBool, jsid, JSClass, JSNative, JSTracer}; use js::jsapi::{JSFunctionSpec, JSPropertySpec, JSVal, JSPropertyDescriptor}; @@ -205,25 +205,27 @@ pub fn jsval_to_str(cx: *JSContext, v: JSVal) -> Result<~str, ()> { } } - let strbuf = JS_EncodeString(cx, jsstr); - let buf = str::raw::from_c_str(strbuf); - JS_free(cx, strbuf as *libc::c_void); - Ok(buf) + let length = 0; + let chars = JS_GetStringCharsAndLength(cx, jsstr, &length); + do vec::raw::buf_as_slice(chars, length as uint) |char_vec| { + Ok(str::from_utf16(char_vec)) + } } } #[fixed_stack_segment] pub unsafe fn domstring_to_jsval(cx: *JSContext, string: &DOMString) -> JSVal { match string { - &None => { - JSVAL_NULL - } - &Some(ref s) => { - do s.as_imm_buf |buf, len| { - let cbuf = cast::transmute(buf); - RUST_STRING_TO_JSVAL(JS_NewStringCopyN(cx, cbuf, len as libc::size_t)) + &None => JSVAL_NULL, + &Some(ref s) => do s.to_utf16().as_imm_buf |buf, len| { + let jsstr = JS_NewUCStringCopyN(cx, buf, len as libc::size_t); + if jsstr.is_null() { + // FIXME: is there something else we should do on failure? + JSVAL_NULL + } else { + RUST_STRING_TO_JSVAL(jsstr) + } } - } } } diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 9bfdc98fb42..4a503f1c5da 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -19,6 +19,7 @@ use std::cast; use std::cell::Cell; use std::comm; use std::comm::{Port, SharedChan}; +use std::str; use std::str::eq_slice; use std::task; use std::from_str::FromStr; @@ -102,7 +103,7 @@ macro_rules! handle_element_base( pub struct JSFile { - data: ~[u8], + data: ~str, url: Url } @@ -222,11 +223,11 @@ fn js_script_listener(to_parent: SharedChan<HtmlDiscoveryMessage>, let bytes = result_port.recv(); if bytes.is_some() { - result_vec.push(JSFile { data: bytes.unwrap(), url: url_clone }); + result_vec.push(JSFile { data: str::from_utf8(bytes.unwrap()), url: url_clone }); } } JSTaskNewInlineScript(data, url) => { - result_vec.push(JSFile { data: data.into_bytes(), url: url }); + result_vec.push(JSFile { data: data, url: url }); } JSTaskExit => { break; diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 9897be2b013..9a729ba2970 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -30,6 +30,7 @@ use std::comm; use std::comm::{Port, SharedChan}; use std::io::read_whole_file; use std::ptr; +use std::str; use std::task::{spawn_sched, SingleThreaded}; use std::util::replace; use dom::window::TimerData; @@ -578,7 +579,7 @@ impl ScriptTask { Ok(bytes) => { compartment.define_functions(debug_fns); cx.evaluate_script(compartment.global_obj, - bytes, + str::from_utf8(bytes), url.path.clone(), 1); } diff --git a/src/support/spidermonkey/rust-mozjs b/src/support/spidermonkey/rust-mozjs -Subproject 1a9a5c3c1462bd3b3e7905ee2834a5ba906f021 +Subproject dc50fb7958312e8ee5b4a03db516bcafd6df3d5 diff --git a/src/test/html/content/test_collections.html b/src/test/html/content/test_collections.html index 93837eb0c86..f3dc6d33e59 100644 --- a/src/test/html/content/test_collections.html +++ b/src/test/html/content/test_collections.html @@ -24,8 +24,10 @@ function check_collection(obj, num, classes, name) { } } -function check_tag(tagname, num, classes) { - check_collection(document.getElementsByTagName(tagname), num, classes, tagname.toUpperCase()); +function check_tag(tagname, num, classes, tagname_upper) { + if (tagname_upper === undefined) + tagname_upper = tagname.toUpperCase(); + check_collection(document.getElementsByTagName(tagname), num, classes, tagname_upper); } check_collection(document.links, 1, [HTMLAnchorElement], "A"); @@ -73,8 +75,9 @@ check_tag("track", 1, [HTMLTrackElement]); check_tag("audio", 1, [HTMLMediaElement, HTMLAudioElement]); check_tag("video", 1, [HTMLMediaElement, HTMLVideoElement]); -// FIXME: Test non-ASCII tag names -check_tag("foo", 1, [HTMLUnknownElement]); +// Test non-ASCII tag names. Uppercasing is ASCII-only per spec: +// http://dom.spec.whatwg.org/#dom-element-tagname +check_tag("foo-á", 1, [HTMLUnknownElement], "FOO-á"); finish(); </script> @@ -134,7 +137,7 @@ finish(); <track></track> </video> -<foo>hi</foo> +<foo-á>hi</foo-á> </body> </html> |