aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ports/geckolib/bindings.rs12
-rw-r--r--ports/geckolib/wrapper.rs34
2 files changed, 37 insertions, 9 deletions
diff --git a/ports/geckolib/bindings.rs b/ports/geckolib/bindings.rs
index 34d7b26e540..845cca32e13 100644
--- a/ports/geckolib/bindings.rs
+++ b/ports/geckolib/bindings.rs
@@ -69,6 +69,16 @@ extern "C" {
pub fn Gecko_GetLastChild(node: *mut RawGeckoNode) -> *mut RawGeckoNode;
pub fn Gecko_GetPrevSibling(node: *mut RawGeckoNode) -> *mut RawGeckoNode;
pub fn Gecko_GetNextSibling(node: *mut RawGeckoNode) -> *mut RawGeckoNode;
+ pub fn Gecko_GetParentElement(element: *mut RawGeckoElement)
+ -> *mut RawGeckoElement;
+ pub fn Gecko_GetFirstChildElement(element: *mut RawGeckoElement)
+ -> *mut RawGeckoElement;
+ pub fn Gecko_GetLastChildElement(element: *mut RawGeckoElement)
+ -> *mut RawGeckoElement;
+ pub fn Gecko_GetPrevSiblingElement(element: *mut RawGeckoElement)
+ -> *mut RawGeckoElement;
+ pub fn Gecko_GetNextSiblingElement(element: *mut RawGeckoElement)
+ -> *mut RawGeckoElement;
pub fn Gecko_GetNodeData(node: *mut RawGeckoNode) -> *mut ServoNodeData;
pub fn Gecko_GetParentNode(node: *mut RawGeckoNode) -> *mut RawGeckoNode;
pub fn Gecko_LocalName(element: *mut RawGeckoElement,
@@ -81,6 +91,8 @@ extern "C" {
-> ::libc::c_int;
pub fn Gecko_IsUnvisitedLink(element: *mut RawGeckoElement)
-> ::libc::c_int;
+ pub fn Gecko_IsRootElement(element: *mut RawGeckoElement)
+ -> ::libc::c_int;
pub fn Gecko_Namespace(element: *mut RawGeckoElement,
length: *mut uint32_t) -> *const uint16_t;
pub fn Gecko_NodeIsElement(node: *mut RawGeckoNode) -> ::libc::c_int;
diff --git a/ports/geckolib/wrapper.rs b/ports/geckolib/wrapper.rs
index 054929cea62..03c436f7d28 100644
--- a/ports/geckolib/wrapper.rs
+++ b/ports/geckolib/wrapper.rs
@@ -6,9 +6,13 @@
use bindings::{Gecko_ChildrenCount};
use bindings::{Gecko_ElementState, Gecko_GetAttrAsUTF8, Gecko_GetDocumentElement};
-use bindings::{Gecko_GetFirstChild, Gecko_GetLastChild, Gecko_GetNodeData};
-use bindings::{Gecko_GetParentNode, Gecko_GetPrevSibling, Gecko_GetNextSibling};
-use bindings::{Gecko_IsHTMLElementInHTMLDocument, Gecko_IsLink, Gecko_IsTextNode};
+use bindings::{Gecko_GetFirstChild, Gecko_GetFirstChildElement};
+use bindings::{Gecko_GetLastChild, Gecko_GetLastChildElement};
+use bindings::{Gecko_GetNextSibling, Gecko_GetNextSiblingElement};
+use bindings::{Gecko_GetNodeData};
+use bindings::{Gecko_GetParentElement, Gecko_GetParentNode};
+use bindings::{Gecko_GetPrevSibling, Gecko_GetPrevSiblingElement};
+use bindings::{Gecko_IsHTMLElementInHTMLDocument, Gecko_IsLink, Gecko_IsRootElement, Gecko_IsTextNode};
use bindings::{Gecko_IsUnvisitedLink, Gecko_IsVisitedLink};
#[allow(unused_imports)] // Used in commented-out code.
use bindings::{Gecko_LocalName, Gecko_Namespace, Gecko_NodeIsElement, Gecko_SetNodeData};
@@ -356,27 +360,39 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
type Impl = ServoSelectorImpl;
fn parent_element(&self) -> Option<Self> {
- unimplemented!()
+ unsafe {
+ Gecko_GetParentElement(self.element).as_ref().map(|el| GeckoElement::from_ref(el))
+ }
}
fn first_child_element(&self) -> Option<Self> {
- unimplemented!()
+ unsafe {
+ Gecko_GetFirstChildElement(self.element).as_ref().map(|el| GeckoElement::from_ref(el))
+ }
}
fn last_child_element(&self) -> Option<Self> {
- unimplemented!()
+ unsafe {
+ Gecko_GetLastChildElement(self.element).as_ref().map(|el| GeckoElement::from_ref(el))
+ }
}
fn prev_sibling_element(&self) -> Option<Self> {
- unimplemented!()
+ unsafe {
+ Gecko_GetPrevSiblingElement(self.element).as_ref().map(|el| GeckoElement::from_ref(el))
+ }
}
fn next_sibling_element(&self) -> Option<Self> {
- unimplemented!()
+ unsafe {
+ Gecko_GetNextSiblingElement(self.element).as_ref().map(|el| GeckoElement::from_ref(el))
+ }
}
fn is_root(&self) -> bool {
- unimplemented!()
+ unsafe {
+ Gecko_IsRootElement(self.element) != 0
+ }
}
fn is_empty(&self) -> bool {