mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Add trait DomObjectWrap to provide WRAP function
This commit is contained in:
parent
ca29399bab
commit
3ea6d87bcc
353 changed files with 327 additions and 1236 deletions
|
@ -2858,6 +2858,50 @@ impl PartialEq for %(name)s {
|
|||
""" % {'check': check, 'name': name}
|
||||
|
||||
|
||||
class CGDomObjectWrap(CGThing):
|
||||
"""
|
||||
Class for codegen of an implementation of the DomObjectWrap trait.
|
||||
"""
|
||||
def __init__(self, descriptor):
|
||||
CGThing.__init__(self)
|
||||
self.descriptor = descriptor
|
||||
|
||||
def define(self):
|
||||
name = self.descriptor.concreteType
|
||||
name = "dom::%s::%s" % (name.lower(), name)
|
||||
return """\
|
||||
impl DomObjectWrap for %s {
|
||||
const WRAP: unsafe fn(
|
||||
SafeJSContext,
|
||||
&GlobalScope,
|
||||
Box<Self>,
|
||||
) -> Root<Dom<Self>> = Wrap;
|
||||
}
|
||||
""" % (name)
|
||||
|
||||
|
||||
class CGDomObjectIteratorWrap(CGThing):
|
||||
"""
|
||||
Class for codegen of an implementation of the DomObjectIteratorWrap trait.
|
||||
"""
|
||||
def __init__(self, descriptor):
|
||||
CGThing.__init__(self)
|
||||
self.descriptor = descriptor
|
||||
|
||||
def define(self):
|
||||
assert self.descriptor.interface.isIteratorInterface()
|
||||
name = self.descriptor.interface.iterableInterface.identifier.name
|
||||
return """\
|
||||
impl DomObjectIteratorWrap for %s {
|
||||
const ITER_WRAP: unsafe fn(
|
||||
SafeJSContext,
|
||||
&GlobalScope,
|
||||
Box<IterableIterator<Self>>,
|
||||
) -> Root<Dom<IterableIterator<Self>>> = Wrap;
|
||||
}
|
||||
""" % (name)
|
||||
|
||||
|
||||
class CGAbstractExternMethod(CGAbstractMethod):
|
||||
"""
|
||||
Abstract base class for codegen of implementation-only (no
|
||||
|
@ -6067,6 +6111,8 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
|
|||
'crate::dom::bindings::namespace::create_namespace_object',
|
||||
'crate::dom::bindings::reflector::MutDomObject',
|
||||
'crate::dom::bindings::reflector::DomObject',
|
||||
'crate::dom::bindings::reflector::DomObjectWrap',
|
||||
'crate::dom::bindings::reflector::DomObjectIteratorWrap',
|
||||
'crate::dom::bindings::root::Dom',
|
||||
'crate::dom::bindings::root::DomRoot',
|
||||
'crate::dom::bindings::root::DomSlice',
|
||||
|
@ -6286,6 +6332,10 @@ class CGDescriptor(CGThing):
|
|||
cgThings.append(CGWrapGlobalMethod(descriptor, properties))
|
||||
else:
|
||||
cgThings.append(CGWrapMethod(descriptor))
|
||||
if descriptor.interface.isIteratorInterface():
|
||||
cgThings.append(CGDomObjectIteratorWrap(descriptor))
|
||||
else:
|
||||
cgThings.append(CGDomObjectWrap(descriptor))
|
||||
reexports.append('Wrap')
|
||||
|
||||
haveUnscopables = False
|
||||
|
@ -7445,9 +7495,7 @@ class CGIterableMethodGenerator(CGGeneric):
|
|||
return
|
||||
CGGeneric.__init__(self, fill(
|
||||
"""
|
||||
let result = ${iterClass}::new(&*this,
|
||||
IteratorType::${itrMethod},
|
||||
super::${ifaceName}IteratorBinding::Wrap);
|
||||
let result = ${iterClass}::new(&*this, IteratorType::${itrMethod});
|
||||
""",
|
||||
iterClass=iteratorNativeType(descriptor, True),
|
||||
ifaceName=descriptor.interface.identifier.name,
|
||||
|
|
|
@ -9,8 +9,10 @@
|
|||
use crate::dom::bindings::codegen::Bindings::IterableIteratorBinding::IterableKeyAndValueResult;
|
||||
use crate::dom::bindings::codegen::Bindings::IterableIteratorBinding::IterableKeyOrValueResult;
|
||||
use crate::dom::bindings::error::Fallible;
|
||||
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||
use crate::dom::bindings::reflector::{
|
||||
reflect_dom_object, DomObjectIteratorWrap, DomObjectWrap, Reflector,
|
||||
};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot, Root};
|
||||
use crate::dom::bindings::trace::{JSTraceable, RootedTraceableBox};
|
||||
use crate::dom::globalscope::GlobalScope;
|
||||
use crate::script_runtime::JSContext;
|
||||
|
@ -51,27 +53,23 @@ pub trait Iterable {
|
|||
/// An iterator over the iterable entries of a given DOM interface.
|
||||
//FIXME: #12811 prevents dom_struct with type parameters
|
||||
#[dom_struct]
|
||||
pub struct IterableIterator<T: DomObject + JSTraceable + Iterable> {
|
||||
pub struct IterableIterator<T: DomObjectIteratorWrap + JSTraceable + Iterable> {
|
||||
reflector: Reflector,
|
||||
iterable: Dom<T>,
|
||||
type_: IteratorType,
|
||||
index: Cell<u32>,
|
||||
}
|
||||
|
||||
impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
|
||||
impl<T: DomObjectIteratorWrap + JSTraceable + Iterable> IterableIterator<T> {
|
||||
/// Create a new iterator instance for the provided iterable DOM interface.
|
||||
pub fn new(
|
||||
iterable: &T,
|
||||
type_: IteratorType,
|
||||
wrap: unsafe fn(JSContext, &GlobalScope, Box<IterableIterator<T>>) -> DomRoot<Self>,
|
||||
) -> DomRoot<Self> {
|
||||
pub fn new(iterable: &T, type_: IteratorType) -> DomRoot<Self> {
|
||||
let iterator = Box::new(IterableIterator {
|
||||
reflector: Reflector::new(),
|
||||
type_: type_,
|
||||
iterable: Dom::from_ref(iterable),
|
||||
index: Cell::new(0),
|
||||
});
|
||||
reflect_dom_object(iterator, &*iterable.global(), wrap)
|
||||
reflect_dom_object(iterator, &*iterable.global())
|
||||
}
|
||||
|
||||
/// Return the next value from the iterable object.
|
||||
|
@ -119,6 +117,10 @@ impl<T: DomObject + JSTraceable + Iterable> IterableIterator<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T: DomObjectIteratorWrap + JSTraceable + Iterable> DomObjectWrap for IterableIterator<T> {
|
||||
const WRAP: unsafe fn(JSContext, &GlobalScope, Box<Self>) -> Root<Dom<Self>> = T::ITER_WRAP;
|
||||
}
|
||||
|
||||
fn dict_return(
|
||||
cx: JSContext,
|
||||
mut result: MutableHandleObject,
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
//! The `Reflector` struct.
|
||||
|
||||
use crate::dom::bindings::conversions::DerivedFrom;
|
||||
use crate::dom::bindings::root::DomRoot;
|
||||
use crate::dom::bindings::iterable::{Iterable, IterableIterator};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot, Root};
|
||||
use crate::dom::bindings::trace::JSTraceable;
|
||||
use crate::dom::globalscope::GlobalScope;
|
||||
use crate::script_runtime::JSContext;
|
||||
|
@ -15,17 +16,13 @@ use std::default::Default;
|
|||
|
||||
/// Create the reflector for a new DOM object and yield ownership to the
|
||||
/// reflector.
|
||||
pub fn reflect_dom_object<T, U>(
|
||||
obj: Box<T>,
|
||||
global: &U,
|
||||
wrap_fn: unsafe fn(JSContext, &GlobalScope, Box<T>) -> DomRoot<T>,
|
||||
) -> DomRoot<T>
|
||||
pub fn reflect_dom_object<T, U>(obj: Box<T>, global: &U) -> DomRoot<T>
|
||||
where
|
||||
T: DomObject,
|
||||
T: DomObject + DomObjectWrap,
|
||||
U: DerivedFrom<GlobalScope>,
|
||||
{
|
||||
let global_scope = global.upcast();
|
||||
unsafe { wrap_fn(global_scope.get_cx(), global_scope, obj) }
|
||||
unsafe { T::WRAP(global_scope.get_cx(), global_scope, obj) }
|
||||
}
|
||||
|
||||
/// A struct to store a reference to the reflector of a DOM object.
|
||||
|
@ -106,3 +103,20 @@ impl MutDomObject for Reflector {
|
|||
self.set_jsobject(obj)
|
||||
}
|
||||
}
|
||||
|
||||
/// A trait to provide a function pointer to wrap function for DOM objects.
|
||||
pub trait DomObjectWrap: Sized + DomObject {
|
||||
/// Function pointer to the general wrap function type
|
||||
const WRAP: unsafe fn(JSContext, &GlobalScope, Box<Self>) -> Root<Dom<Self>>;
|
||||
}
|
||||
|
||||
/// A trait to provide a function pointer to wrap function for
|
||||
/// DOM iterator interfaces.
|
||||
pub trait DomObjectIteratorWrap: DomObjectWrap + JSTraceable + Iterable {
|
||||
/// Function pointer to the wrap function for IterableIterator<T>
|
||||
const ITER_WRAP: unsafe fn(
|
||||
JSContext,
|
||||
&GlobalScope,
|
||||
Box<IterableIterator<Self>>,
|
||||
) -> Root<Dom<IterableIterator<Self>>>;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue