Title: [215816] trunk/Source
Revision
215816
Author
[email protected]
Date
2017-04-26 11:22:27 -0700 (Wed, 26 Apr 2017)

Log Message

Enable expired-only reload policy on Mac and iOS
https://bugs.webkit.org/show_bug.cgi?id=171264
<rdar://problem/31807637>

Reviewed by Andreas Kling.

Source/WebCore:

Limit the behavior to http and data URLs (where we explicitly know about expiration).

* html/HTMLLinkElement.cpp:
(WebCore::HTMLLinkElement::setCSSStyleSheet):
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::subresourceCachePolicy):

    Pass the URL so we can test for protocol.

* loader/FrameLoader.h:
* loader/NavigationAction.cpp:
(WebCore::navigationType):

    Test for reload navigation type correctly.

* loader/cache/CachedResource.cpp:
(WebCore::CachedResource::load):
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::determineRevalidationPolicy):
(WebCore::CachedResourceLoader::cachePolicy):
* loader/cache/CachedResourceLoader.h:

Source/WebKit2:

Enable the reload policy where only expired subresources are revalidated on Mac and iOS.
The behavor is enabled in Safari and for other clients based on SDK version check.

* UIProcess/API/C/WKPage.cpp:
(WKPageReload):
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView reload]):
* UIProcess/Cocoa/VersionChecks.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (215815 => 215816)


--- trunk/Source/WebCore/ChangeLog	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/ChangeLog	2017-04-26 18:22:27 UTC (rev 215816)
@@ -1,3 +1,33 @@
+2017-04-26  Antti Koivisto  <[email protected]>
+
+        Enable expired-only reload policy on Mac and iOS
+        https://bugs.webkit.org/show_bug.cgi?id=171264
+        <rdar://problem/31807637>
+
+        Reviewed by Andreas Kling.
+
+        Limit the behavior to http and data URLs (where we explicitly know about expiration).
+
+        * html/HTMLLinkElement.cpp:
+        (WebCore::HTMLLinkElement::setCSSStyleSheet):
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::subresourceCachePolicy):
+
+            Pass the URL so we can test for protocol.
+
+        * loader/FrameLoader.h:
+        * loader/NavigationAction.cpp:
+        (WebCore::navigationType):
+
+            Test for reload navigation type correctly.
+
+        * loader/cache/CachedResource.cpp:
+        (WebCore::CachedResource::load):
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::determineRevalidationPolicy):
+        (WebCore::CachedResourceLoader::cachePolicy):
+        * loader/cache/CachedResourceLoader.h:
+
 2017-04-26  WebKit Contributor  <[email protected]>
 
         Response.blob() does not set the content-type based on the header value.

Modified: trunk/Source/WebCore/html/HTMLLinkElement.cpp (215815 => 215816)


--- trunk/Source/WebCore/html/HTMLLinkElement.cpp	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/html/HTMLLinkElement.cpp	2017-04-26 18:22:27 UTC (rev 215816)
@@ -377,7 +377,7 @@
     Ref<HTMLLinkElement> protectedThis(*this);
 
     CSSParserContext parserContext(document(), baseURL, charset);
-    auto cachePolicy = frame->loader().subresourceCachePolicy();
+    auto cachePolicy = frame->loader().subresourceCachePolicy(baseURL);
 
     if (auto restoredSheet = const_cast<CachedCSSStyleSheet*>(cachedStyleSheet)->restoreParsedStyleSheet(parserContext, cachePolicy)) {
         ASSERT(restoredSheet->isCacheable());

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (215815 => 215816)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2017-04-26 18:22:27 UTC (rev 215816)
@@ -2195,7 +2195,7 @@
     return m_loadType;
 }
     
-CachePolicy FrameLoader::subresourceCachePolicy() const
+CachePolicy FrameLoader::subresourceCachePolicy(const URL& url) const
 {
     if (Page* page = m_frame.page()) {
         if (page->isResourceCachingDisabled())
@@ -2209,7 +2209,7 @@
         return CachePolicyReload;
 
     if (Frame* parentFrame = m_frame.tree().parent()) {
-        CachePolicy parentCachePolicy = parentFrame->loader().subresourceCachePolicy();
+        CachePolicy parentCachePolicy = parentFrame->loader().subresourceCachePolicy(url);
         if (parentCachePolicy != CachePolicyVerify)
             return parentCachePolicy;
     }
@@ -2228,7 +2228,11 @@
     case FrameLoadType::Replace:
     case FrameLoadType::Same:
     case FrameLoadType::Standard:
+        return CachePolicyVerify;
     case FrameLoadType::ReloadExpiredOnly:
+        // We know about expiration for HTTP and data. Do a normal reload otherwise.
+        if (!url.protocolIsInHTTPFamily() && !url.protocolIsData())
+            return CachePolicyReload;
         return CachePolicyVerify;
     }
 

Modified: trunk/Source/WebCore/loader/FrameLoader.h (215815 => 215816)


--- trunk/Source/WebCore/loader/FrameLoader.h	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/loader/FrameLoader.h	2017-04-26 18:22:27 UTC (rev 215816)
@@ -186,7 +186,7 @@
 
     WEBCORE_EXPORT FrameLoadType loadType() const;
 
-    CachePolicy subresourceCachePolicy() const;
+    CachePolicy subresourceCachePolicy(const URL&) const;
 
     void didReachLayoutMilestone(LayoutMilestones);
     void didFirstLayout();

Modified: trunk/Source/WebCore/loader/NavigationAction.cpp (215815 => 215816)


--- trunk/Source/WebCore/loader/NavigationAction.cpp	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/loader/NavigationAction.cpp	2017-04-26 18:22:27 UTC (rev 215816)
@@ -41,7 +41,7 @@
         return NavigationType::FormSubmitted;
     if (haveEvent)
         return NavigationType::LinkClicked;
-    if (frameLoadType == FrameLoadType::Reload || frameLoadType == FrameLoadType::ReloadFromOrigin)
+    if (isReload(frameLoadType))
         return NavigationType::Reload;
     if (isBackForwardLoadType(frameLoadType))
         return NavigationType::BackForward;

Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (215815 => 215816)


--- trunk/Source/WebCore/loader/cache/CachedResource.cpp	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp	2017-04-26 18:22:27 UTC (rev 215816)
@@ -223,8 +223,8 @@
         const String& lastModified = resourceToRevalidate->response().httpHeaderField(HTTPHeaderName::LastModified);
         const String& eTag = resourceToRevalidate->response().httpHeaderField(HTTPHeaderName::ETag);
         if (!lastModified.isEmpty() || !eTag.isEmpty()) {
-            ASSERT(cachedResourceLoader.cachePolicy(type()) != CachePolicyReload);
-            if (cachedResourceLoader.cachePolicy(type()) == CachePolicyRevalidate)
+            ASSERT(cachedResourceLoader.cachePolicy(type(), url()) != CachePolicyReload);
+            if (cachedResourceLoader.cachePolicy(type(), url()) == CachePolicyRevalidate)
                 m_resourceRequest.setHTTPHeaderField(HTTPHeaderName::CacheControl, "max-age=0");
             if (!lastModified.isEmpty())
                 m_resourceRequest.setHTTPHeaderField(HTTPHeaderName::IfModifiedSince, lastModified);

Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (215815 => 215816)


--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2017-04-26 18:22:27 UTC (rev 215816)
@@ -969,8 +969,10 @@
         return Use;
     ASSERT(!existingResource->validationInProgress());
 
+    auto cachePolicy = this->cachePolicy(type, request.url());
+
     // Validate the redirect chain.
-    bool cachePolicyIsHistoryBuffer = cachePolicy(type) == CachePolicyHistoryBuffer;
+    bool cachePolicyIsHistoryBuffer = cachePolicy == CachePolicyHistoryBuffer;
     if (!existingResource->redirectChainAllowsReuse(cachePolicyIsHistoryBuffer ? ReuseExpiredRedirection : DoNotReuseExpiredRedirection)) {
         LOG(ResourceLoading, "CachedResourceLoader::determineRevalidationPolicy reloading due to not cached or expired redirections.");
         logMemoryCacheResourceRequest(frame(), DiagnosticLoggingKeys::inMemoryCacheKey(), DiagnosticLoggingKeys::unusedReasonRedirectChainKey());
@@ -1009,7 +1011,7 @@
         return Use;
 
     // CachePolicyReload always reloads
-    if (cachePolicy(type) == CachePolicyReload) {
+    if (cachePolicy == CachePolicyReload) {
         LOG(ResourceLoading, "CachedResourceLoader::determineRevalidationPolicy reloading due to CachePolicyReload.");
         logMemoryCacheResourceRequest(frame(), DiagnosticLoggingKeys::inMemoryCacheKey(), DiagnosticLoggingKeys::unusedReasonReloadKey());
         return Reload;
@@ -1033,7 +1035,7 @@
         return Use;
     }
 
-    auto revalidationDecision = existingResource->makeRevalidationDecision(cachePolicy(type));
+    auto revalidationDecision = existingResource->makeRevalidationDecision(cachePolicy);
     logResourceRevalidationDecision(revalidationDecision, frame());
 
     // Check if the cache headers requires us to revalidate (cache expiration for example).
@@ -1117,7 +1119,7 @@
     }
 }
 
-CachePolicy CachedResourceLoader::cachePolicy(CachedResource::Type type) const
+CachePolicy CachedResourceLoader::cachePolicy(CachedResource::Type type, const URL& url) const
 {
     Frame* frame = this->frame();
     if (!frame)
@@ -1124,7 +1126,7 @@
         return CachePolicyVerify;
 
     if (type != CachedResource::MainResource)
-        return frame->loader().subresourceCachePolicy();
+        return frame->loader().subresourceCachePolicy(url);
 
     if (Page* page = frame->page()) {
         if (page->isResourceCachingDisabled())

Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.h (215815 => 215816)


--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.h	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.h	2017-04-26 18:22:27 UTC (rev 215816)
@@ -110,7 +110,7 @@
     bool shouldDeferImageLoad(const URL&) const;
     bool shouldPerformImageLoad(const URL&) const;
     
-    CachePolicy cachePolicy(CachedResource::Type) const;
+    CachePolicy cachePolicy(CachedResource::Type, const URL&) const;
     
     Frame* frame() const; // Can be null
     Document* document() const { return m_document; } // Can be null

Modified: trunk/Source/WebKit2/ChangeLog (215815 => 215816)


--- trunk/Source/WebKit2/ChangeLog	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebKit2/ChangeLog	2017-04-26 18:22:27 UTC (rev 215816)
@@ -1,3 +1,20 @@
+2017-04-26  Antti Koivisto  <[email protected]>
+
+        Enable expired-only reload policy on Mac and iOS
+        https://bugs.webkit.org/show_bug.cgi?id=171264
+        <rdar://problem/31807637>
+
+        Reviewed by Andreas Kling.
+
+        Enable the reload policy where only expired subresources are revalidated on Mac and iOS.
+        The behavor is enabled in Safari and for other clients based on SDK version check.
+
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageReload):
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView reload]):
+        * UIProcess/Cocoa/VersionChecks.h:
+
 2017-04-26  Andy Estes  <[email protected]>
 
         [macOS] Add picture-in-picture support to WebPlaybackControlsManager

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (215815 => 215816)


--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp	2017-04-26 18:22:27 UTC (rev 215816)
@@ -93,6 +93,10 @@
 #include <WebCore/MediaSessionEvents.h>
 #endif
 
+#if PLATFORM(COCOA)
+#include "VersionChecks.h"
+#endif
+
 using namespace WebCore;
 using namespace WebKit;
 
@@ -242,7 +246,13 @@
 
 void WKPageReload(WKPageRef pageRef)
 {
-    toImpl(pageRef)->reload({ });
+    OptionSet<WebCore::ReloadOption> reloadOptions;
+#if PLATFORM(COCOA)
+    if (linkedOnOrAfter(WebKit::SDKVersion::FirstWithExpiredOnlyReloadBehavior))
+        reloadOptions |= WebCore::ReloadOption::ExpiredOnly;
+#endif
+
+    toImpl(pageRef)->reload(reloadOptions);
 }
 
 void WKPageReloadWithoutContentBlockers(WKPageRef pageRef)

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (215815 => 215816)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2017-04-26 18:22:27 UTC (rev 215816)
@@ -839,7 +839,11 @@
 
 - (WKNavigation *)reload
 {
-    auto navigation = _page->reload({ });
+    OptionSet<WebCore::ReloadOption> reloadOptions;
+    if (linkedOnOrAfter(WebKit::SDKVersion::FirstWithExpiredOnlyReloadBehavior))
+        reloadOptions |= WebCore::ReloadOption::ExpiredOnly;
+
+    auto navigation = _page->reload(reloadOptions);
     if (!navigation)
         return nil;
 

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/VersionChecks.h (215815 => 215816)


--- trunk/Source/WebKit2/UIProcess/Cocoa/VersionChecks.h	2017-04-26 18:17:17 UTC (rev 215815)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/VersionChecks.h	2017-04-26 18:22:27 UTC (rev 215816)
@@ -36,10 +36,12 @@
     FirstWithExceptionsForDuplicateCompletionHandlerCalls = DYLD_IOS_VERSION_11_0,
     FirstToExcludeLocalStorageFromBackup = DYLD_IOS_VERSION_11_0,
     FirstToUseSelectionGranularityCharacterByDefault = DYLD_IOS_VERSION_11_0,
+    FirstWithExpiredOnlyReloadBehavior = DYLD_IOS_VERSION_11_0,
 #elif PLATFORM(MAC)
     FirstWithNetworkCache = DYLD_MACOSX_VERSION_10_11,
     FirstWithExceptionsForDuplicateCompletionHandlerCalls = DYLD_MACOSX_VERSION_10_13,
-    FirstWithDropToNavigateDisallowedByDefault = DYLD_MACOSX_VERSION_10_13
+    FirstWithDropToNavigateDisallowedByDefault = DYLD_MACOSX_VERSION_10_13,
+    FirstWithExpiredOnlyReloadBehavior = DYLD_MACOSX_VERSION_10_13,
 #endif
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to