WebKit Bugzilla
Attachment 357054 Details for
Bug 192592
: Resource Load Statistics: Use common implementation within NetworkStorageSession
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-192592.diff (text/plain), 20.92 KB, created by
Don Olmstead
on 2018-12-11 09:20:04 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Don Olmstead
Created:
2018-12-11 09:20:04 PST
Size:
20.92 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 6bc33384e05..20ba0549736 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,49 @@ >+2018-12-11 Don Olmstead <don.olmstead@sony.com> >+ >+ Resource Load Statistics: Use common implementation within NetworkStorageSession >+ https://bugs.webkit.org/show_bug.cgi?id=192592 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ There's nothing within the resource load statistics implementation contained >+ in NetworkStorageSessionCFNet that was CF specific. All of the resource load >+ statistics methods are moved from that file to the root NetworkStorageSession >+ implementation. >+ >+ * platform/network/NetworkStorageSession.cpp: >+ (WebCore::getPartitioningDomain): >+ (WebCore::NetworkStorageSession::shouldBlockThirdPartyCookies const): >+ (WebCore::NetworkStorageSession::shouldBlockCookies const): >+ (WebCore::NetworkStorageSession::maxAgeCacheCap): >+ (WebCore::NetworkStorageSession::setAgeCapForClientSideCookies): >+ (WebCore::NetworkStorageSession::setPrevalentDomainsToBlockCookiesFor): >+ (WebCore::NetworkStorageSession::removePrevalentDomains): >+ (WebCore::NetworkStorageSession::hasStorageAccess const): >+ (WebCore::NetworkStorageSession::getAllStorageAccessEntries const): >+ (WebCore::NetworkStorageSession::grantStorageAccess): >+ (WebCore::NetworkStorageSession::removeStorageAccessForFrame): >+ (WebCore::NetworkStorageSession::removeStorageAccessForAllFramesOnPage): >+ (WebCore::NetworkStorageSession::removeAllStorageAccess): >+ (WebCore::NetworkStorageSession::setCacheMaxAgeCapForPrevalentResources): >+ (WebCore::NetworkStorageSession::resetCacheMaxAgeCapForPrevalentResources): >+ * platform/network/NetworkStorageSession.h: >+ * platform/network/cf/NetworkStorageSessionCFNet.cpp: >+ (WebCore::getPartitioningDomain): Deleted. >+ (WebCore::NetworkStorageSession::shouldBlockThirdPartyCookies const): Deleted. >+ (WebCore::NetworkStorageSession::shouldBlockCookies const): Deleted. >+ (WebCore::NetworkStorageSession::maxAgeCacheCap): Deleted. >+ (WebCore::NetworkStorageSession::setAgeCapForClientSideCookies): Deleted. >+ (WebCore::NetworkStorageSession::setPrevalentDomainsToBlockCookiesFor): Deleted. >+ (WebCore::NetworkStorageSession::removePrevalentDomains): Deleted. >+ (WebCore::NetworkStorageSession::hasStorageAccess const): Deleted. >+ (WebCore::NetworkStorageSession::getAllStorageAccessEntries const): Deleted. >+ (WebCore::NetworkStorageSession::grantStorageAccess): Deleted. >+ (WebCore::NetworkStorageSession::removeStorageAccessForFrame): Deleted. >+ (WebCore::NetworkStorageSession::removeStorageAccessForAllFramesOnPage): Deleted. >+ (WebCore::NetworkStorageSession::removeAllStorageAccess): Deleted. >+ (WebCore::NetworkStorageSession::setCacheMaxAgeCapForPrevalentResources): Deleted. >+ (WebCore::NetworkStorageSession::resetCacheMaxAgeCapForPrevalentResources): Deleted. >+ > 2018-12-10 Brent Fulgham <bfulgham@apple.com> > > SVGViewSpec objects should mark relevant SVG elements >diff --git a/Source/WebCore/platform/network/NetworkStorageSession.cpp b/Source/WebCore/platform/network/NetworkStorageSession.cpp >index 03307a60541..b999e7e3b51 100644 >--- a/Source/WebCore/platform/network/NetworkStorageSession.cpp >+++ b/Source/WebCore/platform/network/NetworkStorageSession.cpp >@@ -26,10 +26,15 @@ > #include "config.h" > #include "NetworkStorageSession.h" > >+#include "ResourceRequest.h" > #include <pal/SessionID.h> > #include <wtf/NeverDestroyed.h> > #include <wtf/ProcessPrivilege.h> > >+#if ENABLE(PUBLIC_SUFFIX_LIST) >+#include "PublicSuffix.h" >+#endif >+ > namespace WebCore { > > bool NetworkStorageSession::m_processMayUseCookieAPI = false; >@@ -74,4 +79,173 @@ void NetworkStorageSession::permitProcessToUseCookieAPI(bool value) > removeProcessPrivilege(ProcessPrivilege::CanAccessRawCookies); > } > >+#if ENABLE(RESOURCE_LOAD_STATISTICS) >+ >+static inline String getPartitioningDomain(const URL& url) >+{ >+#if ENABLE(PUBLIC_SUFFIX_LIST) >+ auto domain = topPrivatelyControlledDomain(url.host().toString()); >+ if (domain.isEmpty()) >+ domain = url.host().toString(); >+#else >+ auto domain = url.host().toString(); >+#endif >+ return domain; >+} >+ >+bool NetworkStorageSession::shouldBlockThirdPartyCookies(const String& topPrivatelyControlledDomain) const >+{ >+ if (topPrivatelyControlledDomain.isEmpty()) >+ return false; >+ >+ return m_topPrivatelyControlledDomainsToBlock.contains(topPrivatelyControlledDomain); >+} >+ >+bool NetworkStorageSession::shouldBlockCookies(const ResourceRequest& request, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const >+{ >+ return shouldBlockCookies(request.firstPartyForCookies(), request.url(), frameID, pageID); >+} >+ >+bool NetworkStorageSession::shouldBlockCookies(const URL& firstPartyForCookies, const URL& resource, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const >+{ >+ auto firstPartyDomain = getPartitioningDomain(firstPartyForCookies); >+ if (firstPartyDomain.isEmpty()) >+ return false; >+ >+ auto resourceDomain = getPartitioningDomain(resource); >+ if (resourceDomain.isEmpty()) >+ return false; >+ >+ if (firstPartyDomain == resourceDomain) >+ return false; >+ >+ if (pageID && hasStorageAccess(resourceDomain, firstPartyDomain, frameID, pageID.value())) >+ return false; >+ >+ return shouldBlockThirdPartyCookies(resourceDomain); >+} >+ >+std::optional<Seconds> NetworkStorageSession::maxAgeCacheCap(const ResourceRequest& request) >+{ >+ if (m_cacheMaxAgeCapForPrevalentResources && shouldBlockCookies(request, std::nullopt, std::nullopt)) >+ return m_cacheMaxAgeCapForPrevalentResources; >+ return std::nullopt; >+} >+ >+void NetworkStorageSession::setAgeCapForClientSideCookies(std::optional<Seconds> seconds) >+{ >+ m_ageCapForClientSideCookies = seconds; >+} >+ >+void NetworkStorageSession::setPrevalentDomainsToBlockCookiesFor(const Vector<String>& domains) >+{ >+ m_topPrivatelyControlledDomainsToBlock.clear(); >+ m_topPrivatelyControlledDomainsToBlock.add(domains.begin(), domains.end()); >+} >+ >+void NetworkStorageSession::removePrevalentDomains(const Vector<String>& domains) >+{ >+ for (auto& domain : domains) >+ m_topPrivatelyControlledDomainsToBlock.remove(domain); >+} >+ >+bool NetworkStorageSession::hasStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID) const >+{ >+ if (frameID) { >+ auto framesGrantedIterator = m_framesGrantedStorageAccess.find(pageID); >+ if (framesGrantedIterator != m_framesGrantedStorageAccess.end()) { >+ auto it = framesGrantedIterator->value.find(frameID.value()); >+ if (it != framesGrantedIterator->value.end() && it->value == resourceDomain) >+ return true; >+ } >+ } >+ >+ if (!firstPartyDomain.isEmpty()) { >+ auto pagesGrantedIterator = m_pagesGrantedStorageAccess.find(pageID); >+ if (pagesGrantedIterator != m_pagesGrantedStorageAccess.end()) { >+ auto it = pagesGrantedIterator->value.find(firstPartyDomain); >+ if (it != pagesGrantedIterator->value.end() && it->value == resourceDomain) >+ return true; >+ } >+ } >+ >+ return false; >+} >+ >+Vector<String> NetworkStorageSession::getAllStorageAccessEntries() const >+{ >+ Vector<String> entries; >+ for (auto& innerMap : m_framesGrantedStorageAccess.values()) { >+ for (auto& value : innerMap.values()) >+ entries.append(value); >+ } >+ return entries; >+} >+ >+void NetworkStorageSession::grantStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID) >+{ >+ if (!frameID) { >+ if (firstPartyDomain.isEmpty()) >+ return; >+ auto pagesGrantedIterator = m_pagesGrantedStorageAccess.find(pageID); >+ if (pagesGrantedIterator == m_pagesGrantedStorageAccess.end()) { >+ HashMap<String, String> entry; >+ entry.add(firstPartyDomain, resourceDomain); >+ m_pagesGrantedStorageAccess.add(pageID, entry); >+ } else { >+ auto firstPartyDomainIterator = pagesGrantedIterator->value.find(firstPartyDomain); >+ if (firstPartyDomainIterator == pagesGrantedIterator->value.end()) >+ pagesGrantedIterator->value.add(firstPartyDomain, resourceDomain); >+ else >+ firstPartyDomainIterator->value = resourceDomain; >+ } >+ return; >+ } >+ >+ auto pagesGrantedIterator = m_framesGrantedStorageAccess.find(pageID); >+ if (pagesGrantedIterator == m_framesGrantedStorageAccess.end()) { >+ HashMap<uint64_t, String, DefaultHash<uint64_t>::Hash, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>> entry; >+ entry.add(frameID.value(), resourceDomain); >+ m_framesGrantedStorageAccess.add(pageID, entry); >+ } else { >+ auto framesGrantedIterator = pagesGrantedIterator->value.find(frameID.value()); >+ if (framesGrantedIterator == pagesGrantedIterator->value.end()) >+ pagesGrantedIterator->value.add(frameID.value(), resourceDomain); >+ else >+ framesGrantedIterator->value = resourceDomain; >+ } >+} >+ >+void NetworkStorageSession::removeStorageAccessForFrame(uint64_t frameID, uint64_t pageID) >+{ >+ auto iteration = m_framesGrantedStorageAccess.find(pageID); >+ if (iteration == m_framesGrantedStorageAccess.end()) >+ return; >+ >+ iteration->value.remove(frameID); >+} >+ >+void NetworkStorageSession::removeStorageAccessForAllFramesOnPage(uint64_t pageID) >+{ >+ m_pagesGrantedStorageAccess.remove(pageID); >+ m_framesGrantedStorageAccess.remove(pageID); >+} >+ >+void NetworkStorageSession::removeAllStorageAccess() >+{ >+ m_pagesGrantedStorageAccess.clear(); >+ m_framesGrantedStorageAccess.clear(); >+} >+ >+void NetworkStorageSession::setCacheMaxAgeCapForPrevalentResources(Seconds seconds) >+{ >+ m_cacheMaxAgeCapForPrevalentResources = seconds; >+} >+ >+void NetworkStorageSession::resetCacheMaxAgeCapForPrevalentResources() >+{ >+ m_cacheMaxAgeCapForPrevalentResources = std::nullopt; >+} >+#endif // ENABLE(RESOURCE_LOAD_STATISTICS) >+ > } >diff --git a/Source/WebCore/platform/network/NetworkStorageSession.h b/Source/WebCore/platform/network/NetworkStorageSession.h >index 3e277eea0f7..2fb390f4858 100644 >--- a/Source/WebCore/platform/network/NetworkStorageSession.h >+++ b/Source/WebCore/platform/network/NetworkStorageSession.h >@@ -100,22 +100,6 @@ public: > CFURLStorageSessionRef platformSession() { return m_platformSession.get(); } > WEBCORE_EXPORT RetainPtr<CFHTTPCookieStorageRef> cookieStorage() const; > WEBCORE_EXPORT static void setStorageAccessAPIEnabled(bool); >-#if ENABLE(RESOURCE_LOAD_STATISTICS) >- WEBCORE_EXPORT bool shouldBlockCookies(const ResourceRequest&, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const; >- WEBCORE_EXPORT bool shouldBlockCookies(const URL& firstPartyForCookies, const URL& resource, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const; >- WEBCORE_EXPORT void setPrevalentDomainsToBlockCookiesFor(const Vector<String>&); >- WEBCORE_EXPORT void setAgeCapForClientSideCookies(std::optional<Seconds>); >- WEBCORE_EXPORT void removePrevalentDomains(const Vector<String>& domains); >- WEBCORE_EXPORT bool hasStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID) const; >- WEBCORE_EXPORT Vector<String> getAllStorageAccessEntries() const; >- WEBCORE_EXPORT void grantStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID); >- WEBCORE_EXPORT void removeStorageAccessForFrame(uint64_t frameID, uint64_t pageID); >- WEBCORE_EXPORT void removeStorageAccessForAllFramesOnPage(uint64_t pageID); >- WEBCORE_EXPORT void removeAllStorageAccess(); >- WEBCORE_EXPORT void setCacheMaxAgeCapForPrevalentResources(Seconds); >- WEBCORE_EXPORT void resetCacheMaxAgeCapForPrevalentResources(); >- WEBCORE_EXPORT std::optional<Seconds> maxAgeCacheCap(const ResourceRequest&); >-#endif > #elif USE(SOUP) > NetworkStorageSession(PAL::SessionID, std::unique_ptr<SoupNetworkSession>&&); > ~NetworkStorageSession(); >@@ -164,6 +148,22 @@ public: > WEBCORE_EXPORT std::pair<String, bool> cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo&, const URL&, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID, IncludeSecureCookies) const; > WEBCORE_EXPORT std::pair<String, bool> cookieRequestHeaderFieldValue(const CookieRequestHeaderFieldProxy&) const; > >+#if ENABLE(RESOURCE_LOAD_STATISTICS) >+ WEBCORE_EXPORT bool shouldBlockCookies(const ResourceRequest&, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const; >+ WEBCORE_EXPORT bool shouldBlockCookies(const URL& firstPartyForCookies, const URL& resource, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const; >+ WEBCORE_EXPORT void setPrevalentDomainsToBlockCookiesFor(const Vector<String>&); >+ WEBCORE_EXPORT void setAgeCapForClientSideCookies(std::optional<Seconds>); >+ WEBCORE_EXPORT void removePrevalentDomains(const Vector<String>& domains); >+ WEBCORE_EXPORT bool hasStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID) const; >+ WEBCORE_EXPORT Vector<String> getAllStorageAccessEntries() const; >+ WEBCORE_EXPORT void grantStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID); >+ WEBCORE_EXPORT void removeStorageAccessForFrame(uint64_t frameID, uint64_t pageID); >+ WEBCORE_EXPORT void removeStorageAccessForAllFramesOnPage(uint64_t pageID); >+ WEBCORE_EXPORT void removeAllStorageAccess(); >+ WEBCORE_EXPORT void setCacheMaxAgeCapForPrevalentResources(Seconds); >+ WEBCORE_EXPORT void resetCacheMaxAgeCapForPrevalentResources(); >+ WEBCORE_EXPORT std::optional<Seconds> maxAgeCacheCap(const ResourceRequest&); >+#endif > > private: > static HashMap<PAL::SessionID, std::unique_ptr<NetworkStorageSession>>& globalSessionMap(); >diff --git a/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNet.cpp b/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNet.cpp >index 81abed21450..1ccab43c7a8 100644 >--- a/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNet.cpp >+++ b/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNet.cpp >@@ -254,175 +254,6 @@ void NetworkStorageSession::setStorageAccessAPIEnabled(bool enabled) > storageAccessAPIEnabled = enabled; > } > >-#if ENABLE(RESOURCE_LOAD_STATISTICS) >- >-static inline String getPartitioningDomain(const URL& url) >-{ >-#if ENABLE(PUBLIC_SUFFIX_LIST) >- auto domain = topPrivatelyControlledDomain(url.host().toString()); >- if (domain.isEmpty()) >- domain = url.host().toString(); >-#else >- auto domain = url.host().toString(); >-#endif >- return domain; >-} >- >-bool NetworkStorageSession::shouldBlockThirdPartyCookies(const String& topPrivatelyControlledDomain) const >-{ >- if (topPrivatelyControlledDomain.isEmpty()) >- return false; >- >- return m_topPrivatelyControlledDomainsToBlock.contains(topPrivatelyControlledDomain); >-} >- >-bool NetworkStorageSession::shouldBlockCookies(const ResourceRequest& request, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const >-{ >- return shouldBlockCookies(request.firstPartyForCookies(), request.url(), frameID, pageID); >-} >- >-bool NetworkStorageSession::shouldBlockCookies(const URL& firstPartyForCookies, const URL& resource, std::optional<uint64_t> frameID, std::optional<uint64_t> pageID) const >-{ >- auto firstPartyDomain = getPartitioningDomain(firstPartyForCookies); >- if (firstPartyDomain.isEmpty()) >- return false; >- >- auto resourceDomain = getPartitioningDomain(resource); >- if (resourceDomain.isEmpty()) >- return false; >- >- if (firstPartyDomain == resourceDomain) >- return false; >- >- if (pageID && hasStorageAccess(resourceDomain, firstPartyDomain, frameID, pageID.value())) >- return false; >- >- return shouldBlockThirdPartyCookies(resourceDomain); >-} >- >-std::optional<Seconds> NetworkStorageSession::maxAgeCacheCap(const ResourceRequest& request) >-{ >- if (m_cacheMaxAgeCapForPrevalentResources && shouldBlockCookies(request, std::nullopt, std::nullopt)) >- return m_cacheMaxAgeCapForPrevalentResources; >- return std::nullopt; >-} >- >-void NetworkStorageSession::setAgeCapForClientSideCookies(std::optional<Seconds> seconds) >-{ >- m_ageCapForClientSideCookies = seconds; >-} >- >-void NetworkStorageSession::setPrevalentDomainsToBlockCookiesFor(const Vector<String>& domains) >-{ >- m_topPrivatelyControlledDomainsToBlock.clear(); >- m_topPrivatelyControlledDomainsToBlock.add(domains.begin(), domains.end()); >-} >- >-void NetworkStorageSession::removePrevalentDomains(const Vector<String>& domains) >-{ >- for (auto& domain : domains) >- m_topPrivatelyControlledDomainsToBlock.remove(domain); >-} >- >-bool NetworkStorageSession::hasStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID) const >-{ >- if (frameID) { >- auto framesGrantedIterator = m_framesGrantedStorageAccess.find(pageID); >- if (framesGrantedIterator != m_framesGrantedStorageAccess.end()) { >- auto it = framesGrantedIterator->value.find(frameID.value()); >- if (it != framesGrantedIterator->value.end() && it->value == resourceDomain) >- return true; >- } >- } >- >- if (!firstPartyDomain.isEmpty()) { >- auto pagesGrantedIterator = m_pagesGrantedStorageAccess.find(pageID); >- if (pagesGrantedIterator != m_pagesGrantedStorageAccess.end()) { >- auto it = pagesGrantedIterator->value.find(firstPartyDomain); >- if (it != pagesGrantedIterator->value.end() && it->value == resourceDomain) >- return true; >- } >- } >- >- return false; >-} >- >-Vector<String> NetworkStorageSession::getAllStorageAccessEntries() const >-{ >- Vector<String> entries; >- for (auto& innerMap : m_framesGrantedStorageAccess.values()) { >- for (auto& value : innerMap.values()) >- entries.append(value); >- } >- return entries; >-} >- >-void NetworkStorageSession::grantStorageAccess(const String& resourceDomain, const String& firstPartyDomain, std::optional<uint64_t> frameID, uint64_t pageID) >-{ >- if (!frameID) { >- if (firstPartyDomain.isEmpty()) >- return; >- auto pagesGrantedIterator = m_pagesGrantedStorageAccess.find(pageID); >- if (pagesGrantedIterator == m_pagesGrantedStorageAccess.end()) { >- HashMap<String, String> entry; >- entry.add(firstPartyDomain, resourceDomain); >- m_pagesGrantedStorageAccess.add(pageID, entry); >- } else { >- auto firstPartyDomainIterator = pagesGrantedIterator->value.find(firstPartyDomain); >- if (firstPartyDomainIterator == pagesGrantedIterator->value.end()) >- pagesGrantedIterator->value.add(firstPartyDomain, resourceDomain); >- else >- firstPartyDomainIterator->value = resourceDomain; >- } >- return; >- } >- >- auto pagesGrantedIterator = m_framesGrantedStorageAccess.find(pageID); >- if (pagesGrantedIterator == m_framesGrantedStorageAccess.end()) { >- HashMap<uint64_t, String, DefaultHash<uint64_t>::Hash, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>> entry; >- entry.add(frameID.value(), resourceDomain); >- m_framesGrantedStorageAccess.add(pageID, entry); >- } else { >- auto framesGrantedIterator = pagesGrantedIterator->value.find(frameID.value()); >- if (framesGrantedIterator == pagesGrantedIterator->value.end()) >- pagesGrantedIterator->value.add(frameID.value(), resourceDomain); >- else >- framesGrantedIterator->value = resourceDomain; >- } >-} >- >-void NetworkStorageSession::removeStorageAccessForFrame(uint64_t frameID, uint64_t pageID) >-{ >- auto iteration = m_framesGrantedStorageAccess.find(pageID); >- if (iteration == m_framesGrantedStorageAccess.end()) >- return; >- >- iteration->value.remove(frameID); >-} >- >-void NetworkStorageSession::removeStorageAccessForAllFramesOnPage(uint64_t pageID) >-{ >- m_pagesGrantedStorageAccess.remove(pageID); >- m_framesGrantedStorageAccess.remove(pageID); >-} >- >-void NetworkStorageSession::removeAllStorageAccess() >-{ >- m_pagesGrantedStorageAccess.clear(); >- m_framesGrantedStorageAccess.clear(); >-} >- >-void NetworkStorageSession::setCacheMaxAgeCapForPrevalentResources(Seconds seconds) >-{ >- m_cacheMaxAgeCapForPrevalentResources = seconds; >-} >- >-void NetworkStorageSession::resetCacheMaxAgeCapForPrevalentResources() >-{ >- m_cacheMaxAgeCapForPrevalentResources = std::nullopt; >-} >-#endif // ENABLE(RESOURCE_LOAD_STATISTICS) >- > #if !PLATFORM(COCOA) > void NetworkStorageSession::setCookies(const Vector<Cookie>&, const URL&, const URL&) > {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 192592
:
357054
|
357060