Bug 1297963 - Part 1: Preserve base URI on URLValueData objects. r=emilio

MozReview-Commit-ID: EqdYVp9JPsW
This commit is contained in:
Cameron McCormack 2016-08-29 18:17:26 +08:00
parent 27632ea465
commit d3c7ea79a6
5 changed files with 41 additions and 20 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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();
} }

View file

@ -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)))
{ {

View file

@ -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;