mirror of
https://github.com/servo/servo.git
synced 2025-07-21 22:33:41 +01:00
Add XPath parser/evaluator (#34463)
* Add XPath parser/evaluator Signed-off-by: Ville Lindholm <ville@lindholm.dev> * Correctly annotate XPathEvaluator IDL Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review]: have bindings pass in `can_gc` Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review]: add docstrings Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review]: implement PartialEq for Value for readability Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review]: add docstrings for CoreFunctions Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review]: simplify node test code Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review]: add unit tests for string handling xpath functions Signed-off-by: Ville Lindholm <ville@lindholm.dev> * put xpath features behind dom.xpath.enabled pref Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review] remove rstest and insta dev-deps Signed-off-by: Ville Lindholm <ville@lindholm.dev> * update wpt test expectations Signed-off-by: Ville Lindholm <ville@lindholm.dev> * [PR review]: tweak metadata files Signed-off-by: Ville Lindholm <ville@lindholm.dev> * update wpt test expectations AGAIN Signed-off-by: Ville Lindholm <ville@lindholm.dev> --------- Signed-off-by: Ville Lindholm <ville@lindholm.dev>
This commit is contained in:
parent
264c0f972f
commit
bc7fe41a02
36 changed files with 6426 additions and 314 deletions
|
@ -71,6 +71,7 @@ use uuid::Uuid;
|
|||
use webgpu::swapchain::WebGPUContextId;
|
||||
use webrender_api::units::DeviceIntRect;
|
||||
|
||||
use super::bindings::codegen::Bindings::XPathEvaluatorBinding::XPathEvaluatorMethods;
|
||||
use crate::animation_timeline::AnimationTimeline;
|
||||
use crate::animations::Animations;
|
||||
use crate::document_loader::{DocumentLoader, LoadType};
|
||||
|
@ -95,6 +96,7 @@ use crate::dom::bindings::codegen::Bindings::TouchBinding::TouchMethods;
|
|||
use crate::dom::bindings::codegen::Bindings::WindowBinding::{
|
||||
FrameRequestCallback, ScrollBehavior, WindowMethods,
|
||||
};
|
||||
use crate::dom::bindings::codegen::Bindings::XPathNSResolverBinding::XPathNSResolver;
|
||||
use crate::dom::bindings::codegen::UnionTypes::{NodeOrString, StringOrElementCreationOptions};
|
||||
use crate::dom::bindings::error::{Error, ErrorInfo, ErrorResult, Fallible};
|
||||
use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
||||
|
@ -180,6 +182,7 @@ use crate::dom::webgpu::gpucanvascontext::GPUCanvasContext;
|
|||
use crate::dom::wheelevent::WheelEvent;
|
||||
use crate::dom::window::{ReflowReason, Window};
|
||||
use crate::dom::windowproxy::WindowProxy;
|
||||
use crate::dom::xpathevaluator::XPathEvaluator;
|
||||
use crate::fetch::FetchCanceller;
|
||||
use crate::network_listener::{NetworkListener, PreInvoke};
|
||||
use crate::realms::{enter_realm, AlreadyInRealm, InRealm};
|
||||
|
@ -682,6 +685,12 @@ impl Document {
|
|||
self.is_html_document
|
||||
}
|
||||
|
||||
pub fn is_xhtml_document(&self) -> bool {
|
||||
self.content_type.type_() == mime::APPLICATION &&
|
||||
self.content_type.subtype().as_str() == "xhtml" &&
|
||||
self.content_type.suffix() == Some(mime::XML)
|
||||
}
|
||||
|
||||
pub fn set_https_state(&self, https_state: HttpsState) {
|
||||
self.https_state.set(https_state);
|
||||
}
|
||||
|
@ -4519,11 +4528,7 @@ impl DocumentMethods<crate::DomTypeHolder> for Document {
|
|||
local_name.make_ascii_lowercase();
|
||||
}
|
||||
|
||||
let is_xhtml = self.content_type.type_() == mime::APPLICATION &&
|
||||
self.content_type.subtype().as_str() == "xhtml" &&
|
||||
self.content_type.suffix() == Some(mime::XML);
|
||||
|
||||
let ns = if self.is_html_document || is_xhtml {
|
||||
let ns = if self.is_html_document || self.is_xhtml_document() {
|
||||
ns!(html)
|
||||
} else {
|
||||
ns!()
|
||||
|
@ -5613,6 +5618,53 @@ impl DocumentMethods<crate::DomTypeHolder> for Document {
|
|||
fn VisibilityState(&self) -> DocumentVisibilityState {
|
||||
self.visibility_state.get()
|
||||
}
|
||||
|
||||
fn CreateExpression(
|
||||
&self,
|
||||
expression: DOMString,
|
||||
resolver: Option<Rc<XPathNSResolver>>,
|
||||
can_gc: CanGc,
|
||||
) -> Fallible<DomRoot<super::types::XPathExpression>> {
|
||||
let global = self.global();
|
||||
let window = global.as_window();
|
||||
let evaluator = XPathEvaluator::new(window, None, can_gc);
|
||||
XPathEvaluatorMethods::<crate::DomTypeHolder>::CreateExpression(
|
||||
&*evaluator,
|
||||
expression,
|
||||
resolver,
|
||||
can_gc,
|
||||
)
|
||||
}
|
||||
|
||||
fn CreateNSResolver(&self, node_resolver: &Node, can_gc: CanGc) -> DomRoot<Node> {
|
||||
let global = self.global();
|
||||
let window = global.as_window();
|
||||
let evaluator = XPathEvaluator::new(window, None, can_gc);
|
||||
XPathEvaluatorMethods::<crate::DomTypeHolder>::CreateNSResolver(&*evaluator, node_resolver)
|
||||
}
|
||||
|
||||
fn Evaluate(
|
||||
&self,
|
||||
expression: DOMString,
|
||||
context_node: &Node,
|
||||
resolver: Option<Rc<XPathNSResolver>>,
|
||||
type_: u16,
|
||||
result: Option<&super::types::XPathResult>,
|
||||
can_gc: CanGc,
|
||||
) -> Fallible<DomRoot<super::types::XPathResult>> {
|
||||
let global = self.global();
|
||||
let window = global.as_window();
|
||||
let evaluator = XPathEvaluator::new(window, None, can_gc);
|
||||
XPathEvaluatorMethods::<crate::DomTypeHolder>::Evaluate(
|
||||
&*evaluator,
|
||||
expression,
|
||||
context_node,
|
||||
resolver,
|
||||
type_,
|
||||
result,
|
||||
can_gc,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fn update_with_current_instant(marker: &Cell<Option<CrossProcessInstant>>) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue