Title: [226745] trunk
Revision
226745
Author
[email protected]
Date
2018-01-10 16:45:49 -0800 (Wed, 10 Jan 2018)

Log Message

Use no-cache fetch mode when loading main documents with location.reload()
https://bugs.webkit.org/show_bug.cgi?id=181285
LayoutTests/imported/w3c:

Patch by Youenn Fablet <[email protected]> on 2018-01-10
Reviewed by Alex Christensen.

* web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt:

Source/WebCore:

Patch by Youenn Fablet <[email protected]> on 2018-01-10
Reviewed by Alex Christensen.

Covered by rebased tests.

Start to translate cache policy used for navigation as FetchOptions::Cache.
This allows ensuring service workers receive the right cache mode when intercepting navigation loads.
To not change current navigation behavior, ReturnCacheDataElseLoad and ReturnCacheDataDontLoad still trigger default fetch cache mode.

For Reload and ReloadExpiredOnly frame load types, using no-cache mode is more efficient than reload mode,
as a conditional request will be sent if possible. This applies to location.reload which is consistent with other browsers.
Keep reload mode for ReloadFromOrigin.

* loader/DocumentLoader.cpp:
(WebCore::toFetchOptionsCache):
(WebCore::DocumentLoader::loadMainResource):
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::loadFrameRequest):
(WebCore::FrameLoader::loadURL):
(WebCore::FrameLoader::load):
(WebCore::FrameLoader::reload):
(WebCore::FrameLoader::defaultRequestCachingPolicy):
(WebCore::FrameLoader::loadDifferentDocumentItem):
* loader/NavigationScheduler.cpp:

LayoutTests:

<rdar://problem/36356831>

Patch by Youenn Fablet <[email protected]> on 2018-01-10
Reviewed by Alex Christensen.

* http/tests/inspector/network/har/har-page-expected.txt:
* http/tests/inspector/network/har/har-page.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (226744 => 226745)


--- trunk/LayoutTests/ChangeLog	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/LayoutTests/ChangeLog	2018-01-11 00:45:49 UTC (rev 226745)
@@ -1,3 +1,14 @@
+2018-01-10  Youenn Fablet  <[email protected]>
+
+        Use no-cache fetch mode when loading main documents with location.reload()
+        https://bugs.webkit.org/show_bug.cgi?id=181285
+        <rdar://problem/36356831>
+
+        Reviewed by Alex Christensen.
+
+        * http/tests/inspector/network/har/har-page-expected.txt:
+        * http/tests/inspector/network/har/har-page.html:
+
 2018-01-10  Per Arne Vollan  <[email protected]>
 
         Mark accessibility/table-header-calculation-for-header-rows.html as failure on Windows.

Modified: trunk/LayoutTests/http/tests/inspector/network/har/har-page-expected.txt (226744 => 226745)


--- trunk/LayoutTests/http/tests/inspector/network/har/har-page-expected.txt	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/LayoutTests/http/tests/inspector/network/har/har-page-expected.txt	2018-01-11 00:45:49 UTC (rev 226745)
@@ -43,10 +43,10 @@
           "cookies": [],
           "headers": "<filtered>",
           "content": {
-            "size": 3042,
+            "size": "<filtered>",
             "compression": 0,
             "mimeType": "text/html",
-            "text": "<filtered text (3042)>"
+            "text": "<filtered text (3171)>"
           },
           "redirectURL": "",
           "headersSize": "<filtered>",
@@ -84,7 +84,7 @@
           "cookies": [],
           "headers": "<filtered>",
           "content": {
-            "size": 0,
+            "size": "<filtered>",
             "compression": 0,
             "mimeType": "application/x-_javascript_",
             "text": "<filtered text (7039)>"

Modified: trunk/LayoutTests/http/tests/inspector/network/har/har-page.html (226744 => 226745)


--- trunk/LayoutTests/http/tests/inspector/network/har/har-page.html	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/LayoutTests/http/tests/inspector/network/har/har-page.html	2018-01-11 00:45:49 UTC (rev 226745)
@@ -42,6 +42,9 @@
         // Reduce the file contents.
         if (key === "text")
             return "<filtered text (" + value.length + ")>";
+        // Reduce the file size since cache may or may not be used.
+        if (key === "size")
+            return "<filtered>";
 
         // Since cache may or may not be used, timing data may be variable.
         // NOTE: SSL should always be -1 for this test case.

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (226744 => 226745)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2018-01-11 00:45:49 UTC (rev 226745)
@@ -1,3 +1,12 @@
+2018-01-10  Youenn Fablet  <[email protected]>
+
+        Use no-cache fetch mode when loading main documents with location.reload()
+        https://bugs.webkit.org/show_bug.cgi?id=181285
+
+        Reviewed by Alex Christensen.
+
+        * web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt:
+
 2018-01-09  Chris Dumez  <[email protected]>
 
         We should not return undefined for most properties of a detached Window

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt (226744 => 226745)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt	2018-01-11 00:45:49 UTC (rev 226745)
@@ -1,5 +1,4 @@
 
-
 PASS Service Worker headers in the request of a fetch event 
 PASS Service Worker responds to fetch event with string 
 PASS Service Worker responds to fetch event with blob body 
@@ -12,7 +11,7 @@
 PASS Multiple calls of respondWith must throw InvalidStateErrors 
 PASS Service Worker event.respondWith must set the used flag 
 PASS Service Worker should expose FetchEvent URL fragments. 
-FAIL Service Worker responds to fetch event with the correct cache types assert_unreached: unexpected rejection: assert_equals: expected "no-cache" but got "default" Reached unreachable code
+PASS Service Worker responds to fetch event with the correct cache types 
 PASS Service Worker should intercept EventSource 
 PASS Service Worker responds to fetch event with the correct integrity_metadata 
 PASS FetchEvent#body is a string 

Modified: trunk/Source/WebCore/ChangeLog (226744 => 226745)


--- trunk/Source/WebCore/ChangeLog	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/Source/WebCore/ChangeLog	2018-01-11 00:45:49 UTC (rev 226745)
@@ -1,3 +1,32 @@
+2018-01-10  Youenn Fablet  <[email protected]>
+
+        Use no-cache fetch mode when loading main documents with location.reload()
+        https://bugs.webkit.org/show_bug.cgi?id=181285
+
+        Reviewed by Alex Christensen.
+
+        Covered by rebased tests.
+
+        Start to translate cache policy used for navigation as FetchOptions::Cache.
+        This allows ensuring service workers receive the right cache mode when intercepting navigation loads.
+        To not change current navigation behavior, ReturnCacheDataElseLoad and ReturnCacheDataDontLoad still trigger default fetch cache mode.
+
+        For Reload and ReloadExpiredOnly frame load types, using no-cache mode is more efficient than reload mode,
+        as a conditional request will be sent if possible. This applies to location.reload which is consistent with other browsers.
+        Keep reload mode for ReloadFromOrigin.
+
+        * loader/DocumentLoader.cpp:
+        (WebCore::toFetchOptionsCache):
+        (WebCore::DocumentLoader::loadMainResource):
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::loadFrameRequest):
+        (WebCore::FrameLoader::loadURL):
+        (WebCore::FrameLoader::load):
+        (WebCore::FrameLoader::reload):
+        (WebCore::FrameLoader::defaultRequestCachingPolicy):
+        (WebCore::FrameLoader::loadDifferentDocumentItem):
+        * loader/NavigationScheduler.cpp:
+
 2018-01-10  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r226667 and r226673.

Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (226744 => 226745)


--- trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-01-11 00:45:49 UTC (rev 226745)
@@ -1607,9 +1607,32 @@
     });
 }
 
+static inline FetchOptions::Cache toFetchOptionsCache(ResourceRequestCachePolicy policy)
+{
+    // We are setting FetchOptions::Cache values to keep current behavior consistency.
+    // FIXME: We should merge FetchOptions::Cache with ResourceRequestCachePolicy and merge related class members.
+    switch (policy) {
+    case UseProtocolCachePolicy:
+        return FetchOptions::Cache::Default;
+    case ReloadIgnoringCacheData:
+        return FetchOptions::Cache::Reload;
+    case ReturnCacheDataElseLoad:
+        return FetchOptions::Cache::Default;
+    case ReturnCacheDataDontLoad:
+        return FetchOptions::Cache::Default;
+    case DoNotUseAnyCache:
+        return FetchOptions::Cache::NoStore;
+    case RefreshAnyCacheData:
+        return FetchOptions::Cache::NoCache;
+    }
+    return FetchOptions::Cache::Default;
+}
+
 void DocumentLoader::loadMainResource(ResourceRequest&& request)
 {
-    static NeverDestroyed<ResourceLoaderOptions> mainResourceLoadOptions(SendCallbacks, SniffContent, BufferData, StoredCredentialsPolicy::Use, ClientCredentialPolicy::MayAskClientForCredentials, FetchOptions::Credentials::Include, SkipSecurityCheck, FetchOptions::Mode::Navigate, IncludeCertificateInfo, ContentSecurityPolicyImposition::SkipPolicyCheck, DefersLoadingPolicy::AllowDefersLoading, CachingPolicy::AllowCaching);
+    ResourceLoaderOptions mainResourceLoadOptions { SendCallbacks, SniffContent, BufferData, StoredCredentialsPolicy::Use, ClientCredentialPolicy::MayAskClientForCredentials, FetchOptions::Credentials::Include, SkipSecurityCheck, FetchOptions::Mode::Navigate, IncludeCertificateInfo, ContentSecurityPolicyImposition::SkipPolicyCheck, DefersLoadingPolicy::AllowDefersLoading, CachingPolicy::AllowCaching };
+    mainResourceLoadOptions.cache = toFetchOptionsCache(request.cachePolicy());
+
     CachedResourceRequest mainResourceRequest(ResourceRequest(request), mainResourceLoadOptions);
     if (!m_frame->isMainFrame() && m_frame->document()) {
         // If we are loading the main resource of a subframe, use the cache partition of the main document.

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (226744 => 226745)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2018-01-11 00:45:49 UTC (rev 226745)
@@ -1193,10 +1193,12 @@
         referrer = String();
 
     FrameLoadType loadType;
-    if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData)
+    if (request.resourceRequest().cachePolicy() == RefreshAnyCacheData)
         loadType = FrameLoadType::Reload;
     else if (request.lockBackForwardList() == LockBackForwardList::Yes)
         loadType = FrameLoadType::RedirectWithLockedBackForwardList;
+    else if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData)
+        loadType = FrameLoadType::ReloadFromOrigin;
     else
         loadType = FrameLoadType::Standard;
 
@@ -1281,7 +1283,7 @@
 
     addExtraFieldsToRequest(request, newLoadType, true);
     if (isReload(newLoadType))
-        request.setCachePolicy(ReloadIgnoringCacheData);
+        request.setCachePolicy(RefreshAnyCacheData);
 
     ASSERT(newLoadType != FrameLoadType::Same);
 
@@ -1416,7 +1418,7 @@
     FrameLoadType type;
 
     if (shouldTreatURLAsSameAsCurrent(newDocumentLoader->originalRequest().url())) {
-        r.setCachePolicy(ReloadIgnoringCacheData);
+        r.setCachePolicy(RefreshAnyCacheData);
         type = FrameLoadType::Same;
     } else if (shouldTreatURLAsSameAsCurrent(newDocumentLoader->unreachableURL()) && m_loadType == FrameLoadType::Reload)
         type = FrameLoadType::Reload;
@@ -1641,8 +1643,7 @@
     
     ResourceRequest& request = loader->request();
 
-    // FIXME: We don't have a mechanism to revalidate the main resource without reloading at the moment.
-    request.setCachePolicy(ReloadIgnoringCacheData);
+    request.setCachePolicy(RefreshAnyCacheData);
 
     // If we're about to re-post, set up action so the application can warn the user.
     if (request.httpMethod() == "POST")
@@ -2614,13 +2615,13 @@
 
     if (isMainResource) {
         if (isReload(loadType) || request.isConditional())
-            return ReloadIgnoringCacheData;
+            return loadType == FrameLoadType::ReloadFromOrigin ? ReloadIgnoringCacheData : RefreshAnyCacheData;
 
         return UseProtocolCachePolicy;
     }
 
     if (request.isConditional())
-        return ReloadIgnoringCacheData;
+        return RefreshAnyCacheData;
 
     if (documentLoader()->isLoadingInAPISense()) {
         // If we inherit cache policy from a main resource, we use the DocumentLoader's
@@ -3478,8 +3479,10 @@
     } else {
         switch (loadType) {
         case FrameLoadType::Reload:
+        case FrameLoadType::ReloadExpiredOnly:
+            request.setCachePolicy(RefreshAnyCacheData);
+            break;
         case FrameLoadType::ReloadFromOrigin:
-        case FrameLoadType::ReloadExpiredOnly:
             request.setCachePolicy(ReloadIgnoringCacheData);
             break;
         case FrameLoadType::Back:

Modified: trunk/Source/WebCore/loader/NavigationScheduler.cpp (226744 => 226745)


--- trunk/Source/WebCore/loader/NavigationScheduler.cpp	2018-01-11 00:14:15 UTC (rev 226744)
+++ trunk/Source/WebCore/loader/NavigationScheduler.cpp	2018-01-11 00:45:49 UTC (rev 226745)
@@ -182,7 +182,7 @@
         UserGestureIndicator gestureIndicator { userGestureToForward() };
 
         bool refresh = equalIgnoringFragmentIdentifier(frame.document()->url(), url());
-        ResourceRequest resourceRequest { url(), referrer(), refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy };
+        ResourceRequest resourceRequest { url(), referrer(), refresh ? RefreshAnyCacheData : UseProtocolCachePolicy };
         FrameLoadRequest frameLoadRequest { initiatingDocument(), *securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs(), initiatedByMainFrame() };
 
         frame.loader().changeLocation(WTFMove(frameLoadRequest));
@@ -216,7 +216,7 @@
     {
         UserGestureIndicator gestureIndicator { userGestureToForward() };
 
-        ResourceRequest resourceRequest { url(), referrer(), ReloadIgnoringCacheData };
+        ResourceRequest resourceRequest { url(), referrer(), RefreshAnyCacheData };
         FrameLoadRequest frameLoadRequest { initiatingDocument(), *securityOrigin(), resourceRequest, "_self", lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs(), initiatedByMainFrame() };
 
         frame.loader().changeLocation(WTFMove(frameLoadRequest));
@@ -319,7 +319,7 @@
         ResourceResponse replacementResponse { m_originDocument.url(), ASCIILiteral("text/plain"), 0, ASCIILiteral("UTF-8") };
         SubstituteData replacementData { SharedBuffer::create(), m_originDocument.url(), replacementResponse, SubstituteData::SessionHistoryVisibility::Hidden };
 
-        ResourceRequest resourceRequest { m_originDocument.url(), emptyString(), ReloadIgnoringCacheData };
+        ResourceRequest resourceRequest { m_originDocument.url(), emptyString(), RefreshAnyCacheData };
         FrameLoadRequest frameLoadRequest { m_originDocument, m_originDocument.securityOrigin(), resourceRequest, { }, lockHistory(), lockBackForwardList(), MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, shouldOpenExternalURLs(), initiatedByMainFrame() };
         frameLoadRequest.setSubstituteData(replacementData);
         frame.loader().load(WTFMove(frameLoadRequest));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to