Bug 1356060 - Just use nsString in URLValueData. r=heycam

This switches over from using nsStringBuffer to nsString for URLValueData's
|mString| member. This avoids various tedious conversions and can provide
potential performance improvements by avoiding length calculations.

MozReview-Commit-ID: 5eRifUZrAso
This commit is contained in:
Eric Rahm 2017-04-13 15:18:25 -07:00
Родитель 678a2ca3dc
Коммит 152fcf01fe
8 изменённых файлов: 40 добавлений и 66 удалений

Просмотреть файл

@ -1675,17 +1675,12 @@ nsAttrValue::LoadImage(nsIDocument* aDocument)
{
NS_ASSERTION(Type() == eURL, "wrong type");
#ifdef DEBUG
{
nsString val;
ToString(val);
NS_ASSERTION(!val.IsEmpty(),
"How did we end up with an empty string for eURL");
}
#endif
MiscContainer* cont = GetMiscContainer();
mozilla::css::URLValue* url = cont->mValue.mURL;
NS_ASSERTION(!url->mString.IsEmpty(),
"How did we end up with an empty string for eURL");
mozilla::css::ImageValue* image =
new css::ImageValue(url->GetURI(), url->mString,
do_AddRef(url->mExtraData), aDocument);

Просмотреть файл

@ -962,14 +962,8 @@ nsGenericHTMLElement::ParseBackgroundAttribute(int32_t aNamespaceID,
return false;
}
nsString value(aValue);
RefPtr<nsStringBuffer> buffer = nsCSSValue::BufferFromString(value);
if (MOZ_UNLIKELY(!buffer)) {
return false;
}
mozilla::css::URLValue *url =
new mozilla::css::URLValue(uri, buffer, baseURI, doc->GetDocumentURI(),
new mozilla::css::URLValue(uri, aValue, baseURI, doc->GetDocumentURI(),
NodePrincipal());
aResult.SetTo(url, &aValue);
return true;

Просмотреть файл

@ -967,14 +967,11 @@ ServoBundledURI::IntoCssUrl()
MOZ_ASSERT(mExtraData->GetReferrer());
MOZ_ASSERT(mExtraData->GetPrincipal());
nsString url;
nsDependentCSubstring urlString(reinterpret_cast<const char*>(mURLString),
mURLStringLength);
AppendUTF8toUTF16(urlString, url);
RefPtr<nsStringBuffer> urlBuffer = nsCSSValue::BufferFromString(url);
NS_ConvertUTF8toUTF16 url(reinterpret_cast<const char*>(mURLString),
mURLStringLength);
RefPtr<css::URLValue> urlValue =
new css::URLValue(urlBuffer, do_AddRef(mExtraData));
new css::URLValue(url, do_AddRef(mExtraData));
return urlValue.forget();
}
@ -1000,14 +997,11 @@ CreateStyleImageRequest(nsStyleImageRequest::Mode aModeFlags,
MOZ_ASSERT(aURI.mExtraData->GetReferrer());
MOZ_ASSERT(aURI.mExtraData->GetPrincipal());
nsString url;
nsDependentCSubstring urlString(reinterpret_cast<const char*>(aURI.mURLString),
aURI.mURLStringLength);
AppendUTF8toUTF16(urlString, url);
RefPtr<nsStringBuffer> urlBuffer = nsCSSValue::BufferFromString(url);
NS_ConvertUTF8toUTF16 url(reinterpret_cast<const char*>(aURI.mURLString),
aURI.mURLStringLength);
RefPtr<nsStyleImageRequest> req =
new nsStyleImageRequest(aModeFlags, urlBuffer, do_AddRef(aURI.mExtraData));
new nsStyleImageRequest(aModeFlags, url, do_AddRef(aURI.mExtraData));
return req.forget();
}

Просмотреть файл

@ -8192,11 +8192,9 @@ CSSParserImpl::SetValueToURL(nsCSSValue& aValue, const nsString& aURL)
return false;
}
RefPtr<nsStringBuffer> buffer(nsCSSValue::BufferFromString(aURL));
// Note: urlVal retains its own reference to |buffer|.
mozilla::css::URLValue *urlVal =
new mozilla::css::URLValue(buffer, mBaseURI, mSheetURI, mSheetPrincipal);
new mozilla::css::URLValue(aURL, mBaseURI, mSheetURI, mSheetPrincipal);
aValue.SetURLValue(urlVal);
return true;
}

Просмотреть файл

@ -30,10 +30,10 @@ using namespace mozilla;
using namespace mozilla::css;
static bool
IsLocalRefURL(nsStringBuffer* aString)
IsLocalRefURL(const nsString& aString)
{
// Find the first non-"C0 controls + space" character.
char16_t* current = static_cast<char16_t*>(aString->Data());
const char16_t* current = aString.get();
for (; *current != '\0'; current++) {
if (*current > 0x20) {
// if the first non-"C0 controls + space" character is '#', this is a
@ -46,9 +46,9 @@ IsLocalRefURL(nsStringBuffer* aString)
}
static bool
MightHaveRef(nsStringBuffer* aString)
MightHaveRef(const nsString& aString)
{
char16_t* current = static_cast<char16_t*>(aString->Data());
const char16_t* current = aString.get();
for (; *current != '\0'; current++) {
if (*current == '#') {
return true;
@ -2795,25 +2795,23 @@ nsCSSValue::Array::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) cons
}
css::URLValueData::URLValueData(already_AddRefed<PtrHolder<nsIURI>> aURI,
nsStringBuffer* aString,
const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData)
: mURI(Move(aURI))
, mString(aString)
, mExtraData(Move(aExtraData))
, mURIResolved(true)
{
MOZ_ASSERT(mString);
MOZ_ASSERT(mExtraData);
MOZ_ASSERT(mExtraData->GetPrincipal());
}
css::URLValueData::URLValueData(nsStringBuffer* aString,
css::URLValueData::URLValueData(const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData)
: mString(aString)
, mExtraData(Move(aExtraData))
, mURIResolved(false)
{
MOZ_ASSERT(aString);
MOZ_ASSERT(mExtraData);
MOZ_ASSERT(mExtraData->GetPrincipal());
}
@ -2824,11 +2822,9 @@ css::URLValueData::Equals(const URLValueData& aOther) const
MOZ_ASSERT(NS_IsMainThread());
bool eq;
// Cast away const so we can call nsIPrincipal::Equals.
const URLExtraData* self = mExtraData;
const URLExtraData* other = aOther.mExtraData;
return NS_strcmp(nsCSSValue::GetBufferValue(mString),
nsCSSValue::GetBufferValue(aOther.mString)) == 0 &&
return mString == aOther.mString &&
(GetURI() == aOther.GetURI() || // handles null == null
(mURI && aOther.mURI &&
NS_SUCCEEDED(mURI->Equals(aOther.mURI, &eq)) &&
@ -2845,9 +2841,7 @@ bool
css::URLValueData::DefinitelyEqualURIs(const URLValueData& aOther) const
{
return mExtraData->BaseURI() == aOther.mExtraData->BaseURI() &&
(mString == aOther.mString ||
NS_strcmp(nsCSSValue::GetBufferValue(mString),
nsCSSValue::GetBufferValue(aOther.mString)) == 0);
(mString == aOther.mString);
}
bool
@ -2867,7 +2861,7 @@ css::URLValueData::GetURI() const
MOZ_ASSERT(!mURI);
nsCOMPtr<nsIURI> newURI;
NS_NewURI(getter_AddRefs(newURI),
NS_ConvertUTF16toUTF8(nsCSSValue::GetBufferValue(mString)),
NS_ConvertUTF16toUTF8(mString),
nullptr, mExtraData->BaseURI());
mURI = new PtrHolder<nsIURI>(newURI.forget());
mURIResolved = true;
@ -2987,7 +2981,7 @@ size_t
css::URLValueData::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t n = 0;
n += mString->SizeOfIncludingThisIfUnshared(aMallocSizeOf);
n += mString.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
// Measurement of the following members may be added later if DMD finds it
// is worthwhile:
@ -2996,7 +2990,7 @@ css::URLValueData::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) cons
return n;
}
URLValue::URLValue(nsStringBuffer* aString, nsIURI* aBaseURI, nsIURI* aReferrer,
URLValue::URLValue(const nsAString& aString, nsIURI* aBaseURI, nsIURI* aReferrer,
nsIPrincipal* aOriginPrincipal)
: URLValueData(aString, do_AddRef(new URLExtraData(aBaseURI, aReferrer,
aOriginPrincipal)))
@ -3004,7 +2998,7 @@ URLValue::URLValue(nsStringBuffer* aString, nsIURI* aBaseURI, nsIURI* aReferrer,
MOZ_ASSERT(NS_IsMainThread());
}
URLValue::URLValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aBaseURI,
URLValue::URLValue(nsIURI* aURI, const nsAString& aString, nsIURI* aBaseURI,
nsIURI* aReferrer, nsIPrincipal* aOriginPrincipal)
: URLValueData(do_AddRef(new PtrHolder<nsIURI>(aURI)),
aString,
@ -3026,7 +3020,7 @@ css::URLValue::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
return n;
}
css::ImageValue::ImageValue(nsIURI* aURI, nsStringBuffer* aString,
css::ImageValue::ImageValue(nsIURI* aURI, const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData,
nsIDocument* aDocument)
: URLValueData(do_AddRef(new PtrHolder<nsIURI>(aURI)),
@ -3035,7 +3029,7 @@ css::ImageValue::ImageValue(nsIURI* aURI, nsStringBuffer* aString,
Initialize(aDocument);
}
css::ImageValue::ImageValue(nsStringBuffer* aString,
css::ImageValue::ImageValue(const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData)
: URLValueData(aString, Move(aExtraData))
{

Просмотреть файл

@ -102,11 +102,11 @@ protected:
// For both constructors principal of aExtraData must not be null.
// Construct with a base URI; this will create the actual URI lazily from
// aString and aExtraData.
URLValueData(nsStringBuffer* aString,
URLValueData(const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData);
// Construct with the actual URI.
URLValueData(already_AddRefed<PtrHolder<nsIURI>> aURI,
nsStringBuffer* aString,
const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData);
public:
@ -161,7 +161,7 @@ private:
// invalid, even once resolved.
mutable PtrHandle<nsIURI> mURI;
public:
RefPtr<nsStringBuffer> mString;
nsString mString;
RefPtr<URLExtraData> mExtraData;
private:
mutable bool mURIResolved;
@ -182,13 +182,13 @@ private:
struct URLValue final : public URLValueData
{
// These two constructors are safe to call only on the main thread.
URLValue(nsStringBuffer* aString, nsIURI* aBaseURI, nsIURI* aReferrer,
URLValue(const nsAString& aString, nsIURI* aBaseURI, nsIURI* aReferrer,
nsIPrincipal* aOriginPrincipal);
URLValue(nsIURI* aURI, nsStringBuffer* aString, nsIURI* aBaseURI,
URLValue(nsIURI* aURI, const nsAString& aString, nsIURI* aBaseURI,
nsIURI* aReferrer, nsIPrincipal* aOriginPrincipal);
// This constructor is safe to call from any thread.
URLValue(nsStringBuffer* aString,
URLValue(const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData)
: URLValueData(aString, Move(aExtraData)) {}
@ -203,16 +203,15 @@ struct ImageValue final : public URLValueData
// Not making the constructor and destructor inline because that would
// force us to include imgIRequest.h, which leads to REQUIRES hell, since
// this header is included all over.
// aString must not be null.
//
// This constructor is only safe to call from the main thread.
ImageValue(nsIURI* aURI, nsStringBuffer* aString,
ImageValue(nsIURI* aURI, const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData,
nsIDocument* aDocument);
// This constructor is safe to call from any thread, but Initialize
// must be called later for the object to be useful.
ImageValue(nsStringBuffer* aString,
ImageValue(const nsAString& aString,
already_AddRefed<URLExtraData> aExtraData);
ImageValue(const ImageValue&) = delete;
@ -856,9 +855,9 @@ public:
{
MOZ_ASSERT(mUnit == eCSSUnit_URL || mUnit == eCSSUnit_Image,
"not a URL value");
return GetBufferValue(mUnit == eCSSUnit_URL ?
mValue.mURL->mString :
mValue.mImage->mString);
return mUnit == eCSSUnit_URL ?
mValue.mURL->mString.get() :
mValue.mImage->mString.get();
}
// Not making this inline because that would force us to include

Просмотреть файл

@ -1991,9 +1991,9 @@ nsStyleImageRequest::nsStyleImageRequest(Mode aModeFlags,
nsStyleImageRequest::nsStyleImageRequest(
Mode aModeFlags,
nsStringBuffer* aURLBuffer,
const nsAString& aURL,
already_AddRefed<URLExtraData> aExtraData)
: mImageValue(new css::ImageValue(aURLBuffer, Move(aExtraData)))
: mImageValue(new css::ImageValue(aURL, Move(aExtraData)))
, mModeFlags(aModeFlags)
, mResolved(false)
{

Просмотреть файл

@ -340,7 +340,7 @@ public:
// on the main thread before get() can be used.
nsStyleImageRequest(
Mode aModeFlags,
nsStringBuffer* aURLBuffer,
const nsAString& aURL,
already_AddRefed<mozilla::URLExtraData> aExtraData);
bool Resolve(nsPresContext* aPresContext);