WebKit Bugzilla
Attachment 341810 Details for
Bug 186213
: [Wi-Fi Assertions] Add retry logic
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-186213-20180601172644.patch (text/plain), 17.03 KB, created by
Andy Estes
on 2018-06-01 17:26:45 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Andy Estes
Created:
2018-06-01 17:26:45 PDT
Size:
17.03 KB
patch
obsolete
>Subversion Revision: 232415 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 017c328c0d48825bae6dea574da4e89add1ea7c0..b5ea2f962455d52fba6f700975f6f8301db67307 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,17 @@ >+2018-06-01 Andy Estes <aestes@apple.com> >+ >+ [Wi-Fi Assertions] Add retry logic >+ https://bugs.webkit.org/show_bug.cgi?id=186213 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests (OOPS!). >+ >+ * platform/network/ResourceErrorBase.h: >+ (WebCore::ResourceErrorBase::isNotConnectedToInternet const): >+ * platform/network/mac/ResourceErrorMac.mm: >+ (WebCore::ResourceError::mapPlatformError): >+ > 2018-06-01 Sihui Liu <sihui_liu@apple.com> > > Stop using StorageTracker.db in LocalStorageDatabaseTracker >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index a7680ff4a9b62cedfeab120468bbfe45be34a74e..20f2b0ede6c1fb91a20a8a2fe871db48380f38f1 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,29 @@ >+2018-06-01 Andy Estes <aestes@apple.com> >+ >+ [Wi-Fi Assertions] Add retry logic >+ https://bugs.webkit.org/show_bug.cgi?id=186213 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * NetworkProcess/NetworkDataTask.cpp: >+ (WebKit::NetworkDataTask::create): >+ * NetworkProcess/NetworkDataTask.h: >+ (WebKit::NetworkDataTask::session const): >+ (WebKit::NetworkDataTask::holdsWiFiAssertion const): >+ * NetworkProcess/NetworkLoad.cpp: >+ (WebKit::NetworkLoad::shouldRetry const): >+ (WebKit::NetworkLoad::retry): >+ (WebKit::NetworkLoad::willPerformHTTPRedirection): >+ (WebKit::NetworkLoad::didReceiveChallenge): >+ (WebKit::NetworkLoad::didReceiveResponseNetworkSession): >+ (WebKit::NetworkLoad::didReceiveData): >+ (WebKit::NetworkLoad::didCompleteWithError): >+ * NetworkProcess/NetworkLoad.h: >+ * NetworkProcess/NetworkLoadParameters.h: >+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.h: >+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm: >+ (WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa): >+ > 2018-06-01 Jiewen Tan <jiewen_tan@apple.com> > > Unreviewed, build fix for r232276. >diff --git a/Source/WebCore/platform/network/ResourceErrorBase.h b/Source/WebCore/platform/network/ResourceErrorBase.h >index 073cacb6dc4f354aa81e4c07755265146ad077b8..83cbb792544c0ca9b604d06c75b5e7ce7c16064d 100644 >--- a/Source/WebCore/platform/network/ResourceErrorBase.h >+++ b/Source/WebCore/platform/network/ResourceErrorBase.h >@@ -49,7 +49,8 @@ public: > General, > AccessControl, > Cancellation, >- Timeout >+ Timeout, >+ NotConnectedToInternet, > }; > > bool isNull() const { return m_type == Type::Null; } >@@ -57,6 +58,7 @@ public: > bool isAccessControl() const { return m_type == Type::AccessControl; } > bool isCancellation() const { return m_type == Type::Cancellation; } > bool isTimeout() const { return m_type == Type::Timeout; } >+ bool isNotConnectedToInternet() const { return m_type == Type::NotConnectedToInternet; } > > static bool compare(const ResourceError&, const ResourceError&); > >diff --git a/Source/WebCore/platform/network/mac/ResourceErrorMac.mm b/Source/WebCore/platform/network/mac/ResourceErrorMac.mm >index a27a9b18afe430501efe7005aabdfdf699d5613e..68ccb366bb64c7f6f64c929e10624fb1259eb033 100644 >--- a/Source/WebCore/platform/network/mac/ResourceErrorMac.mm >+++ b/Source/WebCore/platform/network/mac/ResourceErrorMac.mm >@@ -146,7 +146,7 @@ void ResourceError::mapPlatformError() > auto errorCode = [m_platformError.get() code]; > > if ([domain isEqualToString:NSURLErrorDomain] || [domain isEqualToString:(__bridge NSString *)kCFErrorDomainCFNetwork]) >- setType((errorCode == NSURLErrorTimedOut) ? Type::Timeout : (errorCode == NSURLErrorCancelled) ? Type::Cancellation : Type::General); >+ setType((errorCode == NSURLErrorTimedOut) ? Type::Timeout : (errorCode == NSURLErrorCancelled) ? Type::Cancellation : (errorCode == NSURLErrorNotConnectedToInternet) ? Type::NotConnectedToInternet : Type::General); > else > setType(Type::General); > } >diff --git a/Source/WebKit/NetworkProcess/NetworkDataTask.cpp b/Source/WebKit/NetworkProcess/NetworkDataTask.cpp >index 1524d3cf3235ccc383f250211a85fa52f84f9338..0e2943d6baad703781fbea1714c319f91456c31e 100644 >--- a/Source/WebKit/NetworkProcess/NetworkDataTask.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkDataTask.cpp >@@ -54,7 +54,7 @@ Ref<NetworkDataTask> NetworkDataTask::create(NetworkSession& session, NetworkDat > return NetworkDataTaskBlob::create(session, client, parameters.request, parameters.contentSniffingPolicy, parameters.blobFileReferences); > > #if PLATFORM(COCOA) >- return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation, parameters.networkActivityTracker); >+ return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation, parameters.networkActivityTracker, parameters.isRetry); > #endif > #if USE(SOUP) > return NetworkDataTaskSoup::create(session, client, parameters.request, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.isMainFrameNavigation); >diff --git a/Source/WebKit/NetworkProcess/NetworkDataTask.h b/Source/WebKit/NetworkProcess/NetworkDataTask.h >index 76a3f54a619247af52dda22d9edd26b2ad555b48..aa266ce0dcfef5342b4ac7c24ee125f896b8e598 100644 >--- a/Source/WebKit/NetworkProcess/NetworkDataTask.h >+++ b/Source/WebKit/NetworkProcess/NetworkDataTask.h >@@ -130,6 +130,12 @@ public: > > virtual String description() const; > >+ NetworkSession& session() const { return m_session.get(); } >+ >+#if ENABLE(WIFI_ASSERTIONS) >+ virtual bool holdsWiFiAssertion() const { return false; } >+#endif >+ > protected: > NetworkDataTask(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation); > >diff --git a/Source/WebKit/NetworkProcess/NetworkLoad.cpp b/Source/WebKit/NetworkProcess/NetworkLoad.cpp >index 79ada71d88a7f4a2f499c9f32f58be3852eebea4..84396dbd5765a0d19a424e6537c744e923261678 100644 >--- a/Source/WebKit/NetworkProcess/NetworkLoad.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkLoad.cpp >@@ -114,6 +114,30 @@ void NetworkLoad::initialize(NetworkSession& networkSession) > m_task->resume(); > } > >+#if ENABLE(WIFI_ASSERTIONS) >+bool NetworkLoad::shouldRetry(const WebCore::ResourceError& error) const >+{ >+ if (m_hostIsReachable) >+ return false; >+ >+ if (!m_task->isTopLevelNavigation()) >+ return false; >+ >+ if (!m_task->holdsWiFiAssertion()) >+ return false; >+ >+ return error.isTimeout() || error.isNotConnectedToInternet(); >+} >+ >+void NetworkLoad::retry() >+{ >+ auto retryParameters = m_parameters; >+ retryParameters.isRetry = true; >+ m_task = NetworkDataTask::create(m_task->session(), *this, retryParameters); >+ m_task->resume(); >+} >+#endif >+ > NetworkLoad::~NetworkLoad() > { > ASSERT(RunLoop::isMain()); >@@ -239,6 +263,10 @@ void NetworkLoad::willPerformHTTPRedirection(ResourceResponse&& redirectResponse > ASSERT(RunLoop::isMain()); > ASSERT(!m_redirectCompletionHandler); > >+#if ENABLE(WIFI_ASSERTIONS) >+ m_hostIsReachable = true; >+#endif >+ > redirectResponse.setSource(ResourceResponse::Source::Network); > m_redirectCompletionHandler = WTFMove(completionHandler); > >@@ -256,6 +284,10 @@ void NetworkLoad::willPerformHTTPRedirection(ResourceResponse&& redirectResponse > > void NetworkLoad::didReceiveChallenge(const AuthenticationChallenge& challenge, ChallengeCompletionHandler&& completionHandler) > { >+#if ENABLE(WIFI_ASSERTIONS) >+ m_hostIsReachable = true; >+#endif >+ > m_challenge = challenge; > #if USE(PROTECTION_SPACE_AUTH_CALLBACK) > m_challengeCompletionHandler = WTFMove(completionHandler); >@@ -309,6 +341,10 @@ void NetworkLoad::didReceiveResponseNetworkSession(ResourceResponse&& response, > ASSERT(RunLoop::isMain()); > ASSERT(!m_throttle); > >+#if ENABLE(WIFI_ASSERTIONS) >+ m_hostIsReachable = true; >+#endif >+ > if (m_task && m_task->isDownload()) { > NetworkProcess::singleton().findPendingDownloadLocation(*m_task.get(), WTFMove(completionHandler), response); > return; >@@ -346,6 +382,9 @@ void NetworkLoad::notifyDidReceiveResponse(ResourceResponse&& response, Response > void NetworkLoad::didReceiveData(Ref<SharedBuffer>&& buffer) > { > ASSERT(!m_throttle); >+#if ENABLE(WIFI_ASSERTIONS) >+ ASSERT(m_hostIsReachable); >+#endif > > #if ENABLE(NETWORK_CAPTURE) > if (m_recorder) >@@ -361,6 +400,13 @@ void NetworkLoad::didCompleteWithError(const ResourceError& error, const WebCore > { > ASSERT(!m_throttle); > >+#if ENABLE(WIFI_ASSERTIONS) >+ if (shouldRetry(error)) { >+ retry(); >+ return; >+ } >+#endif >+ > #if ENABLE(NETWORK_CAPTURE) > if (m_recorder) > m_recorder->recordFinish(error); >diff --git a/Source/WebKit/NetworkProcess/NetworkLoad.h b/Source/WebKit/NetworkProcess/NetworkLoad.h >index 588bae12192a255b4ba8856b0825f3d62985bb7e..f22ab53fb4d00e18de48301c87f9f3515fa562ef 100644 >--- a/Source/WebKit/NetworkProcess/NetworkLoad.h >+++ b/Source/WebKit/NetworkProcess/NetworkLoad.h >@@ -81,6 +81,10 @@ private: > void initializeForReplay(NetworkSession&); > #endif > void initialize(NetworkSession&); >+#if ENABLE(WIFI_ASSERTIONS) >+ bool shouldRetry(const WebCore::ResourceError&) const; >+ void retry(); >+#endif > > // NetworkDataTaskClient > void willPerformHTTPRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&, RedirectCompletionHandler&&) final; >@@ -116,6 +120,10 @@ private: > std::unique_ptr<NetworkCapture::Recorder> m_recorder; > std::unique_ptr<NetworkCapture::Replayer> m_replayer; > #endif >+ >+#if ENABLE(WIFI_ASSERTIONS) >+ bool m_hostIsReachable { false }; >+#endif > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkLoadParameters.h b/Source/WebKit/NetworkProcess/NetworkLoadParameters.h >index 9c8c845e08502faa5bdccda63f5a4bfeb6f9f4fb..e67b4b461615b0cf7ef1c05ba5c3042b8934ba81 100644 >--- a/Source/WebKit/NetworkProcess/NetworkLoadParameters.h >+++ b/Source/WebKit/NetworkProcess/NetworkLoadParameters.h >@@ -53,6 +53,7 @@ public: > Vector<RefPtr<WebCore::BlobDataFileReference>> blobFileReferences; > PreconnectOnly shouldPreconnectOnly { PreconnectOnly::No }; > std::optional<NetworkActivityTracker> networkActivityTracker; >+ bool isRetry { false }; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h >index 4fcdba42b5a3f1ef9f03852a6c17a3f6aaffc697..32a1294b2edc032d61facce77d423f7876518187 100644 >--- a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h >+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h >@@ -42,9 +42,9 @@ class NetworkSessionCocoa; > class NetworkDataTaskCocoa final : public NetworkDataTask { > friend class NetworkSessionCocoa; > public: >- static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker> networkActivityTracker) >+ static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker> networkActivityTracker, bool isRetry = false) > { >- return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, dataTaskIsForMainFrameNavigation, networkActivityTracker)); >+ return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, dataTaskIsForMainFrameNavigation, networkActivityTracker, isRetry)); > } > > ~NetworkDataTaskCocoa(); >@@ -74,6 +74,7 @@ public: > uint64_t pageID() const { return m_pageID; }; > > #if ENABLE(WIFI_ASSERTIONS) >+ bool holdsWiFiAssertion() const override { return m_wiFiAssertionHolder && m_wiFiAssertionHolder->shouldHoldWiFiAssertion(); } > void maybeHoldWiFiAssertion(bool shouldHoldWiFiAssertion) > { > ASSERT(!m_wiFiAssertionHolder); >@@ -84,7 +85,7 @@ public: > String description() const override; > > private: >- NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker>); >+ NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker>, bool isRetry); > > bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&); > void applySniffingPoliciesAndBindRequestToInferfaceIfNeeded(NSURLRequest*&, bool shouldContentSniff, bool shouldContentEncodingSniff); >diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm >index 45d60496a7ac076f22d9a47daf78b395343e33d9..887331617daf7185a05865638a092ff4cbbe9b62 100644 >--- a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm >+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm >@@ -185,7 +185,7 @@ static void updateTaskWithFirstPartyForSameSiteCookies(NSURLSessionDataTask* tas > #endif > } > >-NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker> networkActivityTracker) >+NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker> networkActivityTracker, bool isRetry) > : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation) > , m_frameID(frameID) > , m_pageID(pageID) >@@ -226,7 +226,9 @@ NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataT > NSURLRequest *nsRequest = request.nsURLRequest(WebCore::UpdateHTTPBody); > applySniffingPoliciesAndBindRequestToInferfaceIfNeeded(nsRequest, shouldContentSniff == WebCore::SniffContent && !url.isLocalFile(), shouldContentEncodingSniff == WebCore::ContentEncodingSniffingPolicy::Sniff); > #if ENABLE(WIFI_ASSERTIONS) >- applyAdditionalProperties(request, *this, nsRequest); >+ applyAdditionalProperties(request, *this, isRetry, nsRequest); >+#else >+ UNUSED_PARAM(isRetry); > #endif > > auto& cocoaSession = static_cast<NetworkSessionCocoa&>(m_session.get());
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
Flags:
ews-watchlist
:
commit-queue-
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 186213
: 341810 |
341824