- Revision
- 196101
- Author
- [email protected]
- Date
- 2016-02-03 17:39:37 -0800 (Wed, 03 Feb 2016)
Log Message
Report wasBlocked and cannotShowURL errors when using NetworkSession
https://bugs.webkit.org/show_bug.cgi?id=153846
Reviewed by Antti Koivisto.
Source/WebCore:
No new tests, but this fixes http/tests/xmlhttprequest/redirect-cross-origin-2.html
when using NetworkSession.
* platform/URL.h:
WEBCORE_EXPORT because we are using portAllowed in WebKit2 now.
Source/WebKit2:
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::NetworkLoad):
(WebKit::NetworkLoad::didSendData):
(WebKit::NetworkLoad::wasBlocked):
(WebKit::NetworkLoad::cannotShowURL):
(WebKit::NetworkLoad::didReceiveResponseAsync):
* NetworkProcess/NetworkLoad.h:
NetworkDataTask is now RefCounted so we can protect it when reporting errors which delete the NetworkLoad.
* NetworkProcess/NetworkSession.h:
(WebKit::NetworkSessionTaskClient::~NetworkSessionTaskClient):
(WebKit::NetworkDataTask::create):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(WebKit::NetworkSession::takeDownloadID):
(WebKit::NetworkDataTask::NetworkDataTask):
Check the validity of the requested url and check if the port is allowed like we do in the ResourceHandle constructor.
(WebKit::NetworkDataTask::~NetworkDataTask):
Don't remove the task from the NetworkSession's map if we didn't make it because there was an error.
(WebKit::NetworkDataTask::scheduleFailure):
(WebKit::NetworkDataTask::failureTimerFired):
Implemented like ResourceHandle's.
(WebKit::NetworkDataTask::tryPasswordBasedAuthentication):
(WebKit::NetworkDataTask::resume):
(WebKit::NetworkDataTask::suspend):
Handle the failure timer like we do in ResourceHandle::setDefersLoading.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (196100 => 196101)
--- trunk/Source/WebCore/ChangeLog 2016-02-04 01:33:42 UTC (rev 196100)
+++ trunk/Source/WebCore/ChangeLog 2016-02-04 01:39:37 UTC (rev 196101)
@@ -1,3 +1,16 @@
+2016-02-03 Alex Christensen <[email protected]>
+
+ Report wasBlocked and cannotShowURL errors when using NetworkSession
+ https://bugs.webkit.org/show_bug.cgi?id=153846
+
+ Reviewed by Antti Koivisto.
+
+ No new tests, but this fixes http/tests/xmlhttprequest/redirect-cross-origin-2.html
+ when using NetworkSession.
+
+ * platform/URL.h:
+ WEBCORE_EXPORT because we are using portAllowed in WebKit2 now.
+
2016-02-03 Jer Noble <[email protected]>
iOS build fix after Yosemite build fix broke iOS build.
Modified: trunk/Source/WebCore/platform/URL.h (196100 => 196101)
--- trunk/Source/WebCore/platform/URL.h 2016-02-04 01:33:42 UTC (rev 196100)
+++ trunk/Source/WebCore/platform/URL.h 2016-02-04 01:39:37 UTC (rev 196101)
@@ -248,7 +248,7 @@
unsigned short defaultPortForProtocol(const String& protocol);
bool isDefaultPortForProtocol(unsigned short port, const String& protocol);
-bool portAllowed(const URL&); // Blacklist ports that should never be used for Web resources.
+WEBCORE_EXPORT bool portAllowed(const URL&); // Blacklist ports that should never be used for Web resources.
bool isValidProtocol(const String&);
Modified: trunk/Source/WebKit2/ChangeLog (196100 => 196101)
--- trunk/Source/WebKit2/ChangeLog 2016-02-04 01:33:42 UTC (rev 196100)
+++ trunk/Source/WebKit2/ChangeLog 2016-02-04 01:39:37 UTC (rev 196101)
@@ -1,3 +1,35 @@
+2016-02-03 Alex Christensen <[email protected]>
+
+ Report wasBlocked and cannotShowURL errors when using NetworkSession
+ https://bugs.webkit.org/show_bug.cgi?id=153846
+
+ Reviewed by Antti Koivisto.
+
+ * NetworkProcess/NetworkLoad.cpp:
+ (WebKit::NetworkLoad::NetworkLoad):
+ (WebKit::NetworkLoad::didSendData):
+ (WebKit::NetworkLoad::wasBlocked):
+ (WebKit::NetworkLoad::cannotShowURL):
+ (WebKit::NetworkLoad::didReceiveResponseAsync):
+ * NetworkProcess/NetworkLoad.h:
+ NetworkDataTask is now RefCounted so we can protect it when reporting errors which delete the NetworkLoad.
+ * NetworkProcess/NetworkSession.h:
+ (WebKit::NetworkSessionTaskClient::~NetworkSessionTaskClient):
+ (WebKit::NetworkDataTask::create):
+ * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+ (WebKit::NetworkSession::takeDownloadID):
+ (WebKit::NetworkDataTask::NetworkDataTask):
+ Check the validity of the requested url and check if the port is allowed like we do in the ResourceHandle constructor.
+ (WebKit::NetworkDataTask::~NetworkDataTask):
+ Don't remove the task from the NetworkSession's map if we didn't make it because there was an error.
+ (WebKit::NetworkDataTask::scheduleFailure):
+ (WebKit::NetworkDataTask::failureTimerFired):
+ Implemented like ResourceHandle's.
+ (WebKit::NetworkDataTask::tryPasswordBasedAuthentication):
+ (WebKit::NetworkDataTask::resume):
+ (WebKit::NetworkDataTask::suspend):
+ Handle the failure timer like we do in ResourceHandle::setDefersLoading.
+
2016-02-02 Alex Christensen <[email protected]>
Use proposed credentials in authentication challenges with NetworkSession
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp (196100 => 196101)
--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp 2016-02-04 01:33:42 UTC (rev 196100)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp 2016-02-04 01:39:37 UTC (rev 196101)
@@ -53,7 +53,7 @@
{
#if USE(NETWORK_SESSION)
if (auto* networkSession = SessionTracker::networkSession(parameters.sessionID)) {
- m_task = std::make_unique<NetworkDataTask>(*networkSession, *this, parameters.request, parameters.allowStoredCredentials);
+ m_task = NetworkDataTask::create(*networkSession, *this, parameters.request, parameters.allowStoredCredentials);
if (!parameters.defersLoading)
m_task->resume();
} else
@@ -248,6 +248,16 @@
m_client.didSendData(totalBytesSent, totalBytesExpectedToSend);
}
+void NetworkLoad::wasBlocked()
+{
+ m_client.didFailLoading(blockedError(m_currentRequest));
+}
+
+void NetworkLoad::cannotShowURL()
+{
+ m_client.didFailLoading(cannotShowURLError(m_currentRequest));
+}
+
#else
void NetworkLoad::didReceiveResponseAsync(ResourceHandle* handle, const ResourceResponse& receivedResponse)
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h (196100 => 196101)
--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h 2016-02-04 01:33:42 UTC (rev 196100)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h 2016-02-04 01:39:37 UTC (rev 196101)
@@ -74,6 +74,8 @@
virtual void didCompleteWithError(const WebCore::ResourceError&) final override;
virtual void didBecomeDownload() final override;
virtual void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend) override;
+ virtual void wasBlocked() override;
+ virtual void cannotShowURL() override;
#else
// ResourceHandleClient
virtual void willSendRequestAsync(WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse) override;
@@ -123,7 +125,7 @@
NetworkLoadClient& m_client;
const NetworkLoadParameters m_parameters;
#if USE(NETWORK_SESSION)
- std::unique_ptr<NetworkDataTask> m_task;
+ RefPtr<NetworkDataTask> m_task;
WebCore::AuthenticationChallenge m_challenge;
ChallengeCompletionHandler m_challengeCompletionHandler;
ResponseCompletionHandler m_responseCompletionHandler;
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkSession.h (196100 => 196101)
--- trunk/Source/WebKit2/NetworkProcess/NetworkSession.h 2016-02-04 01:33:42 UTC (rev 196100)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkSession.h 2016-02-04 01:39:37 UTC (rev 196101)
@@ -37,6 +37,7 @@
#include <WebCore/FrameLoaderTypes.h>
#include <WebCore/ResourceHandleTypes.h>
#include <WebCore/SessionID.h>
+#include <WebCore/Timer.h>
#include <wtf/HashMap.h>
#include <wtf/Ref.h>
#include <wtf/RefCounted.h>
@@ -78,15 +79,20 @@
virtual void didCompleteWithError(const WebCore::ResourceError&) = 0;
virtual void didBecomeDownload() = 0;
virtual void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend) = 0;
+ virtual void wasBlocked() = 0;
+ virtual void cannotShowURL() = 0;
virtual ~NetworkSessionTaskClient() { }
};
-class NetworkDataTask {
+class NetworkDataTask : public RefCounted<NetworkDataTask> {
friend class NetworkSession;
public:
- explicit NetworkDataTask(NetworkSession&, NetworkSessionTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentials);
-
+ static Ref<NetworkDataTask> create(NetworkSession& session, NetworkSessionTaskClient& client, const WebCore::ResourceRequest& request, WebCore::StoredCredentials storedCredentials)
+ {
+ return adoptRef(*new NetworkDataTask(session, client, request, storedCredentials));
+ }
+
void suspend();
void cancel();
void resume();
@@ -114,6 +120,18 @@
bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler);
private:
+ NetworkDataTask(NetworkSession&, NetworkSessionTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentials);
+
+ enum FailureType {
+ NoFailure,
+ BlockedFailure,
+ InvalidURLFailure
+ };
+ FailureType m_scheduledFailureType { NoFailure };
+ WebCore::Timer m_failureTimer;
+ void failureTimerFired();
+ void scheduleFailure(FailureType);
+
NetworkSession& m_session;
NetworkSessionTaskClient& m_client;
PendingDownload* m_pendingDownload { nullptr };
Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (196100 => 196101)
--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm 2016-02-04 01:33:42 UTC (rev 196100)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm 2016-02-04 01:39:37 UTC (rev 196101)
@@ -45,6 +45,7 @@
#import <WebCore/ResourceRequest.h>
#import <WebCore/ResourceResponse.h>
#import <WebCore/SharedBuffer.h>
+#import <WebCore/URL.h>
#import <wtf/MainThread.h>
#import <wtf/NeverDestroyed.h>
@@ -274,11 +275,22 @@
}
NetworkDataTask::NetworkDataTask(NetworkSession& session, NetworkSessionTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, WebCore::StoredCredentials storedCredentials)
- : m_session(session)
+ : m_failureTimer(*this, &NetworkDataTask::failureTimerFired)
+ , m_session(session)
, m_client(client)
{
ASSERT(isMainThread());
+ if (!requestWithCredentials.url().isValid()) {
+ scheduleFailure(InvalidURLFailure);
+ return;
+ }
+
+ if (!portAllowed(requestWithCredentials.url())) {
+ scheduleFailure(BlockedFailure);
+ return;
+ }
+
auto request = requestWithCredentials;
m_user = request.url().user();
m_password = request.url().pass();
@@ -295,12 +307,41 @@
NetworkDataTask::~NetworkDataTask()
{
- ASSERT(m_session.m_dataTaskMap.contains(taskIdentifier()));
- ASSERT(m_session.m_dataTaskMap.get(taskIdentifier()) == this);
- ASSERT(isMainThread());
- m_session.m_dataTaskMap.remove(taskIdentifier());
+ if (m_task) {
+ ASSERT(m_session.m_dataTaskMap.contains(taskIdentifier()));
+ ASSERT(m_session.m_dataTaskMap.get(taskIdentifier()) == this);
+ ASSERT(isMainThread());
+ m_session.m_dataTaskMap.remove(taskIdentifier());
+ }
}
+void NetworkDataTask::scheduleFailure(FailureType type)
+{
+ ASSERT(type != NoFailure);
+ m_scheduledFailureType = type;
+ m_failureTimer.startOneShot(0);
+}
+
+void NetworkDataTask::failureTimerFired()
+{
+ RefPtr<NetworkDataTask> protect(this);
+
+ switch (m_scheduledFailureType) {
+ case BlockedFailure:
+ m_scheduledFailureType = NoFailure;
+ client().wasBlocked();
+ return;
+ case InvalidURLFailure:
+ m_scheduledFailureType = NoFailure;
+ client().cannotShowURL();
+ return;
+ case NoFailure:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+ ASSERT_NOT_REACHED();
+}
+
bool NetworkDataTask::tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge& challenge, ChallengeCompletionHandler completionHandler)
{
if (!challenge.protectionSpace().isPasswordBased())
@@ -328,11 +369,15 @@
void NetworkDataTask::resume()
{
+ if (m_scheduledFailureType != NoFailure)
+ m_failureTimer.startOneShot(0);
[m_task resume];
}
void NetworkDataTask::suspend()
{
+ if (m_failureTimer.isActive())
+ m_failureTimer.stop();
[m_task suspend];
}