No tracing of nop traceable fields (#29926)

* Add `no_trace` option to JSTraceable derive

* NoTrace wrapper

* Port some types to no_trace schematics

* Fixing my unsafe mistakes (not tracing traceables)

* Add docs & safety guards for no_trace

Safety guards (trait shenanigans) guarantees safety usage of `no_trace`

* Port canvas_traits to no_trace

* Port servo_media to no_trace

* Port net_traits to no_trace

* Port style to no_trace

* Port webgpu to no_trace

* Port script_traits to no_trace

* Port canvas_traits, devtools_traits, embedder_traits, profile_traits to no_trace

* unrooted_must_root lint in seperate file

* Add trace_in_no_trace_lint as script_plugin

* Composable types in must_not_have_traceable

* Introduced HashMapTracedValues wrapper

* `HashMap<NoTrace<K>,V>`->`HashMapTracedValues<K,V>`

* Port rest of servo's types to no_trace

* Port html5ever, euclid, mime and http to no_trace

* Port remaining externals to no_trace

* Port webxr and Arc<Mutex<_>>

* Fix spelling in notrace doc
This commit is contained in:
Samson 2023-08-04 12:17:43 +02:00 committed by GitHub
parent 66e0d543cf
commit 9514f670d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
167 changed files with 1903 additions and 1020 deletions

View file

@ -20,10 +20,12 @@ use html5ever::LocalName;
use js::rust::HandleObject;
use script_traits::serializable::BlobImpl;
use super::bindings::trace::NoTrace;
#[dom_struct]
pub struct FormData {
reflector_: Reflector,
data: DomRefCell<Vec<(LocalName, FormDatum)>>,
data: DomRefCell<Vec<(NoTrace<LocalName>, FormDatum)>>,
}
impl FormData {
@ -31,8 +33,8 @@ impl FormData {
let data = match form_datums {
Some(data) => data
.iter()
.map(|datum| (LocalName::from(datum.name.as_ref()), datum.clone()))
.collect::<Vec<(LocalName, FormDatum)>>(),
.map(|datum| (NoTrace(LocalName::from(datum.name.as_ref())), datum.clone()))
.collect::<Vec<(NoTrace<LocalName>, FormDatum)>>(),
None => Vec::new(),
};
@ -87,7 +89,7 @@ impl FormDataMethods for FormData {
self.data
.borrow_mut()
.push((LocalName::from(name.0), datum));
.push((NoTrace(LocalName::from(name.0)), datum));
}
#[allow(unrooted_must_root)]
@ -101,14 +103,14 @@ impl FormDataMethods for FormData {
self.data
.borrow_mut()
.push((LocalName::from(name.0), datum));
.push((NoTrace(LocalName::from(name.0)), datum));
}
// https://xhr.spec.whatwg.org/#dom-formdata-delete
fn Delete(&self, name: USVString) {
self.data
.borrow_mut()
.retain(|(datum_name, _)| datum_name != &LocalName::from(name.0.clone()));
.retain(|(datum_name, _)| datum_name.0 != LocalName::from(name.0.clone()));
}
// https://xhr.spec.whatwg.org/#dom-formdata-get
@ -116,7 +118,7 @@ impl FormDataMethods for FormData {
self.data
.borrow()
.iter()
.filter(|(datum_name, _)| datum_name == &LocalName::from(name.0.clone()))
.filter(|(datum_name, _)| datum_name.0 == LocalName::from(name.0.clone()))
.next()
.map(|(_, datum)| match &datum.value {
FormDatumValue::String(ref s) => {
@ -131,12 +133,12 @@ impl FormDataMethods for FormData {
self.data
.borrow()
.iter()
.filter_map(|datum| {
if datum.0 != LocalName::from(name.0.clone()) {
.filter_map(|(datum_name, datum)| {
if datum_name.0 != LocalName::from(name.0.clone()) {
return None;
}
Some(match &datum.1.value {
Some(match &datum.value {
FormDatumValue::String(ref s) => {
FileOrUSVString::USVString(USVString(s.to_string()))
},
@ -151,7 +153,7 @@ impl FormDataMethods for FormData {
self.data
.borrow()
.iter()
.any(|(datum_name, _0)| datum_name == &LocalName::from(name.0.clone()))
.any(|(datum_name, _0)| datum_name.0 == LocalName::from(name.0.clone()))
}
// https://xhr.spec.whatwg.org/#dom-formdata-set
@ -159,10 +161,10 @@ impl FormDataMethods for FormData {
let mut data = self.data.borrow_mut();
let local_name = LocalName::from(name.0.clone());
data.retain(|(datum_name, _)| datum_name != &local_name);
data.retain(|(datum_name, _)| datum_name.0 != local_name);
data.push((
local_name,
NoTrace(local_name),
FormDatum {
ty: DOMString::from("string"),
name: DOMString::from(name.0),
@ -177,10 +179,10 @@ impl FormDataMethods for FormData {
let mut data = self.data.borrow_mut();
let local_name = LocalName::from(name.0.clone());
data.retain(|(datum_name, _)| datum_name != &local_name);
data.retain(|(datum_name, _)| datum_name.0 != local_name);
data.push((
LocalName::from(name.0.clone()),
NoTrace(LocalName::from(name.0.clone())),
FormDatum {
ty: DOMString::from("file"),
name: DOMString::from(name.0),