forked from mirrors/gecko-dev
Bug 1297963 - Part 1: Preserve base URI on URLValueData objects. r=emilio
MozReview-Commit-ID: Amjz1AcdxwN
This commit is contained in:
parent
02ca29d0d1
commit
a95bd0ceec
5 changed files with 42 additions and 21 deletions
|
|
@ -1734,9 +1734,9 @@ nsAttrValue::LoadImage(nsIDocument* aDocument)
|
|||
|
||||
MiscContainer* cont = GetMiscContainer();
|
||||
mozilla::css::URLValue* url = cont->mValue.mURL;
|
||||
mozilla::css::ImageValue* image =
|
||||
new css::ImageValue(url->GetURI(), url->mString, url->mReferrer,
|
||||
url->mOriginPrincipal, aDocument);
|
||||
mozilla::css::ImageValue* image =
|
||||
new css::ImageValue(url->GetURI(), url->mString, url->mBaseURI,
|
||||
url->mReferrer, url->mOriginPrincipal, aDocument);
|
||||
|
||||
NS_ADDREF(image);
|
||||
cont->mValue.mImage = image;
|
||||
|
|
|
|||
|
|
@ -981,7 +981,7 @@ nsGenericHTMLElement::ParseBackgroundAttribute(int32_t aNamespaceID,
|
|||
}
|
||||
|
||||
mozilla::css::URLValue *url =
|
||||
new mozilla::css::URLValue(uri, buffer, doc->GetDocumentURI(),
|
||||
new mozilla::css::URLValue(uri, buffer, baseURI, doc->GetDocumentURI(),
|
||||
NodePrincipal());
|
||||
aResult.SetTo(url, &aValue);
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -291,9 +291,13 @@ FragmentOrURLToURLValue(FragmentOrURL* aUrl, nsIDocument* aDoc)
|
|||
nsString path;
|
||||
aUrl->GetSourceString(path);
|
||||
RefPtr<nsStringBuffer> uriStringBuffer = nsCSSValue::BufferFromString(path);
|
||||
// XXXheycam We should store URLValue objects inside FragmentOrURLs so that
|
||||
// we can extract the original base URI, referrer and principal to pass in
|
||||
// here.
|
||||
RefPtr<mozilla::css::URLValue> result =
|
||||
new mozilla::css::URLValue(aUrl->GetSourceURL(), uriStringBuffer,
|
||||
aDoc->GetDocumentURI(), aDoc->NodePrincipal());
|
||||
aUrl->GetSourceURL(), aDoc->GetDocumentURI(),
|
||||
aDoc->NodePrincipal());
|
||||
|
||||
return result.forget();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -761,6 +761,7 @@ void nsCSSValue::StartImageLoad(nsIDocument* aDocument) const
|
|||
mozilla::css::ImageValue* image =
|
||||
new mozilla::css::ImageValue(mValue.mURL->GetURI(),
|
||||
mValue.mURL->mString,
|
||||
mValue.mURL->mBaseURI,
|
||||
mValue.mURL->mReferrer,
|
||||
mValue.mURL->mOriginPrincipal,
|
||||
aDocument);
|
||||
|
|
@ -2592,17 +2593,21 @@ nsCSSValue::Array::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) cons
|
|||
|
||||
css::URLValueData::URLValueData(already_AddRefed<PtrHolder<nsIURI>> aURI,
|
||||
nsStringBuffer* aString,
|
||||
already_AddRefed<PtrHolder<nsIURI>> aBaseURI,
|
||||
already_AddRefed<PtrHolder<nsIURI>> aReferrer,
|
||||
already_AddRefed<PtrHolder<nsIPrincipal>>
|
||||
aOriginPrincipal)
|
||||
: mURI(Move(aURI))
|
||||
, mBaseURI(Move(aBaseURI))
|
||||
, mString(aString)
|
||||
, mReferrer(Move(aReferrer))
|
||||
, mOriginPrincipal(Move(aOriginPrincipal))
|
||||
, mURIResolved(true)
|
||||
, mLocalURLFlag(IsLocalRefURL(aString))
|
||||
{
|
||||
MOZ_ASSERT(mOriginPrincipal, "Must have an origin principal");
|
||||
MOZ_ASSERT(mString);
|
||||
MOZ_ASSERT(mBaseURI);
|
||||
MOZ_ASSERT(mOriginPrincipal);
|
||||
}
|
||||
|
||||
css::URLValueData::URLValueData(nsStringBuffer* aString,
|
||||
|
|
@ -2610,14 +2615,16 @@ css::URLValueData::URLValueData(nsStringBuffer* aString,
|
|||
already_AddRefed<PtrHolder<nsIURI>> aReferrer,
|
||||
already_AddRefed<PtrHolder<nsIPrincipal>>
|
||||
aOriginPrincipal)
|
||||
: mURI(Move(aBaseURI))
|
||||
: mBaseURI(Move(aBaseURI))
|
||||
, mString(aString)
|
||||
, mReferrer(Move(aReferrer))
|
||||
, mOriginPrincipal(Move(aOriginPrincipal))
|
||||
, mURIResolved(false)
|
||||
, mLocalURLFlag(IsLocalRefURL(aString))
|
||||
{
|
||||
MOZ_ASSERT(mOriginPrincipal, "Must have an origin principal");
|
||||
MOZ_ASSERT(aString);
|
||||
MOZ_ASSERT(mBaseURI);
|
||||
MOZ_ASSERT(mOriginPrincipal);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
@ -2633,6 +2640,9 @@ css::URLValueData::operator==(const URLValueData& aOther) const
|
|||
(mURI && aOther.mURI &&
|
||||
NS_SUCCEEDED(mURI->Equals(aOther.mURI, &eq)) &&
|
||||
eq)) &&
|
||||
(mBaseURI == aOther.mBaseURI ||
|
||||
(NS_SUCCEEDED(self.mBaseURI.get()->Equals(other.mBaseURI.get(), &eq)) &&
|
||||
eq)) &&
|
||||
(mOriginPrincipal == aOther.mOriginPrincipal ||
|
||||
self.mOriginPrincipal.get()->Equals(other.mOriginPrincipal.get())) &&
|
||||
mLocalURLFlag == aOther.mLocalURLFlag;
|
||||
|
|
@ -2671,14 +2681,16 @@ css::URLValueData::URIEquals(const URLValueData& aOther) const
|
|||
nsIURI*
|
||||
css::URLValueData::GetURI() const
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
if (!mURIResolved) {
|
||||
mURIResolved = true;
|
||||
// Be careful to not null out mURI before we've passed it as the base URI
|
||||
MOZ_ASSERT(!mURI);
|
||||
nsCOMPtr<nsIURI> newURI;
|
||||
NS_NewURI(getter_AddRefs(newURI),
|
||||
NS_ConvertUTF16toUTF8(nsCSSValue::GetBufferValue(mString)),
|
||||
nullptr, mURI);
|
||||
nullptr, const_cast<nsIURI*>(mBaseURI.get()));
|
||||
mURI = new PtrHolder<nsIURI>(newURI.forget());
|
||||
mURIResolved = true;
|
||||
}
|
||||
|
||||
return mURI;
|
||||
|
|
@ -2708,10 +2720,11 @@ URLValue::URLValue(nsStringBuffer* aString, nsIURI* aBaseURI, nsIURI* aReferrer,
|
|||
MOZ_ASSERT(NS_IsMainThread());
|
||||
}
|
||||
|
||||
URLValue::URLValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aReferrer,
|
||||
nsIPrincipal* aOriginPrincipal)
|
||||
URLValue::URLValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aBaseURI,
|
||||
nsIURI* aReferrer, nsIPrincipal* aOriginPrincipal)
|
||||
: URLValueData(do_AddRef(new PtrHolder<nsIURI>(aURI)),
|
||||
aString,
|
||||
do_AddRef(new PtrHolder<nsIURI>(aBaseURI)),
|
||||
do_AddRef(new PtrHolder<nsIURI>(aReferrer)),
|
||||
do_AddRef(new PtrHolder<nsIPrincipal>(aOriginPrincipal)))
|
||||
{
|
||||
|
|
@ -2731,10 +2744,12 @@ css::URLValue::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
|
|||
}
|
||||
|
||||
css::ImageValue::ImageValue(nsIURI* aURI, nsStringBuffer* aString,
|
||||
nsIURI* aReferrer, nsIPrincipal* aOriginPrincipal,
|
||||
nsIURI* aBaseURI, nsIURI* aReferrer,
|
||||
nsIPrincipal* aOriginPrincipal,
|
||||
nsIDocument* aDocument)
|
||||
: URLValueData(do_AddRef(new PtrHolder<nsIURI>(aURI)),
|
||||
aString,
|
||||
do_AddRef(new PtrHolder<nsIURI>(aBaseURI, false)),
|
||||
do_AddRef(new PtrHolder<nsIURI>(aReferrer)),
|
||||
do_AddRef(new PtrHolder<nsIPrincipal>(aOriginPrincipal)))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ struct URLValueData
|
|||
// Construct with the actual URI.
|
||||
URLValueData(already_AddRefed<PtrHolder<nsIURI>> aURI,
|
||||
nsStringBuffer* aString,
|
||||
already_AddRefed<PtrHolder<nsIURI>> aBaseURI,
|
||||
already_AddRefed<PtrHolder<nsIURI>> aReferrer,
|
||||
already_AddRefed<PtrHolder<nsIPrincipal>> aOriginPrincipal);
|
||||
|
||||
|
|
@ -128,11 +129,11 @@ struct URLValueData
|
|||
bool GetLocalURLFlag() const { return mLocalURLFlag; }
|
||||
|
||||
private:
|
||||
// If mURIResolved is false, mURI stores the base URI.
|
||||
// If mURIResolved is true, mURI stores the URI we resolve to; this may be
|
||||
// null if the URI is invalid.
|
||||
// mURI stores the lazily resolved URI. This may be null if the URI is
|
||||
// invalid, even once resolved.
|
||||
mutable PtrHandle<nsIURI> mURI;
|
||||
public:
|
||||
PtrHandle<nsIURI> mBaseURI;
|
||||
RefPtr<nsStringBuffer> mString;
|
||||
PtrHandle<nsIURI> mReferrer;
|
||||
PtrHandle<nsIPrincipal> mOriginPrincipal;
|
||||
|
|
@ -151,8 +152,8 @@ struct URLValue : public URLValueData
|
|||
// These two constructors are safe to call only on the main thread.
|
||||
URLValue(nsStringBuffer* aString, nsIURI* aBaseURI, nsIURI* aReferrer,
|
||||
nsIPrincipal* aOriginPrincipal);
|
||||
URLValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aReferrer,
|
||||
nsIPrincipal* aOriginPrincipal);
|
||||
URLValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aBaseURI,
|
||||
nsIURI* aReferrer, nsIPrincipal* aOriginPrincipal);
|
||||
|
||||
// This constructor is safe to call from any thread.
|
||||
URLValue(nsStringBuffer* aString,
|
||||
|
|
@ -182,8 +183,9 @@ struct ImageValue : public URLValueData
|
|||
// aString must not be null.
|
||||
//
|
||||
// This constructor is only safe to call from the main thread.
|
||||
ImageValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aReferrer,
|
||||
nsIPrincipal* aOriginPrincipal, nsIDocument* aDocument);
|
||||
ImageValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aBaseURI,
|
||||
nsIURI* aReferrer, nsIPrincipal* aOriginPrincipal,
|
||||
nsIDocument* aDocument);
|
||||
|
||||
ImageValue(const ImageValue&) = delete;
|
||||
ImageValue& operator=(const ImageValue&) = delete;
|
||||
|
|
|
|||
Loading…
Reference in a new issue