aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/style/properties/gecko.mako.rs4
-rwxr-xr-xports/geckolib/binding_tools/regen.py60
-rw-r--r--ports/geckolib/gecko_bindings/bindings.rs215
-rw-r--r--ports/geckolib/gecko_bindings/sugar/ownership.rs108
-rw-r--r--ports/geckolib/glue.rs82
-rw-r--r--ports/geckolib/wrapper.rs17
6 files changed, 293 insertions, 193 deletions
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs
index 70509de16da..0799981f7a8 100644
--- a/components/style/properties/gecko.mako.rs
+++ b/components/style/properties/gecko.mako.rs
@@ -24,7 +24,7 @@ use gecko_bindings::bindings::{Gecko_EnsureImageLayersLength, Gecko_CreateGradie
use gecko_bindings::bindings::{Gecko_CopyImageValueFrom, Gecko_CopyFontFamilyFrom};
use gecko_bindings::bindings::{Gecko_FontFamilyList_AppendGeneric, Gecko_FontFamilyList_AppendNamed};
use gecko_bindings::bindings::{Gecko_FontFamilyList_Clear, Gecko_InitializeImageLayer};
-use gecko_bindings::bindings::ServoComputedValuesMaybeBorrowed;
+use gecko_bindings::bindings::ServoComputedValuesBorrowedOrNull;
use gecko_bindings::structs;
use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordData, CoordDataMut};
use gecko_values::{StyleCoordHelpers, GeckoStyleCoordConvertible, convert_nscolor_to_rgba};
@@ -1713,7 +1713,7 @@ fn static_assert() {
#[no_mangle]
#[allow(non_snake_case, unused_variables)]
pub extern "C" fn Servo_GetStyle${style_struct.gecko_name}(computed_values:
- ServoComputedValuesMaybeBorrowed) -> *const ${style_struct.gecko_ffi_name} {
+ ServoComputedValuesBorrowedOrNull) -> *const ${style_struct.gecko_ffi_name} {
computed_values.as_arc::<ComputedValues>().get_${style_struct.name_lower}().get_gecko()
as *const ${style_struct.gecko_ffi_name}
}
diff --git a/ports/geckolib/binding_tools/regen.py b/ports/geckolib/binding_tools/regen.py
index 31d9857e793..0ff54c16031 100755
--- a/ports/geckolib/binding_tools/regen.py
+++ b/ports/geckolib/binding_tools/regen.py
@@ -150,15 +150,14 @@ COMPILATION_TARGETS = {
"void_types": [
"nsINode", "nsIDocument", "nsIPrincipal", "nsIURI",
],
- "servo_maybe_arc_types": [
+ "servo_nullable_arc_types": [
"ServoComputedValues", "RawServoStyleSheet",
"ServoDeclarationBlock"
],
"servo_owned_types": [
"RawServoStyleSet",
- ],
- "servo_maybe_owned_types": [
"ServoNodeData",
+ "StyleChildrenIterator",
],
"servo_immutable_borrow_types": [
"RawGeckoNode",
@@ -283,6 +282,22 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
flags = []
+ # This makes an FFI-safe void type that can't be matched on
+ # &VoidType is UB to have, because you can match on it
+ # to produce a reachable unreachable. If it's wrapped in
+ # a struct as a private field it becomes okay again
+ #
+ # Not 100% sure of how safe this is, but it's what we're using
+ # in the XPCOM ffi too
+ # https://github.com/nikomatsakis/rust-memory-model/issues/2
+ def zero_size_type(ty, flags):
+ flags.append("--blacklist-type")
+ flags.append(ty)
+ flags.append("--raw-line")
+ flags.append("enum {0}Void{{ }}".format(ty))
+ flags.append("--raw-line")
+ flags.append("pub struct {0}({0}Void);".format(ty))
+
if "flags" in current_target:
flags.extend(current_target["flags"])
@@ -326,26 +341,32 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
for ty in current_target["void_types"]:
flags.append("--raw-line")
flags.append("pub enum {} {{}}".format(ty))
- if "servo_maybe_arc_types" in current_target:
- for ty in current_target["servo_maybe_arc_types"]:
+ if "servo_nullable_arc_types" in current_target:
+ for ty in current_target["servo_nullable_arc_types"]:
flags.append("--blacklist-type")
flags.append("{}Strong".format(ty))
flags.append("--raw-line")
flags.append("pub type {0}Strong = ::sugar::ownership::Strong<{0}>;".format(ty))
flags.append("--blacklist-type")
- flags.append("{}MaybeBorrowed".format(ty))
- flags.append("-raw-line")
- flags.append("pub type {0}MaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, {0}>;".format(ty))
+ flags.append("{}BorrowedOrNull".format(ty))
+ flags.append("--raw-line")
+ flags.append("pub type {0}BorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, {0}>;".format(ty))
+ flags.append("--blacklist-type")
+ flags.append("{}Borrowed".format(ty))
+ flags.append("--raw-line")
+ flags.append("pub type {0}Borrowed<'a> = &'a {0};".format(ty))
+ zero_size_type(ty, flags)
if "servo_immutable_borrow_types" in current_target:
for ty in current_target["servo_immutable_borrow_types"]:
- flags.append("-blacklist-type")
+ flags.append("--blacklist-type")
flags.append("{}Borrowed".format(ty))
flags.append("--raw-line")
flags.append("pub type {0}Borrowed<'a> = &'a {0};".format(ty))
flags.append("--blacklist-type")
- flags.append("{}MaybeBorrowed".format(ty))
+ flags.append("{}BorrowedOrNull".format(ty))
flags.append("--raw-line")
- flags.append("pub type {0}MaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, {0}>;".format(ty))
+ flags.append("pub type {0}BorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, {0}>;".format(ty))
+ zero_size_type(ty, flags)
if "servo_owned_types" in current_target:
for ty in current_target["servo_owned_types"]:
flags.append("--blacklist-type")
@@ -360,22 +381,21 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
flags.append("{}Owned".format(ty))
flags.append("--raw-line")
flags.append("pub type {0}Owned = ::sugar::ownership::Owned<{0}>;".format(ty))
- if "servo_maybe_owned_types" in current_target:
- for ty in current_target["servo_maybe_owned_types"]:
flags.append("--blacklist-type")
- flags.append("{}MaybeBorrowed".format(ty))
+ flags.append("{}BorrowedOrNull".format(ty))
flags.append("--raw-line")
- flags.append("pub type {0}MaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, {0}>;"
+ flags.append("pub type {0}BorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, {0}>;"
.format(ty))
flags.append("--blacklist-type")
- flags.append("{}MaybeBorrowedMut".format(ty))
+ flags.append("{}BorrowedMutOrNull".format(ty))
flags.append("--raw-line")
- flags.append("pub type {0}MaybeBorrowedMut<'a> = ::sugar::ownership::BorrowedMut<'a, {0}>;"
+ flags.append("pub type {0}BorrowedMutOrNull<'a> = ::sugar::ownership::BorrowedMut<'a, {0}>;"
.format(ty))
flags.append("--blacklist-type")
- flags.append("{}MaybeOwned".format(ty))
+ flags.append("{}OwnedOrNull".format(ty))
flags.append("--raw-line")
- flags.append("pub type {0}MaybeOwned = ::sugar::ownership::MaybeOwned<{0}>;".format(ty))
+ flags.append("pub type {0}OwnedOrNull = ::sugar::ownership::OwnedOrNull<{0}>;".format(ty))
+ zero_size_type(ty, flags)
if "structs_types" in current_target:
for ty in current_target["structs_types"]:
ty_fragments = ty.split("::")
@@ -405,7 +425,7 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
# TODO: support more files, that's the whole point of this.
assert len(current_target["files"]) == 1
- clang_flags.append(current_target["files"][0].format(objdir))
+ flags.append(current_target["files"][0].format(objdir))
flags = bindgen + flags + ["--"] + clang_flags
diff --git a/ports/geckolib/gecko_bindings/bindings.rs b/ports/geckolib/gecko_bindings/bindings.rs
index 876303f52ba..54fc98b6287 100644
--- a/ports/geckolib/gecko_bindings/bindings.rs
+++ b/ports/geckolib/gecko_bindings/bindings.rs
@@ -6,23 +6,56 @@ pub enum nsIDocument {}
pub enum nsIPrincipal {}
pub enum nsIURI {}
pub type ServoComputedValuesStrong = ::sugar::ownership::Strong<ServoComputedValues>;
-pub type ServoComputedValuesMaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, ServoComputedValues>;
+pub type ServoComputedValuesBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, ServoComputedValues>;
+pub type ServoComputedValuesBorrowed<'a> = &'a ServoComputedValues;
+enum ServoComputedValuesVoid{ }
+pub struct ServoComputedValues(ServoComputedValuesVoid);
pub type RawServoStyleSheetStrong = ::sugar::ownership::Strong<RawServoStyleSheet>;
-pub type RawServoStyleSheetMaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, RawServoStyleSheet>;
+pub type RawServoStyleSheetBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawServoStyleSheet>;
+pub type RawServoStyleSheetBorrowed<'a> = &'a RawServoStyleSheet;
+enum RawServoStyleSheetVoid{ }
+pub struct RawServoStyleSheet(RawServoStyleSheetVoid);
pub type ServoDeclarationBlockStrong = ::sugar::ownership::Strong<ServoDeclarationBlock>;
-pub type ServoDeclarationBlockMaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, ServoDeclarationBlock>;
+pub type ServoDeclarationBlockBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, ServoDeclarationBlock>;
+pub type ServoDeclarationBlockBorrowed<'a> = &'a ServoDeclarationBlock;
+enum ServoDeclarationBlockVoid{ }
+pub struct ServoDeclarationBlock(ServoDeclarationBlockVoid);
pub type RawGeckoNodeBorrowed<'a> = &'a RawGeckoNode;
-pub type RawGeckoNodeMaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoNode>;
+pub type RawGeckoNodeBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoNode>;
+enum RawGeckoNodeVoid{ }
+pub struct RawGeckoNode(RawGeckoNodeVoid);
pub type RawGeckoElementBorrowed<'a> = &'a RawGeckoElement;
-pub type RawGeckoElementMaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoElement>;
+pub type RawGeckoElementBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoElement>;
+enum RawGeckoElementVoid{ }
+pub struct RawGeckoElement(RawGeckoElementVoid);
pub type RawGeckoDocumentBorrowed<'a> = &'a RawGeckoDocument;
-pub type RawGeckoDocumentMaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoDocument>;
+pub type RawGeckoDocumentBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoDocument>;
+enum RawGeckoDocumentVoid{ }
+pub struct RawGeckoDocument(RawGeckoDocumentVoid);
pub type RawServoStyleSetBorrowed<'a> = &'a RawServoStyleSet;
pub type RawServoStyleSetBorrowedMut<'a> = &'a mut RawServoStyleSet;
pub type RawServoStyleSetOwned = ::sugar::ownership::Owned<RawServoStyleSet>;
-pub type ServoNodeDataMaybeBorrowed<'a> = ::sugar::ownership::Borrowed<'a, ServoNodeData>;
-pub type ServoNodeDataMaybeBorrowedMut<'a> = ::sugar::ownership::BorrowedMut<'a, ServoNodeData>;
-pub type ServoNodeDataMaybeOwned = ::sugar::ownership::MaybeOwned<ServoNodeData>;
+pub type RawServoStyleSetBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawServoStyleSet>;
+pub type RawServoStyleSetBorrowedMutOrNull<'a> = ::sugar::ownership::BorrowedMut<'a, RawServoStyleSet>;
+pub type RawServoStyleSetOwnedOrNull = ::sugar::ownership::OwnedOrNull<RawServoStyleSet>;
+enum RawServoStyleSetVoid{ }
+pub struct RawServoStyleSet(RawServoStyleSetVoid);
+pub type ServoNodeDataBorrowed<'a> = &'a ServoNodeData;
+pub type ServoNodeDataBorrowedMut<'a> = &'a mut ServoNodeData;
+pub type ServoNodeDataOwned = ::sugar::ownership::Owned<ServoNodeData>;
+pub type ServoNodeDataBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, ServoNodeData>;
+pub type ServoNodeDataBorrowedMutOrNull<'a> = ::sugar::ownership::BorrowedMut<'a, ServoNodeData>;
+pub type ServoNodeDataOwnedOrNull = ::sugar::ownership::OwnedOrNull<ServoNodeData>;
+enum ServoNodeDataVoid{ }
+pub struct ServoNodeData(ServoNodeDataVoid);
+pub type StyleChildrenIteratorBorrowed<'a> = &'a StyleChildrenIterator;
+pub type StyleChildrenIteratorBorrowedMut<'a> = &'a mut StyleChildrenIterator;
+pub type StyleChildrenIteratorOwned = ::sugar::ownership::Owned<StyleChildrenIterator>;
+pub type StyleChildrenIteratorBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, StyleChildrenIterator>;
+pub type StyleChildrenIteratorBorrowedMutOrNull<'a> = ::sugar::ownership::BorrowedMut<'a, StyleChildrenIterator>;
+pub type StyleChildrenIteratorOwnedOrNull = ::sugar::ownership::OwnedOrNull<StyleChildrenIterator>;
+enum StyleChildrenIteratorVoid{ }
+pub struct StyleChildrenIterator(StyleChildrenIteratorVoid);
use structs::nsStyleFont;
unsafe impl Send for nsStyleFont {}
unsafe impl Sync for nsStyleFont {}
@@ -171,51 +204,42 @@ use structs::StyleBasicShapeType;
use structs::StyleBasicShape;
use structs::nsCSSShadowArray;
-pub type RawGeckoNode = nsINode;
pub enum Element { }
-pub type RawGeckoElement = Element;
-pub type RawGeckoDocument = nsIDocument;
-pub enum ServoNodeData { }
-pub enum ServoComputedValues { }
-pub enum RawServoStyleSheet { }
-pub enum RawServoStyleSet { }
pub enum nsHTMLCSSStyleSheet { }
-pub enum ServoDeclarationBlock { }
-pub enum StyleChildrenIterator { }
pub type ThreadSafePrincipalHolder = nsMainThreadPtrHolder<nsIPrincipal>;
pub type ThreadSafeURIHolder = nsMainThreadPtrHolder<nsIURI>;
extern "C" {
pub fn Gecko_ChildrenCount(node: RawGeckoNodeBorrowed) -> u32;
pub fn Gecko_NodeIsElement(node: RawGeckoNodeBorrowed) -> bool;
pub fn Gecko_GetParentNode(node: RawGeckoNodeBorrowed)
- -> RawGeckoNodeMaybeBorrowed;
+ -> RawGeckoNodeBorrowedOrNull;
pub fn Gecko_GetFirstChild(node: RawGeckoNodeBorrowed)
- -> RawGeckoNodeMaybeBorrowed;
+ -> RawGeckoNodeBorrowedOrNull;
pub fn Gecko_GetLastChild(node: RawGeckoNodeBorrowed)
- -> RawGeckoNodeMaybeBorrowed;
+ -> RawGeckoNodeBorrowedOrNull;
pub fn Gecko_GetPrevSibling(node: RawGeckoNodeBorrowed)
- -> RawGeckoNodeMaybeBorrowed;
+ -> RawGeckoNodeBorrowedOrNull;
pub fn Gecko_GetNextSibling(node: RawGeckoNodeBorrowed)
- -> RawGeckoNodeMaybeBorrowed;
+ -> RawGeckoNodeBorrowedOrNull;
pub fn Gecko_GetParentElement(element: RawGeckoElementBorrowed)
- -> RawGeckoElementMaybeBorrowed;
+ -> RawGeckoElementBorrowedOrNull;
pub fn Gecko_GetFirstChildElement(element: RawGeckoElementBorrowed)
- -> RawGeckoElementMaybeBorrowed;
+ -> RawGeckoElementBorrowedOrNull;
pub fn Gecko_GetLastChildElement(element: RawGeckoElementBorrowed)
- -> RawGeckoElementMaybeBorrowed;
+ -> RawGeckoElementBorrowedOrNull;
pub fn Gecko_GetPrevSiblingElement(element: RawGeckoElementBorrowed)
- -> RawGeckoElementMaybeBorrowed;
+ -> RawGeckoElementBorrowedOrNull;
pub fn Gecko_GetNextSiblingElement(element: RawGeckoElementBorrowed)
- -> RawGeckoElementMaybeBorrowed;
+ -> RawGeckoElementBorrowedOrNull;
pub fn Gecko_GetDocumentElement(document: RawGeckoDocumentBorrowed)
- -> RawGeckoElementMaybeBorrowed;
+ -> RawGeckoElementBorrowedOrNull;
pub fn Gecko_MaybeCreateStyleChildrenIterator(node: RawGeckoNodeBorrowed)
- -> *mut StyleChildrenIterator;
- pub fn Gecko_DropStyleChildrenIterator(it: *mut StyleChildrenIterator);
- pub fn Gecko_GetNextStyleChild(it: *mut StyleChildrenIterator)
- -> *mut RawGeckoNode;
- pub fn Gecko_ElementState(element: *mut RawGeckoElement) -> u8;
- pub fn Gecko_IsHTMLElementInHTMLDocument(element: *mut RawGeckoElement)
+ -> StyleChildrenIteratorOwnedOrNull;
+ pub fn Gecko_DropStyleChildrenIterator(it: StyleChildrenIteratorOwned);
+ pub fn Gecko_GetNextStyleChild(it: StyleChildrenIteratorBorrowed)
+ -> RawGeckoNodeBorrowedOrNull;
+ pub fn Gecko_ElementState(element: RawGeckoElementBorrowed) -> u8;
+ pub fn Gecko_IsHTMLElementInHTMLDocument(element: RawGeckoElementBorrowed)
-> bool;
pub fn Gecko_IsLink(element: RawGeckoElementBorrowed) -> bool;
pub fn Gecko_IsTextNode(node: RawGeckoNodeBorrowed) -> bool;
@@ -282,11 +306,11 @@ extern "C" {
classList: *mut *mut *mut nsIAtom)
-> u32;
pub fn Gecko_GetServoDeclarationBlock(element: RawGeckoElementBorrowed)
- -> ServoDeclarationBlockMaybeBorrowed;
+ -> ServoDeclarationBlockBorrowedOrNull;
pub fn Gecko_GetNodeData(node: RawGeckoNodeBorrowed)
- -> ServoNodeDataMaybeBorrowed;
+ -> ServoNodeDataBorrowedOrNull;
pub fn Gecko_SetNodeData(node: RawGeckoNodeBorrowed,
- data: ServoNodeDataMaybeOwned);
+ data: ServoNodeDataOwned);
pub fn Gecko_Atomize(aString: *const ::std::os::raw::c_char, aLength: u32)
-> *mut nsIAtom;
pub fn Gecko_AddRefAtom(aAtom: *mut nsIAtom);
@@ -337,8 +361,7 @@ extern "C" {
aPseudoTagOrNull: *mut nsIAtom)
-> *mut nsStyleContext;
pub fn Gecko_CalcStyleDifference(oldstyle: *mut nsStyleContext,
- newstyle:
- ServoComputedValuesMaybeBorrowed)
+ newstyle: ServoComputedValuesBorrowed)
-> nsChangeHint;
pub fn Gecko_StoreStyleDifference(node: RawGeckoNodeBorrowed,
change: nsChangeHint);
@@ -477,7 +500,7 @@ extern "C" {
pub fn Gecko_CopyConstruct_nsStyleEffects(ptr: *mut nsStyleEffects,
other: *const nsStyleEffects);
pub fn Gecko_Destroy_nsStyleEffects(ptr: *mut nsStyleEffects);
- pub fn Servo_NodeData_Drop(data: ServoNodeDataMaybeOwned);
+ pub fn Servo_NodeData_Drop(data: ServoNodeDataOwned);
pub fn Servo_StyleSheet_FromUTF8Bytes(bytes: *const u8, length: u32,
parsing_mode: SheetParsingMode,
base_bytes: *const u8,
@@ -487,143 +510,129 @@ extern "C" {
principal:
*mut ThreadSafePrincipalHolder)
-> RawServoStyleSheetStrong;
- pub fn Servo_StyleSheet_AddRef(sheet: RawServoStyleSheetMaybeBorrowed);
- pub fn Servo_StyleSheet_Release(sheet: RawServoStyleSheetMaybeBorrowed);
- pub fn Servo_StyleSheet_HasRules(sheet: RawServoStyleSheetMaybeBorrowed)
+ pub fn Servo_StyleSheet_AddRef(sheet: RawServoStyleSheetBorrowed);
+ pub fn Servo_StyleSheet_Release(sheet: RawServoStyleSheetBorrowed);
+ pub fn Servo_StyleSheet_HasRules(sheet: RawServoStyleSheetBorrowed)
-> bool;
pub fn Servo_StyleSet_Init() -> RawServoStyleSetOwned;
pub fn Servo_StyleSet_Drop(set: RawServoStyleSetOwned);
pub fn Servo_StyleSet_AppendStyleSheet(set: RawServoStyleSetBorrowedMut,
- sheet: RawServoStyleSheetMaybeBorrowed);
+ sheet: RawServoStyleSheetBorrowed);
pub fn Servo_StyleSet_PrependStyleSheet(set: RawServoStyleSetBorrowedMut,
sheet:
- RawServoStyleSheetMaybeBorrowed);
+ RawServoStyleSheetBorrowed);
pub fn Servo_StyleSet_RemoveStyleSheet(set: RawServoStyleSetBorrowedMut,
- sheet: RawServoStyleSheetMaybeBorrowed);
- pub fn Servo_StyleSet_InsertStyleSheetBefore(set: RawServoStyleSetBorrowedMut,
+ sheet: RawServoStyleSheetBorrowed);
+ pub fn Servo_StyleSet_InsertStyleSheetBefore(set:
+ RawServoStyleSetBorrowedMut,
sheet:
- RawServoStyleSheetMaybeBorrowed,
+ RawServoStyleSheetBorrowed,
reference:
- RawServoStyleSheetMaybeBorrowed);
+ RawServoStyleSheetBorrowed);
pub fn Servo_ParseStyleAttribute(bytes: *const u8, length: u32,
cache: *mut nsHTMLCSSStyleSheet)
-> ServoDeclarationBlockStrong;
pub fn Servo_DeclarationBlock_AddRef(declarations:
- ServoDeclarationBlockMaybeBorrowed);
+ ServoDeclarationBlockBorrowed);
pub fn Servo_DeclarationBlock_Release(declarations:
- ServoDeclarationBlockMaybeBorrowed);
+ ServoDeclarationBlockBorrowed);
pub fn Servo_DeclarationBlock_GetCache(declarations:
- ServoDeclarationBlockMaybeBorrowed)
+ ServoDeclarationBlockBorrowed)
-> *mut nsHTMLCSSStyleSheet;
pub fn Servo_DeclarationBlock_SetImmutable(declarations:
- ServoDeclarationBlockMaybeBorrowed);
+ ServoDeclarationBlockBorrowed);
pub fn Servo_DeclarationBlock_ClearCachePointer(declarations:
- ServoDeclarationBlockMaybeBorrowed);
+ ServoDeclarationBlockBorrowed);
pub fn Servo_CSSSupports(name: *const u8, name_length: u32,
value: *const u8, value_length: u32) -> bool;
pub fn Servo_ComputedValues_Get(node: RawGeckoNodeBorrowed)
-> ServoComputedValuesStrong;
pub fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null:
- ServoComputedValuesMaybeBorrowed,
+ ServoComputedValuesBorrowedOrNull,
pseudoTag: *mut nsIAtom,
- set: RawServoStyleSetBorrowedMut)
+ set:
+ RawServoStyleSetBorrowedMut)
-> ServoComputedValuesStrong;
pub fn Servo_ComputedValues_GetForPseudoElement(parent_style:
- ServoComputedValuesMaybeBorrowed,
+ ServoComputedValuesBorrowed,
match_element:
- *mut RawGeckoElement,
+ RawGeckoElementBorrowed,
pseudo_tag: *mut nsIAtom,
set:
RawServoStyleSetBorrowedMut,
is_probe: bool)
-> ServoComputedValuesStrong;
pub fn Servo_ComputedValues_Inherit(parent_style:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowedOrNull)
-> ServoComputedValuesStrong;
pub fn Servo_ComputedValues_AddRef(computed_values:
- ServoComputedValuesMaybeBorrowed);
+ ServoComputedValuesBorrowed);
pub fn Servo_ComputedValues_Release(computed_values:
- ServoComputedValuesMaybeBorrowed);
+ ServoComputedValuesBorrowed);
pub fn Servo_Initialize();
pub fn Servo_Shutdown();
pub fn Servo_ComputeRestyleHint(element: *mut RawGeckoElement,
snapshot: *mut ServoElementSnapshot,
- set: RawServoStyleSetBorrowedMut)
+ set: RawServoStyleSetBorrowed)
-> nsRestyleHint;
pub fn Servo_RestyleDocument(doc: RawGeckoDocumentBorrowed,
set: RawServoStyleSetBorrowedMut);
pub fn Servo_RestyleSubtree(node: RawGeckoNodeBorrowed,
set: RawServoStyleSetBorrowedMut);
- pub fn Servo_GetStyleFont(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleFont(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleFont;
- pub fn Servo_GetStyleColor(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleColor(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleColor;
- pub fn Servo_GetStyleList(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleList(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleList;
- pub fn Servo_GetStyleText(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleText(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleText;
pub fn Servo_GetStyleVisibility(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStyleVisibility;
pub fn Servo_GetStyleUserInterface(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStyleUserInterface;
pub fn Servo_GetStyleTableBorder(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStyleTableBorder;
- pub fn Servo_GetStyleSVG(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleSVG(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleSVG;
pub fn Servo_GetStyleVariables(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStyleVariables;
pub fn Servo_GetStyleBackground(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStyleBackground;
pub fn Servo_GetStylePosition(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStylePosition;
pub fn Servo_GetStyleTextReset(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStyleTextReset;
- pub fn Servo_GetStyleDisplay(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleDisplay(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleDisplay;
- pub fn Servo_GetStyleContent(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleContent(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleContent;
- pub fn Servo_GetStyleUIReset(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleUIReset(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleUIReset;
- pub fn Servo_GetStyleTable(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleTable(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleTable;
- pub fn Servo_GetStyleMargin(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleMargin(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleMargin;
- pub fn Servo_GetStylePadding(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStylePadding(computed_values: ServoComputedValuesBorrowed)
-> *const nsStylePadding;
- pub fn Servo_GetStyleBorder(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleBorder(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleBorder;
- pub fn Servo_GetStyleOutline(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleOutline(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleOutline;
- pub fn Servo_GetStyleXUL(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleXUL(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleXUL;
pub fn Servo_GetStyleSVGReset(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ ServoComputedValuesBorrowed)
-> *const nsStyleSVGReset;
- pub fn Servo_GetStyleColumn(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleColumn(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleColumn;
- pub fn Servo_GetStyleEffects(computed_values:
- ServoComputedValuesMaybeBorrowed)
+ pub fn Servo_GetStyleEffects(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleEffects;
}
diff --git a/ports/geckolib/gecko_bindings/sugar/ownership.rs b/ports/geckolib/gecko_bindings/sugar/ownership.rs
index bc6273bb8a5..39b4cf59f41 100644
--- a/ports/geckolib/gecko_bindings/sugar/ownership.rs
+++ b/ports/geckolib/gecko_bindings/sugar/ownership.rs
@@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::marker::PhantomData;
-use std::mem::{forget, transmute, transmute_copy};
+use std::mem::{forget, transmute};
use std::ops::{Deref, DerefMut};
use std::ptr;
use std::sync::Arc;
@@ -71,20 +71,43 @@ pub unsafe trait HasBoxFFI : HasSimpleFFI {
pub unsafe trait HasArcFFI : HasFFI {
// these methods can't be on Borrowed because it leads to an unspecified
// impl parameter
- /// Artificially increments the refcount of a borrowed Arc over FFI.
- unsafe fn addref(ptr: Borrowed<Self::FFIType>) {
- forget(ptr.as_arc::<Self>().clone())
+ /// Artificially increments the refcount of a (possibly null) borrowed Arc over FFI.
+ unsafe fn addref_opt(ptr: Borrowed<Self::FFIType>) {
+ forget(ptr.as_arc_opt::<Self>().clone())
}
/// Given a (possibly null) borrowed FFI reference, decrements the refcount.
/// Unsafe since it doesn't consume the backing Arc. Run it only when you
/// know that a strong reference to the backing Arc is disappearing
/// (usually on the C++ side) without running the Arc destructor.
- unsafe fn release(ptr: Borrowed<Self::FFIType>) {
+ unsafe fn release_opt(ptr: Borrowed<Self::FFIType>) {
if let Some(arc) = ptr.as_arc_opt::<Self>() {
let _: Arc<_> = ptr::read(arc as *const Arc<_>);
}
}
+
+ /// Artificially increments the refcount of a borrowed Arc over FFI.
+ unsafe fn addref(ptr: &Self::FFIType) {
+ forget(Self::as_arc(&ptr).clone())
+ }
+
+ /// Given a non-null borrowed FFI reference, decrements the refcount.
+ /// Unsafe since it doesn't consume the backing Arc. Run it only when you
+ /// know that a strong reference to the backing Arc is disappearing
+ /// (usually on the C++ side) without running the Arc destructor.
+ unsafe fn release(ptr: &Self::FFIType) {
+ let _: Arc<_> = ptr::read(Self::as_arc(&ptr) as *const Arc<_>);
+ }
+ #[inline]
+ /// Converts a borrowed FFI reference to a borrowed Arc.
+ ///
+ /// &GeckoType -> &Arc<ServoType>
+ fn as_arc<'a>(ptr: &'a &Self::FFIType) -> &'a Arc<Self> {
+ debug_assert!(!(ptr as *const _).is_null());
+ unsafe {
+ transmute::<&&Self::FFIType, &Arc<Self>>(ptr)
+ }
+ }
}
#[repr(C)]
@@ -113,7 +136,7 @@ impl<'a, T> Clone for Borrowed<'a, T> {
impl<'a, T> Borrowed<'a, T> {
#[inline]
- pub fn is_null(&self) -> bool {
+ pub fn is_null(self) -> bool {
self.ptr == ptr::null()
}
@@ -150,7 +173,7 @@ impl<'a, T> Borrowed<'a, T> {
#[inline]
/// Borrowed<ServoType> -> Borrowed<GeckoType>
- pub fn as_ffi(&self) -> Borrowed<<Self as HasFFI>::FFIType> where Self: HasSimpleFFI {
+ pub fn as_ffi(self) -> Borrowed<'a, <Self as HasFFI>::FFIType> where Self: HasSimpleFFI {
unsafe { transmute(self) }
}
@@ -165,6 +188,13 @@ impl<'a, T> Borrowed<'a, T> {
pub fn as_servo_ref<U>(self) -> Option<&'a U> where U: HasSimpleFFI<FFIType = T> {
self.borrow_opt().map(HasSimpleFFI::from_ffi)
}
+
+ pub fn null() -> Borrowed<'static, T> {
+ Borrowed {
+ ptr: ptr::null_mut(),
+ _marker: PhantomData
+ }
+ }
}
impl<'a, T> BorrowedMut<'a, T> {
@@ -196,9 +226,17 @@ impl<'a, T> BorrowedMut<'a, T> {
pub fn as_servo_mut_ref<U>(self) -> Option<&'a mut U> where U: HasSimpleFFI<FFIType = T> {
self.borrow_mut_opt().map(HasSimpleFFI::from_ffi_mut)
}
+
+ pub fn null_mut() -> BorrowedMut<'static, T> {
+ BorrowedMut {
+ ptr: ptr::null_mut(),
+ _marker: PhantomData
+ }
+ }
}
-// technically not
+// technically not how we're supposed to use
+// Deref, but that's a minor style issue
impl<'a, T> Deref for BorrowedMut<'a, T> {
type Target = Borrowed<'a, T>;
fn deref(&self) -> &Self::Target {
@@ -209,6 +247,8 @@ impl<'a, T> Deref for BorrowedMut<'a, T> {
#[repr(C)]
/// Gecko-FFI-safe Arc (T is an ArcInner).
/// This can be null.
+/// Leaks on drop. Please don't drop this.
+/// TODO: Add destructor bomb once drop flags are gone
pub struct Strong<T> {
ptr: *const T,
_marker: PhantomData<T>,
@@ -227,13 +267,26 @@ impl<T> Strong<T> {
///
/// Strong<GeckoType> -> Arc<ServoType>
pub fn into_arc<U>(self) -> Arc<U> where U: HasArcFFI<FFIType = T> {
- assert!(!self.is_null());
- unsafe { transmute(self) }
+ self.into_arc_opt().unwrap()
+ }
+
+ #[inline]
+ /// Given a strong FFI reference,
+ /// converts it into a servo-side Arc
+ /// Returns None on null.
+ ///
+ /// Strong<GeckoType> -> Arc<ServoType>
+ pub fn into_arc_opt<U>(self) -> Option<Arc<U>> where U: HasArcFFI<FFIType = T> {
+ if self.is_null() {
+ None
+ } else {
+ unsafe { Some(transmute(self)) }
+ }
}
#[inline]
/// Produces a null strong FFI reference
- pub fn null_strong() -> Self {
+ pub fn null() -> Self {
unsafe { transmute(ptr::null::<T>()) }
}
}
@@ -244,10 +297,14 @@ pub unsafe trait FFIArcHelpers {
///
/// Arc<ServoType> -> Strong<GeckoType>
fn into_strong(self) -> Strong<<Self::Inner as HasFFI>::FFIType>;
- /// Produces a borrowed FFI reference by borrowing an Arc.
+ /// Produces a (nullable) borrowed FFI reference by borrowing an Arc.
///
/// &Arc<ServoType> -> Borrowed<GeckoType>
- fn as_borrowed(&self) -> Borrowed<<Self::Inner as HasFFI>::FFIType>;
+ fn as_borrowed_opt(&self) -> Borrowed<<Self::Inner as HasFFI>::FFIType>;
+ /// Produces a borrowed FFI reference by borrowing an Arc.
+ ///
+ /// &Arc<ServoType> -> &GeckoType
+ fn as_borrowed(&self) -> &<Self::Inner as HasFFI>::FFIType;
}
unsafe impl<T: HasArcFFI> FFIArcHelpers for Arc<T> {
@@ -257,15 +314,21 @@ unsafe impl<T: HasArcFFI> FFIArcHelpers for Arc<T> {
unsafe { transmute(self) }
}
#[inline]
- fn as_borrowed(&self) -> Borrowed<T::FFIType> {
+ fn as_borrowed_opt(&self) -> Borrowed<T::FFIType> {
let borrowedptr = self as *const Arc<T> as *const Borrowed<T::FFIType>;
unsafe { ptr::read(borrowedptr) }
}
+ #[inline]
+ fn as_borrowed(&self) -> &T::FFIType {
+ let borrowedptr = self as *const Arc<T> as *const & T::FFIType;
+ unsafe { ptr::read(borrowedptr) }
+ }
}
#[repr(C)]
/// Gecko-FFI-safe owned pointer
/// Cannot be null
+/// Leaks on drop. Please don't drop this.
pub struct Owned<T> {
ptr: *mut T,
_marker: PhantomData<T>,
@@ -276,7 +339,7 @@ impl<T> Owned<T> {
pub fn into_box<U>(self) -> Box<T> where U: HasBoxFFI<FFIType = T> {
unsafe { transmute(self) }
}
- pub fn maybe(self) -> MaybeOwned<T> {
+ pub fn maybe(self) -> OwnedOrNull<T> {
unsafe { transmute(self) }
}
}
@@ -297,16 +360,16 @@ impl<T> DerefMut for Owned<T> {
#[repr(C)]
/// Gecko-FFI-safe owned pointer
/// Can be null
-pub struct MaybeOwned<T> {
+pub struct OwnedOrNull<T> {
ptr: *mut T,
_marker: PhantomData<T>,
}
-impl<T> MaybeOwned<T> {
+impl<T> OwnedOrNull<T> {
pub fn is_null(&self) -> bool {
self.ptr == ptr::null_mut()
}
- /// MaybeOwned<GeckoType> -> Option<Box<ServoType>>
+ /// OwnedOrNull<GeckoType> -> Option<Box<ServoType>>
pub fn into_box_opt<U>(self) -> Option<Box<T>> where U: HasBoxFFI<FFIType = T> {
if self.is_null() {
None
@@ -315,6 +378,15 @@ impl<T> MaybeOwned<T> {
}
}
+ /// OwnedOrNull<GeckoType> -> Option<Owned<GeckoType>>
+ pub fn into_owned_opt(self) -> Option<Owned<T>> {
+ if self.is_null() {
+ None
+ } else {
+ Some(unsafe { transmute(self) })
+ }
+ }
+
pub fn borrow(&self) -> Borrowed<T> {
unsafe { transmute(self) }
}
diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs
index f21c4242849..685d594d0e7 100644
--- a/ports/geckolib/glue.rs
+++ b/ports/geckolib/glue.rs
@@ -8,16 +8,16 @@ use app_units::Au;
use data::{NUM_THREADS, PerDocumentStyleData};
use env_logger;
use euclid::Size2D;
-use gecko_bindings::bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode};
use gecko_bindings::bindings::RawGeckoDocumentBorrowed;
+use gecko_bindings::bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode};
use gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoNodeBorrowed};
use gecko_bindings::bindings::{RawServoStyleSet, RawServoStyleSetBorrowedMut};
-use gecko_bindings::bindings::{RawServoStyleSetOwned, ServoNodeDataMaybeOwned};
-use gecko_bindings::bindings::{RawServoStyleSheetMaybeBorrowed, ServoComputedValuesMaybeBorrowed};
+use gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned, ServoNodeDataOwned};
+use gecko_bindings::bindings::{RawServoStyleSheetBorrowed, ServoComputedValuesBorrowed};
use gecko_bindings::bindings::{RawServoStyleSheetStrong, ServoComputedValuesStrong};
-use gecko_bindings::bindings::{ServoDeclarationBlock, ThreadSafePrincipalHolder};
-use gecko_bindings::bindings::{ServoDeclarationBlockMaybeBorrowed, ServoDeclarationBlockStrong};
-use gecko_bindings::bindings::{ThreadSafeURIHolder, nsHTMLCSSStyleSheet};
+use gecko_bindings::bindings::{ServoComputedValuesBorrowedOrNull, ServoDeclarationBlock};
+use gecko_bindings::bindings::{ServoDeclarationBlockBorrowed, ServoDeclarationBlockStrong};
+use gecko_bindings::bindings::{ThreadSafePrincipalHolder, ThreadSafeURIHolder, nsHTMLCSSStyleSheet};
use gecko_bindings::ptr::{GeckoArcPrincipal, GeckoArcURI};
use gecko_bindings::structs::ServoElementSnapshot;
use gecko_bindings::structs::nsRestyleHint;
@@ -138,8 +138,8 @@ pub extern "C" fn Servo_StyleWorkerThreadCount() -> u32 {
}
#[no_mangle]
-pub extern "C" fn Servo_NodeData_Drop(data: ServoNodeDataMaybeOwned) -> () {
- let _ = data.into_box_opt::<NonOpaqueStyleData>();
+pub extern "C" fn Servo_NodeData_Drop(data: ServoNodeDataOwned) -> () {
+ let _ = data.into_box::<NonOpaqueStyleData>();
}
#[no_mangle]
@@ -176,9 +176,9 @@ pub extern "C" fn Servo_StyleSheet_FromUTF8Bytes(bytes: *const u8,
#[no_mangle]
pub extern "C" fn Servo_StyleSet_AppendStyleSheet(raw_data: RawServoStyleSetBorrowedMut,
- raw_sheet: RawServoStyleSheetMaybeBorrowed) {
+ raw_sheet: RawServoStyleSheetBorrowed) {
let data = PerDocumentStyleData::from_ffi_mut(raw_data);
- let sheet = raw_sheet.as_arc();
+ let sheet = HasArcFFI::as_arc(&raw_sheet);
data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
data.stylesheets.push(sheet.clone());
data.stylesheets_changed = true;
@@ -186,9 +186,9 @@ pub extern "C" fn Servo_StyleSet_AppendStyleSheet(raw_data: RawServoStyleSetBorr
#[no_mangle]
pub extern "C" fn Servo_StyleSet_PrependStyleSheet(raw_data: RawServoStyleSetBorrowedMut,
- raw_sheet: RawServoStyleSheetMaybeBorrowed) {
+ raw_sheet: RawServoStyleSheetBorrowed) {
let data = PerDocumentStyleData::from_ffi_mut(raw_data);
- let sheet = raw_sheet.as_arc();
+ let sheet = HasArcFFI::as_arc(&raw_sheet);
data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
data.stylesheets.insert(0, sheet.clone());
data.stylesheets_changed = true;
@@ -196,11 +196,11 @@ pub extern "C" fn Servo_StyleSet_PrependStyleSheet(raw_data: RawServoStyleSetBor
#[no_mangle]
pub extern "C" fn Servo_StyleSet_InsertStyleSheetBefore(raw_data: RawServoStyleSetBorrowedMut,
- raw_sheet: RawServoStyleSheetMaybeBorrowed,
- raw_reference: RawServoStyleSheetMaybeBorrowed) {
+ raw_sheet: RawServoStyleSheetBorrowed,
+ raw_reference: RawServoStyleSheetBorrowed) {
let data = PerDocumentStyleData::from_ffi_mut(raw_data);
- let sheet = raw_sheet.as_arc();
- let reference = raw_reference.as_arc();
+ let sheet = HasArcFFI::as_arc(&raw_sheet);
+ let reference = HasArcFFI::as_arc(&raw_reference);
data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
let index = data.stylesheets.iter().position(|x| arc_ptr_eq(x, reference)).unwrap();
data.stylesheets.insert(index, sheet.clone());
@@ -209,25 +209,25 @@ pub extern "C" fn Servo_StyleSet_InsertStyleSheetBefore(raw_data: RawServoStyleS
#[no_mangle]
pub extern "C" fn Servo_StyleSet_RemoveStyleSheet(raw_data: RawServoStyleSetBorrowedMut,
- raw_sheet: RawServoStyleSheetMaybeBorrowed) {
+ raw_sheet: RawServoStyleSheetBorrowed) {
let data = PerDocumentStyleData::from_ffi_mut(raw_data);
- let sheet = raw_sheet.as_arc();
+ let sheet = HasArcFFI::as_arc(&raw_sheet);
data.stylesheets.retain(|x| !arc_ptr_eq(x, sheet));
data.stylesheets_changed = true;
}
#[no_mangle]
-pub extern "C" fn Servo_StyleSheet_HasRules(raw_sheet: RawServoStyleSheetMaybeBorrowed) -> bool {
- !raw_sheet.as_arc::<Stylesheet>().rules.is_empty()
+pub extern "C" fn Servo_StyleSheet_HasRules(raw_sheet: RawServoStyleSheetBorrowed) -> bool {
+ !Stylesheet::as_arc(&raw_sheet).rules.is_empty()
}
#[no_mangle]
-pub extern "C" fn Servo_StyleSheet_AddRef(sheet: RawServoStyleSheetMaybeBorrowed) -> () {
+pub extern "C" fn Servo_StyleSheet_AddRef(sheet: RawServoStyleSheetBorrowed) -> () {
unsafe { Stylesheet::addref(sheet) };
}
#[no_mangle]
-pub extern "C" fn Servo_StyleSheet_Release(sheet: RawServoStyleSheetMaybeBorrowed) -> () {
+pub extern "C" fn Servo_StyleSheet_Release(sheet: RawServoStyleSheetBorrowed) -> () {
unsafe { Stylesheet::release(sheet) };
}
@@ -250,7 +250,7 @@ pub extern "C" fn Servo_ComputedValues_Get(node: RawGeckoNodeBorrowed)
}
#[no_mangle]
-pub extern "C" fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null: ServoComputedValuesMaybeBorrowed,
+pub extern "C" fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null: ServoComputedValuesBorrowedOrNull,
pseudo_tag: *mut nsIAtom,
raw_data: RawServoStyleSetBorrowedMut)
-> ServoComputedValuesStrong {
@@ -264,11 +264,11 @@ pub extern "C" fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null:
let maybe_parent = parent_style_or_null.as_arc_opt();
let new_computed = data.stylist.precomputed_values_for_pseudo(&pseudo, maybe_parent);
- new_computed.map_or(Strong::null_strong(), |c| c.into_strong())
+ new_computed.map_or(Strong::null(), |c| c.into_strong())
}
#[no_mangle]
-pub extern "C" fn Servo_ComputedValues_GetForPseudoElement(parent_style: ServoComputedValuesMaybeBorrowed,
+pub extern "C" fn Servo_ComputedValues_GetForPseudoElement(parent_style: ServoComputedValuesBorrowed,
match_element: RawGeckoElementBorrowed,
pseudo_tag: *mut nsIAtom,
raw_data: RawServoStyleSetBorrowedMut,
@@ -278,9 +278,9 @@ pub extern "C" fn Servo_ComputedValues_GetForPseudoElement(parent_style: ServoCo
let parent_or_null = || {
if is_probe {
- Strong::null_strong()
+ Strong::null()
} else {
- parent_style.as_arc::<ComputedValues>().clone().into_strong()
+ ComputedValues::as_arc(&parent_style).clone().into_strong()
}
};
@@ -304,7 +304,7 @@ pub extern "C" fn Servo_ComputedValues_GetForPseudoElement(parent_style: ServoCo
maybe_computed.map_or_else(parent_or_null, FFIArcHelpers::into_strong)
}
PseudoElementCascadeType::Lazy => {
- let parent = parent_style.as_arc::<ComputedValues>();
+ let parent = ComputedValues::as_arc(&parent_style);
data.stylist
.lazily_compute_pseudo_element_style(&element, &pseudo, parent)
.map_or_else(parent_or_null, FFIArcHelpers::into_strong)
@@ -317,7 +317,7 @@ pub extern "C" fn Servo_ComputedValues_GetForPseudoElement(parent_style: ServoCo
}
#[no_mangle]
-pub extern "C" fn Servo_ComputedValues_Inherit(parent_style: ServoComputedValuesMaybeBorrowed)
+pub extern "C" fn Servo_ComputedValues_Inherit(parent_style: ServoComputedValuesBorrowedOrNull)
-> ServoComputedValuesStrong {
let style = if parent_style.is_null() {
Arc::new(ComputedValues::initial_values().clone())
@@ -328,12 +328,12 @@ pub extern "C" fn Servo_ComputedValues_Inherit(parent_style: ServoComputedValues
}
#[no_mangle]
-pub extern "C" fn Servo_ComputedValues_AddRef(ptr: ServoComputedValuesMaybeBorrowed) -> () {
+pub extern "C" fn Servo_ComputedValues_AddRef(ptr: ServoComputedValuesBorrowed) -> () {
unsafe { ComputedValues::addref(ptr) };
}
#[no_mangle]
-pub extern "C" fn Servo_ComputedValues_Release(ptr: ServoComputedValuesMaybeBorrowed) -> () {
+pub extern "C" fn Servo_ComputedValues_Release(ptr: ServoComputedValuesBorrowed) -> () {
unsafe { ComputedValues::release(ptr) };
}
@@ -378,29 +378,29 @@ pub extern "C" fn Servo_ParseStyleAttribute(bytes: *const u8, length: u32,
}
#[no_mangle]
-pub extern "C" fn Servo_DeclarationBlock_AddRef(declarations: ServoDeclarationBlockMaybeBorrowed) {
+pub extern "C" fn Servo_DeclarationBlock_AddRef(declarations: ServoDeclarationBlockBorrowed) {
unsafe { GeckoDeclarationBlock::addref(declarations) };
}
#[no_mangle]
-pub extern "C" fn Servo_DeclarationBlock_Release(declarations: ServoDeclarationBlockMaybeBorrowed) {
+pub extern "C" fn Servo_DeclarationBlock_Release(declarations: ServoDeclarationBlockBorrowed) {
unsafe { GeckoDeclarationBlock::release(declarations) };
}
#[no_mangle]
-pub extern "C" fn Servo_DeclarationBlock_GetCache(declarations: ServoDeclarationBlockMaybeBorrowed)
+pub extern "C" fn Servo_DeclarationBlock_GetCache(declarations: ServoDeclarationBlockBorrowed)
-> *mut nsHTMLCSSStyleSheet {
- declarations.as_arc::<GeckoDeclarationBlock>().cache.load(Ordering::Relaxed)
+ GeckoDeclarationBlock::as_arc(&declarations).cache.load(Ordering::Relaxed)
}
#[no_mangle]
-pub extern "C" fn Servo_DeclarationBlock_SetImmutable(declarations: ServoDeclarationBlockMaybeBorrowed) {
- declarations.as_arc::<GeckoDeclarationBlock>().immutable.store(true, Ordering::Relaxed)
+pub extern "C" fn Servo_DeclarationBlock_SetImmutable(declarations: ServoDeclarationBlockBorrowed) {
+ GeckoDeclarationBlock::as_arc(&declarations).immutable.store(true, Ordering::Relaxed)
}
#[no_mangle]
-pub extern "C" fn Servo_DeclarationBlock_ClearCachePointer(declarations: ServoDeclarationBlockMaybeBorrowed) {
- declarations.as_arc::<GeckoDeclarationBlock>().cache.store(ptr::null_mut(), Ordering::Relaxed)
+pub extern "C" fn Servo_DeclarationBlock_ClearCachePointer(declarations: ServoDeclarationBlockBorrowed) {
+ GeckoDeclarationBlock::as_arc(&declarations).cache.store(ptr::null_mut(), Ordering::Relaxed)
}
#[no_mangle]
@@ -421,8 +421,8 @@ pub extern "C" fn Servo_CSSSupports(property: *const u8, property_length: u32,
#[no_mangle]
pub extern "C" fn Servo_ComputeRestyleHint(element: RawGeckoElementBorrowed,
snapshot: *mut ServoElementSnapshot,
- raw_data: RawServoStyleSetBorrowedMut) -> nsRestyleHint {
- let per_doc_data = PerDocumentStyleData::from_ffi_mut(raw_data);
+ raw_data: RawServoStyleSetBorrowed) -> nsRestyleHint {
+ let per_doc_data = PerDocumentStyleData::from_ffi(raw_data);
let snapshot = unsafe { GeckoElementSnapshot::from_raw(snapshot) };
let element = unsafe { GeckoElement(element) };
diff --git a/ports/geckolib/wrapper.rs b/ports/geckolib/wrapper.rs
index a3856b6a612..d976728393d 100644
--- a/ports/geckolib/wrapper.rs
+++ b/ports/geckolib/wrapper.rs
@@ -23,7 +23,6 @@ use gecko_bindings::bindings::{Gecko_IsLink, Gecko_IsRootElement, Gecko_IsTextNo
use gecko_bindings::bindings::{Gecko_IsUnvisitedLink, Gecko_IsVisitedLink};
use gecko_bindings::bindings::{Gecko_LocalName, Gecko_Namespace, Gecko_NodeIsElement, Gecko_SetNodeData};
use gecko_bindings::bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode};
-use gecko_bindings::bindings::RawGeckoDocumentBorrowed;
use gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoNodeBorrowed};
use gecko_bindings::structs::{NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO, NODE_IS_DIRTY_FOR_SERVO};
use gecko_bindings::structs::{nsIAtom, nsChangeHint, nsStyleContext};
@@ -89,7 +88,7 @@ impl<'ln> GeckoNode<'ln> {
unsafe {
if self.get_node_data().is_null() {
let ptr = Box::new(NonOpaqueStyleData::new());
- Gecko_SetNodeData(self.0, ptr.into_ffi().maybe());
+ Gecko_SetNodeData(self.0, ptr.into_ffi());
}
}
}
@@ -165,8 +164,8 @@ impl<'ln> TNode for GeckoNode<'ln> {
fn children(self) -> GeckoChildrenIterator<'ln> {
let maybe_iter = unsafe { Gecko_MaybeCreateStyleChildrenIterator(self.0) };
- if !maybe_iter.is_null() {
- GeckoChildrenIterator::GeckoIterator(maybe_iter)
+ if let Some(iter) = maybe_iter.into_owned_opt() {
+ GeckoChildrenIterator::GeckoIterator(iter)
} else {
GeckoChildrenIterator::Current(self.first_child())
}
@@ -346,14 +345,14 @@ impl<'ln> TNode for GeckoNode<'ln> {
// (heavier-weight) Gecko-implemented iterator.
pub enum GeckoChildrenIterator<'a> {
Current(Option<GeckoNode<'a>>),
- GeckoIterator(*mut bindings::StyleChildrenIterator),
+ GeckoIterator(bindings::StyleChildrenIteratorOwned),
}
impl<'a> Drop for GeckoChildrenIterator<'a> {
fn drop(&mut self) {
- if let GeckoChildrenIterator::GeckoIterator(it) = *self {
+ if let GeckoChildrenIterator::GeckoIterator(ref it) = *self {
unsafe {
- Gecko_DropStyleChildrenIterator(it);
+ Gecko_DropStyleChildrenIterator(ptr::read(it as *const _));
}
}
}
@@ -368,8 +367,8 @@ impl<'a> Iterator for GeckoChildrenIterator<'a> {
*self = GeckoChildrenIterator::Current(next);
curr
},
- GeckoChildrenIterator::GeckoIterator(it) => unsafe {
- Gecko_GetNextStyleChild(it).as_ref().map(|n| GeckoNode::from_ref(n))
+ GeckoChildrenIterator::GeckoIterator(ref it) => unsafe {
+ Gecko_GetNextStyleChild(&it).borrow_opt().map(GeckoNode)
}
}
}