mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Unify DocumentOrShadowRoot implementation
This commit is contained in:
parent
f3e707306f
commit
48975840dd
4 changed files with 238 additions and 161 deletions
|
@ -43,7 +43,7 @@ use crate::dom::cssstylesheet::CSSStyleSheet;
|
|||
use crate::dom::customelementregistry::CustomElementDefinition;
|
||||
use crate::dom::customevent::CustomEvent;
|
||||
use crate::dom::documentfragment::DocumentFragment;
|
||||
use crate::dom::documentorshadowroot::DocumentOrShadowRoot;
|
||||
use crate::dom::documentorshadowroot::{DocumentOrShadowRoot, DocumentOrShadowRootImpl};
|
||||
use crate::dom::documenttype::DocumentType;
|
||||
use crate::dom::domimplementation::DOMImplementation;
|
||||
use crate::dom::element::CustomElementCreationMode;
|
||||
|
@ -114,7 +114,6 @@ use euclid::Point2D;
|
|||
use html5ever::{LocalName, Namespace, QualName};
|
||||
use hyper_serde::Serde;
|
||||
use ipc_channel::ipc::{self, IpcSender};
|
||||
use js::jsapi::JS_GetRuntime;
|
||||
use js::jsapi::{JSContext, JSObject, JSRuntime};
|
||||
use keyboard_types::{Key, KeyState, Modifiers};
|
||||
use metrics::{
|
||||
|
@ -133,7 +132,7 @@ use num_traits::ToPrimitive;
|
|||
use profile_traits::ipc as profile_ipc;
|
||||
use profile_traits::time::{TimerMetadata, TimerMetadataFrameType, TimerMetadataReflowType};
|
||||
use ref_slice::ref_slice;
|
||||
use script_layout_interface::message::{Msg, NodesFromPointQueryType, QueryMsg, ReflowGoal};
|
||||
use script_layout_interface::message::{Msg, ReflowGoal};
|
||||
use script_traits::{AnimationState, DocumentActivity, MouseButton, MouseEventType};
|
||||
use script_traits::{MsDuration, ScriptMsg, TouchEventType, TouchId, UntrustedNodeAddress};
|
||||
use servo_arc::Arc;
|
||||
|
@ -267,6 +266,7 @@ impl ::style::stylesheets::StylesheetInDocument for StyleSheetInDocument {
|
|||
#[dom_struct]
|
||||
pub struct Document {
|
||||
node: Node,
|
||||
document_or_shadow_root: DocumentOrShadowRootImpl,
|
||||
window: Dom<Window>,
|
||||
implementation: MutNullableDom<DOMImplementation>,
|
||||
#[ignore_malloc_size_of = "type from external crate"]
|
||||
|
@ -487,6 +487,11 @@ impl Document {
|
|||
self.has_browsing_context
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn browsing_context(&self) -> Option<DomRoot<WindowProxy>> {
|
||||
self.document_or_shadow_root.browsing_context()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn window(&self) -> &Window {
|
||||
&*self.window
|
||||
|
@ -2613,10 +2618,12 @@ impl Document {
|
|||
.and_then(|charset| Encoding::for_label(charset.as_str().as_bytes()))
|
||||
.unwrap_or(UTF_8);
|
||||
|
||||
let has_browsing_context = has_browsing_context == HasBrowsingContext::Yes;
|
||||
Document {
|
||||
node: Node::new_document_node(),
|
||||
document_or_shadow_root: DocumentOrShadowRootImpl::new(window, has_browsing_context),
|
||||
window: Dom::from_ref(window),
|
||||
has_browsing_context: has_browsing_context == HasBrowsingContext::Yes,
|
||||
has_browsing_context,
|
||||
implementation: Default::default(),
|
||||
content_type,
|
||||
last_modified: last_modified,
|
||||
|
@ -2665,7 +2672,7 @@ impl Document {
|
|||
deferred_scripts: Default::default(),
|
||||
asap_in_order_scripts_list: Default::default(),
|
||||
asap_scripts_set: Default::default(),
|
||||
scripting_enabled: has_browsing_context == HasBrowsingContext::Yes,
|
||||
scripting_enabled: has_browsing_context,
|
||||
animation_frame_ident: Cell::new(0),
|
||||
animation_frame_list: DomRefCell::new(vec![]),
|
||||
running_animation_callbacks: Cell::new(false),
|
||||
|
@ -3246,8 +3253,6 @@ impl Document {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl_document_or_shadow_root_helpers!();
|
||||
}
|
||||
|
||||
impl Element {
|
||||
|
@ -3277,8 +3282,15 @@ impl ProfilerMetadataFactory for Document {
|
|||
}
|
||||
|
||||
impl DocumentMethods for Document {
|
||||
// https://w3c.github.io/webcomponents/spec/shadow/#extensions-to-the-documentorshadowroot-mixin
|
||||
impl_document_or_shadow_root_methods!(Document);
|
||||
// https://drafts.csswg.org/cssom/#dom-document-stylesheets
|
||||
fn StyleSheets(&self) -> DomRoot<StyleSheetList> {
|
||||
self.stylesheet_list.or_init(|| {
|
||||
StyleSheetList::new(
|
||||
&self.window,
|
||||
DocumentOrShadowRoot::Document(Dom::from_ref(self)),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-document-implementation
|
||||
fn Implementation(&self) -> DomRoot<DOMImplementation> {
|
||||
|
@ -3290,6 +3302,15 @@ impl DocumentMethods for Document {
|
|||
USVString(String::from(self.url().as_str()))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-document-activeelement
|
||||
fn GetActiveElement(&self) -> Option<DomRoot<Element>> {
|
||||
self.document_or_shadow_root.get_active_element(
|
||||
self.get_focused_element(),
|
||||
self.GetBody(),
|
||||
self.GetDocumentElement(),
|
||||
)
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-document-hasfocus
|
||||
fn HasFocus(&self) -> bool {
|
||||
// Step 1-2.
|
||||
|
@ -4234,6 +4255,18 @@ impl DocumentMethods for Document {
|
|||
SetOnreadystatechange
|
||||
);
|
||||
|
||||
// https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint
|
||||
fn ElementFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Option<DomRoot<Element>> {
|
||||
self.document_or_shadow_root
|
||||
.element_from_point(x, y, self.GetDocumentElement())
|
||||
}
|
||||
|
||||
// https://drafts.csswg.org/cssom-view/#dom-document-elementsfrompoint
|
||||
fn ElementsFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Vec<DomRoot<Element>> {
|
||||
self.document_or_shadow_root
|
||||
.elements_from_point(x, y, self.GetDocumentElement())
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-document-open
|
||||
fn Open(
|
||||
&self,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue