Skip to content

Commit

Permalink
it compiles!
Browse files Browse the repository at this point in the history
  • Loading branch information
jdm committed Sep 6, 2024
1 parent cf80321 commit 5cf9d8c
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 31 deletions.
13 changes: 13 additions & 0 deletions components/script/dom/baseaudiocontext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -574,3 +574,16 @@ impl BaseAudioContextMethods<crate::DomTypeHolder> for BaseAudioContext {
IIRFilterNode::new(self.global().as_window(), self, &opts)
}
}

impl From<BaseAudioContextOptions> for AudioContextOptions {
fn from(options: BaseAudioContextOptions) -> Self {
match options {
BaseAudioContextOptions::AudioContext(options) => {
AudioContextOptions::RealTimeAudioContext(options)
},
BaseAudioContextOptions::OfflineAudioContext(options) => {
AudioContextOptions::OfflineAudioContext(options)
},
}
}
}
12 changes: 8 additions & 4 deletions components/script/dom/bindings/htmlconstructor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,11 @@ pub fn get_constructor_object_from_local_name(
($binding:ident) => ({
$binding::GenericBindings::GetConstructorObject(cx, global, rval);
true
})
});
($binding:ident::<crate::DomTypeHolder>) => ({
$binding::GenericBindings::GetConstructorObject::<crate::DomTypeHolder>(cx, global, rval);
true
});
);

match name {
Expand All @@ -246,7 +250,7 @@ pub fn get_constructor_object_from_local_name(
local_name!("area") => get_constructor!(HTMLAreaElementBinding),
local_name!("article") => get_constructor!(HTMLElementBinding),
local_name!("aside") => get_constructor!(HTMLElementBinding),
local_name!("audio") => get_constructor!(HTMLAudioElementBinding),
local_name!("audio") => get_constructor!(HTMLAudioElementBinding::<crate::DomTypeHolder>),
local_name!("b") => get_constructor!(HTMLElementBinding),
local_name!("base") => get_constructor!(HTMLBaseElementBinding),
local_name!("bdi") => get_constructor!(HTMLElementBinding),
Expand Down Expand Up @@ -297,7 +301,7 @@ pub fn get_constructor_object_from_local_name(
local_name!("html") => get_constructor!(HTMLHtmlElementBinding),
local_name!("i") => get_constructor!(HTMLElementBinding),
local_name!("iframe") => get_constructor!(HTMLIFrameElementBinding),
local_name!("img") => get_constructor!(HTMLImageElementBinding),
local_name!("img") => get_constructor!(HTMLImageElementBinding::<crate::DomTypeHolder>),
local_name!("input") => get_constructor!(HTMLInputElementBinding),
local_name!("ins") => get_constructor!(HTMLModElementBinding),
local_name!("kbd") => get_constructor!(HTMLElementBinding),
Expand All @@ -320,7 +324,7 @@ pub fn get_constructor_object_from_local_name(
local_name!("object") => get_constructor!(HTMLObjectElementBinding),
local_name!("ol") => get_constructor!(HTMLOListElementBinding),
local_name!("optgroup") => get_constructor!(HTMLOptGroupElementBinding),
local_name!("option") => get_constructor!(HTMLOptionElementBinding),
local_name!("option") => get_constructor!(HTMLOptionElementBinding::<crate::DomTypeHolder>),
local_name!("output") => get_constructor!(HTMLOutputElementBinding),
local_name!("p") => get_constructor!(HTMLParagraphElementBinding),
local_name!("param") => get_constructor!(HTMLParamElementBinding),
Expand Down
2 changes: 1 addition & 1 deletion components/script/dom/bindings/root.rs
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ pub trait ToLayout<T> {
unsafe fn to_layout(&self) -> LayoutDom<T>;
}

impl<T> ToLayout<T> for Dom<T> {
impl<T: DomObject> ToLayout<T> for Dom<T> {
unsafe fn to_layout(&self) -> LayoutDom<T> {
assert_in_layout();
LayoutDom {
Expand Down
77 changes: 56 additions & 21 deletions components/script/dom/element.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

//! Element nodes.

use std::borrow::Cow;
use std::borrow::{Cow, ToOwned};
use std::cell::Cell;
use std::default::Default;
use std::ops::Deref;
Expand Down Expand Up @@ -2811,7 +2811,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
let quirks_mode = doc.quirks_mode();
let element = DomRoot::from_ref(self);

Ok(dom_apis::element_matches(&element, &selectors, quirks_mode))
Ok(dom_apis::element_matches(&SelectorWrapper::Borrowed(&element), &selectors, quirks_mode))
}

// https://dom.spec.whatwg.org/#dom-element-webkitmatchesselector
Expand All @@ -2833,10 +2833,10 @@ impl ElementMethods<crate::DomTypeHolder> for Element {

let quirks_mode = doc.quirks_mode();
Ok(dom_apis::element_closest(
DomRoot::from_ref(self),
SelectorWrapper::Owned(DomRoot::from_ref(self)),
&selectors,
quirks_mode,
))
).map(SelectorWrapper::into_owned))
}

// https://dom.spec.whatwg.org/#dom-element-insertadjacentelement
Expand Down Expand Up @@ -3565,16 +3565,48 @@ impl VirtualMethods for Element {
}
}

impl SelectorsElement for Element {
#[derive(PartialEq, Clone)]
pub enum SelectorWrapper<'a> {
Borrowed(&'a DomRoot<Element>),
Owned(DomRoot<Element>),
}

impl<'a> fmt::Debug for SelectorWrapper<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.deref().fmt(f)
}
}

impl<'a> Deref for SelectorWrapper<'a> {
type Target = DomRoot<Element>;

fn deref(&self) -> &Self::Target {
match self {
SelectorWrapper::Owned(r) => &r,
SelectorWrapper::Borrowed(r) => r,
}
}
}

impl<'a> SelectorWrapper<'a> {
fn into_owned(self) -> DomRoot<Element> {
match self {
SelectorWrapper::Owned(r) => r,
SelectorWrapper::Borrowed(r) => r.clone(),
}
}
}

impl<'a> SelectorsElement for SelectorWrapper<'a> {
type Impl = SelectorImpl;

#[allow(unsafe_code)]
fn opaque(&self) -> ::selectors::OpaqueElement {
::selectors::OpaqueElement::new(unsafe { &*self.reflector().get_jsobject().get() })
}

fn parent_element(&self) -> Option<DomRoot<Element>> {
self.upcast::<Node>().GetParentElement()
fn parent_element(&self) -> Option<Self> {
self.upcast::<Node>().GetParentElement().map(SelectorWrapper::Owned)
}

fn parent_node_is_shadow_root(&self) -> bool {
Expand All @@ -3588,6 +3620,7 @@ impl SelectorsElement for Element {
self.upcast::<Node>()
.containing_shadow_root()
.map(|shadow_root| shadow_root.Host())
.map(SelectorWrapper::Owned)
}

fn is_pseudo_element(&self) -> bool {
Expand All @@ -3602,22 +3635,24 @@ impl SelectorsElement for Element {
false
}

fn prev_sibling_element(&self) -> Option<DomRoot<Element>> {
fn prev_sibling_element(&self) -> Option<Self> {
self.node
.preceding_siblings()
.filter_map(DomRoot::downcast)
.next()
.map(SelectorWrapper::Owned)
}

fn next_sibling_element(&self) -> Option<DomRoot<Element>> {
fn next_sibling_element(&self) -> Option<Self> {
self.node
.following_siblings()
.filter_map(DomRoot::downcast)
.next()
.map(SelectorWrapper::Owned)
}

fn first_element_child(&self) -> Option<DomRoot<Element>> {
self.GetFirstElementChild()
fn first_element_child(&self) -> Option<Self> {
self.GetFirstElementChild().map(SelectorWrapper::Owned)
}

fn attr_matches(
Expand All @@ -3637,7 +3672,7 @@ impl SelectorsElement for Element {
}

fn is_root(&self) -> bool {
Element::is_root(self)
Element::is_root(&self)
}

fn is_empty(&self) -> bool {
Expand All @@ -3651,16 +3686,16 @@ impl SelectorsElement for Element {
}

fn has_local_name(&self, local_name: &LocalName) -> bool {
Element::local_name(self) == local_name
Element::local_name(&self) == local_name
}

fn has_namespace(&self, ns: &Namespace) -> bool {
Element::namespace(self) == ns
Element::namespace(&self) == ns
}

fn is_same_type(&self, other: &Self) -> bool {
Element::local_name(self) == Element::local_name(other) &&
Element::namespace(self) == Element::namespace(other)
Element::local_name(&self) == Element::local_name(other) &&
Element::namespace(&self) == Element::namespace(other)
}

fn match_non_ts_pseudo_class(
Expand Down Expand Up @@ -3689,7 +3724,7 @@ impl SelectorsElement for Element {
// storing separate <ident> or <string>s for each language tag.
NonTSPseudoClass::Lang(ref lang) => extended_filtering(&self.get_lang(), lang),

NonTSPseudoClass::ReadOnly => !Element::state(self).contains(pseudo_class.state_flag()),
NonTSPseudoClass::ReadOnly => !Element::state(&self).contains(pseudo_class.state_flag()),

NonTSPseudoClass::Active |
NonTSPseudoClass::Focus |
Expand All @@ -3704,7 +3739,7 @@ impl SelectorsElement for Element {
NonTSPseudoClass::Indeterminate |
NonTSPseudoClass::ReadWrite |
NonTSPseudoClass::PlaceholderShown |
NonTSPseudoClass::Target => Element::state(self).contains(pseudo_class.state_flag()),
NonTSPseudoClass::Target => Element::state(&self).contains(pseudo_class.state_flag()),
}
}

Expand Down Expand Up @@ -3740,7 +3775,7 @@ impl SelectorsElement for Element {
}

fn has_class(&self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool {
Element::has_class(self, name, case_sensitivity)
Element::has_class(&self, name, case_sensitivity)
}

fn is_html_element_in_html_document(&self) -> bool {
Expand All @@ -3757,7 +3792,7 @@ impl SelectorsElement for Element {
if !self_flags.is_empty() {
#[allow(unsafe_code)]
unsafe {
Dom::from_ref(self.deref())
Dom::from_ref(&***self)
.to_layout()
.insert_selector_flags(self_flags);
}
Expand All @@ -3769,7 +3804,7 @@ impl SelectorsElement for Element {
if let Some(p) = self.parent_element() {
#[allow(unsafe_code)]
unsafe {
Dom::from_ref(p.deref())
Dom::from_ref(&**p)
.to_layout()
.insert_selector_flags(parent_flags);
}
Expand Down
6 changes: 3 additions & 3 deletions components/script/dom/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ use crate::dom::customelementregistry::{try_upgrade_element, CallbackReaction};
use crate::dom::document::{Document, DocumentSource, HasBrowsingContext, IsHTMLDocument};
use crate::dom::documentfragment::DocumentFragment;
use crate::dom::documenttype::DocumentType;
use crate::dom::element::{CustomElementCreationMode, Element, ElementCreator};
use crate::dom::element::{CustomElementCreationMode, Element, ElementCreator, SelectorWrapper};
use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlbodyelement::HTMLBodyElement;
Expand Down Expand Up @@ -484,7 +484,7 @@ impl Iterator for QuerySelectorIterator {
MatchingForInvalidation::No,
);
if let Some(element) = DomRoot::downcast(node) {
if matches_selector_list(selectors, &element, &mut ctx) {
if matches_selector_list(selectors, &SelectorWrapper::Borrowed(&element), &mut ctx) {
return Some(DomRoot::upcast(element));
}
}
Expand Down Expand Up @@ -984,7 +984,7 @@ impl Node {
Ok(self
.traverse_preorder(ShadowIncluding::No)
.filter_map(DomRoot::downcast)
.find(|element| matches_selector_list(&selectors, element, &mut ctx)))
.find(|element| matches_selector_list(&selectors, &SelectorWrapper::Borrowed(element), &mut ctx)))
},
}
}
Expand Down
4 changes: 2 additions & 2 deletions components/script_bindings/impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1025,7 +1025,7 @@ impl From<XRSessionMode> for SessionMode {
}
}

impl<T: SelectorsElement + crate::DomObject + Into<DomRoot<T>>> SelectorsElement for DomRoot<T> {
/*impl<T: SelectorsElement + crate::DomObject + Into<DomRoot<T>>> SelectorsElement for DomRoot<T> {
type Impl = T::Impl;
fn opaque(&self) -> ::selectors::OpaqueElement {
Expand Down Expand Up @@ -1144,7 +1144,7 @@ impl<T: SelectorsElement + crate::DomObject + Into<DomRoot<T>>> SelectorsElement
fn has_custom_state(&self, name: &<<T as selectors::Element>::Impl as selectors::SelectorImpl>::Identifier) -> bool {
T::has_custom_state(&*self, name)
}
}
}*/

impl<T: fmt::Debug + crate::DomObject> fmt::Debug for DomRoot<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
Expand Down

0 comments on commit 5cf9d8c

Please sign in to comment.