Diff
Modified: trunk/LayoutTests/ChangeLog (214112 => 214113)
--- trunk/LayoutTests/ChangeLog 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/LayoutTests/ChangeLog 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1,3 +1,15 @@
+2017-03-17 Antti Koivisto <[email protected]>
+
+ Add a reload policy where only expired subresources are revalidated
+ https://bugs.webkit.org/show_bug.cgi?id=169756
+
+ Reviewed by Andreas Kling.
+
+ * http/tests/cache/reload-expired-only-expected.txt: Added.
+ * http/tests/cache/reload-expired-only.html: Added.
+ * http/tests/cache/resources/document-with-cached-unique-script.html: Added.
+ * http/tests/cache/resources/random-cached.cgi:
+
2017-03-17 Nan Wang <[email protected]>
AX: VoiceOver no longer works corectly with editable text in the web
Added: trunk/LayoutTests/http/tests/cache/reload-expired-only-expected.txt (0 => 214113)
--- trunk/LayoutTests/http/tests/cache/reload-expired-only-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/cache/reload-expired-only-expected.txt 2017-03-17 19:52:49 UTC (rev 214113)
@@ -0,0 +1 @@
+PASS
Added: trunk/LayoutTests/http/tests/cache/reload-expired-only.html (0 => 214113)
--- trunk/LayoutTests/http/tests/cache/reload-expired-only.html (rev 0)
+++ trunk/LayoutTests/http/tests/cache/reload-expired-only.html 2017-03-17 19:52:49 UTC (rev 214113)
@@ -0,0 +1,27 @@
+<body>
+<script>
+if (testRunner) {
+ testRunner.dumpAsText();
+ testRunner.setCanOpenWindows();
+ testRunner.waitUntilDone();
+}
+const testWindow = window.open('http://127.0.0.1:8000/cache/resources/document-with-cached-unique-script.html');
+
+var firstNumber;
+window.addEventListener("message", (event) => {
+ if (firstNumber) {
+ const secondNumber = event.data;
+ if (firstNumber == secondNumber)
+ document.body.innerHTML = "PASS";
+ else
+ document.body.innerHTML = `FAIL: firstNumber={$firstNumber} secondNumber={$secondNumber}`;
+ if (testRunner)
+ testRunner.notifyDone();
+ return;
+ }
+ firstNumber = event.data;
+ if (testWindow.internals)
+ testWindow.internals.reloadExpiredOnly();
+});
+
+</script>
Added: trunk/LayoutTests/http/tests/cache/resources/document-with-cached-unique-script.html (0 => 214113)
--- trunk/LayoutTests/http/tests/cache/resources/document-with-cached-unique-script.html (rev 0)
+++ trunk/LayoutTests/http/tests/cache/resources/document-with-cached-unique-script.html 2017-03-17 19:52:49 UTC (rev 214113)
@@ -0,0 +1,5 @@
+<h1></h1>
+<script src=''></script>
+<script>
+window.opener.postMessage(randomNumber, '*');
+</script>
Modified: trunk/LayoutTests/http/tests/cache/resources/random-cached.cgi (214112 => 214113)
--- trunk/LayoutTests/http/tests/cache/resources/random-cached.cgi 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/LayoutTests/http/tests/cache/resources/random-cached.cgi 2017-03-17 19:52:49 UTC (rev 214113)
@@ -2,7 +2,6 @@
print "Content-type: text/_javascript_\n";
print "Cache-control: max-age=60000\n";
-print "ETag: \"123456789\"\n";
print "\n";
my $random_number = int(rand(1000000000000));
Modified: trunk/Source/WebCore/ChangeLog (214112 => 214113)
--- trunk/Source/WebCore/ChangeLog 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/ChangeLog 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1,3 +1,66 @@
+2017-03-17 Antti Koivisto <[email protected]>
+
+ Add a reload policy where only expired subresources are revalidated
+ https://bugs.webkit.org/show_bug.cgi?id=169756
+
+ Reviewed by Andreas Kling.
+
+ Test: http/tests/cache/reload-expired-only.html
+
+ The default reload behavior revalidates all resources on the page. This patch adds
+ a new policy that revalidates expired (and uncacheable) resources only. Using this
+ policy can speed up reloads significantly and also reduce network traffic and server
+ load.
+
+ * history/PageCache.cpp:
+ (WebCore::canCachePage):
+ * inspector/InspectorPageAgent.cpp:
+ (WebCore::InspectorPageAgent::reload):
+ * loader/FrameLoader.cpp:
+ (WebCore::isBackForwardLoadType):
+ (WebCore::isReload):
+
+ Add a helper function.
+
+ (WebCore::FrameLoader::loadURL):
+ (WebCore::logNavigation):
+ (WebCore::FrameLoader::reload):
+
+ Replace bool arguments with OptionSet<ReloadOption>. Most of the patch is about adapting to this.
+
+ (WebCore::FrameLoader::transitionToCommitted):
+ (WebCore::FrameLoader::subresourceCachePolicy):
+
+ Return CachePolicyVerify for 'ReloadExpiredOnly' frame load type. This is the substantive
+ change that causes the behavior difference.
+
+ (WebCore::FrameLoader::checkLoadCompleteForThisFrame):
+ (WebCore::FrameLoader::defaultRequestCachingPolicy):
+
+ Flip the isMainResource condition for better readability.
+
+ (WebCore::FrameLoader::shouldPerformFragmentNavigation):
+ (WebCore::FrameLoader::loadDifferentDocumentItem):
+ * loader/FrameLoader.h:
+ (WebCore::FrameLoader::reload):
+ * loader/FrameLoaderTypes.h:
+ * loader/HistoryController.cpp:
+ (WebCore::HistoryController::restoreDocumentState):
+ * page/DiagnosticLoggingKeys.cpp:
+ (WebCore::DiagnosticLoggingKeys::reloadRevalidatingExpiredKey):
+ * page/DiagnosticLoggingKeys.h:
+ * replay/UserInputBridge.cpp:
+ (WebCore::UserInputBridge::reloadFrame):
+ * replay/UserInputBridge.h:
+ * testing/Internals.cpp:
+ (WebCore::Internals::forceReload):
+ (WebCore::Internals::reloadExpiredOnly):
+
+ Testing support.
+
+ * testing/Internals.h:
+ * testing/Internals.idl:
+
2017-03-17 Nan Wang <[email protected]>
AX: VoiceOver no longer works corectly with editable text in the web
Modified: trunk/Source/WebCore/history/PageCache.cpp (214112 => 214113)
--- trunk/Source/WebCore/history/PageCache.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/history/PageCache.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -249,6 +249,13 @@
isCacheable = false;
break;
}
+ case FrameLoadType::ReloadExpiredOnly: {
+ // No point writing to the cache on a reload, since we will just write over it again when we leave that page.
+ PCLOG(" -Load type is: ReloadRevalidatingExpired");
+ logPageCacheFailureDiagnosticMessage(diagnosticLoggingClient, DiagnosticLoggingKeys::reloadRevalidatingExpiredKey());
+ isCacheable = false;
+ break;
+ }
case FrameLoadType::Standard:
case FrameLoadType::Back:
case FrameLoadType::Forward:
Modified: trunk/Source/WebCore/inspector/InspectorPageAgent.cpp (214112 => 214113)
--- trunk/Source/WebCore/inspector/InspectorPageAgent.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/inspector/InspectorPageAgent.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -423,7 +423,11 @@
void InspectorPageAgent::reload(ErrorString&, const bool* const optionalIgnoreCache, const String* optionalScriptToEvaluateOnLoad)
{
m_pendingScriptToEvaluateOnLoadOnce = optionalScriptToEvaluateOnLoad ? *optionalScriptToEvaluateOnLoad : emptyString();
- m_page.mainFrame().loader().reload(optionalIgnoreCache ? *optionalIgnoreCache : false);
+
+ OptionSet<ReloadOption> reloadOptions;
+ if (optionalIgnoreCache && *optionalIgnoreCache)
+ reloadOptions |= ReloadOption::FromOrigin;
+ m_page.mainFrame().loader().reload(reloadOptions);
}
void InspectorPageAgent::navigate(ErrorString&, const String& url)
Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (214112 => 214113)
--- trunk/Source/WebCore/loader/FrameLoader.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -156,6 +156,7 @@
case FrameLoadType::Standard:
case FrameLoadType::Reload:
case FrameLoadType::ReloadFromOrigin:
+ case FrameLoadType::ReloadExpiredOnly:
case FrameLoadType::Same:
case FrameLoadType::RedirectWithLockedBackForwardList:
case FrameLoadType::Replace:
@@ -169,6 +170,26 @@
return false;
}
+bool isReload(FrameLoadType type)
+{
+ switch (type) {
+ case FrameLoadType::Reload:
+ case FrameLoadType::ReloadFromOrigin:
+ case FrameLoadType::ReloadExpiredOnly:
+ return true;
+ case FrameLoadType::Standard:
+ case FrameLoadType::Same:
+ case FrameLoadType::RedirectWithLockedBackForwardList:
+ case FrameLoadType::Replace:
+ case FrameLoadType::Back:
+ case FrameLoadType::Forward:
+ case FrameLoadType::IndexedBackForward:
+ return false;
+ }
+ ASSERT_NOT_REACHED();
+ return false;
+}
+
// This is not in the FrameLoader class to emphasize that it does not depend on
// private FrameLoader data, and to avoid increasing the number of public functions
// with access to private data. Since only this .cpp file needs it, making it
@@ -1213,7 +1234,7 @@
request.setDomainForCachePartition(m_frame.tree().top().document()->securityOrigin().domainForCachePartition());
addExtraFieldsToRequest(request, newLoadType, true);
- if (newLoadType == FrameLoadType::Reload || newLoadType == FrameLoadType::ReloadFromOrigin)
+ if (isReload(newLoadType))
request.setCachePolicy(ReloadIgnoringCacheData);
ASSERT(newLoadType != FrameLoadType::Same);
@@ -1266,7 +1287,7 @@
m_quickRedirectComing = false;
if (m_provisionalDocumentLoader)
m_provisionalDocumentLoader->setIsClientRedirect(true);
- } else if (sameURL && newLoadType != FrameLoadType::Reload && newLoadType != FrameLoadType::ReloadFromOrigin) {
+ } else if (sameURL && !isReload(newLoadType)) {
// Example of this case are sites that reload the same URL with a different cookie
// driving the generated content, or a master frame with links that drive a target
// frame, where the user has clicked on the same link repeatedly.
@@ -1404,6 +1425,9 @@
case FrameLoadType::ReloadFromOrigin:
navigationDescription = ASCIILiteral("reloadFromOrigin");
break;
+ case FrameLoadType::ReloadExpiredOnly:
+ navigationDescription = ASCIILiteral("reloadRevalidatingExpired");
+ break;
case FrameLoadType::Replace:
case FrameLoadType::RedirectWithLockedBackForwardList:
// Not logging those for now.
@@ -1576,7 +1600,7 @@
loadWithDocumentLoader(loader.ptr(), FrameLoadType::Reload, 0, AllowNavigationToInvalidURL::Yes);
}
-void FrameLoader::reload(bool endToEndReload, bool contentBlockersEnabled)
+void FrameLoader::reload(OptionSet<ReloadOption> options)
{
if (!m_documentLoader)
return;
@@ -1597,7 +1621,7 @@
Ref<DocumentLoader> loader = m_client.createDocumentLoader(initialRequest, defaultSubstituteDataForURL(initialRequest.url()));
applyShouldOpenExternalURLsPolicyToNewDocumentLoader(loader, m_documentLoader->shouldOpenExternalURLsPolicyToPropagate());
- loader->setUserContentExtensionsEnabled(contentBlockersEnabled);
+ loader->setUserContentExtensionsEnabled(!options.contains(ReloadOption::DisableContentBlockers));
ResourceRequest& request = loader->request();
@@ -1609,8 +1633,16 @@
loader->setTriggeringAction(NavigationAction(request, NavigationType::FormResubmitted));
loader->setOverrideEncoding(m_documentLoader->overrideEncoding());
+
+ auto frameLoadTypeForReloadOptions = [] (auto options) {
+ if (options.contains(ReloadOption::FromOrigin))
+ return FrameLoadType::ReloadFromOrigin;
+ if (options.contains(ReloadOption::ExpiredOnly))
+ return FrameLoadType::ReloadExpiredOnly;
+ return FrameLoadType::Reload;
+ };
- loadWithDocumentLoader(loader.ptr(), endToEndReload ? FrameLoadType::ReloadFromOrigin : FrameLoadType::Reload, 0, AllowNavigationToInvalidURL::Yes);
+ loadWithDocumentLoader(loader.ptr(), frameLoadTypeForReloadOptions(options), 0, AllowNavigationToInvalidURL::Yes);
}
void FrameLoader::stopAllLoaders(ClearProvisionalItemPolicy clearProvisionalItemPolicy)
@@ -1972,6 +2004,7 @@
case FrameLoadType::Reload:
case FrameLoadType::ReloadFromOrigin:
+ case FrameLoadType::ReloadExpiredOnly:
case FrameLoadType::Same:
case FrameLoadType::Replace:
history().updateForReload();
@@ -1989,11 +2022,6 @@
history().updateForRedirectWithLockedBackForwardList();
m_client.transitionToCommittedForNewPage();
break;
-
- // FIXME Remove this check when dummy ds is removed (whatever "dummy ds" is).
- // An exception should be thrown if we're in the FrameLoadTypeUninitialized state.
- default:
- ASSERT_NOT_REACHED();
}
m_documentLoader->writer().setMIMEType(dl->responseMIMEType());
@@ -2229,6 +2257,7 @@
case FrameLoadType::Replace:
case FrameLoadType::Same:
case FrameLoadType::Standard:
+ case FrameLoadType::ReloadExpiredOnly:
return CachePolicyVerify;
}
@@ -2315,7 +2344,7 @@
// If the user had a scroll point, scroll to it, overriding the anchor point if any.
if (m_frame.page()) {
- if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadType::Reload || m_loadType == FrameLoadType::ReloadFromOrigin)
+ if (isBackForwardLoadType(m_loadType) || isReload(m_loadType))
history().restoreScrollPositionAndViewState();
}
@@ -2613,27 +2642,31 @@
{
if (m_overrideCachePolicyForTesting)
return m_overrideCachePolicyForTesting.value();
- if (!isMainResource) {
- if (request.isConditional())
+
+ if (isMainResource) {
+ if (isReload(loadType) || request.isConditional())
return ReloadIgnoringCacheData;
- if (documentLoader()->isLoadingInAPISense()) {
- // If we inherit cache policy from a main resource, we use the DocumentLoader's
- // original request cache policy for two reasons:
- // 1. For POST requests, we mutate the cache policy for the main resource,
- // but we do not want this to apply to subresources
- // 2. Delegates that modify the cache policy using willSendRequest: should
- // not affect any other resources. Such changes need to be done
- // per request.
- ResourceRequestCachePolicy mainDocumentOriginalCachePolicy = documentLoader()->originalRequest().cachePolicy();
- // Back-forward navigations try to load main resource from cache only to avoid re-submitting form data, and start over (with a warning dialog) if that fails.
- // This policy is set on initial request too, but should not be inherited.
- return (mainDocumentOriginalCachePolicy == ReturnCacheDataDontLoad) ? ReturnCacheDataElseLoad : mainDocumentOriginalCachePolicy;
- }
- // FIXME: Other FrameLoader functions have duplicated code for setting cache policy of main request when reloading.
- // It seems better to manage it explicitly than to hide the logic inside addExtraFieldsToRequest().
- } else if (loadType == FrameLoadType::Reload || loadType == FrameLoadType::ReloadFromOrigin || request.isConditional())
+
+ return UseProtocolCachePolicy;
+ }
+
+ if (request.isConditional())
return ReloadIgnoringCacheData;
+ if (documentLoader()->isLoadingInAPISense()) {
+ // If we inherit cache policy from a main resource, we use the DocumentLoader's
+ // original request cache policy for two reasons:
+ // 1. For POST requests, we mutate the cache policy for the main resource,
+ // but we do not want this to apply to subresources
+ // 2. Delegates that modify the cache policy using willSendRequest: should
+ // not affect any other resources. Such changes need to be done
+ // per request.
+ ResourceRequestCachePolicy mainDocumentOriginalCachePolicy = documentLoader()->originalRequest().cachePolicy();
+ // Back-forward navigations try to load main resource from cache only to avoid re-submitting form data, and start over (with a warning dialog) if that fails.
+ // This policy is set on initial request too, but should not be inherited.
+ return (mainDocumentOriginalCachePolicy == ReturnCacheDataDontLoad) ? ReturnCacheDataElseLoad : mainDocumentOriginalCachePolicy;
+ }
+
return UseProtocolCachePolicy;
}
@@ -2899,8 +2932,7 @@
// FIXME: What about load types other than Standard and Reload?
return (!isFormSubmission || equalLettersIgnoringASCIICase(httpMethod, "get"))
- && loadType != FrameLoadType::Reload
- && loadType != FrameLoadType::ReloadFromOrigin
+ && !isReload(loadType)
&& loadType != FrameLoadType::Same
&& !shouldReload(m_frame.document()->url(), url)
// We don't want to just scroll if a link from within a
@@ -3447,6 +3479,7 @@
switch (loadType) {
case FrameLoadType::Reload:
case FrameLoadType::ReloadFromOrigin:
+ case FrameLoadType::ReloadExpiredOnly:
request.setCachePolicy(ReloadIgnoringCacheData);
break;
case FrameLoadType::Back:
@@ -3466,7 +3499,7 @@
case FrameLoadType::RedirectWithLockedBackForwardList:
break;
case FrameLoadType::Same:
- default:
+ case FrameLoadType::Replace:
ASSERT_NOT_REACHED();
}
Modified: trunk/Source/WebCore/loader/FrameLoader.h (214112 => 214113)
--- trunk/Source/WebCore/loader/FrameLoader.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/loader/FrameLoader.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -81,6 +81,7 @@
struct WindowFeatures;
WEBCORE_EXPORT bool isBackForwardLoadType(FrameLoadType);
+WEBCORE_EXPORT bool isReload(FrameLoadType);
class FrameLoader {
WTF_MAKE_NONCOPYABLE(FrameLoader);
@@ -119,7 +120,7 @@
WEBCORE_EXPORT void urlSelected(const URL&, const String& target, Event*, LockHistory, LockBackForwardList, ShouldSendReferrer, ShouldOpenExternalURLsPolicy, std::optional<NewFrameOpenerPolicy> = std::nullopt, const AtomicString& downloadAttribute = nullAtom);
void submitForm(Ref<FormSubmission>&&);
- WEBCORE_EXPORT void reload(bool endToEndReload = false, bool contentBlockersEnabled = true);
+ WEBCORE_EXPORT void reload(OptionSet<ReloadOption> = { });
WEBCORE_EXPORT void reloadWithOverrideEncoding(const String& overrideEncoding);
void open(CachedFrameBase&);
Modified: trunk/Source/WebCore/loader/FrameLoaderTypes.h (214112 => 214113)
--- trunk/Source/WebCore/loader/FrameLoaderTypes.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/loader/FrameLoaderTypes.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -28,6 +28,8 @@
#pragma once
+#include <wtf/OptionSet.h>
+
namespace WebCore {
enum FrameState {
@@ -44,6 +46,12 @@
PolicyIgnore
};
+enum class ReloadOption {
+ ExpiredOnly = 1 << 0,
+ FromOrigin = 1 << 1,
+ DisableContentBlockers = 1 << 2,
+};
+
enum class FrameLoadType {
Standard,
Back,
@@ -54,6 +62,7 @@
RedirectWithLockedBackForwardList, // FIXME: Merge "lockBackForwardList", "lockHistory", "quickRedirect" and "clientRedirect" into a single concept of redirect.
Replace,
ReloadFromOrigin,
+ ReloadExpiredOnly
};
enum class NewFrameOpenerPolicy {
Modified: trunk/Source/WebCore/loader/HistoryController.cpp (214112 => 214113)
--- trunk/Source/WebCore/loader/HistoryController.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/loader/HistoryController.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -229,6 +229,7 @@
switch (m_frame.loader().loadType()) {
case FrameLoadType::Reload:
case FrameLoadType::ReloadFromOrigin:
+ case FrameLoadType::ReloadExpiredOnly:
case FrameLoadType::Same:
case FrameLoadType::Replace:
// Not restoring the document state.
Modified: trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp (214112 => 214113)
--- trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -488,6 +488,11 @@
return ASCIILiteral("reloadFromOrigin");
}
+String DiagnosticLoggingKeys::reloadRevalidatingExpiredKey()
+{
+ return ASCIILiteral("reloadRevalidatingExpired");
+}
+
String DiagnosticLoggingKeys::sameLoadKey()
{
return ASCIILiteral("sameLoad");
Modified: trunk/Source/WebCore/page/DiagnosticLoggingKeys.h (214112 => 214113)
--- trunk/Source/WebCore/page/DiagnosticLoggingKeys.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/page/DiagnosticLoggingKeys.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -123,6 +123,7 @@
static String redirectKey();
static String reloadFromOriginKey();
static String reloadKey();
+ static String reloadRevalidatingExpiredKey();
static String replaceKey();
static String resourceLoadedKey();
static String resourceResponseSourceKey();
Modified: trunk/Source/WebCore/replay/UserInputBridge.cpp (214112 => 214113)
--- trunk/Source/WebCore/replay/UserInputBridge.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/replay/UserInputBridge.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -242,9 +242,9 @@
m_page.mainFrame().loader().load(request);
}
-void UserInputBridge::reloadFrame(Frame* frame, bool endToEndReload, bool contentBlockersEnabled, InputSource)
+void UserInputBridge::reloadFrame(Frame* frame, OptionSet<ReloadOption> options, InputSource)
{
- frame->loader().reload(endToEndReload, contentBlockersEnabled);
+ frame->loader().reload(options);
}
void UserInputBridge::stopLoadingFrame(Frame* frame, InputSource)
Modified: trunk/Source/WebCore/replay/UserInputBridge.h (214112 => 214113)
--- trunk/Source/WebCore/replay/UserInputBridge.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/replay/UserInputBridge.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -27,6 +27,7 @@
#pragma once
+#include "FrameLoaderTypes.h"
#include "ScrollTypes.h"
#include <wtf/Noncopyable.h>
@@ -88,7 +89,7 @@
// Navigation APIs.
WEBCORE_EXPORT void loadRequest(const FrameLoadRequest&, InputSource source = InputSource::User);
- WEBCORE_EXPORT void reloadFrame(Frame*, bool endToEndReload, bool contentBlockersEnabled, InputSource = InputSource::User);
+ WEBCORE_EXPORT void reloadFrame(Frame*, OptionSet<ReloadOption>, InputSource = InputSource::User);
WEBCORE_EXPORT void stopLoadingFrame(Frame*, InputSource source = InputSource::User);
WEBCORE_EXPORT bool tryClosePage(InputSource source = InputSource::User);
Modified: trunk/Source/WebCore/testing/Internals.cpp (214112 => 214113)
--- trunk/Source/WebCore/testing/Internals.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/testing/Internals.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -2838,9 +2838,18 @@
void Internals::forceReload(bool endToEnd)
{
- frame()->loader().reload(endToEnd);
+ OptionSet<ReloadOption> reloadOptions;
+ if (endToEnd)
+ reloadOptions |= ReloadOption::FromOrigin;
+
+ frame()->loader().reload(reloadOptions);
}
+void Internals::reloadExpiredOnly()
+{
+ frame()->loader().reload(ReloadOption::ExpiredOnly);
+}
+
void Internals::enableAutoSizeMode(bool enabled, int minimumWidth, int minimumHeight, int maximumWidth, int maximumHeight)
{
auto* document = contextDocument();
Modified: trunk/Source/WebCore/testing/Internals.h (214112 => 214113)
--- trunk/Source/WebCore/testing/Internals.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/testing/Internals.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -388,6 +388,7 @@
String toolTipFromElement(Element&) const;
void forceReload(bool endToEnd);
+ void reloadExpiredOnly();
void enableAutoSizeMode(bool enabled, int minimumWidth, int minimumHeight, int maximumWidth, int maximumHeight);
Modified: trunk/Source/WebCore/testing/Internals.idl (214112 => 214113)
--- trunk/Source/WebCore/testing/Internals.idl 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebCore/testing/Internals.idl 2017-03-17 19:52:49 UTC (rev 214113)
@@ -392,6 +392,7 @@
void setUsesMockScrollAnimator(boolean enabled);
void forceReload(boolean endToEnd);
+ void reloadExpiredOnly();
void enableAutoSizeMode(boolean enabled, long minimumWidth, long minimumHeight, long maximumWidth, long maximumHeight);
Modified: trunk/Source/WebKit/mac/ChangeLog (214112 => 214113)
--- trunk/Source/WebKit/mac/ChangeLog 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit/mac/ChangeLog 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1,3 +1,15 @@
+2017-03-17 Antti Koivisto <[email protected]>
+
+ Add a reload policy where only expired subresources are revalidated
+ https://bugs.webkit.org/show_bug.cgi?id=169756
+
+ Reviewed by Andreas Kling.
+
+ * WebView/WebFrame.mm:
+ (toWebFrameLoadType):
+ (-[WebFrame reload]):
+ (-[WebFrame reloadFromOrigin]):
+
2017-03-17 Wenson Hsieh <[email protected]>
[WK1] Support animated transitions when performing a data interaction operation
Modified: trunk/Source/WebKit/mac/WebView/WebFrame.mm (214112 => 214113)
--- trunk/Source/WebKit/mac/WebView/WebFrame.mm 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit/mac/WebView/WebFrame.mm 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1059,6 +1059,9 @@
return WebFrameLoadTypeReplace;
case FrameLoadType::ReloadFromOrigin:
return WebFrameLoadTypeReloadFromOrigin;
+ case FrameLoadType::ReloadExpiredOnly:
+ ASSERT_NOT_REACHED();
+ return WebFrameLoadTypeReload;
}
}
@@ -2539,12 +2542,12 @@
- (void)reload
{
- _private->coreFrame->loader().reload(false);
+ _private->coreFrame->loader().reload({ });
}
- (void)reloadFromOrigin
{
- _private->coreFrame->loader().reload(true);
+ _private->coreFrame->loader().reload(WebCore::ReloadOption::FromOrigin);
}
- (WebFrame *)findFrameNamed:(NSString *)name
Modified: trunk/Source/WebKit/win/WebFrame.cpp (214112 => 214113)
--- trunk/Source/WebKit/win/WebFrame.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit/win/WebFrame.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -306,7 +306,7 @@
if (!coreFrame)
return E_UNEXPECTED;
- coreFrame->loader().reload(true);
+ coreFrame->loader().reload(WebCore::ReloadOption::FromOrigin);
return S_OK;
}
Modified: trunk/Source/WebKit2/ChangeLog (214112 => 214113)
--- trunk/Source/WebKit2/ChangeLog 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/ChangeLog 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1,3 +1,38 @@
+2017-03-17 Antti Koivisto <[email protected]>
+
+ Add a reload policy where only expired subresources are revalidated
+ https://bugs.webkit.org/show_bug.cgi?id=169756
+
+ Reviewed by Andreas Kling.
+
+ * UIProcess/API/C/WKPage.cpp:
+ (WKPageReload):
+ (WKPageReloadWithoutContentBlockers):
+ (WKPageReloadFromOrigin):
+ (WKPageReloadExpiredOnly):
+ * UIProcess/API/C/WKPage.h:
+ * UIProcess/API/Cocoa/WKBrowsingContextController.mm:
+ (-[WKBrowsingContextController reload]):
+ (-[WKBrowsingContextController reloadFromOrigin]):
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView reload]):
+ (-[WKWebView reloadFromOrigin]):
+ (-[WKWebView _reloadWithoutContentBlockers]):
+ (-[WKWebView _reloadExpiredOnly]):
+ * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+ * UIProcess/Automation/WebAutomationSession.cpp:
+ (WebKit::WebAutomationSession::reloadBrowsingContext):
+ * UIProcess/WebFrameProxy.cpp:
+ (WebKit::WebFrameProxy::didHandleContentFilterUnblockNavigation):
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::reload):
+ * UIProcess/WebPageProxy.h:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::reload):
+ (WebKit::shouldReuseCommittedSandboxExtension):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+
2017-03-16 Alex Christensen <[email protected]>
Use completion handlers instead of return values for sending websocket data
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -242,25 +242,24 @@
void WKPageReload(WKPageRef pageRef)
{
- const bool reloadFromOrigin = false;
- const bool contentBlockersEnabled = true;
- toImpl(pageRef)->reload(reloadFromOrigin, contentBlockersEnabled);
+ toImpl(pageRef)->reload({ });
}
void WKPageReloadWithoutContentBlockers(WKPageRef pageRef)
{
- const bool reloadFromOrigin = false;
- const bool contentBlockersEnabled = false;
- toImpl(pageRef)->reload(reloadFromOrigin, contentBlockersEnabled);
+ toImpl(pageRef)->reload(WebCore::ReloadOption::DisableContentBlockers);
}
void WKPageReloadFromOrigin(WKPageRef pageRef)
{
- const bool reloadFromOrigin = true;
- const bool contentBlockersEnabled = true;
- toImpl(pageRef)->reload(reloadFromOrigin, contentBlockersEnabled);
+ toImpl(pageRef)->reload(WebCore::ReloadOption::FromOrigin);
}
+void WKPageReloadExpiredOnly(WKPageRef pageRef)
+{
+ toImpl(pageRef)->reload(WebCore::ReloadOption::ExpiredOnly);
+}
+
bool WKPageTryClose(WKPageRef pageRef)
{
return toImpl(pageRef)->tryClose();
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.h (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -84,6 +84,7 @@
WK_EXPORT void WKPageReload(WKPageRef page);
WK_EXPORT void WKPageReloadWithoutContentBlockers(WKPageRef page);
WK_EXPORT void WKPageReloadFromOrigin(WKPageRef page);
+WK_EXPORT void WKPageReloadExpiredOnly(WKPageRef page);
WK_EXPORT bool WKPageTryClose(WKPageRef page);
WK_EXPORT void WKPageClose(WKPageRef page);
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKBrowsingContextController.mm (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKBrowsingContextController.mm 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKBrowsingContextController.mm 2017-03-17 19:52:49 UTC (rev 214113)
@@ -187,16 +187,12 @@
- (void)reload
{
- const bool reloadFromOrigin = false;
- const bool contentBlockersEnabled = true;
- _page->reload(reloadFromOrigin, contentBlockersEnabled);
+ _page->reload({ });
}
- (void)reloadFromOrigin
{
- const bool reloadFromOrigin = true;
- const bool contentBlockersEnabled = true;
- _page->reload(reloadFromOrigin, contentBlockersEnabled);
+ _page->reload(WebCore::ReloadOption::FromOrigin);
}
- (NSString *)applicationNameForUserAgent
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2017-03-17 19:52:49 UTC (rev 214113)
@@ -844,9 +844,7 @@
- (WKNavigation *)reload
{
- const bool reloadFromOrigin = false;
- const bool contentBlockersEnabled = true;
- auto navigation = _page->reload(reloadFromOrigin, contentBlockersEnabled);
+ auto navigation = _page->reload({ });
if (!navigation)
return nil;
@@ -855,9 +853,7 @@
- (WKNavigation *)reloadFromOrigin
{
- const bool reloadFromOrigin = true;
- const bool contentBlockersEnabled = true;
- auto navigation = _page->reload(reloadFromOrigin, contentBlockersEnabled);
+ auto navigation = _page->reload(WebCore::ReloadOption::FromOrigin);
if (!navigation)
return nil;
@@ -3692,9 +3688,7 @@
- (WKNavigation *)_reloadWithoutContentBlockers
{
- const bool reloadFromOrigin = false;
- const bool contentBlockersEnabled = false;
- auto navigation = _page->reload(reloadFromOrigin, contentBlockersEnabled);
+ auto navigation = _page->reload(WebCore::ReloadOption::DisableContentBlockers);
if (!navigation)
return nil;
@@ -3701,6 +3695,15 @@
return [wrapper(*navigation.leakRef()) autorelease];
}
+- (WKNavigation *)_reloadExpiredOnly
+{
+ auto navigation = _page->reload(WebCore::ReloadOption::ExpiredOnly);
+ if (!navigation)
+ return nil;
+
+ return [wrapper(*navigation.leakRef()) autorelease];
+}
+
- (void)_killWebContentProcessAndResetState
{
_page->terminateProcess();
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -228,6 +228,7 @@
#endif
- (WKNavigation *)_reloadWithoutContentBlockers WK_API_AVAILABLE(macosx(10.12), ios(10.0));
+- (WKNavigation *)_reloadExpiredOnly WK_API_AVAILABLE(macosx(10.13), ios(11.0));
- (void)_killWebContentProcessAndResetState;
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -2539,9 +2539,7 @@
{
g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
- const bool reloadFromOrigin = false;
- const bool contentBlockersEnabled = true;
- getPage(webView)->reload(reloadFromOrigin, contentBlockersEnabled);
+ getPage(webView)->reload({ });
}
/**
@@ -2555,9 +2553,7 @@
{
g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
- const bool reloadFromOrigin = true;
- const bool contentBlockersEnabled = true;
- getPage(webView)->reload(reloadFromOrigin, contentBlockersEnabled);
+ getPage(webView)->reload(WebCore::ReloadOption::FromOrigin);
}
/**
Modified: trunk/Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -341,8 +341,7 @@
callback->sendFailure(STRING_FOR_PREDEFINED_ERROR_NAME(Timeout));
m_pendingNavigationInBrowsingContextCallbacksPerPage.set(page->pageID(), WTFMove(callback));
- const bool reloadFromOrigin = false;
- page->reload(reloadFromOrigin, { });
+ page->reload({ });
}
void WebAutomationSession::navigationOccurredForPage(const WebPageProxy& page)
Modified: trunk/Source/WebKit2/UIProcess/WebFrameProxy.cpp (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/WebFrameProxy.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/WebFrameProxy.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -248,11 +248,8 @@
RefPtr<WebPageProxy> page { m_page };
ASSERT(page);
m_contentFilterUnblockHandler.requestUnblockAsync([page](bool unblocked) {
- if (unblocked) {
- const bool reloadFromOrigin = false;
- const bool contentBlockersEnabled = true;
- page->reload(reloadFromOrigin, contentBlockersEnabled);
- }
+ if (unblocked)
+ page->reload({ });
});
return true;
}
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1164,7 +1164,7 @@
m_process->responsivenessTimer().start();
}
-RefPtr<API::Navigation> WebPageProxy::reload(bool reloadFromOrigin, bool contentBlockersEnabled)
+RefPtr<API::Navigation> WebPageProxy::reload(OptionSet<WebCore::ReloadOption> options)
{
SandboxExtension::Handle sandboxExtensionHandle;
@@ -1187,7 +1187,7 @@
auto navigation = m_navigationState->createReloadNavigation();
- m_process->send(Messages::WebPage::Reload(navigation->navigationID(), reloadFromOrigin, contentBlockersEnabled, sandboxExtensionHandle), m_pageID);
+ m_process->send(Messages::WebPage::Reload(navigation->navigationID(), options.toRaw(), sandboxExtensionHandle), m_pageID);
m_process->responsivenessTimer().start();
return WTFMove(navigation);
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (214112 => 214113)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -404,7 +404,7 @@
void navigateToPDFLinkWithSimulatedClick(const String& url, WebCore::IntPoint documentPoint, WebCore::IntPoint screenPoint);
void stopLoading();
- RefPtr<API::Navigation> reload(bool reloadFromOrigin, bool contentBlockersEnabled);
+ RefPtr<API::Navigation> reload(OptionSet<WebCore::ReloadOption>);
RefPtr<API::Navigation> goForward();
RefPtr<API::Navigation> goBack();
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (214112 => 214113)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1315,7 +1315,7 @@
m_page->setDefersLoading(defersLoading);
}
-void WebPage::reload(uint64_t navigationID, bool reloadFromOrigin, bool contentBlockersEnabled, const SandboxExtension::Handle& sandboxExtensionHandle)
+void WebPage::reload(uint64_t navigationID, uint32_t reloadOptions, const SandboxExtension::Handle& sandboxExtensionHandle)
{
SendStopResponsivenessTimer stopper(this);
@@ -1323,7 +1323,7 @@
m_pendingNavigationID = navigationID;
m_sandboxExtensionTracker.beginLoad(m_mainFrame.get(), sandboxExtensionHandle);
- corePage()->userInputBridge().reloadFrame(m_mainFrame->coreFrame(), reloadFromOrigin, contentBlockersEnabled);
+ corePage()->userInputBridge().reloadFrame(m_mainFrame->coreFrame(), OptionSet<ReloadOption>::fromRaw(reloadOptions));
}
void WebPage::goForward(uint64_t navigationID, uint64_t backForwardItemID)
@@ -4140,7 +4140,7 @@
FrameLoadType frameLoadType = frameLoader.loadType();
// If the page is being reloaded, it should reuse whatever extension is committed.
- if (frameLoadType == FrameLoadType::Reload || frameLoadType == FrameLoadType::ReloadFromOrigin)
+ if (isReload(frameLoadType))
return true;
DocumentLoader* documentLoader = frameLoader.documentLoader();
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (214112 => 214113)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2017-03-17 19:52:49 UTC (rev 214113)
@@ -1047,7 +1047,7 @@
void loadString(const LoadParameters&);
void loadAlternateHTMLString(const LoadParameters&);
void navigateToPDFLinkWithSimulatedClick(const String& url, WebCore::IntPoint documentPoint, WebCore::IntPoint screenPoint);
- void reload(uint64_t navigationID, bool reloadFromOrigin, bool contentBlockersEnabled, const SandboxExtension::Handle&);
+ void reload(uint64_t navigationID, uint32_t reloadOptions, const SandboxExtension::Handle&);
void goForward(uint64_t navigationID, uint64_t);
void goBack(uint64_t navigationID, uint64_t);
void goToBackForwardItem(uint64_t navigationID, uint64_t);
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (214112 => 214113)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in 2017-03-17 19:48:36 UTC (rev 214112)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in 2017-03-17 19:52:49 UTC (rev 214113)
@@ -140,7 +140,7 @@
NavigateToPDFLinkWithSimulatedClick(String url, WebCore::IntPoint documentPoint, WebCore::IntPoint screenPoint)
- Reload(uint64_t navigationID, bool reloadFromOrigin, bool contentBlockersEnabled, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
+ Reload(uint64_t navigationID, uint32_t reloadOptions, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
StopLoading()
StopLoadingFrame(uint64_t frameID)