diff --git a/netwerk/base/nsNetUtil.cpp b/netwerk/base/nsNetUtil.cpp index 8acb066a3f92..a814329f9ef0 100644 --- a/netwerk/base/nsNetUtil.cpp +++ b/netwerk/base/nsNetUtil.cpp @@ -3476,6 +3476,14 @@ void LinkHeader::Reset() { mCrossOrigin.SetIsVoid(true); } +bool LinkHeader::operator==(const LinkHeader& rhs) const { + return mHref == rhs.mHref && mRel == rhs.mRel && mTitle == rhs.mTitle && + mIntegrity == rhs.mIntegrity && mSrcset == rhs.mSrcset && + mSizes == rhs.mSizes && mType == rhs.mType && mMedia == rhs.mMedia && + mAnchor == rhs.mAnchor && mCrossOrigin == rhs.mCrossOrigin && + mReferrerPolicy == rhs.mReferrerPolicy && mAs == rhs.mAs; +} + nsTArray ParseLinkHeader(const nsAString& aLinkData) { nsTArray linkHeaders; diff --git a/netwerk/base/nsNetUtil.h b/netwerk/base/nsNetUtil.h index 20b79a83eafe..c81f66803547 100644 --- a/netwerk/base/nsNetUtil.h +++ b/netwerk/base/nsNetUtil.h @@ -1022,6 +1022,7 @@ struct LinkHeader { LinkHeader(); void Reset(); + bool operator==(const LinkHeader& rhs) const; }; nsTArray ParseLinkHeader(const nsAString& aLinkData); diff --git a/netwerk/test/gtest/TestLinkHeader.cpp b/netwerk/test/gtest/TestLinkHeader.cpp index ba021aa37d91..5b09378b74fd 100644 --- a/netwerk/test/gtest/TestLinkHeader.cpp +++ b/netwerk/test/gtest/TestLinkHeader.cpp @@ -7,6 +7,73 @@ #include "nsNetUtil.h" +LinkHeader LinkHeaderSetAll(nsAString const& v) { + LinkHeader l; + l.mHref = v; + l.mRel = v; + l.mTitle = v; + l.mIntegrity = v; + l.mSrcset = v; + l.mSizes = v; + l.mType = v; + l.mMedia = v; + l.mAnchor = v; + l.mCrossOrigin = v; + l.mReferrerPolicy = v; + l.mAs = v; + return l; +} + +LinkHeader LinkHeaderSetTitle(nsAString const& v) { + LinkHeader l; + l.mHref = v; + l.mRel = v; + l.mTitle = v; + return l; +} + +LinkHeader LinkHeaderSetMinimum(nsAString const& v) { + LinkHeader l; + l.mHref = v; + l.mRel = v; + return l; +} + +TEST(TestLinkHeader, MultipleLinkHeaders) +{ + nsString link = + u"; rel=a; title=a; integrity=a; imagesrcset=a; imagesizes=a; type=a; media=a; anchor=a; crossorigin=a; referrerpolicy=a; as=a,"_ns + u"; rel=b; title=b; integrity=b; imagesrcset=b; imagesizes=b; type=b; media=b; anchor=b; crossorigin=b; referrerpolicy=b; as=b,"_ns + u"; rel=c"_ns; + + nsTArray linkHeaders = ParseLinkHeader(link); + + nsTArray expected; + expected.AppendElement(LinkHeaderSetAll(u"a"_ns)); + expected.AppendElement(LinkHeaderSetAll(u"b"_ns)); + expected.AppendElement(LinkHeaderSetMinimum(u"c"_ns)); + + ASSERT_EQ(linkHeaders, expected); +} + +// title* has to be tested separately +TEST(TestLinkHeader, MultipleLinkHeadersTitleStar) +{ + nsString link = + u"; rel=d; title*=UTF-8'de'd,"_ns + u"; rel=e; title*=UTF-8'de'e; title=g,"_ns + u"; rel=f"_ns; + + nsTArray linkHeaders = ParseLinkHeader(link); + + nsTArray expected; + expected.AppendElement(LinkHeaderSetTitle(u"d"_ns)); + expected.AppendElement(LinkHeaderSetTitle(u"e"_ns)); + expected.AppendElement(LinkHeaderSetMinimum(u"f"_ns)); + + ASSERT_EQ(linkHeaders, expected); +} + struct SimpleParseTestData { nsString link; bool valid;