Bug 1338388 - Part 1: stylo: Add ServoBundledURI abstraction for use when setting css::URLValues; r?heycam
MozReview-Commit-ID: 4QKKzJ1DVYP
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -738,42 +738,45 @@ void
Gecko_CopyListStyleTypeFrom(nsStyleList* dst, const nsStyleList* src)
{
dst->SetCounterStyle(src->GetCounterStyle());
}
NS_IMPL_HOLDER_FFI_REFCOUNTING(nsIPrincipal, Principal)
NS_IMPL_HOLDER_FFI_REFCOUNTING(nsIURI, URI)
-void
-Gecko_SetMozBinding(nsStyleDisplay* aDisplay,
- const uint8_t* aURLString, uint32_t aURLStringLength,
- ThreadSafeURIHolder* aBaseURI,
- ThreadSafeURIHolder* aReferrer,
- ThreadSafePrincipalHolder* aPrincipal)
+already_AddRefed<css::URLValue>
+ServoBundledURI::IntoCssUrl()
{
- if (!aURLString) {
- aDisplay->mBinding = nullptr;
- return;
+ if (!mURLString) {
+ return nullptr;
}
- MOZ_ASSERT(aDisplay);
- MOZ_ASSERT(aBaseURI);
- MOZ_ASSERT(aReferrer);
- MOZ_ASSERT(aPrincipal);
+ MOZ_ASSERT(mBaseURI);
+ MOZ_ASSERT(mReferrer);
+ MOZ_ASSERT(mPrincipal);
nsString url;
- nsDependentCSubstring urlString(reinterpret_cast<const char*>(aURLString),
- aURLStringLength);
+ nsDependentCSubstring urlString(reinterpret_cast<const char*>(mURLString),
+ mURLStringLength);
AppendUTF8toUTF16(urlString, url);
RefPtr<nsStringBuffer> urlBuffer = nsCSSValue::BufferFromString(url);
- aDisplay->mBinding =
- new css::URLValue(urlBuffer, do_AddRef(aBaseURI),
- do_AddRef(aReferrer), do_AddRef(aPrincipal));
+ RefPtr<css::URLValue> urlValue = new css::URLValue(urlBuffer,
+ do_AddRef(mBaseURI),
+ do_AddRef(mReferrer),
+ do_AddRef(mPrincipal));
+ return urlValue.forget();
+}
+
+void
+Gecko_SetMozBinding(nsStyleDisplay* aDisplay, ServoBundledURI aBundledURI)
+{
+ MOZ_ASSERT(aDisplay);
+ aDisplay->mBinding = aBundledURI.IntoCssUrl();
}
void
Gecko_CopyMozBindingFrom(nsStyleDisplay* aDest, const nsStyleDisplay* aSrc)
{
aDest->mBinding = aSrc->mBinding;
}
@@ -901,25 +904,22 @@ Gecko_CreateGradient(uint8_t aShape,
void
Gecko_SetListStyleImageNone(nsStyleList* aList)
{
aList->mListStyleImage = nullptr;
}
void
Gecko_SetListStyleImage(nsStyleList* aList,
- const uint8_t* aURLString, uint32_t aURLStringLength,
- ThreadSafeURIHolder* aBaseURI,
- ThreadSafeURIHolder* aReferrer,
- ThreadSafePrincipalHolder* aPrincipal)
+ ServoBundledURI aURI)
{
aList->mListStyleImage =
CreateStyleImageRequest(nsStyleImageRequest::Mode(0),
- aURLString, aURLStringLength,
- aBaseURI, aReferrer, aPrincipal);
+ aURI.mURLString, aURI.mURLStringLength,
+ aURI.mBaseURI, aURI.mReferrer, aURI.mPrincipal);
}
void
Gecko_CopyListStyleImageFrom(nsStyleList* aList, const nsStyleList* aSource)
{
aList->mListStyleImage = aSource->mListStyleImage;
}
--- a/layout/style/ServoBindings.h
+++ b/layout/style/ServoBindings.h
@@ -30,16 +30,19 @@ class nsIAtom;
class nsIPrincipal;
class nsIURI;
struct nsFont;
namespace mozilla {
class ServoStyleSheet;
class FontFamilyList;
enum FontFamilyType : uint32_t;
struct Keyframe;
+ namespace css {
+ struct URLValue;
+ };
}
using mozilla::FontFamilyList;
using mozilla::FontFamilyType;
using mozilla::ServoElementSnapshot;
struct nsMediaFeature;
struct nsStyleList;
struct nsStyleImage;
struct nsStyleGradientStop;
@@ -80,16 +83,27 @@ DEFINE_ARRAY_TYPE_FOR(uintptr_t);
#undef DEFINE_ARRAY_TYPE_FOR
extern "C" {
// Object refcounting.
NS_DECL_HOLDER_FFI_REFCOUNTING(nsIPrincipal, Principal)
NS_DECL_HOLDER_FFI_REFCOUNTING(nsIURI, URI)
+class ServoBundledURI
+{
+public:
+ already_AddRefed<mozilla::css::URLValue> IntoCssUrl();
+ const uint8_t* mURLString;
+ uint32_t mURLStringLength;
+ ThreadSafeURIHolder* mBaseURI;
+ ThreadSafeURIHolder* mReferrer;
+ ThreadSafePrincipalHolder* mPrincipal;
+};
+
// DOM Traversal.
uint32_t Gecko_ChildrenCount(RawGeckoNodeBorrowed node);
bool Gecko_NodeIsElement(RawGeckoNodeBorrowed node);
bool Gecko_IsInDocument(RawGeckoNodeBorrowed node);
bool Gecko_FlattenedTreeParentIsParent(RawGeckoNodeBorrowed node);
RawGeckoNodeBorrowedOrNull Gecko_GetParentNode(RawGeckoNodeBorrowed node);
RawGeckoNodeBorrowedOrNull Gecko_GetFirstChild(RawGeckoNodeBorrowed node);
RawGeckoNodeBorrowedOrNull Gecko_GetLastChild(RawGeckoNodeBorrowed node);
@@ -201,38 +215,31 @@ nsStyleGradient* Gecko_CreateGradient(ui
uint8_t size,
bool repeating,
bool legacy_syntax,
uint32_t stops);
// list-style-image style.
void Gecko_SetListStyleImageNone(nsStyleList* style_struct);
void Gecko_SetListStyleImage(nsStyleList* style_struct,
- const uint8_t* string_bytes, uint32_t string_length,
- ThreadSafeURIHolder* base_uri,
- ThreadSafeURIHolder* referrer,
- ThreadSafePrincipalHolder* principal);
+ ServoBundledURI uri);
void Gecko_CopyListStyleImageFrom(nsStyleList* dest, const nsStyleList* src);
// cursor style.
void Gecko_SetCursorArrayLength(nsStyleUserInterface* ui, size_t len);
void Gecko_SetCursorImage(nsCursorImage* cursor,
const uint8_t* string_bytes, uint32_t string_length,
ThreadSafeURIHolder* base_uri,
ThreadSafeURIHolder* referrer,
ThreadSafePrincipalHolder* principal);
void Gecko_CopyCursorArrayFrom(nsStyleUserInterface* dest,
const nsStyleUserInterface* src);
// Display style.
-void Gecko_SetMozBinding(nsStyleDisplay* style_struct,
- const uint8_t* string_bytes, uint32_t string_length,
- ThreadSafeURIHolder* base_uri,
- ThreadSafeURIHolder* referrer,
- ThreadSafePrincipalHolder* principal);
+void Gecko_SetMozBinding(nsStyleDisplay* style_struct, ServoBundledURI bundled_uri);
void Gecko_CopyMozBindingFrom(nsStyleDisplay* des, const nsStyleDisplay* src);
// Dirtiness tracking.
uint32_t Gecko_GetNodeFlags(RawGeckoNodeBorrowed node);
void Gecko_SetNodeFlags(RawGeckoNodeBorrowed node, uint32_t flags);
void Gecko_UnsetNodeFlags(RawGeckoNodeBorrowed node, uint32_t flags);
void Gecko_SetOwnerDocumentNeedsStyleFlush(RawGeckoElementBorrowed element);