diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/attr.rs | 27 | ||||
-rw-r--r-- | components/script/dom/characterdata.rs | 9 | ||||
-rw-r--r-- | components/script/dom/element.rs | 10 | ||||
-rw-r--r-- | components/script/dom/eventtarget.rs | 11 | ||||
-rw-r--r-- | components/script/dom/globalscope.rs | 11 | ||||
-rwxr-xr-x | components/script/dom/htmlinputelement.rs | 55 | ||||
-rwxr-xr-x | components/script/dom/htmltextareaelement.rs | 25 | ||||
-rw-r--r-- | components/script/dom/node.rs | 13 |
8 files changed, 79 insertions, 82 deletions
diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index cea5df2abf5..e2e8b79f9af 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -234,27 +234,27 @@ impl Attr { #[allow(unsafe_code)] pub trait AttrHelpersForLayout<'dom> { - unsafe fn value(self) -> &'dom AttrValue; - unsafe fn value_ref_forever(self) -> &'dom str; - unsafe fn value_tokens(self) -> Option<&'dom [Atom]>; - unsafe fn local_name_atom(self) -> LocalName; + fn value(self) -> &'dom AttrValue; + fn as_str(self) -> &'dom str; + fn as_tokens(self) -> Option<&'dom [Atom]>; + fn local_name(self) -> &'dom LocalName; + fn namespace(self) -> &'dom Namespace; } #[allow(unsafe_code)] impl<'dom> AttrHelpersForLayout<'dom> for LayoutDom<'dom, Attr> { #[inline] - unsafe fn value(self) -> &'dom AttrValue { - (*self.unsafe_get()).value.borrow_for_layout() + fn value(self) -> &'dom AttrValue { + unsafe { self.unsafe_get().value.borrow_for_layout() } } #[inline] - unsafe fn value_ref_forever(self) -> &'dom str { + fn as_str(self) -> &'dom str { &**self.value() } #[inline] - unsafe fn value_tokens(self) -> Option<&'dom [Atom]> { - // This transmute is used to cheat the lifetime restriction. + fn as_tokens(self) -> Option<&'dom [Atom]> { match *self.value() { AttrValue::TokenList(_, ref tokens) => Some(tokens), _ => None, @@ -262,7 +262,12 @@ impl<'dom> AttrHelpersForLayout<'dom> for LayoutDom<'dom, Attr> { } #[inline] - unsafe fn local_name_atom(self) -> LocalName { - (*self.unsafe_get()).identifier.local_name.clone() + fn local_name(self) -> &'dom LocalName { + unsafe { &self.unsafe_get().identifier.local_name } + } + + #[inline] + fn namespace(self) -> &'dom Namespace { + unsafe { &self.unsafe_get().identifier.namespace } } } diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index 4e0d32d4456..f8c5acb5a8f 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -280,16 +280,15 @@ impl CharacterDataMethods for CharacterData { } } -#[allow(unsafe_code)] pub trait LayoutCharacterDataHelpers<'dom> { - unsafe fn data_for_layout(self) -> &'dom str; + fn data_for_layout(self) -> &'dom str; } -#[allow(unsafe_code)] impl<'dom> LayoutCharacterDataHelpers<'dom> for LayoutDom<'dom, CharacterData> { + #[allow(unsafe_code)] #[inline] - unsafe fn data_for_layout(self) -> &'dom str { - &(*self.unsafe_get()).data.borrow_for_layout() + fn data_for_layout(self) -> &'dom str { + unsafe { self.unsafe_get().data.borrow_for_layout() } } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 602cb148d7a..7d167bf2574 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -578,7 +578,7 @@ pub unsafe fn get_attr_for_layout<'dom>( .iter() .find(|attr| { let attr = attr.to_layout(); - *name == attr.local_name_atom() && (*attr.unsafe_get()).namespace() == namespace + name == attr.local_name() && namespace == attr.namespace() }) .map(|attr| attr.to_layout()) } @@ -600,7 +600,7 @@ impl RawLayoutElementHelpers for Element { namespace: &Namespace, name: &LocalName, ) -> Option<&'a str> { - get_attr_for_layout(self, namespace, name).map(|attr| attr.value_ref_forever()) + get_attr_for_layout(self, namespace, name).map(|attr| attr.as_str()) } #[inline] @@ -610,7 +610,7 @@ impl RawLayoutElementHelpers for Element { .iter() .filter_map(|attr| { let attr = attr.to_layout(); - if *name == attr.local_name_atom() { + if name == attr.local_name() { Some(attr.value()) } else { None @@ -656,7 +656,7 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { get_attr_for_layout(&*self.unsafe_get(), &ns!(), &local_name!("class")).map_or( false, |attr| { - attr.value_tokens() + attr.as_tokens() .unwrap() .iter() .any(|atom| case_sensitivity.eq_atom(atom, name)) @@ -668,7 +668,7 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { #[inline] unsafe fn get_classes_for_layout(self) -> Option<&'dom [Atom]> { get_attr_for_layout(&*self.unsafe_get(), &ns!(), &local_name!("class")) - .map(|attr| attr.value_tokens().unwrap()) + .map(|attr| attr.as_tokens().unwrap()) } #[allow(unsafe_code)] diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index bc726d02119..b65fcc6baf1 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -36,7 +36,8 @@ use crate::dom::workerglobalscope::WorkerGlobalScope; use crate::realms::{enter_realm, InRealm}; use dom_struct::dom_struct; use fnv::FnvHasher; -use js::jsapi::{JS_GetFunctionObject, SourceText}; +use js::jsapi::JS_GetFunctionObject; +use js::rust::transform_u16_to_source_text; use js::rust::wrappers::CompileFunction; use js::rust::{CompileOptionsWrapper, RootedObjectVectorWrapper}; use libc::c_char; @@ -47,7 +48,6 @@ use std::collections::HashMap; use std::default::Default; use std::ffi::CString; use std::hash::BuildHasherDefault; -use std::marker::PhantomData; use std::mem; use std::ops::{Deref, DerefMut}; use std::rc::Rc; @@ -539,12 +539,7 @@ impl EventTarget { name.as_ptr(), args.len() as u32, args.as_ptr(), - &mut SourceText { - units_: body.as_ptr() as *const _, - length_: body.len() as u32, - ownsUnits_: false, - _phantom_0: PhantomData, - }, + &mut transform_u16_to_source_text(&body), ) }); if handler.get().is_null() { diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 9e55f593f59..ffa63d4eb37 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -67,9 +67,10 @@ use ipc_channel::router::ROUTER; use js::glue::{IsWrapper, UnwrapObjectDynamic}; use js::jsapi::{CurrentGlobalOrNull, GetNonCCWObjectGlobal}; use js::jsapi::{HandleObject, Heap}; -use js::jsapi::{JSContext, JSObject, SourceText}; +use js::jsapi::{JSContext, JSObject}; use js::jsval::{JSVal, UndefinedValue}; use js::panic::maybe_resume_unwind; +use js::rust::transform_str_to_source_text; use js::rust::wrappers::Evaluate2; use js::rust::{get_object_class, CompileOptionsWrapper, ParentRuntime, Runtime}; use js::rust::{HandleValue, MutableHandleValue}; @@ -97,7 +98,6 @@ use std::cell::{Cell, RefCell, RefMut}; use std::collections::hash_map::Entry; use std::collections::{HashMap, VecDeque}; use std::ffi::CString; -use std::marker::PhantomData; use std::mem; use std::ops::Index; use std::rc::Rc; @@ -2166,12 +2166,7 @@ impl GlobalScope { Evaluate2( *cx, options.ptr, - &mut SourceText { - units_: code.as_ptr() as *const _, - length_: code.len() as u32, - ownsUnits_: false, - _phantom_0: PhantomData, - }, + &mut transform_str_to_source_text(code), rval, ) }; diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 05eca7b35eb..5d7438ecc4a 100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -67,7 +67,7 @@ use profile_traits::ipc; use script_layout_interface::rpc::TextIndexResponse; use script_traits::ScriptToConstellationChan; use servo_atoms::Atom; -use std::borrow::ToOwned; +use std::borrow::Cow; use std::cell::Cell; use std::ops::Range; use std::ptr::NonNull; @@ -705,9 +705,8 @@ impl HTMLInputElement { } } -pub trait LayoutHTMLInputElementHelpers { - #[allow(unsafe_code)] - unsafe fn value_for_layout(self) -> String; +pub trait LayoutHTMLInputElementHelpers<'dom> { + fn value_for_layout(self) -> Cow<'dom, str>; #[allow(unsafe_code)] unsafe fn size_for_layout(self) -> u32; #[allow(unsafe_code)] @@ -726,41 +725,47 @@ unsafe fn get_raw_textinput_value(input: LayoutDom<HTMLInputElement>) -> DOMStri .get_content() } -impl LayoutHTMLInputElementHelpers for LayoutDom<'_, HTMLInputElement> { +impl<'dom> LayoutHTMLInputElementHelpers<'dom> for LayoutDom<'dom, HTMLInputElement> { #[allow(unsafe_code)] - unsafe fn value_for_layout(self) -> String { - #[allow(unsafe_code)] - unsafe fn get_raw_attr_value( - input: LayoutDom<'_, HTMLInputElement>, - default: &str, - ) -> String { - let elem = input.upcast::<Element>(); - let value = (*elem.unsafe_get()) - .get_attr_val_for_layout(&ns!(), &local_name!("value")) - .unwrap_or(default); - String::from(value) + fn value_for_layout(self) -> Cow<'dom, str> { + fn get_raw_attr_value<'dom>( + input: LayoutDom<'dom, HTMLInputElement>, + default: &'static str, + ) -> Cow<'dom, str> { + unsafe { + input + .upcast::<Element>() + .unsafe_get() + .get_attr_val_for_layout(&ns!(), &local_name!("value")) + .unwrap_or(default) + .into() + } } - match (*self.unsafe_get()).input_type() { - InputType::Checkbox | InputType::Radio => String::new(), - InputType::File | InputType::Image => String::new(), + let placeholder = unsafe { &**self.unsafe_get().placeholder.borrow_for_layout() }; + match unsafe { self.unsafe_get().input_type() } { + InputType::Checkbox | InputType::Radio => "".into(), + InputType::File | InputType::Image => "".into(), InputType::Button => get_raw_attr_value(self, ""), InputType::Submit => get_raw_attr_value(self, DEFAULT_SUBMIT_VALUE), InputType::Reset => get_raw_attr_value(self, DEFAULT_RESET_VALUE), InputType::Password => { - let text = get_raw_textinput_value(self); + let text = unsafe { get_raw_textinput_value(self) }; if !text.is_empty() { - text.chars().map(|_| PASSWORD_REPLACEMENT_CHAR).collect() + text.chars() + .map(|_| PASSWORD_REPLACEMENT_CHAR) + .collect::<String>() + .into() } else { - String::from((*self.unsafe_get()).placeholder.borrow_for_layout().clone()) + placeholder.into() } }, _ => { - let text = get_raw_textinput_value(self); + let text = unsafe { get_raw_textinput_value(self) }; if !text.is_empty() { - String::from(text) + text.into() } else { - String::from((*self.unsafe_get()).placeholder.borrow_for_layout().clone()) + placeholder.into() } }, } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 8ee42bc2c86..e3721a78213 100755 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -56,8 +56,7 @@ pub struct HTMLTextAreaElement { } pub trait LayoutHTMLTextAreaElementHelpers { - #[allow(unsafe_code)] - unsafe fn value_for_layout(self) -> String; + fn value_for_layout(self) -> String; #[allow(unsafe_code)] unsafe fn selection_for_layout(self) -> Option<Range<usize>>; #[allow(unsafe_code)] @@ -67,19 +66,19 @@ pub trait LayoutHTMLTextAreaElementHelpers { } impl LayoutHTMLTextAreaElementHelpers for LayoutDom<'_, HTMLTextAreaElement> { - #[allow(unrooted_must_root)] #[allow(unsafe_code)] - unsafe fn value_for_layout(self) -> String { - let text = (*self.unsafe_get()) - .textinput - .borrow_for_layout() - .get_content(); - if text.is_empty() { - (*self.unsafe_get()) - .placeholder + fn value_for_layout(self) -> String { + let text = unsafe { + self.unsafe_get() + .textinput .borrow_for_layout() - .replace("\r\n", "\n") - .replace("\r", "\n") + .get_content() + }; + if text.is_empty() { + let placeholder = unsafe { self.unsafe_get().placeholder.borrow_for_layout() }; + // FIXME(nox): Would be cool to not allocate a new string if the + // placeholder is single line, but that's an unimportant detail. + placeholder.replace("\r\n", "\n").replace("\r", "\n").into() } else { text.into() } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index d92e3b6a364..251f6fcab18 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -87,7 +87,7 @@ use servo_arc::Arc; use servo_atoms::Atom; use servo_url::ServoUrl; use smallvec::SmallVec; -use std::borrow::ToOwned; +use std::borrow::Cow; use std::cell::{Cell, UnsafeCell}; use std::cmp; use std::default::Default; @@ -1326,7 +1326,7 @@ pub trait LayoutNodeHelpers<'dom> { unsafe fn init_style_and_layout_data(self, _: OpaqueStyleAndLayoutData); unsafe fn take_style_and_layout_data(self) -> OpaqueStyleAndLayoutData; - fn text_content(self) -> String; + fn text_content(self) -> Cow<'dom, str>; fn selection(self) -> Option<Range<usize>>; fn image_url(self) -> Option<ServoUrl>; fn image_density(self) -> Option<f64>; @@ -1456,18 +1456,17 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { val } - #[allow(unsafe_code)] - fn text_content(self) -> String { + fn text_content(self) -> Cow<'dom, str> { if let Some(text) = self.downcast::<Text>() { - return unsafe { text.upcast().data_for_layout().to_owned() }; + return text.upcast().data_for_layout().into(); } if let Some(input) = self.downcast::<HTMLInputElement>() { - return unsafe { input.value_for_layout() }; + return input.value_for_layout(); } if let Some(area) = self.downcast::<HTMLTextAreaElement>() { - return unsafe { area.value_for_layout() }; + return area.value_for_layout().into(); } panic!("not text!") |