Title: [207459] trunk/Source/WebCore
Revision
207459
Author
commit-qu...@webkit.org
Date
2016-10-18 05:30:40 -0700 (Tue, 18 Oct 2016)

Log Message

CachedResourceLoader should not need to remove fragment identifier
https://bugs.webkit.org/show_bug.cgi?id=163015

Patch by Youenn Fablet <you...@apple.com> on 2016-10-18
Reviewed by Darin Adler.

No expected change for non-window port.
For window port, CachedResourceLoader will strip the fragment identifier of the URL passed to subresourceForURL
before querying the memory cache.

Removing the fragment identifier from the request stored in CachedResourceRequest.
The fragment identifier is stored in a separate field.

This allows CachedResourceLoader to not care about fragment identifier.
CachedResource can then get access to it.

* loader/cache/CachedResource.cpp:
(WebCore::CachedResource::CachedResource):
(WebCore::CachedResource::finishRequestInitialization): Deleted.
* loader/cache/CachedResource.h:
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::cachedResource):
Updated the method taking a const String& to strip the fragment identifier if needed.
Updated the method taking a const URL& to assert if the fragment identifier is present.
(WebCore::CachedResourceLoader::requestUserCSSStyleSheet):
(WebCore::CachedResourceLoader::requestResource):
* loader/cache/CachedResourceRequest.cpp:
(WebCore::CachedResourceRequest::CachedResourceRequest):
(WebCore::CachedResourceRequest::splitFragmentIdentifierFromRequestURL):
* loader/cache/CachedResourceRequest.h:
(WebCore::CachedResourceRequest::releaseFragmentIdentifier):
(WebCore::CachedResourceRequest::clearFragmentIdentifier):
* loader/cache/MemoryCache.cpp:
(WebCore::MemoryCache::shouldRemoveFragmentIdentifier):
(WebCore::MemoryCache::removeFragmentIdentifierIfNeeded):
(WebCore::MemoryCache::revalidationSucceeded):
(WebCore::MemoryCache::resourceForRequest):
* loader/cache/MemoryCache.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (207458 => 207459)


--- trunk/Source/WebCore/ChangeLog	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/ChangeLog	2016-10-18 12:30:40 UTC (rev 207459)
@@ -1,3 +1,43 @@
+2016-10-18  Youenn Fablet  <you...@apple.com>
+
+        CachedResourceLoader should not need to remove fragment identifier
+        https://bugs.webkit.org/show_bug.cgi?id=163015
+
+        Reviewed by Darin Adler.
+
+        No expected change for non-window port.
+        For window port, CachedResourceLoader will strip the fragment identifier of the URL passed to subresourceForURL
+        before querying the memory cache.
+
+        Removing the fragment identifier from the request stored in CachedResourceRequest.
+        The fragment identifier is stored in a separate field.
+
+        This allows CachedResourceLoader to not care about fragment identifier.
+        CachedResource can then get access to it.
+
+        * loader/cache/CachedResource.cpp:
+        (WebCore::CachedResource::CachedResource):
+        (WebCore::CachedResource::finishRequestInitialization): Deleted.
+        * loader/cache/CachedResource.h:
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::cachedResource):
+        Updated the method taking a const String& to strip the fragment identifier if needed.
+        Updated the method taking a const URL& to assert if the fragment identifier is present.
+        (WebCore::CachedResourceLoader::requestUserCSSStyleSheet):
+        (WebCore::CachedResourceLoader::requestResource):
+        * loader/cache/CachedResourceRequest.cpp:
+        (WebCore::CachedResourceRequest::CachedResourceRequest):
+        (WebCore::CachedResourceRequest::splitFragmentIdentifierFromRequestURL):
+        * loader/cache/CachedResourceRequest.h:
+        (WebCore::CachedResourceRequest::releaseFragmentIdentifier):
+        (WebCore::CachedResourceRequest::clearFragmentIdentifier):
+        * loader/cache/MemoryCache.cpp:
+        (WebCore::MemoryCache::shouldRemoveFragmentIdentifier):
+        (WebCore::MemoryCache::removeFragmentIdentifierIfNeeded):
+        (WebCore::MemoryCache::revalidationSucceeded):
+        (WebCore::MemoryCache::resourceForRequest):
+        * loader/cache/MemoryCache.h:
+
 2016-10-18  Antti Koivisto  <an...@apple.com>
 
         Rename setNeedsStyleRecalc to invalidateStyle

Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (207458 => 207459)


--- trunk/Source/WebCore/loader/cache/CachedResource.cpp	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp	2016-10-18 12:30:40 UTC (rev 207459)
@@ -121,6 +121,7 @@
     , m_sessionID(sessionID)
     , m_loadPriority(defaultPriorityForResourceType(type))
     , m_responseTimestamp(std::chrono::system_clock::now())
+    , m_fragmentIdentifierForRequest(request.releaseFragmentIdentifier())
     , m_origin(request.releaseOrigin())
     , m_type(type)
 {
@@ -127,7 +128,9 @@
     ASSERT(sessionID.isValid());
 
     setLoadPriority(request.priority());
-    finishRequestInitialization();
+#ifndef NDEBUG
+    cachedResourceLeakCounter.increment();
+#endif
 
     // FIXME: We should have a better way of checking for Navigation loads, maybe FetchMode::Options::Navigate.
     ASSERT(m_origin || m_type == CachedResource::MainResource);
@@ -138,31 +141,20 @@
         setCrossOrigin();
 }
 
+// FIXME: For this constructor, we should probably mandate that the URL has no fragment identifier.
 CachedResource::CachedResource(const URL& url, Type type, SessionID sessionID)
     : m_resourceRequest(url)
     , m_decodedDataDeletionTimer(*this, &CachedResource::destroyDecodedData, deadDecodedDataDeletionIntervalForResourceType(type))
     , m_sessionID(sessionID)
     , m_responseTimestamp(std::chrono::system_clock::now())
+    , m_fragmentIdentifierForRequest(CachedResourceRequest::splitFragmentIdentifierFromRequestURL(m_resourceRequest))
     , m_type(type)
     , m_status(Cached)
 {
     ASSERT(sessionID.isValid());
-    finishRequestInitialization();
-}
-
-void CachedResource::finishRequestInitialization()
-{
 #ifndef NDEBUG
     cachedResourceLeakCounter.increment();
 #endif
-
-    if (!m_resourceRequest.url().hasFragmentIdentifier())
-        return;
-    URL urlForCache = MemoryCache::removeFragmentIdentifierIfNeeded(m_resourceRequest.url());
-    if (urlForCache.hasFragmentIdentifier())
-        return;
-    m_fragmentIdentifierForRequest = m_resourceRequest.url().fragmentIdentifier();
-    m_resourceRequest.setURL(urlForCache);
 }
 
 CachedResource::~CachedResource()

Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (207458 => 207459)


--- trunk/Source/WebCore/loader/cache/CachedResource.h	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h	2016-10-18 12:30:40 UTC (rev 207459)
@@ -302,8 +302,6 @@
 private:
     class Callback;
 
-    void finishRequestInitialization();
-
     bool addClientToSet(CachedResourceClient&);
 
     void decodedDataDeletionTimerFired();

Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (207458 => 207459)


--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2016-10-18 12:30:40 UTC (rev 207459)
@@ -148,17 +148,16 @@
     ASSERT(m_requestCount == 0);
 }
 
-CachedResource* CachedResourceLoader::cachedResource(const String& resourceURL) const 
+CachedResource* CachedResourceLoader::cachedResource(const String& resourceURL) const
 {
     ASSERT(!resourceURL.isNull());
-    URL url = ""
-    return cachedResource(url); 
+    return cachedResource(MemoryCache::removeFragmentIdentifierIfNeeded(m_document->completeURL(resourceURL)));
 }
 
-CachedResource* CachedResourceLoader::cachedResource(const URL& resourceURL) const
+CachedResource* CachedResourceLoader::cachedResource(const URL& url) const
 {
-    URL url = ""
-    return m_documentResources.get(url).get(); 
+    ASSERT(!MemoryCache::shouldRemoveFragmentIdentifier(url));
+    return m_documentResources.get(url).get();
 }
 
 Frame* CachedResourceLoader::frame() const
@@ -657,9 +656,6 @@
 
     LOG(ResourceLoading, "CachedResourceLoader::requestResource '%s', charset '%s', priority=%d, forPreload=%u", url.stringCenterEllipsizedToLength().latin1().data(), request.charset().latin1().data(), request.priority() ? static_cast<int>(request.priority().value()) : -1, forPreload == ForPreload::Yes);
 
-    // If only the fragment identifiers differ, it is the same resource.
-    url = ""
-
     if (!url.isValid()) {
         RELEASE_LOG_IF_ALLOWED("requestResource: URL is invalid (frame = %p)", frame());
         return nullptr;

Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp (207458 => 207459)


--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp	2016-10-18 12:30:40 UTC (rev 207459)
@@ -42,9 +42,21 @@
     , m_charset(WTFMove(charset))
     , m_options(options)
     , m_priority(priority)
+    , m_fragmentIdentifier(splitFragmentIdentifierFromRequestURL(m_resourceRequest))
 {
 }
 
+String CachedResourceRequest::splitFragmentIdentifierFromRequestURL(ResourceRequest& request)
+{
+    if (!MemoryCache::shouldRemoveFragmentIdentifier(request.url()))
+        return { };
+    URL url = ""
+    String fragmentIdentifier = url.fragmentIdentifier();
+    url.removeFragmentIdentifier();
+    request.setURL(url);
+    return fragmentIdentifier;
+}
+
 void CachedResourceRequest::setInitiator(PassRefPtr<Element> element)
 {
     ASSERT(!m_initiatorElement && m_initiatorName.isEmpty());

Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.h (207458 => 207459)


--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.h	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.h	2016-10-18 12:30:40 UTC (rev 207459)
@@ -78,6 +78,11 @@
     RefPtr<SecurityOrigin> releaseOrigin() { return WTFMove(m_origin); }
     SecurityOrigin* origin() const { return m_origin.get(); }
 
+    String&& releaseFragmentIdentifier() { return WTFMove(m_fragmentIdentifier); }
+    void clearFragmentIdentifier() { m_fragmentIdentifier = { }; }
+
+    static String splitFragmentIdentifierFromRequestURL(ResourceRequest&);
+
 private:
     ResourceRequest m_resourceRequest;
     String m_charset;
@@ -86,6 +91,7 @@
     RefPtr<Element> m_initiatorElement;
     AtomicString m_initiatorName;
     RefPtr<SecurityOrigin> m_origin;
+    String m_fragmentIdentifier;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/loader/cache/MemoryCache.cpp (207458 => 207459)


--- trunk/Source/WebCore/loader/cache/MemoryCache.cpp	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/loader/cache/MemoryCache.cpp	2016-10-18 12:30:40 UTC (rev 207459)
@@ -89,14 +89,19 @@
     return *map;
 }
 
-URL MemoryCache::removeFragmentIdentifierIfNeeded(const URL& originalURL)
+bool MemoryCache::shouldRemoveFragmentIdentifier(const URL& originalURL)
 {
     if (!originalURL.hasFragmentIdentifier())
-        return originalURL;
+        return false;
     // Strip away fragment identifier from HTTP URLs.
-    // Data URLs must be unmodified. For file and custom URLs clients may expect resources 
+    // Data URLs must be unmodified. For file and custom URLs clients may expect resources
     // to be unique even when they differ by the fragment identifier only.
-    if (!originalURL.protocolIsInHTTPFamily())
+    return originalURL.protocolIsInHTTPFamily();
+}
+
+URL MemoryCache::removeFragmentIdentifierIfNeeded(const URL& originalURL)
+{
+    if (!shouldRemoveFragmentIdentifier(originalURL))
         return originalURL;
     URL url = ""
     url.removeFragmentIdentifier();
@@ -154,7 +159,7 @@
         insertInLiveDecodedResourcesList(resource);
     if (delta)
         adjustSize(resource.hasClients(), delta);
-    
+
     revalidatingResource.switchClientsToRevalidatedResource();
     ASSERT(!revalidatingResource.m_deleted);
     // this deletes the revalidating resource
@@ -171,6 +176,8 @@
 
 CachedResource* MemoryCache::resourceForRequest(const ResourceRequest& request, SessionID sessionID)
 {
+    // FIXME: Change all clients to make sure HTTP(s) URLs have no fragment identifiers before calling here.
+    // CachedResourceLoader is now doing this. Add an assertion once all other clients are doing it too.
     auto* resources = sessionResourceMap(sessionID);
     if (!resources)
         return nullptr;

Modified: trunk/Source/WebCore/loader/cache/MemoryCache.h (207458 => 207459)


--- trunk/Source/WebCore/loader/cache/MemoryCache.h	2016-10-18 12:28:55 UTC (rev 207458)
+++ trunk/Source/WebCore/loader/cache/MemoryCache.h	2016-10-18 12:30:40 UTC (rev 207459)
@@ -97,8 +97,9 @@
     bool add(CachedResource&);
     void remove(CachedResource&);
 
-    static URL removeFragmentIdentifierIfNeeded(const URL& originalURL);
-    
+    static bool shouldRemoveFragmentIdentifier(const URL&);
+    static URL removeFragmentIdentifierIfNeeded(const URL&);
+
     void revalidationSucceeded(CachedResource& revalidatingResource, const ResourceResponse&);
     void revalidationFailed(CachedResource& revalidatingResource);
 
@@ -105,8 +106,8 @@
     void forEachResource(const std::function<void(CachedResource&)>&);
     void forEachSessionResource(SessionID, const std::function<void(CachedResource&)>&);
     void destroyDecodedDataForAllImages();
-    
-    // Sets the cache's memory capacities, in bytes. These will hold only approximately, 
+
+    // Sets the cache's memory capacities, in bytes. These will hold only approximately,
     // since the decoded cost of resources like scripts and stylesheets is not known.
     //  - minDeadBytes: The maximum number of bytes that dead resources should consume when the cache is under pressure.
     //  - maxDeadBytes: The maximum number of bytes that dead resources should consume when the cache is not under pressure.
@@ -120,7 +121,7 @@
 
     WEBCORE_EXPORT void evictResources();
     WEBCORE_EXPORT void evictResources(SessionID);
-    
+
     void prune();
     void pruneSoon();
     unsigned size() const { return m_liveSize + m_deadSize; }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to