aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/textencoder.rs94
-rw-r--r--components/script/dom/webidls/TextEncoder.webidl12
3 files changed, 107 insertions, 0 deletions
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 63170f8b70b..32d2dcb74fa 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -312,6 +312,7 @@ pub mod servohtmlparser;
pub mod storage;
pub mod storageevent;
pub mod text;
+pub mod textencoder;
pub mod treewalker;
pub mod uievent;
pub mod urlhelper;
diff --git a/components/script/dom/textencoder.rs b/components/script/dom/textencoder.rs
new file mode 100644
index 00000000000..e568a6dfa75
--- /dev/null
+++ b/components/script/dom/textencoder.rs
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+use dom::bindings::codegen::Bindings::TextEncoderBinding;
+use dom::bindings::codegen::Bindings::TextEncoderBinding::TextEncoderMethods;
+use dom::bindings::global::GlobalRef;
+use dom::bindings::error::Fallible;
+use dom::bindings::error::Error::IndexSize;
+use dom::bindings::js::{JSRef, Temporary};
+use dom::bindings::str::USVString;
+use dom::bindings::utils::{Reflector, reflect_dom_object};
+
+use util::str::DOMString;
+
+use std::borrow::ToOwned;
+use std::ascii::AsciiExt;
+use std::ptr;
+
+use encoding::types::EncodingRef;
+use encoding::{Encoding, EncoderTrap};
+use encoding::label::encoding_from_whatwg_label;
+
+use libc::uint8_t;
+use js::jsapi::{JSContext, JSObject};
+use js::jsfriendapi::bindgen::{JS_NewUint8Array, JS_GetUint8ArrayData};
+
+#[dom_struct]
+pub struct TextEncoder {
+ reflector_: Reflector,
+ encoding: DOMString,
+ encoder: EncodingRef,
+}
+
+impl TextEncoder {
+ fn new_inherited(encoding: DOMString, encoder: EncodingRef) -> TextEncoder {
+ TextEncoder {
+ reflector_: Reflector::new(),
+ encoding: encoding,
+ encoder: encoder,
+ }
+ }
+
+ pub fn new(global: GlobalRef, encoding: DOMString, encoder: EncodingRef) -> Temporary<TextEncoder> {
+ reflect_dom_object(box TextEncoder::new_inherited(encoding, encoder),
+ global,
+ TextEncoderBinding::Wrap)
+ }
+
+ // https://encoding.spec.whatwg.org/#dom-textencoder
+ pub fn Constructor(global: GlobalRef,
+ label: DOMString) -> Fallible<Temporary<TextEncoder>> {
+ let encoding = match encoding_from_whatwg_label(label.trim().as_slice().to_ascii_lowercase().as_slice()) {
+ Some(enc) => enc,
+ None => {
+ debug!("Encoding Label Not Supported");
+ // TODO: should throw RangeError
+ return Err(IndexSize)
+ }
+ };
+
+ match encoding.name() {
+ "utf-8" | "utf-16be" | "utf-16le" => {
+ Ok(TextEncoder::new(global, encoding.name().to_owned(), encoding))
+ }
+ _ => {
+ debug!("Encoding Not UTF");
+ // TODO: should throw RangeError
+ Err(IndexSize)
+ }
+ }
+ }
+}
+
+impl<'a> TextEncoderMethods for JSRef<'a, TextEncoder> {
+ // https://encoding.spec.whatwg.org/#dom-textencoder-encoding
+ fn Encoding(self) -> DOMString {
+ self.encoding.clone()
+ }
+
+ // https://encoding.spec.whatwg.org/#dom-textencoder-encode
+ #[allow(unsafe_code)]
+ fn Encode(self, cx: *mut JSContext, input: USVString) -> *mut JSObject {
+ unsafe {
+ let output = self.encoder.encode(input.0.as_slice(), EncoderTrap::Strict).unwrap();
+ let length = output.len() as u32;
+ let js_object: *mut JSObject = JS_NewUint8Array(cx, length);
+
+ let js_object_data: *mut uint8_t = JS_GetUint8ArrayData(js_object, cx);
+ ptr::copy_nonoverlapping(js_object_data, output.as_ptr(), length as usize);
+ return js_object;
+ }
+ }
+}
diff --git a/components/script/dom/webidls/TextEncoder.webidl b/components/script/dom/webidls/TextEncoder.webidl
new file mode 100644
index 00000000000..697f7ca9146
--- /dev/null
+++ b/components/script/dom/webidls/TextEncoder.webidl
@@ -0,0 +1,12 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* https://encoding.spec.whatwg.org/#interface-textencoder */
+[Constructor(optional DOMString utfLabel = "utf-8")/*, Exposed=Window,Worker */]
+interface TextEncoder {
+ readonly attribute DOMString encoding;
+ [NewObject]
+ Uint8Array encode(optional USVString input = "");
+};