aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2013-10-17 16:34:30 -0700
committerbors-servo <release+servo@mozilla.com>2013-10-17 16:34:30 -0700
commitebe1c1353ca0ffe1f0e195f4ed66abb982f303ee (patch)
tree9bcc0c8adaf11c7272fb5cd096fe01e69c9af731
parent79f4d9a47fd9a79687df22940b6d5044f9b2cd2e (diff)
parentff24707771d28c9c58398fef310ff2b456034a4a (diff)
downloadservo-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.rs32
-rw-r--r--src/components/script/html/hubbub_html_parser.rs7
-rw-r--r--src/components/script/script_task.rs3
m---------src/support/spidermonkey/rust-mozjs0
-rw-r--r--src/test/html/content/test_collections.html13
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>