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